ソフトウェア工学

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

2
経過時間を考慮に入れるメソッドで単体テストを行う方法は?
私は現在、レガシーシステムの重要なメソッドをリファクタリングしている最中です。作業を始めるまでテストはほとんどありませんでした。リファクタリング後に正しい作業ができるように、かなりの数のテストを追加しました。 今、私は最も重要な部分に遭遇しました:インジケーターを計算するアルゴリズム。それは何かのようなものです indicator = (OneNumberFromA + AnotherNumberFromB) / elapsedTime; ユニットテストでこの関数の正しい動作をテストするにはどうすればよいですか? 関数には、プログラムが到達するいくつかのわずかに異なるアルゴリズムもありますが、すべての場合において、これelapsedTimeは結果に不可欠です。

3
手動テストと自動テストの相対的な価値
私が働いている組織では最近、手動テストを実行するためにテスト担当者を雇っていますが、開発者としてユニットテストを書く時間を与えられるかどうかを尋ねたところ、手動​​テストの方が費用が大きくなると回答しました。それは私には間違っていると感じているものであり、手動と自動のテストを相互に評価する手段を探しています。手動テストの場所がないと言っているわけではありませんが、自動テストは、少なくとも、繰り返しの多い退屈なタスクのいくつかを取り除くように思えます。いくつかの単体テストといくつかのセレンテストを実行するビルドサーバーがあるので、自動テストのアイデアは無意味ではありませんが、投資収益率が低いと見なされています。 システムの完全なエンドツーエンドテストを誰かに行わせることで最終製品がテストされ、最終的にそれがユーザーの関心事であることが理解できますが、それは時間がかかり、非常に反復的です。手動回帰テストとは、以前のすべてのテストを繰り返し、何も変更されていないことを確認することです。プロセスに4つのパスがある場合、それはそれぞれ5分かかる4つの手動テストです。 それで、自動テストの時間の予算を立てるために使用できる検証可能な事実と数値はありますか?さらに言えば、リンクにあるもの以外の自動テストの欠点は何ですか?

3
Java Generics-表現力とシンプルさのバランスを取る方法
私はジェネリックスを利用するコードをいくつか開発しています。私の指針となる原則の1つは、今日だけでなく、将来のシナリオでも使用できるようにすることでした。ただし、いくつかの同僚は、拡張性のために読みやすさを犠牲にしている可能性があると述べています。これを解決するために考えられる方法についてフィードバックを集めたかったのです。 具体的には、ここに変換を定義するインターフェースがあります。まず、項目のソースコレクションから開始し、各要素に変換を適用して、結果を宛先コレクションに保存します。さらに、宛先のコレクションを呼び出し元に返すことができるようにしたいのですが、コレクションの参照を使用するように強制するのではなく、宛先のコレクションに実際に提供したコレクションの種類を使用できるようにしたいと思います。 最後に、宛先のコレクション内のアイテムのタイプが、ソースのコレクション内のアイテムのタイプと異なるようにすることができます。これは、おそらく変換が行うためです。たとえば、私のコードでは、変換後にいくつかのソース項目が1つの宛先項目を構成しています。 これにより、次のインターフェースが生成されます。 interface Transform<Src, Dst> { <DstColl extends Collection<? super Dst>> DstColl transform( Collection<? extends Src> sourceCollection, DstColl destinationCollection); } インターフェースを適切にスーパータイプとサブタイプで使用できるようにするために、私はすべてがうまくいってJosh BlochのPECS原則(プロデューサー拡張、コンシューマースーパー)を適用しようとしました。最終結果は幾分怪物です。 さて、このインターフェースを拡張して、どういうわけかそれを特化できればいいのですが。たとえば、ソースアイテムのサブタイプとデスティネーションアイテムのスーパータイプをうまく使用する必要がない場合は、次のようにします。 interface SimpleTransform<Src, Dst> { <DstColl extends Collection<Dst>> DstColl transform( Collection<Src> sourceCollection, DstColl destinationCollection); } しかし、Javaでそれを行う方法はありません。私はこのインターフェースの実装を、恐怖で走るのではなく、他の人が実際に行うことを検討するようなものにしたいと考えています。私はいくつかのオプションを検討しました: 宛先のコレクションを返さないでください。変換を実行しても何も返されないことを考えると、奇妙に思えます。 このインターフェイスを実装する抽象クラスがありますが、パラメーターを使いやすいものに変換し、より単純なシグネチャを持つ別のメソッド "translateImpl()"を呼び出します。これにより、実装者の認識の負担が少なくなります。しかし、インターフェイスをユーザーフレンドリーにするためだけに抽象クラスを作成しなければならないのは奇妙です。 拡張性を忘れ、よりシンプルなインターフェースを備えています。おそらく、それを宛先のコレクションを返さないことと組み合わせます。しかし、それは将来の私の選択肢を制限します。 どう思いますか?使用できるアプローチがありませんか?

