初期段階でのプロトタイピングとクリーンコード


43

私は毎日の仕事になってしまう可能性のあるいくつかの個人的なプロジェクトに取り組みます。それは私に考えさせられました。

  • ただプロトタイプ-簡単に拡張できるように最適化とリファクタリングに膨大な時間を費やす可能性のある、動作する基本的なコードを書くだけです。

  • クリーンで最適化され、文書化されたコードを最初から記述します。しばらくしてから費用対効果が低下すると、削除されます。

更新: YAGNIとsunpechおよびM.Sameerの回答を組み合わせることは、私にとって完全に理にかなっています:)皆さん、助けてくれてありがとう。


1
また、以下を参照してください場合はリファクタリングする
ブヨ

回答:


39

3番目のオプションがあります。テスト駆動開発を介してクリーンコードを記述し、YAGNIが今日必要としている要件を実装します。

現時点では必要ではないが、将来的には可能性のあるコードを作成する誘惑は、いくつかの不利な点に苦しみます... あなたはそれを必要としないでしょう

  • 費やされる時間は、必要な機能の追加、テスト、または改善に費やされます。
  • 新機能は、デバッグ、文書化、およびサポートする必要があります。
  • 新しい機能は将来何ができるかに制約を課すため、不要な機能により、必要な機能を後で実装できなくなる可能性があります。
  • 機能が実際に必要になるまで、何をすべきかを完全に定義してテストすることは困難です。新しい機能が適切に定義およびテストされていない場合、最終的に必要になったとしても、正しく機能しない可能性があります。
  • コードの膨張につながります。ソフトウェアがより大きく複雑になります。仕様とある種のリビジョン管理がない限り、この機能はそれを利用できるプログラマーには知られていません。
  • 新しい機能を追加すると、他の新しい機能が提案される場合があります。これらの新機能も実装されている場合、クリープ機能に雪だるま効果が生じる可能性があります。

その結果、プロトタイプを作成するだけでなく、クリーンで最適化され、文書化されたコードを最初から作成する必要もあります。

現在必要なコードを記述して、今日と明日のニーズに最適に対応できるようにします。


4
私は本格的なTDDのファンではありませんが、TDDに従うとクリーンで十分に文書化されたコードを書くことを強制されるため、これは常に良いアドバイスです。
ウェインモリナ

1
彼が意味したのは、うまくいかなければプロジェクト全体を落とすことだったと思います。それが本当なら、この答えは「きれいなコードを書く」と変わらないようです。
ジェレミー

@ジェレミー、あなたは私の答えに基づいていると思います。しかし、この答えは同じではありません。それは他の人が経験に基づいている厳格なプログラミング方法に基づいています、彼らはいくつかのケースで似ていることを確認しますが、それは同じではありません:)少なくとも私がそれを見る点から:)
JackLeo

1
@JackLeoポイントは、ある程度の経験に達すると、「一生懸命取り組んだコード」と「書いたばかりのコード」の違いがなくなることだと思います。
Ant P

@AntP確かに。6年後、この質問に反省するのは興味深いです:)
JackLeo

16

いつものように...

場合によります

リスクを軽減するため、または未知のものを公開するためにプロトタイプを作成している場合は、それをコーディングし、完了したら破棄することを期待してください

反復的な改良のプロトタイプを作成している場合は、コーディングして、頻繁に変更およびリファクタリングを行うことを期待してください

あなたが実際の製品を書き始めているが、あなたが怠け者なれるようにそれをプロトタイピングと呼んでいるなら、怠け者ではなく、最初にそれをうまく書きなさい


2
+1すばらしい投稿!その機能を開発した後は役に立たないように見えるかもしれませんが、プロトタイプを決して捨てないでください。私は常にヒントを得るためにそれらを参照するため、私は作業するすべてのプロトタイプを常にソース管理しています。
maple_shaft

1
@maple_shaft:はい、「捨てる」は比 "的に、「必ずしもそれをリファクタリングしようとしないで、書き直すことを計画してください」
スティーブンA.ロウ

2
怠け者だと言って、最初はよく書くので、後で戻って再訪する必要はありません。
Blrfl

3番目の文が私の一日を作りました。
クリストファーフランシスコ

10

