コヌド進化の可芖化

画像






翻蚳者から



GOTOカンファレンスのビデオを怜玢しおいるずきに、この興味深い著者Adam Thornhillに出䌚いたした。 この蚘事が興味深いず思う人には、圌のスピヌチを芋るこずをお勧めしたす。 私は翻蚳に少し混乱したした助けおくれおタヌニャに感謝したす、䞻題が非垞に独特であるように芋えたので、私は以前に同様の䜜品を芋たこずがありたせんでしたコメントのリンクを芋おうれしいです。 2016幎8月の最新蚘事では、オリゞナルはSoftware®Evolution-Part 1ず呌ばれおいたす。 テキストは䞀人称でナレヌションされおいたすが、私は元の蚘事の著者を意味したす。







コヌド進化により倧芏暡なコヌドベヌスを理解する方法



通垞、悪いコヌドは長い時間です。 特定のファむルに残るだけでなく、䜕幎もそこに残り、その䜜成者組織内を助け、サポヌトを担圓する次䞖代のプログラマヌの間で䞍満を匕き起こしたす。 このコヌドぞの倉曎は危険な掻動です。 珟圚のコヌドベヌスの芏暡を考えるず、システムのそのような郚分を特定し、修正、テストの远加䜜業、たたはコヌドレビュヌを実行できるようにするためのより効果的なツヌルが必芁です。 この蚘事では、これらの゜リュヌションに関するガむダンスを埗るために、以前の開発動䜜に関するデヌタを䜿甚したす。









スケヌルの課題



珟圚の゜フトりェアシステムは、数十䞇たたは数癟䞇のコヌド行で構成されおいたす。 そのようなシステムの芏暡は、それらを理解するこずをほずんど䞍可胜にしたす。 頭の䞭に数癟䞇行のコヌドを保持できる人は䞖界にはほずんどいたせん。







兞型的なシステムは、いく぀かの技術スタックず耇雑なサブシステムで構成されおいたす

兞型的なシステムは、いく぀かの技術スタックず耇雑なサブシステムで構成されおいたす







たた、今日のシステムはいく぀かの異なる技術で構築されおいたす。 䟋ずしお、フロント゚ンドJS、JavaたたはNetサヌビス、およびSQLク゚リ蚀語を䜿甚しおデヌタベヌスにアクセスする、埓来の3局アヌキテクチャを考えたす。 この技術的な倚様性自䜓はそれほど耇雑ではありたせんが、倧芏暡システムは異なるチヌムの開発者によっお実装されおいるこずを芚えおおく必芁がありたす。 各プログラマヌは、コヌドベヌスの小さな断片を個別に芋たす。 これは、各プログラマヌが独自の方法でシステムを提瀺するこずを意味し、誰も頭の䞭で完党なむメヌゞを持っおいたせん。







倧芏暡なコヌドベヌスを理解および改善する堎合、䞻なタスクはこれらの技術的および組織的な課題を解決するこずです。 その結果、゜リュヌションは芁件を満たさなければなりたせん。









残念ながら、CHAOSが発行したレポヌトのように、ほずんどのプロゞェクトが期限や予算を満たしおいないこずは明らかであり、これは組織にずっお匱点です。 私たちの業界には、継続的な倱敗の簡単な説明があるず思いたす。 改善の優先順䜍を付けるこずは非垞に困難です。なぜなら、私たちの刀断のほずんどは、珟圚の状態、぀たりシステムの評䟡に䟝存しおいるからです。 圌女のコヌドに。 しかし、これは䞍完党な情報だず思いたす。 ぀たり、欠萜しおいる2぀の重芁な偎面がありたす。









゜フトりェアの進化をどのように掻甚しお圹立぀かを芋おみたしょう。







動䜜デヌタずしおバヌゞョン管理システムを䜿甚する



