開発方法は開発者の個人主義を押しつぶすべきか?


9

私は大学の最終学期にいて、ソフトウェアエンジニアリングのコースを受講しています。クラスでは、さまざまなソフトウェア開発方法について学びます。私たちが重点を置き、プロジェクトの開発に使用したのは、ウォーターフォール法でした。

インストラクターが間違って実装したようです。クラス図では、プライベートプロパティを含むすべてのプロパティとメソッドをリストする必要がありました。私はいくつかの本、つまりClean Codeを読みましたが、これは関数を可能な限り短くし、焦点を絞っていると述べています。他の開発者の助けにならない場合、ダイアグラムにすべての小さな関数をリストするのは面倒です(それらは非公開で、他の誰も使用しません)。さらに、プログラムを設計するときにすべての小さな関数について考えることはないかもしれません。リファクタリングするときにそれらが一緒に来るかもしれません。

インストラクターは、すべての機能をリストするように依頼して、私たちに間違ったことを伝えましたか?そして、これらの設計方法は、開発者の個人主義を押しつぶして、コードを最もよく理解できるようにコードを記述しますか?


20
クラスがウォーターフォールメソッドを教えているのはかなり悪いことです。これは、ソフトウェア開発の悪いプロセスの典型的な例です。
whatsisname

6
このクラスはあなたにたくさんのことを教えてくれたと思います。
JeffO、2011

7
実際、元のウォーターフォールには、相互にフィードバックする反復があります。それはその有用性を破壊した長年にわたるウォーターフォールの誤った教えです。スクラムなどの場合でも、スプリントでストーリーが通過するステップは、滝のステップをエミュレートします。UML図は、高レベルの設計にのみ役立ちます。コードが書かれるとすぐに、そのコードの前に書かれたドキュメントはすべて古くなります。これが工学の実現です。最後に、コードはドキュメントでなければなりません。
Andrew T Finnell、2011

10
ほとんどすべての開発者が、潰されるべきである開発者の個人主義の事例を見てきました。(おそらくウォーターフォールの方法論ではありませんが)。
psr

2
@whatsisname、私は強く同意しません。すべての開発者は、ウォーターフォールの開発を学び、悪いソフトウェア開発の標準的な例として理解し、体験する必要があります。さらに、多くの店はまだ正しいか間違っているかの滝であり、卒業生がそのために準備されることが重要です。
maple_shaft

回答:


10

すべてのメソッドをリストする必要がある理由を講師に尋ねましたか?

教室環境で求められることの多くと同様に、クラス図を開発者にとってより役立つものにするのではなく、クラスメートがクラスをどのように設計するかについて考える手助けをすることが目的であった可能性があります。生徒が大きな問題を小さな問題に分解する方法を学んでいるとき、おそらく彼らが必要とする可能性のあるプライベートな方法について考えることは彼らにとって役立つでしょう。また、誰かの設計が十分に検討されていない場合に、プロセスの早い段階で介入するために、学生が実装を検討しているメソッドについてよりよく理解することは、おそらくインストラクターにとって役立つでしょう。教室環境でのドキュメントは、実際の環境でのドキュメントよりもはるかに複雑になることがよくあります。

もちろん、インストラクターがこのレベルのドキュメントが実際のプロジェクトに役立つと信じている可能性もあります。その場合、インストラクターはおそらく時代遅れであるか、またはこのレベルの計画と文書化が適切である特定のニッチなバックグラウンドに由来しています。たとえば、スペースシャトル用のナビゲーションシステムを構築している場合や、医療機器を設計している場合は、開発中にコードをリファクタリングするよりも、設計に多くの投資をする方が一般にはるかに適切です。一方、ソーシャルネットワーキングサイトを開発している場合は、より機敏なアプローチがより適切です。


+1は、さまざまな目的でさまざまなデザインがどのように必要かを指摘します。クラスのデザインの良い点も。講師に質問するのは良い考えです
エセルエヴァンス

1
大学のコースを通過するためのルールを覚えておいてください:教授が何を望んでいるかを調べ、それを実現します。
クリストファー・マハン、2011

9

いいえ、ウォーターフォールメソッドを使用している場合、インストラクターはすべてのプロパティとメソッドを事前にリストするように指示しています。 ウィキペディアは滝の批判に言及している:

