web-dev-qa-db-ja.com

私の提案したデザインは通常、私の同僚のデザインよりも悪いです-どのように私はより良くなるのですか?

私は数年プログラミングをしていて、問題の修正や中小規模のスクリプトの作成に関しては一般的には優れていますが、オブジェクト指向の方法で大規模なプログラムを設計することは一般的には得意ではありません。いくつかの質問

  1. 最近、同僚私と同じ年数の経験を持っていると私は問題に取り組んでいました。私は彼よりも長い問題に取り組んでいましたが、彼はより良い解決策を考え出し、最終的には彼のデザインを使用します。これは本当に私に影響を与えました。彼のデザインの方が優れていることは認めますが、彼と同じくらい良いデザインを考えたかったのです。私は仕事をやめることさえ考えています。理由はわかりませんが、突然、プレッシャーがかかってしまいました後輩は私などをどう思いますか?正常ですか?それとも、これについて少し考えすぎていますか?

  2. 私の仕事はPythonでのプログラミングです。私はソースコードを読み込もうとしていますが、設計スキルをどのように向上させることができると思いますか?私が勉強すべき良い本やソフトウェアはありますか?

教えてください。本当にありがとうございました。

69
user151193

これはあなたのスキルの非常に良い兆候だと思います。チームで「より良い」デザインを思い付くことが困難な人にとって、別のデザインのほうが優れている理由を完全に認識できないことがよくあります。

あなたには2つの本当に素晴らしい(そして驚くほど珍しい)強みがあります。

  • あなたは他の人に対して自分のデザインを客観的に評価することができます
  • あなたは欲望を持っており、あなたのデザインを最適にするための努力を払っています

あなたはほんの数年で、長い道のりがありますが、この態度であなたは間違いなくそこに着くでしょう、あきらめないでください。私たちは皆、このようなメンタルセットバックを扱います。私は機会があるたびに 設計原則 (設計パターンと同じではありません)をプラグインするのが好きで、これはそれらが便利になる完璧な例だと思います。それらを研究し、デザインに適用する練習をしてください。そうすることで、この点で次のステップに進むことがわかります。

結局のところ、設計は難しいことを覚えておいてください。私たちは毎日、複雑な高レベルの抽象化に取り組んでおり、これらを薄い空気から作成してうまく機能させ、同僚が使いやすいようにすることは非常に困難な作業です。 years の場合、練習が必要です。

2つのデザインを評価できず、実際に1つを他のデザインよりも望ましいと認識している人がたくさんいます。良いデザインを作成する上で、どれだけうまくやっていると思いますか。

編集:
別のヒント、原則を理解し、それらのアプリケーションを少し実践した後、ここで別の質問から、別の目的とルールを持つさまざまな言語を勉強することの価値について話している宝石があると思います。

理想的には、すべてのプログラマーが各クラスの言語を知っている必要があります。何を学ぶことができますか:

  1. 静的型付きOOP主流言語:Java、C#(主にエンタープライズソフトウェアで使用されます)およびC++(システムプログラミングおよび複雑なデスクトップアプリケーション)
  2. プロトタイプベースのOOP言語:Javascript(クライアント側のWebプログラミング))
  3. 手続き型言語:C(組み込みソフトウェアおよびシステムプログラミング)
  4. 関数型言語:Haskell、ML、またはLISP(関数型言語は高度に並列化されたソフトウェアに適しています)。

ロジックプログラミング言語(Prolog)は、主にAIの研究で使用されているため、おそらく業界ではそれほど有用ではありません。

これは、ソリューションを設計するときに頭に浮かぶさまざまなアイデアを広げるのに役立ちます。

69
Jimmy Hoffa
  1. これは、複数の人が異なる品質のデザインを思いつくことは絶対に正常です。私は過去にソフトウェアデザインの競争を審査するために招待されたので、これを直接目にしました。最も単純なデザインでさえ、劇的に異なる品質のソリューションになり、すべてスマートで経験豊富な人々からのものです。
  2. ソースコードの読み取りが低すぎるため、設計スキルの向上に役立ちません。コードは、設計全体よりも低いレベルで複雑さに対処します。

ソフトウェアの設計を改善する最良の方法は、ソフトウェアを設計することです*。これを行う1つの方法は、デザインコンペティションを確認することです。TopCoderには100以上のコンポーネントデザインのアーカイブがあり、UMLデザインドキュメントとJavaおよび/またはC#)での実装が完了しています。完成したコンポーネントをピックアップします。好きなように、要件の仕様を読んで、要件を満たすためのオリジナルのデザインを考え出してみてください。問題について1時間か2時間考えてクラス図をスケッチしてから、勝者のデザインを開いて、作者の作業を読んでください。彼のデザインを自分のデザインと比較し、違いを見つけて、デザインが優れているかどうかを確認します。コンテストのスコアカードをチェックして、審査員がデザインをどのように評価したかを確認します。これにより、デザインスキルを向上させる方法を決定するために必要なフィードバックが得られます。


*
22
dasblinkenlight

