ソフトウェア工学

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

8
スクラムでは、開発環境のセットアップや機能開発などのタスクを実際のユーザーストーリー内のサブタスクとして管理する必要がありますか?
プロジェクトでは、次のようなタスクに時間を費やす必要がある場合があります。 代替のフレームワークとツールの調査 プロジェクト用に選択されたフレームワークとツールの学習 サーバーとプロジェクトインフラストラクチャ(バージョン管理、ビルド環境、データベースなど)のセットアップ ユーザーストーリーを使用している場合、この作業はどこに行けばいいですか? 1つのオプションは、それらすべてを最初のユーザーストーリーの一部にすることです(たとえば、アプリケーションのホームページを作成します)。別のオプションは、これらのタスクを急増させることです。3番目のオプションは、タスクをユーザーストーリーではなく問題 / 障害(たとえば、まだ選択されていない開発環境)の一部にすることです。

7
なぜCSは記憶されるように教えられているのですか?[閉まっている]
現在のところ、この質問はQ&A形式には適していません。回答は、事実、参考文献、または専門知識によってサポートされると予想されますが、この質問は、議論、議論、世論調査、または広範な議論を求める可能性があります。この質問を改善し、おそらく再開できると思われる場合は、ヘルプセンターをご覧ください。 7年前に閉鎖されました。 私はこの1年間、高校でAdvanced Placement Computer Scienceを受講しています。ドキュメンテーションなどを使用する際のリソースフルかつ効率的な方法ではなく、単にコードと機能を暗記するように教えられているようです。 実際には、多くの(すべてではないにしても)プログラミングの仕事で、ドキュメントをめくる、過去のコードと他のコードをレビューすることができ、基本的には私の教師が「だまし」と見なすことを行うことができます。 コアコンセプトは(どんな主題でも)記憶するために不可欠であることに同意しますが、特にコンパイラー、デバッガー、リファレンスがある場合は特に、CSクラスの筆記試験を行うことは私にとって不必要で非現実的ですマニュアル、およびインターネット全体で、実際の作業状況で参照します。 ドキュメント、サンプルコード、デバッガーなどの使用方法や解釈方法などの有用なスキルを教えるのではなく、CS がコードと機能の記憶に重点を置いて教えるのはなぜですか?
23 learning 

5
保存せずに新しいオブジェクトを作成するのは悪い習慣ですか?
この質問は、Software Engineering Stack Exchangeで回答できるため、Stack Overflowから移行されました。 7年前に移行され ました。 オブジェクトへの参照を保存せずにJavaコードで作成されたオブジェクトを見てきました。たとえば、Eclipseプラグインで、次のように作成されたSWTシェルを見ました。 new Shell(); この新しいShellオブジェクトは変数に格納されませんが、ウィンドウが破棄されるまで参照されたままになります。ウィンドウが閉じられると、デフォルトで[信じる?]が発生します。 参照を保存せずにこのようなオブジェクトを作成するのは悪い習慣ですか?または、ライブラリの設計が不十分でしたか?参照の必要はないが、オブジェクトの「副作用」のみが必要な場合はどうなりますか?とにかく参照を保存する必要がありますか? 更新: 確かに、私の上記の例は貧弱です。このように作成されたUI要素を見てきましたが、Shellインスタンスでopenメソッドを呼び出す必要があるため、このようなSWTシェルの作成はおそらく無意味です。Java並行性チュートリアルの次のような、aixが提供するより良い例があります。 (new HelloThread()).start(); このプラクティスは多くのコンテキストで見られるため、疑問が残ります。それは良い習慣ですか?
23 java 

9
Cがバッファオーバーフローを起こしにくくするのはなぜ難しいのですか?
私は大学でコースを行っています。ラボの1つでは、提供されたコードに対してバッファオーバーフローエクスプロイトを実行しています。これは、スタック上の関数の戻りアドレスを変更して別の関数に戻るなどの単純な悪用から、プログラムのレジスタ/メモリ状態を変更してから呼び出した関数に戻るコードまでの範囲です。あなたが呼び出した関数は、エクスプロイトを完全に忘れています。 私はこれについていくつか調査を行いましたが、この種のエクスプロイトは、Wiiでhomebrewを実行したり、iOS 4.3.1のテザーなしのジェイルブレイクを実行したりするなど、今でもどこでも使用されています。 私の質問は、なぜこの問題を修正するのがとても難しいのですか?これが何百ものものをハッキングするために使用される主要なエクスプロイトの1つであることは明らかですが、許可された長さを超えて入力を切り捨て、取得したすべての入力を単純にサニタイズするだけで修正するのは非常に簡単だと思われます。 編集:私は考慮すべき答えが欲しい別の視点-なぜCの作成者はライブラリを再実装することでこれらの問題を修正しないのですか?

