ソフトウェア工学

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

7
統合テストはいつ書くべきですか?
TDDユニットルールのルールによれば、製品コードの前に記述されていますが、具体的な(モックではない)ワイヤードオブジェクト間の相互作用を実行する統合テストについてはどうでしょうか。 「配線」をテストするためだけに、単体テストの前に作成するか、製品コードの後に​​作成する必要がありますか? 私は、受け入れテストや機能テストではなく、低レベルの統合テストについて話していることに注意してください。

4
バグを再現するためのハードウェアのセットアップが入手困難または不可能な場合に、新しいコードを効率的にトラブルシューティングまたはテストする方法は?
私は中規模の会社(従業員150人、エンジニアリングチーム10人まで)で働いており、私のプロジェクトのほとんどは、半自動化されたテストアプリケーションを目的として、実験装置(オシロスコープ、光スペクトラムアナライザーなど)とのインターフェイスを含んでいます。ハードウェアのセットアップが利用できなくなった、または利用できなかったために、新しいコードを効率的にトラブルシューティングまたはテストできないいくつかの異なるシナリオに遭遇しました。 例1:ベンチトップタイプのセンサーを使用して10〜20の「バーンイン」プロセスを個別に実行するセットアップ-テスト用にこのようなセンサーを1つ取得でき、ときどきインターフェイスのすべての面をシミュレートするために1つを盗むことができました複数のデバイス(検索、接続、ストリーミングなど)。 最終的にはバグが発生し(最終的にはデバイスファームウェアとドライバーに存在する)、1つのユニットだけで正確に再現するのは非常に困難でしたが、これらのデバイスを10〜20個同時に使用すると「ショーストッパー」レベルに近づきました。これはまだ解決されておらず、継続中です。 例2:コアコンポーネントとして高価な光スペクトルアナライザーを必要とするテスト。このデバイスはかなり古いものであり、大企業に買収されて基本的に解体されたメーカーによると、その唯一のドキュメントは翻訳が不十分であると思われる長巻の(そして情報価値のない)ドキュメントでした。最初の開発中、私はデバイスを自分の机に置いておくことができましたが、物理的にもスケジュールどおりにも、24時間年中無休の複数週間のテスト中に縛られました。 デバイスに関連する、または関連しないバグが表示される場合、アプリケーションの外部でコードをテストして適合させるか、コードを盲目的に書いて実行と実行の間にあるテスト時間で絞り込もうとする問題をしばしば経験する必要があります。プログラムロジックでは、OSAと残りのテストハードウェアが適切に配置されている必要があります。 私の質問は、これにどのようにアプローチする必要があるのでしょうか?デバイスシミュレーターの開発に時間を費やす可能性がありますが、それを開発の見積もりに組み込むと、ほとんどの人が期待する以上に膨れ上がります。すべての問題を正確に再現できるとは限りません。また、ここで同じ機器を2回使用することはほとんどありません。ユニットテストなどで上達することができます...私はまた、問題について大声で話し、一時的な遅延が必要であることを他の人に理解させることができます。これは、研究開発の頭痛だけでなく、通常は冗談として認識されます製造業に売り込まれたとき。

14
リストが利用可能なときに配列を使用する理由はありますか?[閉まっている]
List<T>C#では、配列でできることはすべて実行できるように思われます。また、配列と同じくらいメモリとパフォーマンスが効率的であるようです。 それでは、なぜ配列を使用したいのでしょうか? APIや他の外部制約(メイン関数など)で配列を使用する必要がある場合については明らかに質問していません...自分のコードで新しいデータ構造を作成することについてのみ質問しています。
30 c#  data-types 