仕事を辞めないでください。自分よりもスキルの高い人と一緒に仕事をすることをお勧めします。そうすれば、その人から学ぶことができます。

より良いデザインを見て、それがより良い理由を判断してください。受け入れられたデザインから学び、他の状況で同様のデザインを適用できる方法について考えます。なぜそれがあなたのデザインよりも優れているのかがわかれば、次にデザインをするときに何をすべきでないのかがわかります。他の開発者と話して、彼がどのように設計を思いついたか尋ねてください。

デザインスキルを向上させるための最善の方法は、デザインを作成し、自分自身と一緒にそれらを評価し、どのように改善できるかを判断することです。次のような質問をしてみてください:機能し、すべての面で要件を満たしていますか?それは保守可能ですか?これをどのようにテストできますか?パフォーマンスの問題を引き起こしますか?要件が変更される可能性があり、設計はどれだけうまくいくでしょうか?変化に対応できる。デザインパターンについて読んでから、それらをデザインに適用してみてください。最初のデザインを思いついた後、容赦なくリファクタリングしてください。アプリケーションと一緒にデータベースを設計している場合は、データベースの正規化とパフォーマンスチューニングについてよく読んでください。データベースを最も効果的かつ効率的に機能させる方法を学べば、データベースの設計について詳しく知ることができます。アプリケーションの場合、DRYおよびSOLID設計を行う際の原則)について考えてください。アンチパターンについて読んで、避けるべきことを確認してください。

11
HLGEM

より良いデザインを認識することは重要な能力です。デザインを見ることに関する以前の提案のいくつかに従うときに、これを促進する必要があります。

他のデザインをどの基準でより良く判断しましたか?シンプルでわかりやすかったですか?パフォーマンス上の利点はありましたか?より拡張可能でしたか?分解、抽象化、情報の隠蔽、コンポーネントのモジュール性など、設計の判断に使用でき、すでに認識している可能性がある多くの設計原則があります。

  • 基準に名前を付け、それらを理解し、拡張して、他のデザインと同じように再利用してください。自分で設計するときは、それらの基準を使用し、それらに対して設計を意識的に測定することをプロセスの一部にします。次に、設計が完全に変更されるか、基準を満たさない場合は破棄する準備をしてください。

以下のソースのいくつかから、設計のさまざまな原則に関するアイデアを得ることができます。 http://www.cs.wustl.edu/~schmidt/PDF/design-principles4.pdf ウィキペディアのソフトウェア設計Google 「ソフトウェア設計原則」

  • オブジェクト指向設計、機能設計、構造化分析設計など、ソフトウェア設計のさまざまなモデルを理解する。これらは、設計タスクに取り組む際の考え方とはまったく異なる場合があり、それぞれに優れた分野があります。これらをツールボックスのツールとして学びます。 http://userpages.umbc.edu/~khoo/survey2.html

  • 設計を実装から分離していることを確認し、優れた設計と見なされるものを図表にして、言語と実装の詳細を上位レベルの設計原則から分離してください。そして、「デザインの目」とコミュニケーション能力を養う。

  • 最後に、おそらく最も重要なこととして、広く読むことは非常に優れたツールです。フラクタルからベイジアン分析、ファジーロジックから自然言語処理まで、興味深いことはたくさんあります。 Webを使用すると、娯楽や啓発のためだけに、トピックを広範囲に閲覧できます。専門家になる必要はなく、用語やアイデアに精通しているだけです。

楽しんでください。少なくとも少しは楽しんでいない場合は、やらないでください。

3

さて、あなたはすでに最初のステップを踏みました。学ぶべきことがあり、同僚の仕事があなたの仕事よりも優れていることを認め、学び、改善したいと考えています。

2番目のステップは分析です。彼の作品を見て、それがより良いというだけではありません。 なぜを理解するのが良いでしょう。彼がよりよくした具体的な詳細とポイントを探します。

それを理解したら、その背後にある原則を抽出します。次のような質問をします。

  • このデザインは私のデザインよりも優れていますか?
  • この点はこの設計に固有のものですか、それとも将来他の設計に適用できる一般的な原則ですか?
  • それが一般的な原則である場合、その制限は何ですか?この方法でしないのはいつ良いアイデアですか? (これは非常に重要です。不適切な場合でも、有用なアイデアを ゴールデンハンマー として扱うことができなくなります。)

自分で結論を出すようにしましょう。自分で結論に導いた一連の推論を思いついた方が、アイデアをよりよく理解できるようになるだけでなく、同僚と話し合って、成果が出ていることを確認してください正しい。 (結局のところ、推論に誤りを犯し、悪い原則を内在化したくありません。)そして、理解できない場合は、遠慮なく同僚に助けを求めてください。プログラミングは謙虚さが尊重される傾向のある分野であり、多くのプログラマーは誰かに何か新しいことを教える機会に飛びつきます、それはおそらくStackOverflowが非常に速く大きくなった理由の大きな部分です。

2
Mason Wheeler

「素晴らしい答えに加えて」「私よりも優れたデザインを作成できる」以上のものがあることも付け加えたいと思います。他の答えは、デザインをより良くする方法に焦点を当てています。

