ソフトウェア工学

システム開発ライフサイクル内で働く専門家、学者、学生向けのQ&A

5
ストーリーごとに要件仕様を作成するのは良い考えですか?
現在、私の現在のプロジェクトではアジャイルメソッドを使用しており、次のような大量のストーリーがあります。 アシスタントとして、お客様に払い戻しを請求し、リクエスト時にお金をもらうことができるようにしたい 顧客として、私はアイテムを受け取ることができるように購入の代金を支払いたいです。 これまでに行った方法は、すべてのスプリントで最も重要なストーリーを選択し、それをいくつかの正式な要件仕様にまとめます(同じ仕様で似ているストーリーのいくつかをグループ化します)。ストーリーによっては、画面上のボタンまたはワークフロー全体の場合もあります。 問題は、ストーリーが多すぎるため、システムのどの部分にストーリーが関連しているかがすぐには明らかにならないことです。 それは開発者の時に機能し、すべてのスプリントは開発者が何をする必要があるか、そして彼らが行う必要がある変更を概説するスペックを取得します。しかし、このストーリーリストの維持とテストに関しては、バグの追跡が非常に難しくなり、一般的には仕様のみを維持することになります。これは、画面の機能の一部がさまざまな場所で文書化されているためです。ストーリーで分割。 ストーリーに基づいた仕様を書くことは良い考えですか?ストーリーを間違った方法で書きましたか?

2
「デメテルの法則」はパブリック/ APIメソッドの署名に適用できますか?
API /パブリックメソッドシグネチャへの変更は、これらのメソッドを使用するクライアントコードを壊さないようにするために最小限でなければならないので、デメテルの法則はこれらにあまり適用されないのではないかと思っていました。 簡単な例: class Account() { double balance; public void debit(Transaction t) { balance -= t.getAmount(); } } debitメソッドは、2倍の金額ではなくTransactionオブジェクトを渡すことに注意してください( 'Law of Demeter'は、私が理解しているように、必要な情報だけを渡すと言います。この場合、Transactionオブジェクトではなく、金額だけを渡します... )。この背後にある理由は、将来のメソッドでは、金額の他にいくつかのトランザクションプロパティが必要になる可能性があるためです。私が理解していることから、これは将来的に新しいパラメータを追加することによってメソッドのシグネチャを壊すことを防ぎます。 これはそれを賢明な選択にしますか?それとも何か不足していますか?

2
キーベースのキャッシュはどのように機能しますか?
37Signalsブログの記事を最近読んだところ、キャッシュキーがどのように取得されるのか疑問に思いました。 オブジェクトのタイムスタンプを含むキャッシュキーがあれば十分です(つまり、オブジェクトを更新するとキャッシュが無効になります)。しかし、キャッシュからフェッチしようとしているオブジェクトそのものにDBヒットを引き起こさずに、テンプレートでキャッシュキーをどのように使用しますか。 具体的には、これにより、たとえば投稿のコメントをレンダリングする1対多の関係にどのように影響しますか。 Djangoでの例: {% for comment in post.comments.all %} {% cache comment.pk comment.modified %} <p>{{ post.body }}</p> {% endcache %} {% endfor %} Railsでのキャッシュは、たとえばmemcachedへの単なるリクエストとは異なります(キャッシュキーを別のものに変換することは知っています)。キャッシュキーもキャッシュしますか?

3
言語へのプログラミングとRubyでのCコードの作成
コードコンプリート状態あなたが遠かったコードなければならないことへのコードとは対照的に、言語で、それは。つまり、彼らは プログラミングの考え方を、言語によって自動的にサポートされる概念だけに限定しないでください。最高のプログラマーは、自分が何をしたいかを考え、それから自由に使えるプログラミングツールで目的を達成する方法を評価します。(34.4章) これは、手元にある言語の特定の長所と短所に関係なく、すべての言語で1つのプログラミングスタイルを使用することにつながりませんか? または、質問をより答えやすい形式にするには: 問題を可能な限りきちんと言語の詳細にエンコードしようとするべきか、それともネイティブに存在しない厄介な構成要素を実装する必要があるとしても、最もエレガントなソリューション全体を検索するべきかを提案しますか?自分の言語で?

6
なぜサブクラス化があまりにも悪いのですか(そして、なぜプロトタイプを使用してそれを排除する必要があるのですか)?
私はデザインパターンについて調べていましたが、プロトタイプのデザインパターンでは、過度のサブクラス化をなくすことができました。 サブクラス化が悪いのはなぜですか?プロトタイプを使用すると、サブクラス化に対してどのような利点がありますか?

