他のチームメンバーのコードを書き換える、書かれていないルール[終了]


40

私たちは集団コードの所有権を実践しています。私の理解では、これは開発者がコード行を変更して機能を追加したり、バグを修正したり、バグを修正したり、設計を改善したりできることを意味します。

しかし、まだチームにいる開発者からのコードの完全な書き換えについてはどうでしょうか?最初に彼に尋ねるべきですか?ベストプラクティスは何ですか?


5
ソース管理を使用する場合、必要な場合にコードを削除しても害はありません。この質問に対する他の回答は、他の誰かのコードを削除することの倫理を非常によく説明しています。
匿名

9
これは[優れた]回答のいずれにも具体的に言及されているとは思いません。既存のコードが書き換えに値するとしても、今動作していれば、書き換えに時間[お金]が無駄になりそうです。私は、多くのシナリオで手っ取り早い方法が道であることを学びました。あなたはコードを書くために支払われるので、あなたは可能な限り効率的であるべきです。数回しか実行されないものに対しては、適切に設計されたフレームワークは必要ありません。貧弱な設計手法を使用して1日で実行できたはずの処理を1週間で実行したくありません。多くの場合、マネージャーはこのアプローチを好みます。
タズ

9
@taz-これは泥のビッグボール(laputan.org/mud)パターンの基盤です。
マシューフリン

@MatthewFlynn-すばらしい記事。「泥の大玉」というフレーズは何度も登場し、アラン・アイバーソンの「実践」(youtube.com/watch?v=eGDBR2L5kzI)のデジャヴ体験のように感じました。;-)
ハッピーグリーンキッドナップ

3
より多くのコンテキストが必要です。コードを変更する理由、変更の範囲-作業時間、日、週、月。誰が変更にお金を払っており、本当に必要なのか。誰が変更の必要性を承認しますか。あなたは何を処理しており、どのようにそれがひどく失敗したので、この混乱に取り掛かりましたか?
-mattnz

回答:


62

良いコミュニケーションは常にベストプラクティスだと思います。開発者に相談して、それがそのままの形でコーディングされている理由があるかどうかを確認します。それは彼らが何年も前に戻ってそれをリファクタリングすることを意味していたかもしれない、それは彼らが非常に正当な理由でそのようにしたかもしれない、あるいはあなたが二人とも会話から何かを学ぶことができるかもしれない。

事前の連絡なしに行って書き直すことは悪意のレシピです。


1
うん、私は経験から、尋ねずにコードのバグを修正した場合でも、一部の開発者が非常に興奮することがあることを学びました。もちろん、これは問題追跡やタスクプランニングのないプロジェクトに関するもので、出荷されたことさえすごいです。
ふわふわ

「開発者に話」のための+1は-私たちは、お客様が今期待し...そして、これまでのところ、私は漠然と知っていただけだったことを埋設されていることを(おそらくよりも、少なくとも一つの、)バグ持って、なぜそれが残っていたが一人で。
イズカタ

3
私は原則として「良いコミュニケーション」に反対しませんが、この答えは少し些細なことだと思います。どのような状況でこの質問が出されるのかという面倒な質問をすべて割り引いて、開発者がコードを書き直すべきか?」という質問にはい」またはいいえ」と答えるかどうかは、まったく問題ではありません、それは必ずしもチームまたは製品のどちらにとっても最適な答えになるとは限らないからです。確かに、元の仮定と決定についてできる限りすべてを発見しようとする必要がありますが、OPがまだそれを行っていないことをどのようにして知ることができますか?
アーロンノート

2
@Aaronaught-最初の開発者に最初に質問するかどうかという質問は、OPがまだ最初の開発者と話をしていないため、可能な限りすべてを発見しようとしていないことを意味します。私は答えが些細なことの反対であることを願っています-それは基本です。
マシューフリン

1
実際に集合的なコードの所有権を実践している場合、適切と思われるコードを変更、書き換え、または削除する権利があります。これは、ペアプログラミングを行う場合に特に当てはまります。さて、特定の人が書いたコードの大幅な変更(書き換えなど)の前に、それについて話し合うのが賢明だと言った。私が見たほとんどの場合(自分のコードを含む)、彼らの反応は、「ああ、そうです。ごめんなさい。そのコードは災害です。私はちょうどそれをしませんでした。実行してください!」
ジェフグリッグ

