コードが書かれていない数日間、設計上の問題を考えるのは普通ですか?[閉まっている]


52

ときどき空を見つめたり、アイデアをスケッチしたり、紙の上に擬似コードを書いたりします。それから私はそれをスクラッチしてやり直し、問題の正しい解決策があると思うとコードを書き始めます。

何日もコードを書かずに考えるのは普通ですか?これは、私が問題に近づいているという兆候ですか?IDEで具体的なコードを作成しないことに不安を感じます。


9
問題と個々の思考プロセスに大きく依存します。納期に間に合っていれば、どれだけの時間を考えてコーディングしたかは関係ありません。
ヤニス

4
ホワイトボードにコンポーネントを描画してみましたか?時々、設計のジレンマや複雑なアルゴリズムに直面したときに、描画を開始します。あなたが立ち往生している場合、多分あなたはあなたの心の中であまりにも多くを消化しようとしている。物事を小さくて消化しやすいコンポーネントに分解してから、これらの異なる部分がどのように相互作用するかを描きます。正式な標準は必要ありません。ホワイトボードにいるときは、Poor ManのUMLを実行します。
maple_shaft

2
すぐに悪いデザインを実装するのではなく、日のために設計アプト考える
チャニ

4
はい、そうです!そして時々、すでに書いたコードを見て、それを書く前にデザインについてもっと考えていたらよかったのにと思う:
ジョルジオ

2
皮肉なことに、コンピュータサイエンスは多くの場合コンピュータから独立しています
ライアンキナル

回答:


60

解決しようとしている問題によっては、設計段階に日ではなく、数年から数か月かかる場合があります(数年ではない場合)。

コードをすぐにバッシュアウトしないようにするには、経験が必要です。アーキテクチャと高レベルの設計について考えるには、もう長くはかからずに何日もかかるはずです-間違いなく、コードを書き始める前に起こるべきことです。


1
+1年。隣の部屋に、新しいシステムの要件収集に5年間関与していたチームがいたグループに関与していました。私たちは彼らがこれ以上前進するかどうかを真剣に疑っていました。
jwenting

8
@jwenting ...それも良くありません、それらの人は多分タイピングを始めたはずです。
グレイディプレーヤー

8
@jwenting、ええ、それはウォーターフォール法と呼ばれ、それらのすべてが解雇されるべきです。1年で何をしようとしているのかわからない場合は、テクノロジー自体が陳腐化する前に市場に投入することはできません。
リウォーク

1
私は彼らがコードを大量生産し始めたらどうなるだろうか、彼らはすべて技術的な知識のないビジネスアナリストでした:)
jwenting

24

これは一般的に「分析麻痺」と呼ばれます

それは一般的ですが間違っています。ある時点で、さまざまなアイデアをテストして、何が最適かを確認し、徐々に改善する必要があります。

実用的なプログラマー、特に第2章「Tracer Bullets」のセクションを読むことをお勧めします


12
システムの設計に時間を費やすことは必然的に間違っていると考えるのは間違っています。些細なことですが、数日または数十万行のコードにまたがる大規模なシステムでは、紙で基本的なアーキテクチャを取得するのにも時間がかかりすぎます。
ジュウェンティング

3
思考に費やされた時間は、問題の複雑さに直接関係しています。しかし、もし彼が「私のIDEで具体的なコードを書かないことに神経質なら」、彼が始める必要があると仮定するのは安全だと思う。
モロン

7
私は
決して

4
@Morons:あなたが言うことは重要ではなく、重要なことは人々が聞くことであり、人々はあなたがOPがしていることは間違っていると言うことを聞いた。
whatsisname

5
「分析麻痺」という用語は、決定の分析に過剰な時間が費やされていることを意味します。それは確かに本当の問題ですが、現在の状況に当てはまる場合、元の投稿からはまったく明確ではありません。文字列を反転する関数の書き方を考えるのに数日を費やしているのなら、それは分析麻痺です。開始する前に新しいc ++コンパイラの作成方法を数日間検討している場合、それはあなたができることの少なくとも1つです。
PeterAllenWebb

10

これは完全に一般的です。ただし、「最初にテスト」またはTDDアプローチを採用する場合、あまり一般的ではなく、アイデアをより適切に策定するのに役立つ場合があります。


5

習慣は通常、物事に対する試行錯誤のアプローチの結果であり、望ましい結果をもたらすものを継続し、そうでないものを回避します。私たちが好きなことをして、嫌いなことを避けることも同様に作用します。最終的には、家賃を払うために嫌いなことをするからです。

