コメントのない汚いコードを整理しますか?


22

ダーティコードについていくつか質問をしたいと思います。中規模のプロジェクトでコーディングした初心者もいます。コードは非常に大きな泥の塊です。彼らは上級プログラマーではありません。彼らは、Javaについてキーボードの使い方を少し知っているだけです。メインクラスに12,000行のコードを記述しただけですが、6000行はNetBeans自体に属します。

私の仕事は、コードを分析し、コードを維持する良い方法を提案することです。私のアイデアは、プロジェクトを廃棄し、OOP方法論で新しいプロジェクトを開始することです。最近、このサイトや他のいくつかから、問題に関するメモやアイデアを集めました。

今、私は次の質問があります:

  1. コードを修復し、OOPに変更する必要がありますか?現在、デバッグ中です。
  2. コードにはコメント、ドキュメント、プログラミングの特定のスタイルなどがありません。それを変更することは本当に高価で時間がかかります。これについて何ができますか?
  3. すべてのルール(コメント、OOP、優れたコード品質など)に従うように指導するにはどうすればよいですか?
  4. コードに誤りがあり、エラーが発生しやすい。私たちは何ができる?テスト?修正用に2〜3枚のA4ペーパーを作成しますが、終わりはないようです。

私は彼らとは新しいと言わなければなりません。同様に、プロジェクトへの参加が遅すぎるというルールを破ったと思います。私は彼らを去らなければならないと思いますか?


これは2つまたは3つの質問に分割する必要がありますが、現時点では広すぎます。
ジョンホプキンス

2
このプロジェクトはバージョン管理下にありますか?
JBRウィルキンソン

2
現在のコードは生産中ですか?
ジェフ

はい、ジェフ。これは、生産、財政問題を管理するための管理プロジェクトです!
サリバン

申し訳ありませんが、JBRはそのようなことを聞​​いていません。コピーペーストのコピーをハードディスク全体に作成するだけで、バージョン管理を実行できます。
サリバン

回答:


36

ステップ0:SCMへのバックアップ

JBRWilkinsonがコメントで示唆したように、バージョン管理は(不可逆的な)災害に対する最初の防御線であるためです。

ソフトウェア構成の詳細、成果物を作成する手順などもバックアップしてください。

ステップ1:最初にテストする

次に、テスト記述することから始めます

  • 何のために
  • そして失敗したもののために。

何をすることにしたとしても、あなたはカバーされます。次のいずれかを実行できます。

  • 最初からやり直し書き直し
  • または修正します。

私のアドバイスは、一般的なアーキテクチャを最初から開始することですが、混乱からチェックポイントを検証する部分を抽出し、必要に応じてこれらをリファクタリングすることです。

ステップ2:確認と監視

継続的インテグレーションシステム(ステップ0およびステップ1を補完するため)と継続的インスペクションシステム(ステップ4の準備のため)をセットアップします。

ステップ3:巨人の肩に立つ

(いつものように...)

ステップ4:クリーニング

そのようなことは言うまでもありませんが、自分でコードをざっと調べる代わりに、壊れたコードベースでリンター/静的アナライザーやその他のツールを実行して、設計と実装のエラーを見つけることができます。

次に、コードフォーマッタを実行することもできます。これは、すでにハウスキーピングに少し役立ちます。

ステップ5:レビュー

リファクタリングやクリーンアップを行うことで、小さなバグを簡単に導入できます。間違った選択とキーのクイックヒットだけが必要で、最初は気付かないうちにかなり重要なものを削除する可能性があります。また、場合によっては数か月後に効果が現れることもあります。もちろん、上記の手順はこれを回避するのに役立ちます(特に強力なテストハーネスを実装することで)が、何がすり抜けることができるのか、また何がすり抜けるのかがわかりません。したがって、リファクタリングは、少なくとも1つの他の専用の目玉(および、できればそれ以上)でレビューしてください。

ステップ6:開発プロセスの将来性

上記のすべてを取り、それがあなたの通常の開発プロセスの固有の部分になります(まだそうでない場合)。時計でこれが再び発生しないようにし、チームと協力してプロセスにセーフガードを実装し、ポリシーで(可能であれば)これを実施します。生産作るクリーンなコードの優先順位を。


しかし、実際には、テストします。たくさん


素晴らしい提案-問題をキャッチできるテストがあれば、どんな損害を与えても問題ありません。もちろん、私たちは皆、バージョン管理が既に行われていると想定しています。
JBRWilkinson10年

