プログラマが勉強すること

今日もプログラマになる勉強する人のところで話をしてきました。


で、また適当にいろいろ書いてました。
http://www.slideshare.net/nowokay/20140228-31742219


今日は特に、この図の内容についてまとめておきます。

※ このエントリは、主に今日の話を聞いた人を対象としています。前提や補足については省略しています。

まずはプログラミング言語

プログラマというのは、利用者に直接サービスを提供することはできません。コンピュータの上でプログラムを動かして、そのプログラムを使ってもらうことでサービスを提供します。
※組み込みは前提から外しています。


そのプログラムも、コンピュータで動くものを直接記述することは現実的にできません。
なんらかのプログラミング言語で、プログラムを書くことになります。つまり、プログラマの仕事は直接的にはプログラミング言語をいじくる作業ということになります。
なので、プログラマはまずプログラミング言語が使えるようになるということが不可欠です。
プログラミング言語は道具ですが、この道具の使い方がわからないうちは、まずは道具が使えるように勉強・練習する必要があります。


ある程度プログラムが組めるようになったら、次のような本で、プログラムを組むというのがどういうことか勉強しておくといいと思います。
プログラミングの基礎 ((Computer Science Library))

利用者はユーザーインタフェースを経由する

コンピュータの上にプログラムを載せたとしても、ユーザーはそれを直接さわるわけではありません。なんらかのユーザーインタフェースを介して、ユーザーはコンピュータ上のプログラムを使います。
そこで、プログラムを利用してもらうためには、ユーザーインタフェースについて勉強しておく必要があります。
これは、UI/UXという話題になります。
デザイナと分業されている分野でもあるので、深く知る必要はあまりないですが、基本的なことは踏まえておく必要があります。

ユーザーの要求を汲み取って作るものを決める

そういったプログラムを作成するのですが、その前にユーザーが何を求めているかを知る必要があります。実際のユーザーや想像上のユーザーが何をするか観察したり聞き取りをしたりして要求を見出します。
この、要求の見出し方などの勉強も必要です。
SIerというのは、だいたいこのあたりの作業を行って、実際の作業を下請けに出したりします。

要求は直接プログラムに落とせないので作業に段階がある

要求を見出せたとしても、要求から直接プログラムに落とし込むことはできません。仕様を決めて、設計して、プログラムコードを書いて、テストをして、という手順に分解して作業をすすめます。
このそれぞれの作業について、さまざまな手法があります。少なくとも代表的な手法は勉強しておいたほうがいいでしょう。
また、これらの作業をどのように進めるか、というプロセスも大事です。
一番単純で基本になるのが、仕様を決めて、設計して、プログラムコードを書いて、テストをしたら完成のように、各手順を一回ずつ順番に行うのがウォーターフォールです。
ただ、プログラムというのはプログラムコードを書いて初めてわかることが多く、最初の仕様ですべてを決めておくことができません。そこで、最初に小さいウォーターフォールをまわして、その結果をもとに改めて仕様を決めて、と繰り返し作業を行いつつ作るものを大きくしていく、スパイラル形式のプロセスもあります。
また最近ではこれらの作業をフレキシブルに組み合わせたものもあります。

複数で開発するとコミュニケーションが必要

プログラムを作成する手順がわかったとしても、プログラムはひとりで作ることは少なく、また一人で作るとしても作業管理などが必要になります。
複数のプログラマが作ったソースコードを共有する必要もあります。
どんな作業をだれがいつ行うか、だれがどんなコードを書いたか、といった技術的な情報のコミュニケーションが必要になります。

こういう、どうやって作るかという話はソフトウェア工学

このように、どのような工程でどのように作業をしてプログラムを作るかという分野をソフトウェア工学といいます。
以前は「ソフトウェア工学 東京大学」でググるとよい資料が出てきてたのですが、いまはなくなっているようです。残念。
※ 2014/3/1追記 法政大学のほうに異動されたようです http://tamai-lab.ws.hosei.ac.jp/pub/sebook.pdf