4
分散SCRUMチームの問題:作業環境
今日、私にとって興味深い問題が1つ現れました。分散SCRUMチームで、コード形式、IDEプラグイン(checkstyle&co)、VCS、CIの観点から単一の作業環境の実施をいつ開始しますか?チームは探索段階にあり、目標は本番品質のコードではなく、概念実証です。チームメンバーが将来の作業に本当に関連するものを決定する前に、いくつかの一般的なコーディングルールを「アプリオリ」に実施するのはオーバーヘッドではありませんか?この種のツールは、技術的な負債を最小限に抑えるヒューリスティックとして機能するため、確かに大きなメリットですが、Jenkinsビルドを実際に破壊する「後続スペースなし」としてルールを強制することは、私にとっては、焦点を絞るべきフェーズのやり過ぎに思えます量産コードを作成するよりも氷をくじくように。 注意1:作成したプロトタイプは破棄されます メンション2:最初からすべてが正しく行われることを望みますが、100%可能ではないことは完全に承知しています。
8 scrum 

3
NoSQLの使用例[終了]
現在のところ、この質問はQ&A形式には適していません。回答は事実、参考文献、専門知識によって裏付けられると期待していますが、この質問は、討論、議論、投票、または拡張ディスカッションを求める可能性があります。この質問を改善でき、再開できると思われる場合は、ヘルプセンターにアクセスしてください。 7年前休業。 私は、大学の学生シンポジウム向けに、ポリグロットの持続性のアイデアに関するアプリケーションを開発しています。Martin Fowlersの本を読んだり、さまざまな種類のNoSQLデータベースについてオンラインで他の調査を行ったりしました。さまざまなNoSQLデータベースのさまざまな使用例について知りたいのですが。 現在私はFowlerが指摘したものを持っています(他の研究は主にAPIに対して行われました)。 キー/値: セッションデータ ユーザープロファイル ショッピングカート 基本的に、簡単に生成および複製できる単一の一意のキーを持つもの 資料: イベントログ CMS /ブログ eコマース(トランザクションが完了した後) ウェブ分析 列ファミリー: イベントログ CMS /ブログ カウンター 使用期限切れ グラフ: 接続データ 位置情報サービス 推奨エンジン それでは、他にどのようなユースケースがありますか?より具体的には、リレーショナルモデルよりも優れている各タイプのNoSQL dbの使用例は何ですか?
8 nosql 

4
いつ名前をグローバル名前空間にインポートするのですか?(x :: y、x from yなどを使用)
私は今から約10年間、さまざまな言語でプログラミングを行っています。また、グローバルネームスペース(using x::yC ++やfrom x import yPythonなど)に何かをインポートするのが適切である場合はまだわかりません。そのため、ほとんど実行しません。 それが私が使用できる変数名のセットを制限するという理由だけでさえ、それはほとんど常に私にとって悪い考えのように思えます。例:使用する場所using namespace std;またはusing std::string;C ++でstring、変数名として使用できなくなりました(文字列ユーティリティ関数など)。 しかし、私は疑問に思っています。グローバルネームスペースに名前をインポートすることが本当に意味があるいくつかの状況はありますか?経験則はありますか?

5
ソフトウェア(計算)の効率と変数の使用に関するプログラミングの原則
私は古典的な訓練を受けた心理学者であり、プログラマーではないため、特にプログラムの効率性や特定のベストプラクティスに関して、この場合は変数の使用に関して、プログラミングのより高度な側面が私から逃れることがあります。 ここにいくつかの擬似コードがあります: var a; var b; var c; function GetSomeInformation() { returns "XYZ"; } a = GetSomeInformation(); b = GetSomeInformation(); c = GetSomeInformation(); だから私の質問は: データを一度変数に格納して同じ関数を繰り返し呼び出すのではなくそれを参照することは多かれ少なかれ効率的(または同じ)ですか? IE、このコードはより効率的ですか? var results = GetSomeInformation(); a = results; b = results; c = results; もしそうなら、この効率の向上または低下は一般的に言語間で同じですか、それとも言語によって異なりますか?あるしきい値それはその逆繰り返し関数呼び出しまたはバイスを使用するのではなく、変数に名前を付けるために良くなるどこ?どのような側面で効率が変わる可能性がありますか(たとえば、それがクラスのメンバー関数であるか、グローバルスコープの通常の関数であるかどうかに違いはありますか?)等 可能であれば、そのような概念がC ++ / MFCダイアログにどのように適用されるかを具体的に知りたいと思います。それは、そのフレームワークでコードを書いていたときに生じたものです。 // define pointers to the items …