多くの人は、ウォーターフォールモデルは実際には悪いアイデアであると主張しています。重要なプロジェクトでは、ソフトウェア製品のライフサイクルのフェーズを完全に完了してから次のフェーズに移動して学習することは不可能だと信じています。たとえば、クライアントは、実際のプロトタイプを確認してコメントする前に、必要な要件を正確に把握していない場合があります。彼らは彼らの要求を絶えず変えるかもしれません。デザイナーやプログラマーはこれをほとんど制御できない場合があります。設計の確定後にクライアントが要件を変更した場合、新しい要件に対応するように設計を変更する必要があります。これは事実上、かなりの労働時間を無効にすることを意味します。これは、特にプロジェクトのリソースの大部分がBig Design Up Frontにすでに投資されている場合は、コストの増加を意味します。

これらの設計方法は、解釈する部分があり、構造に独自のタッチを加える方法があるため、設計の個人主義の実装者を押しつぶしません。あなたはその動物をデザインする必要がありましたか?

滝の欠点はありますが、すべてに長所と短所があります。


4

クラスでは、さまざまなソフトウェア開発方法について学びます。私たちが重点を置き、プロジェクトの開発に使用したのは、ウォーターフォール法でした。

おそらく、古典的なウォーターフォールモデルを学んだことでしょう。これは、ソフトウェア開発の世界に導入したとされた人物が最初から大規模なソフトウェアシステムの開発には不適切であると述べたものです。おそらく、読書に興味がある大規模なソフトウェアシステムのDevelopemtの管理と題したウィンストン・ロイスの論文より多くの人々はウォーターフォールモデルであると考えるものとの問題について学ぶために。

ただし、ウォーターフォールモデルは、ソフトウェア開発ライフサイクルの学習に役立ち、要件エンジニアリング、アーキテクチャ設計、詳細設計、実装、テスト、およびメンテナンスについて、非常に明確で明確なフェーズで学び、実行することに時間を費やすことができます。

クラス図では、プライベートプロパティを含むすべてのプロパティとメソッドをリストする必要がありました。私はいくつかの本、つまりClean Codeを読みましたが、これは関数を可能な限り短くし、焦点を絞っていると述べています。他の開発者の助けにならない場合、ダイアグラムにすべての小さな関数をリストするのは面倒です(それらは非公開で、他の誰も使用しません)。さらに、プログラムを設計するときにすべての小さな関数について考えることはないかもしれません。リファクタリングするときにそれらが一緒に来るかもしれません。

これらはすべて非常に有効なポイントです。

ウォーターフォールを使用している場合でも、設計段階ですべてのプロパティとメソッドを一覧表示することは、おそらくやりすぎです。あなたは間違いなく、公開されているすべてのものと必須プロパティをリストする必要があります。実際には、他のすべては実装の詳細であり、実装を図にリバースエンジニアリングすることで取得できます。

Clean Codeのアドバイス(私は一度も読んだことがない-私はあなたが投稿したものをそのまま読みます)は公平で、Waterfall手法を使用している場合でも適用できるようです。単一の責任の原則懸念の分離、およびSOLIDの他の原則に関して、クラスとメソッドを設計できます。ウォーターフォールは、必要なときにだけ、デザインの方法を教えてくれません。とはいえ、実装時にそれを行うためのより良い方法を学び、考えると、事前の対応は難しくなります。

これは、設計と実装の間の反復が非常に明確である必要があるという事実を指摘していると思います-従来のウォーターフォールでは考慮されていない問題です。


1
@pillmuncher読んだ人は少ないので、ちょっと悲しいです。
Thomas Owens

3
その紙について最も悲しいことは、ほとんどの人が実際にそれを介して滝を発見したということです。
Joeri Sebrechts、2011

3

他の開発者の助けにならない場合、ダイアグラムにすべての小さな関数をリストするのは面倒です(それらは非公開で、他の誰も使用しません)。

これが面倒だと思ったら、本当の仕事のプログラミングができるまで待ってください。しばらくの間、そのソフトウェアはあなたにとって実行可能なキャリアではないかもしれないと考えてください。

さらに、プログラムを設計するときにすべての小さな関数について考えることはないかもしれません。リファクタリングするときにそれらが一緒に来るかもしれません。

そう?

