Open3

「Rustは学習コストが高い」の「学習コスト」

yukiyuki

いい記事だった。「Rustの学習コストが高い」「いうほど高くない」の双方の意見がネットに転がるようになるといいと思っているので、こういう記事はとても貴重だと思う。そして同時に記事の主張のロジックになるほど、と思ったので考えたことを書いていく。
https://zenn.dev/mabe/articles/936b788cd2b4d4

yukiyuki

学習コストが高いと論じてしまうと「学習コストって何」という話になってしまう。「学習」しなければならない」ことの多さゆえの「コスト」ということになるのだろうけど、これは少し曖昧な言葉だ。これは 1) 構成要素と 2) その言葉自体が何を目的として使われているかをそれぞれ考える必要があると考えている。

2から先に考えていくと、この言葉の指し示す先は「使いこなすまでの努力を要する期間」のことではないかと思う。「使いこなす」は、一旦1からプロジェクトを初めてCLIツールなどのまとまったソフトウェアを作りきれることと定義しておく。[1]

また、学習コストは必ずある。新しくプログラミング言語を学ぶ際には、入門書を読んだりそれを写経したり、あるいはアプリケーションを簡単に作ったりと、その言語を使いこなすまでの努力を要する期間が多かれ少なかれ発生する。一般にはそれを「コスト」と呼んでいるだろう。またその努力を要する期間が長いことを「学習コストが高い」と呼んでいるのではないだろうか。学習コストは各々のプログラミング言語にそれ相応に発生するから、「学習コストがまったくない」ということは難しい。

学習コストは一方で、大きい小さいがある。学習コストが大きいことは「使いこなすまでの努力を要する時間が長い」ことを示す。この使いこなすまでの期間の長短はプログラミング言語によって異なってくる。これにはいくつかの伸びる要因が考えられる。というわけで、次に1を考えていく。

「使いこなすまでの努力を要する時間」が伸びる要因は、a) 習得しなければならない新しい概念の量が多い、b) プログラミングスタイルが経験してきた言語と異なる、c) 覚えなければならないサードパーティライブラリが多い、d) 環境構築について、定型化された方法がないなどそれをするのに難しい要因がある、などだろうか。これらが「学習コスト」の正体なのではないか。

a についてはたとえば Java の古いバージョンの経験しかない初学者がいきなり Scala を学ぶと、ifが式であることやパターンマッチング、型クラス…など多くの要素が学ばなければならない対象になる。b も a に関連してしまい独立ではないかもしれないが、Python のような手続き型プログラミングしか経験のないユーザーがいきなり Prolog のような論理型のプログラミング言語を触ると、そもそも違った思考法を要求される関係で、Ruby などのように Python に似た書き味の言語を使う場合と比較すると使いこなすまでに時間がかかるだろう。c, d については、これは「使いこなす」に如実に影響するはずだ。

残りは何があるかを考えてみたい。

Rust の学習コストは、学習者の現状のシチュエーションによると思う。Rust は特に初学者のコンピュータやプログラミングに対する知識、使用言語経験によって、学習しなければならない概念の数が異なるプログラミング言語だと思う。だから初学者の経験値に応じて丁寧に「あなたはこれくらいの概念をこれから習得する必要があるはず」というのを示し、ケースバイケースでどのくらい時間を投資すれば習得できるのかを大雑把でもいいから示す必要があるのではないかと考えている。そうすれば学習コストが意外に高くないことを上手に示せるかもしれない。

脚注
  1. ちなみにこのあたりの感覚は人によって大きく異なると考えられるので、議論を始める前に明確に定義しておく必要がある。 ↩︎

yukiyuki

Rustにいたるまでの私のプログラミング言語遍歴は実は Java → Rust の流れだったので、最も「学習コストが高かった」部類に入るのではないかと考えている。Java は触りはじめから2年目くらいで Rust を初めて触った。加えて当時はあまりメモリなどコンピュータの基礎的な話については、理解しているようでしていなかったと思う。他に学習コストが高く付きそうなのは Python / Ruby → Rust のパターン(静的型付き言語ですらないので)かな?

複数言語触ったり、複数パラダイムを触った経験があると、それだけで徐々に Rust の学習コストは下がっていきそう。でも、ファクターはそれ以外にもありそう。