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