35

この質問のまさに前提は、既存の答えのどれもが適切に対処しようとしているとは思わないという多くの懸念を私に生じさせます。ここでいくつかのフォローアップの質問をさせてください:

  1. あなたはリファクタリングではなく書き換えについて話していることを絶対に肯定的に確信していますか?定義により、外部の動作を変更せずに改善された(または単に異なる)実装をもたらすコードスタイルまたは構造の変更、書き換えではなくリファクタリングです。モノリシックな500行のルーチンを50個のサブルーチンのセットに分割するには、かなりの量の新しいコードを書く必要がありますが、それは書き換えではありません。書き換えという用語は、製品または機能全体を破棄し、最初からやり直すことを意味します。それは軽く取られるものではありません。

  2. 元のコードの動作が非常に間違っている場合、または実装が本格的な書き直しを必要とするほどバグがある場合、チームのプロセスに捕らえられず、適切なコンテキストで(つまり、技術的にではなく)対処されなかったのはなぜですか?不良または疑わしいコードは、テスト、コードレビュー、設計レビューなどを通じて健全なチームに迅速に公開されるべきです。これらはありますか?

  3. マネージャー/技術リーダーは問題を認識していますか?プロセスの種類に関係なく、コードの品質は通常、開発マネージャーの責任です。彼または彼女は、あなたが尋ねるべき最初の人です-明らかに「そんなにくだらないコードを書いた」という文脈ではなく、単に「ここに大きな問題があると思います。書き換えについて話してもいいですか?」この種の議論が正当化されない場合、おそらく書き換えも正当化されないのでしょうか?

  4. 問題のあるコードのサイズと範囲が書き換えの深刻な議論を正当化するのに十分な大きさである場合、なぜそれが1人の開発者によって独占的に所有されているのですか?私がコードを見て「書き直し」を考えたときではないにしても、ほとんどの場合、それは何十人もの異なる人々によって踏みにじられており、その悪さはスタイルの矛盾、誤ったまたは変更された仮定、古き良きの蓄積の直接的な結果です-昔ながらのハック。コードは、所有権が共有されているため、時間の経過とともにいばらになります。

    ここでの私のポイントは、集団所有権を実践していると思われる環境で、ある人がこのような大量のコードを所有するのは奇妙だということです。他の人はこの開発者のコ​​ードに触れることを恐れていますか?彼らは主題を持ち出すことを恐れていますか?おそらく、あなたのグループのダイナミックな根本的な問題、またはこの開発者の具体的な問題があります。ある場合は、無視しないでください。あるいは、このプロジェクトに取り組むのは初めてかもしれませんがもしそうなら、なぜゲームの早い段階で書き換え考えているのですか?状況についての何かが私にとっては合わないようです。

  5. 質問は、最初の段落で述べていany developer can change any line of code to add functionality, to refactor, fix bugs or improve designsます。リライトはウィルではないこれらの事を行いますか?それとも、何かのでしょう余分を -もしそうなら、何?基本的に、何しているの書き換えをやりたいと思っためのあなたの理由は、あなたは、彼らが製品やチームに利益をもたらすだろうとどのように確信していますか?あなたは私のために答える必要はありませんが、チームとそれを議論することを選択するかどうか、そしていつ選択するかについて、いくつかの客観的なポイントを持っている方が良いでしょう。

この質問には膨大な量の文脈が必要であり、その文脈を非常に明確に理解せに答えるべきではないと本当に感じています。「正しい」答えは、チーム、製品、組織、性格、プロセス、元のコードの範囲、変更の範囲などに完全に依存します。これは、IMOであり、オンラインQ&Aサイトではなく、チームで絶対に取り上げる必要がある問題です。


3
+1このディスカッションの唯一の正解。
-mattnz

