将来の開発者のために働く

通垞、成功する゜フトりェア補品は、その寿呜にわたっお倚くの開発者の手に枡りたす。 あなたはあなたのプロゞェクトの保護者のチェヌンのリンクの1぀にすぎず、あなたが曞いたコヌドの各行は、将来の開発者によっおい぀か研究されるあなたが残したアヌティファクトです。 あなたがあなたの前に来た開発者の決定を匕き継いだように、他の開発者はあなたが今日䞋した決定を匕き継ぎたす。 圌らは私たちからのすべおの誀解、私たちによる角を切る、私たちによっお適甚された誀解されたパタヌンず技術、现郚ぞの䞍泚意、私たちの怠iness、私たちの倉化、ホむップアップされた倉曎、キャビネットのスケルトン、汚れた掗濯物を受け継いでいたす。 そしおはるかに少ない-私たちの芏埋の利点、私たちの議論ず準備。







プロゞェクトの開発者ずしお、あなたは将来の開発者のニヌズを予枬し、䞖話をするのに可胜な限り最高の立堎にいたす。 私たちのプロゞェクトで私たちが䞋す良い決定はすべお、その生産性に波及効果をもたらしたす。 なぜこれが重芁なのですか Bob MartinがClean Codeで尋ねおいるように、「悪いコヌドで問題が発生したこずはありたすか では、なぜそれを曞いおいるのですか」 将来プロゞェクトに取り組むチヌムの䞖代の条件を改善するのず同じ戊略が、珟圚のチヌムに圹立ちたす。 6か月前に立ち埀生したコヌドの暗い隅に戻るず、Future Developerが初めお目にするずきに知るよりも、もう少し詳しく知っおいたす。 あなたが他の開発者に任せるヒントず光沢から、あなた自身が将来利益を埗るでしょう。 状態が悪く、チヌムの枯枇に぀ながる貢献が難しいプロゞェクト。 䜜成しおいる補品の品質ず将来のサポヌトの容易さに投資するこずは、未来ず珟圚のための幞せで生産的な職堎ぞの投資です。



Future Developerを盎接成功に導くために䜿甚できるいく぀かのプラクティス特定の順序なしを䜜成したいず思いたす。



1.党䜓的なリファクタリング



プロゞェクトが叀くなり、芁件が耇雑になるに぀れお、この耇雑さを制埡するために新しいパタヌンず手法を適甚するよう努めおいたす。 パタヌンたたはアプロヌチが割り圓おられたタスクに察凊するかどうかをすぐに蚀うこずはできたせん。 ほずんどの堎合、別の開発者がコヌドのこの郚分を倉曎しなければならないずきに、その重芁性の確認たたは反論が珟れたす。 これらのパタヌンは、問題を解決するために受け入れられる合意に成長する堎合がありたす。



これには倧きな利点がありたす。それは私たちの意図を説明しおいたす。 同様の方法でコヌドの問題を解決しようずするず、将来の開発者はコヌドの断片がどのように連携するかを予枬し始め、それによっお蚺断ず倉曎に必芁な時間を短瞮できたす。



倚くの堎合、私たちが予玄しおいるのは、合意に至らなかったり、叀いゎミのようなコヌドで無芖されたりしおいないパタヌンのミッシュマッシュです。 これはさたざたな理由で発生したす。受け入れられた契玄がプロゞェクトの他の領域に適甚されるほどうたく機胜しないか、新しい開発者が目暙を達成するための適切な契玄たたはパタヌンの存圚を知らなかった可胜性がありたす。



Ruby on Railsの内郚には、倚くの匷力なビュヌず芏則が確立されおいたす。 これにより、開発者はプロゞェクトに接続し、すぐに生産性を高めるこずができたすただし、以前にこのフレヌムワヌクを䜿甚した経隓があれば。 時々、私たちはこれらの合意を無芖し、それによっおそれらの匷さを匱めたす。 たずえば、鉄道プロゞェクトでは、いく぀かの異なるスタむルで構築されたコントロヌラヌに定期的に気付くこずができたす。 resource_controller



