25

私たちのコードは最悪です。実は、はっきりさせておきます。私たちの古いコードは最悪です。デバッグするのは難しく、ほとんどの人が理解したり覚えたりすることのない抽象化でいっぱいです。ちょうど昨日、1年以上働いてきたエリアで1時間デバッグをして、「うわー、これは本当に痛い」と思っていました。それは誰のせいでもありません-最初はすべてが完全に理にかなっていると確信しています。最悪の部分は通常、それはただ機能します...あなたがその快適ゾーンの外で何もするように頼まないという条件で。

私たちの新しいコードはかなり良いです。私たちはそこでたくさんの良いことをしていると思います。それは明確で、一貫性があり、(うまくいけば)保守可能です。継続的インテグレーションのためにHudsonサーバーを実行しており、単体テストスイートの始まりが整っています。問題は、私たちの経営陣が新しいコードを書くことに焦点を合わせていることです。古いコード(または古い新しいコード)にTLCを与える時間はありません。いつでも、スクラムバックログ(6人の開発者用)には約140のアイテムがあり、約12の欠陥があります。そして、それらの数はあまり変化していません。燃え尽きるのと同じくらい速く物を追加しています。

では、オールドコードの奥深くに潜むマラソンデバッグセッションの頭痛の種を避けるために何ができるでしょうか?すべてのスプリントは、新しい開発と見事な欠陥でいっぱいになっています。具体的には...

  • メンテナンスとリファクタリングのタスクが機能するのに十分高い優先度を得るのを助けるために私は何ができますか?
  • 新しいコードがすぐに腐敗するのを防ぐために採用しているC++固有の戦略はありますか?
4

10 に答える 10

22

あなたの管理は、機能する機能を製品に取り入れ、それらを機能させ続けることに集中しているかもしれません。この場合、古いものをリファクタリングするためのビジネスケースを作成する必要があります。時間と労力をX投資することで、期間Zにわたって必要なメンテナンス時間をY削減できます。または、管理が根本的に無知である可能性があります(これは、ただし、ほとんどの開発者が考えているほど頻繁ではありません)。その場合、許可を得ることができません。

あなたはビジネスの視点を見る必要があります。コードが醜いかエレガントかはエンドユーザーにとって重要ではなく、ソフトウェアが何をするかだけです。悪いコードの代償は、潜在的な信頼性の欠如とそれを変更することのさらなる困難です。それがプログラマーに引き起こす感情的な苦痛はめったに考慮されません。

参加してリファクタリングする許可を得ることができない場合は、いつでも自分で少しずつ試すことができます。バグを修正するときはいつでも、物事をより明確にするために少し書き直してください。これは、特にコードが機能することを確認する場合に、可能な限り最小限の修正よりも高速であることが判明する場合があります。そうでない場合でも、通常、問題を起こさずにバグ修正にもう少し時間をかけることができます。ただ夢中にならないでください。

入るたびにコードを少しだけ良くすることができれば、それについてずっと気分が良くなるでしょう。

于 2010-09-01T14:39:11.460 に答える
12

スタンドアップミーティング

私は私の整備士に行くかもしれません、そして私達は朝に少しスタンドアップミーティングをします:

ホイールを揃え、タイヤを回転させ、オイルを交換したいと彼に言います。「ちなみに、途中でブレーキが少し柔らかく感じました。ブレーキを見ていただけませんか?仕事に戻る必要があるので、どれくらい早く車を取り戻すことができますか?」

彼は私の車の下に頭を下げ、元に戻って、私のブレーキがオイルを漏らして故障し始めていると言います。彼は午前10時30分に到着する部品が必要になります。彼の男は昼食前に終わらないでしょう、しかし私は午後1時30分かそこらまでに私の車を取り戻すべきです。彼はしっかりと予約しているので、今日は他のことをすることができなくなります。私は別の予定を予約する必要があります。

私は彼が他のことをすることができるかどうか尋ねます、そして私はブレーキのために戻ってきます。事故の原因となる可能性があるため、ブレーキを固定せずに車を運転させることはできないとのことですが、別の整備士に行きたい場合は、けん引を依頼することができます。

車は昼食後すぐに完成するので、1時間早く車を取り戻すことができるように、彼の男性が遅い昼食を取ることができるかどうか尋ねます。

彼は、彼の部下が午前8時にやって来て、しばしば夕方まで働くと私に言います。彼らは彼らが得るすべての休憩を稼ぎます、そして彼の男は他のみんなと彼の昼食を取るに値します。

