プログラム初心者がiPhone SDKに向かい合うための心得

iPhone SDKをいじりはじめて早1ヶ月。ようやくiPhoneSDKに慣れてきた。カバーフローっぽいアプリも自作できるところまできた。後は、ライブラリをどこまで熟知できるかと、アイデアの勝負。
今まで、AjaxRuby on RailsFlashJava(i-appli)、GTK、Xと言った環境でアプリを開発してきた。その上で、プログラムの勉強をするのに一番いいと思っていた開発環境はi-appliだった。i-appli開発環境はJavaという良質なオブジェクト指向言語*1で開発でき、携帯電話が備えるカメラなどの機能を簡単に使うこともできる。また、なんと言っても、勝手サイトに自作のアプリを置き、実際に携帯電話上で動くアプリを動かすことができる。これは、アプリ作成者にとっては最高の開発環境だと思う。また、UMLを使っていく必要がある人にとってもJavaを知っておくことは大事なことだ。UML記載方法がJavaと類似しているので、Javaを知っていれば理解が容易だ。Javaを知らずにUMLを勉強しようとがんばっている人を知っているが、かなり苦労している。
一方、iPhone SDKは、i-appli開発環境と比べると、実機上で動かすには、Appleと契約したりなどする必要があり、ハードルが高い。アプリ開発者が儲けることができる仕組みが入っているからそうなっているのだが、i-appliと比べると自由度が高い開発環境とは思えない。しかし、iPhone SDKには、憎らしいまでにフレームワーク化されたライブラリ群を持っている。この良質なフレームワークに触れることは、今後、プログラミングを極めたい人には見逃せない開発環境だと思う。ただ、プログラム初心者にとっては、iPhone SDKは少しハードルが高い開発環境だと思う。
さて、それでは、プログラム初心者はどのようにiPhone SDKに向き合えばいいかよいか。

豊富なドキュメントとサンプルコード

iPhone SDKの売りの一つは豊富なドキュメントとサンプルコード。ドキュメントは英語だけでなく、日本語のドキュメントもある。
プログラム初心者にとっては、このドキュメントは少し敷居が高い。ドキュメントはアーキテクチャ含めて、説明しようとしているから、下手するとドキュメントが伝えたいことが何のことかわからないかもしれない。
ということなので、プログラム初心者は本から入るのがよいかもしれない。お勧めは以下の2冊。

この本は結構丁寧に書かれている。もちろん、全てが網羅されているわけではないので、この本に一通り目を通してから、何か自分でアプリを作っていくのがiPhone SDKを理解するための一番の近道。

iPhone デベロッパーズ クックブック

iPhone デベロッパーズ クックブック

この本は、リファレンスコードの集まりのようなもの。1冊目の本を読んで、iPhoneSDKにある程度触れてから読むことを薦める。本を買わなくても著者であるerica sadunさんのブログ(英語)を見れば、無料でその内容を手に入れることができる。プログラム初心者でない人はこの本から入ってもいいかもしれない。私は1冊目より先にこちらを読んで、iPhoneプログラミングを理解した。

Objective-C

Objective-Cなる不可解な言語を理解するのがはじめの一歩。C言語Java言語が主流である中では、Objective-Cはマニアックな言語。また、Objective-Cを理解するためには、C言語Objective-Cな部分を学ばないといけない。
プログラム初心者がObjective-Cを理解するのは、結構、敷居が高い気がする。Javaを知らない人はまずはJavaを学んでおきたいところ。i-appli環境で何か一つアプリを作ってからObjective-Cに触れると理解度は増すと思う。
Objective-Cオブジェクト指向言語の元祖Smalltalkの文法を参考にしており、20年弱前くらいはC++Objective-Cかという議論もあったそうだから、オブジェクト指向言語としてもそれなりの歴史があるものらしい。ただ、慣れてしまえば、Objective-Cは使っていてなかなか心地いい言語にも言える。私が持つiPhoneアプリ開発のイメージは、C言語は添え物で、Objective-Cで実装されたiPhoneライブラリを重ねていくような感じ。

憎らしいまでに洗練されたフレームワーク

iPhone SDKが提供する協力なフレームワークCocoa Touch。Cocoaアーキテクチャを理解せずとも、iPhoneのアプリは作れるようになっている。これは、Cocoaがしつこいまでのデザインパターン*2に基づくアーキテクチャで実現されていることに起因する。
プログラム初心者は少なくとも次の2つのデザインパターンを勉強しておく必要がある。この2つはどのフレームワークでも使われている基本のデザインパターンだ。できれば、i-appliなどで一度実装しておきたい。

  • MVCパターン
  • Observerパターン

