コーディング前の概念と設計:これはいくらですか?[閉まっている]


14

私は学校で学び、適切なコーディングを行う前に、優れた開発方法論には構想と設計が必要であることを他のどこでも読みました。

それは初心者プログラマにとっても新しい情報ではありません。しかし、いくつかのプログラミング言語で開発を始めて以来、最初からすべてを設計して構想することができなかったため、これは良いアドバイスかと思います。

つまり、私は常にデザイン、構想、プログラミングを溶かしました。私は世界で最悪の開発者ですか、それとも私たちが学校で学ぶアイデアはただの古い無意味な宗教教義ですか?

これまでに経験したこともプログラミングしたこともないものを、どのように考えて設計することができますか?それはばかげていませんか?プログラミングは、代わりに構想と設計をリードしませんか?



@gnatあなたがここに与えたリンクは私の質問の一つの側面に対する答えかもしれません。これは重複した質問だとは思わない。


13
敵との接触を生き延びた計画はありませんが、だからといって敵がいるべきではありません。計画から始めますが、後で修正することを恐れないでください
リチャードティングル

2
問題を本当に完全に理解できるのは、問題を解決した後だけです。したがって、問題を理解すると、問題をより良く解決できるということだけが理にかなっています。しかし、実際に問題を理解するには、発見の練習をする必要があります。
マットクリンカー

回答:


5

答えは次のとおりだと思います:できる限り計画を立てましょう。

計画の美徳に反対する人はほとんどいませんが、議論の大部分は重要な側面を見落としています。計画は、優れた計画を立てるスキルを持っている場合にのみ機能し、そのスキルは経験を積む傾向があります。経験があまりない場合、作成した計画にかなりの量の問題がある可能性があります。つまり、完全な災害ではない製品を作成するには、開発中に計画を大幅に修正する必要があります。計画が詳細である場合、これにより詳細の多くが無効になるか、さらに悪いことに、計画に従うことができるように調整を最小限に抑えようとします。

確かに計画が必要なものもあります。必要なレベルの計画を立てるスキルがない場合、私が想像できる唯一の方法は、適切な計画を立てるために必要なタスクの経験を得るためにコードを書くことです。

量産コードを作成する準備ができているかどうかに関係なく、計画の最大レベルに到達すると、コーディング以外の作業は残りません。たぶんそれは災害になるでしょうが、それらは良い学習経験であり、あなたは修正された計画を立てるためのはるかに良い準備をするでしょう。


30

それは絶対に真実です。要件が大きく複雑になるほど、これは真実になります。

小さなコンソールアプリでフィボナッチ数列を計算するには、アルゴリズムとUIの構造化方法について考えるのに数分以上かかる必要はないかもしれません(はい、単純に標準入力と標準出力です)。

しかし、1秒間に数百万件のトランザクションを実行し、グローバルに分散し、99.9999の稼働時間と100%の正確性を必要とするリアルタイムトレーディングプラットフォームはどうでしょうか。あなたはそれをコーディングに飛び込みますか?

これらの両極端の間に他の多くのオプションがあります。

プロジェクトEulerを見てください。提示された順序でいくつかの問題を解決します。問題のいくつかを妥当な時間で解決するためには、コードにジャンプする前に実際に考える必要があることがわかります。

コーディングを開始する前にプログラムを考えて設計するために時間をかける必要がない場合は、些細なことに取り組んでいるか、何か大きなものを見逃しています。


私は最初からすべてをデザインし、想像することに成功しませんでした

最も些細な問題以外に何もしません。繰り返しますが、プロジェクトが大きく複雑になるほど、これは真実になります-設計には間違い、見落とされるものなどがあります...

芸術は、最初に高レベルで設計することにあり、大きなピースが適合するかどうかを確認します。次に、優先順位のリストを取得します-最も重要な/インフラストラクチャで最初に作業を開始します。次に、大きな部分を小さなものに分解し、各大きな部分が意味のある部分で構成されていることを確認します。

これには時間と労力がかかります-最初は完全ではないか、完全に正しいとは限りません。

それが呼ばれる理由しかし、これはソフト -wareないハード -ware。順応性があり、変更できます。


4
素晴らしい答え。ソフトウェア順応性があります(実際、これは驚くべきユニークなものの1つです)、修正は無料ではありません。ソフトウェアシステムが密結合され、インコヒーレントになればなるほど、それを修正することはより困難で高価になります。結論として、ソフトウェアの柔軟性を利用したい場合ソフトウェア設計に含まれるのは、将来変更する能力でなければならないということです。
voithos

