プログラマになるための勉強をしている人の前で話をしてきた

イデアルITスクールというところで、1時間ほど話をしてきました。
プログラマとしてやっていくために大事なことというテーマ。
資料を作らずに、というか構想すら練らずにやってしまったので、ここで整理とまとめと補足を。実際にこれをしゃべったというのではなくて、だいたいこんなことをしゃべろうとしてたという内容をかなり盛って書いてます。



当然ですが、プログラマの仕事はプログラムを書くことです*1
プログラマとしてやっていくためには、どこで動くプログラムを書くか、なにをするプログラムを書くかということを意識することが大事です。



ということで、まずはプログラムが動くところがどう変わったかという話。
1970年代ころは、デバイスを動かすためのプログラムが多かったのではないかと。
あと、ここには書いてないけど、業務アプリはほぼメインフレームで動いてたと思います。
それが、1980年代くらいからパソコンが出てきて、プログラマが開発するものは全部ユーザーが使うパソコン上で動くものになっていきました。
2000年代には、それがWebサーバーでのプログラムになって、2010年になるとブラウザ上でのプログラムや、スマートフォンのアプリが多くなり始めてきました。
ブラウザ・スマートフォンという時代は今はじまったばかりなので、まだ定番の作り方は出ていません。そもそも、定番の動作環境も出ていないです。



それから、プログラマの仕事として作るものも変わってきています。
最初は機械を動かすものというのも多かったと思います。
それが、業務を動かすというのが多くなって、プログラマの仕事といえば、業務システムを作ることという時代が長く続きました。


ただ、業務システムというのは、会社の数で頭打ちになります。もうほとんどの会社は業務システムを導入していて、また今の日本の状況というのも新しい会社がどんどん増えるような状況ではないので、業務システムの新規導入というのは減っていってます。
また、小さい会社の場合には、業務パッケージというのがかなり使えるようになってきているので、1から作り起こすということも減ってきています。


2000年代からは、既存の会社がホームページを作ったりWebでもサービスを行うということが増えてきました。また、業務システムのWeb化というのも行われました。
しかしこれも、会社の数で頭打ちになります。もうそれなりの予算が使える会社はそれなりにWebでのサービスを立ち上げてきています。
また、WordPressのようなCMSや、EC CubeのようなECパッケージも成熟してきて、プログラマがそのサイト独自のプログラムを書かなくてもサービスが立ち上げれるようになっています。
先日は、GoogleKDDIによるサイト立ち上げサービスも発表され、もっと気軽にサイトを立ち上げれるようになっていくと思います。
グーグル、中小企業をITで支援する「みんなのビジネスオンライン」開始 -INTERNET Watch Watch


そこで、既存店舗がWebでもサービスを行うというものではなく、Webのみでサービスを行うというものが増えてきて、プログラマが仕事をする場としては、そこが主戦場になってきています。



さて、作るものが業務システムからサービスへと変わると、作り方も変わっていきます。
業務アプリは大きく確実に作ります。また、業務が決まれば、ある程度の仕様も決まり、その仕様による実装で大枠は業務を進めることができます。
そして、業務が大きければ仕様も巨大になり、多くの人が関わることになります。その中で、ほとんどの部分は実装に技術力は不要で、ただ数が多いというものになっているので、下請け業者に人を集めてもらって作業してもらうという形態になってきています。



もちろん業務システムの仕様を決めることも難しいのですが、それは規模によるところも大きく、難しいとはいえ ある程度は決定可能です。しかし、サービスの仕様というのは、決めることが不可能で、作って公開して使う人がわかって使い方がわからないと、どういう機能が必要かわからないという、本質的な難しさをもっています。
そのため、公開してユーザーに使ってもらってフィードバックを得て改良というサイクルを短く行うことが重要になってきます。このようなサイクルでは、仕様を決めて外部業者に発注して納品してもらってサービスに反映という流れでは、やってられません。
外注や下請けという形態よりも、内製になっていくと考えられます。


業務システムは、数少ない大規模システムに大量の技術者が集められて開発が行われていました。サービスは業務システムの開発に比べて人数は必要ありません。
たとえば、日本で業務システムを作ってる会社として、NTTデータという会社がありますが、グループ会社を含めると3万5千人の社員がいるようです。
一方で、世界中で多様なサービスを行っているGoogleの社員数は2万人です。単機能のサービスを行うTwitterでは、2011年3月時点での従業員は500人程度のようです。


業務システムは会社の数という限界がありましたが、サービスの数には、外部的な限界はなく、極端にいえば、開発者の数だけサービスがあってもよいのです。もちろん、市場的な限界はありますが。
大きな会社が数少ないシステムを構築するという時代から、小さな会社が数多くのサービスを運営するという時代にかわっていくと思います。



