uhyo/blog

積極的な技術選定と消極的な技術選定

2023年2月13日 公開

この記事は、筆者が技術選定について思うところをまとめた記事です。Twitterに同じ話を何回か書いているので、文章にまとまっていたほうがよいと思い用意しました。

やや過激な思想で愚痴も含んでいるので、共感いただけると嬉しいものの、みなさんを説得しようというつもりはありません。こいつはこういう考え方なんだなという心持ちでお読みください。

積極的な技術選定と消極的な技術選定

ITエンジニアの方々の中には、技術選定をする立場の方も多いでしょう。技術選定にあたってはさまざまな事情を勘案しなければならない難しいもので、それだけに多くの人が技術選定に関する各々の考えを述べています。

筆者は、技術選定における意思決定のプロセスは、積極的な技術選定消極的な技術選定の2種類があるのではないかと思っています。

積極的な技術選定は、選定される(あるいはされない)技術そのものが原因となる意思決定です。

一方、消極的な意思決定は、技術そのもの以外に原因がある意思決定です。

例えば、次のようなものは積極的な技術選定です(技術選定の対象は色々なものがありますが、この記事ではプログラミング言語の選定を例に用います)。

  • 高いリアルタイム性が要求されるので、ガベージコレクションが無い言語を用いる。
  • ブラウザから提供されるWeb APIをふんだんに使用する必要があるので、TypeScriptを用いる。
  • 型チェックによる開発効率の恩恵を受けたいので、静的型システムを備えた言語を用いる。

一方、次のようなものは消極的な意思決定です。

  • すでにチームメンバーが習熟している言語を用いる。
  • 特定の言語に対する会社のブランド力を高めたいので、その言語を選定する。
  • 学習コストが少なくて済むように、フロントエンドとサーバーサイドで同じ言語を用いる。
  • 開発メンバーのレベル感に配慮し、学習コストが小さい言語を選定する。

積極的・消極的と言われると積極的なほうがよいという印象を与えます。これは、技術を選ぶのだからまずは技術に目を向けるべきであるという筆者の考え方がこもった語彙の選択です。しかし、消極的な意思決定だからだめというわけではありません。

消極的な意思決定として典型的なのは、「組織のこと」を考えた意思決定です。組織として成果を出すためには、技術以外のことも勘案して意思決定をしなければいけません。それは重要なことですから、それが悪いことだとは言いません。

また、お察しのように、意思決定が0か100かで「積極的」と「消極的」の一方に分類できるわけではありません。むしろそれは理想論であり、実際には両方の要素が混ざった意思決定となるでしょう。100%積極的な意思決定ができるのは、無限のリソースと最強のエンジニア集団を擁する組織だけです。

例えば、「高品質な・使いたいサードパーティライブラリが揃っている言語を選定する」という意思決定は、筆者の感覚では95%積極的、5%消極的です。エコシステムの状況は技術に起因する要素の一部と見なしてよいというのが筆者の考えですので、これは基本的には積極的な意思決定になります。一方で、必要なライブラリが足りなければ自分で実装すればいいのに、それをしないというのは組織のリソースをそれに割けないといった非技術的な要因があると考えられますから、それが5%の消極的成分となります。

技術選定のレイヤーが異なる

筆者の考えでは、「積極的な技術選定」と「消極的な技術選定」は異なるレイヤーの話です。具体的には、「組織のこと」など技術以外の要因を考える際には、その前提条件として技術に関する考察は済んでいなければいけません。

つまり、筆者が考える望ましい技術選定というのは、まず技術のみを勘案して理想的な技術選定(積極性100%)を考え、その後に現実を見て、妥協として消極的な要素を混ぜ込んでいくというものです。

また、そもそも積極性100%の理想的な技術選定を行うにはあらゆる技術に対して網羅的かつ完璧な理解を有している必要がありますが、それは一握りの天才以外には無理です。したがって、現実的には妥協して自分が有する知識の範囲内で技術を見比べる必要があります。このことは技術の側に要因があるわけではなく技術選定をする人間の側の問題ですから、最初から存在する消極的な要素としてカウントされることになります。

微妙なのは、筋がいいがマイナーな技術が、自身を全然宣伝していないために技術選定をする人の考慮に入らないというケースです。これは、宣伝が不足している技術側の問題とも捉えられますが、一方で、宣伝の程度は技術本体の良し悪しとは直接関連していないので、別軸とも考えられます。今のところの筆者の考えとしては、筋がいい技術であればイノベーターやアーリーアダプター等を通じて広まるはずなので、時間が解決してくれる話だろうと考えています。

一部の技術選定記事に対する違和感

