勉強会で色々な話をしている中で、自分はどのようにプログラミングを学習してきたかという質問をもらったので、自分は今もちゃんと出来ているかという確認も含めて書いてみました。
少し長めです。時間の無い人は、最後のまとめだけでも良いです。
最初に自己紹介
私がプログラミングを始めたのは26年前の1990年です。当時はNEC-PC9801全盛時代です。OSはMS-DOSが主役で、Windows 95が登場する5年前。ネットと言えば、インターネットではなく、パソコン通信でした。ちなみに、当時の私は学生というよりももっと若く(というか、幼く)、小学校5年生です。
最初に思ったことは、ゲームが作りたいでした。しかし、未だにゲームは作ってなく、遊ぶ専門です。
現在の仕事でのプログラミングは、Objective-Cを使ったOS Xのソフト開発やiOSアプリ開発が中心です。趣味はSwiftでのプログラミングです。
最初のプログラミング言語
私が触った最初のプログラミング言語は、N-88 Basicです。行番号を付けて、プログラミングします。行番号順にプログラムは実行されて、行番号を指定して、ジャンプさせたりして、動きを与えていきます。
シンプルなこの言語で、プログラミングのいろはを覚えて、プログラミングに関する考え方やプログラミング的な思考というものを身につけたように思います。当時は、図書館でBasicのコードが載っている本を借りては、打ち込んで動かすということをしていました。当時はブラインドタッチも出来ないし、英語を知らないので、英語のことをプログラミング用の言葉だと思っていたくらいでした。分からないけど、まねてみて、動く度に感激していました。
特に思い出すのはポーカーを作ったとき(本に載っていたコードを打ち込んだだけだけど)。それまでは、テキストが中心で、コマンドラインインターフェイスのみのプログラムを書いていて、グラフィックを表示するということを全く考えなかったのが、グラフィックが表示出来た。それだけですごく感動しました。
また、音源ボードは別売りだったので、最初は買えず、ビープ音だけで遊んでいました。だから、音源ボードを買って、普通のBGMがゲームで再生出来たことにも感動していました。
C言語との出会い
C言語と出会ったのは、中学校2年、1993年でした。CodeWarriorという統合開発環境(現在は無いですね)のブロンズ版という廉価版が発売したことがきっかけでした。現在、Xcodeは無料になっているので、C言語を使うと思えば、無料で始めることができますが、当時は高価なコンパイラしか無かったなかで、CodeWarriorのブロンズ版のアカデミック版はとても安かった。それで初めて、C言語に触れて、ポインタで一回、挫折しました。それと、当時はMacのPerforma 520を使っていたのですが、Macのプログラミングに関する本が少なくて(たぶん、日本語で初心者向けは3冊くらい)、何をして良いのかが検討が付かなかった感じです。
それで、Pascalやってみたり、Perlやってみたり、うろうろしていました。
HyperCardとの出会い
当時のMacにはHyperCardというオーサリングソフトが入っていました。標準で入っているものはスタック(ハイパーカードで作ったソフト)の再生機能のみで、作成するにはプロ版を購入しないと行けないものでした。現在のFlashとFlash Playerの関係に似ています。ところが、この再生のみ版は、とあるコマンド(Magic)をすることで、その制限が外れます。雑誌にもみんな書いてあるし、HyperCardの解説書にも必ず書いてあるし、暗黙の了解だったのでしょう。
このHyperCardのおかげで、プログラミングというよりもソフトウェアを作るということの基本を覚えました。
HyperCardは1つ1つの画面をカードとして管理します。そして、このカードを行ったり来たりして、場面を変えることが出来ます。HyperTalkというスクリプト言語も入っていて、これで、カードの上に配置したものを制御することも出来ます。かなりのことが出来、HyperCardでプログラミングの楽しさに目覚めました。
とりあえず、当時は中学生だったので、学校の勉強で習ったことを、そのままスタックにしてみました。例えば、理科で元素記号や原子モデルを習えば、化合式を入力すると、原子量を計算したり、原子モデル(原子核の周りに電子が回っているやつ)を表示するものを作ったり、英文の穴埋め問題を作るスタックを作ったり、単語カードを作ったりしました。中学生だった自分にとって身近なものは、学校の勉強だったので、それをやらせるスタックを次々に作った感じです。
この経験を通して、ソフトを作れるというような、どこか分からない自信が付いたように思います。
英語の勉強
この頃には、プログラミング言語が英語であるということを知っていたので、英語の勉強を学校でやっているのとは別にやりました。通信教育の他に、海外のフリーウェアやシェアウェアをパソコン通信(当時はNifty-Serveや草の根BBS)でダウンロードしては、その説明書を自分で翻訳するということをしていました。
洋書とC++との出会い
高校生になって、アルバイトをするようになって、小遣いに余裕が出てくるようになって、秋葉原に遊びに行くようになりました。この頃は今とは違って、完全な電気街です。その中で、洋書に出会いました。
日本ではMacのプログラミングの本は少しずつ増えていましたが、まだ、少なく、洋書を読んで、勉強しました。また、プログラミングに関する雑誌も出ていて、毎月、秋葉原にいって、まとめ買いしていました。
そして、やっと、ポインタが理解出来たあたり、C++と出会いました。そして、クラスがよく分からない、インスタンスって何だ?みたいな感じで、C++でCを書いているという状態が長らく続きました。
そして、PowerPlantというフレームワークの存在に気が付きました。PowerPlantはアプリケーションフレームワークで、iOSアプリで言えばUIKit、OS Xアプリで言えば、AppKitに相当します。CodeWarriorに付属のC++で書かれたフレームワークで、ソースコードが付いていました。
そこで、このフレームワークのソースを見て、色々勉強しました。次に自分でやってみたことは、アプリケーションフレームワークを作ることです。
当時のMac OSは、システムとしてのAPI群はC言語で提供されているので、C++でそのラッパーを作っていくような感じで、フレームワークの構築をやろうとしてみました。今、iOSアプリでやるとすれば、C++でSwiftやObjective-Cをラップするようイメージですが、Swiftで書いた方が断然楽です。
そして、当時、やっていたことは、一つのフレームワークで書くと、それがWindowsでも、Macでも、同じコードで動くというフレームワークを作るということでした。この経験を通じて、システムの内部の動きがかなり分かるようになりました。
この頃から他のアプリの物まねを作っていました。公開はしなかったのですが、PhotoShopやColorItなどの画像編集アプリの体験版を操作して、使いたいと思った機能を自分で作ってみました。内部の動きやアルゴなどは分からないので、とにかく、自己流で見た目から思った事を作っていました。
そんなことを数年したのち、フリーウェアやシェアウェアを作るようになりました。このとき作ったアプリで現在も公開しているものもあります。今でもダウンロードされているので、メンテナンスしないとな〜と思いつつも、時間が取れないです。いずれ、Swiftで書き直ししようと思っています。ちなみに、このアプリ、最初のバージョンはC++とPowerPlantで書いていて、一度、C++とTCL(Think Class Library)に書き直して、その後、Objective-Cで書き直すということをしていますので、Swiftで書き直すのは3回目の書き直しになります。
このあたりから、印象深い本やとても参考になった本に出会いました。
- プログラミング言語 C++ 第3版 (現在はもっと新しい改訂版が出ています)
- Effective C++
- More Effective C++
- Modern C++ Design
- オブジェクト指向における再利用のためのデザインパターン
- ドラフト標準C++ライブラリ
- Mac OS X Cocoa プログラミング
Objective-Cとの出会い
社会人2年目。仕事でOS Xのアプリを作る事になり、初めて、Objective-Cに触れました。2003年のことです。最初は、気持ち悪いという気がしました。とにかく「[]」が多い(当たり前)。出来るだけC++で書こうとした覚えがあります。
Cocoaも出来る事が少なくて、色々な部分を作る必要がありました。ほとんどの部分はObjective-Cで書きましたが、パフォーマンスが必要な部分や、他のOSでも動くようにする必要がある部分などでC++やCを使いました。また、当時はObjective-CのAPIよりも、Cのインターフェイス(Carbon)の方が高機能で、そっちを使わなければ出来ないことが多かったという事情もあります。
この頃は趣味で、Zipアーカイバとか暗号化のプログラムとかを作っていました。当時、参考にしていた本は次のような本です。
- LHAとZIP 圧縮アルゴリズムxプログラミング入門
- 暗号技術大全
そしてSwift
Swiftは発表されてすぐ、ベータ版のときから触れました。Swift逆引きハンドブックを書くために、ずっと追っていました。勉強会でも、言われていましたが、プロトコルの使い方を見て、Swiftの考え方に感動しました。
Swift標準ライブラリのヘッダ(というかインターフェイス定義)を見て回るのが楽しいです。
最近は仕事で書くプログラムが中心で、趣味で書くプログラムの時間はなかなか取れないです。
それでも、上にも書いたフリーウェアをSwiftで書き直したいし、その中の内部専用フレームワークを、SwiftのライブラリとしてOSSで公開したいなと思っています。
まとめ
まとめると、次のような感じでプログラミングを学習しました。
- STEP 1 分からないけど写経
- STEP 2 身近で手作業でやっている単純なものをアプリ化
- STEP 3 アプリにはならないけど、特定の機能を行うコード断片を一杯書く
- STEP 4 人まね(他のアプリと同じ機能を内部を想像して作って見る)
- STEP 5 アプリ作って公開
- STEP 6 仕事 + 趣味でアプリ作る