mather's diary

なんか書いてみる

学習コスト論

JVM上のJavaでない言語を使いたい、と主張したところ、こんな返答が返ってきた。

「学習コストが高く、メンテナンスできる開発者が少なくなるようでは困る。これまで使っているJavaでやってくれ。」

これに対して、賛成・反対の立場から意見を書いてみたいと思う。

賛成の意見

「みんなが共通で使っている言語を使うべき」というのは、開発を進める上で理想的であるように思える。
また、Javaなら様々なリソース(本、Web、人的ノウハウ)に頼れるため、開発が進めやすいだろうと予測できる。

僕の主張に関しても、まだ発展中の言語であってリファレンスもそれほど多くなく、Javaの扱う概念より抽象度が上がり人によっては学習すること自体に時間がかかってしまうという可能性が否めないため、導入は難しいと考えるのは妥当であると思える。

反対の意見

学習コストに関していうと、「支払うべき学習コストを払わなかったから、維持管理コスト、運用コストが長期的に絶えない」のだと僕は思っている。
同じJavaでもバグの少ないプログラムというのは当然あるわけで、そうなるための一人ひとりの能力向上はどんな会社でもどんなエキスパートでも常に必要になる。
そうでなければ結局間に合わせで作ったバグの発見しにくいコードを長い間改修するはめになり、「後から機能追加したら自作ライブラリにバグがあったので迂回するコードを書いた」「それぞれがコードを書いて、混ざるのが嫌だから全部別のクラスにした」なんていう自分勝手なコードが生まれることになるんだろう。

メンテナンスできる開発者について、指摘の通り当初は僕一人とか居ても高々数人だと思う。
でも、必要に迫られたらやるでしょう。かつて僕がそうしてきたように。
その際に学習コストが〜なんてことを考えてたのかは甚だ疑問です。

また、言語レベルでプログラムの考え方が抽象化されてるため、

  • コードの量が少なくなる
  • 下手な一時変数などでバグを埋め込む確率が減る
  • クラスや関数に関する考え方がより柔軟になる
  • 処理の並列化が容易

などの大きなメリットがあります。

「いつも使っている」という落とし穴

「探せばすぐに同じようなサンプルコードが見つかる」というのも、実は良くないことだと思うのです。そのままコピーしたり、変数だけちょこっと増やしたりするばかりで、コードを書いた本人も本質的な解決はできていないことに気づかないままかも知れません。

やり方を真似るというのは人間の学習の基本であり、一番わかり易い教育手段です。
しかし、それは特別な問題に関して対処方法を知るだけであり応用が利かないため、解決すべき問題を自分の頭で解釈し分解し具体的な解決に導くまでの道程は自分自身で作って行かなければなりません。
人手ではなく人材として求められるのは、そのような単調な学習で得られるものを超えた柔軟性や困難を乗り越える発想力や新しいサービスに漕ぎ出せるような発展性であり、「やっていれば皆いつかはできる」というものではないはずです。

サンプルコードの読み方として「写経」と称されるものがあります。
同じコードを自分で書いてみて、動かしてみるのです。
その際重要なのはただ丸写しして動いたことに感動するのではなく、「解決しようとしている問題は何か」「何故このコードは動くのか」などを読み解くことや、「自分が書くときの発想も同じコードになっていくのか」「他のやり方はあるのか」「部分的に変更する場合、何が要点なのか」を書きながら試すことだと思います。
写経のように、一字一句自分の中に染み込ませていくのです。

個人的すぎる趣向として

正直なところ、僕はJava言語が余り好きではないし、元々RubyとかCとかFORTRANとかから入ってきた人間なので、オブジェクト指向にもなりきれていないような言語は中途半端すぎると思います。

もちろん、言語として学ぶことは大きく、利用頻度も認知度も世界的に高いことは認めた上で、「JavaJavaだけに頼る開発者を潰していく言語」なんじゃないかと思ったりするんです。

また、新しい言語の抽象度の高さ故、その概念理解に苦労するかもわかりませんが、それこそが「プログラム」に関する考え方を揺さぶり新しい発想を生み出すことになるため、逆にJavaなどの言語でも活かせる理解が得られると思います。

あと、Haskellとか傍目には制限が強く特殊な言語と思われがちですが、やってみると問題解決のロジックが引き締まったり、無駄な処理がわかるようになってきて良いと思います。オススメです。

まとめ

  • やったことがない言語を学習することは、今使っている言語のスキルアップにも役立ちます。
  • デリバリを優先させて、その前に必要なはずの学習コストを払わないなら、その代償は負う事になると思います。ご承知ください。
  • Javaオブジェクト指向ではありません。