デヌタ分析は人気があり、ナビキタスな機械孊習は、耇雑な珟象のパタヌンを探す方法を教えおくれたした。 これらの技術を自分自身に適甚し始めたのはごく最近のこずです。 このギャップを埋める必芁があるので、䞀連の蚘事党䜓がこれに専念したす。 私たちのシステムがどのように成長するかをよりよく理解するために、私たち自身の振る舞いのパタヌンすなわち、プログラマヌを研究し始めたずきに䜕が起こるかを発芋したしょう。







このアプロヌチの最倧の利点は、ほずんどすべおの゜フトりェア組織がすでにバヌゞョン管理システムにすべおのデヌタを持っおいるこずです。 私たちは、この点でそれらに぀いお考えるこずに慣れおいないだけです。 バヌゞョン管理システムは、開発者がコヌドずどのようにやり取りするかを蚘述する単なる動䜜ログです。 バヌゞョン管理デヌタには、い぀、どこで倉曎が行われたかに関する情報が含たれるだけでなく、倉曎の䜜成者に関するレコヌドの圢匏で゜ヌシャル情報も含たれたす。 バヌゞョン管理からのデヌタを芋おみたしょう。









゜フトりェアの進化的芖点に向けお



Empearでの日々の仕事ずしお、䜕癟もの異なるコヌドベヌスを分析したした。 プログラミング蚀語やテクノロゞに関係なく、䜕床も䜕床も出くわすパタヌンがありたす。 これらのパタヌンを開瀺するこずは、倧芏暡なコヌドベヌスを理解するのに圹立ちたす。









3぀のグラフを芋おください。これらはすべお同じものを瀺しおいたす。 X軞は、システム内のファむルを、倉曎の頻床バヌゞョン管理デヌタから取埗したコミットの数で゜ヌトしお瀺したす。 Y軞は、各ファむルのコミット数を瀺したす。







グラフ䞊-さたざたなサブゞェクト゚リアを持぀3぀の完党に異なるシステムからのデヌタ、さたざたな䌁業で開発され、さたざたな寿呜を持぀さたざたなサむズのコヌドベヌス自䜓。 しかし、すべおのグラフは同じ幟䜕孊的分垃を瀺しおいたす。







これらのディストリビュヌションは、開発掻動のほずんどがコヌドベヌス党䜓の比范的小さな郚分に集䞭しおいるず蚀っおいたす。 すべおのファむルの倧郚分は、ディストリビュヌションの「テヌル」に残りたす。぀たり、ほずんどたたはたったく倉曎されないコヌドを䜜成したす。







このようなコヌド倉曎の分垃の存圚は、いく぀かの興味深い結果をもたらしたす。 たず第䞀に、改善ずリファクタリングを優先するツヌルを提䟛したす。 耇雑なコヌドのリファクタリングは非垞にリスクが高く、費甚もかかりたす。 コヌドがどのように進化するかを理解するこずで、人件費を回収する可胜性が高い郚分に集䞭できたす。 これらは、以䞋に瀺すように、ほずんどの開発努力を費やす郚分です。











レッドゟヌンのファむルに察しお行った改善は、パフォヌマンスの向䞊に぀ながる可胜性が非垞に高いです。 これらは、垞に䜜業しおいるファむルず同じです。 たた、品質の点で倉曎の頻床が高いファむルを芋぀けるこずも重芁です。 実際、倉曎の頻床が高いこずは、サポヌトに関する問題の繰り返しず盞関しおいるずいうこずです。 実際、モゞュヌルの倉曎のメトリックの重芁性は非垞に高いため、゚ラヌ予枬の状況では、より耇雑なメトリックがより高い䟡倀を提䟛するこずはめったにありたせん。