そのどれも私が聞きたかったものではありません。ホイール、タイヤ、オイルを片付けて、30分でそこから車で出て行くと聞きたかったのです。

私の整備士はまっすぐで私に正直でした。あなたはまっすぐであなたの経営陣に正直ですか?それとも、彼らが聞きたくないことを彼らに話すのを避けますか?

ユニットテスト

理解できないコード行には触れず、徹底的にテストしなかった新しいコード行をチェックインしませんでした。(少なくとも、意図的にではありません。)

あなたの質問は、文書化されていないコードの大規模なコーパスが、単体テストなしで過去のレビューを行ったことを意味しているようです。多分あなたはそれに参加しました、そして多分あなたはしませんでした。関係者全員が、管理を含め、その責任を受け入れる必要があります。とにかく、行われたことは行われます。戻って変更することはできません。

しかし、今のところ、そもそも問題の原因となった行動をやめるのは、みんなの責任です。あなたは、理解するのが難しく、単体テストがないコードで1年間働いたと言います。その年の間に、理解を深めるために一生懸命働いたときに、文書化してその理解を検証するために、いくつの単体テストを作成しましたか?

コードをゆっくりと理解するのに苦労したので、次回苦労する必要がないように、コメントをいくつ追加しましたか?

スクラムバックログ

個人的には、「スクラムバックログ」という用語は誤称だと思います。やるべきことのリストはただのリストです-あなたがそうするなら買い物リスト。整備士に行ったときにリストがありました。メカニックとのスタンドアップミーティングは、実際にはスプリント計画ミーティングでした。

スプリント計画会議は交渉です。あなたの経営陣がその交渉なしでタイムボックスを組んでいる場合、彼らは何も管理していません。彼らは単に10ポンドのたわごとを5ポンドの袋に詰め込もうとしているだけであり、そう言うのはあなたの責任です。

スプリント計画会議に出席するときは、一連の作業に取り組むことが期待されており、その準備をするのはあなたの責任です。準備とは、リストの各項目を完了するために何をしなければならないかをある程度理解することを意味します。これには、あいまいなコードを理解するのにかかる時間や、単体テストを作成するのにかかる時間も含まれます。

準備する時間がない計画会議に誰かがあなたを招待した場合は、会議を辞退し、時間があるようにいつ再スケジュールするかを提案します。

単体テストのない既存のコード本体があり、機能がそのコードの動作に影響を与える可能性がある場合は、影響を受ける可能性のある古いコードの単体テストを作成する必要があります。あなたが機能を書くことを約束するとき、あなたはその仕事をすることを約束しています。それでも他の機能にコミットする時間が少なすぎる場合は、そのように言ってください。他の機能にコミットしないでください。

欠陥を修正することを約束するとき、あなたはあなたの仕事をテストすることを約束します。明らかに、それは欠陥の単体テストを書くことを意味します。ただし、単体テストのない古いコードが含まれている場合は、まだ壊れていないものの単体テストを作成することも意味しますが、変更によって破損する可能性があります。他にどのように修正をテストしますか?

欠陥リストが一定のサイズのままである場合、チームは修正された分だけ後退します。ユニットテストが現在欠陥リストの縮小を妨げている回帰を防ぐことを理解する必要がある人に丁寧に説明してください。

あまりにも多くの機能にコミットしているためにそれらの単体テストを作成できない場合、その責任は誰にありますか?

リファクタリング

コードをリファクタリングするときは、すべてをテストする必要があります。つまり、すべてのコードの単体テストを作成する必要があります。単体テストのない大量のコードがある場合は、リファクタリングする前に、それらの単体テストをすべて作成する必要があります。

これらの単体テストが実施されるまで、リファクタリングを延期することをお勧めします。それまでの間、コミットする作業の見積もりに単体テストを含めることを主張すると、最終的にはそれらすべての単体テストがそこになります。そして、リファクタリングできます。

その唯一の例外は、テスト容易性のためのリファクタリングです。一部のコードはテスト用に設計されておらず、単体テストを作成する前に、依存性注入などをリファクタリングする必要がある場合があります。単体テストを必要とする機能を作成することを約束するときは、コードをテスト可能にすることを約束します。機能にコミットするときに、それを見積もりに含めます。

コミットメント+責任=力

あなたはあなたが無力だと言います。あなたが責任を受け入れ、必要なことをすることを約束するとき、私はあなたがあなたが必要とするすべての力を持っていることに気付くと思います。

PS単一の欠陥を修正するときに、誰かが「時間を無駄にする」複数の単体テストを書くことに不満を持っている場合は、80:20の法則でこのビデオを見せ、「欠陥クラスター」を頭に入れてください。

