プログラミングを学ぶ方法は、人それぞれだ。本を写経する人もいれば、Open-Source Software (OSS) のコードをひたすら読む人もいる。ペアプログラミングで学ぶ人もいれば、動画学習が最適な人もいる。
そうしてインプットを経た後、さて、何をアウトプットしようか、という段階になる。ここで、「何を作ったら良いかわからない」と言う人がいる。よくある理由の一つが 「その技術で何ができるかイメージできていない」 状態だろう。
JavaScript を学べばブラウザゲームや Web サイトを作ることまでは流石にイメージできるだろう。ただ、JavaScript の文法を学ぶだけでは、実際に作れない。アニメーションを実現するためにはどの API を使えば良いか、画像をレンダリングするためにはどの API を使えば良いか、音を鳴らすためにはどの API を使えば良いか。単純に知識が足りていない場合だ。
では知識を得れば良いのかというと、実はそうではない場合も多い。「何かを作りたい」ではなく、「その技術を学ぶ」と言う動機で学習している場合に、この罠に陥りがちになる。とりあえず本に出てきた章を読んでフレームワークの使い方を学んだとしても、それが実際のアプリケーションでどう使われているかに紐づかない。
技術を実社会にデプロイできる力を養うためには、現実で動いているプログラムを読むしかない。会社のコードでも良い。無い場合は OSS。誰が書いたかは関係ない。スタープログラマでも素人プログラマでも良い。何行でも良い。どのプログラミング言語でも良い。古くても良い。少なくとも書籍や動画コンテンツではない、現実のソースコードを読む。現実にある、誰かのなんらかの課題を解決している、もしくは解決しようとしている、「生きている」ソースコード。
現実社会で動いている「生きたソフトウェア」というのは、誰かが行った「アウトプット」の結果である。世界の誰かが、なんらかの課題解決意識とモチベーションを動員して世の中に生み出した「アウトプット」である。自分も同様のアウトプットを出したいなら、他人がどういう動機で、どういう課題を解決したかったのか、そこを理解しないといけない。技術を学ぶというのは、あくまで「アウトプット」の半分の側面でしか無い。
逆にいうと「何かを作りたい」「何かを解決したい」という動機がある場合には、技術を学ぶだけで良い。アウトプットするものを考えるところで手が止まることはない。優秀なメンターや教材、成長の道筋さえ準備すれば、アウトプットを世の中に出すまでは最短距離を進める。
プログラミングという技術がコモディティ化しつつあるこの現代において、アウトプットを出し続けることで差別化していくためには、「地頭が良くて学習速度が速い」だけでは不十分なのである。技術を通して何かを解決したいという気持ちが強くないと、アウトプットを継続的に出し続けることはできない。
誰かが作ったプログラムをただ写経するだけでは、それはあなたの「アウトプット」ではない。そのプログラムが解決しようとしている課題はあなたの課題ではないし、あなたのモチベーションではない。だから、どれだけ TO-DO 管理アプリを作っても、あなたは自分のアウトプットに納得がいかないのである。
逆に、自分のモチベーションに駆動された開発であるなら、結果として出来上がったアウトプットが世の中の誰かのものと酷似していたとしても、(事前のリサーチ不足という側面は置いておいても)あなたの立派なアウトプット である。そこで得た経験と知識は、「車輪の再発明」かもしれなくても、きっとあなたの強みになっているはずだ。
だから、ソフトウェアエンジニアはなるべく外に出て、技術者以外の人とも交流をし、社会課題に興味を持ち続けてほしい。もちろん、その興味の対象が技術領域に閉じているのは全く構わない。そのような人々が、プログラミング言語やフレームワークを開発し磨き込んでくれているおかげで、世の中の開発者のためになっている。そうでない人はぜひ、自分の興味や課題意識を、技術を通じて、解決してほしい。