ソフトウェア工学

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

5
「Nightly Builds」とはどういう意味ですか?
私はしばらくの間オープンソースプロジェクトを使用し、オープンソースアプリケーションを開発してきましたが、「Nightly Build」という言葉に頻繁に出くわし、それが実際に何を意味するのか常に興味がありました。文字通り、プロジェクトは純粋にサイドプロジェクトとして行われ(通常は全員が日中の仕事を終えた後の夜)、真の貢献者/専任の開発チームはいないか、それよりも複雑ですか?

11
無限リストから最高の100個を取得
私の友人の一人がこのインタビューの質問を受けました- 「ある一定の時点で上位100個の数字を返すようにデータ構造を維持する必要がある数字の無限リストからの数字の流れが絶え間なくあります。すべての数字は整数のみであると仮定します。」 これは簡単です。ソートされたリストを降順で保持し、そのリスト内の最小数を追跡する必要があります。取得した新しい数がその最小数よりも大きい場合、その最小数を削除し、必要に応じてソート済みリストに新しい数を挿入する必要があります。 その後、質問が延長されました- 「挿入の順序がO(1)であることを確認できますか?可能ですか?」 私が知っている限りでは、リストに新しい番号を追加し、並べ替えアルゴリズムを使用して再度並べ替えても、クイックソートのO(logn)が最適です(私は思う)。だから私の友人はそれは不可能だと言った。しかし、彼は納得しておらず、リストではなく他のデータ構造を維持するよう求めました。 私はバランスの取れた二分木を考えましたが、そこでも1の順序で挿入されません。だから私も同じ質問をしています。上記の問題に対して1の順序で挿入できるデータ構造があるか、まったく不可能であるかを知りたい。
53 numbers  big-o  puzzles 


10
テストのテスト方法は?
コードをテストして、コードをより正確にします(実際、不正確になる可能性は低くなります)。ただし、テストはコードでもあり、エラーが含まれることもあります。また、テストにバグがある場合は、コードが改善されることはほとんどありません。 テストで考えられる3種類のエラーを考えることができます。 プログラマーが目前のタスクを誤解し、テストが実行すべきだと思ったとおりにテストを実行する場合の論理エラー。これは誤りです。 基礎となるテストフレームワークのエラー(例えば、漏れやすいモックの抽象化)。 テストのバグ:テストは、プログラマーが考えていることとは少し異なっています。 タイプ(1)のエラーを防ぐことは不可能と思われます(プログラマーが...賢くならない限り)。ただし、(2)および(3)は扱いやすい場合があります。これらのタイプのエラーにどのように対処しますか?それらを避けるための特別な戦略はありますか?たとえば、テスト作成者の前提条件のみをチェックする特別な「空の」テストを作成しますか?また、壊れたテストケースのデバッグにどのように取り組みますか?

14
TDDは複雑なプロジェクトで本当に機能しますか?
私はTDDプロジェクトで経験した問題に関してこの質問をしています。単体テストを作成するときに、次の課題に気付きました。 モックデータの生成と維持 大きなモックデータを維持するのは難しく、非現実的です。データベース構造が変更されると、さらに難しくなります。 GUIのテスト MVVMとGUIのテスト機能を備えていても、GUIシナリオを再現するには多くのコードが必要です。 ビジネスをテストする TDDを単純なビジネスロジックに限定するとうまくいくという経験があります。ただし、テストの組み合わせ(テスト領域)の数が非常に多いため、複雑なビジネスロジックのテストは困難です。 要件の矛盾 実際には、分析および設計中のすべての要件を把握するのは困難です。プロジェクトが複雑であるため、多くの場合、1つのノートの要件が矛盾につながります。矛盾は、実装フェーズの後半で見つかります。TDDでは、要件が100%正しいことが要求されます。このような場合、テストの作成中に競合する要件がキャプチャされることが予想されます。しかし、問題は複雑なシナリオではそうではないということです。 私はこの質問を読みました:なぜTDDは機能するのですか? TDDは本当に複雑なエンタープライズプロジェクトで機能しますか、それともプロジェクトタイプに実質的に制限がありますか?
53 tdd 

4
開発にマージされた機能が経営陣によって延期された場合はどうなりますか?
最近、Webアプリの機能(自動サインアップ)が管理者によって延期されるという問題が発生しました。彼らは、開始が「冷たすぎる」と感じていたが、彼らが取り組んでいた他のすべての機能を公開したかったためです。 問題は、この機能が次のリリースでライブをプッシュする予定の他のすべての機能と一緒に終了したときに開発にマージされたため、通常のようにdev-> test-> masterをマージできないことです。 この問題をどのように回避できたでしょうか?