あなたがあなたの同僚よりも良いことをできると私はお金を賭けます。怒りのマッチなどを作成するのではなく(Yをもっと上手にできる?ねじ込み、私はXをもっと上手にできる!)、誰もが長所と短所を持っているという真実を指摘する。

私の仕事には4人の開発者がいます。 2人の主要な「プログラマー」が私をほこりの中に残すようなものを作成できる場合があります。私の頭を彼らの創造物に巻きつけようとするようにします。

しかし、私はSQLとコマンドラインスクリプトよりもはるかに優れており、ほこりの中に残っているものを自動化できます。

彼らは私よりも優れていますか?一部の地域では間違いなく。地獄、多くの分野でそうです-私は私の店のジュニア開発者であり、個人的には、彼らは私に長年の経験を持っています。その長年の経験にもかかわらず、私はいくつかの分野では彼らよりも優れています。

誰かがあなたよりXが上手であるという事実に集中するのをやめます。その人は、それを試したり、考えたりすることなく、今後10年間練習した後でも、あなたをデザインし直すことができるかもしれません。弱点を修正することに全力を尽くすべきではありませんが、すべての強さに弱点があることを忘れないでください。

あなたと同僚の両方の長所と短所に焦点を当てます。

2
WernerCD

人生のあらゆる面で、特に「数年」の経験の後に、あなたはあなたほど上手ではない人々やあなたよりも優れた人々を見つけるでしょう。

みんなから学ぶ必要があります。

気分を悪くしないでください。多分あなたの同僚は自然です。彼を心から祝福し、彼からできるだけ多くを学ぶべきです。

プロが嫉妬してあなたと機会の間で学びを学ばないようにしてください。

1
  1. 数年は本当にそれほどではありません。そして、より優れたまたは最悪の高レベルの設計ビューを持つ人々よりも。たとえば、私は瞬く間に低レベルのプログラム用の複雑なアルゴリズムを書くことができるが、凝集や依存関係などの高レベルの設計や概念を理解できない人々を知っています。ただし、これは事実上の状態ではありません。どちらも、より高いレベルのデザイン(いくつかの本を読んだり、家でいくつかのトリックを試したりなど)で上手くなります。また、他のプログラミング領域では、他のプログラマーの能力が劣ることに気付くかもしれません。また、あなたが経験と技術知識の両方でほぼ同じレベルだと思う場合、これはランダムな状況であった可能性があります。次回はもっと良いデザインのアイデアがあるかもしれません。また、仕事を辞める代わりに、この機会に同僚から学びましょう。次回は、一緒にデザインをして、彼の秘密、彼の考えをキャッチしてみてください。プログラミングは工芸品のようなもので、他の人が行うことを見て、それを観察することによって学習されます。

  2. デザインスキルは、主に経験と、いくつかの重要な本を読んだ後に得られます。以下をお勧めします。

    • Robert C. Marting-アジャイルの原則、パターン、および実践(2つのバージョンがあり、1つはJavaと1つはC#にあります。どちらを選択するかは関係ありません。アイデアと原則はすべてのオブジェクト指向に適用され、ソースコードだけでなく)
    • それよりも、ロバートC.マーティングには、他に2冊の興味深い本があります。CleanCodeとThe Clean Coder
    • マーティンが彼の最初の本ですべてのモダンなデザインパターンをカバーしている場合でも、ギャングオブフォーによるオリジナルのデザインパターンの本を調べたいと思います。
    • 最後に、今日非常に高く評価されている他の本があります:テストによって導かれる成長するオブジェクト指向ソフトウェア、またはM.フェザーズによるリファクタリング(私は思う)、またはA.コックバーンによる効果的なユースケースの記述、その他いくつかの方法。

これらの本はどれも魔法の弾丸ではありませんが、最初の2つの推奨事項を読むと、おそらくプログラミングに対する見方や認識が永遠に変わるでしょう。

1
Patkos Csaba

それがあなたに届かないようにしてください。バグの修正や小さなプログラムの作成に長年の経験があれば、それがExcelの仕事です。あなたの同僚はおそらく、より大きなプロジェクトの設計に長年の経験があります。

基礎となるビットに精通していることは信じられないほど便利ですが、デザインをより良くしたい場合は、いくつかのプロジェクトをデザインする必要があります。スキルが沈むまで繰り返します。

つまり、「経験年数」は必ずしも同じではありません。あなたの年を価値あるものにしてください。

0
Philip

「良くなる」とは、多くの場合、何かまたは誰かに対してデザインまたはコードを測定し、違いを注意深く比較し、それらの違いから学び、それに基づいて継続的に将来のデザインを改善しようとすることを意味します。あなたがもっと学ぶ必要があることを見つけることにあまりにも悪いと感じていると、この有益なプロセスが遅くなります。あなたがより良い比較を時々または常にあなたに提供することができる人々(または他のリソース)がいない場所に移動した場合、あなたはより良い賭けのプロセスを学び、遅くするこの機会を失うかもしれません。

0
hotpaw2