集団コード所有権(およびペアプログラミング)を使用したXPチームでの私の経験では、システムの一部の設計または「書き直し」に対する大きな変更は、通常、ほとんどのチーム(気にする人)との議論を伴います。重要なコア機能を備えた既存の設計は、チームがその時点で実行できる最高のものです。簡単に変更できない場合は、誰もが考えるべきことや、改善できるさまざまな方法について全員のアイデアを得ることが役立ちます。コンセンサスが得られない場合は、情報を収集するための「スパイク」または実験を試してください。
ジェフグリッグ

11

なぜコードを編集しているのですか?

バグはありますか、それともより基本的な設計上の欠陥ですか?

前者の場合、コードのマイナーなバグを修正するための書き直しが心配です。

後者の場合、「自分の」コードが書き換えられる可能性があるというヘッズアップを期待していましたが、それが実現することは完全に幸せです。

それが集合的なコードの所有権のポイントです-あなたが書いたコードは、より良いものが出てきた場合に修正したり置き換えたりするためのものです。


3
これは、私が同意できる唯一の答えです。何かを書き換える必要がある場合は、書き換えます。私は元の作者が誰なのか見たくさえありません。どして私がこんな事に?テストが(そこにあると仮定されているテストは?右)、およびその目的と仮定すると合理的に明らかであるか、コメントでは説明(ない場合は、それは間違いなく行く必要があります)私は何も壊れてしまった場合、その後、私はかなり迅速に知っていますよ。もちろん、フレームワーク全体ではなく、いくつかのクラスの書き換えについて話していますが、書き換えがそれほど大きい場合は、共有所有権の問題というよりもスケジューリング/プロジェクト計画の問題です。
アーロンノート

6

一般に、コードにすべての責任があることに同意する場合、コードが改善されていればコードを書き換えても構いません。最初に礼儀として他の開発者と話し合ってください。特定の方法で書かれている正当な理由があるかもしれません。個人的なレベルでは、多くの開発者は自分が生産するものに感情的に投資します。

具体的には、チームのダイナミクスにある程度依存します。ジュニア開発者のコ​​ードを書き直そうとしている上級開発者は、単純に書き直す前に、おそらく彼らとコードレビュー(私のサイト)を実行する必要があります。そのようにして、ジュニア開発者は状況から学ぶことができます。


5

元の開発者がチームに所属しているかどうか、あるいはあなたが元の開発者であるかどうかは、実際には関係ありません。完全な書き換え任意の共有コードは次のような理由から、あなたのチームによって実行されなければなりません。

  • かなりの時間がかかります。他の誰かが関連する変更に取り組んでいる場合、時間を無駄にしたくありません。
  • 他の人々は異なる視点を持っています。20年プログラミングしていても、めったに触れないコードとのやり取りについて他の人が知っているかもしれません。
  • 他の開発者は、ソースコードの「顧客」です。ソースコードは、他の開発者が読むことができるように書かれています。それらには、アーキテクチャ要件、スタイルに関する入力、またはそのコードで必要としていた機能要求がありますが、時間がありませんでした。別の方法でリファクタリングする必要がある別の開発者を見つけるためだけに、リファクタリングを終了する必要はありません。

4

マシュー・フリンが言ったように、最初に開発者と話す必要があります。最初の開発者は、機能について重要なことを伝え、このソリューションまたはそのソリューションが提供された理由を説明する場合があります。

ただし、コードをリファクタリングまたは再作成する前に、そのコードを含むバックアップまたはブランチを作成してください。古いコードが正常に機能する場合、復元される可能性が残ります。

ソース管理システムを持っている場合(私はあなたが持っていると思います)、可能であれば、コード全体をリファクタリングし、その後のみ、正常に動作することが確認できたら、チェックインします。

少なくとも新しいコードが正常に機能することを確認するまでは、古いコードを削除しないでください。しかし、古いコードを永久に残しておくのも良いことではありません。テストに合格した1か月後など、しばらくしてからコードを削除することをお勧めします。


2
「しばらくしてコードを削除することをお勧めします」-その間、どこに留まるべきですか?コメント付きブロックで?これは、現在のソースコードをクリーンな状態に保ちながら、変更/削除されたすべてのコードのバックアップコピーを簡単に取得できるようにするためのソース管理の目的です。
dj18