ところで、次のような記事がありました。
「技術」の時代は終わり「経営」の時代に変わる–AppleとGoogleの変貌の意味
これはサービスとデバイスの業界トップでの話ではあります。


ただ、このような流れは確実に業界全体にまわってきます。むしろ、小さなサービスで技術が不要でパッケージを使ってサービスが運用できているという状況がハイエンドまでやってきたということかもしれません。
ある程度技術力がないと実装不能だと思われていたものも、いまはパッケージやサービスとして手にはいるため少々特化した程度では売りになりません。



もちろん、業務システムであったような、プログラムが組めなくても作れる入力画面が大量に必要ということもなくなるので、プログラムが組めないのにプログラマとしてやっていくこともできなくなります。
また、いまはデバイスやサーバー形態などの過渡期なので、そこについていくために継続していろいろなものを勉強することが必要になります。
定番がないのは過渡期だからではなく、サービスの規模や形態が多様になるためで、もう今後、「このシステムならこの技術」という定番は生まれないのかもしれません。



ただ、その中で、ひとつ変わらない大事なことがあります。
プログラマにとって大事なことは「プログラムが組めること」です。
言語を含めて、ツールが使えることが大事というわけではないということです。ライブラリのありかや使い方などを知っていることは大事ではありません。
もちろん、少なくともひとつの言語がちゃんと使えることは大前提です。



プログラムの処理の流れは、どのようなものでもif(条件分岐)とfor(ループ)があればかけます。これはプログラム言語が変わっても、動かすデバイスが変わっても、かわりません。
このような、プログラムに普遍の知識が大事になります。



ではプログラムの勉強として何が必要かということを考えるとき、プログラムとは何かと考える必要があります。
論理・数学などの理論があって、それをハードウェアで動かして、人間に提示、その人間が評価する。そのための処理を記述するのがプログラム言語であり、それを行うのがプログラマです。
とすると、プログラムのための勉強というのは、論理・数学などの理論、それを動かすハードウェア、そして、それを使う人間についての勉強が必要になります。もちろん、それを記述するためのプログラム言語の勉強も必要です。



たとえばπを計算する必要があるとします。
これは理論の世界のもので、上の図はうろ覚えで書いたので符号も逆になっていますが、実際には次のような計算を無限に行うことで計算できます。
\frac{\pi}{4}=1-\frac{1}{3}+\frac{1}{5}-\frac{1}{7}+\cdots


ただ、理論の世界では、いとも簡単に「無限に計算を行う」といいます。しかし、実際には、現実にあるハードウェアで計算する必要があり、ここでは無限に計算するということはできません。ある程度限界を見極めて計算を打ち切る必要があります。


ここで大事なのは、何のためにπが必要かということです。
使う人がいて計算するわけなので、その人がなにを求めているかということが大事です。たとえば分子を扱うような計算をするなら、高い精度が必要になるかもしれませんが、それなりの建築であれば22/7くらいで大丈夫かもしれないし(ピラミッドの建設では22/7が使われたらしい)、誕生日ケーキを仲良くわけるという話であれば、3でも大丈夫かもしれない。


このように、理論・ハードウェア・人について、勉強しておく必要があります。
あと、今回の話には出さなかったのですが、プログラムを組むのも人であって、どのようにすればうまくプログラムが組めるかというのも考える必要があります。



で、勉強するなら本を読む必要があるのですが、何か勉強するときに、本は3冊よむ必要がると思ったほうがいいと思います。1冊ですべての需要を満たすということはありえません。
まず読む必要があるのは、入門書です。「はじめての〜」みたいな本。ただこのとき、なるべく広い範囲を扱っているものを選ぶほうがいいです。
あと、「ここに書いてあることが今時点では一番正しい」というような専門書が必要です。通読しなくても、いざ必要になったときに調べるために手元にあるほうがよいです。いろんな情報がネットで手に入るようになっていますが、こういう専門的に正しい情報というのは、なかなかネットでは手に入りません。
ただ、そういう専門書はなかなか独力で読むことはできないので、そういう専門書の解説書的な本も読んでおきたいです。



理論の分野では、アルゴリズムを勉強しましょう。
アルゴリズムの入門書は「アルゴリズムとデータ構造」とついた本がたくさん出ているので、そういう本を読めばいいと思います。
たとえば、Javaでプログラムが組めるなら、Java データ構造とアルゴリズム基礎講座が読みやすいです。


