最倧䞻矩のないレガシヌコヌドに぀いお䜕をすべきか





コヌドの䞀郚を修正するタスクが䞎えられたず想像しおください。 私の頭の䞭には倚くの考えがありたす。 誰が曞いたの い぀ それずも圌は遺産ですか ドキュメントはどこにありたすか 「レガシヌ」を培底的に、あらゆる偎面から察凊しおみたしょう。 タリンのCodeborne瀟の開発者であるAndrey Solntsev @asolntsev  http://asolntsev.github.io/ は、この問題で私たちを助けおくれたす。 始めたしょう。



-アンドレむ、マむケルフェザヌズの䜜品、たずえば「レガシヌコヌドを効果的に䜿甚する」に粟通しおいたすか この本は、テストの重芁性に焊点を圓お、レガシヌコヌドず非レガシヌコヌドの重芁な違いの1぀であるテストの可甚性を匷調しおいたす。 この意芋に同意したすか



私は絶察に同意したす さらに蚀いたす。ナニットテストは必芁ですが、十分な条件ではありたせん。 たた、単䜓テストを䜿甚するず、Hercules自身がすくい䞊げないように積み重ねるこずができたす。

本物のゞェダむ・マスタブは䜕ですか

  1. TDD-぀たり、コヌドの前にテストしたす 。

  2. クリヌンコヌドおよびクリヌンテスト。





ロバヌトC.マヌティンのクリヌンコヌドが倧奜きです。 これは私にずっおデスクトップ聖曞です。 党員に匷くアドバむスしたす。 ずころで、圌のブログも玠晎らしいです。




-コヌドがすっきりしおいるこずは明らかです。 TDDはそれず䜕の関係がありたすか バグのないコヌドは良いコヌドず同じではありたせんか



TDDはテストに関するものだず誰もが思っおいたす。぀たり、退屈だずいうこずです。

ナンセンス

TDDは開発に関するものですテスト駆動開発。 これは、レガシヌではないようにコヌドを䜜成する方法です。 それをサポヌトするこずができるようにデバッグ、修正、リファクタリング、修正。 珟時点では、これが人類に知られおいる唯䞀の方法です。 他のすべおは邪悪なものからのものであり、ごたかされないようにしおください。



-TDDは匱虫甚であり、匷力な開発者にずっおは、良い頭脳を䞎えお事前にコヌドを考えるだけで十分であるずいう意芋がありたす。 その埌、バグはありたせん。



バグを芋぀けるためにTDDはたったく必芁ありたせん。

テストは、コヌドの最初の䜿甚です。 シャヌロックホヌムズは次のように述べおいたす。「たず、事実を収集し、それから理論を構築したす。 そうでなければ、あなたは無意識のうちにあなたの理論ず事実を䞡立させ始めたす。」 あなたはこれがどのように起こるかにさえ気付かないでしょう そのため、コヌドを䜿甚したす。コヌドの前にテストを曞くずき、それを䜿甚する方が䟿利な方法、クラス、メ゜ッドに名前を付ける方法を考えるこずを䜙儀なくされたす。 枡すパラメヌタヌ。 そしお、最初にコヌドを曞くず、そのテストをゞャグリングし始めたす。 その結果、テストの割合が耇雑になり、他のテストは修正が困難になり、䞀郚は未䜜成のたたになりたす。 そしお、ここにレガシヌコヌドが盎接ありたす



-テストに぀いおの議論を続けたす、あなたの意芋では、どのテストが正しく、どのような状況、䟋えば単䜓テストですか



ナニットテストから始めたしょう。 それらはすべおのプロゞェクトで必芁であり、オプションはありたせん。



もちろん、他の皮類のテストも重芁です統合、UI、パフォヌマンステスト。 これは、プロゞェクトごずにすでに異なりたす。 重芁なこずは、単䜓テストよりも1桁小さいこずです。 テストピラミッドに぀いおは、誰もが知っおいるず思いたす。



-そしお、テストでのコヌドカバレッゞはどうあるべきですか 70で十分ですか プロゞェクトの「蚺断」に行き過ぎないようにするには



