コードをクリーンアップするために定期的な時間をスケジュールすることは良い考えですか?[閉まっている]


42

私は小さな開発者チームを管理しています。コードをクリーンアップするために、1〜2日を費やすことにします。

コードベースをクリーンアップするために、2か月ごとに1週間などの定期的な時間をスケジュールすることをお勧めしますか?


9
最初に、問題追跡ツールでクリーンアップを必要とするすべてのものの登録を開始したいと思います。トラッカーに記録された問題を分析すると、特定のプロジェクトに最も適切なアプローチについて、より良い(はるかに良い)アイデアが得られる可能性があります
-gnat

4
コードレビューの
l46kok

1
「クリーンアップ」と言うときはどういう意味ですか?コードのふりをしたり、すべてのFIXMEおよびTODOタグを処理したり、すばやく作成されたコードのパフォーマンスを向上させたりしますか?または、他の何か?これらはいずれもクリーンアップとして分類できますが、それぞれに異なる優先順位を付けます。
ポール

別の「人気が高すぎるので閉鎖」、ええ、みんな?
MGOwen 14

回答:


100

番号。

作業中に修正します。

  • 作業中のビットをリファクタリングするのを待つと、それについて多くのことを忘れてしまい、もう一度慣れるために時間を費やす必要があります。
  • 要件が変更されたために、決して使用されない「ゴールドメッキ」コードになることはありません。

2
この答えに私のお金..
ソナーゲヌル

2
優れた答えのために+1。あなたは、要件が変更されたため、終了するまでは使用していない決してことを「金メッキ」コードを終了しません
メリーランドマババー・ラーマン

8
完璧な管理と均一に優れた開発者のチームによる完璧なプロジェクトで、この答えは成り立ちます。残念ながら、私はこの業界での10年間で、そのようなプロジェクトを見たことも聞いたこともない。
ベン

3
これを試してみてください。ただし、できない場合(時間的なプレッシャーや、単に正しい方法がわからないために発生します)、チケットシステムでチケットを作成します。そうすれば、最終的に問題を引き起こし始めたときだけでなく、問題がまだ心に残っている間に問題に戻ることができます。
サリアン

1
これは良いアドバイスだと思いますが、尋ねられた質問には対応していません。Haivngは恐ろしいコードベースでチームを管理しました(私がそこに着く前は恐ろしかったです)。リファクタリングと特定の機能のクリーンアップに取り組むのに非常に時間を費やしました。私たちはそれらをインフラストラクチャプロジェクトと呼び、可能な限りすべてのスプリントに取り組みました。多くの場合、これらのものは別の変更の一部ではないアイテムですが、チームが問題領域として特定したものでした。四半期ごとに回顧を行い、このリストを定期的に更新しました。
ビルリーパー

21

私個人の意見:プロジェクトの90%には絶対に必要です

特に販売に大きく左右されるプロジェクトの場合、通常、すべてのリリースに新機能を含めることは大きな推進力になり、必然的に自分のより良い本能を妥協し、あちこちでいくつかのクラッジ/ハックを導入しなければなりません。

最終的には、これらの小さな妥協によって十分な「技術的負債」が生じ、コードベースの欠陥を回避するためにかなりの時間を費やし、その潜在能力を最大限に活用することができなくなります。

通常、この方法で生成される問題には2つのタイプがあります。

  • 簡単に修正できますが、システムに影響を与える可能性のある小さなパラメーター、たとえば、不適切な名前のパラメーター、不完全なエラー処理など。コードブロックの外では、通常は影響がほとんどありません。これらに対処する最善の方法は、コードのレビューと、コードの作成/変更中のチェックです。他の人が述べたように、これらのエラーを修正するために特別なリファクタリングサイクルを用意する必要はありません。
  • 仕様が不完全であったり、設計の決定が不十分であったり、2人の開発者/チームが同じ問題に対して2つの異なるソリューションを作成したりして生じた大きなもの。これらは一般に修正がはるかに困難であり、修正するために協調した努力が必要です。結果として、それらは通常、永続的な迷惑になるまで延期されます。これらの種類の問題を修正するには、専用の時間が必要です。

私は通常、3〜4サイクルごとに純粋なリファクタリング/バグ修正サイクルの時間を確保しようとしています。私は常に、開発者がコードベースにも不満を感じているときはいつでも教えてくれるように頼みます。すべての開発者がクリーンアップ作業に取り組む必要があるわけではありません-通常(常にではありませんが)チームを少しずらすことができるため、常に1つのチームのみがクリーンアップに取り組んでいます。


1
大きなプッシュの増加がアジャイルの問題であると理解していません。
ジェフ

