分析麻痺に対処するにはどうすればよいですか?


61

非常に頻繁に、最良の設計決定を選択するときに立ち往生しています。関数定義、制御フロー、変数名などの小さな詳細であっても、選択の利点とトレードオフを熟考するのに異常に長い時間を費やします。

これらの重要でない詳細に時間を費やすことで、多くの効率を失っているように感じます。私の現在のデザインがうまくいかない場合、これらのことを変更できることを心の奥で知っていますが、1つの選択肢をしっかりと決定するのに苦労しています。

この問題に対処するにはどうすればよいですか?



ホワイトボードで同僚と話し合う。これは頻繁に問題を明確にするのに役立ち、同意できる場合は、良い選択になる可能性が

回答:


35

2つの簡単なルール:

  1. おそらく動作する可能性のある最も簡単なことを行います。
  2. 継続的にリファクタリングします。

これらの各作業を開始すると、後で変化に対応する能力を損なうことなく、今すぐ簡単な決定を下せるという自信が得られます。

将来の校正とは、コードの変更が必要になる可能性のあるあらゆる方法を予測しようとするのではなく、コードを簡単に変更できるようにすることです。


4
継続的なリファクタリングは、テストのカバレッジが良好な場合にのみ合理的です。だから私は「単体テストを書いてください。それからテストをパスするために最も簡単なことをしてください。リファクタリングしてください。」と言います。
ケビンクライン

間違いなく同意します。「赤、緑、リファクタリング」がその方法です。
ラインヘンリヒス

5
XPハンドブックからはちょっとした情報がありますが、文脈から外れたときの素晴らしいアドバイスではありません。
アーロンノート

2
コンテキスト外では、文字通りカウボーイコーディングと同等です。FowlerのIs Design Dead?をご覧くださいXPおよび類似の方法論からのチェリーピッキングの原則に対して警告します。たぶんあなたは優秀なデザイナーであり、リファクタリング中に本質的かつ暗黙的に概念の完全性を維持する意欲と意欲を持っていますが、ほとんどのプログラマーはそうではありません。それは彼らにとってより少ない仕事を意味します)。
アーロンノート

1
「おそらく動作する可能性のある最も単純なことを行う」には、余分なコンテキストは必要ありません。リファクタリングは行いますが、コンテキストを知らない人は、コンテキストを学習することでリファクタリングの方法をどのように学習しますか?
ラインヘンリヒズ

9

通常、そのように感じるとき、それは私が試してみる必要があることを意味します:

  1. 立ち上がって歩き回り、すべての生物学が正常に機能していることを確認します。
  2. 乗り越えるホワイトボードと私は自信の感覚を得るまで描きます。
  3. 問題を話し合うだけの「設計苦情バディ」を見つけてください。

問題に構文と小さな断片が関係している場合:

  1. たとえくても、どこかにうまくカプセル化されており、純粋にローカルな種類のクラフトを表していることに満足してください。
  2. コードにバグがある理由を説明するTODOマーカーまたはコメントを追加します。
  3. 次のタスクに進みます。

1番目と2番目の両方の+1に対して+1。通常、ボックス、線を描画し、ラベルを付けて大きな画像を取得すると、オプションを選択するのに役立ちます。タスクを追跡する優れたコードアナライザーがある場合(ハドソンはビルドでTODOを追跡し、それらをうまく表示できます)、気に入らないものを簡単に追跡できます。
ランディ

5

自分が無作法だと考えるのはとても簡単です。たとえなんとかして、プロジェクトを完了する前に簡単に変更できる最高のソリューションを今すぐ思いついたとしても、それから何をしますか?

適切なソリューションを選択して実行する方が、最良のソリューションが何であるかをじっくりと考えるよりも優れています。最善の解決策は、とらえどころのないものであり、さらに悪いことに主観的なものです。要件が少しでも変更された場合、そのソリューションはその時点で最良ではなかったため、破棄したソリューションよりも悪化することがあります。


私はこれを知っていますが、私はまだ一つの選択肢を選ぶのに苦労しています。
アンノニマス

@anne:すぐに建設的な何かをする方が、正しいことを遅らせるよりもいいです。間違いになると確信している唯一のことは、何もしないことです。
悪魔のような子犬

4

私も分析の麻痺を避けることを学んでいるので、私たちへの称賛=)これは私たちが「最良の設計」をしたいためによく起こります。実際には、「最高」は見る人の目にあります。分析の麻痺を避けるための私の公式は、十分に良い設計原則を適用することです。どうやってやるの?私は時間制約、スケジュールなどの変数を持ち、品質を損なうことなく仕事を完了することができる最も簡単な設計(これは最も簡単なことではありません)を自問しますが、同時に、それがテスト可能であり、変更のために閉じられた拡張用オープン(OCP)デザインも。テスト可能なOCPとはどういう意味ですか?まあ、私がベストだと思ったものを探す代わりに、私は物事が悪くなっているときに教えてくれ、後でリファクタリングと改善ができるだけのコードを実行しようとするデザインを考えました。また、変わらないコードで変更されるコードを分離するようにしてください。リファクタリングは簡単になります。これは、変更する必要のないコードが、将来のあなたや他の誰かから安全であるためです。