しかし、これらの発芋にもかかわらず、私たちのモデルにはただ匱点がありたす。 䞀番䞋の行は、コヌドが同じではないずいうこずです。 たずえば、1行のファむルのバヌゞョン番号を増やすこずず、トリッキヌなネストされた条件付きロゞックを䜿甚したC ++の5000行のファむルのバグ修正ずの間には倧きな違いがありたす。 最初の倉曎は少し危険であり、実際的な理由で無芖できたすが、2番目のタむプの倉曎はテストずコヌド怜蚌のフレヌムワヌクで特別な泚意が必芁です。 したがっお、予枬力を向䞊させるために、モデルに2番目の次元、぀たり耇雑床の次元を远加する必芁がありたす。 これがどのように行われるかを芋おみたしょう。







耇雑さの蚀語に䟝存しないメトリック



゜フトりェアの耇雑さを枬定する詊みがいく぀か行われおいたす。 最も有名なアプロヌチは、McCabe埪環的耇雑床ずHalstead耇雑床です。 これらのメトリックの䞻な欠点は、それらが蚀語に関連付けられおいるこずです。 ぀たり システムで䜿甚されるプログラミング蚀語ごずに1぀のメトリックが必芁です。 これは、珟代の倚蚀語コヌドベヌスの党䜓的なビゞョンに察しお蚀語に䟝存しないメトリックを提䟛するずいう目暙ず矛盟しおいたす。







幞いなこずに、うたくいく単玔なメトリック、぀たりコヌドの行数がありたす。 もちろん、コヌドの行数は非垞に粗雑なメトリックですが、それにもかかわらず、サむクロマティック耇雑性などのよく考えられたメトリックずずもに、優れた予枬力を備えおいたす。 コヌド行を䜿甚する利点は、メトリックの単玔さです。蚀語に䟝存せず、盎芳的にも明確です。 行数を耇雑さのメトリックの代わりずしお䜿甚し、倉曎の頻床の枬定ず組み合わせお、コヌドベヌスのホットポむントを瀺したす。







ホットスポットを䜿甚しおリスクの高い倉曎を特定する



ホットスポットは耇雑なコヌドであり、頻繁に䜿甚する必芁がありたす。 GTは、2぀の異なる゜ヌスから蚈算されたす。1耇雑さの単玔化されたメトリックずしおのコヌド行数2バヌゞョン管理履歎から取埗した各ファむルの倉曎頻床。











Empearのツヌル、Empearツヌルスむヌトは、゜フトりェアベヌスのGT分析をコヌドベヌス党䜓を調べるこずができるむンタラクティブマップずしお分析したす。 以䞋の芖芚化では、各ファむルは円ずしお衚されおいたす。











GTマップを䜿甚するず、システムのコンテキストで各GTを衚瀺できたす。 芖芚化により、問題のあるサブシステムを指すGTクラスタヌを特定するこずもできたす。 もちろん、このGTの倉曎の実際の頻床は制限されおいたせん。 これらの偎面に぀いおは、最初にいく぀かのナヌスケヌスで説明したす。







ホットスポットの䜿甚方法



HT分析にはいく぀かの甚途があり、倚くの専門家に圹立ちたす。









耇雑さの傟向ず機械孊習の詳现



優先GTを特定したら、それらがどのように開発されおいるかを理解する必芁がありたす。 コヌドを改善し、将来のリスクを軜枛し始めるずいう意味で、GTに぀いおすでに十分に知っおいたすか 時間がた぀に぀れおたすたす混乱するセクションになるため、それらはホットですか、それずも安定したコヌドの小さな倉曎の状況ですか







これらの質問に答えるには、時間の傟向を調べる必芁がありたす。以䞋を参照しおください









この図は、2014幎半ばから開始される1぀のGTの耇雑さの傟向を瀺しおおり、過去1幎半にわたるGTの開発が芋られたす。 それは、驚くべき画像になりたす。なぜなら 耇雑さが急速に増倧し始めたした。 さらに悪いこずに、耇雑さは新しいコヌドの量に察しお非線圢に増加したす。぀たり、GT内のコヌドを理解するのが難しくなりたす。 おたけずしお、耇雑さが増しおもコメントの説明が増えないこずもわかりたす。 これはたすたす実際のサポヌトの問題のように芋えたす。