iPhoneフレームワークデザインパターンを多用したアーキテクチャになっている。上記の2つどころではない。そして、嫌味なくらいに柔軟だ。Macを使って、一番驚いたのは、ファイルの管理方法。Finderで表示しているファイル一覧の一項目を違うFinderから削除すると、表示している全てのFinderから該当ファイルが消滅する。WindowsだとExplorerで最新の情報に更新を選択しないとファイル一覧は更新されない。Finderの表示方法をCoverFlowにしていると、ファイルが消されたときは、視覚効果を伴いながらファイルが消滅する。これは、レガシーなMVCパターンやObserverパターンを利用することによって実現できる。これは一例だが、嫌味なまでにアーキテクチャが柔軟だ。

Cocoaが提供するライブラリを使えば、アプリを作る側はアプリのアーキに関しては何も考えなくてもいい。ここまで洗練されたフレームワークを提供されたら、プログラマアプリ開発に徹するしかない。このことはiPhoneが良質なアプリを産み出せる大きな要因になっているのだと思う。とは言うものの、アプリのアーキテクチャがどうあるべきか考えたいプログラマにとってはあまり楽しくない状況だ。Cocoaに頼り切ってしまうと、アーキテクチャ設計能力が育たない。

高速化に徹した描画アーキテクチャ

iPhone SDKで特筆すべきは描画アークテクチャ。iPhoneではCore Animationと呼ばれる。正確にはiPhoneというよりMacの描画アーキテクチャ

プログラム初心者にとっては、アニメーション効果を自作しなくても、簡単に実現できるのが嬉しいところ。Ajaxライブラリで言えば、tween.jsやscriptaculousjQueryなどに相当する。プログラム初心者は、一度、自分でアニメーション効果を自作し、この機能のありがたさを感じるのがいいだろう。

Core Animationは、組み込み機器としては、恐ろしいまでにメモリをふんだんに使う。すべてのUI部品はフレームと呼ばれる情報に落とされ、ビットマップで管理している雰囲気を受ける。このビットマップ化によって、高速アニメーション効果が実現できる。アプリ遷移なんかは、アプリ画面のスナップショットを使って、速くするという徹底ぶり。これはユーザアクションに対する反応を高速に行うというデザインポリシーに徹しった結果なのだろう。実際に表示される画面がスナップショットと不整合があることもしばしば。このあたりはもう少し気を使ってもいいと思うが、アプリ次第なのかもしれない・・・

しかし、いろいろ使っていくとメモリをふんだんに使っているだけではないことがわかる。例えば、画像表示用の部品を生成しても、その部品が画面に現れるまでは、画像の展開、表示情報の反映など、何も行われていないようだ。メモリの利用効率をあげることに対しても、徹底的にチューニングが行われている。

洗練されたデザインポリシー

ユーザーインターフェースを開発している企業はたくさんあるが、Appleほど洗練されたデザインポリシーを持つメーカはない。ほぼ全てのメーカはAppleのデザインポリシーを参照している。iPhoneが何よりもすごいのは、そのデザインポリシーを愚直なまでに実現していること。私の知る限り、ここまで徹底しているメーカは見たことがない。
プログラム初心者が、iPhoneアプリ開発で一番やっておくことはデザインポリシーを体感すること。プログラマだからデザインを知らなくてもいいというのは10年前の話。今はプログラマもデザインできないといけない。少なくともそう思って、アプリ開発に望むべきだ。

癖になる開発ツール

ソースコードの編集やビルド、デバッグと言った作業はXcodeで行う。静的なレイアウトはInterface Builderで行う。
プログラム初心者にとって、iPhoneの開発ツールは申し分ない。Unix特有のMakefileを書くという煩わしさが削減される。

個人的に気に入っているのはXcodeの編集機能。特に、自動補完機能は使っていて癖になる。他のSDKの編集ツールの方が自動補完に関しては、機能が豊富だが、ある意味ごちゃごちゃしている雰囲気を受ける。Xcodeは他のSDKの編集ツールと比べると、痒いところに手が届かないが、シンプルなところが使っていて気持ちいい。しかも、emacsライクなキーバインドを持っていたり、gdbデバッグできたりすることろがUnixユーザとして嬉しい。
Interface Builderは、静的なレイアウトだけでなく、プログラム(ヘッダに定義したUI部品を指す変数やメソッド)とUI部品とのバインディングを行う。まぁ、これはなくても問題なし。CMで流れているiPhoneアプリでInterface Builderを使って実現されたアプリはほとんどない。CMではゲームばかり紹介しているからかもしれないが。

*1:良質であるか否かは趣味の問題

*2:デザインパターンとは設計のために役立つ技術をテンプレート化したもの