プロジェクトの開発中に頻繁に再設計しているのは悪い兆候ですか?


39

私が最初にプログラミングを始めたとき、私はいつか座ってすべてのクラスのUML図をスケッチすることでプロジェクトを開始するポイントに到達し、それに固執するだろうと思いました。私は数年前からプログラミングをしていますが、そのようにはなりません。プロジェクトを進めていくと、よくこう言っています

  • 「ねえ、そうするためにクラスが必要です_ _。それまでは考えていませんでした。」
  • 「待って、この関数は本当にこのクラスではなくそのクラスにあるはずです。私はそれを移動します。」
  • 「これは実際には1つではなく2つのクラスになります。分割します。」
  • 「これら3つのスタンドアロンクラスをすべて1つの抽象クラスから継承する必要があります。」
  • 等、その他。

このようにデザインをやり直しているのは悪い兆候ですか?これは私が貧しいプログラマーであることを意味しますか、それとも普通ですか?

回答:


41

これは開発の通常の部分です。Continuous Designの 2つの中核となる原則は次のとおりです。

  1. あなたは全知ではなく、あなたが始める前に最初から最後までシステム全体を知ることはできません。
  2. デザインは静的ではありません。これは、プロジェクトが長い間使用されており、現在解決しようとしている問題が、最初に作成されたときに解決していた問題ではない場合に、より一般的です。

この問題に関する私の個人的な見解は、マクロ設計については十分に理解しておく必要があるが、マイクロ設計は進化させるべきだということです。それを表現する別の方法は、高レベルの設計(UML /モデリングツールを使用する限り)は、ほとんどの場合、プロジェクトの存続期間中、かなり静的なままです。どのメソッドが何を行うかの詳細な設計とクラス階層は、自由に順応できるようにする必要があります。

あなたが本当に解決している問題について多くを知らないとき、あなたはより多くの最初のミスステップをするでしょう。ただし、十分な長さの作業を行った後は、全体的な設計が適切に整定し始め、話しているリファクタリングだけでコードを整頓することができます。


3
+1、だから私はいつも人々がオブジェクトをデータベースにシリアライズすることを口にするのを嫌がるのです->そして明日、クラスが複数の部分で爆発した場合、古いコードを保持せずにどうやってデシリアライズしますか?コアクラスを自由に進化させることができ、シリアル化/逆シリアル化層を適応させる必要があるProtobufの代替(ストレージ/メッセージ交換専用のクラス)が非常に好きです。
マチューM.

@Matthieu-データベースの移行を記述します。書き込みとテストに1時間以上かかることはめったにありません。Ruby on Railsには、データベース移行のための非常に優れた機能があります。
ケビンクライン

1
@kevin:私たちが推測するのと同じデータベースはありません。私のデータベースには数億行が含まれています。移行はオプションではありません
マチューM.

+1-あなたが間違いを犯したと認めることができないほど誇りに思う/頑固であることは良いことではありません。あなたの過ちを平気の兆候と認める人もいますが、ほとんどの人はそれを尊重します。そして、深刻な過ちに対処する戦略が間違いであることを否定することであるなら、その二番目の過ちは致命的である可能性が非常に高いでしょう。
Steve314

12

あなたがしていることは、一般的に「リファクタリング」と呼ばれています。あなたがそれをやめたなら、あなたは困っている。

実際、ほとんどのコードは複雑であり、人間は、たとえかなり賢い人であっても、一度にすべてを理解することはできません。


10

いいえ、あなたはYAGNIをフォローし、与えられた例からリファクタリングしているようです。あなたは、もう一度何かを考えないよりも、この優れたソリューションを持ち、それを実行できる方が良いと思いませんか?

通常、アジャイルソフトウェア開発には、これに対応するための手法がありますが、これはウォーターフォールモデルとはまったく異なります。


5

それはまったく問題ありません(これらの再設計が常に大幅なオーバーホールまたは最初からの再構築でない限り)。心配しないで。プロジェクトの開始時にUMLダイアグラムから始めるのは良いことですが、作業中に物事が変化することをほとんど常に発見するので、石に彫らないでください。あなたは時々ことができ、初期設計中の未知数がある、あなたは初期設計時のかかわらない持っていたことな方法でいくつかの機能をimroveしたい場合、初めにビジネス要件の変更を知らなかったという新しい技術を学ぶことだけが後で説明されるなど

重要なことは、彼らがデザインの大幅な変更、(自分を含む)他の将来の開発者を反映するように非常に混乱してしまう可能性があり、それらの初期のUMLドキュメントを移動して、更新することです。これは難しい場合があり、多くの場合、優れた専門性(および時間)が必要です。

設計から始めて、実装まで100%遵守することは非常まれです。私は個人的にしている決してそのようなことは非常に小さく、些細なプログラムを除き、起こる見られません。


6
ステップ1:UML図を作成します。ステップ2:コードを記述します。ステップ3:UMLダイアグラムを捨てて、誰もそれを見ないようにし、コードが実際にどのように機能するかについて混乱するようにします。
-kubi

4

あなたがしていることは完全に正常です(毎回完全に最初からやり直しているわけではない場合)。私は20年以上これに取り組んできましたが、それはまだ反復的なプロセスです。

すべてを前もって設計し、それにこだわることができるのは、前回解決したのとまったく同じ問題を解決している場合であり、それでも改善の余地を見つけることができます。


2

私は決して経験豊富な開発者ではありませんが、私もそうしています。過去数年間で、必要なアーキテクチャを精神的に構築する私の能力は大幅に向上しました。ただし、ソフトウェアを作成するときは、いくら計画を立てても、多少の再設計が必要な場所が常にあります。コードが実際に書かれるまで自分が繰り返されることに気づかなかった点。

この投稿の私のポイントは、リストのすべてを行うことであり、それらが絶え間なく発生し、生産性に本当に悪影響を与えない限り、それらのことは必ずしも悪いとは思わないということです。


0

それは反復プロセスと呼ばれ、すべての最新のソフトウェア開発手法の基本的な概念です。

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