9
開発者は、実際のプログラムの前に内部ライブラリをコンパイルする必要がありますか?
最近、私が一緒に仕事をしている上級開発者が、開発者に最新バージョンを入手し、プロジェクトの一部として主要な内部ライブラリをコンパイルするよう要求することを主張しました。これは、プロジェクトチームが内部のMavenリポジトリから取得する安定したバージョンを使用して作業する必要があるという反論とは対照的です。開発者は、ソースコードを開発者のマシンで利用できるようにすると、ライブラリのソースを読み取ることができるので時間を節約できると主張しました。必要な機能が利用可能かどうかを判断するコード。 上級開発者には有効な議論がありますか?それとも、開発者に、ライブラリのソースコードを読み取って、カプセル化の基本的な哲学に対抗し、そもそもライブラリを用意するように要求するのでしょうか。

3
CSSによる画像のサイズ変更はまだ悪い考えですか?
元の画像が実際のものではない画像に幅/高さ属性を使用することは悪い考えであると常に見られてきました。これは、ピクセル化された画像や、必要以上に大きいダウンロードサイズを意味する場合があります。 しかし、これはまだ問題ですか?写真のサイズを大きくすることはお勧めしませんが、元のサイズとの違いがあまり大きくなく、縮小しても問題にならないはずです。 たとえば、600x400の写真に400pxの幅を貼り付けます。最近のほとんどのブラウザーは画像を縮小し、レンダリングはまだまともです。 だから、これについてみんなはどう思いますか?

3
メソッドのオーバーロードはいつ適切ですか?
既存のかなり大きなシステムで作業しているとしましょう。myObjectクラスのオブジェクトがありますMyClass(例として、Javaで作業しているとします)。myObjectはCollection、たとえばa Listと、(私が思うに)無関係な他のオブジェクトを含むコンポジションです。これには、Listそれが構成されているメソッドを呼び出す役割を果たしているデリゲートメソッドが含まれていますList。 これListがaであるとしましょう。List<String>何らかの理由で、メインのアクセスメソッドはclassのマスクメソッドですSomeOtherClass。新しい値のペアをmyに挿入しListたい場合は、SomeOtherClass呼び出されたオブジェクトがありますsomeObject。私が呼び出すmyObject.insert(someObject)と、insertメソッド内にを取得してStringに入れる魔法がいくつかありますList<String>。 今、String値しか持っておらずSomeOtherClass、挿入するオブジェクトがないとします。insertこのシステムのすべてを破壊するため、メソッドを変更できないと仮定します。次に、insertメソッドをオーバーロードする必要がありますか?またはSomeOtherClass呼び出すたびに新しいオブジェクトを作成する必要がありますinsertか? オーバーロードするとこんな感じになりますね… public void insert(String s) { ... } public void insert(SomeOtherObject obj) { this.insert(obj.magicStringMethod()); } (この例は、昨日発生したオーバーロードに関する同様の(やや複雑な)状況に基づいた不自然なパズルです。不明な点がある場合は展開します) これはメソッドをオーバーロードするのに適切な場所でしょうか?そうでない場合、いつメソッドをオーバーロードする必要がありますか?

4
標準とプロセスの改善は、それらを持たない組織にどのように導入すべきですか?
私は、プロセス改善の実装を通じてソフトウェア開発プロセスを改善することを任されてきました。そのプロセスの改善として、CMMI for Developmentバージョン1.3をガイドラインとして使用し、ベストプラクティスを全体的または部分的に採用することになります。標準とプロセスの改善を導入して、開発者からの反発と抵抗の程度を最小限に抑えるための最良の方法は何ですか?

4
パブリックWebアプリケーションが構成にiniファイルを使用しないのはなぜですか
そこにあるほとんどすべてのパブリックCMSは、データベース設定などに.php構成ファイルを使用しています。たとえば、WordPressをインストールすると、.php設定ファイルが自動的に作成されます。 なぜ.iniファイルを使用しないのですか?PHPには既にparse_ini_file()があり、他の言語にも同様の関数があると思います。
10 php  cms  configuration 

2
開発者のコ​​ミット統計はなぜ有害なのですか?
私は長い間、各開発者が1日に行うコミットの数などのコミット統計を追跡することは、開発プロセスに有害であると信じてきました(そして他の人からも聞いた)。その理由は明らかです-開発者はより小さな増分でコミットし、1日あたりのコミット数を最大化しますが、二分することを難しくします(おそらく、すべての中間パッチはリポジトリを適切な形式にしないため)、コミット履歴を操作するのが難しくなります。 (変更は突然ではなく、複数のコミットで行われます。1つではなく、パッチを元に戻すのが難しくなります)。 コミット統計が有害であることを示す研究はありますか?このトピックに関するエレガントで議論の多い記事はありますか?同様に当てはまるのは、間違ったものを測定すると人々が間違ったものを最適化することにつながり、この問題は単なる特殊なケースです。

