Skip to content

Latest commit

 

History

History
379 lines (261 loc) · 44.9 KB

File metadata and controls

379 lines (261 loc) · 44.9 KB

認知負荷こそが重芁

読みやすい版 | 䞭囜語翻蚳 | 韓囜語翻蚳 | トルコ語翻蚳 | 日本語翻蚳

これは生きた文曞であり、最終曎新は2025幎8月です。あなたの貢献を歓迎したす

はじめに

䞖の䞭には倚くのバズワヌドやベストプラクティスがありたすが、そのほずんどがうたくいっおいたせん。私たちにはもっず根本的な、誀りようのないものが必芁です。

コヌドを読んでいお混乱を感じるこずがありたす。混乱は時間ずお金を消費したす。混乱の原因は高い認知負荷にありたす。これは決しお抜象論ではなく、人間の根本的制玄なのです。私たちはそれを実感できたす。

コヌドを曞くよりもコヌドを読んで理解するこずに費やす時間のほうがはるかに長いため、私たちは垞に、過床の認知負荷をコヌドに埋め蟌んでいないかを自問すべきです。

認知負荷

認知負荷ずは、開発者がタスクを完了するために考える必芁がある量のこずです。

コヌドを読むずき、倉数の倀、制埡フロヌロゞック、呌び出しシヌケンスなどを頭に保持したす。平均的な人はワヌキングメモリに玄4぀のチャンクを保持できたす。認知負荷がこの閟倀を超えるず、理解が䞀気に難しくなりたす。

完党に銎染みのないプロゞェクトにバグ修正を䟝頌されたずしたしょう。ずおも賢い開発者が貢献しおいたず聞かされたした。倚くの掗緎されたアヌキテクチャ、おしゃれなラむブラリ、最新のテクノロゞヌが䜿われおいたした。぀たり、著者は私たちに高い認知負荷を䜜り出しおいたのです。

認知負荷

私たちはプロゞェクトの認知負荷を可胜な限り枛らすべきです。

認知負荷ず䞭断

認知負荷の皮類

内圚的 - タスクの本来の難易床によっお匕き起こされたす。これは削枛できず、゜フトりェア開発の栞心にあるものです。

倖圚的 - 情報の提瀺方法によっお䜜り出されたす。タスクに盎接関係しない芁因、䟋えば賢い開発者のクセのようなもので匕き起こされたす。倧幅に削枛可胜です。私たちはこの皮の認知負荷に焊点を圓おたす。

内圚的 vs 倖圚的

倖圚的認知負荷の具䜓的で実践的な䟋にすぐに飛び蟌みたしょう。


認知負荷のレベルを以䞋のように衚蚘したす 🧠: 新鮮なワヌキングメモリ、認知負荷れロ 🧠++: ワヌキングメモリに2぀の事実、認知負荷増加 🀯: 認知過負荷、4぀以䞊の事実

私たちの脳ははるかに耇雑で未探玢ですが、この単玔化されたモデルで進めるこずができたす。

耇雑な条件文

if val > someConstant // 🧠+
    && (condition2 || condition3) // 🧠+++、前の条件が真で、c2かc3のいずれかが真である必芁性
    && (condition4 && !condition5) { // 🀯、この時点で理解が砎綻しがち
    ...
}

意味のある名前を持぀䞭間倉数を導入したす

isValid = val > someConstant
isAllowed = condition2 || condition3
isSecure = condition4 && !condition5 
// 🧠、蚘述的な倉数があるので、条件を芚える必芁がありたせん
if isValid && isAllowed && isSecure {
    ...
}

ネストしたif文

if isValid { // 🧠+、ネストしたコヌドは有効な入力にのみ適甚
    if isSecure { // 🧠++、有効で安党な入力にのみ凊理
        stuff // 🧠+++
    }
} 

早期リタヌンず比范しおみたしょう

if !isValid
    return
 
if !isSecure
    return

// 🧠、以前のリタヌンは気にしたせん。ここに到達したずいうこずは、すべおがOK

stuff // 🧠+

ハッピヌパス正垞系だけに集䞭でき、ワヌキングメモリをあらゆる前提条件から解攟したす。

継承の悪倢

管理者ナヌザヌのためにいく぀かの倉曎を䟝頌されたした🧠

AdminController extends UserController extends GuestController extends BaseController

ああ、機胜の䞀郚はBaseControllerにありたす、芋おみたしょう🧠+ 基本的な圹割メカニクスがGuestControllerで導入されたした🧠++ UserControllerで郚分的に倉曎されたした🧠+++ ぀いにここに来たした、AdminController、コヌディングしたしょう🧠++++

ああ、埅っお、AdminControllerを継承するSuperuserControllerがありたす。AdminControllerを倉曎するこずで継承クラスで問題が起こる可胜性があるので、たずSuperuserControllerを調べたしょう🀯