プロトタイプを作成している場合、なぜきれいなコードを考えているのですか?プロトタイピングのまさにアイデアは、コンセプトやアイデアを証明し、その後捨てられることを意図しているということです。

ここでほとんどすべての人と意見を異にするつもりです。もしあなたがすでにきれいなコードを書くか、プロトタイピングのために何かを素早く行うかの選択を考えているなら、後者を選んでください。特に初期段階の開発について話しているとき。私は決してきれいなコードを書いてはいけないと言っているのではなく、アイデアを出し、それが進むべき方向だと思って、それを元に戻して、リファクタリングすることを言っています。

ソフトウェア開発者として、私たちは物事を最初から正しく行い、きれいにすることに夢中になります。それは、私たちが提供しているコードではなく、問題の解決策であることに気付かないからです

私は論文を書くのと同じようにコーディングを考えます:

論文を書くとき、私たちはどこかから始めて、アイデアやアウトラインなどをスケッチします。それは、すべての詳細を含んでいないか、最終的な外観を持っているわけではありません。多くの部分が書き直され、置き換えられ、さらに/または削除されて、より洗練された完成した紙になります。(明らかに、このアナロジーは、コードが紙のように本当に完成した、または最終的なものであると言うほどには行きません。)


+1非常に良い答え:)それは初期の頃に私にたくさん起こったので、大きなプロジェクトにジャンプすると同じことを引き起こす可能性があります...それは私が恐れていることです。
ジャックレオ

「ソフトウェア開発者として、私たちは最初から正しく物事を行い、きれいにすることに夢中になります。そのため、提供しているコードではなく、問題の解決策であることに気づきません。」私は言いたいのですが、「正しいことをする時間はありませんが、やり直す時間は常にあります」。
クリストファーフランシスコ

6

プロトタイピングには2つのタイプがあります。

  • 最終製品になるための機能強化と修正を経て進化し続ける進化的なプロトタイプ
  • プロジェクトの初期段階で要件収集と顧客フィードバックをより効果的にするためにのみ存在する使い捨てプロトタイプ。その後、完全にドロップされ、最終製品の開発はゼロから始まります。

ケイパーズジョーンズによると、進化的なプロトタイプは安定性に到達するまでにより多くの労力と長い時間を必要とする低品質の最終製品を生産します。

したがって、お客様がプロトタイプを考えて、顧客が何かをできるだけ早く確認して、要件についてより良いアイデアと詳細を得ることができるように考えている場合は、使い捨てのプロトタイプを作成し、後でクリーンなコードで開発を行うことをお勧めします。余裕がない場合は、最初からクリーンなコードを作成して慎重に保守しますが、他の人が示唆しているように、必要以上に最適化しすぎたり、物を追加したりしないでください。


非常に良い点は、さまざまなタイプのプロトタイピングを表示することです。私はそれについて考えていませんでした:)ここで私のための食べ物:)
JackLeo

ポイントに同意してください!
リチャードトプチー

使い捨ての試作品の大きなリスクは、管理者が、試作品と比較して生産バージョンがこれほど長くかかり、試作品の作業を「無駄にする」理由を理解するのが困難になることです。もちろん、それがあなた自身のスタートアップかもしれない場合、そのような管理はありませんので、それはそれをはるかに簡単にします。
ジャン・ヒューデック

5

何らかの理由で汚いコーディングを言い訳するのは嫌です。私の経験では、プロトタイピングの言い訳として迅速で汚いことを主張する人々は、プロダクションを含むあらゆるコードに対してその態度を持っています。誰かが乱雑なプロトタイプを作成する場合、彼は任意のコードで混乱を作成します。プロトタイピングはダーティコーディングを意味するのではなく、最も重要なユースケースをテストするための単純化された仮定を意味します。コードは正式にテストされていない場合や、すべての詳細に注意を払っていない場合がありますが、適切に設計され、適切に実装される必要があります。クリーンさは能力の兆候であり、有能なプログラマーは、その目的が何であれ、乱雑なコードに対する自然な嫌悪感を感じます。


言及し忘れたことが1つあります。私はそれを何度も何度も見て、「プロトタイピング」のために手早く汚い文章を書いており、本番の目的のために苦痛で&いものになりました。一度それが完了して動作すると、人々はそれに包帯を追加し続け、混乱を積み重ねます。
遺伝子ブシュエフ

