コードを書くことはできますが、うまく設計できません。助言がありますか?[閉まっている]


83

コードを少しずつ書くのは得意だと思いますが、私のデザインは本当にひどいものです。問題は、デザインをどのように改善し、さらに優れたデザイナーになるかです。

学校や大学は人々に数学的な問題解決の達人になる方法を教えるのに良い仕事をしていると思いますが、学校で作成されたほとんどのアプリケーションは一般的に約1000-2000行の長さであるという事実を認めましょうこれは、実際のソフトウェアの複雑さを反映していません-数十万から数百万行のコードです。

ここで、topcoder / project eulerのようなプロジェクトもあまり役に立たないと思います。それらは数学的な問題解決能力を研ぎ澄ますかもしれませんが、あなたはアカデミックプログラマーになるかもしれません。素敵できれいなものにもっと興味を持ち、ほとんどのアプリケーションプログラマが扱う日常的で毛むくじゃらのものにまったく興味がない人。

私の質問は、どのように設計スキルを向上させるのですか?つまり、数千行のコードに入る小規模/中規模のアプリケーションを設計する能力ですか?より良いhtmlエディターキット、またはgimpのようなグラフィックプログラムを構築するのに役立つデザインスキルをどのように学ぶことができますか?


1
「学校で作成されたほとんどのアプリケーションの長さは一般に約1000〜2000行であるという事実を認めましょう。これは、ほとんどが実世界のソフトウェアの複雑さを反映しないアカデミックな演習であることを意味します」: 10学生のチームが6〜8か月の間にかなり複雑なアプリケーションを開発した学期ソフトウェアプロジェクト。また、多くの企業(少なくともドイツ)は、勉強を終える前に練習をしたい学生のために短い契約を提供しています。
ジョルジオ

回答:


87

何かに本当に上手になる唯一の方法は、試してみて、見事に失敗して、もう一度試して、以前よりも少しだけ失敗して、時間の経過とともに失敗の原因を認識して、潜在的な失敗の状況を後で管理できるようにすることです。これは、ソフトウェア開発のあらゆる側面を学習するのと同じように、お気に入りの一人称シューティングゲームで楽器を演奏したり、車を運転したり、深刻なPWN年齢を獲得することを学ぶのと同じです。

本当のショートカットはありませんが、経験を積んでいる間に問題が手に負えなくなるのを避けるためにできることがあります。

  • 良いメンターを特定する。すでに会費を支払っている人とあなたの問題について話すことができることほど良いものはありません。ガイダンスは、迅速な学習を支援する優れた方法です。
  • 読んで、もう少し読んで、あなたが読んでいたものを練習し、あなたのキャリアの生涯を通して繰り返します。私はこのようなことを20年以上続けていますが、それでも毎日新しいことを学んでいます。事前設計だけでなく、緊急設計、テスト、ベストプラクティス、プロセス、および方法論についても学びます。すべてが、デザインがどのように出現し、形をとるか、さらに重要なことには、それらが長期にわたってどのように持続するかに、さまざまな程度の影響を及ぼします。
  • いじくり回す時間を見つけましょう。職場でスカンクワークプロジェクトに参加するか、自分の時間に練習してください。これは、新しい知識を実践し、そのようなことがどのように機能するかを確認することにより、読書と連動します。これはまた、あなたのメンターとの良い議論に役立つものです。
  • 取得何か技術的に関与あなたの職場の。これは、プロジェクトまたはフォーラムの可能性があります。物事の新鮮な視点を維持するために、あなたのすぐ近くの仲間の輪の外であなたの理論とアイデアをテストすることを可能にする何か。
  • 我慢してください。獲得経験には時間がかかることを認識し、失敗した理由と場所を知るためにしばらく後戻りする必要があることを受け入れることを学びます。
  • あなたのタスク、あなたの考え、あなたの失敗とあなたの成功の日記またはブログを保管してください。これは必ずしも必要ではありませんが、時間の経過とともにどのように成長し、スキルがどのように成長し、思考が変化したかを確認することは非常に有益であることがわかりました。私は数ヶ月ごとに自分の日記に戻り、4〜5年前に書いたものを見ます。それは私がその時間にどれだけ学んだかを発見する本当の目を見張るものです。また、時々物事を間違えたことを思い出させてくれます。改善に役立つ健康的なリマインダーです。

45
試行および失敗の場合は+1。なぜデザインパターンがあるのか​​理解できないと、そのパターンを効果的に使用できないためです。
メルトアカカヤ