この本のベースになったということですが、これも絶版のようですね・・・・
ソフトウェア工学の基礎


この本も絶版っぽいし。
ソフトウェア工学―理論と実践
まあ、目次は見れるので、「ソフトウェア工学」といったときにどのような話題が扱われているかは確認しておくといいでしょう。


プログラムが組めるようになると、最初のうちはこのような、どうやってプログラムを作るかということに興味が向きがちだし、必要なことでもあるので、まずはソフトウェア工学方面を勉強するといいと思います。
ただ、あくまでもプログラムの作り方で、どのようなプログラムを作るかという話ではないので、それはここから書くようなことを勉強する必要があります。

ハードウェア知識も必要

プログラムはコンピュータで動かす必要がある以上は、そのコンピュータのハードウェア特性についても知っておく必要があります。CPUがどのような仕組みになっているか、メモリはどのように使われているか、ハードディスクとSSDの違いなど、良いプログラムを組むにはハードウェアの特性は踏まえておく必要があります。
ただ、直接プログラムに影響があるということは少ないので、あとまわしでもいいです。
著者ふたりの名前から「パタヘネ」と呼ばれるこの本がよめればいいですが、分量も多くてなかなか難しいので、もう少し簡単な本でもいいと思います。
コンピュータの構成と設計 第4版 上 (Computer Organization and Design: The Hardware/Software Interface, Fourth Edition)
あ、あとamazonでの「訳が悪い」って評価は「オレは英語読めるんだぞー」って自慢してるだけなので、あまり参考にしなくていいです。


分量的には、この本がいいですね。
プロセッサを支える技術  ??果てしなくスピードを追求する世界 (WEB+DB PRESS plus)

データベースは重要

CPUやハードディスクは、実際にはOSにラップされているので、直接知らなくてもプログラムが組めます。先にOSというのがどのようなものかというのは勉強したほうがいいでしょう。
ただ、実際にプログラマが意識して触る機会が多いのは、データベースです。これもハードウェアをラップしたものだと言えます。
データベースに関しては勉強しておいたほうがいいです。
この本が、扱う範囲が広く内容もしっかりしていて分量もそこまで多くないので、一度目をとおしてみるといいと思います。
リレーショナルデータベース入門―データモデル・SQL・管理システム (Information&Computing)

ネットワークについては押さえる必要がある

いまのシステムは、一台のコンピュータで完結することはなくて、ネットワークを通じて複数のコンピュータがやりとりして構成されます。多くのシステムがWebシステムになっていて、ネットワークが重要になるので、ネットワークの特性は把握しておく必要があります。
このあたりの本に目をとおしておくといいと思います。
ネットワークはなぜつながるのか 第2版 知っておきたいTCP/IP、LAN、光ファイバの基礎知識

みんな大好きな数学も必要

さて、やはり理論も大事になります。みんな大好きな数学ですね。数学といっても、学校で習ったような微分積分のようなものは必要ありません。
主に離散数学という分野の数学が必要になります。
このあたりが、薄くて広く説明されているので、何が必要か把握するのにはよいです。
やさしく学べる離散数学

論理や統計はプログラマにならなくても大事

離散数学の中でも集合や論理が大事なのですが、とくに論理は、普通に生活する中でも大切です。いくつかの材料から、間違った結論をだして行動してしまうと、あまり得にならない結果になってしまいます。
「魚は泳ぐ、くじらは泳ぐ」という材料から「くじらは魚」という結論を出すのは誤りです。
また、「魚は泳ぐ、サバは泳ぐ」という材料から「サバは魚」という結論を出すように、推論が誤っているのに結論があってるということも多くて、これは実は結構タチが悪いです。同じ考え方でダメな結論を出しやすくなるので。
でも「魚は泳ぐ、サバは魚」という材料から「サバは泳ぐ」という結論を出すのは、よい推論です。
このような、よい推論と悪い推論のどこが違うか、といったことを勉強するのが論理学です。
オススメはこの本です。
論理学
けど、読むのが少し大変でもあるので、同じ著者のこちらの本でもいいと思います。
入門!論理学 (中公新書)