1
Swiftプロトコルの命名規則[終了]
主にC#のバックグラウンドから来て、私は動作を定義する実装のないオブジェクトを記述するために「インターフェース」という用語を使用することに慣れています。C#ではIEnumerable、などのように、インターフェイス名の先頭に「I」を付けます。 もちろん、コンセプトは異なる言語で異なる名前を持っています。Swiftでは、同じ概念が「プロトコル」と呼ばれます。プロトコルを開発しているとき、プロトコルとそれを実装するクラスの名前がよく似ています。これまでのところ、C#で「I」を使用するのと同じ方法で、これらのオブジェクトに「プロトコル」という単語を追加していますEnumerableProtocol。 迅速なプロトコルの命名規則についての考えはありますか?

2
「機能がうらやましい」コードとは何ですか。なぜコードのにおいと見なされるのですか?
SOに関するこの質問は、OPが機能en望のコードだと考えているものを修正することについて語っています。この気の利いたフレーズが引用されているのを私が見た別の例は、ここでprogrammers.SEで最近与えられた答えです。私はその答えにコメントを入れて情報を求めましたが、Q&Aを読んでプログラマがfeature-envyという用語の意味を理解することは一般的な助けになると思いました。適切と思われる場合は、追加のタグを自由に編集してください。

7
単独開発者とチーム開発者:先に進むべきですか?[閉まっている]
私は小さな会社でソロ開発者として働いています。十分な作業がありますが、同じことはお金には当てはまりません。したがって、私は近い将来に新しい同僚を見ることはありません。 私は、IT運用に関連するすべてのことを絶対に担当しています。これには、社内で使用されるソフトウェアの開発とメンテナンス、クライアントが使用するさまざまなウェブサイトの開発とメンテナンス、ウェブサイトインフラストラクチャ、いくつかのサーバーのメンテナンスを含むローカルネットワークインフラストラクチャ、社内サポートなどが含まれます。 私は自分の仕事の95%を本当に楽しんでおり、仕事に高い柔軟性を持っています。いつ何をするかを決めることができますが、何をすべきかを誰も本当に教えてくれません。ただし、私が時々同僚と座って、私がやらなければならないことのロードマップを作成することを除いて。私は自分自身が高い仕事倫理を持ち、自分がしていることに平均以上に集中していると考えているので、物事は成し遂げられます。 しかし、私は私の周りに同じ人と一緒に働く他の人がいるのが本当に懐かしくなりました。私はソロ開発者であるため、幅広い技術に精通する必要がありますが、大企業で働く他の「気の合う」人々が参加している「知識の共有」を見逃していると感じています。プログラミングの障害や設計上の決定について話し合う人が本当にいないので、それを見逃し始めています。また、将来の雇用主が、チームに参加できないほど長い間独力で働いてきたこの「隠者」についてどう思うか心配です。 ただし、反対側では、大企業では現在の柔軟性を得ることができないと考えています。私は、はるかに厳しい期限、遅い時間、専門的な仕事の分野を目にするでしょう。また; この「知識の共有」というアイデアが今後実現するかどうかわかりませんか? 他の誰かがこの状況にありましたか?キャリアの観点と個人の開発の観点から見た良いアイデアですか?より大きな場所に移動して、(おそらく)より大きな開発者グループと「志を同じくする」人々の一部になることを検討すべきですか?言い換えれば、草は反対側でより緑になりますか?

5
開くファイル名を渡すべきですか、それともファイルを開くべきですか?
テキストファイルを処理する関数があるとします。たとえば、テキストファイルから読み取り、単語 'a'を削除します。ファイル名を渡して関数の開始/終了を処理するか、開いたファイルを渡して、それを呼び出す人がそれを閉じることに対処することを期待できます。 最初の方法は、ファイルが開いたままにならないことを保証するより良い方法のように思えますが、StringIOオブジェクトのようなものを使用することを防ぎます 2番目の方法は少し危険です-ファイルが閉じられるかどうかを知る方法はありませんが、ファイルのようなオブジェクトを使用することができます def ver_1(filename): with open(filename, 'r') as f: return do_stuff(f) def ver_2(open_file): return do_stuff(open_file) print ver_1('my_file.txt') with open('my_file.txt', 'r') as f: print ver_2(f) これらのいずれかが一般的に好まれていますか?一般に、関数はこれらの2つの方法のいずれかで動作すると予想されますか?または、プログラマーが関数を適切に使用できるように、適切に文書化する必要がありますか?

6
Javaで可能な限りラムダ式を使用していますか?
私は最近、Java 8で導入されたLambda式を習得しました。関数型インターフェースを使用するときはいつでも、関数型インターフェースを実装するクラスを作成する代わりに、常にLambda式を使用する傾向があります。 これは良い習慣と考えられていますか?または、機能インターフェイスにLambdaを使用することが適切でない状況ですか?
52 java  lambda 

4
Unixパイプの正確な工夫は何ですか
ダグラス・マックロイがどのようにコンセプトを思いついたのか、そしてケン・トンプソンがそれを一晩でどのように実装したのかという話を聞いたことがあります。 私が理解している限り、パイプは、1つのプロセスが書き込みと他の読み取りを行う2つのプロセス間でメモリを共有するシステムコールです。 OSの内部や概念に精通していない人として、私はストーリーの「天才」とは一体何なのか疑問に思っていました。メモリを共有する2つのプロセスのアイデアですか?それとも実装ですか?または両方? PS:パイプの有用性やシェルでの使用方法を知っています。問題は、の概念と実装に関するものです|

