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

私に教えられることなら

DenLispとDen供養

イメージベースっぽくブラウザ上で開発したいんじゃい、と今年6月ぐらいからLisp方言処理系の「DenLisp」を作り、更にSmalltalk風言語でイチから書きなおした「Den」を、ちょっとした仕事や日常のツールに便利に使っていた。

しかし段々と、この方針は上手く行かないのではという疑念が強まっていき、昨日パッと「アッもうだめだ」と悟ったので、理由などをここに簡単にメモして供養とする。

Denはgithubに置いている。多分この記事が消えるときに消すと思う。

github.com

(DenLispの方はもしかしたら最新版はこの世に存在しないかもしれない……)

たぶんWorse Is Better

編集→ビルド→実行・確認→編集 のループに時間がかかるとイライラするので、ブラウザで開発し、機能などの変更をその場で確認したいというのが最初の動機だった。

ある程度、色や遷移などを確認しながら同一画面でコードを編集していくことは達成できた。しかし、状態の管理場所を変更したり、URLなどページ毎に確認する必要があるものを変更すると、結局アプリケーションやIDE全体を更新することになった。マウスで操作する必要があるので、確認にかかるストレスは大して変わらなかった。

なんで最初の動機が生まれたかというと、もっと粘土をこねくり回すようにコードを書きたいと思ったから。目の前にあるものを、少しずつ形を整えていくのが自然なものづくりで、だから楽しいのだと思っていた。

でも冷静になって考えてみると、例えば紙飛行機を作って飛ばしてみるだとか、作曲して一回通して弾いてみるとか、編集→確認のループが必要な創作活動はいくらでもある。そして、それぞれの試行が独立だからこその便利さを痛感することが何度もあった。

それと、アンチフラジャイルに強く影響を受けてものごとの脆さ・反脆さを意識するようになったので、ファイルベースの反脆さに気づき、一周して好きになってしまった。Worse Is Betterに戻ってきた。好き嫌いでやってきたので、好き嫌いが変わったら行動も変えましょう。

などなど。言葉にできない部分も大きくて、それは言葉にする必要が無かったり、言葉にしようとしてしまうと不満が残りそうなので、ここでやめておく。

やってよかったこと・わかったこと

  • snabbdomを2つの言語で移植したのでかなりVirtualDOMの理解が深まった。もうソラで書けると思う。snabbdomベースのVueの動作もめちゃくちゃ良くわかった。
  • DenはSmalltalk風の方言だけど、St80のifTrue:とかは正直読みにくいしダサいと思ってたので、if文とloop文を導入した。結果的にものすごく読みやすくて大当たりだった。あとletも。
  • メソッド単位の編集はやっぱりかなり楽。インデントレベルが最低でも1減るから?
  • テンプレート文字列(ES6のやつ)と、それを直に書けるテンプレートメソッドの導入はものすごく便利だった。
  • とにかく異常な量のコードを書いたのでとても自信がついた

今後

なんかやる前とだいぶん価値観が変わってしまった(これはアンチフラジャイルのせい)。前はプログラミング言語を構成する概念や構文の、一貫性・シンプルさ・美しさをとても大事だと思ってたんだけど、180度変わって、そういったことが好きになれなくなった。人工的な、コンクリートの壁で囲まれた部屋みたいな印象を受ける。

手段にこだわらず、とにかくあったら便利だなと思うものをバリバリ書きたい。

ほな、また……。

広告を非表示にする

説得力タンクと事実タンク

人間(少なくとも自分)の心には、説得力タンクみたいなものがある。

何かに挑戦したり、信じたいものがあるとき、説得力タンクを満たそうと行動してしまうことがある。

以下は自分がやらかした行動例

  • 人の絵を上手く描きたい→ 人体の描き方を探してみる、ドリルのような練習をしてみる
  • 税務関係のある作業のやり方がわからない→ ネットや本で情報を探してみる
  • ある塗料の臭いが我慢できるか、防腐効果がどれぐらいなのか知りたい→ ネットや本で情報を探してみる
  • ◯◯言語で複雑なWebアプリケーションが作れるか→ 成功例の記事を探す、基礎となる(ようにみえる)簡単なものを作ってみる

説得力タンクは穴が空いていて、永遠に満タンになることはない。しかも、どれだけ説得力を集めても更に説得力を集めたくなる。悪循環に陥り、ずっと実際の行動に移れなくなる。