何にあなたを導くのか、そしてあなたの理由に依存します。以下にいくつかを示します。

  • 多くの場合、設計変更のためにコードを変更する必要がありました
  • 貧弱なソリューションは既にコーディングされているため、貧弱なデザインを変更することはありません。
  • コードを作成するよりも、描画して設計する方がいい
  • 構文とコーディングの詳細を心配する必要があるため、より良い設計について考えることからあなたをそらします。

うまくいけば、より長く設計すればコードが改善されることを発見できました。振り返って、デザインにどれだけの時間を費やしても問題ないことがわかる場合は、変更することができます。もう1つの考慮事項は、コードを記述した後に問題を発見する頻度と、設計での作業を比較することです。何らかのコードを作成するまで問題を見つけられない場合は、バランスを考慮して、後ではなく早めに何かをコーディングする必要があります。このアプローチは、より新しい技術や非常に複雑な機能の使用に適用できるかもしれません。

あるアプローチが他のアプローチより優れていることを発見したとしても、あるアプローチに固執する規律があるかどうかはわかりません。ホワイトボードに行く必要があると感じることがあります。他のキーボード。


4

それは非常に一般的であり、物事を処理し理解するためのより良い方法だと感じています。プロジェクトに取り組んでいる間、私は何度も立ち往生しますが、どうすればより良いアプローチができるかを理解するのに1、2日かかります。問題が解決した後でも、1日が経過するのを待ちます。これにより、私はより爽快になり始めます。

それは自然な現象であり、開発者が心の時間とその間の時間を傍受するのは良いことです。


4

私がプロジェクト管理のコースを受講したとき、インストラクターが計画について私たちに関連していたことの1つは、頭に残っていましたが、軍隊で教えていた経験則は、計画の1/3 。したがって、今から3か月後に完了する必要がある操作がある場合、実行を開始する前に計画に1か月を費やすことを考慮してください。


4

私の見解では、3つのアプローチがあり、それぞれ特定のコーディング状況に適しています

  1. 以前に同様の問題を見たことがあるので、適用するパターンについてかなり良い考えがあり、ソリューションがどのように振る舞い応答するべきかが明確になっています。

    => BDD / TDDを使用し、目的のソリューションから始めてコードを作成します。(まあ、時々私はチートしてコードを少し書いてからテストを書く-一種のネストされた2-> 1.アプローチ)。

  2. 適用するパターンについては良いアイデアを持っていますが、ソリューションがどのように見えるかはわかりません。

    =>どんな種類の興味深いものが飛び出すかを見るためのプロトタイプ。どの興味深いものが望まれているのかを理解したら、1に進みます。

  3. どのパターンを適用すべきかわかりません。

    =>問題と、問題にアプローチするさまざまな方法がコードにどのように影響するかを考えてください。その演習の結果に応じて、2)または1)に移動します。

言い換えれば、答えはエンジニアのお気に入りです。


3

基準を満たしていない設計に基づいて簡単なプロトタイプを作成するよりも、考えて設計するのに1か月を費やす方が良いでしょう。特にあなたがチームにいる場合; コードに応じて他の人が開始すると、別のAPIを使用してより良い設計を実装することははるかに困難になります。


2

原則として、問題/解決策を考えるのに時間をかけることは良い考えであるという他の答えに同意します。ただし、立ち往生しているように感じる場合は、計画プロセスをより一貫性のあるものにする方法についていくつかの推奨事項があります。

  • 設計成果物を作成します。では、コードを記述しないとどうなりますか?たぶんあなたは自分の考えの日記を書き留めるだけかもしれません。または、一般的なソリューションのスケッチ。または、時間の経過とともに改善される問題の非常に優れた要約ですらあります。アイデアを検討し、それらを受け入れ/拒否するときは、そのテーマに関する推論のログを保管してください。このようにして、一日の終わりに、あなたはまだあなたの労働の証拠として現実世界の成果物を指すことができます。

  • 人に話します!アイデアを話し合うために生きて呼吸する人間がいるのに勝るものはありません。立ち往生していると思われる場合は、誰かと話し合ってください。誰かをつかむ-誰も!-そして問題を彼らに説明してください。問題の解決方法に関する考えをスケッチします。せせらぎをしながら10分間息を吸って吐き出し、瞬きするだけでも、問題を説明する過程で新しい洞察を発見できる可能性があります。


1

サッチェル・ペイジが言ったように、「時々座って考え、時々座っているだけです。」

