ある方から「どうすればコードが書けるようになるんですか?」という質問を受けました。
その場で自分の考えを伝えたものの、そもそもソフトウェアエンジニアでもない自分がそんな質問をされる立場になると思ってもいなかったので、人生どうなるか分からないものだなと思いました。
色々と思考を巡らせていると、ふとプログラミングを独習するには10年かかるという記事があったことを思い出しました。
自分のブックマークを見ると、
Teach Yourself Programming in Ten Years 日本語訳b.hatena.ne.jp
- [プログラミング]
- [読み物]
- [特選]
道は遠い。
2005/08/08 10:25
なんと10年どころか12年近くも前でした。当時どんな思いでこのコメントを書いたのかは分かりませんが、正直面白くないコメントです。
この記事をブックマークした当時は大学の研究室にいてCやらFORTRANやらを触ったりFreeBSDやRed Hat Linux 7や9を触ったりしていた頃で、まともにプログラミングを始めてから数ヶ月も経っていない頃で、ロクなスキルも持ち合わせていませんでした。
今も別に自慢できるような技術を持ち合わせているわけではありませんし、所詮は日曜プログラマの域を出ていませんが、当時に比べたら大分マシにはなったかと思います。
過去の自分を振り返ってみて、この元記事のアドバイス通りにちゃんとできたのだろうか、確認してみることにします。
プログラミングに興味を持ち、それを楽しみのためにやること
業務で明示的にコードを書けと言われたのは2009年に当時の会社の社内システムを作るときにPHPで開発したぐらいで、それ以外は業務中の補助のため、あるいは趣味のコードを書いていました。
- 2006-2007年: LinuxカーネルやOSSのコードを追いかけたような気がするけどコードを勉強してた記憶がない
- 2008-2009年: Rubyの入門書を読んで勉強し、Google Code Jam (以下GCJ)に参加した。参考 業務ではPHPのコードを書いてた。
- 2010年: GCJに再度参加する際にPythonを覚えた。参考
- 2011年: Clouderaに入ったので、Javaの勉強がてらいくらかのHadoopへのコントリビューションを行った 参考
- 2012年: Python温泉にいって道を踏み外した。仕事でシェルスクリプトやらPythonのコードを色々書いていたらしい 参考
- 2013年: Fabricやってたらしい。 参考 多分社内で構築自動化ツールとか作ってたような気がする
- 2014年: 何やってたか覚えてないけど多分社内でPythonのツール書いてた
- 2015年: bot遊びに夢中になってた 参考
- 2016年: 会社の製品を触るのがメインの仕事になったので、それらを触るために必要なツールをちまちまとPythonで書いてたように思う
- 2017年: Hololens買ってC# / Unity をかじったり(参考)、Scrapyを使ってWebスクレイピングとデータの可視化を行ったりしたり(参考)、Pythonでbotを開発したりしている
年によって波はあるものの、それなりに楽しんでコードを書いてたようです。
他のプログラマーと話をし、他人のプログラムを読むこと。
前職でも現在の職場でも、プログラマーと話す機会には恵まれていたように思います。
コードを読むことについても、この10年OSSの仕事しかしておらず、コード読むことが仕事の一部ですのでこれもクリアしています。
プログラムを書くこと。学習する最良の方法は、実践による学習だ。
先述の通り、プログラムはそれなりに書いていたように思います。業務経験に乏しく、大規模な開発プロセスの経験が不足している気はします。
もし望むなら、四年間大学で(あるいは大学院に行き、更に)学ぶこと。
CS専攻ではないのでやってません。
他のプログラマーの後についてプロジェクトに関わること。人が書いたプログラムの理解に取り組むのだ。
ある意味OSSの開発ではこれに近いことをやっていたと思います。bot の開発については原作者の後をついで開発しているのでこれに該当するでしょう。
少なくとも半ダースのプログラミング言語を学ぶこと。
自分が学んだと言えるのは、C/C++、FORTRAN、Java、Ruby、PHP、Python あたりですが、正直まともにスラスラと書けるのは Python ぐらいですね。Hello Worldでしたら30言語ぐらいで書きました(参考)
「コンピュータ・サイエンス」の中に、「コンピュータ」があるのを忘れてはいけない。
ハードウェアについての理解は今の仕事で最重要の分野なのでここは問題ないと思います。
言語標準化の作業に加わること。 / できるだけ早く、言語標準化の作業から離れる分別を持つこと。
そもそもこれ実現している人どれだけいるのか疑問です。
で、お前は何を教えたのか?
私が件の方に質問されたとき、下記のような回答をしました。
- 「入門書を読んで端から勉強する」というのをやめること。少なくとも私なら確実に飽きる。
- 興味のある対象についてのコードを書く。
- 興味のある対象というものが思いつかないのであれば、仕事や生活の中で、自動化できるものを探す。会社の業務の多くはルーチンワークであることが多く、よく探せば自動化できるポイントはたくさんある。こうしたものを少しづつ自動化していく。たとえば、あるエンジニアは、上から指示された作業を完全に自動化し、一日の作業を5分で終わらせておきつつ上司には今まで通り一日の終わりに作業完了報告をし、残りの時間をネットサーフィンに当てていたという。
- コードを書かなくても、「これはコードで書けそうか、自動化できそうか」について常に考える。考えるだけでも、設計のセンスを磨くことができる。
- 一度に大きなことをやらず、小さいものから実装すること。例えば「文字列を変換するだけ」「http getリクエストを投げて取得するだけ」など。こうした小さいコードを組み合わせれば、そのうちもっと大きなプログラムもさっと書けるようになる。
- コードの再利用方法について常に心がけること。ワンライナーや使い捨てのコードを書いているのであれば、それを再利用できるように書くにはどうすればいいかを考えること。
- 上記に関連するが、保守性の高いコードを書くよう心がけること。特にワンライナーなどは3ヶ月後の自分が読んでも全くわからない。3ヶ月後の自分にも理解できるようにするにはどうすればいいのか考えること。ドキュメントを書いてもいいし、インタフェースを工夫してもいい。
- ネットで話題になっているプログラムやシステムを、自分が得意な言語で再実装してみる。例えば「Rubyで◯◯した」といった記事が話題になっているのであれば、それをPythonで再実装してみる。完全移植でなくても、一部の機能だけでもいいし、品質を気にしなくてもいい。
上記のアドバイスをしたとき、プログラミングを独習するには10年かかるの記事の内容は全く忘れていたのですが、読み返してみると案外共通点も多いですね。やはり名文は確実に自分の血肉となっているようです。
まとめ
10年経っても勉強することはなくならないですが、10年勉強していると日曜プログラマでもそれなりのことができるようになる、というのは確かなようです。
一生研鑽を続けていきたいものですね。