@ dj18、私は通常、コードをより明確にするためにしばらくコメントを付けておき、コードを扱うすべての人がコードが一度に変更されたことを確認できるようにします。また、コードを編集したばかりの場合、この方法で簡単に検索できます
-superM

1
これは、適切なバージョン管理システムのもう1つの機能です。変更がチェックインされた時期を表示し、バージョンを比較して、あるチェックインから次のチェックインへの変更を正確に確認し、コメントがチェックインに関連付けられて、変更が行われた理由を説明できます。他の開発者がコードの一部が変更されたことをすぐに知ることが非常に重要な場合は、他の開発者があなたのコメントを得るのを待つのではなく、おそらく電子メール通知を送信してください。
dj18

2
この回答が元の開発者から取得する必要があるという知識は、コード内、または少なくとも付随するコメントまたはドキュメント内にある必要があります。これが重要な情報である場合、それは誰かの脳内でサイロ化されるべきではなく、開発ポリシーはこれを奨励すべきではありません。また、古いコードを削除してみませんか?本当に必要な場合は、元に戻すことができます。それがリビジョン管理の目的です。
アーロンノート

1
@Aaronaught:私はsuperMは何だと思う意味一種「ここにドラゴン」であった、または「教訓」と言って。経験豊富なプログラマーにとって落とし穴はかなり明白なはずですが、微妙な選択はそれほど明白ではなく、十分に文書化されていないかもしれません。(これらは対処する必要がある悪い兆候であることに同意します。)
rwong

2

それの範囲は何ですか?

  • より効率的にするために数行をやり直している場合は、それを行ってください。微妙な振る舞いを消してしまう危険性があるかどうか尋ねてください。本当に些細な(タイプミスを修正する)場合を除き、スクラム中または変更が完了したら電子メールで変更を報告します。

  • 適切なサイズのクラスを作り直す場合は、おそらく設計/動作を理解しているかどうかを確認する必要があります。同じエリアで働いているかもしれない誰でもあなたと気づき、調整できるように、事前に人々に知らせてください。

  • 大規模なシステムを作り直す場合は、チームと協力して変更を認識させ、設計を計画する必要があります。


1

あなたの元の作家がそこにいる場合、彼らと通信します。あなたが知らないケースや状況がある場合に備えて、エチケットのためだけではなく、追加情報のために。時には、彼らはあなたに何か貴重なことを伝えるでしょう。

ひどいコード制御があります。現在、レビューとメンテナンスが必要なものが山ほどあり、コードレビューを行う人すらいません。以前のライター(moiを除く)は、コードをコメントすることを気にしませんでした。そして、彼らは会社を去りました。コードについて尋ねる人はいません。

書き直すときは、コメントアウトしたコメント、コメントアウトした日付、名前/イニシャル、およびコメントアウトした理由をコメントアウトします。名前やイニシャル、日付、理由が追加されたなど、新しいコードをコメントします。

追加のコメントがパッケージヘッド(通常は)で作成され、どの関数/プロシージャ/ SQL /などが示されます。日付とともに変更されました。変更されたセクションを簡単に検索でき、それらのセクションには完全なドキュメントがあります。

コメントは安いです。日付は、何が変更されたかを示す指標であり、x日後(日数/改訂数/新規採用者数/退職者数)にコードから古いコメントを削除でき、残りは新しいベースラインになります。


1

私の観察から、一般的なプラクティスは次のとおりです。コードを削除しないでください。コメントアウトして保管してください。

私の練習は、交換しながらコメントアウトすることです。(主に参照用)。次に、作業中の変更の最後のコミットで削除します。(これには、バージョン管理と、変更を元に戻す方法の理解が必要です。)

古いコメント付きコードを見つけたら、適切なコメントを付けて別のコミットで削除しようとします。これにより、必要に応じて変更を元に戻したり検査したりしやすくなります。