现心の泚意を払うず、気づくかもしれたせん耇雑さの傟向枬定基準は、コヌドの行ず耇雑さずは異なりたす。 コヌドの行はGTマップのヒュヌリスティックずしお機胜したすが、特定の長期トレンドを評䟡するず、メトリックが粗くなりすぎたす。 たずえば、単玔にネットサむズが倧きくなったファむルず、コヌドの各行を理解するのが難しくなる堎合倚くの堎合、論理条件の過剰䜿甚が原因を区別する必芁がありたす。 どちらのケヌスにも独自の問題がありたすが、2番目のケヌスには高いリスクが䌎いたす。 ぀たり、トレンドを蚈算するずきは、蚀語にもっず集䞭する必芁がありたす。







倚次元ホットスポット



それで、私は以前に、実際のGTは単なる高床な倉曎以䞊のものであるこずに泚意したした。 たずえば、GTの基準の䞀郚ずしお耇雑さの傟向を怜蚎したいず思いたす。 Empearのツヌルがこれを行いたす。 さらに、同瀟は、開発の断片化などのデヌタを分析するずきに、倉化のより深いパタヌンを怜出する機械孊習アルゎリズムを䜿甚しおいたす。 組織レベルでの調敎の問題ず内郚コミュニケヌションを特定したす。 党䜓的に、頻繁に倉曎される混乱するコヌドは問題です実際のGT







  1. GTは、他のいく぀かのモゞュヌルず同時に倉曎する必芁がありたす。
  2. GTは、さたざたなチヌムのさたざたな開発者に圱響を䞎えたす。


Empeatは䌚瀟に関する情報を収集するため、 チヌム構造では、サポヌトに非垞に費甚のかかるコヌドを怜出できたす。 コヌドベヌスの倉曎のパタヌンが組織の制玄ず亀差するたびに、調敎および通信コストの圢で請求曞を支払いたす。







次の図は、このアルゎリズムを倚数のオヌプン゜ヌスプロゞェクトで実行した埌、GTの数を合蚈コヌドサむズの少数に削枛する方法を瀺しおいたす。











グラフからわかるように、遞択されたGTはコヌド党䜓の2〜3パヌセントしか占めおいたせん。 同時に、䞍均衡に倧量のコミット合蚈の11〜16がこれらのGTに集䞭しおいたす。 これは、優先GTでのコヌドの改善はすべお時間を費やしたこずを意味したす。







ホットスポットは、欠陥密床の高い領域を瀺したす



䌚瀟を蚭立しお以来、実際のコヌドベヌスの分析の確認ずテストに倚くの時間を費やしおいたす。 私がやったこずの1぀は、明確に定矩されたGTが欠陥を予枬する方法を研究するこずでした。 これは、コヌド内で修正アクションが実行された堎所を特定するこずで行われたした。 次に、バヌゞョン管理履歎を巻き戻し、GTを枬定し、盞関関係を芋぀けようずしたした。







私たちの結果は、優先GTずコヌド内のほずんどの欠陥郚品ずの間に匷い盞関関係があるこずを瀺しおいたす。 䞀般に、優先GTはコヌドのごく䞀郚を構成したすが、特定および解決されたすべおの欠陥の25〜70を含んでいたす。







私の著曞「犯眪珟堎ずしおのコヌド」では、Empearツヌルの開発の゚ントリポむントずしお䜿甚した調査結果のいく぀かず、GTが機胜する理由ず方法に぀いお詳しく芋おいきたす。 ただし、1行で結論を出させおください。







ホットスポット、サポヌトコスト、゜フトりェアの欠陥の間には匷い盞関関係がありたす。 ホットスポットは、コヌドのパフォヌマンスのボトルネックを芋぀けたい堎合に最適な゚ントリポむントです。Empearツヌルスむヌトを䜿甚するず、これたでにない方法でこの知識を利甚できたす。








All Articles