ようなものを䜿甚しお䜜成されるものもあれば、Railsで採甚されおいる暙準のresource_controller



芏則に埓うものもあれば、ランダムアクションからの単なるゎミダンプです。 別の䞀般的なアンチパタヌンはプロゞェクト党䜓に散らばり、可胜な堎合はどこでも構成デヌタを初期化したす。



システムを構成するために半ダヌスの異なる方法をサポヌトする必芁はなく、プロゞェクト内でどの原則を構築する必芁があるかによっお、システムを明確か぀理解可胜にする必芁はありたせん。 1぀のアプロヌチを詊しお受け入れた埌、時間をかけお叀いコヌドに戻り、新しい方法でリファクタリングしたす。 これは、arbitrary意的な制限を課す必芁があるずいう意味ではありたせん。 たずえば、構成の䞀郚をプロゞェクト内に保持し、環境倉数に䞀郚を配眮しお展開を支揎するこずは理にかなっおいたすが、同時に、構成デヌタを䜿甚するための1぀の共通の構造ずアクセスパタヌンが必芁です。



READMEたたはドキュメントリポゞトリに契玄を远加したす。 最初に、これにより、将来の開発者がシステムに新しい機胜を远加しやすくなり、コンポヌネントの構築方法を理解できるようになりたす。



2.デッドコヌドを根絶する



しばらくの間すでに存圚しおいたシステムのもう1぀の䞀般的な機胜は、デッドコヌドの圢の苔の局です。 これらはプロゞェクトのコンポヌネントであり、以前はビゞネスにずっお重芁でしたが、時代遅れであり、長い間誰も必芁ずしたせんでした。 ほずんどの堎合、プロゞェクトでは、機胜のそのような郚分をチェックするフルスタック受け入れテストを倚数芋぀けるこずができたすが、これらのテストは残りの通過を遅くするだけです。



この機胜が二床ず需芁にならないこずを垞に確信できるずは限らないため、そのようなコヌドを削陀したがらないこずがありたす。 経営者に尋ねるず、「い぀か離れお、い぀か䟿利になりたす」ずいう質問に答えたす。 これは間違ったゞレンマです-将来的には指のスナップだけで再び䜿甚できる可胜性があるため、ゆっくりず腐敗するコヌドを維持する必芁がありたす。 このコヌドが無関係であるためにこのコヌドをバむパスした堎合、指をクリックするだけで、倧きな劎力をかけずに機胜するようになる可胜性は䜎くなりたす。 あなたは叀いコヌドがあなたを䞀番䞋に匕っ匵っお、それをサポヌトするのに時間を費やすこずを心配しおいたす、それはい぀かそれが必芁になるずいうわずかな可胜性があるからです。 たぶん。 気づきたせんが、それに倚くの時間を費やし、そのようなコヌドを削陀する代わりに、リポゞトリでゆっくりず腐敗させたす。



しかし、このコヌドの存圚は、将来の開発者にずっお朜圚的なトラップになるこずをさらに犠牲にしたす。 これは、実際に生きおいるシステムのコンポヌネントから泚意をそらし、システムのある偎面を理解たたはデバッグしようずするず、誀ったトレヌスに぀ながる可胜性がありたす。 緊急事態では、すべおが萜ちたずき、デッドコヌドは貎重な時間を費やすためにしばらく埅぀ノむズです。 リポゞトリで関連性のある掻発で実際に機胜するコヌドのみをサポヌトするこずにより、プロゞェクトをサポヌトするための党䜓的なコストを削枛し、将来の開発者がシステム党䜓をより速く理解できるようにしたす。



長い間攟棄されおきたコヌドを削陀したす。 最終的には、埌で戻る必芁がある堎合に備えお、バヌゞョン管理䞋にありたす。 「埌で圌に戻る」必芁性にだたされおはいけたせん。 このコヌドになんらかの意味がある堎合、なぜ䜿甚されなくなったのですか



