しゅみは人間の分析です

いらんことばかり考えます

週報 2022/04/17 プログラミングの目標がない人のためのビルドツール実装

近況

あまりに天気が良くて鴨川に行ってみた。

自転車だと意外と近くて15分くらい。道は御池通を選んだ。広いので走りやすい。京都は観光客・自動車がそこらじゅうにいるのでルート選択が大事なのだ。

f:id:non_117:20220410153553j:plain f:id:non_117:20220410153559j:plain

f:id:non_117:20220410153610j:plain f:id:non_117:20220410154312j:plain

うつ病九段』に、「メンタルをやった人は自然に触れることで回復するのだ」と書かれていた。鴨川はまさにそういう場所だと思う。

人はまばらで川は鳥だらけ。人間より鴨が多いことすらあるだろう。

ただぼーっと眺めるだけで癒される場所なので、次は原稿を終えた(はずの)妻氏を連れてくる予定だ。

 

冷えがつらい季節が終わりつつある。これからは疲れと胃腸の調子が課題である。万能の対策は散歩と睡眠だが、特に胃腸が弱っていたら足三里にお灸をせよ、と鍼の先生に言われた。千利休も使っていたツボである。

鍼の先生は爪楊枝とタオルさえあれば仕事ができるらしい。だから大地震が起きても営業するから、予約どおり来てくれ、と言われた。すごい。

この鍼灸医はお金儲けが好きなのだ。

 

金曜日はなんとなく有給をいれた。何か予定があるわけでもなかった。

ただ休みたいだけの有給を「チーズ蒸しパン有給」と呼んでいる。銀魂か何かの「チーズ蒸しパンになりたい」というコマが元ネタだ。

この日は昼まで寝て散歩をしたあと家の整頓をしていた。整頓は好きなので、始めてしまうと物が見えなくなるまで1時間か2時間は作業をしてしまう。

ふだんは生活を回していると整頓をする暇がとれない。いい時間の使い方だったと思う。

 

久しぶりに外食でラーメンを食べてみたが、あまりおいしく感じられなかった。それなりに人気の店なので私のほうに原因があるのだろうと考えたところ、そもそも太麺が苦手なことに気づいた。

太い中華麺もうどんも好みではない。麺は細いのが良い。そうめんは好物である。博多ラーメンの店が近所にあれば良いのだろうけど、残念ながら京都は太めの麺が多い。諦めて自炊することにした。

仕事

いつもどおり実装をしていた。

データ構造の設計で悩み始めたときにアウトライナー(もどき)を使ったら、問題点が整理された。やはり会社にライセンスを買ってもらいたい。

読書

権利の選択

「権利(right)」を根本から疑い、その出自を暴いていく本だった。

「自由で民主制な国は平等な権利を標榜し暴力を否定するが、そもそもその体制は暴力によって始まり暴力で維持されているのではないか」という疑念から始まる。たしかにアメリカ合衆国独立戦争をしているし、フランスも革命を起こしている。

直観的に考えたらわかるとおり、「権利の思想」が暴力を否定するのは建前である。「権利の思想」は表向き暴力を否定するが、実際には「力への意志」を持っている。国際政治がその証左であるし、市民同士の顕示的消費もそうだ。

"right"に「権利」という訳語をあてた福澤諭吉はこの欺瞞に気づいていたらしい。「権」はpowerを意味する語だし、「利」も個々人の利益・便益を示している。

おもしろい本だったが、読みやすい本ではなかった。全体像が掴みにくいので序章と4〜6章を先に読むのがおすすめである。

雑記

アウトライナー自作

業務で使うためのアウトライナーを開発している。既存のアウトライナーアプリは社外のサーバに情報を保存するので勝手に業務で使うわけにはいかないし、既存のデスクトップアプリも機能が多すぎて微妙だった。なので、自分でシンプルなアウトライナーを作ろうとしている。

私の持ってる技術はサーバサイドとフロントエンドのものしかないので、ブラウザで動くアウトライナーを作ることにした。Swift GUI開発のスキルも欲しいとは思っているがXCodeを開いては訳がわからんな、となって身につけていない。

私の職務はサーバーアプリケーションの開発なのだが謎の縁でフロントエンド開発をすることも多い。二年前まではiOS Safariのバグに苦しむ日々を送っていた。

 

最近のフロントエンド事情はどうなってるのだろう?と思って再開してみたら、基本は変わっていなくて安心した。各種ツールのバージョンが上がってビルドツールの選択肢が増えただけに見える。どうやらReactとTypeScriptが登場して以降の基本技術は進化していないようである。

TypeScript + Reactの書き方を思い出すのに苦労した。型注釈の書き方をgoの文法にしてしまうし、何でもImmutableなObjectにするのを忘れていた。フロントエンドに慣れていると疑問に思わないが、他の分野から見ると const newHoge = { ...hoge, a: 'xxx'} のスタイルはちょっと異様だと思う。

 