9

私は学校で学び、適切なコーディングを行う前に、優れた開発方法論には構想と設計が必要であることを他のどこでも読みました。

これは本当です。

しかし、いくつかのプログラミング言語で開発を始め以来、最初からすべてを設計して構想することができなかったため、これは良いアドバイスかと思います。

そして、あなたの問題があります。

ほとんどの些細でない問題については、物事がどのように機能するか、物事がどのように適合するかを把握するためにいくつかの考えをする必要があります。逆説的に、ほとんどの自明でない問題については、すべてを計画する方法はありません。不明な点が多すぎて、開発中に発生する変更が多すぎます。アジャイルは、取引のこの後半を受け入れるため、その勢いを獲得しました。人々は全知ではなく、変化は一定です。

そのため、事前に設計を行う必要があることは確かですが、事前に設計することだけが不可能であることも事実です。


5

コーディングする前に、何らかの設計が必要です。

その理由は非常に単純です-デザインがない場合、何を作成しているのかわかりません

設計が最終的なものになる前に、必ずいくつかのコードが必要です。

その理由は非常に簡単です。設計が変更され、設計の一部を開発することで、ソリューションの作業を開始しないと予想しにくい質問、機会、課題が明らかになります。

開発は反復的です。

計画の有無にかかわらず、チームがそれを実現するかどうかにかかわらず、すべてのソフトウェアプロジェクトは反復的に行われます-作業の一部が完了してから評価され、評価によって残りの作業の実行方法が変わります。

複数のアプローチを試してください。

事前の設計とコードの作成のバランスをとる最良の方法を知るには、実践と経験が必要です。ほとんど誰も習得していないスキルであり、各プロジェクトには異なる理想があります(主要なビデオゲームのような大規模なシングルリリース製品を作成するチームと、自分で使用する小さなツールの設計を検討してください)。


1

私は過去に複数のシステムを設計し、他の人を設計しましたが、プロセスがさまざまな方法で展開するのを見てきましたが、一般的なことは、初期アーキテクチャは少なくともほとんどの主要な機能の存在を計画する必要があるということです。

たとえば、建物、床、部屋などがそれらで改造されるという概念のないHVAC制御システムを見たことがありますが、結果はそれらと同じくらいいものでした。または、(スマートでない)懐中時計に適したコンポーネントから構築されたモバイル音楽デバイス。言うまでもなく、いずれの場合も最終製品は顧客のお気に入りではありませんでした。

「概念」と言うと、「アイデア」から一歩進んだだけで、概念は非常に曖昧になります。ビジネスは通常、概念を重視します。ユーザーは通常、UXを気にします。これは、使いやすく快適な方法で実現された概念であり、その使用を通じて何らかの価値をもたらします。

プログラミングの前に「コンセプト」を実行する必要があります。ビジュアルスタジオ(または選択したIDE)を開いて、ランダムにコードを記述し、どこに行くかを想像することはできません。

コーディングする前に完全な設計を行うことはできません(そうすべきではありません)が、ユーザーのワークフローがどうなるかについての大まかなスケッチが必要です。

UXの設計とコーディングはお互いにやり取りすることが非常に多いため、この事実を作業のアプローチ方法に組み込む方法として、ごく小規模なプロジェクト以外にはアジャイルアプローチを使用せざるを得ないでしょう。一度にすべてを見ることができなければ、あなたが最悪のプログラマーだとは思わないでください-誰もできない、そして彼らができると思う人々は、彼らが完全だと主張できるように、十分な問題を無視するだけです画像。


大きなものにサイズを設定する1つの例。コンセプト:「企業がソフトウェアプラットフォームを統合できるようにする視覚的なクラウドベースのツールを作成する」。これは素晴らしく聞こえ、マーケティング資料の作成を開始し、販売資料が存在する前に販売することができます。コーディングする前にこれが必要です。

事前設計:「Visioのような形状と矢印を使用してロジックを記述します。さまざまなプラットフォーム(SAP、SF、データベースなど)への接続を可能にするプラグイン機能を備えています。システム。データを視覚的に記述し、1つの形式を別の形式に変換する方法がある」。別の素晴らしいマーケティングブロブ。また、何が重要なのかについてのアイデアも提供します。コーディングする前に、このような大まかなスケッチを用意する必要があります。