すべての変更について、改訂履歴を使用して、コードを作成した開発者を決定できる必要があります。(注釈付きの改訂履歴がここで役立ちます。)可能であれば、連絡して、コードがそのままの理由を確認してください。多くのプロジェクトでは、クリーンアップ時間は発生せず、物事は取り残されます。バグトラッカーをチェックして、必要なクリーンアップの記録があるかどうかを確認します。場合によっては、リリースを1〜2回クリーンアップする必要があります。

コードを変更する場合は、そのコードで作業している理由があるはずです。元の開発者に問い合わせて、コードがそのようなものである理由を確認してください。修正しない正当な理由がある場合は、修正されなかった理由、または修正すべきでない理由を説明するコメントを追加します。これにより、次の開発者の時間が節約されます。

FixMe、ToDo、Bug、Hackなどのタグを使用して、後で変更できるコードを示すことができます。(制限をバグとしてタグ付けし、必要な条件下でトリガーされない場合は修正しないことは許容されます。)ホームアカウンティングプログラムが2000万ドルでオーバーフローした場合、バグになる可能性がありますが、修正に多くの時間を浪費しませんそれ。

コードを変更することが適切な場合は、元の開発者がコードレビューの変更を行う必要があります。


2
「最後のコミットで削除する」と表示されるまで、これをほぼ断念しました。
ジョシュアドレーク

1

おそらく、書き換えが必要な理由に依存します。書かれたものに問題があり、常に問題があったためである場合、将来コードを修正する必要がある頻度を最小限にするためだけに、それについて話すことが求められます。

この場合の私の提案は、コードを修正するときペアにすることです。このように、中間状態の良い例を提供し、(できれば)書き換えられたコードが優れている理由に関するコンテキストを提供します。また(個人的な演習としてのみ)、完全に書き直さずにコードをリファクタリングしてみてください。難しくなりますが、あなたにとっては良いことです。

一方、リライトが必要になるのは他にもいくつかあります。

  • チームは、コードが書かれてから多くのことを学びました。コードを書いた開発者は、あなたの入力がなくても、今とは異なる方法でそれを書くでしょう。

  • 新機能の要件により、ターゲットを絞ったミニリライトが適切になるように状況が変わります。

これらの場合、私はおそらく会話を気にしません。

それについて考えると、コードが長く存在するほど、会話が必要になる可能性は低くなるように思えます。


1

@aaronaughtはいくつかの良い点を示したと思いますが、それは本当に私が与えたかった答えにつながります。つまり、誰が変更を加えたのか(そしてなぜ)誰がコードを書いたのかによって異なります。

私の個人的な経験では、コードは通常、意図したとおりに機能しないか、実際に機能するものを拡張する必要があるために変更されます。

チーム開発環境では、元のコーダーと話す必要はありません(できなくてもかまいません)。コードからすべてを明確にする必要があります。

それは私の時間のほとんどを消費する質問につながります。これは元のプログラマーが意図したものであり、それが最も頻繁にコードが削除される原因となり、なぜすべてをコメントする必要があるのか​​、そして経験の浅いジュニアプログラマーが最も多い場所ですしばしばファウルになります。

他の人のコードを変更(リファクタリング)するプログラマーは、礼儀と練習の問題として、既に配置されているコードの同じコーディングスタイルをコピーし、最初に元のコードがどのように機能し、何をしようとしているかを把握するための手順を実行する必要があります達成し、実際に達成します。多くの場合これはそれ自体でバグを特定しますが、確かに、次の人があなたのコードを見ている痛みに耐えることを人々に強います。

私のチームでは、誰でも何かを削除、リファクタリング、または書き換えることができます。私は「所有権」を怠nessを生む慣行と考えています.1人の人が変更の通知を確実に受け取るように、なぜ彼らはコードを読みやすくする必要があるのでしょうか?

つまり、いや、あなたはコードの元の作者に尋ねる必要はないはずです、そしてあなたがするコードを見ると、それは彼のコードが十分に読めないか、改善する必要があるかの兆候ですあなたの技術。ただし、書き直しの際に必要な機能を誤って削除しないことが確実になるまで、元のコードをそのままにしてコメントアウトしておくのが良いと思います。誰も完璧ではありません。


-2

多くの場合、コードはある理由で特定の方法で記述されます。著者に変更を伝えることは、常に最善を尽くします。

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