もちろん、最倧限のカバレッゞを埗るために努力する必芁がありたす。 30たたは70のカバレッゞに関するこのすべおの話は、誀解によるものです。 100を目指しお努力する必芁がありたすただし、これは達成できない制限です。



100のカバレッゞが䞍可胜であるこずは誰もが知っおいたすが、誰もがその理由を理解しおいるわけではありたせん。 「重芁なものだけをテストする必芁がある」、「ゲッタヌをテストする必芁がない」、「より重芁なこずを行う必芁がある」ためです。



どのシステムでもコヌドが倖郚ず通信するため、完党なカバレッゞは䞍可胜です。 画面䞊のピクセルの描画、デバむスの制埡など-このコヌドでは単䜓テストは䞍可胜です。自分の目で確認する必芁がありたす。 私たちのプロフェッショナリズムは、この「倖界ずのコミュニケヌション」の局をできるだけ薄く保ち、そこからすべおの論理を取り陀くこずにありたす。 そしお、それをテストする必芁がありたす。



倧たかに蚀っお、期限切れのロヌンを赀で匷調衚瀺する必芁がある堎合、「どの期限切れのロヌン」のロゞックは、単䜓テストず「ハむラむト」を䜿甚した別個の方法で別々に実行する必芁がありたす。 たあ、CSSたたは䜕でも。 たた、TDDはこれらのレむダヌの分離を奚励しおいたす。これはすばらしいこずです。 これが圌の匷さです たた、テストは単なる副䜜甚です。



-単䜓テストの䜜成にどれだけの時間を費やすべきか、プロゞェクトのどの段階で重芁な圹割を果たすか



ナニットテストは、すべおの段階で垞に重芁な圹割を果たしたす。 「ナニットテストの蚘述を開始する時」や「ナニットテストを蚘述できなくなる」段階はありたせん。



すべおを正しく行うず、単䜓テストの䜜成にかかる時間の質問に答えるこずはできたせん。 これは開発の䞀郚です。 モルタルでレンガを広げるのにどれくらいの時間がかかるか、そしおどれだけの量を眮くのか、誰も尋ねたせん。 これらはすべお必芁な手順であり、それだけです。 あなたはそれらのうちの1぀を投げるこずができたせん、さもなければあなたの壁は2日目にバラバラになりたす、そしお、あなたはたくさんのレガシヌレンガを手に入れるでしょう。



-テスト䜜成プロセスはどのようなものですか



赀いテストを10分間曞いお、10分間緑にしお、10分間リファクタリングしたす。 もちろん、この時間を正確に枬定する人はいたせん-時には5:300、時には1805-60です。 関係ありたせん。 月ず幎のコヌドを同じ速床で、予枬可胜な速床で倉曎できるこずが重芁です。 長い目で芋れば䞀定の速床は、開始時の高い瞬間速床よりもはるかに重芁です。



TDDがはっきりず元気に瀺されおいるこのビデオをお勧めしたす。「 少幎がやった、少幎がやった 「長さに驚かないでください。ナニットテストに぀いおは最初の30分しかありたせん。







-Andrey、TDDが非垞に有甚な堎合、なぜそれほど䜿甚されないのですか



すべおがシンプルです。 TDDは芏埋です。 それはスポヌツのようなものです。誰もがスポヌツは䟿利ですが、怠zyであるこずを知っおいたす。 最も正盎な人は圌らが怠けおいるこずを認め、残りは蚀い蚳を芋぀け、そしお最も悪名高い人はスポヌツがなぜ有害であるのかずいう説明を思い぀き始めたす。 TDDを䜿甚しおいたす。



面癜い違いは、゜ファに暪たわっおいる人は自分をアスリヌトずは呌ばないずいうこずです。 ここではすべおが公平です。 たた、コヌダヌはテストを䜜成せず、同時に開発者ず呌ばれたす。 信じられないよね しかし、それは垞に同じ終わりです。 トレヌニングを逃したアスリヌトはすぐに競争に負けたす。 同様に、テストを介さずに蚘述されたコヌドはすぐにレガシヌになりたす。 ここではすべおが公平です。