3.情報を送信する



実際、私たちのプロゞェクトに加えお、コヌドを曞くために䜿甚するツヌルのいく぀かにも成果物がありたす。 たずえば、git commitで良いメッセヌゞの衛生状態を構成するものに぀いおは、倚くの受け入れられた慣行がありたすが、プロゞェクトはただそのようなコミットストヌリヌを収集しおいたす。

 jp@oeuf:~/workspace/blog(master*)$ git log --oneline app/controllers/application_controller.rb 8ec7f99 fuck i dunno lol ffa919a shut up, atom parser a33e9fa fixing again cecc9dc one more time 968a28f fixing 3e3aeb2 ws 1fc597e pagination edea155 adding dumb feature
      
      





将来の開発者が必然的にgit blameを䜿甚しおこの機胜のコンテキストを理解するようになる堎合は、ファむルで実際に䜕が起こっおいるのかを理解するのに圹立぀詳现を圌に残しおください。 --squash



、 commit --amend



、 rebase



およびその他のツヌルを䜿甚しお、ブランチを統合する前にコミットを䜿甚可胜な状態にしたす。 完了したらコミットを曞き盎したす。適切であるず思われるすべおのものを含めお、完了した䜜業を芁玄しおください。 正しい文法ず぀づり。 他の人が読んで理解する必芁があるものを公開しおいたす。 Future Developerにサヌビスを提䟛し、必芁な詳现を含むわかりやすい蚘録を確保しおください。

 jp@oeuf:~/workspace/blog(master*)$ git log app/controllers/application_controller.rb commit 8ec7f998fb74a80886ece47f0a51bd03b0460c7a Author: John Pignata <john@pignata.com> Date: Sat Nov 3 14:11:12 2012 -0400 Add Google Analytics helper commit 968a28f366e959081307e65253118a65301466f2 Author: John Pignata <john@pignata.com> Date: Sat Nov 3 13:49:50 2012 -0400 Correct ATOM feed validation issues Using the W3C Validator (http://validator.w3.org/appc/), a few trivial errors were reported: * <author> should have a <name> node within it and not text * Timestamps should be in ISO8601 format This change fixes these issues and improves the spec coverage for the XML document. commit 3e3aeb27ea99ecd612c436814c5a2b0dab69c2c3 Author: John Pignata <john@pignata.com> Date: Sat Nov 3 13:46:24 2012 -0400 Fixing whitespace We're no longer indenting methods after `private` or `protected` directives as a matter of style. This commit fixes whitespace in all remaining classes. commit 1fc597e788442e8cc774c6d11e7ac5e77b6c6e14 Author: John Pignata <john@pignata.com> Date: Sat Nov 3 12:34:50 2012 -0400 Implement Kaminari pagination Move from will_paginate to kaminari in all controllers. The motivation is to be able to paginate simple Array collections without the monkey patching that will_paginate uses. * Consolidate helpers * Clean up whitespace commit edea15560595bab044143149a7d6e528e8ae65d2 Author: John Pignata <john@pignata.com> Date: Sat Nov 3 12:27:16 2012 -0400 Add ATOM feed for RSS readers * Include Nokogiri in Gemfile for its builder * Add AtomFieldBuilder model * Add link to feed from index page
      
      





4.むンタヌフェヌスに光沢を向ける



䞀郚のルビヌは、オブゞェクト内の芖芚的なメ゜ッドを避けおいたす。 目的は䜕ですか ずにかく、実際にはsendを介しおメ゜ッドが呌び出されたす。 なぜそれらのいく぀かをシャックルしたすか メ゜ッドを他のヒヌプに远加するだけで、将来の開発者がそれを䜿甚したい堎合は可胜です 私たちはみんな倧人ですよね



システム内の各オブゞェクトが単なるメ゜ッドのダンプである堎合、個々のオブゞェクトがどのように䜿甚され、どのメッセヌゞが意図されおいるかを理解するこずは、あなたを含めお誰にずっおも難しくなりたす。 オブゞェクトのパブリックむンタヌフェむスの蚭蚈では、システム内の他のオブゞェクトがオブゞェクトずどのようにやり取りできるかを明確にする必芁がありたす。 システム内の各オブゞェクトの圹割ずそれらの間の盞互䜜甚が明らかでない堎合、各オブゞェクトを個別に理解するだけでなく、システム党䜓を理解するのにかかる時間が長くなりたす。



むンタヌフェヌスを小さく、集䞭させるために、できるだけ倚くのコンポヌネント内郚を非衚瀺にしたす。 プロパティのパブリックむンタヌフェむスが明確で䞀貫性があり、名前が適切であるこずを確認するために、さらに努力しおください。 これにより、将来の開発者は、各オブゞェクトの䜿甚方法に぀いお理解しやすい信号を受け取り、各オブゞェクトを再利甚する方法を匷調したす。 これらの前提を䌝え、パブリックむンタヌフェむスの明確な境界を尊重するために、メ゜ッドの可芖性を明瀺的に述べたす。



5.コメントを残したす。ほずんどはRDocです。



開発者ずしおのコヌド内のコメントに察する私たちの感情は、矛盟しおいるず最も正確に説明できたす。 䞀方で、コメントは読者が特定のコヌドがどのように機胜するかを理解するのに非垞に圹立ちたす。 䞀方で、それらの正確性を保蚌するものは䜕もありたせん;コヌドに関するコメントは、翌で埅っおいる嘘です。 開発者に尋ねるず、圌らはドキュメントを高く評䟡しお読んでいるず答えたすが、ほずんどのプロゞェクトには実際には小さな、ほずんど倱われた関連性のREADMEファむルず近くのりィキ墓がありたす。 さらに、オヌプン゜ヌスラむブラリを䜿甚する堎合、詳现なRDocドキュメント、新鮮なREADMEファむル、優れたコヌド䟋が必芁になるこずがよくありたす。 くそヌ開発者ドキュメントをサポヌトしおいたせん。おそらく誰かが圌のためにそれをするこずを期埅しおいたす。



Single Responsibility Principleのようなこずに泚意を払い、オブゞェクト間の匱い接続のパタヌンを䜿甚するほど、プログラムの期間䞭に結合された倚くの小さなオブゞェクトで構成されるシステムが芋え始めたす。 これにより、システムはより柔軟になり、オブゞェクトを䜕床も䜿いやすくなりたすが、劥協点がありたす。倧芏暡システム内のオブゞェクトの堎所を理解するのが難しくなり、より倚くの劎力ず時間が必芁になりたす。 通垞のリファクタリング手法をすべお適甚しお、面倒な行間コメントを削陀し、オブゞェクトをできる限り読みやすくするこずができたすが、システム内でオブゞェクトがどのように盞互䜜甚するかは、Future Developerを混乱させる可胜性がありたす。



RDocスタむルのドキュメントは、倚くのオヌプン゜ヌスプロゞェクトにありたす。 Googleを䜿甚しおupdate_attribute



がコヌルバックを呌び出すかどうか、およびselect_tag



シグネチャを理解するず、通垞、Ruby On RailsのRDocペヌゞが衚瀺されたす。 プロゞェクトの同様のドキュメントを䜜成するず、将来の開発者は、システムの広倧なコンテキストでオブゞェクトの圹割を決定しようずするずきに、より理解するこずができたす。 クラスおよび/たたはメ゜ッドの䞊郚に短い宣蚀文があるこずは、コヌドの読者にずっお重芁なこずです。 しかし、これらのコメントの関連性をサポヌトする確立された文化がなければ、コヌドリヌダヌの芋圓識を損なうマむナスの効果もありたす。 ドキュメンテヌションの欠劂よりも悪いこずは、ドキュメンテヌションの質が悪いこずだけだずいうこずを忘れないでください。



6.意図を明らかにするテストを䜜成したす。



プロゞェクトにドキュメントを提䟛する1぀の方法は、テストを䜿甚するこずです。 テストでは、コンポヌネントの動䜜を蚘述するだけでなく、そのようなドキュメントが次のように高品質であるこずも確認したす。 圌女は凊刑されおいたす。 コメントずは異なり、テストにうそを぀くこずはできたせん。 それらは緑かそうでないかのどちらかです。 RSpecやminitest / specなどのツヌルは、このサむドドキュメントの生成に圹立ち、テストケヌスブロック内の散文を奚励したす。 残念ながら、赀緑緑のリファクタリングサむクル䞭に動䜜するコヌドを取埗しようずしお、過去の英語の単語を芋るこずもありたす。 英語の蚘述を無芖した結果、テストではオブゞェクトの動䜜が考えられおいるほど衚瀺されないこずがありたす。



テストがたったくないプロゞェクトを芋぀けるのず同じくらい苊痛です。テストがシステムの動䜜を理解するのに圹立たないプロゞェクトを芋぀けるのです。 テストもサポヌトを必芁ずするコヌドであるため、将来の読者にその目的を非垞に明確に説明する必芁がありたす。

 it "works" do data = File.open("fixtures/projects.txt").read index = ProjectIndex.new(data) index.should have(40).projects last_project = projects.last last_project.title.should eq("ORCA") last_project.customer.should eq("Romney-Ryan 2012") last_project.deploy_date.should eq(Date.parse("2012-11-06")) end
      
      





さお、ここで䜕が機胜したすか この説明は䞀蚀では意味がなく、この䟋では耇数のチェックが䞀床に実行されたすが、たったく意味がありたせん。



仕様のスタむルでテストを䜜成する堎合、英語の説明はあなたず䞀緒に行く必芁がありたす。 これを実珟する1぀の方法は、ドキュメント圢匏でRSpecを実行するこずです。

 jp@oeuf:~/workspace/project-manager(master)$ be rspec --format documentation spec ProjectIndex .new instantiates an index given the contents of a project CSV file #projects returns a collection of projects from the index Project #title returns the project title #customer returns the Customer record for the project #deploy_date calculates the deploy date from the latest project status
      
      





緑色のドットの森の代わりに、ドキュメント圢匏はネストされた説明、コンテキスト、および指定した䟋の芋出しを提䟛したす。 これにより、テストがオブゞェクトの実際の動䜜をどの皋床完党に明らかにするかをすばやく評䟡できたす。 この圢匏の出力に焊点を圓おるこずにより、テストスむヌトの通信䟡倀を倧幅に向䞊させるこずができたす。 赀緑緑のリファクタリングサむクルのリファクタリングステップを䜿甚しお、テストを、オブゞェクトの存圚理由、動䜜、およびこのように実行する理由の明確な説明に倉えたす。



将来の開発者は喜んで



これらは、他の誰かが請求曞を支払うずいう合理的な仮定の䞋で、倉曎に向けおプロゞェクトを準備する方法のほんの䞀郚です。 䜜業䞭の珟圚のプロゞェクトの構築ず運甚を担圓する次の目に぀いお考えおください。 サポヌトの難しさやリリヌスしたものの質の䜎さから、私たち党員が埌悔を感じおいたす。 したがっお、コヌドに残したすべおのかわいい熊手に察しお枩かい気持ちを抱くこずをやめ、代わりに、将来の開発者が到着のために地面をどれだけ準備したかによっおあなたに支払うべき酒の量をゆっくり蚈算し始めたす。



「未来の開発者」ずいう蚀葉を借りた読んだ盗んだDave Yeuに感謝したす。



考え、質問、コメントはありたすか それらを共有しおください Twitterでは@jpignataずいうニックネヌムで芋぀けるこずができたす。たた、john @ pignata.comで電子メヌルを受け取るこずもできたす。 読んでくれおありがずう



これは翻蚳であり、䞊蚘の座暙は元の蚘事の著者を指しおいるこずを思い出させおください。 PMでコメントやコメントをお寄せいただければ幞いです。 ありがずう



All Articles