9
例外をスローするか、コードを失敗させる
このスタイルに賛否両論があるかどうか疑問に思っています。 private void LoadMaterial(string name) { if (_Materials.ContainsKey(name)) { throw new ArgumentException("The material named " + name + " has already been loaded."); } _Materials.Add( name, Resources.Load(string.Format("Materials/{0}", name)) as Material ); } そのメソッドは、それぞれnameに対して1回だけ実行する必要があります。_Materials.Add()同じに対して複数回呼び出されると、例外がスローされますname。その結果、私のガードは完全に冗長なのでしょうか、それともそれほど明白でない利点がありますか? 誰かが興味を持っているなら、それはC#、Unityです。
52 exceptions 

11
カスケードリファクタリングを回避するにはどうすればよいですか?
プロジェクトがあります。このプロジェクトでは、機能を追加するためにリファクタリングしたいと考え、機能を追加するためにプロジェクトをリファクタリングしました。 問題は、作業を終えたときに、それに対応するためにインターフェイスを少し変更する必要があることが判明したことです。だから私は変更を加えました。そして、新しいクラスの観点から、現在のインターフェイスでは消費クラスを実装できないため、新しいインターフェイスも必要です。今では3か月後に、無数の事実上無関係な問題を修正する必要があり、1年前にロードマップされた問題、または問題がコンパイルされる前に修正できないと単純にリストされている問題の解決を検討しています再び。 この種のカスケードリファクタリングを今後回避するにはどうすればよいですか?これは、以前のクラスが互いに緊密に依存しすぎているという単なる症状ですか? 簡単な編集:この場合、リファクタリングは機能でした。これは、リファクタリングにより特定のコードの拡張性が向上し、一部の結合が減少したためです。これは、外部の開発者がより多くのことができることを意味し、それが私が提供したかった機能でした。したがって、元のリファクタリング自体は機能的な変更ではないはずです。 5日前に約束したより大きな編集: このリファクタリングを開始する前に、インターフェイスのあるシステムがありましたが、実装では、dynamic_cast出荷したすべての可能な実装を単純に確認しました。これは明らかに、インターフェイスから継承することはできなかったことを意味し、第2に、このインターフェイスを実装するための実装アクセス権を持たない人は不可能であることを意味しました。だから私はこの問題を修正し、誰でもそれを実装できるようにインターフェースを公開し、誰でもそれを実装できるようにし、インターフェースの実装が必要な契約全体であると判断しました。 私がこれをしたすべての場所を見つけて火で殺そうとしていたとき、特定の問題であることが判明した場所を1つ見つけました。それは、さまざまな派生クラスのすべての実装の詳細と、すでに実装されているが他のどこかより優れた複製機能に依存していました。代わりにパブリックインターフェイスの観点から実装し、その機能の既存の実装を再利用することもできます。正しく機能するには特定のコンテキストが必要であることを発見しました。おおまかに言って、呼び出し元の以前の実装はちょっと似ていました for(auto&& a : as) { f(a); } ただし、このコンテキストを取得するには、次のようなものに変更する必要がありました std::vector<Context> contexts; for(auto&& a : as) contexts.push_back(g(a)); do_thing_now_we_have_contexts(); for(auto&& con : contexts) f(con); これは、以前はの一部であったすべての操作についてf、一部はgコンテキストなしで動作する新しい関数の一部にする必要があり、一部は現在の遅延の一部で行う必要があることを意味しますf。しかし、すべてのメソッドf呼び出しがこのコンテキストを必要とするわけでも、必要とするわけでもありません。一部のメソッドは、別個の手段で取得する別個のコンテキストを必要とします。そのため、最終的にf呼び出しを行うすべて(大まかに言えば、ほぼすべて)について、必要なコンテキスト(ある場合)、取得元、および古いものからf新しいものへの分割方法を決定する必要がfありましたg。 そして、それが私が今いるところに行き着いた方法です。とにかく他の理由でこのリファクタリングが必要だったからです。

5
参照カウントのスマートポインターが人気があるのはなぜですか?
ご覧のとおり、スマートポインターは多くの実際のC ++プロジェクトで広く使用されています。 ある種のスマートポインターはRAIIと所有権の移行をサポートするために明らかに有益ですが、プログラマーが割り当てをそれほど考慮する必要がないように、「ガベージコレクション」の方法として共有ポインターをデフォルトで使用する傾向もあります。 Boehm GCのような適切なガベージコレクターを統合するよりも、共有ポインターの方が人気があるのはなぜですか?(または、実際のGCよりも人気があることにまったく同意しますか?) 参照カウントに対する従来のGCの2つの利点について知っています。 従来のGCアルゴリズムには、参照サイクルに関する問題はありません。 参照カウントは通常、適切なGC よりも遅くなります。 参照カウントスマートポインターを使用する理由は何ですか?

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