勘を取り戻したら楽しい開発になった。GUI実装はどの言語・フレームワークでも苦行なのだがReactはマシな方である。特にReactはFacebookの賢い人たちが作っているので、APIがほどよく抽象化されている。そのおかげで苦行が少し緩和されるのだ。

書き始めて一週間でアウトライナーらしきものにはなってきた。あとはショートカットキーを足したり永続化の方法、アプリの実行方法(ブラウザ拡張にするのかindex.htmlだけで実行するか)を考えて実装すれば終わりそうである。GWあたりの完成を目指したい。

プログラミングの目標がない人のためのビルドツール実装

「フロントエンド技術は雇用のために道具を複雑にしている」という冗談がある。
もちろん雇用のためだけでなく、事情があって複雑になっているのだが、この冗談が通じるくらい複雑なのは事実である。

 

なぜ複雑なのかというと、ブラウザの特殊事情が原因である。スマホのアプリは一つのフォルダに画像やプログラムを入れてフォルダごと配るだけでよいのだが、ブラウザではサイトにアクセスされるたびにアセットとプログラムを送る必要がある。たびたびダウンロードが発生するので、アセットもプログラムもサイズが小さいと良い。なので、事前にインストールができるアプリに比べて厳しい最適化が求められるのだ。

じゃあ全部スマホアプリにすれば良いのか?というとそうもならない。ブラウザがOSやCPUの違いを吸収してくれるので、ブラウザで動くように作れば、ほとんどどこでも動くアプリになる。GUI実装の開発コストはばかにならないので、スマホアプリの中身がwebviewやelectronになっていてフロントエンドアプリをそのまま動かすことも珍しくない。SlackやTwitterのアプリがそうだと思う。

 

こうしてJavaScriptと画像、その他アセットを最適化するためのビルドツールが必要になる。JavaScriptそのものではなくTypeScriptを使う場合、ブラウザの差異を吸収するためのライブラリを使う場合、それぞれで専門のビルドツールが登場する。

これらのビルドツールは最近GoやRustで書かれているらしい。昔はJavaScriptだった気がするが、ビルド速度や(ビルドツールの)開発のしやすさを求めて変わってきているようだ。

フロントエンドの道具なのにRustで書かれてメンテナンスできるのか、という課題はある。Goは文法がシンプルなので少し練習すれば書けるだろうけど、Rustはそうもいかない。開発者の頭数は足りるのだろうか。

 

「xxx言語を使えるなら何でも良い」という人たちの存在が助けになるかもしれない。本来プログラミングは目的のための手段なのだが、言語を使うことそれ自体が目的になる人たちがいるのだ。

「xxx言語を使いたいけど作りたいもの、目標がない」という悩みはプログラミング初学者でよくみられるものだが、xxx言語が好きな熟練プログラマでも作りたいものがなくて困ることがある。たいてい競技プログラミングをしてお茶を濁すものだが、できるならば実用的なものを作るのがいい。実践が一番である。

 

ここに各種ビルドツールがマッチする可能性があるのだ。というか、マッチしているから実際に書かれているのではないか。

フロントエンドのビルドツールには次のような性質がある。

  • プログラムの入力と出力がはっきりしている
  • UI実装の面倒さがない
  • 先行実装がたくさんあるので最初は写経をすればよい
  • 最適化目標がサイズと速度でわかりやすい
  • 潜在的な利用者が多い
  • JavaScript等のパースが必要なので、プログラミング言語好きのオタクに刺さる

特に入出力がわかりやすいこと、UIがなくてロジック実装に注力したら良いのがポイントだろうか。xxx言語を使うのが目標なので面倒ごとは少ないほうがいい。また、指標が速度なのも良い。競争ができてやる気を高めるだろう。

 

ただ、こうしたビルドツールをOSSとして開発し続けるのはきついかもしれない。一回実装して既存ツールより速くなった!と喜んで終わりならいいのだが、誰かの業務で使われるようになるとOSS消耗に巻き込まれる。お金にならない割にバグ修正やissueでのコミュニケーションを求められる。長く続けると互換性の維持も必要になり、ビルドツールを移植して速くする、という当初の楽しさは薄れるだろう。たいてい使われるツールにはならないが、公開することへの覚悟は必要である。

逆にお金と暇があってタフならば楽しい趣味になるだろう。ストックオプション一発当ておじさんとか、年金生活プログラマの趣味になるかもしれない。年金生活おじいちゃんが格安飲食店を営業して価格破壊を起こすやつのOSS版である。

まとめ

ソフトウェアの世界は年々大きくなっている。ソフトウェア同士の依存関係が複雑になるのは悩みの種だが、「隙間家具」があると便利なのは事実だ。

フロントエンドのビルドツールに似たOSSは他の分野にもあると思われる。k8s周辺ツールとか、もしかするとUnityやスマホアプリ界隈にも需要があるかもしれない。

ソフトウェア開発業全体が大きくなった結果、隙間のツールを作れば便利に使って貰えるのだ。ただ好きな言語を使いたい人にとっては良い時代である。