2

あなたの腸の感覚にオプションの1つを決定させるのはどうですか?それはかなり速く進み、amboxが提案したタイムボクシングとうまく結合するはずです。オプションが既に確立されている場合は1分間、最初に定義する必要がある場合は2分間の制限を試すことができます。または、適切と思われるもの(事前定義済み)。腸の本能に耳を傾けることを学ぶとき、あなたの直感的な選択は練習でより速く、より良くなります

完全ではない選択の可能性についての心配に悩まされている場合、以下に対処するためのいくつかの考えがあります。

  • 他のものよりも明確なエッジを持つオプションがある場合、どちらを選択するかを自問することはありません。したがって、その推論によって、複雑すぎない問題について何らかの選択を決断しない場合は、オプションがすべてまったく同じであることを示します。そのため、それらのいずれかを選択するだけで失うものはあまりありません
  • そうは言っても、直感はまったくランダムではありませんが、最適なソリューションのための非常に優れた知識に基づいた推測です。多くの場合、無限の臨検を通じて思い浮かぶものよりも優れています。
  • 完璧主義に応えて、半意識的にパフォーマンスを評価する際に、選択の最適性より意思決定の迅速性を高く評価することができます。これは重要でない選択では完全に理にかなっていますが、覚えておくのは簡単ではありません。

幸運を!:)


2

少しの経験でなくなると思います。私の麻痺の大部分は、コードベースが必要以上に先を見越してしまうのを想像しようとするために起こります。プロジェクトが明確な形状になると、反復コードユニットが目立ち始め、反復パターンを抽象化してコードを単純化するのは簡単です。


1

決定するのを嫌がる場合は、タイムボックスを適用します。数分で目覚まし時計を設定します。それまであなたの心を苦しめますが、アラームが鳴るとき、あなたがそれまで見つけた最良のオプションを選択してください。


3
そして、彼は目覚まし時計を正確にどれだけの時間設定すべきかについて、何時間も苦しみます!:)
ヨルダン

1
ヨルダン:その問題の解決策もいくつかあります。残念ながら、私はどちらを提案するか決定できません。
user281377

0

プロトタイプを作成します。プロトタイプは捨てられるように作られているので、どの関数、変数名、または大規模なアーキテクチャを使用しても問題ありません。それが機能することを証明するために構築するだけです。

あなたがそれを作成し、それを捨てたら、私はあなたがそれらの決定をするのがより簡単な時間を持っているに違いないと思います。


後で機能を追加するときにプロトタイプを拡張できる可能性があるため、プロトタイプを破棄しないでください。または、SSCCEでバグをテストする必要があるかもしれません。私は常にすべてのプロトタイプを別々の場所でソース管理しています。
maple_shaft

2
「捨てる」ことの背後にある考え方は、データを失うということではなく、プロトタイプのすべてのポイントは間違いを犯す自由を実験することなので、プログラムの基礎としてプロトタイプを使用すべきではないということです。
ダリエン

ブランチでプロトタイプを作成し、必要なテストを行い、コアでクリーンバージョンを作成します。
zzzzBov

0

私もこの問題に苦しんでいます。私が言うことは、あなたには十分な完了インセンティブがないということです。

たとえば、レンダリングコードを書いているときに、完了の大きなインセンティブがありました。それを使って、システムの動作を確認し、クワッドをテクスチャリングするのがどれほど素晴らしいかを考えて、または頂点を変換します。しかし、今、リファクタリングしているので(あなたが知りたい場合は4を試してください)、それは多くの仕事であり、私が終わっても、同じ古いクワッドを見るだけで苦しんでいます。そして、私は本当に再びリファクタリングする必要はありませんし、同じ古​​いクワッドを何度も何度も見るのはうんざりです。それはもはや私にとって報酬ではありません。

それをコンポーネントに分解し、それが機能していることを示すコンソールI / Oがある場合でも、それらを完了したことに対して自分に報酬を与える必要があります。


0

私はあなたの質問を読んで、他のポスターに沿って物事を考えていました。あなたはこの仕事には向いていません。自分に時間制限を与えます。ちょっと他のことをしてください。熟考した後、答えが本当に役立つかどうかわかりません

このような精神的な問題の問題は、解決するのが簡単ではなく、あなたの一部であり、明らかにあなたが仕事を気にしている(おそらく多すぎる)、あなた自身に同意する自信を持っていないことです自分が最初の選択だと考えるのは経験が浅かったので、完全に正しいことを強調しすぎていました。なぜこのような些細さを心配するのでしょうか?!

