非常に頻繁に、最良の設計決定を選択するときに行き詰まります。関数の定義、制御フロー、変数名などの細部についても、私は非常に長い時間を費やして、自分の選択の利点とトレードオフを熟読しています。
このような重要ではない詳細に時間を費やすことにより、効率が大幅に低下しているように感じます。現在のデザインがうまくいかなくてもこれらを変更できることを心の奥で知っていますが、1つの選択肢をしっかりと決めるのは困難です。
この問題に対処するにはどうすればよいですか?
2つの単純なルール:
これらの各事項を実行し始めると、後で変化に対応する能力を損なうことなく、今すぐ簡単な決定を下せることを確信できます。
今後のプルーフとは、コードを簡単に変更できるようにすることであり、コードの変更が必要になる可能性のあるすべての方法を予測するのではなく、.
通常、そのように感じるとき、それは私が試す必要があることを意味します:
問題に構文と小さな断片が含まれる場合、次のようになります。
自分を怠惰に考えるのはとても簡単です。どういうわけか、最高のソリューションを思いつくために管理しても今プロジェクトを完了する前に簡単に変更できますが、それから何をしますか?
bestソリューションがどうなるかを考えてディザリングするよりも、まともなソリューションを選んで実行する方が良いです。最善の解決策はとらえどころのない、より悪い、主観的なものです。要件が少しでも変化する場合、そのソリューションは、その時点で最高ではなかったために破棄したソリューションよりも悪くなる可能性があります。
私も分析の麻痺を避けることを学んでいるので、私たちに敬意を表します=)これは、「最高の設計」をしたいためによく起こります。実際には、「最高」は見る人の目にあります。分析麻痺を回避するための私の公式は、十分な設計の原則を適用することです。どうすればいいですか?私は時間の制約、スケジュールなどの変数を持ち込み、品質を損なうことなく、仕事を成し遂げることができる最も簡単な設計(これが最も簡単というわけではありません)を自分自身に問いかけますが、同時に、それが- テスト可能および変更のために閉じた拡張機能に対して開く(OCP)設計。テスト可能およびOCPとはどういう意味ですか?ええと、私が最善と考えたものを探すのではなく、物事がうまくいかない場合に教えてくれるデザインを検討し、後でリファクタリングして改善できるだけの十分なコードを実行しようとしました。また、変更されるコードと同じコードを分離するようにしてください変更されないはずのコードが将来のあなたや他の人から安全であるため、リファクタリングが簡単になります。
あなたの直感にオプションの1つを決定させてみませんか?これはかなり高速になり、timeboxingとうまく組み合わせるはずです。これは、ammoQも proposed です。オプションがすでに設定されている場合は1分間、最初に定義する必要がある場合は2分間という制限を試すことができます。または、適切と思われるもの(事前に定義済み)。直感に耳を傾けることを学ぶとき、直感的な選択はより速く、より良い練習になります。
完璧ではない選択の可能性について心配に悩まされている場合のために、これに対処するためのいくつかの考えがあります:
幸運を! :)
少しの経験で消えると思います。私の麻痺のほとんどは、コードベースが必要以上にはるかに先にどのように見えるかを想像しようとするために発生します。それを克服するために、機能する最も単純なことを実行し、次に進みます。プロジェクトが明確な形になったら、反復コードユニットが目立ち始め、反復パターンを抽象化してコードを単純化するのは簡単です。
通常、決定できない理由は、違いがわずかであるか、十分な情報がないためです。
ケースa)を検討するための合理的なオプションを考え出すために時間制限を設定します。まだ決めていません。時間の終わりに、識別されたオプションの1つ(明確な優先順位がない場合はランダムに)を選択し、別の制限時間を選択します。時間の終わりに明確な決定がなされない場合、すでに選択されたものです。コーディングを開始し、明らかに間違っている場合はリファクタリングします。ボスが理由を尋ねた場合、「私はコインを投げた方がいい方法を手に入れましたか?」と言います。
ケースb)-あなたはより多くの情報を必要とし、あなたの大きな脂肪A ....に座って一日中それを提供するつもりはありません。デザインモードを終了し、情報収集モードに入ります。プロトタイプ、質問、技術雑誌を読んでください。あなたがすることを嫌うなら、あまり長く寝ないでください。
私も同じ問題に苦しんでいます。小さな問題の場合、私がそれに対処しようとする方法は、私が考える最初の設計を愚かにしないことです。最適な設計を見つけようとしても意味がありません。あなたがそれを書かずにあなたが考えるかもしれないどんなデザインのすべてのニュアンスについて推論することは不可能ではないにしても難しいです。コードを書くと、小さな改善ができることがわかります。正しくできたので、この方法でかなり良いソリューションに収束するのはかなり簡単です。
より大きな問題については、最初にオプションを検討することにはメリットがあると思いますが、タイムボックス化してください。大きな問題には大きな解決策があり、すべての可能性を評価することはできません。
TLDR;合理的な解決策を選び、あなたが行くにつれてそれを改善してください。
これも関連しています:
陶芸の先生は、初日にクラスを2つのグループに分けることを発表しました。スタジオの左側にいるすべての人は、彼らが生産した作品の量だけで評価され、右側の人はすべてその品質で評価されます。彼の手順は簡単でした。クラスの最終日に、彼は自分のバスルームスケールを持ち込み、「数量」グループの作業を比較検討しました。50ポンドのポットが「A」、40ポンドが「B」という具合でした。しかし、「品質」で採点されたものは、「A」を取得するために、完全なものではありますが、1つのポットのみを生成する必要がありました。
さて、グレーディングの時期が来て、奇妙な事実が浮上しました。最高品質の作品はすべて、量的にグレーディングされているグループによって作成されました。 「量」グループが忙しく仕事の山を作り出し、その過ちから学んでいる間、「質」グループは完全性について理論化していて、結局は壮大な理論と死んだ粘土の山。
from http://www.codinghorror.com/blog/2008/08/quantity-always-trumps-quality.html から。
決断の手間を省くには、 timeboxing を適用します:目覚まし時計を設定して、数分でオフになります。それまで心を痛めますが、アラームが鳴ったら、それまでに見つけた最良のオプションを選択してください。
プロトタイプを作成します。プロトタイプは捨てられるように作られているので、どの関数、変数名、グランドアーキテクチャを使用するかは問題ではありません。あなたはそれが機能することを証明するためにそれを構築するだけです。
あなたがそれを作成し、それを捨てたら、私はあなたがそれらの決定を行うのが簡単になると確信しています。
多くの場合、最善の解決策は、あなたの決定を同僚に説明することです。ただし、これをあまり頻繁に実行したくないので、次善の策は紙で考えることです。
何でも書くことから始めます-書くリズムに入るだけです。メモ帳のウィンドウで、「私は紙で考えています」と入力して、意識の流れを続けることができます。数秒後、書くリズムが整うので、Enterキーを数回押して、ジレンマを説明します。
問題を述べ、次に可能な解決策、それぞれの良い点などを述べます。
常に機能するとは限りませんが、頭の中(RAM)から外部メディア(メモ帳ドキュメント)に思考を移すプロセスにより、新しい接続を作成し、さまざまな視点から決定を表示するための自由度が高まります。
私もこの問題に苦しんでいます。私が言うことは、あなたは十分な完了インセンティブを持っていないということです。
たとえば、レンダリングコードを作成していたときは、完了完了のインセンティブが大きかったのです。これを続行すると、システムの動作を確認し、クワッドをテクスチャリングするのがいかに素晴らしいかを考えることができるので、または頂点を変換します。しかし、今はリファクタリングしているので(知りたい場合は4を試してみてください)、多くの作業が必要なので苦しんでいます。終了しても、同じ古いクワッドが表示されるだけです。そして、私は本当にリファクタリングする必要が本当になくて、同じ古いクワッドを何度も何度も見るのにうんざりしています、そしてそれはもう私にとっての報酬ではありません。
いくつかのコンソールI/Oが機能していることを示している場合でも、コンポーネントに分解し、それらを完成したことに対して報酬を与える必要があります。
私はあなたの質問を読み、他のポスターに沿って物事を考えていました。あなたはこの仕事に適していない。時間制限を設けてください。しばらく他のことをしてください。少し考えた後、答えがどれほど役立つかはわかりません
このような精神的な問題の問題は、簡単に解決できず、それらがあなたの一部であり、明らかにあなたが自分の仕事に(多分)気にしていること、自分に同意する自信がないこと、あなたが最初の選択であると考えるのに経験が浅いのはずっと正しかった、またはそれを完全に正しくすることを強調しすぎです。なぜ他にそのような些細なことを心配するのですか?
今、私は同様の問題を抱えていますが、コードはそれほど多くありません..通常、ディナーに必要なものです..ピザまたはカレー..うーん...ピザですが、カレーはいいですが、カレーのように感じますか、ピザは安いです、でもカレーが増えるけど… :)
だから私は思った-コーディングで同様の問題を抱えていないのはなぜだろう。関数定義が必要な場合は、簡単です。これまでにコード化した他のすべての関数定義と同じように機能します。制御フローが必要な場合は、まずforループとwhileループのどちらが必要かを決定し、次に、これらのいずれかが必要になったときに前回使用したものと同じ古いコードを作成します。すべてが同じですが、キューが必要ですか?確かに-「標準」のキューコードを切り貼りしてみましょう(私が取り組んだ最後のプロジェクト、またはこれらのいずれかを使用して覚えている任意のプロジェクトから抜粋)。最終結果...私は新しいものだけを心配します。正直に言うと、それは楽しみです。
したがって、私のアドバイスは、コードスニペットのライブラリの構築を開始することです。私はそれらを自分に電子メールで送信してフォルダーに入れていましたが、作業内容が最も良いので、毎回何をすべきかを知るようになります。あなたはいつもあなたが書いた古いコードに行き、問題を解決し、次の問題の準備をします。あなたははるかに速い開発者になることに気づくでしょう(真剣に、これはプログラマーの生産性を得る唯一の方法です)、うまくいけば、すでに何度も解決してきた退屈な日々のことではなく、楽しいビットのための時間を見つけるでしょう以上。
もちろん、後の部分も重要です-仕事が増えるほど、考えることに費やす贅沢が減ります。
combines Rein Henrichs(start simple、refactor)とammoQ(timeboxing):
x
のようなものを考え出し、次にstring
に絞り込んでから、時間切れになるまでname
に絞り込むことができます。userHandle
このアプローチの可能な利点:
調査を終えて明確な最良の選択肢が残っていない場合、自分に時間制限を与えます(通常5分)、1つを選びます次に、それを前に進めます。障害物に遭遇した場合でも、現時点では保証はありません。別の決定。私は自分の決断を後悔した時を考えることができません。