TDDは芏埋です。 TDDは知るのに十分ではなく、コヌドを倉曎するたびに毎日䜿甚する必芁がありたす。 最も猛烈なTDDファンでさえ、忘れお、芋苊しい䜍眮にいるこずに気付き、テストの前に公にコヌドを曞いおいたす。 ペアプログラミングは、察凊するのに圹立ちたす。 これは、私が匷くお勧めするもう1぀の方法です。



TDDは、毎日蚌明しなければならない定理です。



-テストカバレッゞに関する問題に぀いお話し合いたした。 互換性などの他のレガシヌ問題に察凊するこずが重芁です。 さらに叀いラむブラリずの互換性のためにコヌドが倉曎されおいないプロゞェクトがありたす。 自動車産業ずの類䌌性を匕き出す堎合、新しい蚭蚈で廃止されたコンポヌネントやアセンブリを䜿甚しようずする詊みは臎呜的であり、プロゞェクトのコヌドの平均レベルは時代の期埅に応えなければならないず思いたせんか



ひず぀お話したしょう。 兄はタルトゥ倧孊の化孊研究所で働いおいたした。 代衚団はペヌロッパのどこかから来たした。 圌らはすべおを芋せられた新しい斜蚭、新しい機噚、すべおのもの。 そしお、圌らは角のどこかに叀い゜ビ゚ト郚隊に泚意を匕きたした。 出垭者は目を䞞くしお、たあ、なぜ圌を捚おないのかず尋ねたした。 答えは次のずおりです。「信じないで なぜなら圌は... WORKS」



単䞀の答えはありたせん。 すべおの䟝存関係は毎日曎新され、必須の衛生ずしお扱われたす。 MavenたたはGradleにこれを自動的に行うように䟝頌するこずもできたす。 そしお、元のラむブラリのフォヌクを䜜成し、叀いバヌゞョンで20幎間座るこずができたす。 おそらく䟝存関係に䟝存したす。 Seleniumに匷く䟝存しおいる堎合、新しい機胜を䜿甚しおから、頻繁に曎新したす。 新しいlog4j機胜に䟝存しない堎合、叀いバヌゞョンを䜿甚しおいたす。 すべおが機胜したす。



私が幎をずるほど、アップデヌトを远いかけおはいけないずいう事実に傟くようになりたす。 新しいPlayフレヌムワヌクはStruts2より優れおいたせんでした。 MavenはAntよりも優れおいたすさらに悪いこずです。 TestNGは間違いなくJUnitよりも悪いそしお、結局のずころ「新䞖代」ずいう名前に。 Hibernate3はHibernate 2よりも困難でした。SpringブヌトはSpring MVCよりも困難です。 しかし、10幎が経ちたした 私は新しいJavaScriptラむブラリに぀いおは黙っおいたす。



したがっお、グリヌスでコヌティングされたすべおが新しいわけではありたせん。



-前の質問に加えお緎習䞭に同様の状況に遭遇したしたか そのような状況からどのように抜け出したしたか どの戊略に埓っお、すべおを曞き盎したすかグリヌンフィヌルドずいう甚語がよく䜿われたす、たたはリファクタリングを行いたすか



もちろん、䌚った。

はい、それは組織の問題です。 埌方互換性のないある皮の䟝存関係を曎新したい堎合は、そのための時間を確保し、その瞬間に誰も緊急なものを持たないようにチヌムず調敎し、リファクタリングする必芁がありたす。 倚くの人が泣き始めたす「私たちはこの時間を䞎えられおいたせん。」 よくわかりたせんが、曎新する必芁はないでしょうか それは重芁だろう-圌らは時間を䞎えるだろう。



グリヌンフィヌルドに関しおは、私はかなり懐疑的です。

もちろん、すべおをれロから曞き盎すこずを倢芋おいない兵士は悪いです。

しかし、私の人生では、システムがれロから曞き盎されお改善されたのを芋たこずはありたせん。 通垞、同じたたはさらに悪い結果になりたす。 コピヌリストは倧きな興奮から始たり、ある問題に遭遇し、別の問題に遭遇したす。 圌はもう間に合わないこずを理解しおいたす...技術的な負債をある堎所に、別の堎所に残したす-そしお、半分はただ曞かれおいたせんが、新しいプロゞェクトにはすでにレガシヌコヌドがありたす。



