リファクタリング(および技術的負債)を非技術者(通常はPHBまたは顧客)にどのように説明しますか?(「なんと、目に見える違いなくあなたの仕事に1か月かかるでしょうか!」)
更新これまでのすべての回答に感謝します。このリストは、適切な人を指すことができるいくつかの有用な類推を提供すると思います(PHBへの参照を編集するのは賢明かもしれません!)
リファクタリング(および技術的負債)を非技術者(通常はPHBまたは顧客)にどのように説明しますか?(「なんと、目に見える違いなくあなたの仕事に1か月かかるでしょうか!」)
更新これまでのすべての回答に感謝します。このリストは、適切な人を指すことができるいくつかの有用な類推を提供すると思います(PHBへの参照を編集するのは賢明かもしれません!)
回答:
大きなホームシアターがあり、物を追加すると、ゆっくりですが確実に後ろに大きなネズミが巣を作ります。
部品を頻繁に交換する場合は、そのすべてを整理する価値があります。
確かに、それを行うと、以前は機能していましたが、開始時よりもうまく機能することはありませんが、もう一度それをいじる必要がある場合、事態はずっと簡単になります。
いずれにせよ、PHBまたは顧客がすでによく知っている特定の分野、つまり車や建設などと同様の比較を行うのがおそらく最善です...
リファクタリングは、すべてがきちんと収まるまでスーツケースを再梱包するプロセスに似ています。時々、その過程で、そもそもなぜそんなにジャンクになろうとしているのか疑問に思うでしょう。
技術的な負債の概念については説明しませんが、それは必要ではないからです。代わりに、リファクタリングに焦点を合わせます。プログラムの設計を変更します。必ずしも「改善」または「改善」する必要はありません。変更する必要があるため、変更する必要があります。
車のアナロジーが当てはまる場合があります。車にエアコンを追加する必要がありますが、もともと車用に設計されたものではありませんでした。奇妙なL字型のエアコンを作る必要があるだけでなく、最初に邪魔にならないように他のものを移動して、排気システムを変更する必要もあります。
また、新しい機能に対応している場合、リファクタリングする方が良い戦略だと考えています。
私は技術的負債という用語を使用し、彼らが理解する何か-法人負債に直接関連付けます。技術的負債はローンを借りるようなものです。あなたはそれに興味を持っています。たとえば、新しい工場を建設してその費用を完全に支払うか、融資を受けることができます。ローンを取得した場合、実際には長期的にはより多くを支払うことになりますが、条件が正しい場合は財政的に意味があります。
ただし、このようなローンの25%の利息を支払う場合は、持続不可能な立場になります。これは技術的な負債でも同じです。技術的な負債を負うことが理にかなっている場合があります。ただし、関心が高すぎて、返済する必要がある点があります。いくつかの技術的負債は住宅ローンのようなものであり、いくつかはクレジットカードの負債のようなものです。緊急事態では、クレジットカードの借金は重要で貴重な資産です。ただし、賢明に使用しないと、銀行(または選択した場合は家庭)を破壊する可能性もあります。
もう1つの例:マーケティングメールのドロップに10,000ドルを支払って、将来の販売でより多くのリードを獲得できます。あなたは「販売負債」を完済しています。これは長期的な見返りを伴う費用です。これを、コードの一部をリファクタリングするお金を「支出」したい理由と同等にしてください。どちらの場合も、すぐに見返りはありませんが、将来のパフォーマンスを向上させるための準備をしていることになります。
私は、ターゲットオーディエンスが誰とでも話すとき、「xxxx負債」という用語を類推として使用する傾向があります。たとえば、運用負債-現在の印刷機は正常に機能していますが、生産を1日(または1週間)停止し、新しいマシンにアップグレードすることで、出力を25%増やすことができます。
EDIT - ここでは、この上の別テイクがあります
春の大掃除。
あなたは家に変更を加えていません。あなたはただ物を動かして、いくらかのほこりを取り除きます。たぶん、あなたがもう使わない、あるいはもう必要としないものをいくつか捨てるでしょう。しかし、何も追加していません。
「マウストラップをプレイしたことがありますか。新しい機能を追加し、インターフェイスを変更し、バグを修正すると、コードはそのように見え始めます。多くの資本(時間と労力)を費やす必要があります、これはお金に相当します)すべての可動部分が新しい変更または追加のたびにうまく動作することを確認するか、代わりにデザインをリファクタリングする時間を確保して、変更を行うたびに管理する必要のある可動部分を減らします。エンドユーザーの観点からは、リファクタリングには利点はないように思えるかもしれませんが、リファクタリング後に新しい機能が追加されるたびに利益が発生します。プロセスはより速く、バグが少なく、その後は安価です。もちろん、リファクタリングされたコードは全体的により効率的であることは言うまでもありません。
そもそもなぜマウストラップのように見えるようにしたのか疑問に思うかもしれません。
より良いマウストラップを構築し続けるために、常に戻って複雑さを軽減し、所有物を合理化する場所を見つける必要があります。多くの機能を備えたソフトウェアを持っていることと、本当に高品質のソフトウェアを持っていることの違いです。」
これは、ホームシアターの例えを少しグラフィカルにしたバージョンです。
もう1つの新しいアプライアンス(別名、新しい機能)を追加したい場合は、ピンチでどこかに収まる可能性があります。
さらに別のアプライアンスを追加する場合は、延長リードを購入できます。
しかし、追加するたびに、解決策を見つけるのが難しくなります。そして、あなたは火災[別名バグ]のリスク1に身をさらしています、そしてあなたは壁に新しいソケットを入れるために誰かにお金を払うために大金を引き出す必要があります。回路基板、またはさらに。
1 PHBがあまりうまく機能しないもう1つのこと:「それが起こる可能性がある場合、あなたは何を心配していますか?」
「コードメンテナンス」と言います。非技術者が精通しており、非技術的な世界観にとって意味のある言葉を使用することが重要です。非技術者(顧客)がアプリケーションメンテナンスに精通している場合、コードメンテナンスとアプリケーションメンテナンスを並行して行うのは簡単です。それらが同じでなくても、ここの最終顧客は開発者であるか、システムを保守する方法であると説明できます。
あなたは車のカスタマイズに特化したメカニックであり、顧客がそれを必要とする場合はゼロから構築することもできます。いつも彼のスーパーサイズのリムジンに新しい光沢のあるものを入れるためにあなたの店に戻っているこの顧客がいます。
彼が素敵なサウンドシステムをインストールするためにやって来たら。ワイヤを渡して正しく接続するタスクを熱心に実行します。彼は1日後に出かけ、彼は幸せで、いつものように気前よく支払います。
来月彼は戻ってきますが、今回は本格的なホームシアターの設置を望んでいます。もう一度、リムジンを持ち込みます。プロであるため、サウンドシステムを再検討し、車の周りにワイヤを走らせるためのチューブシステムを設置することで、メンテナンスを容易にします。これにより、ワイヤが保護され、引き出しやすくなり、さらに追加する必要がある場合も簡単になります。したがって、古いワイヤを引き抜き、チューブを取り付け、映画館用のサウンドシステムと余分なワイヤを通過させ、すべて閉じて完了です。
顧客が古いサウンドシステムの交換を求めなかったことに気付き、交換部品とチューブのコストの一部を削ぎ落とします。しかし、あなたはまだ取引からお金を稼いでいます。あなたが最初にやったようにシステムを一緒に投げただけではなかったでしょう。
1か月後、彼は戻ってきました。今回は照明システムが必要で、週の初めに古いスピーカーを破損した新しいスピーカーが必要です。
すべてをきちんと整えたので、新しい照明線をチューブにすばやく通し、システムをインストールしてスピーカーを交換できます。しかし、今回ははるかに速く完了し、リファクタリングはゲームのトップを維持することで報われました。
完全に良いワイヤーを引き裂き、この余分なチューブをすべて取り付けたことであなたを笑っていたあなたの競争相手は、顧客を満足させるのにまだ苦労しています。確かに彼はほとんどの場合あなたよりも速く行われましたが、時間がたつにつれて、彼の顧客はますます遅延があり、作業の全体的な品質が低下していると不平を言っています。
これを見ると、ビジネスにとどまるだけでなく、トップガンになるという目標は、顧客の要求を満たすために行うことと、将来の生活を楽にするために行うことのバランスを取ることであることがわかります。顧客が両方の費用を支払うことはほとんどないため、密接に管理する必要があります。あなたは、物事を2回行うというコストでさえ積極的に物事を正しく行うことで、生産性の制御された安定した割合で保守コストを維持することを賭けます。
ソフトウェアは同じですが、プログラマーがデジタルダクトテープを非常に長い時間使用してから、顧客や管理者がその効果を本当に感じることができます。残念ながら、その時までに正しいことをやり直すコストは、ダクトテープがどれだけ存在するか、およびダクトテープの平均寿命に関して指数関数的に増加します。
これが、システムのリファクタリングを続けることが重要な理由です。多くの場合、経験により同じことを行うための新しいより効率的な方法が示されます。または、同じ機能を組み合わせて、それらを単にコピーするのではなく、冗長性を悪用することができます。これは、システムを無駄のない方法で維持する方法です。需要に合わせてシステムを絶えずリファクタリングすることで、メンテナンスの量を制御することで生産性を一定に保つことができます。
ダクトテープを配置すると、生産性が一時的に向上しますが、最適でないシステムを運ぶコストがかかります。システムの他の側面を損なうために即時の生産性が優先される場合は常に、技術的な負債が発生します。借金に例えると、借金に対する利子が利益を奪うのと同じように、借用時間によって物事がすぐに高いメンテナンスを被り、システムの脆弱性が増し、チームが作成ではなく維持に追加のリソースを費やすことになるためです。金融関係者と同様に、借り入れが衰えずに継続する場合、ほとんどのリソースは利息返済に費やされ、改善のためにほとんど残りません。技術的な負債は技術的なリソースを使い果たし、ほとんどのリソースが費やされるだけで、システムが他のすべての可能な機能強化を停止するために粉砕を実行し続けます。
結局のところ、質問は私たちがやるべきではなく、マネージャーや顧客に、デジタルダクトテープを使用して人為的に肥大化した生産性の数値に依存できると信じさせることは倫理的です。それはビジネス上の決定だと考える人もいますが、率直に言って、これはマネージャーがそれを理解していないという理由だけでそうなっています。最終的には、誰かが重いリファクタリングを通じて、または新しいシステムに移行することによって借金を支払わなければなりません。最終的には、システムを保守可能な状態に保つのはプログラマーです。それは仕事の本質的な部分であるため、リファクタリングを要求する必要はありません。これを理解しないと、ソフトウェアエンジニアリングのすべてを理解できなくなります。これは、すでに重要な債務を負っているシステムがあり、この債務の返済には支払人の決定が必要になることを私は知っています。あなたの仕事はそのような状況は、少なくとも借りを停止するためにあなたの役割をすることです。この負債が発生しました米国が、我々はそれを行うに加圧したので、多分私達は、よく知っていなかったので、まだ、私たちはこの債務を引き受けたし、非常に多くの場合、人々は、我々はこのようにそれを適切に管理することができない、それを理解していないために借金を手渡しました。
ここにあなたのソフトウェアがあります、あなたはそれが好きであることを望みます....ところで、私はそれをやってあなたのクレジットカードを最大限に使いました、あなたが気にしないことを願っています... cya
ソフトウェアを書くことは、大きなノンフィクションの本や百科事典を書くことによく似ています。
最初のドラフトは常に下手です。再編成し、不要なセクションを削除し、一貫したスタイルを確保することで、常に改善できます。
修正する必要があるときはいつでも、最も簡単なことは、新しいセクションを追加したり、いくつかの単語を変更したりすることです。しかし、改訂版が山積みになると、本はその組織を失い始めます。そのため、再編成をさらに進める必要があります。そうしないと、本は無意味な寄せ集めになります。
たとえば、デスクトップコンピューターを取り上げます。タワー、モニター、キーボード、マウス、プリンター、スキャナー、スピーカーがあります。最終的に必要なのは、すてきな整理されたデスクだけです。ですから、盲目的にプラグを差し込むだけで、数分後にはすべてが思い通りに設定されます。まあ...ほぼあなたがそれを望む方法。
1日後、スピーカーのバランスを変更しているときに、誤って左右のスピーカーを間違った領域に配置したことに気づいたので、位置を入れ替えたいと思います。しかし、いや!絡まったコードのジャングルがあります。スピーカーの移動に進むと、マウスコードが引っ掛かり、マウスがスピーカーと一緒にドラッグされます。また、キーボードにはたるみがなくなりました。以前は、キーボードを机から膝の上に移動できました。
さて、マウスとキーボードのプラグを抜いて再挿入すれば、すべてが修正されます。しかし、これは将来の再編成や将来の追加には役立ちません。また、マウスとキーボードのコードをジャングルに織り込むのも面倒です。
より良い解決策は、すべてのコードを再接続して、各コードが他のコードと干渉しないきれいな方法でそれらを再び接続することです。現在、将来の変更は簡単であり、引き続き簡単です。後で大きな利益を得るために少し前もって投資します。
重要な点は、元のソリューションがほとんど機能したことです。それがリファクタリングの問題です。最初は機能しますが、将来の変更を簡単に行うには(スピーカーを移動して)既に存在するものを変更する必要があります。
それは、前夜のワイルドでクレイジーなパーティーの後に家を片付けるようなものです。
リビングルームが完全にゴミになったとしましょう。家はまだ家であり、居間はまだ居間です。それは動作しますが、それができる方法ではありません。混乱を見つめた後、クリーンアップする必要があることに気づきます。
だから、あなたはゴミの袋詰めを開始します。すでに良く見えます。だから、部屋を見て、家具をまっすぐにすることにします。あなたは一つのピースを戻し、次に次のピースを置きます。うわー、部屋は本当によさそうだ。あなたは誇りに思っています。
妹が入って来て、部屋がゴミのように見えると言ったら、本棚を修理してカーペットを掃除機で掃除する必要があります。彼女は正しいです。部屋は本当にとてもよく見えます。
周りを見ると、すべて同じ高さのウィンドウシェードがはるかに良く見えることがわかります。できた うわー、部屋は素晴らしいです。
コードを同じように扱います。
簡単!
例を挙げましょう...誰もが人生で親愛なる人への手紙を書いています。それらの手紙では通常、作文にも注意を払っているので、大切な人でなければなりません。
だから、あなたはあなたのテキストを持っています... ...意味はどちらの方法でも通りますが、あなたは全体を素敵に聞こえさせたいです!右?
リファクタリング、同じこと...同じ情報、多かれ少なかれ、構成はより優れています。そして、それはおそらく読者によるより良いレビューになるでしょう。
別の例-雑誌の記事を書く。2人の作家はどちらも「自分のもの」を知っていますが、唯一の違いは「書き方」を知っている人と、このような答えから書くことを学んだような書き方です。
誰の記事を覚えていますか?
物理的な世界の物事に類似するものはすべて-劇場の建設のように-IMO、ひどいです。
コードのリファクタリングは、コードのリファクタリングと似ていることを説明する必要があります。ソフトウェアは、物理的なアナログにはない方法で順応性があります。物事がますます複雑になると、コードベースの大部分または小さな部分をリアクター(または、必要に応じてやり直し)する必要があります。
なぜリファクタリングするのですか?リファクタリングされないコードは、維持および変更に1分あたりのコストがかかり、最終的には問題が大きくなるためです。
リファクタリングに関して非常に興味深いのは、コードベースをやり直しますが、少なくとも最初は機能は同じままです。
私は別の例を考えましたが、ここでは誰も言及していません。リファクタリングは数学の方程式を並べ替えることとほぼ同じです(ただし、「非技術者」の範囲外になる可能性があります)。
方程式を並べ替えるとき、意味を変えずに、読みやすく使いやすくするために、「ものを動かす」だけです。
彼らに簡単な数学の方程式を与えます。例えば:
どちらが簡単ですか?
y = x + x
または
y = 2x
リファクタリングも同様の概念です。ただし、単純な数学方程式ではなく、アルゴリズムを使用します。主なアイデアは、同じ結果が得られるため、2つの方法を入れ替えることができるということです。
実行できる最も簡単なリファクタリングは、名前の変更です。
doX() { ... }
{
doX()
}
意味がわからないため、doXと呼ばれることを本当に望まないため、よりわかりやすい他の名前に名前を変更し、使用した場所を置き換えます。
doBusinessTransaction() { ... }
{
doBusinessTransaction()
}
これにより、問題や機能強化が発生したときに、アプリケーションを理解して修正する時間を短縮できるため、後でお金を節約できます。さらにお金を節約するために、使用している言語に応じて自動的にこれを行う無料のツールがあります。また、これらのツールはライセンスが制限されていないため、直接使用する場合は確認する以外に特別なことを行う必要があります。
リファクタリングで与えられた答えを考慮し、技術者でない人には説明しないでください。リファクタリングは、彼らが知る必要のない技術的な活動です。
もちろん、多くの人は、品質によって駆動されるが、スケジュールによって駆動されると言います。これらの場合、私はより議論の余地のあるアドバイスを与えます:言わないでください!
破壊的?そうは思いません。ソフトウェア開発者は専門家です。私たちの仕事は、できるだけ早く効果的なソフトウェアを構築することです。…スケジュール主導型のマネージャーは、私ができる限り早くできることを望んでいます。私のやり方は私の仕事です。最速の方法はリファクタリングです。したがって、リファクタリングします。
(リファクタリング、Martin Fowler、2000、61ページ)
もちろん、リファクタリング以外のことを何もせずに1か月を費やそうとすると、これは機能しませんが、とにかく一般的には悪い考えだと思います。 、または作業したばかりのコードをクリーンアップします。