BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース コードを読む上での課題とその対処方法

コードを読む上での課題とその対処方法

原文(投稿日:2021/12/16)へのリンク

コードの読むことは、多くの点で混乱を招く可能性がある。コードの読み方は明確に教えられておらず、コードの読み方を練習することはめったにない。ある役割を果たす認知プロセスを認識することは、コードをより適切に読むのに役立つ。

ライデン大学の准教授のFelienne Hermans氏は、2021年11月のQCon Plusでプログラマーの頭脳について基調講演をした。

調査によると、プログラマーは時間の約60%をコードを読むことに費やしている。それでも多くのプログラマーが非常に難しいと感じる活動であるとHermans氏は述べている。私たちがコードを読んだときにあなたの脳で何が起こるかを知ることで、なぜそれが難しいのか、そしてそれをどのようにしてより良くするかを把握する助けとなる。

Hermans氏は、コードを読み取るとき、あるいは実際にはあらゆる種類の情報を処理するときに、役割を果たす脳内の3つのプロセスを区別した。短期記憶(STM)、長期記憶、作業記憶(WM)である。

長期記憶はあなたがプログラミングとそれに関連する情報について知っているすべてのことを保存する。「javascriptは中括弧を使ってブロックをマークする」、「ほとんどのプログラミング言語ではカウントは0から始まる」、「時間log(n)でサイズnの配列を検索できる」などの事実は、長期記憶に保存される。短期記憶は、見たり聞いたりする情報を簡単に保存するバッファのようなものです。そして、作業メモリーは情報の処理に使われる。

これらの3つの記憶システムについて知っておくべき最も重要なことは、短期記憶と作業記憶が長期記憶に大きく依存しているということだとHermans氏は言っている。

これらの文章を読んでいるとしてください。あなたはすべての文字とほとんどすべての単語を知っているので簡単なことでしょう。別の言語では、読むことは全く異なる経験なのです!

プログラミングでは、構文をそれほど多く知る必要はないというこの信念がよくある。しかし実際には、長期記憶に保存されていないと、構文、概念、ドメインワードはとても混乱を招くものとなるとHermans氏は述べている。たとえば、ドメインの概念の意味を知らないと「クリーンなコード」でさえ混乱を招く可能性があると彼女は言っている。

InfoQは、コードを読む際の課題とそれを上手く行う方法についてFelienne Hermans氏にインタビューした。

InfoQ: さまざまな形の混乱が発生するとおっしゃいました。詳細を教えていただけますか。

Felienne Hermans: 各メモリシステムについて、それ固有の混乱を伴います。たとえば、特定のキーワードがわからない場合、助けが必要なのは長期記憶です。ただし、コードが非常に馴染みのない形式で構造化されている場合、短期記憶が過負荷になる可能性があります。繰り返しますが、これをなじみのない言語でテキストを読むこととで比較できます。読み方を知っていて、文字を認識しているかもしれません。しかし、文章が意味をなすように各単語を翻訳しなければなりません。また、作業メモリーは、多くのことが同時に発生する複雑なコードで混乱する可能性があります。

InfoQ: コードを読むためのスキルをどのように実践できますか。

Hermans: 上で説明した3つの記憶システムにはすべて、独自の強化方法がある。長期記憶の場合、重要な構文要素、ドメイン、プログラミングの概念の多くの練習が非常に有効です。たとえばフラッシュカードを使うことです。フラッシュカードを作るには、カードの片面に馴染みのあるものを書き、反対側に新しいものを書きます。すべてをよく理解するまで練習します。

作業記憶を支援するために脳の外に処理能力の一部をオフロードできます。たとえば図や注釈を使います。

最後に短期記憶ですが、これは私が認知リファクタリングと呼ぶプロセスでサポートできます。これは個人的な理解のために行われるリファクタリングです。既存のコードベースを改善するのではありません。

InfoQ: そのような認知リファクタリングはどのようなものでしょうか。

Hermans: 認知リファクタリングの例は、三項演算の変換です。

多くの言語は、ifステートメントの省略形である三項演算子をサポートしています。これらは通常、条件の形式を持ち、その後に条件がtrueの場合の結果が続き、次に条件がfalseの場合の結果が続きます。このJavaScripの例のように、Boolean変数のisMemberがtrueかどうかをチェックします。

isMember ? ’$2.00’ : ’$10.00’

一部の言語は、異なる順序で3項演算をサポートします。つまり、最初にtrueの場合の値、次に条件、次に条件がfalseの場合の結果です。このような言語の例は、以下に示すようなPythonです。

’$2.00’ if is_member else ’$10.00’

上記のJavaScriptの例のように、memberがtrueの場合、三項演算子は下記の通り返します。

$2.00, if it is false, $10.00 is returned.

概念的には、三項演算子を理解するのは難しくありません。プロのプログラマーとして、あなたはもちろん条件付きコードに精通しています。ただし、操作が1行に配置されているという事実、または引数の順序が従来のifステートメントと異なるという事実により、コードが精神的な労力を過度に生み出してしまう可能性があります。このような場合、3値をより伝統的なifステートメントに認知的にリファクタリングすることが役立ちます。

InfoQ: より良いプログラマーになるためのアドバイスはありますか。

Hermans: コードを丁寧に読んでください。それがコードレビューであろうと、コードリーディングクラブであろうと、丁寧に練習によって熟練されます!The Programmer’s Brainは、コードスニペットの概要を記述したり、変数を詳細に調べるなど、丁寧なコード読み取りに使える演習をいくつか載せています。

作者について

この記事に星をつける

おすすめ度
スタイル

BT