今、私は同様の問題を抱えていますが、コードではあまりありません..通常は夕食に何をすべきか..ピザやカレー。 、しかし、あなたはより多くのカレーを得るが、しかし...など。:)

だから私は考えました-コーディングで同様の問題を抱えていないのはなぜですか?関数定義が必要な場合は、簡単です。これまでにコーディングした他のすべての関数定義と同じようになります。制御フローが必要な場合は、まずforループまたはwhileループが必要かどうかを判断してから、これらのいずれかが必要なときに前回使用したのと同じ古いコードを作成します。同じことがすべてに当てはまります。キューが必要ですか?確かに-「標準」キューコード(最後に取り組んだプロジェクト、またはこれらのいずれかを使用して覚えているプロジェクトから取得したもの)をカットアンドペーストできます。最終結果...私は新しいものだけを気にします、そして正直に言うと、それは喜びです。

したがって、私のアドバイスは、コードスニペットのライブラリの構築を開始することです-私はそれらを自分に電子メールで送信し、フォルダに入れていましたが、あなたが作業するものは何でも最高です-そして、あなたは毎回何をすべきかを知るようになります。常に、作成した古いコードに移動して、次の問題に備えて問題を回避します。あなたははるかに速い開発者になります(真剣に、これはプログラマの生産性を得る唯一の方法です)、そしてあなたがすでに何度も解決した退屈な日々のものではなく、楽しいビットのための時間を見つけることを願っています以上。

もちろん、重要なことの後半も重要です。仕事が増えるほど、考える時間を費やす必要がなくなります。


スニペットプログラミングは最悪の種類の悪い習慣です
ニールバターワース

@Neil:他の人のスニペットをスニペットプログラミングとして使用し、彼らが何をするのかわからないのは悪い習慣です。あなたが書いたものを理解している可能性が非常に高いので、独自のコードスニペットを使用することは一般的に良いことです。そうでない場合は、おそらくあなたに希望はありません。
ヨルダン

@ニール、今日は特に機嫌が悪い!とにかく、ほとんどのシニアプログラマーの頭にはスニペットの膨大なライブラリがありますが、それらを使用していることに気付かないでしょう。後輩にとって、それらを書き留めることは、彼らがこれを構築するのを助けます。
gbjbaanb

0

以下、Rein Henrichs(シンプルでリファクタリングを開始)とammoQ(タイムボックス)による提案を組み合わせた戦略です。

  1. うまく機能する最初のソリューションには、かなり厳しい時間制限を設けてください。たとえば、変数名の場合は30秒。最初にのようなものを考え出しx、それをに絞り込んでからstringname時間が経過するまで続けます。
  2. 次に、特定の時間(10分など)で他のタスクに進みます。
  3. その後、決定をさらに改善するために別の時間ボックスを許可します。userHandle

このアプローチの可能な利点

  • 後でこれに戻るという知識は、今のところ問題を手放すことを容易にするかもしれません
  • 他のタスクを継続しながら、時間を浪費することなく、満足のいく優れたソリューションを思いつくことができます。
  • ステップ1を放し、ステップ2フローに入ると、ステップ2 を続行たいので、ステップ3を本当に迅速に保つことが簡単になります。

この答えは以前のものよりも具体的かつ完全に見えますが、どちらも同じ根拠をカバーしているようです。それらを1つにマージするか、保持するものを選択してください。
アダムリア

@Anna私は2つの別々の投稿をしました。それらには独立して投票すべき異なる概念のアイデアが含まれていることがわかったからです。前のもの:直感。確かに、両方の手法はうまくいっていますが、それぞれが他の手法なしでも機能します。
アーロントーマ

0

調査を終えて、明確な最良の選択肢が残されていない場合、時間制限(通常は5分)を選択して1つを選択し、そのまま進めます。 障害にぶつかったとしても、この時点では保証はありません。別の決定を下しても同じ障害にぶつかることはないでしょう。私は自分の決断を後悔している時間を考えることはできません。


0

通常、判断できない理由は、違いがわずかであるか、十分な情報がないことです。

a)考慮すべき合理的なオプションを考え出すために時間制限を設定します。どちらをまだ決めないでください。時間の終わりに、識別されたオプションの1つ(明確な優先権がない場合はランダムに)と別の時間制限を選択します。時間の終わりに明確な決定がなされない場合、すでに選択されているものがそうです。コーディングを開始し、明らかに間違いがある場合はリファクタリングします。上司がその理由を尋ねた場合、「コインを裏返しました、あなたはより良い方法を手に入れましたか?」と言います。