@JBRWilkinson:実際には良い点です!確かに、彼らがやったと完全に仮定した。
ヘイレム

2
最初にバージョン管理を開始してください。決して遅くないほうがいい。
ジェフ

@ジェフO:はい、すでに答えに追加したものです。
ヘイレム

編集後に明確にするために書き直しました。左の帰属:)
ヘイレム

15

個人的には、「レガシーコードを効果的に使用する」のコピーが手元にあるまで、このプロジェクトを開始しませんでした。真剣に、それはまさにこのタイプのことのために書かれました。トリッキーなコードを扱うための戦略が豊富にあり、ここで説明するよりもはるかに詳細に説明します。


1
+1は、すべてを語る広範な外部参照を使用するためのものです。
ヘイレム

残念なことに、ここでは人々は本を読むことについて全く知りません。動作するプロジェクトを開発するだけで十分です。私はあなたが言及した本を読み始めました。そして、CODE COMPLETE 2も読み始めました。それらが素晴らしく書かれていると言わせてください。
サリバン

1
@サリバン-おそらく、そのような本を読む価値があると納得させる人が誰もいなかったのでしょう。唯一の場合は、そのような本を読んで興味を持った彼らと働いていた人...があった
ジェイソン・ベイカー

1
@サリバン-重要なことは、1つか2つの素早い勝利を見つけることです。ほぼ即座に見返りがあるようなことをしてください バージョン管理と同じように、次に誰かが「どうしてそれが起こったのか」と言ったときに調べることができます。次に、WELCのコピーを読んでからいくつかの提案を導きます。本を投げるだけではいけません。

2
@Salivanあなたは彼らのために本を読んで、アドバイスとして彼らにコンテンツをドリップフィードすることができます。あなたはチームの第一人者になるかもしれません。
MarkJ

8

何度か行ったことがあります。私のルールは次のとおりです。ソフトウェアが自明ではなく(使用しているリソースに対して1週間以上動作する)、動作する場合は、それを保持してインクリメンタルリファクタリングを続行します。

ソフトウェアが実際に機能しない場合(非常に多くのバグ、不明な要件など)、最初から書き直す方が良いでしょう。かなり小さい場合も同じです。