設計/コード:「ブラウザにホストされたHTMLデザイナーなどの機能を備えています。既存のサーバー上で実行できるようにJavaでバックエンドをコーディングします。レポート、監査ログ、計画バージョン管理、計画アクセス制御、....」-リストが細かいほど、すべてを予測するのは非現実的です。

...しかし、少なくとも物事大雑把に見えるかもしれないか、最終製品が本当に役に立たない実装になってしまい、そうでなければ素晴らしいサウンドのコンセプトを殺してしまうことに注意する必要があります。実際のワークフローを表示する画面、またはログなどの20のフィールドのいずれかに限定された正確な文字列の一致以外のログを検索する方法はありません。実装を実行する以外、これを防ぐ良い方法はありません-成功するものもあれば、失敗するものもあります。


0

私は常に次のように時間を割り当てます:

  1. 1/3デザイン
  2. 1/3開発
  3. 1/3テスト

デザイン:視覚的だけでなく、概念的。視覚的にも論理的にも、それを部分に分割します。再利用され、それ自体がデザインパターンである共通点を探します。

開発:部品がわかったら、それらをコーディングします。次に、それらを統合します。

テスト:コードが適切に統合および記述されたことをテストするだけでなく、常に洞察が得られ、教訓が得られ、対話する新しい方法が作成され、新しい機能が考案され、望まれます。スコープクリープに注意してください。

これらの側面に加えて、プロジェクトにはこれらのフェーズの上に3つのフェーズがあることに注意してください。

  1. 設計不足の最初の試み
  2. 1回目の試行から学んだ教訓から、2回目の試行が過剰に行われました。
  3. 適切に設計された3回目の試行。

設計段階をうまく行えば、追加の試行が最小限に抑えられることがわかりました。全体をやり直す代わりに、サブシステムを作り直します。

私はソフトウェア開発者であり、社内、外部委託およびオフショア開発プロジェクトのソフトウェア開発マネージャーです。


-1

ここには根本的な誤った仮定があります。最初にコードを記述することなく、優れたデザインを思いつくことはできません(学校はこれを決して教えません)。それでも、設計なしでは良いコードを手に入れられないというのは正しいことです。

解決策は次のとおりです。

  1. 問題を解決できると思われるコードをいくつか書いてください。
  2. コードから学んだことに基づいて設計を考え出します。
  3. 捨てるすべてのコードを、設計に応じて、最初からそれを書き換えます。
  4. 必要に応じて繰り返します。

すべてのコードを破棄することは、このプロセスのオプションのステップではありませんが、小規模なプロジェクトの場合、設計を正式に作成することがあります。大規模なプロジェクトでは、「すべてのコードを捨てる」ステップを繰り返す可能性が高くなります-ただし、十分なモジュール性がある場合、これはコードベースの一部にのみ適用される可能性があります。

あまりにも多くのプロジェクトがレガシーコードを保持しているのは、それらが変更を望まないため、または廃棄するように設計されていないために複雑すぎるためです。あなたの最初の試みが失敗になるという事実を認めることはあなたの人生をより良くします。


1
古いコードを捨てない多くの正当な理由があります。最後の段落に戻るための参考資料を提供してください。
マッツン

+1。これがなぜ投票されたのかわからない。「それを捨てるために構築する」は、フレッドブルックスの古典的なアドバイスです。
ニキエ

この場合、古いコードはプロトタイプからのものであり、プロトタイプが十分に良いと見なされ、実稼働に投入される危険性があると思います。文字通りではなく、現在のプロジェクトに関しては捨ててください。
ジェフ

-3

コンセプトは、常に変更可能なキー設計であり、プログラミングは完全に考案されたアプリの要件を満たす必要があります。

1番目のポイント、2番目のアクセス方法、3番目のユーザー、4番目のすべてのSOWスコープを特定の用語で定義し、このアプリケーションのすべてを定義します。そして、追加する各機能の動作方法。

Webアプリのアーキテクチャに関して選択を行う前に、完全に計画し、十分に検討してください。

次に、最適なスタックを選択します

私はLAMP開発者です

だから、私はどのPHPフレームワークを使用するのか質問を絞り込む傾向があります。フロントエンドスクリプトは、理想的な方法で行うために必要なすべてのことを行うようにする必要があります

これを追加するには、MVCフレームワークの使用方法を学習します。ZENDとCAKEPHPは最高の迅速な開発フレームワーク(PHP)です


7
最高のスタックを選んでください...私はLAMP開発者です」-誰かの編み物に固執することは完全に大丈夫ですが、その声明はわずかな矛盾のように聞こえますか?
JensG
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.