ケースb)で-あなたはより多くの情報を必要とし、あなたの大きな脂肪A ....に座って一日中それを提供するつもりはありません。設計モードを終了し、情報収集モードに入ります。プロトタイプ、質問、技術雑誌を読んでください。何をするにしても、寝すぎないでください。


0

多くの場合、最善の解決策は、同僚に決定を説明してみることです。ただし、これを頻繁に行うことは望ましくないので、紙/ペンまたは空のメモ帳ウィンドウのいずれかで、紙の上で考えるのが次善策です。

絶対に何でも書くことから始めてください-ただ書くことのリズムに入るために。メモ帳ウィンドウで、「紙の上で考えています」と入力するだけで、意識の流れを続けることができます。数秒後にライティングのリズムになりますので、Enterキーを数回押して、ジレンマの説明を始めます。

問題を述べ、次に可能な解決策、それぞれの利点などを述べてください。

常に機能するとは限りませんが、頭(RAM)から外部メディア(メモ帳ドキュメント)に思考を移すプロセスにより、新しい接続を作成したり、さまざまな視点から決定を表示したりする自由度が高まります。


0

私は同じ問題に苦しんでいます。小さな問題については、私がそれに対処しようとする方法は、それが愚かではないと思う最初のデザインを採用することです。最適な設計を見つけようとしても意味がありません。考えずに考えてしまうかもしれないデザインのすべてのニュアンスについて、それを書かずに推論することは不可能ではないにしても困難です。コードを作成すると、少し改善できることがわかります。正しく完了しました。この方法でかなり良いソリューションに収束することはかなり簡単です。

より大きな問題については、最初にオプションを検討することにはメリットがあると思いますが、タイムボックスを使用してください。大きな問題には大きな解決スペースがあり、すべての可能性を評価することはできません。

TLDR; 合理的な解決策を選び、それを改善していきます。

これも関連しています。

陶芸の先生は初日にクラスを2つのグループに分けていると発表しました。彼は、スタジオの左側にいるものはすべて、彼らが生産した作品の量だけで評価され、右側のものはすべてその品質だけで評価されると彼は言った。彼の手順は簡単でした。クラスの最終日には、バスルームスケールを持ち込み、「数量」グループの作業の重量を量ります。しかし、「品質」に格付けされている人は、「A」を獲得するために、完璧なポットではありますが、たった1つのポットを生産する必要がありました。

さて、採点の時が来て、奇妙な事実が浮上しました。最高品質の作品はすべて、数量で採点されるグループによって作成されました。「量」グループは仕事の山を忙しくかき回している間-そして彼らの過ちから学んでいる間-「質」グループは完全性について理論化して座っていたようであり、最終的には壮大な理論と死んだ粘土の山。

http://www.codinghorror.com/blog/2008/08/quantity-always-trumps-quality.html


-8

私はこれを理解したことがありません。私がインストラクターだったとき、私は次のようなことを言うでしょう:

"OK, create an integer variable and assign the return value of strlen() to it."

それほど複雑ではない、あなたは思うかもしれません、そして、人々の95%は次のようなものを書きました:

int x;   // or y, or len, or whatever
x = strlen( s );

しかし、時折、ヘッドライトで麻痺したウサギのように座っている人がいるでしょう。私は同情的に問題が何であったか尋ね、彼らは「私はそれを何と呼ぶべきかわからない!」と言うでしょう。

これらは、別のキャリアを探すべき人々です。たぶんあなたがすべきです。


2
@アン私は仮定をしていません-あなたはあなたが物事の名前を考えるのが難しいとあなたが言った-「非常に頻繁に、私は最良の設計決定を選択するときに立ち往生します。
ニールバターワース

3
そして、何か名前を付けるのが難しいので、なぜ別のキャリアを探す必要があるのですか?すべてのコンセプトに、自然言語への簡潔で短いマッピングがあるわけではありません。
アンノニマス

2
@Anneあなたの元々の質問の趣旨は、あなたが優秀なプログラマーに自然に来ることをするのに問題を抱えているように思えます。これには恥はありません-ほとんどの人(ほとんどのプログラマーも!)はこれらのことをするのにひどいです。しかし、私と同じように、あなたが本当に得意なことをするだけで幸せになることができると仮定して、私はプログラミングはあなたが切望されているものではないかもしれないと提案しました。私は成人期の最初の10年間を微生物学者として過ごしました。私はそれがあまり得意ではなく、プログラマーになったときはずっと幸せでした。
ニールバターワース

3
すべてに友好的なリマインダー:答えに同意しない場合は、downvotesを使用してそれを表現してください。どちらの側からの個人的な攻撃も削除されます。
アダムリア

3
最終的には、答えはかなり厳しくなりますが、コメントを見ると、それほど厳しくありません。おそらくそれを編集する必要があります。
DeadMG11年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.