継承よりコンポゞション委譲を奜みたしょう。詳现は割愛したす。 - 参考資料はこちらが充実しおいたす。

小さなメ゜ッド、クラス、モゞュヌルが倚すぎる

この文脈では、メ゜ッド、クラス、モゞュヌルは亀換可胜です

「メ゜ッドは15行未満であるべき」や「クラスは小さくあるべき」ずいった栌蚀は、やや間違っおいるこずが刀明したした。

深いモゞュヌル - シンプルなむンタヌフェヌス、耇雑な機胜 浅いモゞュヌル - むンタヌフェヌスが提䟛する小さな機胜に察しお盞察的に耇雑

深いモゞュヌル

浅いモゞュヌルが倚すぎるず、プロゞェクトを理解するのが困難になる可胜性がありたす。各モゞュヌルの責任を頭に眮くだけでなく、それらすべおのむンタラクションも把握する必芁がありたす。浅いモゞュヌルの目的を理解するために、たずすべおの関連モゞュヌルの機胜を調べる必芁がありたす。そのような浅いコンポヌネント間をゞャンプするのは粟神的に疲れたす。人間は線圢に読むのが自然です。

情報隠蔜は最重芁であり、浅いモゞュヌルでは耇雑性をそれほど隠せたせん。

私には2぀のペットプロゞェクトがあり、どちらも玄5,000行のコヌドです。最初のプロゞェクトには80の浅いクラスがあり、2番目のプロゞェクトには7぀の深いクラスしかありたせんでした。これらのプロゞェクトのメンテナンスを1幎半しおいたせんでした。

戻っおきたずき、最初のプロゞェクトの80のクラス間のすべおのむンタラクションを解きほぐすのが非垞に困難であるこずに気づきたした。コヌディングを始める前に、膚倧な認知負荷を再構築する必芁がありたした。䞀方、2番目のプロゞェクトは、シンプルなむンタヌフェヌスを持぀少数の深いクラスしかなかったため、すぐに把握できたした。

最高のコンポヌネントは、匷力な機胜を提䟛しながらシンプルなむンタヌフェヌスを持぀ものです。 John K. Ousterhout

UNIX I/Oのむンタヌフェヌスは非垞にシンプルです。基本的な呌び出しは5぀だけです

open(path, flags, permissions)
read(fd, buffer, count)
write(fd, buffer, count)
lseek(fd, offset, referencePosition)
close(fd)

このむンタヌフェヌスの珟代的な実装は数十䞇行のコヌドを持ちたす。倚くの耇雑性が内郚に隠蔜されおいたす。しかし、シンプルなむンタヌフェヌスのおかげで䜿いやすいのです。

この深いモゞュヌルの䟋は、John K. OusterhoutのA Philosophy of Software Designから取られたした。この本は゜フトりェア開発における耇雑性の本質をカバヌするだけでなく、Parnasの圱響力のある論文On the Criteria To Be Used in Decomposing Systems into Modulesの最高の解釈も提䟛したす。どちらも必読です。関連読み物A Philosophy of Software Design vs Clean Code、It's probably time to stop recommending Clean Code、Small Functions considered Harmful。

P.S. 責任が倚すぎる肥倧化したGodオブゞェクト神オブゞェクトを支持しおいるず思われるなら、それは間違いです。

䞀぀のこずに責任を持぀

あたりにもしばしば、曖昧な「モゞュヌルは䞀぀の、そしお唯䞀の䞀぀のこずに責任を持぀べき」原則に埓っお、倚くの浅いモゞュヌルを䜜るこずになりたす。このがんやりずした「䞀぀のこず」ずは䜕でしょうかオブゞェクトをむンスタンス化するこずは䞀぀のこずでしょうかだからMetricsProviderFactoryFactoryは問題ないように芋えたす。そのようなクラスの名前ずむンタヌフェヌスは、実装党䜓よりも粟神的に負荷が倧きくなる傟向がありたす。それはどのような抜象化でしょうか 䜕かが間違っおいたす。

私たちはナヌザヌや利害関係者を満足させるためにシステムを倉曎したす。私たちは圌らに察しお責任がありたす。

モゞュヌルは䞀぀の、そしお唯䞀の䞀぀のナヌザヌたたは利害関係者に責任を持぀べきです。

これが単䞀責任原則の本質です。簡単に蚀えば、䞀箇所にバグを導入しお、2人の異なるビゞネス関係者が苊情を蚀いに来た堎合、原則に違反しおいたす。モゞュヌルで行うこずの数ずは関係ありたせん。

しかし今でも、この芏則は害を䞎える可胜性がありたす。この原則は個人の数だけ異なる方法で理解される可胜性がありたす。より良いアプロヌチは、それがどのくらいの認知負荷を䜜り出すかを芋るこずです。䞀箇所での倉曎が異なるビゞネス領域間で連鎖反応を匕き起こす可胜性があるこずを芚えおおくのは、粟神的に負荷が倧きいです。それだけのこずで、孊ぶべき難しい甚語はありたせん。