4
OSプロジェクトの貢献者に著作権の割り当てを要求することは公正ですか?
フォローアップとしてんBSDライセンスのプロジェクトの必要性それぞれの貢献者からの署名付きの文?: オープンソースプロジェクトがその寄稿者から著作権の割り当てを得たいと思う理由はいくつかあります。例えば: プロジェクトの作者が侵害を訴えることを許可するため(著作権者のみがそうすることができるため)。これは、FSFがそのような割り当てを必要とする理由でもあります。 同じOSライセンスでコントリビューションをリリースしなかったと後で主張するなど、コントリビューターの将来の問題を防ぐため。 もう1つの理由は、企業がそのソフトウェアを(L)GPLに基づいてリリースし、商用ライセンスの下で販売する場合です。次に、会社が商用ライセンスの下で寄付を含めることができるように、著作権の割り当てが必要です。貢献者が事前に通知されている場合、これは公平です。 しかし、会社がすべての著作権を所有している場合、基本的にソースを使用して何でもできます。これは、寄稿者が同意しないものです。(L)GPLからコピーレフト以外のライセンスなど、別のライセンスに切り替えたり、プロジェクトをオープンソースとしてリリースすることを停止したり、独自のライセンスのみに切り替えたりすることもできます。これはSourceForgeで起こったと報告されています。 それで、問題を処理する公正な方法は何ですか?プロジェクトオーナーが著作権の割り当てを受け取らないと、将来的に問題が発生する可能性があります。そうした場合、コントリビューターの作業はライセンスまたはオープンソースのステータスを失う可能性があります。このジレンマの両方に公平な解決策はありますか? 私はネイティブスピーカーではないので、間違った法的用語を使用した可能性があります。質問を自由に修正してください。 関連: 寄稿者に著作権所有者の著作権を割り当てるにはどうすればよいですか?。 オープンソースプロジェクトへの著作権の割り当て

6
アジャイル開発では、ソフトウェアの「機能」を誰が所有し、どのように開発を管理するのですか?
私の会社の一部の開発チームはアジャイル開発手法に切り替えており、開発者の作業は、2週間の反復サイクルのため、些細なソフトウェア機能について細かい点について話し合い、プログラムするために減少しているようです。また、「開発者なら誰でもバグを修正できる」という考え方もある。私は最近、それらのチームの1つに参加し、同じ会社の別のチームから転勤しました... 開発者はソフトウェアの機能を最初(設計)から最後(実装および単体テスト)まで所有する必要があると強く感じます。アジャイルはこの考えに反しているようです。私の認識に真実はありますか、それともアジャイルの悪い実装を生きているだけですか? 2週間の反復の間、人々は、そのサイクル中のワークロードに応じて、新しい小さな機能とバグ修正をいくらか恣意的に割り当てられます。ソフトウェアの主要な機能の責任を誰も所有していないようです。我々は追加のような、些細なものに倍の愚かな金額を費やす単一などの話、毎日スクラム、コードレビュー、で、2週間の反復中にダイアログに完了ボタンを では、アジャイルプロジェクトでは、より大きな機能をどのように管理するのでしょうか。責任は誰にありますか:個々の開発者またはチーム全体?どのようにしてマニューシャから自分自身を抽出し、より長期的な目標に焦点を当てますか?どんなフィードバックも価値があります。