そして、アルゴリズムの専門書として挙げれるのはアルゴリズムの設計と解析手法 (アルゴリズムイントロダクション)です。3分冊で、2巻以外は絶版になっていますが、2巻が重要です。
網羅してある専門書としてはアルゴリズムデザインです。この本は人を殺せる分厚さのある本なので、読むとき気合がいります。広範囲に詳しく書いてあるので、こちらのほうがいいかもしれません。


ただ、やはりアルゴリズムイントロダクションアルゴリズムデザインは読むのが大変なので、その足がかりとしてはアルゴリズムクイックリファレンスがいいと思います。いろいろ網羅していて、アルゴリズムの入門が終わって次の勉強としてはいいと思います。説明が簡潔なので、より詳しい解説が必要になった場合はアルゴリズムイントロダクションアルゴリズムデザインを読む必要があります。




ハードウェアの勉強は、こうなっているということがわかればいいので、あまり入門書や専門書をわける必要はないと思います。
プログラムを組む点で必要なハードウェアの話としては、CPUとネットワークがあげられます。


どのようなプログラムも、CPUの限界以上の動きはできず、またCPUをうまく使う必要があるため、やはりCPUの基本的な仕組みを知っておく必要があります。
CPUの本としては、プロセッサを支える技術  ??果てしなくスピードを追求する世界 (WEB+DB PRESS plus)がいいと思います。Core i7のことまで書いてあるし、なにより絶版しにくそうなのがいいです。


また、いまのコンピューティングではネットワークは不可欠です。たとえばブラウザで検索するときに、どのような信号がどのように変換されてアマゾンさんまでたどりついて帰ってくるか、イメージをつかめる必要があります。
ネットワークの本としては、ネットワークはなぜつながるのか 第2版 知っておきたいTCP/IP、LAN、光ファイバの基礎知識があります。


あと、人についてですが、時間が切れたのではしょりました。
個人的には哲学の勉強がいいなーと思ってるのですが、入門書として哲学の謎 (講談社現代新書)がいいなと思ってます。




で、ここですでに時間切れになったのですが、プログラマとしてやっていくために非常に大切なことを忘れてたので、ここまで言って終わりです。
Twitterをやれ」ということです。


いま、Twitterでは、巨大な技術者コミュニティができあがっています。それも、質が高い人ほど集まっているような状況です。
そこで、Twitterでアカウントを作って、「Java」なり「Ruby」なりで検索して、片っ端から100人くらいフォローしていくとよいです。
そうすると、かなりの人はフォローを返してくれると思うし、プログラムで悩みごとがあれば、だれかおせっかいな人が教えてくれます。


あと、大事なこととして、Twitterには「何してる」「どこにいる」ではなくて「何を思ったか」をつぶやくべきです。
「何してる」「どこにいる」には、プライバシの情報が含まれるので、慎重にしたほうがいいです。Twitterを見ている人が知りたいのも、あなたが何をしているかではなくて、何を思っているか、です。「何を思ったか」というのは、それ自体では犯罪にもならないし、自由です。


ただし「kis」という人をフォローすると、朝おきたら埋まってるので、あまりオススメしません。
ということで、以上です。


紹介した本まとめ。

Java データ構造とアルゴリズム基礎講座

Java データ構造とアルゴリズム基礎講座

アルゴリズムの設計と解析手法 (アルゴリズムイントロダクション)

アルゴリズムの設計と解析手法 (アルゴリズムイントロダクション)

  • 作者: T.コルメン,R.リベスト,C.シュタイン,C.ライザーソン,Thomas H. Cormen,Clifford Stein,Ronald L. Rivest,Charles E. Leiserson,浅野哲夫,岩野和生,梅尾博司,山下雅史,和田幸一
  • 出版社/メーカー: 近代科学社
  • 発売日: 2007/03/01
  • メディア: 単行本
  • 購入: 10人 クリック: 169回
  • この商品を含むブログ (48件) を見る

アルゴリズムデザイン

アルゴリズムデザイン

アルゴリズムクイックリファレンス

アルゴリズムクイックリファレンス

プロセッサを支える技術  ??果てしなくスピードを追求する世界 (WEB+DB PRESS plus)

プロセッサを支える技術  ??果てしなくスピードを追求する世界 (WEB+DB PRESS plus)

ネットワークはなぜつながるのか 第2版 知っておきたいTCP/IP、LAN、光ファイバの基礎知識

ネットワークはなぜつながるのか 第2版 知っておきたいTCP/IP、LAN、光ファイバの基礎知識

哲学の謎 (講談社現代新書)

哲学の謎 (講談社現代新書)

*1:プログラマだけどエクセルばかりでプログラム書いてない」禁止