実際の行動とは、事実タンクに事実を溜める作業を指す。事実タンクは頑丈で、中の事実が減ることはない。

  • 人の絵を上手く描きたい→ 実際に描いて、気に入らないところを修正する
  • 税務関係のある作業のやり方がわからない→ 税務署などの機関にメールして聞く
  • ある塗料の臭いが我慢できるか、防腐効果がどれぐらいなのか知りたい→ 買って塗ってみる
  • ◯◯言語で複雑なWebアプリケーションが作れるか→ 業務で作ってるものと同じ機能のものを作る

事実タンクは、成功タンクでは無いことに注意したい。何かが失敗することもまた事実で、説得力とは違う、貴重で本物の情報となる。失敗を元に修正していけばやがて成功に辿り着けるかもしれないし、元々成功が無い道ならどこかで見切りをつけられるかもしれない。 例えば上の例だと、次のような失敗を得られる可能性がある。

  • 人の絵を上手く描きたい→書いてみる→ 気に入らない絵ができる
  • 税務関係のある作業のやり方がわからない→ メールしてみる→ メールの返信がこない
  • ある塗料の臭いが我慢できるか、防腐効果がどれぐらいなのか知りたい→ 買って塗ってみる→ 臭い、金を失う
  • ◯◯言語で複雑なWebアプリケーションが作れるか→ 作ってみる→ 美しく書けるという触れ込みだったのに、重複だらけの意味不明なコードになってしまう

でも成功タンクに成功だけを溜めようとすると、上記の行動は避けるべき、又は最後に成功があることを確証しないと動けなくなる。結果、説得力タンクを満たす行動に耽ってしまう。

まだまだ気を抜くとすぐ成功しようとしてしまい、説得力を探してしまう。そういったときに「事実を得よう」と切り替えられる何かがあればいいんだけど。

近況

Den

仕事に使いつつ改良していってるんだけど、狭い画面だと開発環境がちょっと使いにくい。

f:id:phaendal:20170827005932p:plain

なんとなくなんだけど、一番のストレス源は画面のスクロールとマウスによるポイントな気がする。

スクロールによってストレスを受けるものと受けないものを考えると、基本的に一方にしかスクロールしないことが鍵かもしれない。

というわけで新開発環境をいろいろ試していきたい。

8月の最初に元野良の子猫が家に来たんだけど、一日中ケージの隅に縮こまり、ケージに少しでも近づくと唸って威嚇する有り様だった。夜泣きも酷く、助けを求めるような悲痛な声で朝方まで叫び続けるので寝られない。餌にも全然口をつけず、もちろん遊んだりもしない。

そんな状況が5日ほど続き、寝不足で困っていた。本やネットで慣れさせる方法を探しても、「猫ちゃんが自分から来てくれるのを待ちましょう。うちは1年かかりました笑」みたいなのばっかりで、冗談じゃないよというカンジ。

で、真逆のアプローチを取ることにした。ストレスやその発生源には適応可能なものとそうでないものがあって、前者は人間を始めとした生物を強くし、後者は弱くすると考えている(アンチフラジャイルにかぶれているとも言う)。例えば筋トレの筋肉へのダメージや創作活動の生みの苦しみが前者。激しすぎる筋トレによる怪我、電車での通勤、過労、上記のスクロールによるものなどが後者。

猫に近づくと猫は恐怖してストレスを受けるわけだけど、脱毛したりなどの適応不可能というサインが無いならば適応してもらうことにした。

まずケージに近づくと威嚇して縮こまる反応。これは休日を一日利用した。ケージの前に座って、かなりの至近距離でずっと過ごした。威嚇しなくなったら、フワフワした毛のおもちゃで体を撫で続ける。これにも慣れてきたら、手を入れて猫の体にくっつけてじっとする。そして最後は撫で回してみる。これで、一日の最後には、お腹を撫でているとゴロゴロ言い出し、手を枕にして寝るようになった。

他にも、立って近づくとすぐ逃げたり、ケージからちょっとでも出すと逃げまわって威嚇したりしてたんだけど、適応可能そうか観察しつつ適度にストレスを与えると、ちゃんと適応してくれた。始めて3日ぐらいで毛づくろいしてきたり、ケージの外でも人間にくっついてると安心してお腹を出して寝るようになった。夜泣きも無くなった。

あとは、遊んでる最中でも、部屋に用意したテリトリーか人間のそばから離れようとしないのがちょっと心配なんだけど、別に困ってはないので様子見している。

↓足音を立てて近づいても、お腹を出しっぱなしで寝ている f:id:phaendal:20170827014955j:plain

↓ずっとパシャパシャやってると起きた f:id:phaendal:20170827015326j:plain

広告を非表示にする