3
複数のサブプロジェクトでプロジェクトを分離する場合
私が取り組んでいるプロジェクトを1つではなく2つのリポジトリに分割することが理にかなっているかどうかを知りたいです。 私が言えることから: フロントエンドはhtml + jsで記述されます .netのバックエンド バックエンドはフロントエンドに依存せず、フロントエンドはバックエンドに依存しません フロントエンドは、バックエンドに実装された安らかなAPIを使用します。 フロントエンドは、任意の静的httpサーバーでホストできます。 現在、リポジトリは次の構造を持っています。 ルート: フロントエンド/* バックエンド/ * 両方のプロジェクトを同じリポジトリに保持するのは間違いだと思います。両方のプロジェクトは相互に依存関係を持たないため、個々のリポジトリと、必要に応じてサブモジュールを持つ親リポジトリに属する​​必要があります。 私はそれは無意味であり、それを行うことで利益を得ることはないと言われました。 私の議論のいくつかを以下に示します。 相互に依存しない2つのモジュールがあります。 長期的に両方のプロジェクトのソース履歴があると事態が複雑になる可能性があります(探しているバグとはまったく関係のないコミットの半分がある間にフロントエンドで何かを探してみてください) 競合とマージ(これは起こらないはずですが、誰かがバックエンドにプッシュすると、他の開発者がバックエンドの変更をプルしてフロントエンドの変更をプッシュすることになります。) 1人の開発者はバックエンドでのみ作業するかもしれませんが、常にフロントエンドを引っ張る必要があります。 長い目で見れば、いつ配備するのか。何らかの方法で、フロントエンドを複数の静的サーバーにデプロイし、バックエンドサーバーを1つ持つことができます。いずれの場合も、バックエンド全体を複製するか、すべてのサーバーにフロントエンドのみをプッシュするか、バックエンドを削除するカスタムスクリプトを作成する必要があります。1つだけが必要な場合は、両方よりもフロントエンドまたはバックエンドのみをプッシュ/プルする方が簡単です。 反論(1人が両方のプロジェクトで作業する可能性があります)、サブモジュールで3番目のレポを作成し、それで開発します。履歴は個々のモジュールに分けられており、バックエンド/フロントエンドのバージョンが同期して実際に連携するタグをいつでも作成できます。フロントエンドとバックエンドの両方を1つのリポジトリにまとめても、それらが連携して機能するわけではありません。両方の履歴を1つの大きなレポにマージしているだけです。 サブモジュールとしてフロントエンド/バックエンドを使用すると、プロジェクトにフリーランサーを追加する場合に物事が簡単になります。場合によっては、コードベースへの完全なアクセス権を実際に与えたくないことがあります。「外部者」が表示/編集できるものを制限したい場合、1つの大きなモジュールがあると事態が難しくなります。 バグの紹介とバグの修正のために、フロントエンドに新しいバグを挿入しました。その後、誰かがバックエンドのバグを修正します。1つのリポジトリで、新しいバグの前にロールバックすると、バックエンドもロールバックされ、修正が困難になる可能性があります。フロントエンドのバグを修正しながらバックエンドを動作させるには、別のフォルダにバックエンドをクローンする必要があります...その後、物事を再マージしようとします... 1つのリポジトリのHEADを移動するので、2つのリポジトリを作成するのは簡単です他を変更しないでください。また、異なるバージョンのバックエンドに対するテストは簡単です。 誰かが私を説得するためにもっと議論をすることができますか、少なくともプロジェクトを2つのサブモジュールに分けるのが無意味な(より複雑な)理由を教えてください。プロジェクトは新しく、コードベースは数日前のものなので、修正するのに早すぎません。

6
ドライバーとオブザーバーのスキルレベルと経験が異なる場合のペアプログラミング
ペアプログラミングは、2人のプログラマが1つのワークステーションで連携するアジャイルソフトウェア開発手法であることを知っています。一方のドライバーはコードを記述し、もう一方のオブザーバーは入力されたコードの各行をレビューします。 しかし、私はこの戦略がこのケースでまだ機能しているのだろうかと思う。例えば プログラミングスキルレベルがまったく異なる場合。 ある人が問題の領域で経験したことがなく、別の人が経験した場合。 プログラミングのスキルレベルが低い場合でも大丈夫ですか? 上記の場合のペアプログラミング戦略を提案できますか?

2
Git Flowのようなマージ戦略は本当にアンチパターンですか?
私の会社はGitを使用しており、独特の分岐スキームを使用しています-作業はマスターで行われ、分岐はリリース用に予約されています。これは、反復で行われたすべての作業がブランチに行われる限り正常に機能しますが、重大な生産上の問題が発生した場合、作業が何らかの方法で両方のブランチに行われるようにする必要があります。 最近、私たちはそれらのブランチで「楽しい」ことをしてきました。これは管理上の頭痛の種であり、すべての作業がすべてのブランチに反映され、1つのブランチで修正された一部のバグは、誰かが指摘するまでマスターになりません。 しばらく前にGit Flowに出会いましたが、それが私たちの問題の解決策だと感じています-コードがリリースまで浸透していないか、ずっと下に浸透していません。唯一の問題は、私のリードがこの種の開発はアンチパターンであると述べていることです。つまり、2週間にわたって猛烈に開発し、マージの競合を解決するために3を費やしました。 同意するかどうかは定かではありませんが、それを育ててから、仕事は通常のように再開しました。ごく最近になって、これに関していくつかの大きな問題がありました。 私は知りたい-なぜこの種の開発スキームはアンチパターンと見なされるのですか? で、それは本当にアンチパターン?

2
プログラムの設計への表示的意味論の適用
デノテーショナルセマンティクス(DS)について少し読んだことがあり、型と関数が数学に強く明確にマッピングされているコンピュータープログラムの設計プロセスに非常に興味があります。 DSに基づいたプログラムの設計を詳細に議論するリソースはありますか?私は対象のいくつかの表面的な治療を見てきました。 私はHaskell、Scala、Common Lisp、および少しのSchemeに精通しているので、これらの言語を使用するリソースは大歓迎です。
30 scala  haskell  scheme 

7
継承されたメソッドをテストする必要がありますか?
基本クラスEmployeeから派生したクラスManagerがあり、そのEmployeeにはManagerによって継承されるメソッドgetEmail()があるとします。マネージャーのgetEmail()メソッドの動作が実際に従業員のものと同じであることをテストする必要がありますか? これらのテストが作成された時点で動作は同じになりますが、もちろん将来のある時点で誰かがこのメソッドをオーバーライドし、その動作を変更して、アプリケーションを中断するかもしれません。しかし、本質的に干渉コードがないことをテストするのは少し奇妙に思えます。 (Manager :: getEmail()メソッドをテストしても、Manager :: getEmail()が作成/オーバーライドされるまで、コードカバレッジ(または他のコード品質メトリック(?))は改善されません。) (答えが「はい」の場合、基本クラスと派生クラス間で共有されるテストの管理方法に関する情報が役立ちます。) 質問の同等の定式化: 派生クラスが基本クラスからメソッドを継承する場合、継承されたメソッドが次のことを期待しているかどうかをどのように表現(テスト)しますか? 現在のベースとまったく同じように動作します(ベースの動作が変更されても、派生メソッドの動作は変更されません)。 常にベースとまったく同じように動作します(ベースクラスの動作が変わると、派生クラスの動作も変わります)。または ただし、必要に応じて動作します(呼び出さないため、このメソッドの動作は気にしません)。

11
「4次元」は配列でどのように機能しますか?
抽象: ですから、私が理解しているように(非常に限られた理解しかありませんが)、私たちは(通常)物理的に作業する3つの次元があります。 1番目は線で表されます。 2番目は正方形で表されます。 3番目は立方体で表されます。 私たちが4番目に到達するまで十分に単純です-私が意味することを知っているなら、3D空間で描くのはちょっと難しいです...それは時間と関係があると言う人もいます 質問: さて、それはあまり意味がありませんが、それはすべて私にとって素晴らしいです。私の質問はこれに関するものではなく、MathSOまたはPhysicsSOで質問することです。私の質問は次のとおりです。コンピューターはこれをアレイでどのように処理しますか? さまざまなプログラミング言語で4D、5D、6Dなどの配列を作成できることは知っていますが、その仕組みを知りたいと思います。
30 theory  array 

3
善意のオープンソースの貢献者に対処する方法は?
プログラマーがあなたに連絡し、あなたのプロジェクトに貢献するように頼んだら、どうやってそれを処理しますか? この男が良いかどうかはわかりません。おそらく彼は彼が価値があるよりも多くのトラブルになるでしょう。 彼は賞賛のためだけに成功したプロジェクトに自分の名前を付けようとしているのかもしれません。 彼はあなたが本当に望んでいない方向にプロジェクトを進めようとしているかもしれません、あなたは余分な複雑さの価値がないと思う機能を追加します。 または、彼は非常に有用な貢献者かもしれません。あなたはただ知りません。 知らない人からのそのようなリクエストをどのように処理しますか(GitHubで、特にそれが違いを生む場合)?ここのエチケットは何ですか?

1
Java 8の型推論
Java 8 での新しいラムダ表記(たとえば、この記事を参照)の導入には、ある種の型推論が必要になりますか? もしそうなら、新しい型システムはJava言語全体にどのような影響を与えますか?

2
Pythonファクトリー関数のベストプラクティス
foo.pyクラスを含むファイルがあるとしますFoo: class Foo(object): def __init__(self, data): ... ここFooで、生のソースデータから特定の方法でオブジェクトを作成する関数を追加します。Fooの静的メソッドまたは別の別の関数として配置する必要がありますか? class Foo(object): def __init__(self, data): ... # option 1: @staticmethod def fromSourceData(sourceData): return Foo(processData(sourceData)) # option 2: def makeFoo(sourceData): return Foo(processData(sourceData)) ユーザーにとって便利であることがより重要かどうかはわかりません。 foo1 = foo.makeFoo(sourceData) または、メソッドとクラスの間の明確な結合を維持することがより重要かどうか: foo1 = foo.Foo.fromSourceData(sourceData)
30 design  python 

4
Piを粗雑な乱数ジェネレータとして使用できますか?
私は最近math.SEでこの質問を見ました。考えさせられました。Piは粗雑な乱数ジェネレーターとして使用できますか?私は結果がよく知られていることを意味します(これまでどのくらいのpiが計算されましたか?)が、一度に1桁の数字をとるとPiはかなりランダムに見えるようです。 これはまったく意味がありますか?

2
低レイテンシJavaの記述[終了]
Javaで低レイテンシコードを記述するためのJava固有の手法(C ++には当てはまらないもの)はありますか?私はJavaの低レイテンシーの役割をよく見ますが、彼らは低レイテンシーのJavaを書いた経験を求めます。 私が考えることができる唯一の考えは、JNIの経験、ネイティブコードへのI / O呼び出しのアウトソーシングです。また、場合によってはディスラプターパターンを使用しますが、それは実際のテクノロジーではありません。 低レイテンシコードを記述するためのJava固有のヒントはありますか? リアルタイムJava仕様があることは承知していますが、リアルタイムは低遅延と同じではないと警告されています。

2
Windows 8、WinRT、およびWindows RTの違いは何ですか?
Windows RTとWindows 8の 2つのバージョンのWindowsが利用できることを読んだところです。 誰かがWindows RTとWindows 8の違いを説明してもらえますか?そして、これらの違いが、どちらか一方のアプリを作成する開発者にどのように影響するのでしょうか? また、WinRTとは何ですか?

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