2
@JeffOいいえ、アジャイルの問題ではありません。これは管理上の問題です。私が見たものから、販売に大きく影響されている企業は、積極的なリリースサイクルと大規模な機能セットに引き寄せられる傾向があります。アジャイル戦略は、これらの企業にアピールする傾向があります(本当に戦略に従うかどうか)。私はアジャイル開発が好きですが、私の経験では、会社が「アジャイル」と呼ばれると、通常、コードベースにかなりの量の技術的負債があると期待できることを示しています。
-pswg

方法論がまったくない場合は、自分が望むものを何でも呼び出すことができます。アジャイルは現在の流行語であるため、最も魅力的です。ウォーターフォールプロジェクトに参加してからしばらく経ちました。それは他の多くの点で非常に大きな災害だったので、私はそれを方法論に対する議論として決して使用しませんでした。
ジェフ

どんなプロジェクトでも、アジャイルであろうとなかろうと、コードをリファクタリングしてクリーンアップすることは、技術的な負債を常に最小限に抑えるために、あなたが行っているようにあなたがすることです。見積もりでそれを考慮しない場合は、それを開始する必要があります。あなたはそれを修正するためにすべてを停止する必要があるまで、技術的な負債を発生させることはできません。代わりに、スカウトのルールに従います:「常に、あなたが見つけたよりもコードをきれいにしておきます。」
クリストファーハン

私の経験では、経験豊富なチームはスクラムから始めて、適切なコーディング原則(XPなど)を遵守せずに、機能(ストーリー)に集中しすぎることがあります。代わりに、コードが十分に「良い」までストーリーは完成しないと言うべきですが、誰もが迫り来る締め切りの下でそうするのに十分なバックボーンを持っているわけではありません。また、アジャイルを使用すると、短時間で期限が長くなる傾向があるため、アジャイルメソッドにも関連付けますが、アジャイルは原因ではないことを完全に認識しています。
markijbema

11

チェックイン(Subversion)またはメイン開発ブランチ(Git)とマージする前に、開発者にコードを整頓してもらいます。

私は彼らに次のことをさせます:

  • 無関係なコメントを削除する
  • メソッド、引数、変数に適切な名前が付けられていることを確認してください
  • クラスに構造があり、アイテムが必要に応じてカプセル化されていることを確認します
  • リファクタリングして読みやすくし、コードのにおいを減らします

大規模なプロジェクトの場合、開発ブランチからメインブランチにマージする前に、コードが正式にレビューされます。

「献身的な時間」とは、それが延期されたり、関与する作業量のために延期されたりすることを意味すると思います。開発者にチェックインごと(JIRAでの変更要求/問題に相当)にそれを実行させることにより、はるかに管理しやすくなります。


好奇心から:なぜ2つの異なるVCSを使用しているのですか?
Eekhoorn

2
移住期があった/ある。現在、ほとんどのSVNリポジトリを移行しました。いくつかのコンテキストで両方に言及しました。
サム

これが私がすることです。機能を改善するためにコードに戻った場合、チェックインの前にコードをクリーンアップし、リファクタリングします。
Barfieldmv

1
これは、製品チームからの機能要求の一部ではないかもしれない領域に潜んでいるそれらのしつこい問題に対処しません。
ビルリーパー

9

私の意見ではありません。技術的な負債に遭遇してからそれを修正するまでの間に時間をかけすぎると、問題が何であるかのコンテキストを失います。修正に時間がかかり、さらに悪化する傾向があります。最も重要なのは、「1週間のクリーンアップ」ではないため、人々は壊れたウィンドウを離れます。

個人的には、以前にスプリントでいくつかを作成したことがわかっている場合は、各スプリントの技術的な負債のクリーンアップについて交渉します。それは人々の心に負債を新鮮に保ちます。リファクタリングが容易になるように、問題のコードを使用するコードの量を制限します。技術的な負債が積み重なるのを防ぎます。そして、開発者が何かを一緒に平手打ちするのをやめるのに役立ちます。なぜなら、私は彼らに次のスプリントをすぐにやらせるつもりだからです。


2番目の文は最初の文と矛盾しています。あなたはノーと言ったが、その後、あなたはこれらの種類のものをすべてのスプリントに取り入れると言った。方法でそれを行う時間をスケジュールしています。
ビルリーパー

2
@BillLeeper-エン 「通常の時間」と聞くと、クリーンアップ作業を行うための一定の間隔があることを意味します。IMO、それは間違っています-常にクリーンアップ作業を行うのに適切なタイミングです。
テラスティン

1
良い点は、定期的な時間がうまく機能しないことに同意します。あまりにも頻繁に優先順位が、それはなどをキャンセルさせ
ビル・リーパー

4

