tsyama記

プログラミングとそのほか

『プリンシプルオブプログラミング』を読みました

はじめに

これを読みました。

珍しく技術書を最後まで読めたので感想をしたためておきます。

3年目までに身につけたい一生役立つ101の原理原則

タイトルにあるとおり、3年目くらいに読むのがちょうど良さそうでした。5年目の僕でも新しい学びはありましたが、すでに心当たりのある内容が多かったです。だからといって読む価値がなかったというわけでは全くありませんが…。

本書で紹介する原理や原則は、今までプログラミングやコードレビューをしていく中で、「なんとなくこうした方が綺麗」「こうしておくと後から困りにくい」といった、経験則に基づくぼんやりとした考え方としてすでに身についていたことが多数を占めていました。
しかしそれらの法則にはすでに先人がつけた名前があり、深められた考え方があるということを知ることで、今までなんとなくで使っていた考えを明確に自分の道具としてプログラミングに活用できるようになったという感覚があります。

せっかくなので、本書で特に印象に残った項目をいくつかまとめておきます。

SLAP

本書ではプログラムの指針となるプリンシプルを、「前提」「原則」「思想」「習慣」「視点」「手法」「法則」の7章に分けて紹介しています。

2章では原則のひとつとして「SLAP」が紹介されています。
一言でいうと、コードを書くときは抽象度のレベルを合わせよう、という原則です。

コードを優れたものにするために、書籍の目次のように適切に階層化された構造を、関数やモジュールといった言語構造を使って表現することが重要であるとしています。

例えばこんな感じです。

function 高水準関数()
{
    低水準関数A();
    低水準関数B();
}

function 中水準関数A()
{
    低水準関数a();
    低水準関数b();
}

function 中水準関数B()
{}

function 低水準関数a()
{}

function 低水準関数b()
{}

この例ではA()とB()の抽象レベル、a()とb()の抽象レベルが揃っていないといけません。 抽象レベルというとイメージが付きにくいですが、例えばフォームに入力された内容をCSVファイルに出力するシステムがあったとして、A()がデータベースからフォームの内容を取得する処理、B()がCSVを出力する処理ならOKだけど、B()が出力するCSVのファイル名を生成する処理とかだとレベルが合わないから、a()とかb()として階層を下げよ、ということだと解釈しました。

また、関数だけでなくモジュールを作ることで更に高水準の構造を作ることもできます。より大きなシステム開発をする際はそうして階層構造を深め、複雑で大量のコードに立ち向かいます。

凝集度

第4章ではプログラマが見るべき「視点」を解説しています。そのうちのひとつに「凝集度」というものがありました。

「凝集度」とはモジュールに含まれる機能の純粋さを示す度合いです。モジュールの要素間の関係の親密さをもとに凝集度を7段階で定義しています。
例をあげると、たまたま共通している処理をひとつのモジュールに閉じ込めただけの凝集度レベル1の「暗合的強度」や、特定の時点で連続して実行される処理をまとめたレベル3の「時間的強度」、ひとつの役割を実行するためにモジュールのすべてが関連しあっているレベル7の「機能的強度」などです。
凝集度レベルが高いほど純粋で強いモジュールであり、できるだけ凝集度レベルが高い状態を目指すのがよいみたいです。

コンテキスト

6章では手法のひとつとして「コンテキスト」の解説があります。

「コンテキスト」とは「文脈」のことで、コードの読み書きの際、もしくは思考のツールとしてコンテキストを用いることが推奨されています。会話の際に文脈を利用して意思疎通をするように、コード上でも読み手に文脈を意識させるように書くことが望ましいです。

プログラマのコンテキストを広げるために

このような感じで、プログラマがコードを書くうえで覚えておくべきプリンシプルをひたすら紹介していく、というのが本書の構成です。
本文中でプリンシプルのひとつとして「コンテキスト」が紹介されていますが、本書で取り上げているプリンシプルはそれら自体がプログラマのコンテキストと呼べるものではないかと僕は思いました。

例えばコードレビューをする際に抽象度レベルの揃っていないコードがあったとして、単に「抽象度のレベルが合ってない」と指摘するよりも「SLAPっていう原則があって…」というような指摘をした方が説得力があります。また、この原則をレビュアー、レビュイーともに知っていればさらにハイコンテキストなレビューになりそうです。

他にも、べき等性や直行性など、これまで参加したPHPカンファレンスの登壇内容や技術ブログ記事などで暗黙的に使われていた用語もプリンシプルとして多く紹介されているため、プログラマが他のプログラマとのコミュニケーションを円滑にし、スキルを高め合うために必要なコンテキストも身につけることができるのではないかと思います。

おわりに

基本的に本を読む習慣があまりないので技術書を読み切った経験がほぼなかったんですが、101個のプリンシプルをそれぞれ4~5ページくらいで紹介しているので少しずつ読み進めやすく、最後まで読み切ることができました。

3年目プログラマの皆さんもそうでない皆さんも、自分が持っているプログラマとしてのコンテキストを広げ、他のプログラマとのコミュニケーションを円滑にしてみてはいかがでしょうか。