れロから䜕かを曞き換えるには、より良い方法ず方法を正確に理解する必芁がありたす。 そしお、なぜあなたの前任者は倱敗したしたか。



-実瞟のある「ハむブリッド」オプションがあるかもしれたせんか



ハむブリッドオプションがありたす。 最もレガシヌなシステムの䞀郚を最初から曞き盎すこずができたす 。 そしお、叀いバヌゞョンもそのたたにしお、䞊行しお動䜜するようにしたす。 そしお、システムのすべおの郚分を1぀ず぀埐々に新しいバヌゞョンに転送したす。 はい、忍耐ず時間がかかりたすが、これが唯䞀の方法です。 䞍本意 その埌、たったく始めないでください。 ここで急いで堎所ではありたせん。



-䞍良なレガシヌコヌドず、最倧の「オヌバヌクロック」コヌドの定矩をどのように区別したすか 将来のサポヌトを犠牲にしおパフォヌマンスを远いかける䟡倀はありたすか



オヌバヌクロックされたコヌドは、動䜜を高速化するためのバむトを含む数十行の厄介な操䜜のようなものですか 実生掻でのそのようなコヌドは、物語のカテゎリヌに由来するず思いたす。 誰もがそれができるのは冷たいピヌマンだけだず考えおおり、圌らも孊びたいず思っおいたす。 アプリケヌションプログラミングでは、これはほずんど必芁ありたせん。

ただ必芁な堎合は、誰もこのコヌドを「オヌバヌクロック」し、読みやすくテストする必芁はありたせん。 さあ、あなたはプロです。 最初に単䜓テストを蚘述しおから、オヌバヌクロックしたす。 単䜓テストを圧倒しおいたせんか 分散するものは䜕もありたせん-錻は成熟しおいたせん。







-レガシヌコヌドはシステム党䜓の開発を遅くするず思いたすか



もちろんできたす そしお、それは遅くなりたす

実際、これは通垞、速床が䜎䞋する最も重芁なこずです。 その埌の各倉曎はより困難であり、䜕かを壊すリスクがありたす。



-あなたがそれを芋た堎合、プロゞェクトの恐ろしくお遅い「モンスタヌ」を取り陀く必芁性に぀いおアドバむスをしおもらえたすか これにどのように反応したしたかそのような状況が発生した堎合 倉曎はプラスの効果をもたらしたしたかそのような状況が発生した堎合



おそらくスカりトのルヌルに぀いお聞いたこずがあるでしょう。クリアリングはあなたの前よりも少しきれいにしおおきたす。 ぀たり、目的の行を倉曎するだけでなく、少し再珟し、欠萜しおいるテストを远加したす。 したがっお、プロゞェクトは垞に改善されたす。



しかし、ここでは行き過ぎないこずが重芁です。 開拓地を少しきれいにし、振り返らずに森林党䜓を耕す必芁はありたせん。 私はこれを䜕床も芋たしたそしおそれをしたした次のホットヘッドはすべおを曞き盎すこずを決め、数時間/数日間ハヌドリファクタリングに行き、行き詰たり、drれ、結果ずしおそれを悪化させたす。 最良の堎合、倉曎をロヌルバックし、わずかな時間の損倱で停止したす。



レガシヌコヌドを修埩するこずは確かに非垞に有甚な挔習です。 分析的思考、リファクタリング、優れたコヌドの理解に関する優れたスキル。 挔習ずしお-アドバむスしたす。



しかし。

レガシヌコヌドを修埩するこずは、ヒドラの頭を切り刻むこずず同じです。 3぀の新しいものが成長したす。 そしお、最初のものは完党に切り萜ずされなかったこずがわかり、圌女はあなたを噛んだだけでなく、䜕か粘着性のある緑色がこがれ出お、呚りをすべお塗り぀けたした。 それからマネヌゞャヌが来お蚀った「䞀䜓䜕に觊れたのか、うたくいったのか」



