プログラミング技能の深さと広さとサーチビリティ

 プログラミングの世界にはいろんな技術があるのだけど、深さと広さのどちらを広げるほうがよいのだろう?

広さの需要が多い

 業務システム開発の世界というのは、お客さんが求める処理を行うためにはどうしたらよいかを提案し実装し運用する世界で、その多くは画期的なアイデアや難しいテクノロジーを必要としない。既存の技術を組み合わせて「やりたいこと」を実現できればそれでいい。簡単にできるなら、なおいい。

 これは、知識の広さを問われる世界。「こういうことしたいんだけど」「XX使ってはどうですかね」そういう引き出しをたくさん持って、状況に合わせて提示するという能力。お客さんは凄いテクノロジーかどうかではなくて「やりたいことができるようになったかどうか」が大事なんだ。

 そんなわけで、プログラムで飯を食っています、という人は意外なほど技能が浅いことがある。浅い技術でいいからそれを提示するという需要が世の中にはたくさんたくさんあるから、そういう供給をする人がたくさんたくさんいる。*1

深さの需要は少ない

 もちろん、浅い技能だけでは解決できない問題もある。だけど現代では深い技術が簡単に使えるような時代になりつつあるから、フレームワークを作れる人よりも使える人で事足りてしまう。既存のものが存在する限りは探し出して使えばいいじゃないかというわけ。

 イノベーションを起こすにも、2通りあって、誰も成功していない深い深い世界に到達するという縦方向と、誰も踏んでない未踏の大地を求めて、新しい組み合わせや逆転の発想といった横方向へのアイデアをひねり出す方法がある。「斬新な発想」ってのと「技術革新」ってのは方向性が違う。*2

理解の縦穴・横穴

 深い技術を簡単に使えるようにしようという動きはいつの時代でもあって、ニュートンが巨人の肩に乗ったからだと言ったように、僕らは先人の肩に乗って深い技術を比較的簡単に使えるようになった。それでもなんらの勉強もなしに使えるわけじゃないから相応に掘り下げなくてはいけない。

 この技術的に難しいこと、複雑なことを理解するための縦穴を掘るというのは大変。小学校から始まり大学の高等教育に至るまでの必死の努力でこの縦穴を掘っているわけだ。これに対し、横穴は掘りやすい。知識の幅を広げていく勉強はってのはわりと楽に行える。

 ほどほどの深さの縦穴から、横に横にと知識を掘っていった感じの技術者というのが世の中で求人需要の多い技術者だ。深い縦穴を持っていたとしても、オーバースペックで手に余るんだよねっていう会社が多い。博士号持ってる人材の行き場がないみたいな話もあるけど、深い知識を活用してビジネスに繋げることが難しいからこそ需給が折り合わないといったところか。

延々と広がる世界

 技術ジャンルは日を追うにつれて広がっていく。需要がなくなって廃れたジャンルというのもあるけども、廃れる技術ジャンルの数よりも生み出される技術ジャンルの数のほうが多いのだから、技術の大地は地平線が見えるほどに広大でとても100年に満たない時間では踏破できる気がしない。

 自分が掘れている深さより深い世界に生きたければ苦痛に耐えて勉強するより仕方ない辛さがあるが、広さに関してもまた情報を追い切れない辛さがある。情報爆発とはよく言ったものだけど、広さに関しては検索エンジンなどの機械のサポートが得られる所がうれしい。サーチビリティ(検索しやすさ)を確保できれば、広さに対する苦痛は克服できるんじゃないかという希望が持てる。

でプログラミングの話

 APIリファレンスはどんどん膨大になっていく。コアAPIに含まれる範囲を踏破したとしてもコアAPIがカバーしない範囲の技術を触りたければオープンソースプロダクトなりの世界に上陸しなければならない。いったいいくつの島が大陸があるのだろうと世界の広さに絶望を覚える瞬間だ。

 絶望的なまでの広さというのは暴力的で、「知っていれば簡単」というアプローチでは限界があると思うんだ。その最初のとっかかりのクラスがわからない、と初学者は言う。逆引き辞典のような本を買ってみたりもするだろうが、逆引き辞典に載ってない事例が多いというか、むしろヒット率が低くてやってられない、と早々に投げ捨ててしまう。これをどうにかできないものか。

 最初のとっかかりがつかめたならば、近年のIDEなら次の一手を推測してサポートしてくれる。静的解析のしやすい言語では特にこうした補助が強力だ。暴力的に広い世界で人間の脳みそというのは無力すぎる。横への広がりなら機械サポートを利用すればどうにか戦える。どうにかはなるが楽勝ではない。もう少し世界が進歩したら楽勝できるようになるだろうか。

*1:いわゆるSIerはこれを主要な飯の種にしている

*2:もちろん複合させることはできる