悪いコードベースでアプリケーションが構築されていることを証明する方法は?


23

私は現在、私の仕事で以前働いていたいくつかの開発者によって構築されたシステムをレビューしています。システムはユーザーの観点からはかなりうまく機能しますが、コードレビューを掘り下げると、まったく混乱します。私は、アプリケーションの構築方法が将来の更新に耐えられず、使用量が大幅に増加することはないと確信しています。

問題は、それがどれほど悪いかは知っているが、上司はそうではないということです。マネージャーにそれを証明して問題を実際に確認し、現在のコードベースで最小限のトリアージを行い、近い将来、アプリケーションの次のバージョンの新しい開発ラインを開始できるようにするにはどうすればよいですか?


6
Programmers.stackexchange.com/questions/59050/… 「大規模な書き直し」を行うのが通常ビジネスの観点からどれほどひどいことに注意するのか。それは、より「上級レベル」のプログラマーが行うことです。
クエンティン・スターリン

22
@qes、「大きな書き換え」を行うことよりも悪いことは、「大きな書き換え」に対する麻痺する恐怖です。現在のポジションを開始したとき、ソース管理、バグトラッキング、またはテストなしで、2、3人の異なるプログラマーからPerl CGIの混乱を継承しました。納得のいくものでしたが、レガシーコードを維持しながらRuby on Railsで書き直す承認を得ました。5か月後、ツールはより使いやすくなり、数か月ではなく数日または数週間で新しい機能を追加できました。ユーザーは熱狂的で、私は気を失っていません。「大きな書き直し」には、完全な回避ではなく、確固たる正当化が必要です。
ジェイソンルイス

1
@JasonLewis:(以前のコメントのリンクをたどっていなかったと思いますか?)1年未満前に、上級レベルが所有する重要なスキルがないと自称している人には賢明ではないようです」新しいプロジェクトを開始するときにどこから始めればよいかがわかりません。
クエンティン・スターリン

5
@JasonLewisあなたに完全に同意します。SEでアプリの書き換えについて誰かが尋ねるたびに、多くの人がこの「大きな書き換えをしないでください」というイデオロギーを持っています。それをしない理由は確かにたくさんあると思いますが、決してそれを避けるべきではありません。私は10万行のコードアプリの書き直しに参加しましたが、多くの成功を収めました。あなたの説明と非常によく似ています。モジュールごとに書き換えることもできました(UIの最初の部分、次にサーバー、次に残り)。12か月後、私たちは非常に満足した顧客ベースを持ち、誰もが私たちが下した決定を誇りに思っています。
アレックス

2
これは、より一般的な問題の一部です。つまり、前任者が長期的な費用ですぐに結果を出すという問題です。引き継ぐとき、同じ出力を維持できない理由を説明する必要があります。
デビッドソーンリー

回答:


23

「しかし、今では機能します」は、ソフトウェアエンジニアの合法的な不満に対する標準的な管理対応です。最初に行うことは、ドキュメント(ある場合)をコンパイルし、それを使用してコードとドキュメントの矛盾を示すことです。

可能であれば、単体テストの包括的なスイートをまとめます。変更ごとにこれらを実行して、既存のコードベースに原因があると思われるリグレッションを文書化できるようにします。

最後に、信頼できる仕事をしている別の部門から開発者を引き入れることができるなら、コードに目を向けてください。「これはがらくただ」と言っている開発者の1人は、しばらくしていた上級開発者が「いいえ、ジム、彼は正しい。これはがらくたクラッカーのがらくたです。」

もちろん、それはすべてあなたの環境、会社の規模などに依存します。

まだ読んでいない方は、The Pragmatic Programmerをご覧になることをお勧めします。すべてのソフトウェアプロフェッショナルが読む必要があるだけでなく、ソフトウェアエンジニアリングをクラフトと見なしていない管理者、同僚、ユーザーなどに対処するための良い提案もあります。


7
ドキュメントは存在せず、コードをテストすることはできません。これを徹底的にリファクタリングする場合を除きます。私は複数の同僚にバックアップされているとかなり確信しているので、議論に別の開発者を雇うことが役立つかもしれません。
ChrisR

@ChrisRamakersそれは素晴らしいニュースです(ドキュメントの不足ではなく、サポートです!)。マネージャーが複数の開発者の専門的な意見を否定/拒否することは(不可能ではありませんが)より困難です。また、サポーターが会社に長く在籍している場合、組織の内部政治をナビゲートする貴重な経験があるかもしれません。がんばろう!
ジェイソンルイス

さらに、負荷テストソフトウェアを入手できる場合は、高負荷でどのように破損するかを示すことができます。
HLGEM