インストラクターは、すべての機能をリストアップするように依頼して、私たちに間違ったことを伝えましたか?

いいえ。これは一般的な要件です。

そして、これらの設計方法は、設計の実装者(開発者)の個人主義を押しつぶして、コードをどのように最も理解できるかをコードに記述しますか?

はい。個人の魂を砕くことは、ソフトウェア開発の重要な部分です。すべての個性は、あらゆる方法で、すべてのプログラマーから常に打ち負かされます。「プログラミングの神のルール」のどこかで、ある山からある預言者に伝えられたと書かれています。

いいえ、あなたは退屈なことを考えているだけです。それを乗り越えて、仕事に戻ります。


1
@FreshDaddy。「彼らは(ほとんどの場合)プライベートな機能を見ることはないだろう」と語った。いいえ。宝くじに当たったら、他のプログラマーがあなたのコードを引き継ぎ、プライベート関数を見るでしょう。また。一部の言語(Pythonなど)は、この種のプライバシーを避けています。
S.Lott、2009

2
@ S.Lott-すべてのプライベート関数をリストすることは、一般的な要件ではありません。誤解しないでくださいが、本格的な「コードを記述する前にすべてのプライベート関数をリストする」ことは確かにまれです。「必要なテディウス」と「価値のないテディウス」があります。プログラマーが「価値のない退屈さ」を排除することを考えると、現実世界のクライアントは、「生死」タイプのコードでない限り、これほど高価で無意味なものを要求することはほとんどありません。
Morgan Herlocker、2011

1
@ironcode:「コードを記述する前にすべてのプライベート関数をリストする」は確かにかなりまれです。私の経験ではありません。それが人々がデザインを学ぶ方法です。ジュニアプログラマーは、自分の仕事がこのレベルの監視を必要としないことを証明できるまで、しばしばこの標準に固執します。通常は1年未満です。学校からn00bsを取得し、見落としのないプログラミングにそれらを投げた組織は、主に巨大な問題を引き起こしているだけです。このレベルの監視は、コードが機能する可能性があることを確認するために不可欠です。
S.Lott、2011

1
@S Lott-私のモットーは、ソフトウェア開発が面倒な場合、あなたはそれを間違っているということです。私たちはプログラマーです。退屈な作業を自動化します。コード内で繰り返すことはありません。また、ドキュメントで繰り返す必要もありません。
kevin cline、2011

1
@kevin:この答えは純粋な皮肉です。そのため、これは完全に不適切であり、フラグを立てました。
Michael Borgwardt、2011

1

プログラミングは、制約の範囲内で作業する技術です。CPUが提供する命令セットは限られています。IOはハードウェアの設計によって制約されます。OS APIは、特定の動作を奨励し、他の動作を制限するために作成されます。高水準言語は、多くの場合、イディオムのセットを他のセットよりも促進するように設計されています...

そして、方法論も制限するように作られています。

開発プロセスのすべての側面でのあなたの課題は、それらの制約内でビジョンを実現することです。ハードウェア、言語、API、方法論によって投げつけられるそれぞれの壁に頭をぶつけますか?それとも、達成したいことと許可され奨励されていることを調和させる方法を見つけますか?

あなたがでください本当にあなたのインストラクターは、特徴点の無限のページを読んですることを希望すると思いますか?次に、その理論をテストします。プログラムを分割し、各アトムを文書化します。彼の机が重みで垂れ下がっているとき、むしろあなたは彼の本当の欲求があなたが期待するものとは多少異なることに気付くのではないかと思います。

または、必要に応じてドキュメントを準備します。明確にし、理解しやすくし、ダシール・ハメットの小説のように読んでください。そして、座って彼と話し、あなたが何をしたかを彼に示し、彼にそのメリットを説得してください。


1

インストラクターは、あなたにこのプロジェクトをやらせ、ウォーターフォール開発の長所と(ほとんど)短所を教えてくれる素晴らしい人だと思います。


1

プロジェクト分析の複雑さを測定する簡単な経験則は、「作成したソフトウェアで発生する劇的な事態(一般的には死亡や巨額の損失を含む)が発生した場合、開発者またはその会社が責任を負うことができるか?」です。

