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

私に教えられることなら

近況と気合い

オブジェクト指向環境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に着手してから気合い気合い言いまくってるんだけど、別に何も考えずに根性論に傾倒したわけではない。

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

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

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

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

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

広告を非表示にする

近況

DIYができて(一軒家)、動物を飼えるとこに引っ越した。

DIYは、とりあえず前の部屋から持ってきたいらない家具を解体するための作業台を作った。ソーホースと言うらしい。2つ作って、釘が抜けたりナナメにズレたりと楽しいことになった。普通はコーススレッドというタイプのネジを使い、水平器でまっすぐにするらしい。いきなり失敗から入るとスルスル知識が入ってきて素晴らしい。DIYの本を買う、みたいな間抜けな真似から始めると今頃本屋に通っていたと思う。結局その作業台はちゃんと作りなおしたあと分解して、見た目がかっこいいのでソーホースブラケットを使って作りなおした。次はSPFの2x4で新居に必要な踏み台を作ってみる。

動物は、彼女の希望で猫を飼うことにした(自分は柴犬とフリスビーで遊びたい)。2ヶ月半ぐらいの野良の子猫をお試しでケージ飼いしている。覚悟はしてたけど、夜泣きが凄くてちょっときつい。寒さとか原因がある部分はどうにかしてあげて、あとは我慢する。

オブジェクト指向環境Denは、引っ越しと仕事の間でかなりペースダウンしてたけど、隙を見つけてはコードを書いていて、ようやくVirtualDOMとコンポーネントとreagent的なrefの実装を終えた。結局Closure(Block)は使っちゃったけど、まあその内容をself fooViewしか書かないように気をつければLate Binding保てるでしょう。コンポーネントの実装は、DenLispの辞書とClosureをごちゃごちゃ使った実装よりはるかにシンプルになって驚いた。あとDenLispに比べてテストを書くのが楽しい。というか他のどの環境よりも楽しい。いろいろ理由は思いつけるけど、合ってるか証明しようがない理由なんかいくら出てきても意味はない。楽しいという真実だけが重要だ。

あと引っ越しを機に買ってめちゃくちゃ便利だったもの

電動ドライバ

安いけど不満ない。これがなかったら引っ越し時の作業がめちゃくちゃ面倒だったと思う。DIYにも活躍してる。

冷水ポット

開けやすくて便利だったので、3本買って麦茶作りまくって飲みまくりまくってる。おかげで前々から断ちたかったコーヒーを断てた。

クールなタオル

なんか振ると冷える。首の後ろに巻いておいて、冷感がなくなってくると左右の手で持ってパンパンとやるとまた冷える。クーラーがまだついてない部屋で作業する必要があって、これのおかげで死なずに済んでいる。というか冷えすぎてちょっとブルッとくるときもある。前々から濡らしタオルで汗をぬぐうという涼み方をしていたけど、パワーアップしたかんじ。追加で買う予定。

たいそうマット

分厚いし畳みやすいし持ち運びしやすい。腰痛めてからストレッチの必要性が身にしみたんだけど、普通のヨガマットとかだと接地してる場所が痛い。というか自分は痛がりなので、武道やってた頃もフロアでのストレッチが嫌いすぎてサボってた。これに乗るとまったく痛くないので調子乗ってストレッチしまくってる。次の記事タイトルは「肉離れした」かもしれない。

Bluetoothスピーカー

前々からスピーカーの配線が嫌いだったし、DTMをやめたので品質いいやつを置く動機もなくなったのが一つ。 WBCの影響で野球を見始めて、いつの間にかベイスターズファンになってたんだけど、abema以外の動画中継がよくわからない他球団専用サービスに加入しないといけなくてダルい。テレビは見たくないし置きたくもない。じゃあradikoで聞くかということで、スマホと手軽に付け替えられるものが欲しいというのが一つ。 というわけでこのスピーカー買ったけど大当たりだった。音結構いいし手におさまる大きさで持ち運びもしやすい。 おかげでラジオ(radiko)をよく聞くようになった。適度な雑音で集中力を高めたいけど、好きな音楽を消費するような聞き方したくない、という時に最適。

広告を非表示にする

続・ブラウザ上で動くオブジェクト指向プログラミング環境「Den」を作っている

引っ越し・仕事の忙しさに負けず夜な夜な書き続けたらできた。

f:id:phaendal:20170729195834p:plain

DenLispでDengo(Den用のプログラミング言語)のプロトタイプのパーサ・コンパイラ・開発環境などを書き、それをプロトタイプで更に書きなおし、開発環境のブートストラップに成功した。

コンパイル済みJSをコピーしていくので、急いでプロトタイプを正式版に書き直す必要はない。修正が必要になる度に書きなおしている。これもまたLate Bindingだ。

SSではVDOMという文字が見えるけど、所謂React的なdiff・patchはまだ移植してなくて、気合いでDOMいじりによって開発環境を作った。Dengoの生産性の高さのおかげで案外なんとかなった。

まだ暫く忙しいんだけど、ピュッとDenLispからVirtualDOMを移植してしまおう。