13

経営者の観点からは、システムに何も問題はなく、単に文句を言っているだけです(単に書き直したい/前のエンジニアが何をしたのか理解できない/仕事を楽にしたい)。少しストローマンですが、トップの誰かが現在物事がうまく機能していることに気付いたとき、彼らはあなたがする危機を見ることに気が進まないでしょう(どこかに気候変動のeg話があると確信しています...) 。

ある程度、彼らはポイントを持っています。経営陣は、リリースが当初の見積もりをはるかに超えると問題を認識し、見積もりは高すぎて「既存のコードベースでは不可能」であり、QAをすり抜けるバグの発生が多いようです。物事がうまく並んでいる場合、最終結果に影響を与えないため、頭を軽く叩いて、最善を尽くすように言うのは簡単です。

何をするかは、組織とソフトウェア自体に依存します。ただし、基本的には、古いレガシーコードの結果として発生するすべての複雑さを文書化することをお勧めします。タスクを見積もる際に、古いコードベースのどの側面がこの余分なコストを追加しているのかについて詳細に説明し、なぜそれほど長くかかると思われるのかを管理者に明確にしてください。バグがコードに導入された場合、このバグが入り込むことができた理由と、古いコードベースの問題がどのように責任を負うかを含めてください。

ソフトウェアが元の設計を超えており、現在も拡張を続けるのに問題があることを示唆する方法で、利害関係者に懸念を表現することをお勧めします。


5

コードカバレッジとコードレビューを実行できるさまざまなツールがあります。テクノロジーに適したGoogleツール。通常は業界標準のツールです。これらのツールを使用してコード品質レポートを作成し、Managerに提示することをお勧めします。あなたの批判が建設的で非政治的であることを確認してください。


はい、平均サイクロマティック複雑度を計算し、それを引数として使用することを考えましたが、これが経営者にとって問題になることはないと確信しています。しかし、試してみる価値はあります。thnx– ChrisR
1

5
@ChrisRamakers:マネージャーに「証明」することはできません。「証拠」を忘れてください。データを集めます。事実はあなたが持っているすべてです。事実が多いほど説得力があります。しかし、「証拠」はありません。
S.Lott

4

管理が単純な変更要求であると考える場所を理解しやすい例を選択しますが、既存の設計のためにそれははるかに困難です。

特定のリクエストにこだわるのは望ましくありませんが、これは変更のリクエストがどのようなものになるかを伝えてください。誰もアプリケーションで隅に描かれることを望みません。開発者はYAGNIを信じていますが、経営陣はCYAを信じています。

負荷テストの提案は良いアプローチかもしれませんが、使用上の懸念が現実の世界の成長の可能性を満たすことを確信していないかもしれません(会社は1年で2倍になることはありません)。

すべては相対的です。彼らはあなたの時間を費やすより重要なプロジェクトの計画があるとき、彼らはこのプロジェクトにリソースを入れたくないかもしれません。全体像が見えないというラベルを付けないでください。


1
変更を行った後、diffファイルを表示します。このファイルは、悪いコードベースでは多くの異なるソースファイルに影響を与えますが、「それは何と関係がありますか?」要素など。この作業のどの程度、つまりtime == $$がコードベースの低さと関連していたか、そして今後の変更にはすべてこの特性があることを管理者に説明してください。
ラリーオブライエン

3

何かを証明することについて話すとき、すべての科学的方法が作用します、そしてそれが意味することの一部は、あなたが真実を決定する客観的な基準を受け入れようとするなら、あなたは、調査時に、それらの迷惑な事実の可能性を受け入れなければならないということですあなたの側にいないことが判明。

あなたの場合、2つの証明すべきことがあると思います。

まず、現在のコードベースが「不良」であること。おそらく証明できるのは、「このコードを検討するほとんどすべての開発者の専門的な意見は、それが悪いということです」ということです。

第二に、会社はコードベースを書き直したほうが良いだろう。これは問題です。最初の点が真であっても、2番目の点は真ではないかもしれないからです。また、この決定を下すのに十分な知識がありません。これは経営陣の仕事であり、最初の点についての専門的な判断を尊重する場合は、2番目の点について彼らの判断を尊重する必要があります。

しかし、彼らはあなたが提供する情報なしでは二番目の点について決定することはできません。コードの問題がビジネスに与える影響について知っていること、および書き換えがビジネスに与える影響について知っていることを伝える必要があります。どちらも、多くの不確実性のある未来の予測を伴うため、これは困難です。

