反骨精神のスタック礼賛

洪 民憙 (Hong Minhee) @hongminhee@hackers.pub
予てから技術スタックを選ぶ際には、必ず主流に逆らう技術を選んできた。2000年代後半にRubyでウェブ開発をしていた時は、RailsではなくSinatraをDataMapperと共に使っていた。JavaScriptフレームワークを使う時もPrototypeではなくMooToolsを選んだ。2010年代初頭にPythonでウェブ開発をする際には、Djangoを使わずWerkzeugをSQLAlchemyと組み合わせて使った。最近ではReactとNext.jsを使わず、SolidとSolidStartを使っている。私は最近、このように他の人が使う技術を避けて、あえて意地でも代替技術だけを選んで使うことを反骨スタックと呼んでいる。おそらく反対語は王道スタックあたりになるだろう。
反骨スタックの最大の特徴は、やはり使用者が相対的に少ないということだ。そのため問題に遭遇する機会がより多く、トラブルシューティングの際も他の人がすでに見つけた解決策を使えず、自分で解決しなければならないことも多い。しかしこれが、その技術、そしてその技術を超えてその分野についてより深い理解を得る機会にもなる。例えば、Werkzeugは抽象化レベルが高くないため、その上で事実上インハウスのウェブフレームワークを作って使わなければならなかった。もちろん、これを誰かは無駄な努力と考えるかもしれないが、そのような「無駄な努力」が私を成長させたのも事実だ。Stack Overflowに答えがない時、ソースコードを直接読まなければならず、その過程でHTTPプロトコルの細かな部分まで理解するようになった。そしてその技術がオープンソースであれば、実際にその技術に貢献する機会も多く得られる。私が提出したプルリクエストがマージされる瞬間の喜びは、王道スタックでは感じにくいものだ。
反骨スタックのもう一つの特徴は、概して後発であるということだ。つまり、王道スタックの不満点を認識した人々が我慢できずに作ったケースが多い。そのため代替的な設計をすることになる。SolidがReactの仮想DOMオーバーヘッドを避けるために細粒度リアクティビティ(fine-grained reactivity)を実装したように。そして常にそうとは限らないが、そのような代替的な設計が王道スタックの設計よりも優れていることも多い。王道スタックの誤った選択を見て学んだ上で、それらを避けて作ることが多いからだ。これにより、反骨スタックを選んだ人は王道スタックを選んだ人よりも、その分野についてより良い理解、より整理された理解を得る機会が多くなる。
一方、王道スタックは多くの場合、総合セットの形を取ることが多い。Railsの「設定より規約」(convention over configuration)、Djangoの「バッテリー同梱」(batteries included)、Next.jsのフルスタックソリューションを考えると、内部的には様々な技術を含んでいても、ユーザーの立場からはその境界を感じないほどよく統合されている。対して反骨スタックは多くの場合、複数の部品をユーザー自身が選んだ上で組み立てまでしなければならないことが多く、この過程で時間はかかるものの、各部品について最善のものを選べるという利点があり、組み立てる過程でも各技術についてより深く理解する機会となる。
この組み立てプロセスは時に骨の折れるものだ。Sinatra + DataMapper + Haml + Sassを組み合わせながら、それぞれの設定を合わせ、ミドルウェアを接続し、エラーをデバッグする時間。しかしこの過程で、私はウェブフレームワークが実際にどのように動作するのか、各層がどのように接続されるのかをより深く理解するようになった。そしてその理解は後にどのようなスタックを使おうとも大きな資産となった。
しかし、一つ心に留めておくべきことは、今日の王道スタックも過去には反骨スタックとして始まった可能性があり、今日の反骨スタックも未来には王道スタックになり得るという点だ。Ruby on Railsも最初はJavaウェブ開発の代替として台頭し、ReactもBackbone.jsのような過去のMVCウェブフロントエンドフレームワークの代替として注目されたのではなかったか?つまり、各技術が重要というよりも、常に新しい代替案に目を向ける好奇心と、技術的な意思決定をする際に技術選択の根拠を単に大衆の選択に委ねるのではなく、自ら主体的に判断することが重要だと考える。
学習と推論が分離しているLLMの限界のために、これからは王道スタックはますます王道となり、反骨スタックの不利さは増すだろう。Claude CodeはNext.jsのコードはスラスラと書いてくれるが、SolidStartのコードは迷走する。それにもかかわらず、反骨スタックだけが与えてくれる学びの機会は依然として存在すると思う。
LLM時代においても、私は引き続き反骨の道を歩むつもりだ。なぜなら、反骨スタックが与える学びの機会は単なる知識習得を超えて、技術に対するより深い理解を育むからだ。だからこの記事を読んでいるあなたも、時にはStack Overflowに答えがない道を歩んでみることをお勧めする。その先で出会う気づきは、完全に自分自身のものとなるだろう。