昨今は、多くの個人や組織が技術選定のいきさつを記事などの媒体で共有してくれます。これは多くの技術者に知識を提供し還元する素晴らしいことです。

素晴らしいことであるという前提はありつつ、記事によっては筆者は違和感を感じることもあります。具体的には、筆者が言うところの「積極的な技術選定」と「消極的な意思決定」を区別せずに話をしているのではないかということです。

技術選定と銘打っているからには、往々にして候補に挙がった技術の比較が「メリデメ」などの形で挙げられます。そして、記事によっては、このメリデメに「積極的な視点」と「消極的な視点」が混ざっています。筆者はこれが気に入りません。

具体例として、次のようにメリデメが挙げられている場合を考えてみましょう。

  • メリット: コンパイラによるチェックが厳格で、エラーメッセージも親切。
  • デメリット: チェックが厳しい分だけ学習コストが高い。

この例では、メリットに挙げられているのは「積極的」な理由である一方、デメリットとして挙げられているのは「消極的」な理由であり、筆者が言うところのレイヤーが異なります。学習コストが高くそれが払えないのであれば、それは組織の側の課題であり、技術そのものの瑕疵ではありません。

繰り返しますが、「こんなのデメリットではない!」と言いたいわけではありません。あなたの組織にとって問題なのであれば、確かにそれはデメリットです。ただ、筆者の言うところの「消極的」な観点からのデメリットだということです。

ただ、筆者が思うのは、それらは異なるレイヤーの話だから明確に分けて書いてほしいということです。はっきり言えば、技術選定記事なので技術の話(=積極的な技術選定の話)をしていますよという体で書いておきながら、その中身はあなたの組織の妥協の話(=消極的な技術選定の話)であるというのは、技術に対して不誠実な態度であり、良くないと思っています。

妥協はあくまで妥協であって、組織論の観点はともかく、技術的に見ればそれはポジティブな話ではありません。そのことを、選定されなかった技術に対して転嫁してしまっているのを見ると、不誠実であり不愉快だなと思います。

もちろん、筋の良い技術・悪い技術というのはありますから、技術的な観点からある技術を批判したり、採用しなかったりということは、積極的な技術選定に含まれると思います。ですから、何でも技術を批判するなと言いたいわけではありません。ただ、ある技術が「場合によっては良い技術だと思うけど今回は過剰」みたいな下げられ方をされているときに、過剰である理由が学習コスト(消極的な理由)だったりすると残念です。

学習コストってなに?

ここまで読んだ方はうすうす感じ取っているように、筆者は技術の「学習コスト」という言葉があまり好きではありません。なぜなら、とくに技術選定において、学習コストは本質的な理由にならないと思っているからです。

そもそも、学習コストはせいぜいO(1)です。つまり、一回学習してしまえばその後追加コストなしでずっと成果を生み出し続けられるということです。「学習した技術が生み出す価値 / 学習にかかった時間」で定義される「コスパ」を考えれば、コスパを高めるためにはむしろ、長く使えるように筋のいい技術を選ぶほうが重要に思えます。学習に一定の時間がかかるとしても、その時間を惜しむのは、いわゆる「木こりのジレンマ」と同じ状況に陥っています。

学習が上手な人は、具体的な技術を学習してもそこから使い回しのできる汎用的な知識を取り出します。ですから、そもそも「その技術がどれくらい長く使えるのか」ということも実はあまり気にする必要がありません。すでに知っている概念の組み合わせで理解できるものにはそもそも学習コストはほとんどかからないし、新しい概念を理解する必要があるのであれば、それを理解すれば今後長く役にたつでしょう。

例えば、OCamlを勉強するとlistがいわゆる配列(array)ではなく連結リストであることに驚くかもしれません。その後OCamlを使わなくなったとしても、連結リストの概念は残り続けて今後他の技術を触るときにも役にたつはずです。

このように、同じ技術をとっても「学習コスト」がどれくらいかというのは個人差があるように思えます。上述のように、理解力が高い人は短い時間で効率よく技術を習得できるでしょう。

このことから、技術の「学習コスト」よりも、むしろ難易度、すなわち「学習ハードル」のほうが本質的なのではないかと思います。学習ハードルは純粋に技術の性質として扱えますが、学習コストは誰が学習するかによって変わるため、技術的な要因と非技術的な要因が混ざった概念です。

つまり、「学習コストが高い」という言い方だと、積極的な技術選定なのか消極的な技術選定なのかを明確にできていないので、技術選定理由の説明としてはあまり良くありません。素直に「学習ハードル」や「難易度」といった方が明確になるでしょう。

技術の難易度に向き合う