3
バックエンドでの作業がより快適になり、フロントエンドでの役割がよく呼ばれる[終了]
閉まっている。この質問はトピックから外れています。現在、回答を受け付けていません。 この質問を改善してみませんか? 質問を更新して、ソフトウェアエンジニアリングスタック交換のトピックになるようにします。 5年前休業。 私は最近、Web開発におけるさまざまな役割に応募し、アプローチされてきました。浮かび上がってきているのは、バックエンド開発よりもフロントエンド開発に適しているということです。デザイナーとしての私の背景を考えると、これは理にかなっています。 問題は、ExtJSを使用して大きなアプリに取り組んでいる間に、ExtJSでの設計と開発が本当に苛立たしいことに気づいたことです。奇妙なことに、私のコーディングスキルが一部の上級開発者に認められたため、このプロジェクトに取り組んでWeb開発に着手しました。私の履歴書でそれを強調していますが、これが間違いなのかどうか疑問に思います。 また、JavaScriptをWeb開発以外でもかなり使用しています。具体的には、PhotoscriptとInDesignでバッチ操作を作成します。私はJavaScriptの専門知識があると思われがちですが、私はJavaScriptのOOPスタイルに慣れているだけです。多くの手続き型コードを使用するか、jQueryやGoogleマップなどのライブラリを使用します。Nodeはバックエンドですが、NodeとKnockoutで実験的なアプリをいくつか作成しました。私はSEOに集中していたため、特定のWebプロジェクトではJavaScriptとjQueryを避けていましたが、本当に必要な場合にのみJavaScriptを使用していました。 インタビュー中に、JavaScriptとフロントエンド開発について質問されます。しかし、私は本当にPHPとサーバー側の開発について話したかったので、私は私の背景を示していると思います。役割について連絡を受けたとき、または空売りをせずに直接申請したときの対処方法を教えてください。

1
複数のASP.NET MVCアプリケーション間での1つのログイン
フォームベースの認証を使用するASP.NET MVC 4アプリケーションに取り組んでいます。ユーザーは、ログインフォームでのプロバイダーの選択に基づいて、メンバーシッププロバイダーに対して検証されます。たとえば、現時点では2つのプロバイダーがあります。ActiveDirectoryと、外部Webサービスを呼び出すカスタムプロバイダーです。ユーザーが有効な場合は、最終ログオン日などのローカルユーザーテーブルの情報を更新します。ユーザーが有効であり、ローカルユーザーテーブルに存在しない場合は、ユーザーを追加します。これがすべて完了したら、Cookieを設定してメインコンテンツに進みます。すべてのコントローラーはUser.Identity.IsAuthenticatedをチェックし、テストが失敗した場合はログインページに戻ります。 現在、このアプリケーションは単一のWebアプリケーションから複数のアプリケーションソリューションに移行すると言われています。各アプリケーションは、他のアプリケーションから独立して存在し、同じルックアンドフィールを共有し、同じログイン機能を使用する必要があります。各アプリケーションでは、新しいメンバーシッププロバイダーを追加する必要があります。アプリケーションへのアクセスを制限するためのデータも追加します。1人のユーザーは1つのアプリケーションにしかアクセスできず、別のユーザーはすべてのアプリケーションにアクセスできます。 データストレージの設定は問題ありません。あるアプリケーションのレイアウトを他のアプリケーションで使用するために共有することも問題ではありません。私が問題を抱えているのは、ログイン機能を「リファクタリング」して、新しいメンバーシッププロバイダーとアプリケーションを「すぐに」追加しても既存のアプリケーションを再公開する必要がないようにする方法を決定することです。現時点では、アプリケーションのシングルサインオン起動ページも必要ありません。彼らは、ユーザーがアプリケーションに直接アクセスしてログインし、そこにやってきたことを実行することを望んでいます。このように、私はに行くことhttp://site1.mysites.com、ログインして私の隣に男がに行く間、私の仕事をするhttp://site2.mysites.comで、ログおよび彼の作業を行います。 これを行う最善の方法に頭を抱えるのに苦労しています。私が最初に思ったのは、ログイン用のWCF Webサービスです。ログイン認証情報を渡して、コントローラーアクションでWebサービスを呼び出します。ログインが成功した場合、ローカルストレージからユーザーのアプリケーションのリストを取得できます。アプリケーションを追加しても、既存のアプリケーションのWebサービスに変更がないため、それらのアプリケーションを再公開する必要はありません。 また、このASP.NET Web APIについても耳にします。代わりにそのルートに行くべきですか?ローカルユーザーデータベースの管理を中心にサイトを構築して、Web APIをホストするサイトを用意することもできます。 この状況でWeb APIの問題は間違っていますか?そうでない場合は、WCF Webサービスよりも優れていますか?私の最終結果を達成する別の方法はありますか?
8 asp.net 