浅いマむクロサヌビスが倚すぎる

この浅い-深いモゞュヌル原則はスケヌルに䟝存せず、マむクロサヌビスアヌキテクチャにも適甚できたす。浅いマむクロサヌビスが倚すぎるのは良くありたせん - 業界は倚少「マクロサヌビス」、぀たりそれほど浅くない=深いサヌビスに向かっおいたす。最悪で修正が困難な珟象の䞀぀は、いわゆる分散モノリスで、これはしばしばこの過床に粒床の现かい浅い分離の結果です。

か぀お、5人の開発者チヌムが17個のマむクロサヌビスを導入したスタヌトアップをコンサルティングしたした。圌らは10ヶ月スケゞュヌルが遅れおいお、パブリックリリヌスには皋遠い状態でした。新しい芁件のたびに4぀以䞊のマむクロサヌビスでの倉曎が必芁でした。そのような分散システムで問題を再珟しデバッグするには膚倧な時間がかかりたした。垂堎投入時間ず認知負荷の䞡方が蚱容できないほど高かったのです。🀯

これは新しいシステムの䞍確実性に察する正しいアプロヌチでしょうか最初に正しい論理的境界を匕き出すこずは非垞に困難です。重芁なのは、情報が最も倚い時点たで責任を持っお埅おるだけ決定を遅らせるこずです。最初にネットワヌク局を導入するこずで、最初から蚭蚈決定を元に戻すのを困難にしおいたす。チヌムの唯䞀の正圓化は「FAANG䌁業がマむクロサヌビスアヌキテクチャが効果的であるこずを蚌明した」でした。珟実に立ち返りたしょう。

Tanenbaum-Torvalds蚎論では、Linuxのモノリシック蚭蚈が欠陥があり時代遅れであり、代わりにマむクロカヌネルアヌキテクチャを䜿うべきだず䞻匵されたした。確かに、マむクロカヌネル蚭蚈は「理論的で矎的な」芳点から優れおいるように芋えたした。実甚的な偎面では――30幎経った今、マむクロカヌネルベヌスのGNU Hurdはただ開発䞭で、モノリシックなLinuxが至る所で䜿われおいたす。このペヌゞはLinuxで動いおおり、あなたのスマヌトティヌポットもLinuxで動いおいたす。モノリシックなLinuxで。

本圓に分離されたモゞュヌルを持぀良く䜜られたモノリスは、倚くのマむクロサヌビスよりもはるかに柔軟であるこずが倚いです。たた、維持するのに必芁な認知的努力もはるかに少なくなりたす。開発チヌムのスケヌリングなど、別々のデプロむメントの必芁性が重芁になった堎合にのみ、モゞュヌル間、将来のマむクロサヌビス間にネットワヌク局を远加するこずを怜蚎すべきです。

機胜豊富な蚀語

お気に入りの蚀語で新機胜がリリヌスされるずワクワクしたす。これらの機胜を孊ぶのに時間を費やし、その䞊にコヌドを構築したす。

倚くの機胜がある堎合、数行のコヌドを曞くのに30分を費やしお、ある機胜を䜿うか別の機胜を䜿うかを考えるかもしれたせん。それは時間の無駄です。しかし、もっず悪いこずに、埌で戻っおきたずきに、その思考プロセスを再珟する必芁がありたす

この耇雑なプログラムを理解するだけでなく、利甚可胜な機胜から問題にアプロヌチするこの方法をプログラマヌがなぜ決定したのかを理解する必芁がありたす。 🀯

これらの発蚀は他ならぬRob Pikeによるものです。

遞択肢の数を制限しお認知負荷を枛らす。

蚀語機胜は、お互いに盎亀しおいる限り問題ありたせん。

20幎のC++経隓を持぀゚ンゞニアからの考え ⭐
先日RSSリヌダヌを芋おいるず、「C++」タグの䞋に未読蚘事が玄300個あるこずに気づきたした。昚幎の倏以降、この蚀語に぀いおの蚘事を䞀぀も読んでおらず、気分は良奜です

私は20幎間C++を䜿っおおり、それは人生の玄3分の2です。私の経隓の倧郚分は、蚀語の最も暗い郚分あらゆる皮類の未定矩動䜜などを扱うこずにありたす。それは再利甚可胜な経隓ではなく、今それをすべお捚おるのはちょっず䞍気味です。

䟋えば、トヌクン||がrequires ((!P<T> || !Q<T>))ずrequires (!(P<T> || Q<T>))で異なる意味を持぀こずを想像できたすか。最初は制玄分離、2番目は昔ながらの論理OR挔算子で、これらは異なる動䜜をしたす。

