ソフトウェア

開発者が速攻でプロジェクトを片付けるのに重要なポイント「認知負荷」とは?


時間と労力の浪費につながる「認知負荷」とその軽減方法を、ソフトウェア開発会社・Inktechで最高技術責任者(CTO)を務めるアルテム・ザキルリン氏が解説しています。

Cognitive load is what matters
https://minds.md/zakirullin/cognitive

ザキルリン氏によると、認知負荷を一言で言うと「開発者がタスクを完了するためにどれだけ考える必要があるか」になるとのこと。

平均的な開発者は、コードの変数の値、制御フロー ロジック、呼び出しシーケンスなどの要素を平均して4つほど頭に入れて作業を進めることができますが、この基準を超えた認知負荷が発生すると、途端にコードを読むのが難しくなります。


そのため、プロジェクトの認知負荷を可能な限り軽減するのが肝要ですが、ソフトウェア開発のコアな部分の認知負荷は変えることができないので、必要以上に難解に書かれたコードのように本質とは無関係な部分に焦点を当てる必要が出てきます。

以下は、ザキルリン氏が示した認知負荷が大きいコードの例です。このコードは一見するとシンプルにまとまっていますが、条件分けが複雑なので他人が読むと認知負荷が高くなってしまいます。

if val > someConstant // 🧠+
&& (condition2 || condition3) // 🧠+++, prev cond should be true, one of c2 or c3 has be true
&& (condition4 && !condition5) { // 🤯, we are messed up by this point
...
}


そこで、中間変数を導入して認知負荷が小さくするように修正すると、以下のように可読性が上がって保守しやすいものになります。

isValid = val > someConstant
isAllowed = condition2 || condition3
isSecure = condition4 && !condition5
// 🧠, we don't need to remember the conditions, there are descriptive variables
if isValid && isAllowed && isSecure {
...
}


また、開発現場ではザキルリン氏が「継承の悪夢」と呼ぶ事態がしばしば発生します。その例は以下。「AdminControllerはUserControllerを継承し、UserControllerはGuestControllerを継承し……」という具合に、階層が深くなるごとに認知負荷も増大していきます。

AdminController extends UserController extends GuestController extends BaseController


ザキルリン氏によると、開発者の間にある「メソッドは15行のコードよりも短くするべし」「クラスは小さくするべし」という不文律はしばしば間違っているとのこと。

なぜなら、小さいモジュールがたくさんあると、各モジュールの役割だけでなくそれらの相互作用をすべて考慮する必要があるため、実現する機能の割に複雑で認知負荷が大きいものになってしまうからです。ザキルリン氏は「情報を隠してインターフェースをシンプルに保つことが重要ですが、小さいモジュールでは隠せる情報量に限界があります」と述べています。


ザキルリン氏はこの問題を経験した時のことを、「5000行ほどのコードがある2つのプロジェクトを抱えていて、片方には80個の小さいクラスが、もう片方には7個の大きなクラスがありました。1年半ほどそれらを放置してから戻ったところ、クラスが80個ある方の作業の再開には膨大な認知負荷が必要でしたが、もう片方はインターフェースがシンプルでいくつかのクラスがあるだけだったので、すんなり理解できました」と振り返っています。

ザキルリン氏は、こうした認知負荷の問題に警鐘を鳴らす格言をいくつか紹介しています。1つ目はコンピューター科学者のジョン・オースターハウトが語った「最高のコンポーネントとは、強力な機能を提供しながらもシンプルなインターフェースを備えたものです」というもの。

例えば、以下はUNIX I/Oのインターフェースで、このインターフェースの最新の実装には数十万行のコードが含まれていますが、基本的なシステムコールは5つしかありません。

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


ザキルリン氏は2つ目の格言として、「Goの父」として知られているソフトウェアエンジニアのロブ・パイク氏の「選択肢の数を制限することで認知負荷は軽くなります」という言葉を紹介しました。

選択肢が多すぎるせいで時間を浪費してしまった経験談として、ザキルリン氏は「お気に入りの言語で新機能がリリースされると、つい使ってみたくなりますが、機能がたくさんあると1つの機能を使うための数行のコードに30分もかけてしまうことがあります。これは時間の無駄なだけでなく、後で再開するときにその思考プロセスをもう一度やり直す必要まであります」と述べました。

自分にとっては認知負荷がないものでも、他の人が引き継いだときに問題が発生するケースもあります。


ザキルリン氏によると、プロジェクトに新人が加わったら、まずペアプログラミングを行うなどしてどの程度混乱してしまうかを測定するといいとのこと。2人が40分以上混乱している場合、コードに改善の余地があるということです。

ザキルリン氏は「認知負荷を低く保てば、新入社員でも入社後数時間以内にコードベースに貢献できるようになります」とコメントしました。

この記事のタイトルとURLをコピーする

・関連記事
使いにくいアプリ・ウェブサイトの原因である「認知的負荷」を削減するためのデザインの基本原則 - GIGAZINE

運動は認知機能低下を遅らせるだけでなく脳機能改善にもつながる - GIGAZINE

「単純作業ばかりの仕事では認知機能が低下しやすい」という研究結果が示される - GIGAZINE

仕事中に心理的ストレスを受けると肉体への負荷が増加してしまう、精神的苦痛が身体的苦痛を引き起こす可能性 - GIGAZINE

作業しながらだと記憶がほんのわずかしか保持できない理由とは? - GIGAZINE

in ソフトウェア, Posted by log1l_ks

You can read the machine translated English article here.