レガシーコード生産ガイド

私に教えられることなら

近況と気合い

オブジェクト指向環境Den

開発環境(コンパイラなど)含めたクラスは122、メソッド数は1580になった。ブラウザ・JSというインフラのおかげで案外少ない。

メソッドリストを挙げるコードは以下。

allMethodList

let acc = [].
let xs = NS allCOList do: #[:co|
  co methodDict keys do: #[:key| acc push: key].
  co classCO methodDict keys do: #[:key| acc push: key]
].

^ acc

NSとCOはそれぞれSystem.NamespaceとSystem.ClassOperatorというクラスをrequireした際のalias。

DenではClass自身は自分の構造・情報を知らず、ClassOperatorクラスが扱う。ClassクラスのクラスメソッドにはbasicNewとnewぐらいしかない。

これは、nameとかparentとかのよく使いそうな名前を、上書きするとまずいかもしれないメソッド名として使いたくないという、現実的な理由が一つ。

もうひとつは、情報を与える側と与えられる側を分けたいという理由。Rich HickeySimple Made Easyは、関数とイミュータブルな値の世界に限らず、複雑さが問題となる領域では全て通用すると思っている。

例えば国から国民番号(ID)が与えられる場合、通知などからそのIDを知って、自分で答えられる場合はある。しかし、そのIDは自分とは関係ないところで勝手に作られて勝手に管理されてるのであって、自分が持つ情報ではない。その国に所属してない・所属してないと思ってる人に勝手に与えられる可能性もある。

そこで、ある個人にIDを尋ねる事ができるように、特に静的に関係を記述してしまうのは、国と個人をComplectすることになる。そのIDを必要とする側が国と個人を関係づけるのがSimple。例え尋ねることができたとしても、本人が通知カードや役所に出かけて調べるみたいに、実行時に解決を遅らせるのが正しい選択となる。

もちろん現実では個人情報の保護等いろいろComplectされてて自分がIDを知らないといけないんだけど、書くコードは自由なので執拗にSimpleにした。

VirtualDOM + コンポーネント

snabbdomを元にしたVirtualDOM実装と、独自の更新管理コンポーネントでアプリケーションを書いていたんだけど、更新まわりでバグが大量に出た。

原因はオブジェクトの同一性と更新サイクルに起因するものが(おそらく)多い。

やはり生きているオブジェクトを動かすならVirtualなNodeを生成するのではなく、操作していくべきでは……と悩んだり迷走し始めたんだけど、後述の理由から「あっこれは気合いが足りないんだな」と思い直し、VirtualDOM実装も含めて全て、細かくテストを書きながら作り直した。

結果的に自分の間違いに気づいて、更新管理の構造はかなり変わった。また、アプリケーションのコードを殆ど修正することなくバグの修正ができた。良かった良かった。多分。

気合い

DenLispに着手してから気合い気合い言いまくってるんだけど、別に何も考えずに根性論に傾倒したわけではない。

人間(少なくとも自分)は予測の正確さともっともらしさを混同している。事実が明らかになる前に正確な予測が可能なのは数学や物理などの特殊な問題だけで、現実的な問題は変数が多すぎて予測不可能。当たるか当たらないかは運でしかない。

人間(少なくとも自分)は失敗を回避しようと、予測したがる。予測というのは書いたことがないプログラムを書く前に設計することも含む。予測にもっともらしさを足そうと必死に考えたり、予測可能な問題で構成すれば全体も予測可能になる等の安易な考えに飛びついてしまう。未経験の問題の解決能力を得ようと、技術書を読んでみたり練習してみたりする。その結果、現実の問題への精神的な距離はますます遠のく。

ただ、予測することを捨てて、どれだけ小さくてもいいので事実を明らかにしてしまえば状況は変わる。その事実を元に少し進むことで、また別の事実を明らかにできる。不安によって予測にもっともらしさを塗りたくっても何も残らないけど、好奇心や達成感によって事実を積み重ねると、確かな事実や作品と共に充実感が得られる。

というのはまあ全部仮説なんだけど、今のところこの考え方に従えた場合は成功している。自分を留めていたのは面倒さじゃなくて不安だったと今にして思う。ただ、大きいバグなどに当たって弱気になると、予測したいという気持ちが顔を出す。そのときに、予測をやめて小さい事実を明らかにしよう、という合言葉として「気合い」を使っている。

まあちょっと意味が違う気もしないでもないけど、頭の悪さを感じる言葉なので好きです。頭を使っちゃうと予測してしまうので。頭悪くいこう。

広告を非表示にする