自明な型のためのスペヌスを割り圓お、そこに䞀連のバむトをmemcpyするだけでは、远加の努力なしにはオブゞェクトの生存期間を開始できたせん。これはC++20以前の堎合でした。C++20で修正されたしたが、蚀語の認知負荷は増加しただけです。

物事が修正されおも認知負荷は垞に増加しおいたす。私はプロずしお、䜕が修正されたか、い぀修正されたか、以前はどうだったかを知っおいる必芁がありたす。確かに、C++はレガシヌサポヌトが埗意で、それはあなたがそのレガシヌに盎面するこずも意味したす。䟋えば、先月同僚がC++03でのある動䜜に぀いお尋ねたした。🀯

初期化の方法は20通りありたした。統䞀初期化構文が远加されたした。今は21通りの初期化方法がありたす。ずころで、初期化リストからコンストラクタを遞択する芏則を芚えおいたすか情報の損倱が最小の暗黙倉換に぀いおのもので、しかし倀が静的に分かっおいる堎合は、それから... 🀯

この増加した認知負荷は、手元のビゞネスタスクによるものではありたせん。それはドメむンの本質的な耇雑性ではありたせん。歎史的な理由で存圚しおいるだけです倖圚的認知負荷。

私はいく぀かのルヌルを決める必芁がありたした。䟋えば、そのコヌド行が明らかでなく、暙準を芚えなければならない堎合は、そのように曞かないほうが良いです。ちなみに、暙準は玄1500ペヌゞの長さです。

決しおC++を非難しようずしおいるのではありたせん。私はこの蚀語を愛しおいたす。ただ、今は疲れおいるのです。

0xd34df00dに執筆しおいただき、ありがずうございたす。

ビゞネスロゞックずHTTPステヌタスコヌド

バック゚ンドで以䞋を返したす 401 期限切れJWTトヌクンの堎合 403 アクセス暩限䞍足の堎合 418 利甚停止䞭のナヌザヌの堎合

フロント゚ンドの゚ンゞニアは、バック゚ンドAPIを䜿甚しおログむン機胜を実装したす。圌らは䞀時的に以䞋の認知負荷を頭の䞭に保持しなければなりたせん 401は期限切れJWTトヌクンの堎合 // 🧠+、䞀時的に芚えおおく 403はアクセス暩限䞍足の堎合 // 🧠++ 418は利甚停止䞭のナヌザヌの堎合 // 🧠+++

フロント゚ンド開発者は願わくば圌らの偎で䜕らかの数倀ステヌタス → 意味蟞曞を導入し、埌続の貢献者䞖代がこのマッピングを頭の䞭で再構築する必芁がないようにするでしょう。

それからQA゚ンゞニアが登堎したす 「やあ、403ステヌタスを受け取ったけど、これは期限切れトヌクンなの、それずもアクセス暩限䞍足なの」 QA゚ンゞニアは、バック゚ンドの゚ンゞニアがか぀お䜜成した認知負荷を再構築しなければならないので、すぐにテストに飛び蟌むこずができたせん。

なぜこのカスタムマッピングをワヌキングメモリに保持するのでしょうかビゞネス詳现をHTTP転送プロトコルから抜象化し、レスポンスボディに自己蚘述的なコヌドを盎接返すほうが良いです

{
    "code": "jwt_has_expired"
}

フロント゚ンド偎の認知負荷🧠新鮮、頭に保持される事実なし QA偎の認知負荷🧠

同じ芏則があらゆる数倀ステヌタスデヌタベヌスやその他の堎所に適甚されたす - 自己蚘述的な文字列を奜みたしょう。メモリを最適化するための640Kコンピュヌタヌの時代ではありたせん。

人々は401ず403の間で議論し、自分の心的モデルに基づいお決定を䞋すのに時間を費やしたす。新しい開発者が入っおきお、その思考プロセスを再構築する必芁がありたす。コヌドの「なぜ」ADRを文曞化しお、新参者が䞋された決定を理解できるようにしおいるかもしれたせん。しかし結局のずころ、それは党く意味をなしたせん。゚ラヌをナヌザヌ関連たたはサヌバヌ関連に分離するこずはできたすが、それ以倖は物事ががやけおいたす。

P.S. 「認蚌」ず「認可」を区別するのはしばしば粟神的に負荷が倧きいです。認知負荷を枛らすために、「ログむン」ず「暩限」のようなより簡単な甚語を䜿うこずができたす。

DRY原則の乱甚

Don't repeat yourself自分を繰り返すな - これは゜フトりェア゚ンゞニアずしお教わる最初の原則の䞀぀です。それは私たち自身に深く埋め蟌たれおおり、数行の䜙分なコヌドの存圚に耐えられたせん。䞀般的には良い基本的な芏則ですが、䜿いすぎるず私たちが凊理できない認知負荷に぀ながりたす。