彼が得ていたのは、あなたの問題を別の方法で考えるようになるかもしれないので、あなたの心をクリアすることが時々良いことだと思います。そのため、コードを無視していなければ、他の方法では回避できたかもしれない解決策やアイデアを思いつくかもしれません。ですから、はい、それは正常であり、コーディングに飛び付かないことをお勧めします。

このプロセスを自分で行うには2つの方法があります。テキストファイルとプロジェクトに関連する図面があるフォルダーを作成します。そこでアイデアを書き留め、考えられるすべてのプロセスをできる限り保存します。また、アルゴリズムからCSSレイアウトまでの簡単なアイデアをすばやくテストできるスクラッチパッドプロジェクトを作成します。


1

プログラム=アルゴリズム+データ構造

私見、設計(問題解決)プロセスは完全にルールです。実装(技術的な問題)の詳細は自然に続き、解決します。


私はその単純化された方程式が本当に好きです。+1
キム・ジョンウ

1

これが私の考えです。

  1. 最初から始める最初に、あなたが望むものの大まかなアイデアが必要です。いくつかの要件のリストを取得するか、作成してください。ここで問題を解決するには少し時間がかかります。少なくとも自分が望む自信のあるピースを手に入れたら、そのピースのインターフェイスの大部分を知ってから、コーディングを開始します。

  2. 既存のコードに関する問題の修正まず、問題を追跡します。これには、実際のコードを作成しない時間が必要になる場合があります(一部のデバッグコードが作成される場合がありますが、通常は保持されません)。問題が見つかったら、複雑さに応じて、コードを書き始めて問題を修正します。バグがわかったら、ほとんど考える必要はありません。問題が主要な設計上の欠陥であることが判明した場合、次のセクションを参照してください。

  3. 設計変更/主要な機能これは、ほとんどの場合、最も考慮が必要なものです。構造を保存すること、後方互換性などを考慮する必要があります。最善の変更を検討することで時間を大幅に節約できますが、通常、私にとっては数日以内です。

  4. シンプルな機能の追加大幅な設計変更が必要ない場合は、試行錯誤を行って機能にコードを追加します。これは一般に膨大な時間を必要としません。


0

私はこれに関するコンセンサスに同意しません。私のシステムをどのように機能させたいかについて、ナプキンに書かれた漠然としたアイディアさえ得たら、すぐに何かのプロトタイプを作り始めたいと思います。物事を非常に正確な方法で指定しない限り、問題を引き起こす可能性のある細かい部分をすべて考えることはほとんど不可能です。私がデザインについて人々と話し合っているだけなら、もっと複雑な問題のいくつかを手で振り回すのは簡単すぎます。このように指定すると、他の表現方法ではなく、ソースコードに直接含まれる可能性があります。他の表現方法は、正確で形式的ですが、コンパイルおよび実行できません。


3
詳細を理解することと基本を理解することには違いがあります。たとえば、言語を設計する場合、キーボードの近くに行く前に、言語が手続き型か機能型かを決定する必要があります。計画時に詳細を把握する必要があると言う人はいませんが、どこに行くのかを知る必要があります。
リウォーク

@ Stargazer712:私は完全に同意します。だから、少なくともナプキンのアイデアが必要だと言ったのです。しかし、この質問の方法では、最もリスクの高い/新しい/興味深い機能のプロトタイプを打ち出す前に、数日または数週間の正式な官僚的な会議を描いていました。
dsimcha

0

それは、「通常」の意味に依存します。私自身について言えば、コードは素晴らしい学習ツールだと思います。そのため、複雑な問題に直面したときは、紙の上でスケッチを行いますが、テスト駆動型コーディングも行います。コードは、ホワイトボードでは言い表せない、またはその逆であると考えていることを教えてくれます。その結果、洞察力が得られるか、ドメインの専門家にさらに質問をする必要があるかもしれません。

したがって、本当のアドバイスは、「問題定義に近づくために必要なすべての学習ツールを使用する」だけでなく、「これらは学習ツールであることを忘れないで、それらに恋をしないこと」です。


0

RADとアジャイルプログラミングのこの時代では、システムの主要部分を特定できるようになったらすぐに開発を開始する必要があります。詳細が明らかになります。ソフトウェアが大きくなっているので、すべての詳細に時期尚早に集中しても、どこにも行けません。


2
そして、十分な詳細に焦点を合わせないと、どこよりもはるかに優れた場所はどこにもならないかもしれません。
ダンク

@Dunk私は3つの単語を使用しました。すぐにキーボードを叩くとは言わなかった、ドリフトマンをゲット。
Syed Aqeel Ashiq
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.