web-dev-qa-db-ja.com

思考の発達

私はアプリ開発者として1年半(私の知る限りではありませんが)働いており、最初の大きなプロジェクトを与えられました。

言うまでもありませんでしたが、順調に進んでいないので、プロジェクトに携わっている上級プログラマーに、どう対処するかアドバイスを求めました。

彼は、私は手元のタスクを大幅に検討しすぎたと言いました。これは、デザインパターンの検討に時間をかけすぎる前にこの規模のプロジェクトに取り組んだことがなかったためです。彼の賢明な言葉で、彼は私に「未来をファックし、今のために構築しなさい」と言った。

これは、プログラマーがこのようなプロジェクトに取り組むときに通常従うトレンドですか?たとえば、概念実証モデルを実行するように依頼された場合、実行可能な例をできるだけ早くマッシュするのが典型的な傾向ですか?

編集:これが火花を出した議論に照らして、私はこの状況がかなり極端であることを述べたいと思います:私たちのコントロールを超えた要因のために非常に厳しい締め切りがあります(つまり、私たちが目指している市場は私たちが興味を失うでしょう彼らに何かを見せないでください)そして彼のアドバイスはこの特定の仕事に非常に効果的であることが証明されました。

89
sf13579

救助に明らかな船長!

私はここでキャプテンオブビビズになり、発見される中間点があると言います。

将来に向けて構築し、技術的な選択や悪い設計に固執することは避けたいです。ただし、シンプルなものを設計するために3か月を費やしたり、2年間の寿命があり、フォローアッププロジェクトがありそうにない迅速でダーティなアプリのために拡張ポイントを追加したりしたくありません。

製品の成功を常に予測できるとは限らず、後で拡張する必要がある場合に、区別を見つけるのは困難です。

今のところビルド...

  • プロジェクトは破棄されます
  • プロジェクトの寿命が短い
  • プロジェクトには拡張機能を含めないでください
  • プロジェクトにリスク影響値がない(主にイメージに関して)

一般に、社内プロジェクトまたは顧客向けに構築されたものは、今のところ開発する必要があります。まっすぐな要件があることを確認し、必要に応じてそれらを関連付けて、必要なものと不要なものを把握します。 「良い」ということに時間をかけすぎないようにしてください。しかし、豚のようにコーディングしないでください。

一般的な問題は後で必要になる可能性があるため、後で使用できるようにしておきます。

XKCD: The General Problem

未来のために構築...

  • プロジェクトは公開されます
  • プロジェクトは再利用されるコンポーネントです
  • プロジェクトは他のプロジェクトへの足掛かりです
  • プロジェクトには、拡張されたフォローアッププロジェクトまたはサービスリリースがあります。

一般向けに構築している場合、または他のプロジェクトで再利用される場合は、悪いデザインがあなたを悩ませる可能性がはるかに高いため、より注意を払う必要があります。ただし、常に保証されるわけではありません。

ガイドライン