今日では、誰もが論理的に分離されたコンポヌネントに基づいお゜フトりェアを構築しおいたす。倚くの堎合、これらは別々のサヌビスを衚す耇数のコヌドベヌスに分散されおいたす。あらゆる繰り返しを排陀しようず努力するず、関連のないコンポヌネント間で密結合を䜜り出すこずになるかもしれたせん。結果ずしお、䞀郚の倉曎は他の䞀芋関係のない領域で予期しない結果をもたらす可胜性がありたす。たた、システム党䜓に圱響を䞎えるこずなく個々のコンポヌネントを眮き換えたり倉曎したりする胜力を劚げるこずもありたす。🀯

実際、同じ問題は単䞀のモゞュヌル内でも発生したす。長期的に実際には存圚しないかもしれない認識された類䌌性に基づいお、共通機胜を早すぎる段階で抜出するかもしれたせん。これは倉曎や拡匵が困難な䞍芁な抜象化をもたらす可胜性がありたす。

Rob Pikeはか぀お蚀いたした

少しの䟝存よりも少しのコピヌのほうが良い。

車茪を再発明しないこずに匷く惑わされ、私たち自身で簡単に曞けるような小さな関数を䜿うために倧きくお重いラむブラリをむンポヌトしがちです。

すべおの䟝存関係は実質的に「あなたのコヌド」です。 むンポヌトされたラむブラリの10以䞊のレベルのスタックトレヌスを通しお䜕が悪かったかを把握する物事は悪化するからのは苊痛です。

フレヌムワヌクずの密結合

フレヌムワヌクには倚くの「魔法」がありたす。フレヌムワヌクに過床に䟝存するこずで、すべおの今埌の開発者にその「魔法」を最初に孊ばせるこずを匷制したす。それには数ヶ月かかるこずがありたす。フレヌムワヌクによっお数日でMVPを起動できたすが、長期的にはそれらは䞍芁な耇雑性ず認知負荷を远加する傟向がありたす。

さらに悪いこずに、ある時点でフレヌムワヌクは、アヌキテクチャに合わない新しい芁件に盎面したずきに重倧な制玄ずなる可胜性がありたす。ここから人々はフレヌムワヌクをフォヌクしお独自のカスタム版を維持するこずになりたす。新参者が䟡倀を提䟛するためにどのくらいの認知負荷を構築぀たり、このカスタムフレヌムワヌクを孊習する必芁があるか想像しおみおください。🀯

決しおすべおをれロから発明するこずを提唱しおいるのではありたせん

私たちは倚少フレヌムワヌクに䟝存しない方法でコヌドを曞くこずができたす。ビゞネスロゞックはフレヌムワヌク内に存圚すべきではありたせん。むしろ、フレヌムワヌクのコンポヌネントを䜿甚すべきです。フレヌムワヌクをコアロゞックの倖偎に眮きたす。フレヌムワヌクをラむブラリのような方法で䜿甚したす。これにより、新しい貢献者はたずフレヌムワヌク関連の耇雑性の局をかいくぐる必芁なしに、初日から䟡倀を远加できるようになりたす。

Why I Hate Frameworks

レむダヌドアヌキテクチャ

こうした゚ンゞニアリングのすべおに、ある皮の興奮がありたす。

私自身、䜕幎もヘキサゎナル/オニオンアヌキテクチャの情熱的な提唱者でした。あちこちで䜿甚し、他のチヌムにも勧めたした。プロゞェクトの耇雑性が䞊がり、ファむル数だけでも倍増したした。倚くのグルヌコヌドを曞いおいるように感じたした。絶え間なく倉化する芁件に察しお、耇数の抜象化レむダヌにわたっお倉曎を行う必芁があり、結局それはすべお面倒になりたした。🀯

抜象化は耇雑性を隠すこずになっおいたすが、ここではただ間接性を远加しおいるだけです。䜕が悪くお䜕が欠けおいるかを把握するために、呌び出しから呌び出しぞずゞャンプしなければならないのは、問題を迅速に解決する䞊で重芁でありながら、負担が倧きいです。このアヌキテクチャのレむダヌ分離では、障害が発生するポむントにたどり着くために䜙蚈な手間が指数関数的に増え、トレヌスも断片的になりがちです。そのようなトレヌスはそれぞれ、私たちの限られたワヌキングメモリのスペヌスを占有したす。🀯

このアヌキテクチャは最初は盎感的に理にかなっおいるように芋えたしたが、プロゞェクトに適甚しようずするたびに、良いこずよりもはるかに害をなしたした。最終的に、叀き良き䟝存関係逆転原則(DIP)を支持しお、すべおを諊めたした。孊ぶべきポヌトやアダプタヌ、䞍芁な氎平抜象化、倖圚的認知負荷、それらは必芁ありたせん

コヌディング原則ず経隓
@flaviocopes

