ソフトウェア工学

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

2
build.numberがセマンティックバージョニングの「乱用」なのはなぜですか?
提案されたビルドシステム(Gradle / Artifactory / Jenkins / Chef)をシニアアーキテクトの1人に説明していましたが、彼は私に同意しませんでしたが、実際に計量するのに十分な経験はありませんでした。 このプロジェクトは、他のチームが再利用するアーティファクトとしてJavaライブラリ(JAR)を構築します。バージョン管理には、次のセマンティックアプローチを使用します。 <major>.<minor>.<patch> どこにpatchバグ/緊急フィックスを示し、minor下位互換性リリースを示しており、majorいずれかのAPIの大規模なリファクタリングおよび/または互換性のない変更を示します。 ここでの配信に関しては、私が望むものです。開発者がコードをコミットします。これにより、QA / TEST環境へのビルドがトリガーされます。一部のテストは実行されます(一部は自動化され、一部は手動)。すべてのテストに合格すると、プロダクションビルドがJARを社内リポジトリに公開します。この時点までに、JARは適切にバージョン管理される必要があり、build.numberCIツールによって自動的に生成および提供されるものを使用して、パッチ番号として機能させることを考えていました。 したがって、バージョン管理は実際には次のようになります。 <major>.<minor>.<build.number> ここでも、build.numberCIツールによって提供される場所。 アーキテクトはこれを却下し、CIビルド番号の使用はセマンティックバージョニングの「乱用」であると述べました。 私の質問は次のとおりです。これは正しいですか?もしそうでなければ、なぜですか?


4
スプレッドシートの背後にあるデータ構造は何ですか?
スプレッドシート(​​他のセルを参照する値または数式を含む名前付きまたはその他の方法で識別されたセルのグループ)がどのように解決されるかを理解したいと思います。既存のプロジェクトを調べてみましたが、GUI、シリアル化、イベントなどで非常に多くのことが行われていたため、スプレッドシートが見つかりませんでした。 その最も簡単な方法はどのように機能しますか?


4
新しいバグごとに単体テストを追加する
私の仕事では、バグを解決するすべての開発者は、このタイプのバグについて警告する新しいユニットテストを追加する必要があります(再び発生する場合)。単体テストが不可能な場合(たとえば、Webページのデザインの問題)、QA部門はテストケースを作成して手動でチェックする必要があります。 この背後にある考え方は、製品のリリース前に欠陥が検出されなかった場合、それを検出するための適切な単体テストがないためであるということです。そのため、開発者が追加する必要があります。 問題は、これはどのソフトウェア開発方法論でも一般的ですか?このテクニックには名前がありますか?私はそれについてもっと学びたいのですが、それから始めるにはいくつかの情報が必要です。

7
スクラム/かんばんボードを使用する場合、従来の課題追跡の役割は何ですか?
非常に高いレベルの観点から見ると、私には一般に2種類のプロジェクト管理ツールがあるようです。 Fogbugz、JIRA、BugZilla、Trac、Redmineなどの従来の課題トラッカー 仮想カードボード / Pivotal Tracker、GreenHopper、AgileZen、Trelloなどのアジャイルプロジェクト管理ツール 確かに、それらは何らかの方法で重なります。たとえば、Pivo​​tal TrackerタスクをJIRAにインポートできます。GreenHopper自体はJIRA課題ベースの上に実装されます。 従来の問題追跡ツールは、アジャイルプロジェクト管理を行う企業でも使用されているようです。私の質問は、なぜ彼らはそれをするのですか?また、会社で課題追跡を使用する必要があると思いますが、それについて考えているとき、なぜそれを必要とするのか実際にはわかりません。 たとえば、Trelloの開発は、最高の課題追跡ツールの1つであるFogbugzにアクセスできる場合でも、Trello自体(この仮想ウォールを参照)を使用して管理されているようです。したがって、アジャイルPMツールの1つを使用して作業の100%をアジャイルな方法で行う場合、従来の課題トラッカーは必要ないでしょうか?

