プログラムの可読性と保守性を言語学から見る

2021年7月27日火曜日

Engineer

別の方が書いたソースコードが読みにくいと感じたことはありませんか?
本記事ではプログラミングの可読性とは何か?を言語学のラングとパロールになぞらえて考えてみます

アイキャッチ

ラングとは?

プログラムの可読性に触れる前に、言語学で用いられるいくつかの言葉の定義を紹介します。

ラングとは、日本語では「言語」と訳される用語ですが、もう少し詳細な定義としては、「個別の言語共同体で使用される多種多様な国語体」と定義されます。

定義だけ見ると分かりにくいですが、日本語を例にすると
個別の言語共同体を、"日本"とすると、その社会で使用される国語体が"日本語"となります

今、この記事が何の問題もなく読めていること自体が
言語体系が共通で、同じラングを頭の中に有しているからなのです。

また方言なども"ある地域"を言語共同体とする国語体であると言えます。

パロールとは?

パロールとは、「ラングを実際に利用したもの」を指します。

具体的には、頭の中に日本語のルールを持っている我々が、
発音したり、このようにブログとして書き記したり、頭の中のラングを使ってアウトプットした結果がパロールにあたります。

パロールの面白い点が、仮に異なる発音であったとしても、その発話もパロールであると定義されているところです。

例えば「コアラ」という単語を
Aさんは「KO A RA」と発音したとします
この発音は一般的なラ行の発音のためどなたも違和感なく聞き取れるはずです。

一方でBさんが「KO A LA」と発音したとします
この発音は無理やりひらがなで表現すると「こあらぁ」のような発音となり若干違和感のある発音となります。

しかし、両者はどちらもパロールであると定義されているのです。
パロールの概念図

プログラムの可読性

ラングとパロールはプログラムの可読性とどのように関連するのか見ていきます

プログラムの可読性とはWikipediaの定義としては
プログラムのソースコードを人間が読んだときの、その目的や処理の流れの理解しやすさを指している - 可読性
と定義されています

日本語とプログラム言語を比較した場合の違いとして、パロールの許容範囲が異なる点が挙げられます

先ほどの「コアラ」の発話の例のように人間が扱うラングはパロールに差異があったとしても意味は通じ許容されます。パロールを受け取る人間の許容範囲が広いことが良く分かりますね。

一方で、プログラム言語はパロールの許容範囲が非常に狭くなります。

例えばint型を定義する場合、

int a = 0;

上記のようなパロールとなります

しかし下記のようなパロールはプログラム言語としては意味をなしません
intr a = 0;

人間が読む分にはおそらくint型を打ち間違えていると予測が立ちますが、コンピュータはその予測ができません。そのため正しいプログラム言語ではないと判断します。

この点プログラム言語を人間がパロールする際に
コンピュータが理解できなければならないため一定のパロールの統一がなされます。

では、言語体系のアウトプット(パロール)が統一されるにもかかわらず、なぜプログラム言語に可読性という概念が存在するのでしょうか?

それは、統一されるパロールはコンピュータが理解できる・できないという側面のみであるためです。

つまり、コンピューターが理解できさえすればプログラム言語としては機能するため仮に人間が理解できなくてもプログラム言語としては成立してしまいます。

ここに、可読性という概念が生まれる要因があると考えます。

例えば、何の脈絡もなく「やばい」と発すれば
ある人はやばい対象が「とても素晴らしいこと」と認識し
別のある人は「とても危険な状態である」と認識するかもしれません

この認識のずれがプログラム言語でも発生し得ます。

何の脈絡もなく下記の関数が定義されているとき
def funcA()
	・・・

ある人は、funcAを、funcBを呼び出す前の関数であると認識する可能性があり
また別の人は、funcAを、funcA'()の基底関数であると認識する可能性があります

このようにパロールの仕方によっては認識のずれが発生していくのです

このため関数にはその意図を示す関数名を付け、また、コメントでその関数の意図を示しておくことが望ましいと考えられます

また、方言のように社内にコーディング規則が存在する場合は、その規則に則り方言を話した方が伝わりやすいと考えられます

転職先のプログラム言語が「津軽弁」で書かれているのであれば、「津軽弁」を理解し、「津軽弁」でパロール(記述)する必要があります

もっとも、対外的にわかりやすいプログラムを目指すのであれば、「日本語」のように言語共同体がより広い書き方に修正していく努力も必要であるとは思います。

可読性を考えるとき、誰にとっての読みやすさであるかを意識する必要があります。実装初心者が多い環境下において、一人の玄人が実装量の削減のため複雑で高難度の実装を行った場合、その環境下では読みにくいコードになる可能性があります。

一方で、玄人集団の環境下では読みやすいコードであるかもしれません。

このように、プレゼン資料やひいては手紙のように読み手を汲んだ実装が可読性を挙げると言えます。

プログラムの保守性

保守性とは、プログラムで実現している機能性を損なうことなく、プログラムを維持、管理していくことを言います。

日常生活において、難しい単語を多用する方はいらっしゃいませんか?

もっとシンプルに表現できるにもかかわらず、もっと簡単な単語があるにもかかわらず、
複雑で難解な表現を好む方が一定の割合でいらっしゃいます。

プログラムにおいても同じ表現が起こり得ます。

2行に分ければ簡単に、理解しやすいコードになるにもかかわらず、複雑な記法を用いて1行で記述する。
あるいは、複雑な設計によって、幾重にも重なる継承が存在する。

これらは、一見すると賢そうでかっこいいプログラムに見えますが、維持していく難易度が高くなります。

保守性を考慮するとシンプルで簡単な表現であるべきです。

さいごに

プログラムの可読性と保守性について、少し変わった角度から紹介させて頂きました。
身近な日本語の話し方を例にとってプログラムを考える事で、人に伝わりやすいソースコードの書き方の一助になれば幸いです。

AIで副業ならココから!

まずは無料会員登録

プロフィール

メーカーで研究開発を行う現役エンジニア
組み込み機器開発や機会学習モデル開発に従事しています

本ブログでは最新AI技術を中心にソースコード付きでご紹介します


Twitter

カテゴリ

このブログを検索

ブログ アーカイブ

TeDokology