オルタナティブ・ブログ > 森崎修司の「どうやってはかるの?」 >

計測できそうでできない多くのこと。エンピリカル(実証的)アプローチで。

誤読しやすいソースコードを調べた研究

»

プログラマにとってどのようなコードが誤読しやすいかを調べた以下の論文を紹介します。

Gopstein, D., Fayard, A. L., Apel, S., Cappos, J., Thinking aloud about confusing code: A qualitative investigation of program comprehension and atoms of confusion, In Proceedings of the 28th ACM Joint Meeting on European Software Engineering Conference and Symposium on the Foundations of Software Engineering, pp. 605-616 (2020)

論文は出版社のサイト(全文を読むには定期購読または単体購入が必要です)、著者らのサイトから読めます。

この研究の目的は、プログラマーがコードを誤解する仕組みを深く理解することです。この論文では「atoms of confusion」(混乱の最小単位)と呼ぶ、プログラマが手動でコードを理解する際に誤解しやすいコードの最小単位を分析対象としています。プログラマーがコードを理解する際の思考プロセスを観察し、誤解の原因を実際の感想を聞きながら分析しています。

この研究では著者らの過去の研究で用いられたコードの一部を対象にしています。その特徴は以下のとおりです。研究で使用されたコードは、合計で26種類のC言語のコードです。

  • 最小単位のコード: 対象コードは4行程度の非常に短いものです。これにより、特定の構造をもつコードに焦点を当てています。

  • atoms of confusion(混乱の最小単位)を含むものと含まないもの: コードはatoms of confusionを含むものと、それと振る舞いは同じでより理解しやすいコードのペアで構成されています。

  • 様々な種類のatoms of confusion: 実験では、複数の種類のatoms of confusion(例えば、演算子の優先順位、プリプロセッサの挙動など)が含まれていました。また、以前の研究で読みにくさを評価する指標(時間や正解率など)が統計的に有意ではなかったものの、混乱を引き起こす可能性のあるコードも含まれています。

  • 意図的に難読化されたコード: atoms of confusionを含むコードは、意図的に難読化されており、プログラマーの誤解を誘発しやすいように設計されています。

この対象コードを幅広い経験を持つプログラマと学生に読んでもらっています。職業プログラマでは、以下の2つのグループが参加しています。詳細は論文のTable 1を参照してください。

  • C++アプリケーション開発者: 4名。 C++を日常的に使用していて平均年齢は30代後半から50代前半です。

  • C++ライブラリ作成者: 5名。 C++ライブラリの開発やメンテナンスに従事していて平均年齢は20代後半から50代前半です。

これらの人に感想を声に出してコードを読んでもらうことによって以下の結果を得ています。

  • 誤解のメカニズム: 職業プログラマ、学生、両方とも誤解は、不慣れ、他のプログラミング言語と同じように考える、注意不足、不慣れによる誤解は少なく、より深い誤解や注意不足が原因となっている傾向がありました。

  • 誤解の原因の多様性: 同じatoms of confusionを含むコードであっても、プログラマーによって誤解の原因が異なることが明らかになりました。例えば、演算子の優先順位に関する誤解もあれば、整数型の真偽値の扱いに関する誤解もありました。

  • atoms of confusion以外の要因: atoms of confusionとして意図されたコードだけでなく、コードの他の部分や、プログラマ自身の思い込み、注意不足が誤解を引き起こすことも確認されました。

  • 誤った理由での正解: 職業プログラマの中にも、コードを正しく評価できたものの、その理由が誤っていたケースがありました。コードの表面的な動作は理解できていても、背後にある言語の正確な意味を理解できていないことを示唆しています。

Atoms of confusionごとの結果は以下のようになりました。

  • 未初期化の変数:コード中に変数が初期化されないまま使用されている場合に誤解することがありました。初期化されていない変数が持つ可能性のある不確定な値について懸念を示しました。

  • 剰余演算子: 剰余演算子の正確な意味や挙動を十分に理解していない人がいました。特に、負の数に対する剰余演算の結果については、混乱が見られました。

  • 8進数表記: 先頭に0が付いた数値リテラルの解釈について誤解する人がいました。

  • 文字列をポインタとして扱う: 文字列が単なるメモリ上の文字の配列へのポインタであることを理解できていない人がいました。

  • 条件文外の論理演算子: 論理演算子(==など)が、if文やwhile文のような条件文以外で使用されていると、混乱する者がいました。

  • printf関数のAPIに関する混乱: printf関数の書式指定に関して混乱したことを報告しました。APIの複雑さがコード評価の正確性を損なう可能性があります。

論文では具体的なコード例とともにどのように誤解するかを記載していますので、興味がある方はそちらもご覧ください。

Comment(0)