複雑化するプログラム
エントロピーは増大する。プログラムも複雑化する。
例えばFizzBuzz
for i in range(1, 101):
if i % 3 == 0 and i % 5 == 0:
print("FizzBuzz")
elif i % 3 == 0:
print("Fizz")
elif i % 5 == 0:
print("Buzz")
else:
print(i)
これに4で割り切れる場合の処理を追加しようとなった時、プログラムはほんの少し複雑になる。
ただ、条件分岐を1つ追加するだけならプログラムの複雑さはあまり変わらない。
ではどこまで行けば複雑で、機能追加が難しいプログラムになるのだろう?
複雑さ ≒ 分量
先に今回の結論を述べると、「複雑なプログラムとは分量の多いプログラム」である。
個人差もあるだろうし明確な閾値が存在するわけではないが、私個人の感覚を述べるなら、1つのウィンドウにスクロールせずとも収まる分量が認識の限界で、これを超えると読みづらいなと感じる。
パッと見てすぐ理解できるコードという話なら10~20行程度だろうか?冒頭のコードで10行なので丁度これくらいだ。
では、この数十行分の認識力でどうやってプログラムを把握しているのかというと、そもそも見ていない。
1行で表現する
一度冒頭のFizzBuzzに立ち返ろう。充分シンプルに書けているが、更に分量を減らす方法がある。
# pip install fizzbuzzy
from fizzbuzz.fizzbuzz import looprange
looprange(100)
これで冒頭のものと同じ結果のまま、実質1行に圧縮できた。
おっと、たまたま既存のライブラリがあっただけで、そんなもの常にあるとは限らないという指摘はごもっとも。
自分だってサッと書けるような内容をわざわざライブラリで探してくるのは普段やらない。早速書き直してみよう。
def looprange(amount: int) -> None:
for i in range(1, amount):
if i % 3 == 0 and i % 5 == 0:
print("FizzBuzz")
elif i % 3 == 0:
print("Fizz")
elif i % 5 == 0:
print("Buzz")
else:
print(i)
looprange(100)
このプログラムは、それでも依然として「実質1行」である。全体としての分量は関数化とその呼び出しで増えているのにも関わらずだ。
コード分割
先ほどのプログラム、実はamount+1されていないので等価ではない。だが、それに気づかなかった人も少なからずいるのではないだろうか?
自分なら気づかない自信がある。何故ならlooprange()はFizzBuzzを出力してくれる箇所であると、丸々読み飛ばしているから。
つまるところ、殆どのプログラムというのはすべてを読むことを諦めることで初めて読むことができるということだ。
たとえ単一のメインルーチンにすべてかベタ書きされているプログラムであったとしても、関数化できそうな区切りを見つけ、要約し、行数を圧縮して理解しているはずだ。
区切りを見出せないプログラム?それは自分には読めないかなぁ……
圧縮、要約
まとめると、プログラムが複雑化するタイミングというのは分量が多くなった時だ。 そしてそれを防ぐには、コードを何らかの単位で区切り、「読まなくても良い状態」にし続ける必要がある。
ソフトウェア設計の話とは、それ即ちコードを如何に分割するのかという話とも言えるのだ。
雑談
DDR5メモリ本当に高いし、そもそも在庫が全然無いですね……
趣味の自宅サーバーが丁度機材入れ替えの時期だったんですが、ECCのDDR5 SODIMMが本当に無い。
数ヶ月待ったとして値段が下がるか未知数なので割と必死に調達しようと動いているんですが、勘弁してほしい……