では、「難易度が高いからこの技術を採用しなかった」というのがどういう現象なのか考えてみましょう。これは、場合によって積極的な技術選定なのか消極的な技術選定なのかが変わります。

もし、その技術が解決したい問題に対して無駄に複雑でハードルが高くなっているのだとしたら、それは技術の筋が悪いことになりますから、その技術を選ばないことは積極的な技術選定となるでしょう。

一方で、その技術が十分筋がいい、つまり解決したい問題が難しいので必然的にハードルが高くなっているのだとしたら、ハードルが高いので採用できなかったというのは組織の側の問題(消極的な技術選定)となります。

その場合、「難しいので技術を採用しませんでした」という場合、その技術が解決していた問題はどうなるのでしょうか。大まかに、2つの道があります。一つは「その技術に頼らずに解決する」、もう一つは「諦める」です。(万が一既存のあらゆる技術よりも簡単かつ優れた解決法を発明したのであれば何も問題ありません。できれはその研究成果をシェアしてほしいです)

具体的な例としては、「型システムは難しいので静的型付け言語は採用しませんでした」という場合、型システムが解決してくれていた問題(ある種のバグを発見し抑制してくれる)にはどのように対処しているのでしょうか。「その技術に頼らずに解決する」では、ユニットテストや結合テストの層を厚くする・人力の検証のリソースを増やすといった対処になります。フィードバックループに時間がかかるので一般には開発期間も長くなるでしょう。「諦める」では、スピード感のある開発のためにはバグが発生することはある程度仕方ないと割り切ることになります。

型システムの例は大げさですが、「難しいので採用しませんでした」という場合は多かれ少なかれこのような現象が起きているはずです。難しい技術を採用しないことを「積極的」な理由で正当化するためには、「我々はそもそもそのような問題に直面しておらず、その問題を解決する必要がない」という論理が必要になります。そうでなければ、気づかないうちにその技術の学習コストと比較して損をしている可能性を否定できません。

例えば、Rustの所有権システムは難しいと言われがちですが、これは「shared mutable stateの取り扱いが難しく、不具合を発生させやすい」という問題に対してシステム的な解決を与えるものです。つまり、「Rustは難しいので採用しませんでした」というのを正当化するためには、「我々はそもそもshared mutable stateをあまり取り扱わないので不具合を心配していない」と言う必要があります。

誠実な意思決定のために

筆者は、技術選定というのは技術に対して誠実に行うのが望ましいと考えています。そのためには、技術選定の理由を明確化するにあたって、この記事でいうところの「積極的」な理由と「消極的」な理由を区別する必要があります。消極的な理由が、あたかも技術の側に問題があるかのように述べるのは誠実ではありません。

この記事でこれまで議論したことは、ある意思決定が「積極的」であるかどうかを判断するためには、選定された、あるいはされなかった技術に対する十分な理解が必要であるということを示唆しています。もし十分理解していない(理解するためのリソースを割けないなど)場合、それ自体が「消極的」な材料となります。

つまり、ある技術を選定しなかったことに対する理由を、純粋に技術的な(=積極的な)観点から述べるのは、それを裏付けるための十分な論理が必要であり難しいことなのです。そのため、誠実な意思決定者であればあるほど、(超天才技術者でもない限り)技術選定の説明には「消極的」な理由が並べ立てられることになるでしょう。

そのため、多くの場合において技術選定というのは妥協の積み重ねであり、ネガティブなものです。

そのようにネガティブかつ難しい決定を組織のために行い、しかも知見として公開してくださる方々に敬意を表します。

本来ネガティブな決定をポジティブなように見せ、しかもそれで技術をネガキャンする方々には敬意を表しません。

追記: コメント返しのコーナー

この記事を公開してから半日くらいの間にいただいたフィードバックのうち、記事に載せたら有益だと思ったものをまとめたので、回答とともにご紹介します。今初めてこの記事を読んでいるという方は、本文を読んで感じたことの答え合わせになるかもしれません。

※ 質問文は原文ママではなく、筆者による要約・脚色を含んでいます。

Q. 積極的・消極的という言葉選びが悪い。バイアスがかかっているのでは?

Q. 積極的って何に対して積極的なの?

A. 筆者はこの記事でいう「積極的」な技術選定のほうが望ましいと思っています。「積極的」のほうがよく見える言葉選びをしたことにはそういう意図があります。ただし、本文中にも書いてあるとおり完全に「積極的」な技術選定というのは理想論です。現実には「消極的」な技術選定のほうが重要になります。

ですから、筆者のように理想を理想として尊重するのか、それとも現実を見て現実に必要なことをより尊重するのかによって、この言葉選びに対する印象は変わるでしょう。積極的・消極的という言葉選びが気に入らない方は、理想よりも現実を見ている方々だと思います。