自分の考えが正しいか間違っているか、ということを検証するためには、統計も大事になります。
たとえば、赤い薬を飲んだ100人のうち80人が病気が治ったとします。そこから薬が赤いと病気によい、と結論を出すのは早計です。もし青い薬を飲んだ80人のうち65人の病気が治ったのであれば、薬が青いか赤いかは関係ないということになります。さらに、ここで青い薬のほうが、赤い薬よりもちょっとだけ治った割合が高いですが、この差に意味があるのか、という話も統計の範囲です。
このような読み物から始めるといいと思います。
統計学が最強の学問である


数字や理由付けにだまされない、自分でもだまさない、つまり間違った推論をもとに行動してしまわないために、論理と統計は大事で、これはプログラマにならなかったとしても有効です。

アルゴリズム重要

プログラムに直接かかわる理論として、アルゴリズムがあります。
先日、LINE Fukuokaの勉強会で、入社試験について「アルゴリズムがわかっていれば解ける問題です」という話がありました。逆にいえば、アルゴリズムがわからないと解けない問題です。*1
それなりの会社では、このような「アルゴリズムがわかっていれば解ける問題」が出題されます。
つまり、レベルが高くなってくると、アルゴリズムがわかることが大事になってくるということです。もう少しいうと「アルゴリズムがわかるというのはどういうことか」というのがわかるといい感じだと思います。


アルゴリズムの勉強に関しては、こちらにまとめています。
アルゴリズムの勉強のしかた - きしだのはてな


中でも一冊というと、数学ガールをおすすめします。
数学ガール/乱択アルゴリズム (数学ガールシリーズ 4)

いっぱい勉強することあっていっぱい時間がかかる

プログラマとして勉強が必要なことは、かなり広い分野に、かなり深くまでわたっています。このような勉強をすると、かなりの時間が必要になります。
そのような時間、モチベーションをひとりで保ち続けるのは、おそらく無理です。また、勉強をしていればわからないことがでてきます。どのような勉強をすればいいかの情報も必要です。勉強した成果を試したくもなります。


いま、Twitterを中心とした、分野横断、組織横断、地域横断の巨大な技術者コミュニティーができています。
Twitter上にプログラムの疑問点を書くことで、だれかが答えてくれます。
そのためには、技術者をたくさんフォローしておく必要があります。JavaとかAndroidとかRubyとか、自分が興味がある分野で検索して、出てきたひとを片っ端からフォローするといいと思います。
そのとき、自分がプログラムを勉強しているということがわかるようにしておけば、フォロー返しもしてもらいやすいです。
がんばって勉強する人には、みんなちょっかい出したがるので、わからないこととか悩んでることとかをTwitter上にあげていくといいです。
今現在の能力が低いとしても、昨日より今日、今日より明日と成長する人のことは、みんな大好きで、いろいろ教えてくれます。たぶん、「あいつはワシが育てた」と言いたいんだと思います。
また、Twitterを見ていると、いろいろな勉強会の情報が流れてきます。そういったところに参加して、一度顔をあわせておくと、質問もしやすくなるし、答えてもらいやすくなるし、「バーカ、バーカ」とかもいいやすくなります。


ただ、分野や組織や地域のローカルな話題はFacebookのほうにあるように思います。
福岡だと「福岡IT勉強会」というグループがあります。
https://www.facebook.com/groups/fukuokas/
勉強会が敷居が高ければ、ただ飲むだけの「水どう」もあります。
福岡の水曜飲み会コミュニティ「水どう」の代表になりました - きしだのはてな


こんな感じで、コミュニティに参加することで、情報やモチベーションや仲間や仕事がみつけやすくなります。
ここから、先日のエントリにつながります。
コミュニティに入るか入らないかでエンジニアとしての幸福度がかわる - きしだのはてな


ということで、またどっかでお会いしましょう。

*1:前述の論理の話でいえば、正確には逆ではありません。たまたま解ける可能性もあります