2
+1はすばらしい答えですが、やや不完全であることがわかりました。最も重要な貢献は、リファクタリングに対する非常に良い食欲を持つことだと思います。書いて、理論が述べていること(記事、本、またはメンター)を見て、リファクタリング/リライトし、理論に戻り、リファクタリング/リライトします。これにより、使い慣れたコードで作業しながら、構造に集中する時間ができます。あなた自身の最悪の批評家になりましょう。また、自分の作品を絶えず再訪するために、この食欲を決して失わないことが非常に重要だと思います。
vski

1
@vski含めることのできる概念はたくさんありますが、問題は、それらの概念自体が、OPが自分を改善されたデザイナーと見なすために必要な経験を獲得するための合理的な道筋を提供するかどうかです。私の答えの範囲では、リファクタリングを実践と考えています(2番目のポイントに従って)。クリーンコード、テストファースト、BDD、および他の多くの概念の実践も同様です。私は、時間をかけて得られた経験と知識をもとに、設計スキルが出現し成長する点まで発展するために必要な多くのスキルと経験があるというアプローチをとりました。:)
S.ロビンズ

2
メンターを得るための+1。理想的には、メンターにコードレビューを行ってもらいます。他の人にコードを読んで批判してもらうと、より良い、よりクリーンなデザインになると、本当に役立ちます。
レオ

2
「試してみました。これまでに失敗しました。問題ではありません。もう一度試してください。再び失敗します。---サミュエル・ベケット。
ピーターK.

16

まあ、この種の質問には黄金のリンゴはありません。おそらく、これはすべてのコーダー自身が自分に合ったものを見つけるためのものだと思います。とにかく、ここに私の見解があります。

あなたは主題に関する本を読むことができました。素晴らしい本。素晴らしい本。しかし、これらの本が役立つのは、アプリケーションを構築して設計しようとして失敗した場合だけです。

私にとって、それはすべて経験です。新人として始めたとき、デザインの方法に関する本を読みました。私は当時の内容の多くを理解していませんでした。仕事を始めて自分でアプリケーションを設計しなければならなかったとき、非常に面倒なアプリケーションを作成しました。彼らは働いたが、維持するのは苦痛だった。それから私はそれらの本を再び読みました-そして今度はそれらをよりよく理解しました。

今、私は新しい間違いを犯し、古い間違いから学び続けています。


10
ここには、呼び出す価値のある素晴らしいポイントがあります。新しい間違いを続けてください。同じ古い間違いをし続けないでください-それらから学び、何か新しいことをしてください。
ベヴァン

11

設計をやめて、コードのリファクタリングを学びます。継続的かつ積極的なリファクタリングによる漸進的な開発は、どのような先行設計よりもはるかにクリーンな最終製品をもたらします。


2
創意工夫は美しいものですが、規律がなければ「創発スパゲッティ」を作成するリスクがあります。前もって設計することの問題は、人々がそれをすべてか無かの提案と見なし、物事が悪くなったときに悪い評判を与えることです。これは、デザインが重要だというジョエルの記事の 1つを思い出させます。必要なのは、時間、リソース、そしてきれいなコードを介して美しいサポートデザインが有機的に出現する機会を奪うことなく、デザインを変化させるのに十分です。
-S.ロビンズ

@ S.Robins:OPは、TDDと継続的なリファクタリングで非常にうまく完了するのに十分なほど小さいプロジェクトをまだ攻撃していると感じました。したがって、彼はより複雑なプロジェクトにどれだけのデザインが必要かを知るために必要な規律を学ぶことができます。
ケビンクライン

それは事実かもしれないと思ったが、純粋に出現するものよりも「先行する設計」が潜在的に悪化するという意味に反論する価値があるかもしれないと感じた。ただし、OPが求めている必要なエクスペリエンスを構築する方法は、最初は設計についてあまり気にせず、代わりに十分にファクタリングされたクリーンなコードを書くことに集中することです。:-)
S.ロビンズ

リファクタリングが常に最良の設計につながることに同意しません。もちろん、多くの場合、リファクタリングによって問題を調査して理解することができますが、リファクタリングによって優れた設計が常に段階的に現れるとは限りません。時には、はるかに優れたソリューションがあり、現在のコードがそこから遠く離れているため、リファクタリングよりも書き直しの方がはるかに高速であることがわかります。
ジョルジオ

私は最近この経験をしました:リファクタリングとリファクタリングを繰り返し、同じ問題を何度も繰り返しました:イテレータを使用して何かをコーディングし、コードは複雑になり続けました。それから、イテレータを忘れることにし、コードの多くを書き直さなければなりませんでしたが、ロジックは以前よりもずっと明確で簡潔になりました。これを「積極的なリファクタリング」と呼ぶかどうかはわかりません。アプリケーションの全体的な構造は変更されませんでしたが、一部の基本的な部分は破棄され、ゼロから書き直されました。
ジョルジオ

7