では、筆者の言う理想とはなんでしょうか。これが何に対して「積極的」なのかという疑問に対する答えにもなります。

答えはカネです。プロとして技術を扱って問題解決する以上、カネを生み出さなければいけません。

そして、筆者の思想では、一時の利益よりも長期的な利益を重要視しています。そのため、長期的に見てなるべく高い効率でカネを生み出すことがゴールとなります。これは技術の世界ではよく「開発効率」と言われてもてはやされます。筆者の考えでは、技術を最大限に活用して高い開発効率を得ることが理想的なゴールとなります。成果物をなるべく少ないリソースで維持運用できるように、そしてさらにカネを生み出す追加の開発をなるべく少ないコストでできるように投資すべきというのが筆者の考え方です。

これに歯向かう「現実」としては、組織として短期的にカネを生み出す必要性があるとか、投資するためのリソースが無いとかいったことが挙げられます。これが筆者の考える理想と現実です。

なので「積極的」が何なのかと言えば、長期的利益に対する積極性ということになるのでしょう。

Q. 積極的・消極的という区分けも客観的なものではなく、技術の使い手によって揺れるのでは。例えば、型システムを使うことも「我々は型システムを使わないと高い開発効率を得られない」と考えれば消極的な理由になるのでは。

A. これは確かにと思いました。積極的・消極的という区分けが客観的な定義になっていないことは認めざるを得ません。本文でも「筆者の感覚では95%積極的、5%消極的です」のように筆者の主観であることを示す表現があるので、本文を書いたときも一応このことを理解していたと思いますが、明確に意識していなかったし明確に書いていませんでした。

そうなると、意思決定が積極的か消極的かを分類するためには、分類するのは誰なのかという文脈も必要になります。ただ、この記事で言いたかったことは「ちゃんとそこを明確に分けるのが誠実な技術選定ではないか」ということなので、分類者の主観で分けられていれば十分だとも思います。

型システムの例で言えば、人間が自分でやるよりも機械によって自動化されている方が効率が良いという一般論を暗黙の前提としてしまっていました。我々は機械よりも高い効率で脳内型チェックができる超人を雇ったということであれば、筆者の論理では対応できません。お手上げです。

Q. 積極的と消極的は0か100かで分類できるわけではないと自分で言っているのに、明確に分けて書けという主張は矛盾しているのでは?

A. そうでもないと思います。本文中で筆者がやって見せたように、最終的な意思決定が混合したものだったとしても、その内訳を分析して見せることができます。この記事のテーマは技術選定の誠実さなので、自身の意思決定の中身を分析することを重要なプロセスとして位置付けています。

Q. 学習コストがO(1)って、それ誰が保守するの?

A. 学習コストと運用コストを混同していませんか?

Q. 難しい技術は運用コストを増やすので、学習コストだけを考えるわけにはいかないのでは?

A. 筆者の考えでは、難しいが優れた技術は、使いこなせば長期的な運用コストを下げるものです(上の「積極性」の定義の話と繋がっています)。だから、難しいのに運用コストを下げてくれない技術は切り捨てていいです。

先ほどの主観の話と合わせると「我々にとってはこの技術は難しいので運用コストを下げてくれない(=これは積極的な切り捨てだ)」という意見が通りそうですが、本文中にもあるようにこの場合に「積極的」なのか「消極的」なのかの切り分けは丁寧に行う必要があります。

超人を雇った場合を除いて、解決すべき課題はそこに存在しています。機械がそれを解決するのか人間が解決するのかの違いです。難しい技術は運用コストを増やすという単純な話ではなく、「技術によって運用コストがどれくらい削減されるか」と「技術に頼らず人間が問題を解決した場合にどれくらい運用コストが削減されるのか」を比較するのが正しいあり方だと思います。

難しい技術を導入する必要がある場合、それだけ解決すべき課題も難しいということです。ですから、人間が頑張った場合はその難しい技術よりもさらに運用コストが高くなる可能性があります。

そこを丁寧に考察し、対象の技術を深く理解し、それが「積極的」な決定だと思うならそのことを十分論理的に説明するのが誠実なあり方だと思います。そうでなければ、不当に技術を下げていることになります。

Q. 人が次々に入れ替わる状況では学習コストはO(1)と言えないのでは?

A. 正直に言うと、そうです。そのような過酷な状況は想定していませんでした。この状況では教育という概念が意味を成していません。この記事の目的は誠実でない技術選定に苦言を呈することであり、筆者がこれまで見た技術選定は教育という概念が存在していそうな現場の話だったので、そこは想定していませんでした。