6
割引モデルに適用される設計パターンはありますか?
割引モデルを実装するための既知の設計パターンはありますか? 割引モデルとは、次のことを意味します。 顧客が製品X、製品Y、および製品Zを購入すると、10%または100ドルの割引を受けます。 顧客が製品Xを100単位購入すると、15%または$ 500の割引を受ける 顧客が昨年に10万ドル以上持ち込んだ場合、20%の割引が適用されます 顧客が製品Xを2ユニット購入した場合、製品X(または製品Y)を1ユニット無料で入手できます。 ... 上記のすべてのシナリオを処理するために適用できる一般的なパターンはありますか?私はいくつかのモデルを考えていますが、一般的なモデルに出くわすことはできません。

8
高度にスケーラブルなWebサイトを設計する最良の方法は何ですか?
Facebookなどのソーシャルネットワークなど、高度にスケーラブルである必要があるWebサイトの場合、Webサイトを設計する最良の方法は何ですか? サイトが必要なデータを取得するためにクエリするWebサービスが必要ですか? または サイトはデータベースを直接照会する必要がありますか?(組み込みの言語構造を使用して、テーブルに自動的に入力するなどを行うことができます)。 ウェブサービスは一元化されたデータアクセスを提供し、キャッシングなどの制御がはるかに簡単になるため、より良いデザインだと思いますが、他の人はどう思いますか?

6
既存のコードベースを文書化する方法
私は、インラインドキュメントも技術ドキュメントも持たない既存のアプリケーションのチームの一員として働いています。アプリケーションのさまざまなバグレポートに取り組んでいるので、さまざまな場所にあるバグ番号-バグ番号を書いて、次の開発者がそのバグ番号を参照して何が起こっているのかを確認できるようにしました。 したがって、私の質問は次のとおりです。 このコードを文書化する最も効率的な方法は何ですか?領域に触れたときに文書化する必要がありますか(ウイルスの場合はウイルス手法)、またはアプリケーションの他の領域に分岐するパスをたどらないで、各セクションから単独で文書化する必要がありますか?以前に存在しなかった場所にインラインコメントを挿入する必要があります(コードが何をするかを誤って特定する恐れがあるため)。 既存のインラインドキュメントも、外部ドキュメントへのインライン参照もない、かなり大きなアプリケーションを正確かつ迅速にドキュメント化するには、どの方法を使用しますか?

2
Node.jsはフレームワークですか?[閉まっている]
リクルーター、開発者などは、フレームワークとしてNode.jsを参照しています。私の意見では、これはNode.jsが実際に何であるかについて無知ではありません。 多くの場合、職務記述書では、Node.jsはAngularJS、Reactなどのライブラリとしてグループ化されています。一般的に、違いを知らない人(HR、採用担当者など)によって入力されているように見えます。 私の意見では、Node.jsはプラットフォーム、またはランタイム環境です。ファイルシステムのような他のさまざまなAPIのDOM API(ブラウザーのJavaScript)を切り替えます(ブラウザーではなくサーバーとして実行されるため)。 Node.jsがフレームワークであると人々が考えるのはなぜですか。私が間違っている?実際にはフレームワークですか?