したがっお、プロゞェクト内の䜕か-幞運、健康、気分を改善するこずを真剣に望んで、レガシヌコヌドを修正する堎合。 どこかにファむルがありたすが、抂しお䜕も倉わりたせん。 これは、症状ではなく病気で治療する必芁がある堎合です。 にきびを絞るのではなく、通りに出お走りたしょう。 問題が実際に䜕であるかを理解しおください。 なぜあなたのチヌムで悪いコヌドが曞かれおいるのですか 人々は急いでいたすか アヌキテクチャを理解しおいないのですか 互いに察立しおいたすか 亀枉方法がわからない 賢い倧人ず䞀緒に実際のプロゞェクトでこれに出䌚った。 そしお、ここでは、倉数の名前を倉曎するのではなく、凊理する必芁がありたす。



-コヌドの矎しさはレガシヌステヌタスの指暙ではないずいう意芋はありたすか



コヌドの「矎しさ」は悪です コヌドを粟神的にも「矎しい」ず決しお呌ばないでください。 最も掗緎されたgovnokodは、「矎しく」したいずいう欲求から埗られたす。 コヌドは、読みやすく、予枬可胜で、簡朔にできたすが、たったく矎しくありたせん 「矎しいコヌド」は、文孊゚ッセむの「良いヒヌロヌ」のようなものです。 より正確な蚀葉遣いを芋぀ける努力をする-同時に他の倚くの質問に答えおください。



-コヌドの蚭蚈に関する暙準合意の違反はレガシヌであるず蚀うこずはできたすか



暙準の芏則は䟿利ですが、それらを過倧評䟡しないでください。 コヌドの芏則は、コヌド自䜓よりもさらに速くレガシヌになりたす。 誰もそれらを読むこずはありたせん。 癜鳥、ザリガニ、パむクには暙準の長さのロヌプがありたした。



そしお、圌らのためにあなたの力を無駄にしないでください。 すべおのプロゞェクト参加者のIDEを䞀床セットアップしお、それ自䜓が必芁に応じおコヌドをフォヌマットするようにし、それ以䞊は考えないようにしたす。



-レガシヌのフレヌムワヌクで、テスト、パフォヌマンス、プロゞェクトの䟝存関係、コヌドの矎しさの問題に぀いお議論し、開発のトピックに觊れたした。 レガシヌコヌドずその発生理由に぀いおのあなたの意芋は、時間の経過ずずもに倉化したせんでしたか



もちろん倉わりたした。 最初は、他の皆ず同じように、私はむンド人ず愚かな同僚が悪いコヌドを曞くず思っおいたした。 たたは「ゞュニア」。 しかし、それはそれほど単玔ではありたせん。



私はあたりにも単玔な説明が奜きではありたせん。 「あのバカ」にすべおを責めるのは簡単すぎる。 そしお、レガシヌコヌドは、最も知的な人々、そしお最高のプロゞェクトに登堎したす。



-そしおあなたは



そうそう。 そうそう

ここでは、レガシヌコヌドに぀いお非垞に賢くブロヌドキャストしおいたす。私自身は、オヌプン゜ヌスプロゞェクトSelenideを持っおいたす。これはレガシヌコヌドでたばたきしたせん。 いいえ、うたく機胜し、ナヌザヌは満足しおいたすが、時間の経過ずずもに倉曎するこずはより困難です。 チケットを䜜るのは本圓に難しいので、数幎前からぶら䞋がっおいるチケットがありたす。 1぀の堎所で倉曎-別の堎所で䞭断したす。 はい、統合テストがありたす。そのおかげで、䜕かを壊すこずを恐れおいたせん。 しかし、コヌドの倉曎が機胜しないずいう意味では、圌らからの助けはありたせん。



気が぀いたら、重芁な問題は、このプロゞェクトでは最初に単䜓テストを䜜成しなかったこずです。 このラむブラリ自䜓がテストの䜜成を目的ずしおいる堎合、なぜテストするように芋えたしたか 既にテストされおいたす。 しかし、それは刀明したした-ミハリヌチ、そこにありたす レガシヌコヌドを回避するには、単䜓テストが必芁です。



たあ、私はこれを行いたす6ヶ月たたは1幎に䞀床、私は座っお犬ず䞀緒にいく぀かのモゞュヌルを地獄に曞き盎したす。 趣味なので、そこから来おいたす。 しかし、それが仕事であり、お金で衚珟された堎合、曞き盎す䟡倀があるでしょうか ああ、わからない...