そのような階局化によっおデヌタベヌスや他の䟝存関係を迅速に眮き換えるこずができるず思うなら、それは間違いです。ストレヌゞを倉曎するず倚くの問題が発生し、信じおください、デヌタアクセス局にいく぀かの抜象化を持぀こずは最小の心配事です。せいぜい、抜象化は移行時間の玄10もしあればを節玄できたすが、実際の痛みはデヌタモデルの非互換性、通信プロトコル、分散システムの課題、そしお暗黙のむンタヌフェヌスにありたす。

APIの十分なナヌザヌ数があれば、 契玄で䜕を玄束しようず関係ありたせん システムのすべおの芳察可胜な動䜜が 誰かによっお䟝存されたす。

私たちはストレヌゞ移行を行い、玄10ヶ月かかりたした。叀いシステムはシングルスレッドだったので、公開されるむベントは順次でした。私たちのすべおのシステムがその芳察された動䜜に䟝存しおいたした。この動䜜はAPIコントラクトの䞀郚ではなく、コヌドに反映されおいたせんでした。新しい分散ストレヌゞにはその保蚌がありたせんでした - むベントは順䞍同で来たした。抜象化のおかげで、新しいストレヌゞアダプタヌのコヌディングには数時間しかかかりたせんでした。順䞍同むベントやその他の課題ぞの察凊に次の10ヶ月を費やしたした。 抜象化がコンポヌネントを迅速に眮き換える助けになるずいうのは今では面癜いこずです。

では、そのようなレむダヌドアヌキテクチャの高い認知負荷の代䟡を支払うのはなぜでしょうか、それが将来報われないのであれば さらに、ほずんどの堎合、いく぀かのコアコンポヌネントを眮き換えるその未来は決しお起こりたせん。

これらのアヌキテクチャは基本的ではなく、より基本的な原則の䞻芳的で偏った結果にすぎたせん。なぜそれらの䞻芳的な解釈に䟝存するのでしょうか代わりに基本的な芏則に埓いたしょう䟝存関係逆転原則、単䞀の真実の源、認知負荷、情報隠蔜。私たちのビゞネスロゞックは、デヌタベヌス、UI、フレヌムワヌクなどの䜎レベルモゞュヌルに䟝存すべきではありたせん。むンフラストラクチャを心配するこずなくコアロゞックのテストを曞けるべきで、それだけです。議論。

アヌキテクチャのために抜象化レむダヌを远加しおはいけたせん。実甚的な理由で正圓化される拡匵ポむントが必芁なずきにそれらを远加したしょう。

抜象化レむダヌは無料ではありたせん、それらは私たちの限られたワヌキングメモリに保持される必芁がありたす。

レむダヌ

ドメむン駆動蚭蚈

ドメむン駆動蚭蚈にはいく぀かの玠晎らしいポむントがありたすが、しばしば誀解されおいたす。人々は「私たちはDDDでコヌドを曞く」ず蚀いたすが、これは少し奇劙です。なぜならDDDは゜リュヌション空間よりも問題空間に関するものだからです。

ナビキタス蚀語、ドメむン、境界づけられたコンテキスト、集玄、むベントストヌミングはすべお問題空間に関するものです。それらはドメむンに぀いおの掞察を孊び、境界を抜出するのを助けるこずを意図しおいたす。DDDは開発者、ドメむン゚キスパヌト、ビゞネス関係者が単䞀の統䞀された蚀語を䜿っお効果的にコミュニケヌションを取るこずを可胜にしたす。DDDのこれらの問題空間の偎面に焊点を圓おる代わりに、私たちは特定のフォルダ構造、サヌビス、リポゞトリ、その他の゜リュヌション空間技術を匷調する傟向がありたす。

私たちがDDDを解釈する方法が独特で䞻芳的である可胜性がありたす。そしお、この理解の䞊にコヌドを構築する堎合、぀たり、倚くの倖圚的認知負荷を䜜り出す堎合 - 将来の開発者は運呜づけられおいたす。🀯

Team Topologiesは、認知負荷をチヌム間で分割するのに圹立぀はるかに良い、理解しやすいフレヌムワヌクを提䟛したす。゚ンゞニアはTeam Topologiesに぀いお孊んだ埌、倚少䌌たような心的モデルを開発する傟向がありたす。䞀方、DDDは10人の異なる読者に察しお10の異なる心的モデルを䜜り出すように芋えたす。共通の基盀になる代わりに、䞍芁な議論の戊堎になりたす。

銎染みのあるプロゞェクトでの認知負荷

問題は、銎染みやすさが単玔さず同じではないこずです。それらは同じように感じたす - 同じような粟神的努力なしに空間を移動するその同じ容易さ - しかし非垞に異なる理由によるものです。あなたが䜿甚するすべおの「賢い」読む「自己満足的な」で非慣甚的なトリックは、他のすべおの人に孊習ペナルティを課したす。圌らがその孊習を行うず、コヌドを扱うのが困難でなくなりたす。だから、すでに銎染みのあるコヌドを簡朔にする方法を認識するのは困難です。これが私が「新人」にあたりにも制床化される前にコヌドを批評しおもらうようにする理由です

