#0. 自分の背景
BASIC 習得から数えて今年 35 年目の化石(じじい?)プログラマです。
物理学の修士を取ってから、全く関係ないコンピュータ業界に就職しました。
プログラムばっかり組んでいたので、会社では出世しませんでした(笑)。
2年前からフリーランスで仕事を請け負っています。
今の自分から見て、もし新人の自分に声をかけるとしたらどうするか、と言う視点で書いてみました。
目次 |
---|
1.基礎はしっかり勉強しよう |
2.コードの粒度とコメントの残し方 |
3.他の人のプログラムを読んで勉強しよう |
4.質の良い書籍をたくさん読もう |
5.ともかくどんどん作ってみよう |
#1.基礎はしっかり勉強しよう
基本中の基本ですが... 言語仕様はしっかり押さえた方がよいです。
この段階では入門書で勉強し、概要をつかむのはありだと思います。
###データ構造、基本アルゴリズムを理解しよう
その上で、データ構造(リスト、ツリー、ハッシュ、...)+アルゴリズム(ソート、サーチ、...)と言った基本的なデータの取り扱い方について、アルゴリズムの理解を図った方が役に立ちます。
最近のモダン言語はライブラリあるいは言語仕様としてこれらの構造を持っていますが、原理を理解するとどのような応用が可能で欠点が何か見極められるようになります。
###大学での数学をしっかり復習しよう
画像処理・音声処理、3Dや機械学習と言った分野では線形代数や差分方程式を通した微積の知識がないとライブラリを使うだけになってしまいます。仕事の80%はライブラリで対処できますが、クリエーティブな仕事請け負えるようにするためにも数学はしっかりと復習しておいた方が良いと思います。
###ステートマシンの知識は必須
特にイベントドリブンなプログラム構造を持つシステムの場合、肝はステートマシン管理だったりします。
ハードウェア屋さんは基本的にはムーアマシンをステートを管理しながら回すのが設計の基本なのでここら辺は徹底的に叩き込まれるようですが、最近はソフトウェアでもイベントドリブンな扱いが増えている気がします。
この場合、「想定していないステート」「未定義のステート」に落ちないようにすることが重要です。
###バックエンドで食べていくならSQLの知識は必須
SQLは非常に古い言語ですが、バックエンドは DB を使うことがほぼ確実なため、SQL の知識は必須です。
SQL は非常に複雑なクエリも書けますが、プログラマ側で線形探索に落ちないよう注意する必要があるちょっとやっかいな言語ですので、インデックスの張り方や正規化に注意する必要があります。
#2.コードの粒度と残し方
どんな言語でも基本的には関数、プロシージャ等が画面に収まるように書くのがよいと思います。
スクロールしないと全貌が見えないプログラムを書くと、3か月くらい後で見返したときに何をしようとしていたプログラムなのか見極めるのに苦労するになります。
そのためには、最初からリファクタリングしやすいプログラムを書くことです。
私は勝手に「ブロックコーディング」と呼んでいますが、関数やプロシージャの実装に必要な機能をコメントで先に書いておき、後でコメントに相当する機能を別の関数やプロシージャにしておくとコード再利用や読みやすさの点で利点があります。
コメントはうるさく書くと、書くのも読むのも疲れてしまいますが、関数やプロシージャの先頭にまとめて書いておくのが労力と見やすさを考えた場合の妥協点ではないかと思います。そういう意味では doxygen 風のコメント記述はバランスが優れていると思います。
##3.他の人のプログラムを読んで勉強しよう
良質なプログラムを読むことは大変勉強になります。Linux 使いの C 畑の方は是非 Kernel のソースコードに挑戦してほしいと思います。システムを動かす上でのテクニックやプロセス・スレッドディパッチの詳細を勉強することができます。
この他にも(やや長いが)ファイルシステムのコードも勉強になります。ファイルシステムの場合は inode に関する知識を先に習得しておいた方が読みやすいと思います。
##4.質の良い書籍をたくさん読もう
独特のクセがあることも多いのですが、その言語系を設計した人の書籍は設計思想が分かってためになります。
特に Ruby 作者のまつもとゆきひろ氏の一連の著作は一読をお勧めします。
インターネットで勉強しても良いのですが、どうしても断片的な知識になりがちで耳学問的になりがちなのが難点です。
もちろんいい所は合って、「あの機能を実現するにはどの関数、プロシージャを使うんだっけ??」と言う場合にはインターネットが威力を発揮します。
しかし、システムをくみ上げようとした場合、体系的に解説されている成書の方が結局は早道である場合が多いように思います。
興隆しているコンピュータ言語はどうしても英語圏の香りが漂っているからなのか、基礎から記述している言語の解説書の良書は英語のものが多い印象です。今から活躍される若い人は英語でコミュニケーションをとることが頻出すると思われますので、挑戦してみては如何でしょうか。私が気に入っているのは O'Reilly の Head First シリーズです。やや厚い本ですが、かなり実力が付くと思います。l
##5.ともかくどんどん作ってみよう
プログラミングは技能なので、たくさん作ると上達する傾向を持っています。
「このシステムはここが不便だ」「こういう機能があったら便利なのに」という一種の「違和感」を大事にしてほしいと思います。もしシステムでそれが解決できるなら、手を挙げて自分で作ってしまおうという姿勢が大事だと思います。
アウトプットを意識すると、どのようなインプット(知識)が必要なのかも見えてきます。
皆様のご健闘を祈ります。