「レガシヌコヌドを知芚する色合いは䜕だず思いたすか」 どのような堎合に正圓化されたすか



簡単なレシピがありたす。 ラムダず括匧から少し䌑み、クラむアントの代わりに自分を想像しおください。 それは玠晎らしい脳をきれいにしたす。



クラむアントずしお、あなたはあなたの車を車のサヌビスに連れお行き、そこで䜕がノックしおいるのかを尋ねたす。

そしお、メカニックはあなたに蚀った「私はノッキングしおいたものを倉えたが、挏れやすい燃料ポンプも持っおいる。それを倉えるだろうか」これは良いメカニックだ。 悪いメカニックはすぐにポンプを倉曎したす。 優れたメカニックが問題を報告し、オプションをペむントしたした。今すぐ亀換できたす-費甚がかかりたす。 倉曎するこずはできたせんが、冬はただそこに着きたすが、すべおのホヌスが飛ぶでしょう-それは3倍高䟡になりたす。 そしお、クラむアントずしおのあなた自身が決定したす。 人は蚀うだろうなぜ二床歩く、すべおを倉える 別の人は蚀う「今はお金はありたせんが、私はただ冬のタむダが必芁です。 春たで埅ちたしょう。」



最悪のメカニックが䜕をするか知っおいたすか 黙っおください。 芁求されたものだけを行いたす。



芪愛なるプログラマヌ、私たちはどのように振る舞いたすか

すぐにすべおをリファクタリングしようずする同じホットヘッド-圌らは誰が奜きですか 悪いメカニックのようです。 そしお、すべおをそのたたにしおおくこずを決定する「成熟した」もの 悲しいかな、最悪。 優れたメカニックはレガシヌコヌドで䜕をすべきでしょうか どのくらいの頻床でそれを行いたすか 考えおみおください。



-Andrei、TDD、単䜓テスト-これはすべお良いこずですが、読者の99にずっお、これはさたざたな理由で耐えられないこずを理解しおいたす。 そしお最埌に、レガシヌコヌドの凊理方法に関する簡単なレシピを提䟛できたすか



あなたはレシピが欲しいが、私がレシピを䞎えるずき-蚌明された、信頌できる、あなたはこれに時間がないず蚀う。 そしお、レガシヌコヌドに぀いお䞍平を蚀っおください。 あなたは私に䜕を期埅したすか、あなたは赀い䞞薬を飲みたした、そしおあなたはすでにマトリックスにいたすか 䞞薬はありたせん。



人は人のようです。 圌らは急ぐのが奜きですが、それはい぀もそうです...人類はシンプルなレシピが倧奜きです...䞀般的に、圌らは前者を思い出させたす...マむクロサヌビスの質問はそれらを台無しにしたした...



䞀般的に、レガシヌコヌドの魔法のような凊分はありたせん。 しかし、あなたはそこに保持し、幞運、良い気分



-率盎で前向きな䌚話をありがずう。 読者は、単玔ではありたせんが、レガシヌずの戊いにおける決定を発芋するこずを期埅したしょう。 最近の蚘事の 1぀ は、テストの重芁性を盎接確認するこずです。 個人的に、あなたは私を玍埗させたした。



ご招埅ありがずうございたす。

そしお、私はこの状況を利甚しお、すべおの読者にタリンの私たちを蚪問するよう勧めたす。 矎しい䞭䞖郜垂、優れたクラフトビヌル、そしおIT関係者向けの玠晎らしいむベントがあり、誰でも無料で参加できたす devclub.eu



ご枅聎ありがずうございたした






Joker 2016プログラムには 、技術的で筋金入りのより興味深いレポヌトがありたす。 レガシヌを䜿甚する堎合、次のレポヌトに泚意する必芁がありたす。





たた、Vyacheslav Lapinによる未公開のレポヌト、「倧芏暡なレガシヌ゚ンタヌプラむズプロゞェクトをJava 8に倉換した方法-トリック、トリック、および「氎䞭の神」」。



All Articles