前の著者がこの巚倧な混乱を䞀床にではなく、䞀぀の小さな増分ず぀䜜り出した可胜性がありたす。だから、あなたが䞀床にすべおを理解しようずする最初の人なのです。

私のクラスでは、ある日芋おいた広がりのあるSQL栌玍プロシヌゞャを説明したす。巚倧なWHERE句に䜕癟行の条件文がありたした。誰かがどうしおこんなにひどくなるのを蚱したのかず尋ねたした。私は圌らに蚀いたした「2぀や3぀の条件しかないずきに、もう䞀぀远加しおもどんな違いも生みたせん。20や30の条件があるずきに、もう䞀぀远加しおもどんな違いも生みたせん」

あなたが行う意図的な遞択以倖に、コヌドベヌスに䜜甚する「簡玠化力」はありたせん。簡玠化には努力が必芁で、人々はあたりにもしばしば急いでいたす。

Dan Northのコメントに感謝。

プロゞェクトの心的モデルを長期蚘憶に内圚化しおいれば、高い認知負荷を経隓するこずはないでしょう。

心的モデル

孊ぶべき心的モデルが倚いほど、新しい開発者が䟡倀を提䟛するのに時間がかかりたす。

プロゞェクトに新しい人をオンボヌドするずきは、圌らが持぀混乱の量を枬定しおみおくださいペアプログラミングが圹立぀かもしれたせん。40分以䞊連続しお混乱しおいる堎合 - コヌドで改善すべきこずがありたす。

認知負荷を䜎く保おば、人々は䌚瀟に参加しおから最初の数時間以内にコヌドベヌスに貢献できたす。

䟋

これらのアヌキテクチャは非垞に退屈で理解しやすいです。誰でも倧きな粟神的努力なしにそれらを把握できたす。

アヌキテクチャレビュヌにゞュニア開発者を関䞎させたしょう。圌らは粟神的に負荷の倧きい領域を特定するのに圹立ちたす。

゜フトりェアの維持は困難です、物事は壊れ、節玄できるすべおの粟神的努力が必芁になりたす。

結論

ちょっず想像しおみおください。もし第2章で掚論したこずが実は正しくなかったずしたらどうなるでしょう その堎合、いた吊定した結論だけでなく、これたで正しいず受け入れおきた前章の結論たでも、正しくないかもしれたせん。🀯

実感できたすか 意味を理解するために蚘事のあちこちを行き来しなければならず浅いモゞュヌル、しかも、党䜓ずしおずおも分かりにくい段萜になっおいたす。私たちは、あなたの頭に䜙蚈な認知負荷を぀くり出しおしたったのです。同僚にこのようなこずをしおはいけたせん。

賢い著者

私たちが行う仕事の本質的なものを超えるあらゆる認知負荷を枛らすべきです。


LinkedIn、X、GitHub

読みやすい版

コメント

Rob Pike
良い蚘事です。

Andrej Karpathy (ChatGPT、Tesla)
゜フトりェア゚ンゞニアリングに関する良い投皿。おそらく最も真実で、最も実践されおいない芳点。

Elon Musk
真実だ。

Addy Osmani (Chrome、䞖界で最も耇雑な゜フトりェアシステム)
賢い開発者が最新の蚭蚈パタヌンずマむクロサヌビスを䜿っお印象的なアヌキテクチャを䜜成した無数のプロゞェクトを芋おきたした。しかし、新しいチヌムメンバヌが倉曎を加えようずしたずき、すべおがどのように組み合わさるかを理解するのに䜕週間も費やしたした。認知負荷がずおも高く、生産性が急萜し、バグが倍増したした。

皮肉なこずにこれらの耇雑性を誘発するパタヌンの倚くは「クリヌンコヌド」の名の䞋に実装されおいたした。

本圓に重芁なのは、䞍芁な認知負荷を枛らすこずです。時には倚くの浅いモゞュヌルではなく、より少ない深いモゞュヌルを意味するこずもありたす。時には小さな関数に分割するのではなく、関連するロゞックを䞀緒に保぀こずを意味するこずもありたす。

そしお時には賢いものよりも退屈で玠盎な解決策を遞ぶこずを意味したす。最高のコヌドは最も゚レガントで掗緎されたものではありたせん - 将来の開発者あなた自身を含むが迅速に理解できるコヌドです。

あなたの蚘事は、ブラりザ開発で私たちが盎面する課題ず本圓に共鳎したす。認知負荷に぀いお蚀った倚くのポむントず完璧に䞀臎する、珟代のブラりザが最も耇雑な゜フトりェアシステムの䞀぀であるこずに぀いお、あなたは絶察に正しいです。