12
私はスクラムで仕事を始めたばかりで、何かが欠けているようです。私はスクラムが初めてです
コードは、古典的なASP / ASP.NETの組み合わせの完全な混乱です。スクラムは、大きな混乱を修正するか、それを追加することで構成されます。書き直しを始めるのに忙しいので、不思議に思っています。 スクラムのどこに、開発者が十分に十分であると言うことができ、大きな書き直しを開始する時間を与えることを要求することができる部分がありますか?古いコードに「Stories」をパッチするだけの無限ループのようです。 そのため、コードベースがどれだけ悪くなったのか理解していないため、書き直そうとは思わない非技術的な人々によって物事が実行されています。 では、誰がこの大きな書き換えの変更を担当しているのでしょうか?開発者ですか?スクラムマスター? 現在の戦略は、時間を見つけて、より高いレベルの人が関与することなく自分でそれを行うことです。なぜなら、彼らは主に現在の混乱に責任がある<-からです->。

8
タイプを命名するための良いテクニックやテストはありますか?
厄介な、未解決の質問ですが、それは私がいつも反対している問題です: 保守と操作が簡単なソフトウェアは、適切に設計されたソフトウェアです。設計を直観的にしようとすると、次の開発者がコンポーネントの機能を推測できるような方法でコンポーネントに名前を付けます。これが、クラスに「Type1」、「Type2」などの名前を付けない理由です。 実際の概念(顧客など)をモデル化する場合、これは一般に、モデル化される実際の概念に基づいて型に名前を付けるのと同じくらい簡単です。しかし、よりシステム指向の抽象的なものを構築する場合、読みやすく、簡単に消化できる名前を使い果たすことは非常に簡単です。 (私にとっては)コンポーネントの動作を説明する基本型またはインターフェイスを使用して、型のファミリに名前を付けようとすると悪化します。これは当然、派生型ごとに実装のフレーバー(IDataConnectionおよびSqlConnection.NET Frameworkなど)を記述しようとしますが、「リフレクションによる動作と特定の属性セットの検索」のような複雑なものをどのように表現しますか? 次に、やろうとしていることを説明していると思われるタイプの名前を最終的に選択したら、同僚は「WTFはDomainSecurityMetadataProvider実際にこれを行うのですか?」と尋ねます。 コンポーネントの意味のある名前を選択するための良いテクニックはありますか、または混乱した名前を取得せずにコンポーネントのファミリーを構築する方法はありますか? 名前に適用できる簡単なテストはありますか?
23 design  naming 

10
悪いコードベースでアプリケーションが構築されていることを証明する方法は?
私は現在、私の仕事で以前働いていたいくつかの開発者によって構築されたシステムをレビューしています。システムはユーザーの観点からはかなりうまく機能しますが、コードレビューを掘り下げると、まったく混乱します。私は、アプリケーションの構築方法が将来の更新に耐えられず、使用量が大幅に増加することはないと確信しています。 問題は、それがどれほど悪いかは知っているが、上司はそうではないということです。マネージャーにそれを証明して問題を実際に確認し、現在のコードベースで最小限のトリアージを行い、近い将来、アプリケーションの次のバージョンの新しい開発ラインを開始できるようにするにはどうすればよいですか?

3
プログラミングコンテストやコンテストでC ++が優勢なのはなぜですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 6年前に閉鎖されました。 C ++は非常に高速な言語であることを理解していますが、Cはそれほど高速ではないのでしょうか、それとも場合によっては高速ではありませんか? そうすれば、C ++にはOOPがあると言うかもしれませんが、ほとんどのプログラミングパズルに必要なOOPの量はそれほど大きくなく、私の意見ではCがそれを処理できるでしょう。 私がこれを求めている理由は次のとおりです。私はプログラミングのコンテストやコンテストに非常に興味があり、それらをCでコーディングすることに慣れています。ただし、大多数の人がC ++を使用していることに気付きました(たとえば、Google Code Jam 2011のファイナリスト25人中17人がC ++を使用していましたが、誰もCを使用していませんでした)。 オブジェクト指向とは別に、何がC ++をプログラミング競技に適した言語にしているのですか?大会でより良い成績を収めるために学んで使用すべき言語の特徴は何ですか? 背景については、私は自分がCにかなり習熟していると考えていますが、C ++を学び始めたばかりです。
23 c++  c 

