web-dev-qa-db-ja.com

コードは書けますが、うまくデザインできません。助言がありますか?

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

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

これは、トップコーダーやプロジェクトオイラーのようなプロジェクトでもあまり役に立たないと思うところです。数学の問題解決能力を向上させるかもしれませんが、あなたはアカデミックプログラマーになるかもしれません。ナイスでクリーンなものにもっと興味があり、日常の日常にはまったく興味がなく、ほとんどのアプリケーションプログラマーが扱う毛深いものに誰か。

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

83
user396089

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

実際の近道はありませんが、経験を積んでいる間に問題が手に負えなくなるのを避けるためにできることがいくつかあります。

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

まあ、この種の質問には黄金のApple=はありません。おそらくこれは、すべてのコーダー自身が彼にとって適切なものを見つけるためのものだと思います。とにかく私の見解です。

あなたcouldこの件に関する本を読んでください。素晴らしい本。素晴らしい本。しかし、これらの本は、アプリケーションの構築と設計を試みて失敗した場合にのみ役立つと思います。

私にとっては、すべてが経験です。私が新人として始めたとき、私はデザインする方法についての本を読みました。当時は内容があまりわかりませんでした。私が仕事を始めて、自分でアプリケーションを設計しなければならなかったとき、私は非常に厄介なアプリケーションを作りました。彼らは働きましたが、維持するのは大変でした。それから私はそれらの本をもう一度読みました-そして今回はそれらをよりよく理解しました。

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

16
Amadeus Hein

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

11
kevin cline

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

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

要件が変更された場合にすばやく調整できるようにコードを記述します(これは、運用環境では非常に一般的です)。

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

オープン/クローズの原則

テストを記述します(TDDと同様)。彼らはあなたが実際にそれを実装する前でさえ、あなたにあなたのデザインを熟考することを強います。

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

7
Konrad Morawski

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

重要なのは、システムのサイズを見積もり、いくつかの抽象化レイヤー(サブシステム、アプリケーション、プロジェクト、モジュール、クラス、メソッドなど)を構築して、コードをそれらの間の明確な関係といくつかの依存関係を備えた理解可能な単位に分解できるようにすることです。

4
Giorgio

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

「良い」

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

B)すべてを個々の俳優およびそれらの間の会話として想像してください。それぞれのアクターは単一の役割/責任を持つ必要があり、それらのグループは異なるシステムを処理します。その会話が機能し、各俳優がまとまりがあり、まとまりがあると感じたら、あなたはあなたの道を進んでいます。

そして「幸せ」

C)あなたが最善を尽くしてもそれがまだ起こらないなら、一部の人々が何かをすることができないことを受け入れることには何の問題もありません。タイトで見事なコードを書くことはできても、設計や設計を行うことはできません。だから何?私はタフィーのために身体的なスポーツをすることはできません、私はよく見ていません、そして私の車の運転は平均より良くなることは決してありません。あなたが得意なことを楽しみ、活用してください。

0
Stuart Muckley