于 2010-09-01T17:21:00.920 に答える
2

あなたが提供する情報から多くを知るのは難しいです。新しいコードを書く論理的な理由は、古いコードを置き換えることです。それがあなたがしていることであるならば、古いコードを捨ててください。

ショートッパーの欠陥があるのも古いコードですか?もしそうなら、彼らはどこから来ていますか?古いコードには「showstopper」の欠陥はなく、通常は停止に近づくだけです。結局のところ、これは古いコードです。すぐに調べなければならないものではなく、同じ古い欠陥と同じ古い制限があるはずです。Showstopperの欠陥は、新しいコードの欠陥です。古いコードでは活発な開発が行われているようです。

古いコードの上にこの新しいコードをすべて書いていて、一度修正する予定がない場合は、申し訳ありませんが、忙しくて自分を掘り下げることができない場合にできることはたくさんあります。

後者の場合。自分がどこに向かっているのかを認識し、少し離れてみてください。あなたが周りにいることを計画しているなら、それは最終的にすべて崩壊するでしょう、価値のある戦いのためにあなたの力を救ってください。

それまでの間、いくつかのデザインパターンをピックアップしてみてください。少なくとも古いものから新しいコードを保護するのに役立つものがいくつかありますが、それでも、最終的には悪いコードに対して良いコードを書くのは難しいです。

そして、あなたのスプリントの音はおそらく混乱しています。全体的な方向性はありませんか?それはあなたが持っているバックログの量を決定するはずですが、物事は月ごとに変わる可能性がありますが、最終的な目標に向かって進む明確な感覚はありませんか?

そして、新しいコードの腐敗?それを防ぐ方法は、意味のあるデザイン、意味のある方向性、そして仕事の質とデザインのビジョンの両方に取り組む質の高いチームを持っていることです。あなたがそれを持っているならば、規律は品質を維持するものです。申し訳ありませんが、基本的には目的のないコードを書いていました。それは基本的につるで腐っていました。

批判的ではなく、正直にしようとしているだけです。深呼吸する。徐行。あなたはそれを必要としているようです。ここに書いたものを見てください。何も言わない。あなたはリファクタリング、スクラム、ショートッパー、欠陥、古いコード、新しいコードについて話します。それはどういう意味ですか?それはすべてごちゃ混ぜです。

「新しいイニシアチブとレガシーシステム」についてはどうですか?「最新の理解などの観点から、初期のスプリントサイクルコードをリファクタリングする必要があります。」実際、「現在のエンタープライズイニシアチブの初期のコンポーネントはリリースされていますが、問題が発生しており、新しい開発のために時間の予算がありません」。

これらは意味のある概念になります。あなたは私たちに何も与えていません。激しいと思います。私のスプリントもクレイジーです。多くの要件を前もって取得できなかったため、多くのback; pgアイテムを追加します(私の新しい要件の多くは、外部の規制機関とも競合する必要があるためです。通常のビジネスプロセスが常に利用できるとは限りません。 )。

しかし同時に、私はやらなければならないことの大きさとそれをする時間に悩まされています。バックログに追加されるものはすべてそこにある必要があります。クレイジーですが、同時に、自分がどこにいたのか、どこに行く必要があるのか​​、そしてなぜ道路がより困難になるのかについて、非常に明確な考えを持っています。

一歩下がって、考えを明確にし、同じことを理解してください-あなたがどこにいて、どこに向かっているのか。あなたがそれを知っているなら、それは確かに明白ではないからです。同僚が理解できることを何も伝えられない場合、ビジネスマネジャーとどこまで連絡を取りますか。

于 2010-09-01T14:05:10.297 に答える
2

古いコードは常に最悪です。KernighanやThompsonのような名前の人によって書かれたまれな例外がおそらくいくつかありますが、典型的な「オフィスで書かれたコード」のものについては、時間の経過とともに悪臭を放ちます。開発者はより経験を積むことができます。継続的インテグレーションなどの新しいプラクティスは、ゲームを変えます。ものは忘れられます。新しいメンテナはデザインを把握できず、書き直しを望んでいます。したがって、これを通常どおり受け入れるのが最善です。