しかし、ビジネス用語で問題を述べることを試みることができます。変更とリグレッションにどのくらいの余分な時間がかかりますか?書き換えコストはいくらですか?書き換えられない場合、現在のシステムのコストは時間の経過とともにどれほど速く上昇しますか?使用量が増えた場合、現在のコードが保持されていると災害の可能性はどうなりますか?これを本当に知ることはできませんが、他の誰よりも良い推測をすることができます。これらのことを予測できると思う範囲を伝えるか、何かを伝えてください。

ほとんどの開発者は、お粗末なコードを維持することを好みません。開発者の観点から書き直すのが簡単なコードがビジネスの観点から書き直す価値がないのは残念なことです。

たとえば、書き直しが利益を上げたとしても、会社の他の場所でお金を使う機会費用よりも価値が低い場合があります。または、悪いコードベースは変更に時間がかかり、より多くのリグレッションが発生する可能性がありますが、リライトを収益化するには不十分です。彼らは今後数ヶ月で買収されることを期待しているかもしれず、書換えにお金を使うことは本に現れますが、バグのあるソフトウェアは現れません。

ビジネスの観点からそれについて考えてみてください、そしてあなたが望むものを得るために数字を調理しないでください。大規模な書き直しは、ビジネスの観点から見れば簡単なことではありません。直接証明できないものを証明したい場合は、それを反証するために最善を尽くしてください。あなたが方法を考え出すために最善をしようとし続ける場合ではないゼロから書き直しませんが、あなたが作る感覚を思い付く何もする、多分それから、それは本当にゼロから書き換えるための時間です。そして、その努力をすることは、あなたの経営者にあなたがあなた自身ではなく会社の利益を代表することに真剣であることを示します(あなたはあなた自身ではなく会社の利益を代表していますよね?)。


2

コードベースのどこが悪いのかによると思います。「自分のやり方ではない」ということは、それが悪いコードベースであることを意味するものではありません。

実際に悪いコードベースを作るもの:

  • セキュリティホール

    サーバー、アプリケーション、および/またはデータを脆弱にする問題。特に、機密の会社、クライアント、または顧客データを危険にさらすもの。これらは簡単に文書化できるはずです。

  • 壊れた

    データを処理し、アプリケーションのメンテナンスをほぼ継続的に実行して、それが機能し続けるためにのみ機能します。あなたが去り、誰もスラックを取り上げなかった場合、それはもはや機能しません。-これに費やした時間を記録します。そして、どれだけ節約できるかに注意してください。多くの場合、これらのプロセスはユーザーにとっても非効率的であり、文書化することもできます。

  • 実際には機能しません

    動作しているように見えますが、結果は正しくありません。これは通常、数字が一致しない、高い不良率などの問題を引き起こします。

悪いコードベースではないもの(ちょうど良くない):

  • 時代遅れのサポートされていない技術に書かれています。(VB6、COBOL、.net1.1など)

新しいテクノロジーに移行する利点に注意してください。リスクを最小限に抑え、ユーザーと管理の信頼を構築できるように、一度にピースを移動する移行パスを見つけてください。ロジックが元のロジックと基本的に同じように機能することを確認してください。

  • 文書化されていない/フォーマットが不十分なコード

一般に、実際にコードに影響を与えずにコメントを追加し、フォーマットを修正できるため、これが最も簡単に修正できます。ただし、書き換える必要はありません。これが他の問題と組み合わされていると感じた場合、最初にすべきことはこれを修正してコードの実行可能性をよりよく評価できるようにすることです。


1

ある方法であなた自身の質問に答えました。

システムにお金を使うように彼らを説得する方法は、ユーザーにとってうまく機能しなくなるまで待つことです。スケールしないと思われる場合は、それが起こるのを待つか、負荷テストを行ってそれを証明します。

これは、これをスケーリングしてX時間かかるという単純な提案です。


8
唯一の問題は、彼がシステムの主な責任を負っていると、システムが機能しなくなったときに非難されることです。「しかし、あなたが始める前にうまくいきました!」と彼らは言うでしょう。そのため、積極的なアプローチを勧めました。問題は、文書、事前にそれらを警告し、それが壊れるときに彼のお尻が覆われている、と彼は言うことができるだけでなく、「私は彼の上司にそうあなたに言った」が、彼は「私が話したと言うことができ、彼を彼の上司の上司にそう」。
ジェイソンルイス

3
@Jason-あなたの主張はわかりますが、私の経験では、否定は下向きに働き、「彼に言った」と言って、チェーンを上って行くと、「非チームプレイヤー」が途中で非常に迅速に満たされます。
on野