5
適切な量​​のドキュメントを決定する
私が現在取り組んでいる一般的なアプローチは- ドキュメントをできるだけ避けます 別のチームが必要とする場合のみ文書化する 明確にするために、私はコードドキュメントを意味するのではなく、これは私たちが行うことです。つまり、UMLまたはDBスキーマ、クラス図、仕様などのワードドキュメントの場合、設計プロセスを取り巻くすべてのドキュメントを意味します。 文書化しない上司の理由を挙げます。 時間がかかります-実装に集中してください 設計が変更された場合-ドキュメントは変更され、二重の問題が発生します 結局、誰も読みたくない何百ものページを取得し、誰も実際には編集しないので、いつかは古くなるでしょう その痛み-誰も本当にそれをしたくない 今では作業が速くなることに気づきましたが、何も理解せずに、ここに行って古いコードに直接飛び込んだ時間も覚えています。 実際、私はまだこの古いコードのほとんどを取得していません。場合によっては、さまざまな開発者からの多くのパッチが小さな調整を試みているのを目にすることがあります。 ドキュメント化の欠如は、この種のパッチと広義のシステム理解の欠如を助長すると思います。 私の質問は: チーム間で継続的な知識を促進しながら、迅速かつ効率的になるように、ドキュメントをどのようにバランスさせることができますか?

5
アサートまたはエラーとしての例外?
私はプロのCプログラマーであり、趣味のObj-Cプログラマー(OS X)です。最近、その非常に豊富な構文のために、C ++に拡張するように誘惑されました。 これまでのコーディングでは、例外をあまり扱っていません。Objective-Cにはそれらがありますが、Appleのポリシーは非常に厳格です。 重要プログラミングまたは予期しないランタイムエラー(範囲外のコレクションアクセス、不変オブジェクトの変更の試行、無効なメッセージの送信、ウィンドウサーバーへの接続の喪失など)の例外の使用を予約する必要があります。 C ++は例外をより頻繁に使用することを好むようです。たとえば、RAIIのウィキペディアの例では、ファイルを開くことができない場合に例外がスローされます。Objective-Cはreturn nil、outパラメータによってエラーが送信されます。特に、std :: ofstreamはどちらの方法でも設定できるようです。 ここで、プログラマーに対して、エラーコードの代わりに例外を使用することを宣言するか、例外をまったく使用しないことを宣言するいくつかの答えを見つけました。前者の方が一般的です。 C ++の客観的な研究をしている人は見つかりませんでした。ポインタはまれであるため、例外を回避することを選択した場合は、内部エラーフラグを使用する必要があります。それは扱いが面倒すぎますか、それとも例外よりもうまく機能しますか?両方のケースを比較するのが最良の答えです。 編集:完全に関連しているわけではありませんが、私はおそらく何nilが何であるかを明確にする必要があります。技術的にはと同じNULLですが、メッセージをに送信しても問題ありませんnil。だからあなたは次のようなことができます NSError *err = nil; id obj = [NSFileHandle fileHandleForReadingFromURL:myurl error:&err]; [obj retain]; 最初の呼び出しが返されたとしてもnil。また*obj、Obj-Cでは絶対にしないので、NULLポインターの逆参照のリスクはありません。
10 c++  exceptions 

4
文芸的プログラミング、良い/悪い設計方法論
私は最近、文芸的プログラミングの概念を見つけました。そして、私はそれがかなり興味深いと感じました。それでも、プログラムを構成するのは悪い方法であるという主張には遭遇していません。多くの場所をカバーしていないようです。ここでさえこれに関する質問を見つけることができませんでした。 私の質問は、その欠陥やドキュメントの処理方法についてではありません。ドキュメンテーションは、文芸的プログラミングの流れにとってそれが何を意味するのかという副作用だと考えています。この設計はもともと、簡単な文書化とフォワードプログラミングフローの概念を目的としたものでした。 問題を小さな文ベースの問題に分割するという概念は、本当に素晴らしいアイデアのようです。これにより、プログラムの流れの理解が容易になります。 文芸的設計法の結果として、必要な機能の数はプログラマーの想像力に制限されます。特定のタスクの関数を定義する代わりに、それをscrap文芸的メソッドとして作成することができます。これにより、個別の関数コンパイルの代わりにコードが自動的に挿入され、同等の速度を得るために手続き間コンパイルの最適化ステップが必要になります。実際、ドナルドE.クヌースの最初の試みは、この事実のために実行時間が劣っていました。私はコンパイラがこれの多くに作られることができることを知っています、しかしこれは私の心配ではありません。 それで、なぜこれが悪い/良い設計方法論であると考える必要があるのか​​についてフィードバックを得たいですか?

2
放棄されたgithubプロジェクトからのコードの使用方法
私は最近、本当に使用できるgithubプロジェクトに出くわしましたが、多くの問題と重要なプルリクエスト(おそらく100以上のフォーク)のために放棄されているようです。多くの場合、代替プロジェクトはありません。 コードをそのまま使用しますか?フォークを選んで他を無視しますか?プルリクエストからコードを手動でプルしますか?どうやって?私または他の誰かが、元のコーダーが中断したところを何らかの形で整理して離陸する可能性はありますか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.