役立つかもしれないいくつかのランダムなもの...

  • それについてあなたのチームと話し合ってください。(明らかな理由で)「古いコードがダメだ」を避けながら、あなたの経験と懸念を共有し、コンセンサスが何であるかを確認してください。あなたはおそらく一人ではありません。
  • あなたのマネージャーを忘れてください。彼らをこのレベルの詳細にさらさないでください-彼らは新しいコードと古いコードについて考える必要はなく、おそらく彼らがそうするかどうかを理解しないでしょう。これは、チームが取り組み、必要に応じてPOに認識させるための問題です。
  • 物を捨てることができるかもしれないという可能性に心を開いてください。その古いコードのいくつかは、おそらく、使用されなくなったか、そもそもユーザーが採用できなかった機能に関連しています。これを機能させるには、実際にレベルを上げて、コードが実際にユーザーまたはビジネスの価値を提供する場所と、決定を下す勇気がないだけの大きな泥だんごの場所について考える必要があります。あえて挑んだ者が勝つ。
  • アーキテクチャの一貫性についての見方を緩めます。どこかで新しいコードを使用して動作中のシステムを利用する方法は常にあります。これにより、既存のものを壊さないように古いものを十分に長く保持しながら、新しい、よりスマートなアプローチにゆっくりと移行できる場合があります。

全体として、この種の状況で勝つことは、コーディングスキルではなく、賢明な選択と人間の側面の処理についてです。

お役に立てば幸いです。

于 2010-09-02T20:12:31.407 に答える
1

「古いコード」に関連するバグとコード変更の数を追跡し、次のチーム会議でマネージャーまたは他の開発者に提示することをお勧めします。これが手元にあれば、「古いコード」をリファクタリングして「新しいコード」と同等にするために、さらに多くのことを行う必要があることを彼らに納得させるのに十分簡単なはずです。

また、「古いコード」の中で最も理解しにくい部分を文書化することも賢明です。これらは、承認を得たら最初にリファクタリングする必要がある「古いコード」の一部でもあります。

于 2010-09-01T13:50:20.277 に答える
1

試してみる:クラスを-たとえば-最悪の10%、最高の10%、その他にグループ化します。「次の四半期のバグの大部分は最初のセットで見つかると予測しています」と言って、リストを経営陣に提出します。長さ、循環的複雑度、テストカバレッジに基づいて、便利で快適なツールは何でも。それから座って見てください-そして正しいことを。これで、ある程度の信頼性が得られ、「不正なコードを改善し、バグやメンテナンスコストを削減するためにリソースを投資したいのですが、そのエネルギーをどこに投資すればよいかわかります」と言うと、ある程度の信頼性が得られます。

于 2010-09-01T16:11:23.397 に答える
0

上記の優れたアプローチの他に、次の方法も試すことができます。

将来のコードをクリーンに保つため

  • 少なくとも意味のある部分については、ペアプログラミングを試してください。これは、レビューされ、リファクタリングされたコードを実践するための効果的な方法です。
  • 「完了」の定義にリファクタリングしてみてください。その後、それは見積もりプロセスの一部となり、それに応じて割り当てられます。したがって、doneの定義には、コード化、単体テスト、機能テスト、パフォーマンステスト、コードレビュー、リファクタリング、統合(またはこのようなもの)が含まれる場合があります。

古いコードをクリーンアップするには:

  • ユニットテストは、リファクタリングを行い、物事がどのように機能するかを理解するのに役立ちます。
  • 大規模なリファクタリングにはビジネスケースを作る必要があるというコメントに同意します。ただし、小規模なリファクタリングは見積もりに簡単に含めることができ、すぐに利益が得られます。すなわち:私は作品を書き直すのに2時間費やしましたが、とにかくバグを探すのにその時間を費やしたでしょう。

また、プロダクトオーナーとスクラムマスターに、古いコードと新しいコードの別々の速度をキャプチャさせ、それに応じてそれを使用することを検討することもできます。

于 2010-10-13T13:38:34.653 に答える
0

新しいコードがどのように機能し、クラスと関数が互いにどのように関連しているかについての図やスケッチを作成できます。FreeMindまたは多分Diaを使用できます。そして、私はあなたのコードを文書化してコメントすることに間違いなく同意します。私もかつてこれに問題がありました。自分の言語用にJ2MEのフォントクラスを作成しました。これらの理由から、コードにも表示される可能性があるのはひどいことでした。

  • コメントやドキュメントはありません
  • オブジェクト指向が少ない
  • 悪い変数/関数名
  • ..。

しかし、数ヶ月後、私はすべてをもう一度書くことを余儀なくされました。今、私は時々非常に長い意味のある変数名を使用することを学びました。コードを書くよりもコメントを書く。そして、プロジェクトのクラスとそれらの関係の図を使用します。

