2015年9月9日水曜日

良いプログラマになるための5つのコツ

先日「プログラマの履歴書」という記事で「コンピューターを使って世の中をほんの少し便利にすようとする」ことが良いプログラマになるきっかけと書きました。先日「どうしたらプログラミングができるようなるか」という質問を受けたので、参考になればと思いもう少し掘り下げてみることにします。

1. 「どの言語を学べば良いか」という問いから離れる

ノーベル賞はこうして決まる」という本には、セレンディピティ(serendipity: 偶然から生まれる偉大なる発見)という言葉が頻繁に登場します。ノーベル賞は狙って取るものではなく、科学への貢献に邁進するなかで生まれてくるものだと。

その一方、「Serendipity favors the prepared mind (偉大な発見は、準備ができている頭脳を好む)」とも言われます。プログラミングを始めるにあたってどんな言語を学べば良いかという問いに対しては「何が将来役に立つかはわからない」というのが正直な答えで、何も学ばなければ偶然による成果も生まれません。今は亡きスティーブジョブスがたまたまCalligraphyのコースを大学時代にとっていたおかげで、現在のMac OSの美しいフォントの誕生につながったという例もあります。

したがって「どの言語を学べば良いか」という問いは本来「どの言語が効率的に◯◯を実現できるか」という形であるべきで、この◯◯に当たるプログラミングでできることを知る為には、プログラミングを学ばなくてはいけない、という鶏と卵の関係にあります。問題に適したコードを書くには、それまで慣れ親しんだ言語を元に考えることになるので「準備」が必須です。

将来どんなことがプログラミングで実現できるかを予想するのは難しく、学び始めたばかりのころは動機付けが十分ではありません。そのためプログラミングを勉強するというのはあまり楽しい作業ではないはずです。一度1つのプログラミング言語を学んでからは比較対象ができるので他の言語を学ぶのは容易になってきます。Scala, Python, Rubyなど比較的新しい言語は、昔の言語の悪い面を改善しているので使いやすいのですが、C++を学ぶと、なぜこれらの新しい言語がよくできているのかより一層わかってくるという具合です。

2.「プログラミングをする環境に身を置く」

プログラミングを学ぶには、コンピューターサイエンスのカリキュラムを持つ大学に行くのが確実です。例えば、東大理学部情報科学科のパンフレットではどのようなことを学ぶかが詳しく紹介されています。それ以外の専攻や、大学を既に卒業された方でも、MITのオンラインで学べるcousewareCouseraなどを利用する、オライリーの本を読む、GitHubで他人の書いたコードを読むなど学ぶ資料には事欠かないはずです。一人で学ぶことももちろんできますが、動機付けや新しい知識を仕入れる面で効率が悪いので、一緒に学んでいる仲間がいる環境に飛び込むことが大切です。たとえば、Emacs, vimなどのエディタのどれが良いか、効率的な使い方などを周りの様子から知ることができます。大学で皆が集まって学ぶ意義はまさにそういった環境をつくる点にありますし、いろいろな知識を持った人と触れることでセレンディピティにつながる確率が上がります。会社がそのような環境であると幸せですね。

3. 「プログラミング以外の世界に触れる」

コンピューターサイエンスの知識を持った人が必ずしも世の中を便利にする製品を作れるとは限りません。今では、コンピューターを効率的に使うための研究をするコンピューターのためのサイエンスの世界は少し狭くなってきたと言えます。一方、ゲノムサイエンスのように、コンピューターを活用できる、あるいは活用しないと対応できないような世界はますます広がっています。「プログラミングの知識」かつ「他分野の知識を持ち、コンピューターで解決できそうな問題に気付く」この組み合わせを持った人が、今までコンピューターサイエンティストが想像もできなかったようなアプローチで世の中にインパクトを与えることができます。また、その過程でプログラミングがしやすくなるようなツールも生まれてきたりします。

4. 「人と協力する術を身につける」

プログラミングに習熟してくると、いろいろな機能を自分一人の力で実装できるようになりますが、やはり自分ひとりの力でできることには物理的な限度があります。10個のプログラミング言語でコードが書けても、同時に作業できる問題は1つか2つ。一人で知識を溜め込んでも、作れるプロダクトの種類はそう多くはありません。能力をスケールさせるためには、アイデアを他の人と共有する、文章を書いて他の人が時間を置いて理解できるようにすることが大切です。大学の論文などでは、数年、数十年後に論文の内容を理解した人が素晴らしいアプリケーションを見つけてくれるかもしれない、という気の長いものもあります。アイデアの共有には時間がかかることを覚悟します。コミュニケーションでの礼儀正しさも要求されるでしょう。オープンソース開発を支援するGitHubは他の人と共同してコーデイングするための環境を築いたという意味で、非常に大きな貢献をしています。また、英語を使わないというだけでも協力者の範囲を狭めプロジェクトの生存期間を短くします。

5. 「良く寝ること」

プログラミングの作業はどうしても目、肩、腰、脳など体に負担がかかるものです。デバッグ作業など原因の究明に試行錯誤と集中力が要求されるものもあります。毎日8時間以上コードを書き続けるというのは至難の技で、持続可能ではないでしょう。睡眠が必要なのは健康という意味だけではありません。プログラミングではパズルを解く感覚も必要になってきます。ワーキングメモリにいかにたくさんの情報があるかで、複雑に絡み合ったコンポーネント間のつながりを意識したコードを自然に書けるかどうかが決まってきます。音楽を演奏する人でも、たくさん練習をするより、楽譜を読んで寝てしまったほうが、次の日に自然に演奏できるようになるそうです。これは寝ることで記憶が再構築された状態で定着し、脳からの指令がスムーズに指に伝わるようになるという原理です。(参考:TED: The benefits of good night sleep)   睡眠もプログラミングには欠かせない要素の1つです。








0 件のコメント:

License

Creative Commons LicenseLeo's Chronicle by Taro L. Saito is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 2.1 Japan License.