本質的なこと

昨日、今 仕事でやっている設計のレビューをしてもらった。
レビューしてくれたのは、超有名グローバル企業でトップエンジニアだったか何だかのグローバル認定を受けていた方。最近になって一緒に仕事をできる機会ができたのだ。考えてきたAPIの一覧を見せていた時に、こんな話をしてくれた。


APIメソッド)には、プリミティブなものと、プリミティブなメソッドを組み合わせてできるものがある。まず、プリミティブなAPIを考えること。プリミティブなAPIとは何かといえば、機能を分解していって、もうそれ以上分解できない機能のことだ。このAPIの考え方がしっかりしていれば、応用は後からいくらでも効く。逆に、このAPIが不十分であれば、あとあとになって、やりたいことができなくて困ることになるだろう。


話を聞いている時に、すごく思い出したのがこれ。

ソフトウェア作法

ソフトウェア作法

本書では可能な限り、複雑なプログラムを簡単なプログラムをもとにして組み立てるようにする。また可能ならば、すでに存在している道具を利用することにより、またその組み合わせについて新しい使いかたを見つけ出すことによって、プログラムを作らずにすますようにする。本書のプログラムはつなぎ合わせて動かすことができるようになっている。その相乗効果は、同じようなプログラム群においてつなぎ合わせが簡単にはできないようになっている場合とくらべて、はるかに大きいのである。

そういえば うちの部門のトップの方も、同じようなことを研修の時に言っていたなと。


これは真理なのだろうなと思うのと、できるプログラマーというのは、この考え方が芯までみについているのだろうなと感じた。というのもレビューの時に、このエンジニアの方が考える過程を見せてくれたのだ(本人にそのつもりがあったかどうかは分からないけど、考えていることを声を出して順に伝えてくれていたので、そう感じた。)


まず、登場人物を洗い出して、登場人物に明確な名前と定義付けをする。
その登場人物それぞれにおいて、データはどう流れるか。
「データをつくるだろ、データをみる、データを更新する、、削除は?論理削除と物理削除があるのか。じゃあ、データの操作は5種類あるんだな。で、この登場人物について、それぞれデータの操作をするのを考える。。。」
これを聞いていてびっくりしたのは、いわゆるCRUDというのを考えているのだけど、それを1つずつ丁寧に検証しているということ。もうこの道20年以上のキャリアの方が、こうやって丁寧に、1つずつ積み上げて、1つずつ組み立てて、という思考をするのだということが驚きだった。「ITエンジニア」というのってこういうものなのかなと。工学というか、職人というか。
久々に仕事中に鳥肌が立ちました。

CRUD図とか、UMLとか、JAVAとか、技法は色々覚えるけど、(技法を覚えるのも大事だと思うけど)こういう根幹的な考え方も自然にできるようになろうと思った。