3
値ではなく「$ this」を返すクラスメソッドを持つことは、基本的な原則ですか、それとも非常に望ましいですか?
私は本当にOOPを学び始めたばかりです。私は約1年前に開始し、おそらく15,000行を書きました。しかし、他の人のOOPを見た経験はほとんどありませんでした。 ほとんどのクラス関数は値を返すか、クラスのプロパティを変更してtrue / falseを返します。値を返すものの一部は、その値をクラスプロパティに保存します(クラスプロパティが既に設定されているかどうかを最初に確認した後、データベースの呼び出しを回避できます)。 今私はMagento / Zendで多くの掘り下げを行っており、それらのクラスメソッドの多くが "$ this"を返すことに気づきました。私が理解しているように、通常の関数とは異なり、$ thisを返すクラスメソッドは値ではなく参照によって動作するため、コピーではなく、最初に開始したのと同じオブジェクトを取得できます。 $thisもっとやりたいことを返すのですか?コードの保守と使用が容易になりますか?$thisクラスメソッドをチェーンするために戻り値は必要ですか?

4
「デッドマンスイッチ」を使用して、時間に敏感なコードを管理する
私たちのソフトウェア環境では、おそらく良い習慣として、私たちはしばしばa / bテストを実行します。ただし、私たちの環境は、非常に短い時間で、コードがデッドテストで非常に壊れやすくなるように設定されています。テストレジストリは、内部wikiページのコレクションに過ぎません。 私は「デッドマンスイッチ」スタイルの機能しないコード管理を考えました。この用語に慣れていない場合は、何かがトリガーされないようにするために定期的にリセットする必要があるスイッチを指します。つまり、応答しない場合、スイッチがトリガーし、スイッチに何をしたいかを示します。トリガーが実行されます。 たとえば、いくつかのコードを記述し、何らかの方法でこのシステムに登録し、事前に選択した日付が循環すると、介入しない限り(手動で)このコードが削除される(自動的にクリーンアップされる)との通知を受け取りますクリーンアップ、またはスヌーズ)。 そのようなシステムを組み込むことの長所、短所、実行可能性は何ですか?それは可能ですか?腐敗に対してコードを管理するいくつかの代替方法は何でしょうか?

3
生成されたコードのクリーンアップ:リファクタリングまたはマップ?
環境: 最近、XSD.exeによって生成されたクラスファイルを処理する必要がありました。ばかばかしく冗長なクラス/変数名(someRidiculouslyLongPrefixThenMaybeOneThingUniqueAtTheEnd一見するとと比較するのは難しいと思いますsomeRidiculouslyLongPrefixThenMaybeOneOtherThingChanged)と注釈がいたるところにあり、長さが3500行でした。結論として、一体何が起こっているのかを理解するのに私は年齢を重ねました。私はそれを読んで、自分の名前を何かの隣に置くことは決してないと思ったので... 質問: 1)生成されたコードをいじる(つまり、クリーンにする)ことは悪い習慣ですか。 2)生成されたクラスを自分の素敵でクリーンなクラスにマップするマッパーを作成することをお勧めします(これで、とても楽しく作業できます)。 編集: すべてのコメントをありがとう。 実際に何か面白いことをするつもりだった場合(つまり、トランスポートオブジェクト以外のドメインオブジェクトがあった場合)、それらを「よりクリーンな」クラスにマップすると思います。それらのうちの一種の機能。この場合、クラスは事実上DTOであるため、おそらく名前が対応する要素と一致することは理にかなっています。述べたように、私はそれに触れる必要はありません-処理のためにデータを別のレイヤーに渡す前に、アクセサー/ミューテーターを呼び出すだけです。 今のところ、私はそれらを一人にしておくと思います。

3
Haskellの値/参照セマンティクスのテストの考案
命令型言語では、言語の「値のセマンティクス」または「参照のセマンティクス」の使用に関するプログラミングテストを考案することは簡単です。次のようにしてa(where Vertex {one, two, three :: Integer})の値を確認できます。 a := Vertex 3 4 5 b := a one b := 6 two b := 8 three b := 10 ただし、関数型言語では変数は不変であるため、このテストはそのような言語では機能しません。 私はHaskell(および関数型プログラミング全般)についてほとんど知りませんが、私の理解では、値のセマンティクスを使用しています。Haskellで「refレコード」と「valレコード」を区別するプログラミング実験を考案することは可能ですか?

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