ソースコードは命令か、メッセージか?
エンジニアとして働く中で、いろいろなコーディングスタイルなどを見てきていますが、大きく異なる2つのタイプがあるように思います。1つ目のタイプは、ソースコードをコンピュータへの命令と捉えて書かれており、2つ目のタイプはソースコードをコンピュータがやるべきことをまとめたメッセージのように捉えて書いているように感じます。
今回記事では例を紹介しつつ、2つの違いについて考察したいと思います。
タイプ1:ソースコードは命令
1つ目のタイプでは、ソースコードをコンピュータへの命令と捉えており、書いているエンジニアの方はステップを1つずつ具体的に考えており、コードもそれを反映するように書いてます。
例えば、こんなコードです。
const person = new Person();
person.name = "John";
person.age = 30;
:
person.sayHello();
コードを見てわかるようにエンジニアとしてはコンピュータに対して1つずつステップを伝えています。
Personを作る。
Personの名前を設定する。
Personの年齢を設定する。
PersonにHelloと言わせる。
タイプ2:ソースコードはメッセージ
2つ目のタイプではソースコードをメッセージとして捉えており、コンピュータに意図を伝えるように書来ます。
前と同じ例をこのタイプの書き方で書くと…
const person = new Person("John", 30);
:
person.sayHello();
この例ではエンジニアは
名前と年齢を設定したPersonを作る。
PersonにHelloと言わせる。
という感じに書いています。
比較
短い例でしたが、違いは感じられましたでしょうか?
自分が2つのタイプを見ていて、以下の違いがあるな、と感じています。
具体的 vs 抽象的:前者のタイプの方がより具体的で、どういうステップを踏んでいるのか細かく分かります。このタイプを書いているエンジニアが以前、この事に関して「読んだら何をしているのか分かる」と言っていました。それに対して後者は「意図」を伝える姿勢が現れていて、より抽象的になっています。
命令的 vs 宣言的:前者はプログラムが「どうやって動くべきか」という具体的な命令を書いているため、命令的になります。後者は「何をすべきか」ということを表そうとしているため、より宣言的になります。
コードを書く対象:前者はコンピュータに対して書いているのに対して、後者はコードを読む人(他のエンジニアなど)に対して書いているという違いがあります。
自分の考え
このブログを読んでいただいている方々は、「結局どっちが良いの?」と思うかもしれませんので、その観点で自分の考えを書きたいと思います。
もしみなさんがチーム開発をされている場合は、2つ目のタイプ、「ソースコードはメッセージ」の方を意識される方が良いと思います。理由は明白かもしれませんが、チーム開発では自分が書いたソースコードを他の方が読むことが多いため、その方々に自分が書く内容の意図が分かるように書くべきだからです。それには2つ目のタイプのほうが向いています。1つ目のタイプでは、ステップが細かく書かれているため、読み手としては理解するためにより頭を使わないとい毛なくなります。それに対して2つ目のタイプでは、細かい部分はクラスや関数、メソッドなどに隠蔽されていることが多いため、1つ1つ理解するための頭の労力が低くて済みます。
とは言え、場合による
と偉そうに語りつつも、プログラミングスタイル、パラダイム、フレームワーク、言語などについて議論するときは、必ず「場合による」という結論になることが多いです。今回の話も同じで、状況によってはどちらが良いかは変わってきます。ソフトウェアを開発している領域(ビジネスドメイン)、エンジニアのスキル、チームの状況などによって、どちらのタイプも正解になりえます。
大事なのは、自分がどのような状況にいるのかを理解し、その状況に合わせてどちらのタイプを使うかをしっかり考えており判断することだと思います。