新人エンジニアにはiPhoneアプリ開発をさせるといいかもしれない | スマホアプリ開発記

スマホアプリ開発記

スマホアプリやサービス作りで感じたことを書いています。

前にどこかで学生はiPhone開発しない方がいいという意見が話題になっていましたが(流行り物を追いかけるのではなく、基礎をしっかり学べという主張だった気がしますけど)、最近ふと考えています。

というのも、まだ右も左もわからないエンジニアに対して、今だったら何を最初に学ばせるのがよいでしょうか?と考えたときに、iPhoneアプリ開発は悪くないのではないかと思うようになってきました。

■ Objective-Cは易しすぎず難しすぎない


最初に学ぶ言語って、その後のエンジニア人生を大きく左右すると思っています。私自信は高校生の時に独学で学んだC++が初めて触った言語でした。C++から入ったというのは今でも正解だったと思っています。社会人になってからJavaにすんなりと入ることができたし、今やっているObjective-Cもすぐに慣れました。Perl、JavaScript、ActionScript、PHP、Ruby等も触りましたが、どれも応用の範囲内で対応できました。

自分の主張を押し通すなら、最初に学ぶべき言語はC++(その過程でC)であるべきと思っています。非構造化プログラム→手続き型→オブジェクト指向という流れが一つの言語で学べるし、いわゆる高級言語でありながらポインタを通じてメモリ空間に直接アクセスできるので、ハードの動きが無意識に頭に思い描かれるようになります。

一方、Javaはまずメモリ空間を意識する必要がない点で易しい。PerlやRubyのように、動的型付けが行われるものは更に易しい。

iPhoneアプリを作る上で必要なObjective-Cは、言うならC++よりは易しくJavaよりは難しい言語です。言語仕様上ガベージコレクションがありますがiPhone開発では使えません。参照カウンタと呼ばれる、メモリを半自動解放する仕組みがありますが、結局はプログラマがメモリ管理を意識しないとメモリリークを発生させます。初心者にはまずメモリリークをがしがし発生させ、それを指摘することで、そもそもなぜメモリリークが発生するのかということから、メモリを確保する仕組み等を学ばせることができます。

ハードの動きが無意識に思い描けるというのは、結構大事なことだと思っており、経験的にCなどを通ってる人は効率のよいコードを書ける人が多いように思います。一時期はハードスペックの向上により効率的なコードというのは重要でなくなってきましたが、最近はiPhoneを始めとしたスペックは高くないがPCのようなことができる端末の登場によりまた重要度が増してきています。実際、iPhoneはメモリ効率を考えないとすぐにメモリを食べつくしますし、CPU効率が悪いとバッテリの消費を激しくします。

■ iPhoneアプリ開発は楽しい


まず最初に学ぶべきはC++だと思っていると書いたのですが、思っているだけで押し通してはいません。その最大の理由は、「今C++を学んでもらって何を作らせよう?」という点です。10年前であればC++を覚えればWindowsアプリが作れました。2000年前後はWindows全盛期で、まだネットも普及が始まり出した頃でクライアントソフトが主流、Windowsアプリが作れることはエンジニアとしても道が開けていました。

しかし、今はネット全盛で、Windowsアプリを作るにも今はC#等の方が主流でしょう。となると、C++が使える領域は速さが求められる処理系や組み込み系になって来ます。そうなると初心者にはプログラミングの面白さが伝わりづらい。挫折してしまうかもしれない。

プログラミングの楽しさを伝えるには、UIを作らせるのがいい。自分が作ったものに直感的に応答するし、人に自慢もしやすい。モチベーションが上がるはずです。

その点、iPhoneは時流に乗っているし、この小さな端末で自分の作ったプログラムが思い通りに動くというのは絶対に楽しいはずです。

■ iPhone開発は小規模ながら幅広い


新人が多少成長して実際にプロジェクトに入ってもらうとした場合にも、iPhone開発の現場は適しているかもしれません。というのも、iPhone開発において一つのアプリに関わるプログラマーは1~2人程度という現場が多いのではないでしょうか。

画面点数も数点~多くて2桁前半程度ですし、開発期間も長くて数カ月と短いので、要はそのプロジェクトに参加した時に、全体が見渡しやすいのです。

そうすると小規模ながらも設計から実装、テストまで一連の流れを実践させることができ、また小規模なので何かあった時の尻拭いもやりやすい。

更に、iPhoneの醍醐味は通信ができることですので、そういったアプリを作る場合には、ネットワークの知識、サーバーの知識が必要になります。場合によっては通信用のサーバーを用意しなければなりません。そうすると、更にデータを受け渡すためのXMLやJSONといった知識、データを格納するデータベースまで用意する必要が出てきます。こうなるとWebシステム+クライアント・サーバシステムのハイブリッドとも言え、エンジニアに求められる基礎が網羅的に体得できるでしょう。

■ 一方で


一方、Objective-Cという言語はMacかiPhoneのアプリを作るのに限られ、言わば「潰しのきかない」言語であるのも確かです。新人に最初にやらせるのがそういう流行りものでいいのか、と言われるとそれも御尤もと思います。また、Objective-CはJavaの「プログラマを守る」という思想とは対極にある、「プログラマを信頼する=何か起きるのはプログラマのせい」という方針の言語です。つまり、ちょっとしたバグによりアプリのクラッシュやメモリリークを起こすし、そのデバッグには時間がかかることになり、初心者を実戦投入するには難しいのも事実。

ただ、最近流行りのPHP、Rubyといったプログラマに易しい言語から入った人が後々苦労しているのはよく見ますので(反論がある人もいると思いますが、ソースコードレベルが平均的に低いのも事実です)、最初は苦労する言語を学ぶべきだという思いがあります。

もちろん、何で作るかではなく、何を作るかが重要であることは言うまでもありませんが。