2
それは非常に多くの個々の職場に依存しますが、私はあなたに同意...私はそれをよりよく言葉で表現している可能性が...私の主なポイントは、だ理由の文書化されただろう、事前に失敗するとポイントを主張し、ために利用可能なドキュメントを維持しますそれが...最高のシナリオの場合、あなたはそれを修正することができます。平均して、失敗したときはねじ止めされていません。最悪の場合、あなたはシステムとその弱点を深く理解し、それらを修正して、失業後に就職活動を終えたときに最後の職を将来の雇用主に残した方法と理由を(鮮明な詳細で)印象的に説明する方法;-)
ジェイソンルイス

1
@JasonLewis会社のプレイヤーがそのようなフレーズを使用している場合I told you so、それは有毒な非難の文化であり、OPが長く働きたい場所ではありません。優れたマネージャーは非難せず、優れたマネージャーは問題を認め、計画を立てます。
maple_shaft

@maple_shaft同意します。私はそれらの言葉を文字通り意味していませんでした、私はすべての基盤をカバーすることにもっと言及していました。理想的には、私たち全員が優れた協力的なマネージャーを持ち、指揮系統のずっと上にいるはずです。しかし、多くの場合、私たちは公平な仕事に我慢しているので、私たちが持っている仕事を望みの仕事への足がかりとして使うことができます。
ジェイソンルイス

1

これは困難な状況です。ユーザーの観点からすれば、すべてが現在許容できる安定したポイントにあるからです。主に非技術系の管理者にとっては、現時点では心配する必要はありませんが、コードベースの書き直しを求めることは非常に大きな決断であり、特に独身者(自分)の意見や努力について軽視すべきではありません。

ですから、技術的な負債が圧倒的であるため(あなたの意見では、例はなく、あなたの言葉を受け取らなければならない)、タフな場所にいるため、書き換えを主張しようとするタフな場所にいますこのシステムに機能を維持したり追加したりするのが難しいこと。

新しい機能の見積もりは高く、これらの高い数値を事実で正当化し、これらのことは実際にかなりの時間がかかることを証明します。これを適切に伝えない場合、上司はあなたを無能だと思っているだけかもしれません。彼が高い見積もりに疑問を呈したとき、蓄積された技術的負債が現在のソフトウェアに迅速かつ安価に機能を追加する能力を妨げていると感じる理由を説明します。マネージャーが一緒にこする2つの脳細胞を持っている場合、マネージャーはすぐに理解し始めます。

重要なのは、マネージャーを説得しようとするのではなく、書き換えが受け入れられるコースであることを自分自身に納得させることができる適切な(そして慎重に選択された)情報でマネージャーを操作することです。マネージャーに、自分の考えだと思わせる必要があります。


1

まず、コードベースに蓄積された技術的負債を判断します。次に、この質問と回答を見てください。さらに先に進む前に、経営者に技術的負債を返済するよう説得する方法が説明されています。


0

すべての成熟したソフトウェアが混乱のように見える理由があります:

  1. すべての混乱は、ビジネスが依存している重要なロジックをエンコードしています。それなしでは機能しません。ユーザーの問題を解決するには、そのすべてが必要でした。
  2. 少し時代遅れの技術を使用しています。現在のプログラマーは、テンプレートマジックを使用しない場合、それは単なる混乱であると考えているようです。これは壊れたビューです。より大きなプロジェクトに遅れて来る人は、すべての詳細を学びながらこの段階を迎えます。
  3. しばらく前に重要だった要件は、それほど重要ではなくなりました。これは、ソフトウェアがすでにこれらの問題を修正したためです。プロジェクトに遅れて来ると、ソフトウェアは正当な理由もなく複雑であるように見えるかもしれません-問題はもはや存在しませんが、コードの複雑さはまだそこにあります。

この種の態度は、プログラマーが無知や怠から生じる大きな技術的負債を弁解するように導きます。プログラマーの仕事は、抽象化を使用してビジネスロジックをエンコードすることです。可変仕様は、ハードコードされたマジックナンバーではなく、メタデータ内に存在する必要があります。第二に、「少し時代遅れ」は主観的である可能性があります。私見、「少し時代遅れ」とは、フレームワーク/プラットフォームがまだ活発に開発されていることを意味し、アップグレードパスがあります。代替手段は「廃止」です。番号3は許されません。あなたは今、残酷を説明しました。誰もコードベースをリファクタリングまたはクリーンアップしていませんが、これは受け入れられますか?
ジェイソンルイス

確かですが、抽象化を使用してビジネスロジックをエンコードした後の結果はどうなりますか...コードは複雑に見えます。それが「混乱」の定義です。(3)は複雑ではないため、複雑ではありません。問題が解決した後でも、それを持っている必要性は消えませんでした。
tp1
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.