ソフトウェア工学

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

9
メソッドで空のコレクションを受け入れる必要がありますか?
メソッドのパラメーターを反復処理するforeachループ内ですべてのロジックが実行されるメソッドがあります。 public IEnumerable<TransformedNode> TransformNodes(IEnumerable<Node> nodes) { foreach(var node in nodes) { // yadda yadda yadda yield return transformedNode; } } この場合、空のコレクションを送信すると空のコレクションになりますが、それは賢明ではないのでしょうか。 ここでの私のロジックは、誰かがこのメソッドを呼び出している場合、データを渡すことを意図し、誤った状況でのみ空のコレクションをメソッドに渡すことです。 この動作をキャッチして例外をスローする必要がありますか、空のコレクションを返すのがベストプラクティスですか?

3
ヘルパーとは何ですか?デザインパターンですか?それはアルゴリズムですか?
たぶん少し冗談かもしれませんが、Googleでどこにもこの答えが見つからないので、ソフトウェアエンジニアリングが答えを持っていることを確認します。 ヘルパーとは何ですか? セマンティクスが深く意味のあるように、どこでも使用されている名前(モジュール名、クラス名、メソッド名)を見てきましたが、コンピューターサイエンスの文脈では(学位はありませんが)どこにも説明や定義を見たことがない! デザインパターンですか?それはアルゴリズムですか?私はかつてモジュールとクラスの両方がsomethingthinghelper(somethingthingはかなり一般的でもある)と呼ばれるプログラムで働いていましたが、すぐにそれを私にとって意味のあるものに名前を変更しましたが、ここで何かを見逃しているように感じます!

3
DDDに関して、境界付きコンテキストとは何ですか?
Vaughn Vernon著の「Implementing Domain Driven Design」という本を読んでいると、境界のあるコンテキストが実際に何であるかをよく理解できませんでした。 この本は、境界付きコンテキストを「ドメインモデルが適用可能な概念的境界。チームによって話され、慎重に設計されたソフトウェアモデルで表現されるユビキタス言語を提供します」と定義します。この定義は、境界コンテキストがサブドメインのモデルと言語であるかのように聞こえます。そのサブドメインは、たまたまコアドメイン(「コアサブドメイン」と呼ばれるべきですが、それは別の議論...)。これは、境界付きコンテキストが提供するものに関して、まだいくつかのあいまいさを残しています。1つ以上のサブドメインのグループ化ですか?1つのサブドメインのみが境界付きコンテキストに対応している場合、境界付きコンテキストは実際に何を伝えていますか? ただし、同じ本の第3章では、境界のあるコンテキスト間の統合手法について言及しています。ただし、これは、境界付けられたコンテキストが実際にはソフトウェアシステムまたはさまざまなアーティファクトであることを意味するように思われます。 Martin Fowlerは、境界のあるコンテキスト(http://martinfowler.com/bliki/BoundedContext.html)のアイデアについて簡単に説明しますが、実際には問題を明確にしません。 一日の終わりには、何である有界コンテキストは?サブドメインのグループ化ですか?サブドメインのモデルと言語?サブドメインの実装?これらの答えがなければ、現実の問題空間を境界のあるコンテキストに分解する方法を理解するのはかなり難しいようです。

9
TDDを行うときにロギングが必要ですか?
赤、緑、リファクタリングのサイクルを実行するときは、常にテストに合格するための最小限のコードを記述する必要があります。これは私がTDDについて教えられてきた方法であり、ほとんどすべての本がプロセスを説明する方法です。 しかし、ロギングはどうですか? 正直なところ、実際に複雑なことが起こっていない限り、アプリケーションでのログ記録はほとんど使用していませんが、適切なログ記録の重要性に関する多くの投稿を見てきました。 そのため、例外をログに記録する以外に、適切にテストされたアプリケーション(ユニット/統合/受け入れテスト)にログを記録することの本当の重要性を正当化できませんでした。 だから私の質問は: TDDを実行している場合、ログを記録する必要がありますか?テストに失敗しても、アプリケーションのどこが悪いのかわかりませんか? 各クラスの各メソッドにロギングプロセスのテストを追加する必要がありますか? たとえば、実稼働環境でいくつかのログレベルが無効になっている場合、テストと環境の間に依存関係が生じませんか? 人々はログがデバッグを容易にする方法について話しますが、TDDの主な利点の1つは、テストの失敗によって何が間違っているかを常に知っていることです。 私がそこに欠けているものはありますか?

2
AngularとASP.NET MVC / Web APIを混合していますか?
私はASP.NET MVC / Web APIを使用してきましたが、現在、Angularを使用し始めていますが、それらを混合する適切な方法については明確ではありません。 Angularを使用しても、MVCサーバー側の概念にはまだ価値がありますか?または、厳密にWeb APIを使用して、角度付きHTTP呼び出しのデータを取得する必要がありますか? VSテンプレートに不要なものがたくさん追加されている場合に使用する必要のある開始点はもっと少なくなっていますか? サーバー側=純粋なデータとクライアント側=純粋なHTML処理の厳密な分割のアイデアが好きです。

16
ソースファイルの先頭のコメントにバグ番号を入れるのは良い考えですか?[閉まっている]
ヘッダーコメント内のファイル自体にバグ番号を入れるのは良い習慣ですか? コメントは次のようになります。 MODIFIED (MM/DD/YY) abc 01/21/14 - Bug 17452317 - npe in drill across in dashboard edit mode cde 01/17/14 - Bug 2314558 - some other error description 役立つように思えますが、それは悪い習慣と見なされていますか?

11
動作しないコードをコミットしても大丈夫ですか?
動作するコードのみをコミットすることを要求するのは良い考えですか? このコミットでは、リポジトリを次のように動作状態のままにする必要はありません。 ...設計の初期段階にありますが、コードはまだ安定していません。 ...あなたはプロジェクトの唯一の開発者です。物事がうまくいかない理由を知っています。さらに、壊れたコードをコミットして誰かの作業を停止することはありません。 ...現在、コードは機能しません。これに大きな変更を加えます。物事がugくなる場合に戻るポイントを得るために、コミットしましょう。 ...チェーンが長く、壊れたコードがローカルブランチに存在する場合は問題ありません。すなわち ローカルファイル ステージングエリア ローカルブランチでコミット リモートの個人機能ブランチでのコミット リモートdevelopブランチとマージ リモートmasterブランチとマージ リモートreleaseブランチとマージ ...早くコミットし、頻繁にコミットします。 したがって、上記のリンクされた質問では、回答の大半は、コンパイルできないコードをコミットしても、ローカルおよび機能ブランチでは問題ないと述べています。どうして?壊れたコミットの価値は何ですか? 追加:ローカルブランチでは、好きなことは何でもできると言っている、非常に投票されたコメントがいくつかあります。ただし、質問の技術的な側面には興味がありません。むしろ、ベストプラクティス-業界で長年働いてきた人々が最も生産性を高めてきた習慣-を学びたいと思います。 膨大な量の素晴らしい答えに驚いています!彼らは、コードを整理するためにブランチを使用するのが十分ではないという結論に至ります。

4
ゼロダウンタイム展開の実現
停止時間ゼロの展開を達成しようとしているので、理論的には、営業時間外に少なく、「遅い」時間にもっと多く展開できます。 私の現在のセットアップ、やや単純化された: WebサーバーA(.NETアプリ) WebサーバーB(.NETアプリ) データベースサーバー(SQL Server) 私の現在の展開プロセス: WebサーバーAとBの両方のサイトを「停止」する デプロイされているアプリのバージョンのデータベーススキーマをアップグレードする WebサーバーAを更新する WebサーバーBを更新する すべてをオンラインに戻す 現在の問題 これにより、毎月わずかなダウンタイムが発生します(約30分)。私は休み時間にこれを行うので、それは大きな問題ではありません-しかし、それは私が逃げたいものです。 また-実際に「戻る」方法はありません。通常、ロールバックDBスクリプトは作成せず、スクリプトのみをアップグレードします。 ロードバランサーの活用 一度に1つのWebサーバーをアップグレードできるようになりたいです。WebサーバーAをロードバランサーから取り出してアップグレードし、オンラインに戻し、WebサーバーBについて繰り返します。 問題はデータベースです。私のソフトウェアの各バージョンは、異なるバージョンのデータベースに対して実行する必要があります-だから私は一種の「スタック」です。 可能な解決策 私が検討している現在の解決策は、次のルールを採用しています: データベーステーブルを削除しないでください。 データベース列を削除しないでください。 データベース列の名前を変更しないでください。 列を並べ替えないでください。 すべてのストアドプロシージャはバージョン管理する必要があります。 意味-「spFindAllThings」は、編集時に「spFindAllThings_2」になります。 その後、再度編集すると「spFindAllThings_3」になります。 同じルールがビューに適用されます。 一方、これは少し極端に思えます-私はそれが問題を解決すると思います。アプリケーションの各バージョンは、中断することなくDBにヒットします。コードは、ビュー/ストアドプロシージャから特定の結果を予期します。これにより、その「契約」が有効になります。問題は、それがただずさんに染み込んでいるということです。アプリがしばらく展開された後、古いストアドプロシージャをクリーンアップできることは知っていますが、それは単に汚い感じです。また、これはこれらのルールに従っているすべての開発者に依存しますが、ほとんどの場合これは起こりますが、誰かが間違いを犯すと思います。 最後に-私の質問 これはずさんですか、それともハックですか? 他の誰かがこれをやっていますか? 他の人はこの問題をどのように解決していますか?

5
ラムダ式は、単一のメソッドを持つ匿名の内部クラス以上のものですか?
Java 8には、待望のラムダ式に関する新しい誇大宣伝があります。3日ごとに、彼らがいかにクールであるかについての別の記事が表示されます。 私が理解している限り、ラムダ式は(少なくともバイトコードレベルで)単一メソッドを持つ匿名内部クラスにすぎません。これに加えて、別の優れた機能があります-型推論ですが、これと同等の機能は、あるレベルのジェネリックで実現できると信じています(もちろん、ラムダ式のようなきちんとした方法ではありません)。 これを知っていると、ラムダ式は単なるJavaの構文糖衣以上のものをもたらすでしょうか?現在の言語機能では構築できないラムダ式を使用して、より強力で柔軟なクラスやその他のオブジェクト指向の構造を作成できますか?

9
開発マシン上のウイルス対策ソフトウェアを支持する意味のある強力な議論を探している[非公開]
意見を形成するとき、学問的伝統に従うことは良い習慣です- あなたが保持する意見に反対することができる限り一生懸命に考え、反論を見つけようとします。 しかし、どんなに一生懸命努力しても、開発マシンでウイルス対策(および関連するセキュリティ対策)を支持する合理的な議論を見つけることはできません。 開発中のウイルス対策(AV)に対する議論はたくさんあります。 AVをオンにして1分間のビルドで10倍の時間がかかることは珍しくありません 会議の講演で、IntelliJ開発者は、IDEが遅い場合にAVソフトウェアが疑わしいと主張しています 解凍には、AVをオンにした状態で約100 kb / sの速度が伴います AVはCygwinを完全に使用不能にします(vimは単純なファイルを開くのに1分かかります) AVにより、同僚の電子メールから有用なファイル(JAR、DLL)をダウンロードできない AV /セキュリティ対策によりポートのブロックを解除できないため、開発に複数のコンピューターを使用することはできません AVは、MavenやAntなど、ファイルの回転率が高いプログラムのパフォーマンスを低下させます 最後になりましたが、AVは実際に私を何から保護しますか?私のAVプログラムがセキュリティスレッドを停止することを認識していません。 理由がNDAのものを開示することの恐怖である場合-心にそれを設定した場合、AVがそれを行うことを妨げる可能性はありません。 理由がソースコードやドキュメントを失う恐れがある場合-これには分散リビジョンシステムがあります(レポには少なくとも20のコピーがあり、毎日同期しています)。 顧客データの開示を恐れる場合、開発者は実際の運用データベースに接続して作業することはめったになく、代わりにおもちゃの環境で遊んでいます。 開発マシンでAVを使用することを支持する有意義な議論があったとしても、偏執的に保護された環境で仮想マシンを実行する能力に直面すると、それらはバラバラになります。 私はこの問題について心を開いておきたいので、開発者向けのウイルス対策ソフトウェアを支持する意味のある強力な議論を誰かが提示できますか?

11
仮想マシンとして提供されるソフトウェアを受け入れない理由はありますか?
これは物流に関する質問であり、技術的な質問ではありません。 私の会社はいくつかの組み込みソフトウェアの仕事を外部委託しています。具体的には、社内で十分な知識を持っていないため、組み込みシステムを開発するために請負業者に支払いました(デスクトップアプリケーション開発者しかいない)。 そのため、請負業者はソフトウェアを完成させ、仮想マシンで提供するかどうかを尋ねました。VMは、ソースコードがCodeWarriorプロジェクトとして事前設定されたCodeWarrior IDEを含むWindows 8マシンです。これにより、このプロジェクトをさらに開発するためにすでに構成されているVM内でコードを変更できるようになります。 プロジェクトにコード変更を加えるために独自の開発マシンを構成する方法を説明してもらうのではなく、これを行うことには欠点がありますか?予見できる唯一の問題は、VMの実行が遅いことです。コードを変更すると、プロジェクトの再構築に時間がかかります。しかし、一方で、事前に構成された組み込みシステム開発環境を取得するというアイデアが好きなので、デスクトップアプリケーションの開発マシンに別のIDEを追加する必要はありません。 VMの成果物を受け入れない理由を考えることはできませんが、不足しているものがある場合に備えて、このコミュニティで実行したかっただけです。

3
Clojureの素晴らしいところは何ですか?[閉まっている]
私は最近Clojureを見ていて、Stackoverflowのこの投稿に出くわしました。これは、ベストプラクティスに従っているいくつかのプロジェクトと、全体的に優れたClojureコードを示しています。いくつかの基本的なチュートリアルを読んだ後、私は言語を理解したかったので、いくつかの「現実の」プロジェクトを見てみました。 見た後ClojureScriptとCompojure Clojureのは冗談であるように(前述の2つの「良い」プロジェクト)、私は感じています。誰かが私はClojureのは、使用するのに対し、ピックアップすることを愛し、きれいな構文を持っており、非常に簡単であることを、たとえば、RubyやPythonの上で二つの言語をClojureのを選ぶだろう、なぜ私は理解していないので、多くのそれはのための読みやすさを台無しにすることをどこでも括弧や記号を私。 RubyとPythonは美しく、読みやすく、エレガントだと思います。言語を完全に知らない人でも読みやすいです。しかし、Clojureは私には不透明であり、コードを理解するためには、言語の実装に関するあらゆる詳細を知る必要があると感じています。 だから、私を啓発してください! Clojureの優れている点は何ですか? 言語を理解するために私が知っておくべき絶対的な最低限は何ですか?
40 clojure 

9
すべてがグローバルな変数スコープの前にプログラマは何をしましたか?
だから、メインメソッド、変数を定義するいくつかのデータ型があり、型を返さないサブプロシージャ(本質的に無効なメソッド)を持つ能力がある、一見古風な言語(PowerOnと呼ばれる)に対処する必要があります議論も受け入れません。 ここでの問題は、すべてがグローバルであることです。 私はこれらのタイプの言語を読みましたが、ほとんどの本は「わかりました、私たちは馬と馬車を使用するために使用しますが、今、ここに車がありますので、それで作業する方法を学びましょう!」私たちはあの日を決して思い出しません。」私は認めなければならない、心は範囲と範囲外で考えることに苦労しています。 よくここにいます。私は、いくつかのオープンなメソッドでグローバル変数のみを管理する最善の方法を見つけようとしています。forうん、ループのイテレータでさえグローバルに定義する必要があり、コードのさまざまな部分でリサイクルしていることに気づきました。 私の質問:このタイプの経験がある人のために、プログラマーはグローバルな競技場で大量の変数をどのように処理しましたか? 私はそれが精神的なジャグリングのトリックになったと感じていますが、既知のアプローチがあるかどうか知りたいと思います。
40 scope 

13
単体テストを高速に実行するにはどうすればよいですか?
私たちのプロジェクトでは、ほぼ1,000のテストがあり、非常に時間がかかるため、チェックインを実行する前にテストの実行に煩わされることがなくなりました。せいぜい、変更したコードに関連するテストを実行するだけで、最悪の場合はテストせずにチェックインするだけです。 この問題は、ソリューションが120のプロジェクト(通常、はるかに小さいプロジェクトを行い、TDDを適切に行うのは2回目です)に成長し、ビルド+テスト時間が約2〜3分になったためであると思います小さいマシンで。 テストの実行時間を短縮するにはどうすればよいですか?テクニックはありますか?もっと偽物?偽造が少ない?すべてのテストを実行するときに、より大きな統合テストが自動的に実行されるべきではないでしょうか? 編集:いくつかの回答への応答として、私たちはすでにCIとビルドサーバーを使用しています。これがテストの失敗を知る方法です。問題(実際には症状)は、失敗したビルドに関するメッセージを継続的に取得することです。部分テストの実行は、ほとんどの人が行うことですが、すべてではありません。そしてテストに関しては、実際にはかなりうまく作られており、すべてに偽物を使用しており、IOはまったくありません。
40 c#  unit-testing  tdd  nunit 

7
メジャー/マイナー/パッチのバージョン番号はいつ変更しますか?
重複の可能性: どの「バージョン命名規則」を使用していますか? リリース直前またはリリース直後にメジャー/マイナー/パッチのバージョン番号を変更しますか? 例:1.0.0を世界にリリースしたばかりです(huzzah!)。しかし、待って、あまり祝福しないでください。1.1.0は6週間で公開されます!したがって、バグを修正して新しいビルドを実行します。そのビルドとは何ですか?1.1.0.0または1.0.0.xxxy(xxxyは1.0.0のビルド番号を増分したものです)? 1.1.0に入るには、100の機能とバグがある可能性があることに注意してください。そのため、1.1.0に近いところがないため、1.0.0.xxxyと呼ぶのが良いかもしれません。しかし一方で、別の開発者が2.0.0で作業している可能性があります。その場合、ビルドはそれぞれ1.0.0.xxxyと1.0.0.xxxzではなく、1.1.0.0と2.0.0.0という名前を付けた方がよいかもしれません。
40 versioning 

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