11
継続的に変更する必要のないソフトウェアを書くことは可能ですか?
私は多くの異なる言語で多くのソフトウェアを書きました。また、VerilogとVHDLを使用してFPGAで使用するハードウェアを「書きました」。 私はソフトウェアよりもハードウェアを書くことを楽しむ傾向があり、主な理由の1つは、「完了」して変更する必要のないハードウェアを書くことができるからだと思います。インターフェイスと機能を定義し、テストベンチを書く、ハードウェアモジュールを実装してから、シミュレータを使用してそれをテストします。次に、そのハードウェアモジュールをビルディングブロックとして使用して、より大きくより良いものを作成できます。そのモジュールに機能を追加する必要がある場合は、2番目のモジュールを作成し、そこに機能を追加します。元のモジュールは問題なく機能し、引き続き有用であるため、元のモジュールを捨てることはありません。 ソフトウェアに関する私の主な不満の1つは、「完了」しないことです。追加する別の機能が常にあります。多くの場合、機能を追加すると、以前は正常に機能していた別の場所にバグが発生します。これは、インターフェイスに違反していない限り、ハードウェアでは発生しません。 明確にするために、機能のリストを使用して何かの1つのバージョンを構築することを支持していません。それは永遠です。左側のコードを突いて右側のバグを見つけたくないのですが、これは新しい機能を追加した後に起こるようです。 ハードウェアが「書き込まれる」のと同様の方法でソフトウェアを書くことは可能ですか?既存のコードを書き直したり新しいバグを導入したりすることなく、常に前進を続け、新しい機能を追加できる優れたソフトウェア開発方法論はありますか?

4
XML名前空間にURIが必要なのはなぜですか?
XML名前空間にURIが必要な理由を理解しようとしていますが、その目的がわかりません。誰かが私を少し明るくして、具体的な例でその使用を示すことができますか? 編集: わかりましたので、たとえば:w3schoolsからこれを持っています <root xmlns:h="http://www.w3.org/TR/html4/" xmlns:f="http://www.w3schools.com/furniture"> <h:table> <h:tr> <h:td>Apples</h:td> <h:td>Bananas</h:td> </h:tr> </h:table> <f:table> <f:name>African Coffee Table</f:name> <f:width>80</f:width> <f:length>120</f:length> </f:table> </root> それで、何をhttp://www.w3schools.com/furniture保持する必要がありますか?
23 xml  namespace 

5
オープンソースプロジェクトの外部依存関係をどのように処理しますか?
オープンソースプロジェクトを作成し、Google CodeまたはGitHubを使用していて、Luaなどのライブラリを使用したい場合、どのようにすればよいですか? 依存関係をリポジトリに含める必要がありますか? 依存関係は、プロジェクトの他の部分と同じビルドスクリプト内からビルドする必要がありますか、それとも別のビルドスクリプトからビルドする必要がありますか? ライブラリをコンパイルする前にインストールする必要はありません。

11
銀行の世界でコード設計の努力または怠lazを選択する
私は素晴らしい投資銀行で2年間働いてきました。 私は、最適化されたコードを作成し、適応された優れたデザインパターン、ソリッド原則、デメテルの法則を尊重し、あらゆる種類のコードの重複を回避することを望んで、いくつかの技術プロジェクトを作りました 本番環境での配信=>バグがゼロの場合、すべてが期待どおりに行われています。 しかし、大部分の開発者は、すべてのコードが読解には複雑すぎることを正確にするために来ました。たとえば、「ifおよびinstanceofをいくつか作成し、ポリモーフィズムを忘れて、緊急の生産バグを修正するのが非常に簡単になるようにします」。私は答えることを好まなかった...... これらの開発者はまったく好奇心がないことを知っており、優れた設計を理解する努力を拒否しています(たとえば、90%の開発者は戦略パターンとは何かを知りません。 )、私のプロジェクトマネージャーは、私は本当に間違ったやり方であり、世銀の世界にとって理想主義すぎると言った。 私に何をアドバイスしますか?本当に良いコードの欲求を維持するか、そうである開発者の大多数に私を適応させるならば、私によると、私による開発者の仕事のすべての美しさである設計コードによって本当に面白くないです。 それとも逆に、基本的なオブジェクト指向の原則とベストプラクティスを習得して、自分のコードに適応する必要がありますか?

13
単体テストはどのように機能しますか?
私はコードをより堅牢にしようとしており、ユニットテストについて読んでいますが、実際の有用な使用法を見つけることは非常に困難です。たとえば、ウィキペディアの例: public class TestAdder { public void testSum() { Adder adder = new AdderImpl(); assert(adder.add(1, 1) == 2); assert(adder.add(1, 2) == 3); assert(adder.add(2, 2) == 4); assert(adder.add(0, 0) == 0); assert(adder.add(-1, -2) == -3); assert(adder.add(-1, 1) == 0); assert(adder.add(1234, 988) == 2222); } } 必要な結果を手動で計算してテストする必要があるため、このテストはまったく役に立たないと感じています。ここでのより良い単体テストは assert(adder.add(a, b) == (a+b)); ただし、これはテストで関数自体をコーディングするだけです。誰かがユニットテストが実際に役立つ例を教えてもらえますか?参考までに、私は主に〜10のブール値といくつかのintを受け取り、これに基づいてintの結果を与える「プロシージャ」関数を主にコーディングしています。テスト。編集:また、これは(おそらく設計が不適切な)ルビーコード(私が作成しなかった)を移植しているときに正確にすべきでした