それが本当の答えだったかどうかはわかりませんが、それは間違いなく私にとってはうまくいきました。また、古いコードの場合、機能を覚えているときに、実際にすべてを読み直してコメントを追加する必要があるかもしれません。

お役に立てば幸いです。

于 2010-09-01T14:58:51.503 に答える
0

プロダクトオーナーに相談してください!古いコードのリファクタリングに時間を費やすと、この障害が取り除かれると、新しい機能でチームの速度が上がるというメリットが得られることを説明します。

于 2010-09-02T11:14:04.673 に答える
0

必要な新機能があり、邪魔になっている圧倒的でないコードの塊を描くことができる場合は、管理者の祝福を受けて、古いコードを目的の新機能を備えた新しいコードに置き換えることができるかもしれません。これを行ったとき、私が触れようとはしなかったソフトウェアの部分の古いインターフェースを満たすために、やや醜いシムレイヤーを書かなければなりませんでした。また、既存のコードを実行し、新しいコードを実行して、シムレイヤーから見た新しいコードが、アプリケーションの残りの部分をだまして何も変更されていないと思わせることができるテストハーネス。再加工した部分を再加工することで、パフォーマンス上の大きなメリット、必要な新しいハードウェアとの互換性、アプリケーションのスペース管理に関する専門知識に対するフィールドサイトの各ニーズの削減、および新しいコードを示すことができました。はるかに保守可能でしたその最後の点はユーザーにとっては重要ではありませんでしたが、やり直しによる他の利点は、やや面倒なデータベース変換のメリットをユーザーに「売り込む」のに十分魅力的でした。

もう1つのより控えめなサクセスストーリー:文字通り何年もの歴史を持つまともなトラブル追跡システムがありました。私たちのアプリケーションのサブシステムは、メンテナンスプログラマーを焼き尽くす速度で有名でした。明らかに(まあ、明らかに私の心の中で)それは大規模な書き直しを必要としていましたが、経営陣はそれについて熱心ではありませんでした。トラブル追跡データの履歴を掘り下げて、このモジュールの保守に費やした人員レベルを示すことができました。そのすべての努力に対して、そのモジュールに対する1か月あたりのトラブルチケットは一定の割合で到着し続けました。そのような実際のデータに直面したとき、そのサブシステムの人員配置のやり直しに長い間固執していた気が進まないマネージャーでさえ、そのモジュールのやり直しにスタッフを割り当てることのメリットを理解できました。

以前のアプローチは、そのモジュールの入力と出力をそのままにしておくことでした。幸いなことに、新しいデータ構造を備えた新しいコードに仮想メモリを投入すると、モジュールのパフォーマンスが大幅に向上しました。悪いニュースは、元の実装の何が問題であるかを実際に理解する前に、再実装がほぼ完了したことです。ほとんどの場合は機能しましたが、一部のトランザクションで失敗する日がありました。最初のカットはそれらのバグを忠実に再現しましたが、バグは作り直されたコードで理解しやすくなったので、実際の問題を実際に修正することに挑戦しました。振り返ってみると、問題を引き起こしたデータをキャプチャし、再加工されたバージョンがその問題を再現しないように細心の注意を払っていたほうが賢明だったかもしれません。だが、真実は、私たちが書き直しをかなり進めるまで、誰も問題を理解していなかったということです。そのため、書き直しにより、ユーザーのパフォーマンスが向上し、現在のプログラマーの理解が向上し、実際の問題を最終的に解決できるようになりました。

失敗の例:しつこく痛い場所であったさらに別の信じられないほど醜いモジュールがありました。残念ながら、少なくとも名目上のリリーススケジュールの時間枠では、この特定の惨めなスカムと極悪のハイブへの事実上のインターフェイスを理解するのに十分なほど賢くありませんでした。もっと時間があれば、システムのその部分を作り直すための適切な計画を見つけることができたと思います。それを理解すれば、ユーザーが望む改善点を特定することもできます。リライト。しかし、私はあなたがすべての箱に賞品を見つけることを約束することはできません。ボックスが完全にわかりにくい場合は、ボックスのチャンクをスライスして、その部分をクリーンなコードに置き換えるのは困難です。そのモジュールを担当した男は、おそらく攻撃の計画を理解するのに最適な位置にいた人です、しかし、彼は頻繁な墜落と現場からの「雇用保障」としての援助の呼びかけを見ました。変化への渇望を持っている人のために彼を脇に置く必要があることを経営陣が本当に認識したことはないと思いますが、それはおそらく必要だったのです。

ドリュー

于 2012-03-12T01:04:32.140 に答える