できる限り次の原則を順守することをお勧めします。効率的で適応性のある製品を設計する立場に立つ必要があります。

  • [〜#〜] yagni [〜#〜]
  • [〜#〜]キス[〜#〜]
  • かゆみを掻くような気分になり、追加機能について考えるときはいつでも書き留めてください。プロジェクトの要件を振り返り、追加が優先事項かどうかを自問してください。 primaryビジネス価値を追加するかどうかを尋ねます。

私は個人的に考えすぎたり、やりすぎたりする傾向があることを知っています。それはアイデアを書き留めるのに本当に役立ち、私が追加の機能を必要とするかどうか非常に頻繁に再考します。多くの場合、答えは「いいえ」または「後でクールになるだろう」です。これらの最後のアイデアは危険です。なぜなら、それらは私の頭の後ろに留まり、私はそれらを計画しないように自分を強制する必要があるからです。

オーバーエンジニアリングせず、後でブロックすることなくコーディングする最善の方法は、優れた最小限の設計に集中することです。後で拡張できるコンポーネントとしてうまく分割できますが、後で拡張する方法をどのように拡張するかについてはまだ考えていません。あなたは未来を予測することはできません。

単純なものを構築するだけです。

ディレンマタ

オーバーエンジニアリング

これは、プログラマーがこのようなプロジェクトに取り組むときに通常従うトレンドですか?

そうです。これは既知のジレンマであり、製品を気にかけていることを示すだけです。そうしないと、さらに心配になります。少ないほうが常に本当に多いかどうか、 悪いほうが常に本当に良いかどうかについては意見が分かれていますMITまたはニュージャージーのような人 かもしれません。ここでは簡単な答えはありません。

プロトタイピング/ Quick-n-Dirty /少ないほど良い

実行可能な例をできるだけ早くマッシュするのは典型的な傾向ですか?

これは一般的な手法ですが、大多数のプロジェクトにアプローチする方法ではありません。それでも、プロトタイピングは私の考えでは良い傾向ですが、平均的な欠点があります。迅速で汚れたプロトタイプを実際の製品にプロモートしたり、管理上の圧力や時間の制約がある中で実際の製品のベースとして使用したりするのは魅力的です。それがプロトタイピングがあなたを悩ませるために戻ってくるときです。

Dilbert on shipping prototypes directly to production

プロトタイピングには明らかな 利点があります だけでなく、 の誤用と乱用 の可能性もたくさんあります結果としての利点)。

いつプロトタイピングを使用するのですか?

プロトタイピングを使用する 最良のタイプのプロジェクトに関するヒントがあります

[...]プロトタイピングは、ユーザーとの相互作用が多いシステムで最も有益です。

[...]プロトタイピングは、特にトランザクション処理のオンラインシステムの分析と設計で非常に効果的であり、画面ダイアログの使用がはるかに多くなっています。コンピューターとユーザーの間の相互作用が大きければ大きいほど、利点も大きくなります[...]

「これまでのラピッドプロトタイピングの最も生産的な用途の1つは、反復的なユーザー要件エンジニアリングとヒューマンコンピューターインターフェイス設計のためのツールとして使用されてきました。」

一方:

バッチ処理やほとんどの場合計算を行うシステムなど、ユーザーとのやり取りがほとんどないシステムは、プロトタイピングによるメリットがほとんどありません。場合によっては、システム機能を実行するために必要なコーディングが集中的で、プロトタイピングによって得られる潜在的なメリットが小さすぎることがあります。

緑のモンスターがいる場合は、プロトタイプを予算内に収めてください...

Dilbert on extending prototyping periods

113
haylem

プログラミングを始めるとき、たとえ自分自身であっても、すべてが概念の証明になります。時間は重要な要素であるため、アイデアには迅速で汚れたものやプロトタイプが必要な場合があります。開発者の間の大きな恐怖は、小さなアプリが本番稼働の準備ができていると考える利害関係者であるか、または永久に同じ速度で機能を追加できるはずです。あなたは大規模なプロジェクトに取り組み、これが事実ではないことに気付きました。

大規模なプロジェクトには通常、より複雑な要件があるため、複雑な設計を実装しようとする誘惑があります。あなたはそれらを読み、調査し、実装しようとすることに多くの時間を費やします。これは大きな時間の浪費になる可能性がありますが、それはすべて学習と経験の獲得の一部です。特定のデザインをいつ使用するかを知ることは難しく、通常は経験が伴います。 「この」プロジェクトで「それ」を試してみましたが、機能しませんでしたが、「こちら」で機能するはずです。

多くの計画を立てなければなりませんが、一度にすべてを行うのではありません。最初からすべてを行う必要はありません。私はむしろ誰かがこのような最初の大きなプロジェクトを作成するのを見たいです:

  1. 少し設計し、話し合います。
  2. 何かを行う一連のコードを記述します。
  3. 問題を認識し、コーディングを停止します。
  4. 設計に真剣に取り組み、勢いを失うことやコードモジョを失うことを心配するのをやめ、プロジェクトマネージャーを無視します(彼/彼女の賛成です)。
  5. プロジェクトを管理下に置く。あなたの混乱を修正します。全員が計画を理解していることを確認してください。プロジェクトを管理する。

既存のコードベースに実装する方法に本当に不安を抱くような機能の1つにぶつかることがあります。これは、「機能させるだけ」の時ではありません。私は上司に「ハンマーの代わりにスツールをつかまなければならないこともある」と言っていました。彼は私が私の机で「考えている」のを見つけた後にこれを私に言った。多くの上司とは異なり、彼は私がだまされているとは想定していなかったので、彼が私にもっとや​​りたいと思っていることを理解しました。天才。

結局、あなたのコードはデザインです。ドキュメント、図、会議、電子メール、ホワイトボードディスカッション、SO質問、議論、口論、怒りの発作、コーヒーを飲みながらの静かなチャットなどでサポートされています。デザインできない点があります。コードを書き込もうとするだけで発見できる欠陥のために、設計時間をこれ以上捨てる必要があるリスクがあります。また、より多くのコードを記述すれば、自分のやり方ではコーディングできない設計上の欠陥が発生する可能性が高くなります。 of。スツールの時間です。

54
JeffO

プログラマーは通常、将来について考えずに現在機能するものを構築しますか?

はい。

彼らはそうすべきですか?

番号。

一見すると、「未来について考える」ことは [〜#〜] kiss [〜#〜][〜#〜] yagni [〜のような確立された設計原則に違反しているように見えます#〜] 、これは今必要とされていないものは実装されるべきではないと主張しています。

しかし、実際にはそうではありません。将来について考えることは、シンプルで拡張可能で管理しやすいソフトウェアを設計することを意味します。これは、長期プロジェクトでは特に重要です。時間の経過とともに新しい機能が必要になり、堅実なデザインを採用することで、新しい部品を簡単に追加できるようになります。

完成したプロジェクトに取り組まない場合でも、インテリジェントに開発する必要があります。それはあなたの仕事であり、少なくとも良い仕事がどのように行われたかを忘れないために、あなたはそれをうまくやるべきです。

24
superM

アジャイル開発者は格言があります "You Are n't Gonna Need it(YAGNI)" これは、将来必要になると思われるものではなく、今必要なもののために設計することを奨励します。将来的に機能するように設計を拡張するには、リファクタリングすることをお勧めします。

これに対する重要な側面は、設計時に製品の要件を念頭に置き、将来発生する可能性のある一連の要件を考慮して設計しないようにすることです。

2つまたは3つの反復を先に考えることができる開発者のために言うべきことがある-彼らは彼らのクライアントまたはドメインをよく知っているので、高度な精度で将来のニーズを予測し、それらのために構築することができますが、確信が持てない場合は、あなたやクライアントが必要としないものに多くの時間を費やさないことが最善です。

13
user93143

これは、プログラマーがこのようなプロジェクトに取り組むときに一般的に従うトレンドですか?

あなたのメンターが意味したのは、最終的なソリューションで必要とされないかもしれない追加の複雑さを組み込むべきではないということでした。

アプリがこれとそれを行うべきであり、大規模に脇道に置かれるべきだと考えるのはあまりにも簡単です。

デザインパターンについては、それらが目的を達成するための手段であることを覚えておく価値があります。経験上、以前の直感にもかかわらず特定のデザインパターンが適合しない場合、これはコードのにおいを示している可能性があります。

たとえば、概念実証モデルを実行するように求められた場合、実行可能な例をできるだけ早くマッシュするのが一般的な傾向ですか?

プロジェクトが始まる前に、どのようなマイルストーンがあるのか​​、開発の過程で少しずつすべて(垂直方向のスライス)または各部分だけを詳細に表示したいか(水平方向のスライス)を検討する価値があります。最初のデザインの一部として、アプリ全体をストーリーボードに追加する価値があると思います。コードが記述されていなくても、全体をヘリコプターで表示したり、特定の領域の詳細を確認したりできます。

7
Robbie Dee

彼は、私は手元のタスクを徹底的に考えすぎており、このような大規模なプロジェクトに取り組んだことがなかったので、デザインパターンの考えに多くの時間を費やしていたと言いました。彼の賢明な言葉で、彼は私に「未来をファックし、今のために構築しなさい」と言った。

それは、他の開発者からのちょっとしたカウボーイの考え方だと思います。 「今すぐやる」タフなオタクの現代版。これは新興企業の間で人気のあるテーマになり、Facebookの人々が「正しく実行することは、正しく実行することよりも優れている」というフレーズを始めたことに感謝しません。

魅力的です。それは励みになり、大規模なプロジェクトを時間通りに、予算内で、そして何でもやりすぎずにすべて世界に投入するときに、コンソールの周りに立っている開発者が手をたたくビジョンを提供します。

それは理想主義的なファンタジーであり、人生はこのように機能しません。

ばか者は、「やること」だけでそれを成し遂げることができると考えて、プロジェクトに突入します。成功は、目に見えない挑戦に備え、彼の職業を素晴らしい職人技のように扱う開発者を優先します。

上級開発者は誰でも非難し、非難し、不満を言うことができます-そしてほとんどがそうします!

彼/彼女はあなたがプロジェクトを「考えすぎ」ているとあなたに話している間。最初に実際に「考える」ことをお祝いします。あなたは他の人よりも優れた開発者になるための最初のステップを踏みました。

これは、プログラマーがこのようなプロジェクトに取り組むときに通常従うトレンドですか?たとえば、概念実証モデルを実行するように依頼された場合、実行可能な例をできるだけ早くマッシュするのが典型的な傾向ですか?

それこそが概念実証です。それは、人々が一歩下がってそれを見ることができるように、できるだけ早く何かをつぶす試みです。これは、ミス、誤配、無駄な時間/お金を防ぐために行われます。

概念実証にはさまざまな種類があります。完了時にゴミとして捨てられるものを構築することも、プロジェクトの開始点を表すものを構築することもできます。それはすべて、必要なもの、およびコンセプトが最終製品にどれだけ近いかに依存します。

それはまた、あなたのアイデアを実証する機会でもあります。私が物事を彼らが予想しなかったレベルに持って行ったプロトタイプを提示したことが時々ありました。

6
Reactgular

通常、デザインは制限がありませんので、適用する量が多すぎたり少なすぎたりするのは簡単です。また、プロジェクトが完了または破棄されて初めて、正しい金額がわかります。それともそうではありません。

成功のための一般的なレシピはありませんが、極端を認識することを学ぶことができます。事前のすべての完全な設計は、些細なことを超えてほとんど機能しません。コンポーネントを精製のために残して、それが実行できると感じているだけでも問題ありません。または、問題を早期に発見する方法があります。

慣れていない場合は、インクリメンタル開発がどのように機能するかを調べることができます。成功する方法は通常、1つ以上のレベルで反復的であり、厳しいフィードバックを求めて、いくつかのスケルトンで成長します。

5
Balog Pal

計画を中止してコーディングを開始するためのアドバイスに耳を傾ける理由はいくつかあります。

  1. 開発者として18か月しか経っていないのに、大学のGPAに関係なく、それを計画できるほど十分に将来を予測できるとは思えません。これはあなたが何を知らないのかを知らないことがすべてであるので、明るくて経験の浅い開発者が把握するのが非常に難しいものです。古い手はあなたのビジョンのこの弱点を認識しているかもしれません、そして、賢明にあなたはそれに入って、あなたのベストを尽くすことを奨励しました。

  2. 若い開発者は、コーディングを始める前にデザインを完成させることに夢中になっているかもしれません。彼らはコードを書くことへの恐怖(パフォーマンス不安)をカバーしているかもしれません、または(ライターブロックのような)コーダーのブロックを持っているかもしれません。必要な作業出力がないので、設計は順調です。若い開発者はおそらく、彼らが何かを「恐れている」という提案に怒りをもって答えるでしょう。多分彼らはプロジェクトの終わりに彼らがそうであったことに気付くでしょう。心配せずにコーディングするというアドバイスは、コーダーのブロックの唯一の既知の治療法を構成します。古い手は賢明にこのアドバイスを提供するかもしれません。

  3. 厳しいスケジュールの制約がある場合、プロジェクトを完了する可能性は限られます。計画が長すぎます。計画がどれほど優れていても、すぐに実行することはできず、市場に出ることができません。最初からハッキングを始めましょう。多分あなたは幸運になり、初めて正しくなるでしょう。あなたは奇跡的に製品を届けます。または、あなたはそれほど幸運ではなく、半焼きのスラグを届けても、それが時間通りに市場に出て、何かを学ぶことができます。または多分失敗します。しかし、計画が長すぎるため、「多分失敗する」は「決して市場に出なかった」よりも良い確率です。重要な理解は、最初からチャンスが限られているため、ハッキングしても何も失うことはないということです。上司は成功の可能性がほとんどないことを知っている可能性があり、学習課題としてジュニアリソースを割り当てました。私たちは成功よりも失敗からよりよく学びます。 「プロジェクト全体はいつできますか?」

自分自身の欠点を見るためにかなり内省的でエゴのない開発者を必要とするので、残りの本を読む前にしばらく瞑想してください。自分自身の弱点を見落とす言い訳をしないでください...

すべての開発者が分析、計画、およびその他の検討が必要なタスクに特に優れているわけではありません。考えは困難で厄介です。それは一種の精神的な汗を必要とし、それはあなたを不快にさせ、一日の仕事の後に引き締められます。モンスターの2つの缶で流れ状態になり、岩が大きくなり、コーディング、コーディング、コーディングするほど楽しくはありません。考えたくない開発者は、計画は良い考えであるという考えに抵抗します。彼らは、事前の計画を必要としない開発方法論を推奨しています。彼らは、計画を強調しない会社やマネージャーが好きです。彼らは計画しないことのコストが高すぎない仕事に引き付けられます。彼らは一晩中コーディングセッションを評価し、バグのためにビジネス全体がダウンしている顧客にそのホットフィックスを提供します。 (そして、壊れたコードを顧客に提供することは大規模な犯罪であるべきだということを気にしないでください)。

特定の開発者は、何かがデモに十分に機能することを意味し、それを完全にすべての状況で機能させることは延期できることを理解し、最初は「仕事を終わらせる」ための賞賛を受け取っている間、別の開発者にプッシュすることさえできます。

すでにFacebookでブレイクするまで、トレンドを見極めることができないマネージャーがいます。これらのマネージャーは、ディスカウントタイヤストアを管理する仕事を見つけるのではなく、金曜日までに実行するコードが必要なことを問題にしています。 APIを設計したり、アルゴリズムがスケーラブルであるかどうかをテストしたりする必要があると彼らは聞きたくありません。これは、彼らにとって単なるテクノロジージャンボジャンボです。顧客がファイルを転送するのに役立つPerlスクリプトを作成していたときにソフトウェアについて理解していたすべてのことなので、彼らはあなたにコーディングを勧めます。 (彼らの最初の営業職には「ソフトウェアエンジニア」という称号がありました。ソフトウェアがそれほど退屈で難しいものになるとは誰が知っていましたか?)

3