5
同じクラス内の他のメソッドを呼び出すメソッドを単体テストする最良の方法
私は最近、同じクラス内のメソッドから同じクラス内のメソッドへの結果または呼び出しをスタブするのに最適な次の2つのメソッドを友人と話していました。 これは非常に単純化された例です。実際には、機能ははるかに複雑です。 例: public class MyClass { public bool FunctionA() { return FunctionB() % 2 == 0; } protected int FunctionB() { return new Random().Next(); } } これをテストするために、2つのメソッドがあります。 方法1:関数とアクションを使用して、メソッドの機能を置き換えます。例: public class MyClass { public Func<int> FunctionB { get; set; } public MyClass() { FunctionB = FunctionBImpl; } public bool FunctionA() …

8
他の開発者に作業の完了後にメソッドを呼び出すように強制する
Java 7のライブラリには、他のクラスにサービスを提供するクラスがあります。このサービスクラスのインスタンスを作成した後、その1つのメソッドを複数回呼び出すことができます(doWork()メソッドと呼びましょう)。したがって、サービスクラスの作業がいつ完了するかはわかりません。 問題は、サービスクラスが重いオブジェクトを使用し、それらを解放する必要があることです。この部分をメソッドに設定します(呼び出しましょうrelease())が、他の開発者がこのメソッドを使用することは保証されません。 サービスクラスのタスクを完了した後、他の開発者にこのメソッドを強制的に呼び出す方法はありますか?もちろんそれを文書化することはできますが、私はそれらを強制したいと思います。 注:release()メソッドでメソッドを呼び出すことはできません 。これは、次に呼び出されるときにこれらのオブジェクトが必要doWork()になるためdoWork()です。
34 java 

3
これはシンボリックな定数の過剰使用ですか?
私はソフトウェアエンジニアリングが初めてなので、学習演習としてチェスゲームを書きました。私の友人はそれを見て、私のコードが次のように見えることを指摘しました for (int i = 0; i < 8; i++){ for (int j = 0; j < 8; j++){ 彼は代わりにあるべきだと主張した for (int i = 0; i < CHESS_CONST; i++){ for (int j = 0; j < CHESS_CONST; j++){ 私が今考えるのが面倒ではないいくつかのより良いシンボル名で。 もちろん、私は一般的にマジックナンバーの使用を避けることを知っていますが、 この数は変更されません。 番号はコード全体で非常に多くの場所で使用されているため、名前はとにかく説明的ではありません。そして チェスプログラムのソースコードを調べている人は、8の目的を知るためにチェスについて十分に知っている必要があります。 シンボリック定数は本当に必要ありません。 では、皆さんはどう思いますか?これはやり過ぎですか、それとも慣習に沿ってシンボルを使用する必要がありますか?

6
複雑な正規表現の単体テストが必要ですか?
アプリケーションで複雑な正規表現の単体テストを作成する必要がありますか? 一方では、入力と出力の形式は単純で明確に定義されていることが多いため、テストが容易であり、非常に複雑になることが多いため、テストは特に価値があります。 一方、それら自体は、あるユニットのインターフェースの一部ではありません。インターフェイスのみをテストし、暗黙的に正規表現をテストする方法でテストする方が良い場合があります。 編集: 私は、これが内部コンポーネントの単体テストの特殊なケースであるとコメントしているDoc Brownに同意します。 しかし、内部コンポーネントの正規表現にはいくつかの特別な特性があります。 単一行の正規表現は、実際には独立したモジュールではなく、非常に複雑になる可能性があります。 正規表現は、副作用なしで入力を出力にマップするため、個別にテストするのは非常に簡単です。

1
DRYに関係なく、ほぼ同一のコード
ほぼ同一のコードがいくつかありますが、メイン変数ではまったく異なる型を使用し、それらの間には継承はありません。具体的には、C#およびVB.NET用のRoslynを使用して、次のタイプのアナライザーを作成しています。 Microsoft.CodeAnalysis.CSharp.Syntax.AttributeSyntax Microsoft.CodeAnalysis.VisualBasic.Syntax.AttributeSyntax コードは同じことをしているので、できるだけDRYのままにして、できるだけ別々の(ただしタイプ以外は同じ)メソッドに分割するか、2つのメソッドが完全に分離するのかどうか疑問に思っています関連しておらず、将来の変更が一方のバージョンの変更を強制する可能性がありますが、もう一方のバージョンは変更しない可能性はありますか? 編集: 1年ほど後、私はこの同じ問題にぶつかり、Roslynチームが解決に協力しました。ジェネリックを取り、TAttributeSyntaxほとんどの作業を行うパラメーターを持つ基本クラスを作成します。次に、特定の型を必要とする最小限のデータで派生クラスを作成します。
34 c#  design  dry 

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