#  IT ニュース&コラム 2025/2/10 通巻876号 ニュース版  ソフトウェアデザイン館 Sage Plaisir 21  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ■■ 開発者が速攻でプロジェクトを片付けるのに重要なポイント、認知負荷とは? ■■ 2024年12月26日、GIGAZINE は、開発者(プログラマー)が速攻でプロジェクトを片付けるのには、認知負荷を 下げることが重要だと主張するアルテム・ザキルリン氏の解説記事を掲載しました。 (本記事では、本記事の筆者による補足情報も書いています。) 記事では時間と労力の浪費につながる「認知負荷」とその軽減方法について解説しています。 認知負荷とは、開発者がタスクを完了するために考える量がどれだけ多くて重たいか、です。 そして、コードの変数の値、制御フローやロジック、クラスや関数などの要素が 4つほどを超えると、途端にコードを読むのが難しくなり作業時間が急激に伸びます。 高速キャッシュに相当する脳の短期記憶に入りきらないと、低速ディスクに入った資料を読み返すのと同じですね。 認知負荷を減らすサンプルを示します。 下記の 🧠+ の + の数は負荷の高さを示します。 if val > someConstant // 🧠+, 1つ目の条件 && (condition2 || condition3) // 🧠+++, 前の条件は true で、c2(condition2) または c3 が true && (condition4 && !condition5) { // 🤯+++++++++, ここまで来ると大混乱! __CodeX__ } __CodeX__ を実行する条件は 5つの真偽を考えなければならず、すべての真偽まで覚えきれません。 このコードを認知負荷を下げるためには「説明変数」を使ってリファクタリングします。 そもそも読まなくても済むコードが多かったことが分かります。 (筆者補足→)読み始める部分の直前の行を空行を入れ、それより前の行から空行を無くすと、読む人は自然にそこに注目します。 isValid = val > someConstant isAllowed = condition2 || condition3 isSecure = condition4 && !condition5 // 以上はとりあえず読む必要はない if isValid && isAllowed && isSecure { // 🧠, 説明変数を読めばおおよそ理解でき、詳細な条件を覚えておく必要はない ... } 継承の悪夢と呼ばれるコードも認知負荷が高いです。 自分にとっては既知の概念の認知負荷がないクラスでも、他の人が引き継いだときに問題が発生するケースもあります。 ペアプログラミングを行うなどして 2人が40分以上混乱している場合、コードに改善の余地があると判定できます。 (筆者補足→)独自のスーパークラスは抽象的であるだけでなく解説が乏しいために、 具体的なことから抽象的なことを理解するといった手段が取れません。 AdminController extends UserController extends GuestController extends BaseController コーディング ルール によくある - メソッドは15行のコードよりも短くするべし - クラスは小さくするべし という不文律はしばしば間違っています。 なぜなら、小さいモジュールがたくさんあると、各モジュールの役割だけでなく それらの相互作用をすべて考慮する必要があるため、実現する機能の割に複雑で認知負荷が大きいものになってしまうからです。 情報を隠してインターフェースをシンプルに保つことが重要ですが、小さいモジュールでは隠せる情報量に限界があります。 (筆者補足→)単に長い処理であれば、関数を分けるのではなくコメントでざっくりと分けるだけで十分です。 関数に分けるために関数(インターフェース)を増やして、関数の引数を列挙するのは不毛ですし、 処理のブロックをクラスの属性に移動したことによる処理をクラス(データ)にするという認知の違いや、 開発者独自の解説がない facade や DTO の中間クラスは避けるべきです。 goto 文が無いにも関わらず、クラスによる スパゲッティ ソース になってしまいます。 (筆者補足→)ただし、概念が明確な説明変数的な算出プロパティは積極的に活用すべきです。 算出プロパティを属性(変数)にしてはいけません。 プロパティの意味を知る手がかりがどこかへ行ってしまいます。 高速化するなら算出プロパティをメモ化すべきです。 ザキルリン氏はこの問題を経験した時のことを、「5000行ほどのコードがある2つのプロジェクトを抱えていて、 片方には80個の小さいクラスが、もう片方には7個の大きなクラスがありました。1年半ほどそれらを放置してから戻ったところ、 クラスが80個ある方の作業の再開には膨大な認知負荷が必要でしたが、 もう片方はインターフェースがシンプルでいくつかのクラスがあるだけだったので、すんなり理解できました」と振り返っています。 ロブ・パイク氏は「選択肢の数を制限することで認知負荷は軽くなります」と言っています。 (筆者補足→)自由度を高くするためにオプションを増やすことは、開発者がオプションなどを書くコードが増えてしまうだけでなく、 動作の詳細部分が表面に書かれることになるため、読んだ時にカプセル化によるチャンキングができなくなります。 ソース ファイル とは別の設定ファイルや定数の ソース ファイル などに分けて構造化するなどすべきです。 こうすれば、新人でも理解できるコードになるとのことです。 (筆者補足→)処理とデータを明確に分け、システムのユーザーが知らなくてもいい詳細なコードを隠すように処理とデータの階層化さえできていれば。 ■■ 注目ニュース 一覧 ■■ ◇ AIを使って効果的にプログラミングを行う方法とは?。 https://gigazine.net/news/20250110-programming-with-llms/ … プログラミングが AI に完全に取って変わることが難しいのは、こういった方法があるから。 ◇ JavaScriptの日付と時刻の管理を大きく簡素化する Temporal の実装作業が進行中。 https://gigazine.net/news/20250131-javascript-temporal/ … JavaScriptの日付と時刻はクセがありすぎた。 ◇ DeepSeekが取得した情報は中国のサーバーに保存、中国法が適用。国が周知。 https://japan.cnet.com/article/35229001/ … プライバシーポリシーを日本の国が和訳。中国政府に有利な法律が適用される。 ◇ DeepSeek-R1 は中国に関するデリケートな話題の85%に回答することを拒否、ただし簡単に制限を回避できるとの指摘。 https://gigazine.net/news/20250130-deepseek-ai-not-answer-questions-chinese-government-want/ … 回避できても意識して回避しないと知らぬ間に情報が偏る。 ◇ トランプ政権による政府公式ウェブサイトの削除や変更はGitHubでリアルタイムで監視可能。 https://gigazine.net/news/20250124-trump-administration-18f-github/ … GitHub で政府を監視。 ◇ ついにGoogleもDEIプログラムを放棄、リスクが高く効果がなかったと社内文書。 https://gigazine.net/news/20250206-google-dei-minority-recruitment/ … 多様性・公平性・包括性(DEI)に関する方針は、えせ正義と認定。 ◇ 電気で塩味を与える日本発のスプーン、米国でも注目--実際に試してみた。 https://japan.cnet.com/article/35228140/ … すごい。たとえプラセボ効果だとしても。 ◇ 脱いだ靴下も拾ってくれるロボット掃除機 Roborock Saros Z70。 https://japan.cnet.com/article/35227847/ … 小物の整理もしたらバカ売れしそう! ◇ 人々の心を惑わせる「ギャンブラーの誤謬」と「ホットハンドの誤謬」とは? https://gigazine.net/news/20250116-hot-hand-gamblers-fallacy/ … 範囲を狭めたり、視野を広くしたりすると、トレンドはある。 ◇ 企業相手に商談する際に「電話を禁止する」というポリシーを実践するとどうなるのか? https://gigazine.net/news/20250117-no-calls-business/ … 電話対応が必要な要因と、それを電話以外で対応する方法。 ◇ たった1人の開発で初月100万本以上を売り上げた Balatro の販売戦略とは。 https://gigazine.net/news/20250207-balatro-successful-launch-strategy/ … 時間をかけて複数のデモを展開、インフルエンサーが取り扱う運もキャッチ。 ■■ ソフトウェアデザイン館 Sage Plaisir 21 ■■ ホームページ >>> https://www.tzneko.com/ メルマガ >>> http://www.mag2.com/m/0000083983.html ブログ >>> http://blog.livedoor.jp/sage_p/ ツイッター >>> http://twitter.com/Ts_Neko ダウンロード >>> https://www.tzneko.com/freesoft.htm サポート掲示板 >>> http://www.sage-p.com/kg_ban09/z6037C8.cgi 東日本大震災 >>> https://www.tzneko.com/saigai.html メール >>> ts-neko◇sage-p.com ←◇を@に変えてください 緊急メールは件名に「うどんメール」を付けてください。 このメルマガの登録・解除 - http://www.mag2.com/m/0000083983.htm