私のいくつかのコースでは、あなたと同じ経験をしました。軍需業界でのバックグラウンドを持っていた人々は私たちに分析を教えてくれました。そして、それは完全で徹底的な分析であり、プロジェクトのすべてのコースを計画します。この種のプロジェクトでは多くの反復を行う余裕はありません(爆弾の爆発も大丈夫ですが、予算の爆発もそうではありません)。そのため、ここでは創造性を発揮する場所がないため、計画に従う必要があります。

一方、少し読んだことがあれば、アジャイル手法については確かに読んだことでしょう。一般に、ドキュメントが少なくなり、開発者が直面する問題の解決策を開発する際に、開発者が自分の創造性を使用する余地が増えます。

結論として、あなたがより多くの経験を積むほど、より良くなり、あなたのインストラクターがあなたに示していることは、この業界の一部に当てはまります。プロジェクトを管理および設計する方法は、コーディングする方法と同じくらい確かにあることに注意してください。そして、あなたはそれらのすべてのための擁護者と批評家を見つけるでしょう。あなたが勉強している間にそれらをテストし、あなたが満足しているものを選んでください。


そして、「クラッシュすると人を殺せるか」に注意してください。「これが間違ったデータを出力した場合、誰かが刑務所に行くことはできますか?」という別のタイプがあります。要件、細部まで。
Christopher Mahan

@Christopher:コメントに応じて私の回答を適宜調整しました:)
Matthieu

0

私が持っていたものなど、一部のソフトウェアエンジニアリングクラスは、「失敗は成功」、「失敗は失敗から学ぶ無駄な機会」という奇妙なスタイルで教えられています。これがその1つである場合は、割り当てに固執して、奇妙さを楽しんでください。


0

あなたのインストラクターは連絡がないと思います。商用ソフトウェアがその範囲で設計または文書化されることはほとんどありません。それは非常に高額であり、結果として得られるドキュメントはさらに多くの費用なしで維持することはできません。IMOのようなプラクティスは、コーディングがアセンブリ言語で行われることが多かった時代の遺産です。テスト主導の開発、ペアプログラミング、継続的なリファクタリングなど、よりアジャイルなプラクティスを試すのに時間を費やす方がよいでしょう。

インストラクターは「間違っていると言った」のですか?

私はそう思う。

退屈な仕事を知的財産労働者に割り当てることは無駄です。学校では、退屈な仕事は、おそらく学生に退屈な仕事をさせない限り、教育的価値はほとんどまたはまったくありません。このような演習は、学生と業界の両方に悪影響を及ぼします。時間を無駄にしているので学生は危害を加えられます。一部の学生はそのような退屈さが必要であり、有用であると結論付けるかもしれないので、業界は害を受けています。どちらでもない。ソフトウェアの30年間で、退屈で便利なのはバックアップテープの交換だけでした。それを行うことができるロボットがありましたが、それらは法外に高価でした。


2
あえて言うなら、政府との契約からお金を稼ぐ会社で働いたことは一度もない。(編集)あなたは商用ソフトウェアと言っていました..私の発言は今は無意味です。
Andrew T Finnell、2011

@Andrew Finnel:真実は非常に多くのレベルで非常に苦痛です。
Peter Rowell、2011

2
@Andrew-私はDOD2167に取り組んできました。それが実践されたので、それは恐ろしくて非生産的でした。後で私は頻繁に配達される政府のためにアジャイル開発をしている別の会社で働きました。クライアントは非常に満足しています。彼らは6か月で有用なアプリケーションを手に入れ、四半期ごとに新機能を入手しました。
kevin cline

@Andrew私は、公務員および請負業者として、米国国防総省で2年以上の経験があります。アジャイル手法が採用されています。私が取り組んだ1つのチームは、スクラムを積極的に使用して、「ジャストインタイム」で「ちょうどいい」ドキュメントを作成していました。はい、ドキュメント(「ちょうどいい」ドキュメントであっても)は他の多くの場所よりもはるかに広範囲ですが、これは通常、関係者の数(契約が手を変える可能性がある、他の当事者が他のシステムを開発できるなど)によって左右されます。開発中のシステムの安全性または生命の重要性と重要性。
Thomas Owens

2
@Andrewそれは政府だけではありません。「製品」の40ページの仕様を見てきました。通常、このテーブルからすべてを選択して、パイプで区切ってください。誰もそれらを読むことに煩わされることはありません...
ベン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.