4
このようなコードは「列車事故」(デメテルの法則に違反)ですか?
私が書いたいくつかのコードを見てみると、次の構成要素に出会い、考えさせられました。一見、十分きれいに見えます。はい、実際のコードでは、getLocation()メソッドには、取得する場所を正確に説明する、より具体的な名前があります。 service.setLocation(this.configuration.getLocation().toString()); この場合、serviceは、メソッド内で宣言された既知の型のインスタンス変数です。this.configurationクラスコンストラクターに渡されたものであり、特定のインターフェイス(パブリックgetLocation()メソッドを必須とする)を実装するクラスのインスタンスです。したがって、式の戻り値の型this.configuration.getLocation()は既知です。特にこの場合には、それがあるjava.net.URLのに対し、service.setLocation()望んでいますString。2種類の文字列とURLが直接の互換性はありませんので、いくつかの変換の並べ替えは、丸い穴に四角いペグに合わせて必要とされます。 しかし、中に引用されたようにデメテルの法則によればクリーンコード、メソッドFクラスでCが唯一のメソッドを呼び出す必要がCによって作成または引数として渡されるオブジェクトF、およびインスタンス変数に保持されているオブジェクトC。それを超えるもの(toString()メソッド呼び出し自体の結果として作成された一時オブジェクトを考慮する場合を除き、上記の特定のケースでは最後です。この場合、法律全体が議論の余地がないようです)。 上記の制約が与えられた場合、上記のような呼び出しが推奨されない、または拒否されるべきである正当な理由はありますか?それとも、私は過度に細心の注意を払っていますか? パラメーターとして渡されたオブジェクト(などによって返されるオブジェクト)URLToString()を単に呼び出し、結果を返すメソッドを実装する場合、まったく同じ結果を得るために呼び出しをラップすることができます。効果的には、変換を1ステップ外に移動するだけです。それはどういうわけかそれを受け入れられるでしょうか?(思わないそのすべてが少し動き回る事があるので、それは、任意の違いのいずれかの方法を作るべきではないことを、直感的に、私には。しかし、デメテルの法則の手紙で行く引用として、それはI以来、許容可能ですその後、関数のパラメーターを直接操作します。)toString()URLgetLocation()getLocation() これがtoString()標準型を呼び出すよりも少しエキゾチックなものである場合、違いが生じるでしょうか? 答えるときserviceは、変数が属する型の動作またはAPIを変更することは実用的ではないことに注意してください。また、議論のために、戻り値の型を変更することgetLocation()も非現実的であるとしましょう。

3
FizzBu​​zzの質問の有効性に関する正式な研究はありますか?[閉まっている]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新して、 Software Engineering Stack Exchangeのトピックになるようにします。 4年前に閉鎖されました。 見た後にこの質問を任意のがあります:FizzBu​​zz面接の質問の変化に、今日だけでなく、周りにそれに関連する他の質問を見て、私が聞いている正式な、これはインタビューの手法としてどのように効果的な研究は?候補のかなりおかしな割合(場合によっては95%以上)を除外すると言う人はたくさんいますが、優れたプログラマー/開発者を見つけるのにどれほど良いでしょうか? 職務にふさわしい候補者を選択するには、ソフトスキルがハードスキルよりも優れた指標になる可能性があることを示すいくつかの研究があります。同様に、非常に多くの候補者がこのテストに失敗する中間的な理由があるかもしれません(神経質、「トリックだ」と考えるなど)。 これまでのコメントに基づいて、FizzBu​​zzの質問の背後にある考え方は、その人がさらに考慮すべき優れた(十分な)コーディングスキルを持っているかどうかを判断することです。私はFizzBu​​zzが実際にこれを行うと完全に確信しているわけではありません。また、FizzBu​​zz は採用プロセスの非常に早い段階で非常に大きな割合の候補者をフィルタリングすることを忘れないでください。 また、FizzBu​​zzの有効性を見ることは、定量的に完全に行えることを指摘します。これは、非常に可変的で非常に非科学的である(ただし、新規採用の決定には依然として非常に重要である)「適合」または「情熱」を見ることとは異なります。

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