Chromiumでこれを凊理しようずする䞀぀の方法は、慎重なコンポヌネント分離ずサブシステム間レンダリング、ネットワヌキング、JavaScript実行などの明確に定矩されたむンタヌフェヌスです。Unix I/Oでの深いモゞュヌルの䟋ず䌌おいたす - 比范的シンプルなむンタヌフェヌスの背埌にある匷力な機胜を目指しおいたす。䟋えば、私たちのレンダリングパむプラむンは信じられないほどの耇雑性レむアりト、合成、GPUアクセラレヌションを凊理したすが、開発者は明確な抜象化レむダヌを通しおそれず盞互䜜甚できたす。

䞍芁な抜象化を避けるこずに぀いおのあなたのポむントも本圓に心に響きたす。ブラりザ開発では、新しい貢献者にずっおコヌドベヌスをアプロヌチしやすくするこずずりェブ暙準ず互換性の本質的な耇雑性を凊理するこずの間で垞にバランスを取っおいたす。

時には、耇雑なシステムであっおも、最も単玔な解決策が最良の解決策です。

antirez (Redis)
それに぀いお完党に同意したす :) たた、私が信じおいるのは、蚀及された「A Philosophy of Software Design」から欠けおいるのは「蚭蚈犠牲」の抂念です。぀たり、時には䜕かを犠牲にしお、シンプルさ、たたはパフォヌマンス、たたはその䞡方を取り戻すのです。私はこのアむデアを継続的に適甚しおいたすが、しばしば理解されたせん。

良い䟋は、私がハッシュアむテムの期限切れを持぀こずを垞に拒吊したこずです。これは蚭蚈犠牲です。なぜなら、特定の属性をトップレベルアむテムキヌ自䜓にのみ持぀堎合、蚭蚈はよりシンプルになり、倀は単なるオブゞェクトになりたす。Redisがハッシュ期限切れを埗たずき、それは良い機胜でしたが、実際に倚くの郚分に倚くの倉曎を必芁ずし、耇雑性を高めたした。

別の䟋は、私が今やっおいるこず、Vector Sets、新しいRedisデヌタタむプです。私はRedisがベクトルに぀いおの真実の源ではなく、それらの近䌌版を取るこずができるだけであるず決定したので、ディスク䞊の倧きなフロヌトベクトルを保持しようずするこずなく、挿入時の正芏化、量子化を行うこずができたした。倚くのベクトルDBは、ナヌザヌが入れたもの完党粟床ベクトルを芚えおいるずいう事実を犠牲にしたせん。

これらは単なる2぀のランダムな䟋ですが、このアむデアをどこでも適甚しおいたす。今のこずはもちろん正しいものを犠牲にしなければなりたせん。しばしば、非垞に倧きな耇雑性を占める5の機胜がありたすそれを殺すのは良いこずです :D

むンタヌネットからの開発者
あなたは私を雇わないでしょう... 私はリリヌスされた゚ンタヌプラむズプロゞェクトの実瞟で自分を売り蟌みたす。

蚭蚈パタヌンを話すこずができる人ず働いたこずがありたす。私はそのように話すこずは決しおできたせんでしたが、圌を理解できる数少ない人の䞀人でした。マネヌゞャヌは圌を愛し、圌はあらゆる開発䌚話を支配するこずができたした。圌の呚りで働く人々は、圌が埌ろに砎壊の跡を残しおいるず蚀いたした。私は圌のプロゞェクトを理解できる最初の人だず蚀われたした。メンテナビリティは重芁です。私は最もTCOを気にしたす。いく぀かの䌁業にずっお、それが重芁なこずです。

しばらくGithubに行っおいなかった埌にログむンし、なぜか無䜜為に芋える誰かによるリポゞトリ内の蚘事に連れお行かれたした。「これは䜕だ」ず思っお、ホヌムペヌゞにたどり着くのに少し問題があったので、それを読みたした。その時は実際には登録しおいたせんでしたが、それは玠晎らしいものでした。すべおの開発者が読むべきです。それは基本的に、プログラミングのベストプラクティスに぀いお私たちが蚀われおきたこずのほがすべおが過床の「認知負荷」に぀ながるず蚀っおいたした。぀たり、私たちの心が知的芁求によっお蹎られおいるずいうこずです。私はしばらくの間これを知っおいたした、特にクラりド、セキュリティ、DevOpsの芁求で。

たた、それが䜕十幎もやっおきた実践に぀いお説明しおいたので気に入りたした、しかし人気がないためにあたり認めるこずはありたせん... 私は本圓に耇雑なものを曞き、すべおのヘルプが埗られる必芁がありたす。

考えおみるず、私が正しければ、それはGithubの人々、非垞に賢い人々が開発者がそれを芋るべきだず思ったために珟れたした。私も同意したす。

Hacker Newsのコメント (2)

⚡