あなたは良い点を得た-「それが動作する場合、なぜ再書き込み?」多くの若い企業にとって問題です。大企業が10年前のCMSを使用して今日の標準にアップグレードするのは苦痛であるため、私の現在の仕事の状況でもそれを理解しています。ここでミスをしたいです。あなたの答えは主に私がずさんなコードを書くための言い訳を探しているということです。いいえ、sunpechとM.Sameerが私の言い分を得ました。プロトタイプは、世界がそれに対してどのように反応するかを確認するために何かを作ることです。それが機能する場合-それを良くします。
ジャックレオ

1

クリーンで最適化され、文書化されたコードを最初から記述します。私は自分でそれを行うことができず、それは本当の問題です。私はコーダーではありませんが、管理職の顧客に直面しているソフトウェア開発会社でかなりの量の仕事をしてきました。彼らは私に多くの良いアイデアを与えてくれるので、時々何かのプロトタイプを作成します。ほぼ毎回、そのプロトタイプは開発者に引き渡され、開発者はそれを「クリーンアップ」して出荷製品に変えました。私がソースをチェックアウトするとき、それは私の安っぽいコードの80-90%のままです。


0

私の同僚は、各プロトタイプを捨てて最初から書き直すのに十分な規律を持たなければならないという警告で、繰り返されたプロトタイピングを熱心に支持しています-それだけでなく、最後のラウンドで決定された実装の詳細に影響されないことを確認してください、最終的にやることは、同じプロトタイプを些細なスタイルで数回書くことです。彼は、あなたが本当に捨てることができない素晴らしいコードに接続しているなら、それを印刷し、ソース管理リポジトリを削除し、印刷物を自分自身に投稿すべきだと半信心強く提案しました。次の反復に侵入できないほど長い。


この投稿は読みにくい(テキストの壁)。ですが、あなたは気編集をより良い形にそれをINGの?
gnat

問題が何であると思うか提案できますか?文章が長すぎるのかもしれません。たった2つしかないことに気付いたからです。他に何か?
トムW

-1

いつでも(まったく)動作させることから始めて、それを修正してクリーンにすることができ、それが経済的に意味がある場合は高速/小型にすることができます。私はあなたが捨てるいくつかの実験から始め、次に何が機能するかを把握したらTDDを元に戻します。


-1

両方とも良いです。両方とも好きです。それらは互いに矛盾しません。

プロトタイプが好きです。プロトタイピングは私の創造力を磨いています。私は多くの可能な解決策をテストしています。すばやく実行すると、問題を解決するための多くの可能な方法をテストする可能性が与えられます。

きれいで、テスト済みのコードを書くのが好きです。それは私のコアスキルを開発します。私は通常、プロトタイプの1つを選択し、それを改善するか、ゼロから書き直します。

しかし、プロダクションコードのプロトタイプを決して間違えないでください。プロトタイプを実稼働に移行しないでください。常にプロトタイプとしてマークする必要があります。せいぜい自分のブランチですべてのプロトタイピングを行ってください。


-2

私は極端はほとんど常に悪いと言う傾向があります。

私は、クリーンで、十分に文書化されたプロトタイプとプロトタイピングのバランスを保つことをお勧めします。ライブラリまたはプラットフォーム用に開発する場合、私は経験がありませんが、プロトタイピングの方向に進みます。これは、最初と、コルセットに入れられるAndroidやコンテナなどのプラットフォームでは特に当てはまります。つまり、それらのインターフェイスを実装し、それらがあなたを呼び出します。

私自身の経験から、ほとんどのコードはそれほど長くは生きていません。そうは言っても、機能を実装することで高速化できます。遅かれ早かれ(ほとんどの場合、遅かれ早かれ)、特に複雑な作業を行う次の機能のために、既存のコードをリワーク/リファクタリングする必要があります。手間のかからないリファクタリングを可能にするために、適切な自動テストがあることに注意してください。Androidのような上記のプラットフォームに関係する:多くの場合、緊密な結合とテスト容易性のための設計がないため、自動テストはそれほど簡単ではありません。その後、統合ベースなど、テストベースをより高いレベルに引き上げることができます。

開始についてのヒントを提供するかもしれない記事を書きました:https : //medium.com/@ewaldbenes/start-lean-why-its-best-to-split-your-next-coding-project-by-feature-70019290036d

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