ただし、但し書きを付けて、間違いなく「はい」と言います。頻繁に、できれば毎週行うべきです。定期的な定期的なコードレビューと、コードレビューから出てくる項目に実際に対処することは、非常に迅速に報われると思います。pswgの答えをご覧ください

2か月ごとに1週間では十分ではないことは間違いありません。これは、あなたの質問に「いいえ」で答えた他のほとんどの答えに語ります。これらの答えのほとんどの要点は、あまりにも長く待つとコードに触れることができなくなり、通常は修正/クリーンアップ/リファクタリングにはるかに時間がかかることです。


このために「テクニカルデットチューズデイ」を行います。その途中でイスラエルの労働週間が
ザカリーK

1

時々コードを追加することを意図しているかどうかはそれほど明確ではありません。そういう意味で、はい。私たちが従うことは何であれ、常にいくらかの劣化が起こります。

そもそも正しいことを行わない言い訳として使用しないでください[SOLID原則、関連する単体テスト、検査などを適用する]。


1

現在の2つの人気の「いいえ」「はい」の答えは、同じ真実の2つの側面だと思います。OPは、個人としてだけでなく、彼が管理しているグループについて話していることを思い出してください。グループ内のすべての開発者が、簡潔で読みやすいコードを書くのに十分な規律があるとは考えられません。そして、外部からのプレッシャーとアジャイルスタイルの方法論の問題があります。また、人々の最善の努力があっても、スタイルの違いは、離れているときにはきれいであると考えられるが、他の人と一緒に考えると汚れているコードを書くことを意味します(奇妙なインターフェースは言うまでもありません)。

一方、「作業中に修正する」というのは、私の意見では理想的なものです。次の方法でコードをさらに「修正」することができます

  • 慎重なピアCRing
  • コード自体と一緒に単体テストを書く
  • コーディングガイドラインの採用
  • 自動フォーマッターとリンターを使用(ただしYMMV)

今、OPのチームが上記を採用し、コードレビュー中や定期的なコードクリーンアップセッション中に部下を励ます場合、落とし穴を予測し、事前にさを回避しようとすると、時間の経過とともに、クリーンアップ時間。(そして、彼らはその時間を文書化、より深いリファクタリング、そして彼らが書いて統合したものの知識共有に費やすことができました。)


1

通常のウォーターフォールスタイルのプロジェクトのタスクであっても、アジャイルプロジェクトのストーリーであっても、定期的な時間をスケジュールすることは非常に良いと思います。時間を設定することは、スケジュールに組み込むだけの価値はありません。これにより、プロジェクトに遅れているため、スケジュールの一部として終わらせることができます。

莫大な量のコードの借金を抱えるプロジェクトを管理していたので、これらを定期的に実施することが、物事を円滑に進めるための鍵となりました。私たちのもののいくつかは大きく、いくつかは小さかった。

この種の作業を数か月行った後、運用チームのリーダーは、すべてがスムーズに実行されていることを教えてくれました。

各アイテムはそれほど多くないように見えるかもしれませんが、すべての借金と同じように、それは宣伝されます。


1

理想的な答えは「いいえ」です。これが必要になるのを避けるために必要なステップを踏むからです(すでに述べたいくつかの理由で、クリーンアップしてください)。

これは最終的には目標かもしれませんが、これを実際に実行するにはほど遠いチームがあるかもしれません。

マネージャーは何らかの責任を負わなければなりません。常に開発者のせいではありません。マネージャーは一つのことを言うことができますが、彼らはプロジェクトを終わらせ、悪い慣行を促進する提案をするようにプッシュし始めます。彼らは文字通り「後で掃除する」と言うかもしれませんし、うまくいけばそれで十分です。

これが重要であることを示すために、特定の時間を捧げることから始める必要があるかもしれません。チームが(指定されていない)コードをクリーンアップできることがわかったら、それをより頻繁に組み込むことができます。

最終的には、時間を設定する必要はありません。

個人的に、私は新しい問題を解決し、物事を整頓しようとしながらそれを機能させることに苦労しています。私はそれで良くなっていますが、しばしば意図的な休憩を取り、物事をきれいにします。それは私にとって異なる考え方です。最終的には、堅実な習慣が習慣になります。


-1

いいえ、コーディング中にこれを行う必要があります。TDDを使用している場合、これはリファクタリングと呼ばれます。コードを修正してクリーンアップするのに1〜2か月待つときの問題は、コードのすべての部分を覚えているわけではないため、コードの動作を変更できることです。

何かを動作させるために必要なコードを最初にコーディングすることに基づいたリファクタリングをお勧めします。そして、動作するとすぐに、再設計、最適化、およびきれいにします。


これは、TDDを使用しているかどうかにかかわらず、リファクタリングと呼ばれます。この質問は、TDDとは何の関係もありません...
ベン・リー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.