リファクタリングのポイント(Fowlerの本とKerievskyの1つhttp://www.industriallogic.com/xp/refactoring/にあるように)は、システムの動作を維持することです。リファクタリングには2倍の時間がかかりますが、リスクはゼロです。

最初から書き直すと、要件の誤解から実装の誤りまで、多くのリスクが生じる可能性があります(ほとんどのチームが同じになった後)。

実際に、複雑な手順がゼロから2回書き直され、まだ期待どおりに動作しないのを見ました。


可能であれば、適切なメソッドの単体テストを作成することもお勧めします。彼らは明らかに役立つコードがされるかを定義しますはずリファクタリングのプロセスを支援しますでしょう最初の場所で行うこと。
マイケルK

2
言うまでもありません...私は、TDDが優れたコード(別名新しいコード)の必要条件だと考えています。
ウベルト

最初から書くことは非常に良い考えです。ただし、最初に作業の図を作成する必要があります。しかし、関係を抽出するためにコードを分析する必要がある場合はどうしますか?その上、プロジェクトのサイズが不可能になるか、他のプログラマーを雇うことになるでしょう。
サリバン

テスト駆動開発を歓迎します!
サリバン

「しかし、関係を抽出するためにコードを分析する必要がある場合はどうしますか?」->これが当てはまる場合、プロジェクトが小さくもなく壊れていないことを意味します。別名リファクタリングを一度に1つずつ始めます。ミカド法も参照してください。 danielbrolund.wordpress.com/2009/03/28/...
Uberto

2

完全に書き直します。そのようなコードを修復することが不可能な場合があります。別のオプションは、新しい機能を追加せずに機能させることです。チームに適切なコード(適切に設計され、文書化され、テスト済み)を作成するように教えるために、現在のコードを修正してもらいます。誰もがバグを修正したり、他の開発者のコ​​ードをレビューしたりできます。いくつかの試みの後、彼らはそのようなコードをレビュー/修正することはほとんど不可能であることを理解します。

後期プロジェクトに人を追加することはほとんどありません。通常、それは期限を破ります。プロジェクトを正常に終了するためにできる限りのことを行ってから、離れることを検討する必要があります。


繰り返し改善する場合と完全に書き直す場合の費用はいくらですか?どのアプローチが結果を最も早く得ますか?
JBRWilkinson

@JBRWilkinsonそれは依存します。作業中のコードがある場合は、反復アプローチが適しています。
デュロス

1
@duros、壊れたコードの場合、はい。このコードは実稼働環境で実行されます。

2

私のアドバイスは、コード全体を完全に廃棄しないことです。これは日常の問題であり、すべての開発チームが直面しています。コードの一部を一度に攻撃します。修正、クリーニング、文書化してください。そして、他の部分に移動します。主なことは、常にいくつかの出荷可能なコードを手元に置いておくことです。スクラッチからコード全体を書き換えると、これまでに費やされた時間がかかり、現在よりも優れているという保証はありません。
しかし、その後、人々はこの方法でコードを書くことを避けるべきです。コードレビューにもう少し時間をかけます。一定のコーディングスタイルに適応します。最初に設計について話し合ってから、コードを記述します。このような単純なことは大きな変化をもたらします。

Netscapeが緩んでいる理由を伝える素敵なブログ


2
新しいプロジェクトを開始し、その間に古いバージョンを更新/デバッグしている間は(これを避けることはできないので、夢見てはいけません)、複数の移動するターゲットで撮影しようとしています。
JeffO

「コードの一部を一度に攻撃する」は機能しませんでした、Manjo。深い悲しみで、コードには多くのエラーが含まれています。それは常に何か他のものに変わります。コードの一部を攻撃および破壊してから、構築する必要があります。私はこの考えをマネージャーに一度提案しましたが、コーダーは新しいコードを書くことから離れる必要があります。
サリバン

@Salivan ... 新しいコードを書くことをやめる必要があります。私は経営陣がこれを言っていると確信しています。しかし、あなたが穴にいるとき最初にすることは、掘りを止めることです(同じ間違いを続けないでください)。これらの条件下でより多くのものを作成できるようにすることは、穴を掘り続けることです。難しい部分は、管理者とコーダーに問題を理解させる方法です。
SeraM 16

1

動作する場合は、リファクタリングします。そのためのツールがあります。動作しない場合は、魔法のコード改善コマンドを使用してdeltreeください。つまり、Windowsの場合です。rm -rfLinuxで。


2
「すべてのコードを完全に消去する」という提案は特に役に立ちません。より建設的な答えがありますか?
JBRウィルキンソン

笑。ammoQ、あなたに完全に同意します!
サリバン

JBRWilkinson:新たな再起動を行うことは、混乱を機能させてきれいにすることよりも、おそらくより良いアプローチです。私が働いていた会社はそれを試みましたが、毎年、彼らは多くのリソースを浪費し、どこにも行きませんでした。
user281377

@ammoQ、間違った場合に実際に何をしたかを見るには古いコードが必要です。

1
Thorbjorn:動作しないコードについて話してますよね?正しいことをしないコメントされていない汚いコードを分析すると、その作成者の精神状態について他の何よりも多くのことがわかります。
user281377

1

コードを修復し、OOPに変更する必要がありますか?現在、デバッグ中です。[...エラーが含まれていますが、ドキュメントはありません...]

私はそこにいました、あなたは私の同情を持っています。私はこれについての記事を書きました。しかし、要するに:

コードに多くの重複が含まれている場合は、書き直す必要あります。識別できる構造がない場合(明確なインターフェース、スパゲッティがない場合)、リファクタリングは失敗し、おそらく書き直す必要があります。

すべてのルールに従うように彼らに教えるにはどうすればよいですか?

彼らが個人的にそれから得ることができるものを彼らに示すことによって、彼らがそうすることを望むかもしれない理由を説明することから始めてください。彼らがこれに同意し、学びたいと思ったら、shuhariを使って教え始めます。


ありがとう、マーティン。「個人的にそれから得られるものを見せることによって、なぜ彼らがそれをしたいのかを説明することから始めます。彼らがこれに同意し、学びたいと思ったら、shuhariを使って教え始めます。」
サリバン

0

私の提案は、@ durosと@Manoj Rの回答の組み合わせです。

ゼロから始めて、今回は良いコード/ OOP /コメント付き/などを作成することを念頭に置いて、古いコードから参照/コピー&ペーストします。古いコードの悪い部分に出会ったら、それらを書き直し/リファクタリングします。

開発者が十分な訓練を受けていない場合は、コースに参加することをお勧めします。急速に変化するIT業界での定期的な再トレーニングに重要

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