確かにパターンについて読んでください、しかし何よりもまずアンチパターンについて読んでください。アンチパターンを認識することは重要であり、なぜそうすべきなのかよりも、なぜこのような方法ですべきでないのかを理解するのは簡単です。

たとえば、http://sourcemaking.com/antipatterns/software-development-antipatternsを参照してください

要件が変更された場合に迅速に調整できるようにコードを記述します(実稼働環境では非常に一般的です)。

「もう1つ小さなハック」を追加することについては非常に懐疑的です。ここにもう1つ、そこにもう1つ、コードは保守不能になります。

値がオープン/クローズの原則を

テストを記述します(TDDなど)。実際に実装する前であっても、設計を熟考する必要があります。

オープンソースプロジェクトのコードを参照します(つまり、適切なサイズのプロジェクト)。かつては、非常に多くのレベルの抽象化が見られることに驚いていました。今では、芸術のために芸術ではないことを理解しています。このようにした理由があります。


4

良い設計のために私が非常に重要だと思う原則の1つは、分解です。クラスが大きすぎる(たとえば、300〜400行のコード)場合、それを小さなクラスに分割します。メソッドが大きすぎる場合(たとえば、50行を超えるコード)、メソッドを分解します。プロジェクトに50を超えるクラスが含まれている場合は、それを分解します。

重要な点は、システムのサイズを推定し、いくつかの抽象化レイヤー(サブシステム、アプリケーション、プロジェクト、モジュール、クラス、メソッドなど)を構築することです。


1
あなたの提案にはいくつかのメリットがありますが、コード行は実際には重要ではありませんが、動作は重要です。メソッドが複数の処理を実行している場合は、おそらくリファクタリングの時間です。その1つのことが、自分自身で1つのことを行うメソッドを呼び出し、それらをつなぎ合わせるだけであれば、それで問題ありません。
ジャー

1
@jer:もちろん、これは経験則です。他の100個のメソッドを呼び出すメソッドは、あなたが言うように、ただ物事をつなぎ合わせるだけです(サブ関数のリストを呼び出しています)。私はいくつかの実際のロジックを含むメソッドについてもっと考えています。メソッドが何をしているのかを理解するために前後にスクロールしなければならない場合、それは通常悪い兆候です。多数のメンバーを持つクラス定義を見ると同じことです(そして、クラスは単なるプロパティの大きなフラットコレクションではありません)。
ジョルジオ

「プロジェクトには50を超えるクラスが含まれています。分解してください」は深刻ではありません
動的

@ yes123:アイデアを与えることを意図していた。開発しているもの、言語などに大きく依存します
ジョルジオ

これは、(リファクタリングしているので)先行設計には役立ちませんが、将来の設計を改善するパターンとベストプラクティスを学ぶのに役立つことに注意するのが賢明だと思います。
クレイグボビス

0

難しいですが、私たちが実際に話しているのは、より良いコードを作成するのではなく抽象化する能力ですが、2つのことがあなたをより良くし、1つがあなたを幸せにします:

「良い」

A)できる限り最高のデザイナーを見つけて、プログラムをペアリング/デザインを一緒に行います。問題に対処する際に彼らが考えていることを説明するように依頼し、「それがちょうどいいと感じている」ことに落ち着かないで、掘り続けてください。そのプロセスは「メンタリング」パーティにも役立ちます

B)すべてを個々の俳優およびそれらの間の会話として想像してください。各アクターには単一の役割/責任があり、それらのグループは異なるシステムを処理します。その会話がうまくいき、各俳優が首尾一貫した、まとまりを感じるなら、あなたはあなたの道にいます。

そして「幸せ」

C)最善を尽くしても、まだうまくいかない場合は、一部の人ができないことを受け入れることに何の問題もありません。タイトで素晴らしいコードを書くことはできますが、設計や設計はできません。だから何?私はタフィーのために物理的なスポーツをすることができません、私は見栄えがよくなく、私の車の運転は平均より良くなることはありません。自分の得意なことを楽しんで活用しましょう。


-1

私の個人的な経験では、他の人を読むコードは「インスピレーション」の良い源です。他の人のデザインを理解し、なぜ彼/彼女がそのように物事をするのかを自問することを意味しますか?

研究用の多くのオープンソースプロジェクトを見つけることができます。

とにかく練習が必要です。


-1

恐れて生きるな

シンプルさを目指して

ユーザーの意見を聞く

たくさんのアイデアを試してください

何かを作成し、それを改善する

価値を高めるものに取り組み、そうでないものを捨てる


-1

適切な質問をすることを学ぶ。多くの場合、問題を別の角度から見て、設計を改善します。特に、これは、手元の問題の解決に集中することから離れ、複数の関連する問題を解決するソリューションをさらに検討するのに役立ちます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.