Awardを取るぞ!」と騒いでいるので、知り合いに「それって(現実が分かっていない)大学生のノリですよ」と指摘されてしまった私だが、マイクロソフトを2000年に退社してからは、ひたすらモバイル・組み込みの世界で仕事をしてきた私としては「俺が取らなくて誰が取る?」という気分。その超楽天的な態度が彼が言うところの「大学生のノリ」なのだろう。市場に受け入れられるアプリを作るためには、もちろん「誰にどんな価値を提供するのか」が一番大切。そこには残念ながら成功の一般方程式はないので、今日は比較的に一般化しやすい「どう作るか」という部分に関して、まとめることにした。ユーザーの利用シーン・使用パターンを良く考えて作るパソコンやゲームコンソール向けのソフトと大きく違うのが、ユーザーの使用パターン。iPhoneに限らず、携帯電話用のアプリは基本的には「一回のセッションはわずかな時間、でも一日に何回も使う」もの。ゲームであれば、1時間ぶっ続けに遊ばないと楽しめないゲームではなく、ちょっと電車を待つ時間に2〜3分遊んだり、タマゴッチのように「基本的にはずっと遊んでいるが実際にアプリとやり取りをするのは時々」なゲームを作るべき。OSがアプリをバックグラウンドで走らせることを許さないことに不満なようだが、まさにここをキチンと理解して作り込むことが「良い携帯アプリ」を作るために大切。パソコンと違ってメモリの限られた携帯電話では、バックグラウンド・アプリを走らせる余裕などないし、そんなことを許してしまっては、Windowsパソコンのように「長く使っているとどんどんと遅くなるマシン」になってしまう(これって、自分に対する皮肉か?^^;)。途中で電話がかかって来ても、ユーザーがいきなりホームボタンを押してしまっても、ユーザーの大切なデータがなくなったり壊れたりしない、そんなアプリを作らねばならない。ハードを強く意識して最適化するiPhoneの場合は、「CPUは非力だが強力なGPUを積んでいる」、「メインメモリは限られているが、フラッシュメモリは豊富にある」、「通信は遅いGPRSと早いWiFiの二種類がある」などの特徴があり、そのあたりを強く意識したアプリケーションの設計が必要となる。「どの処理をGPUが助けてくれるのか」を強く意識して設計すると、見栄えが良くて消費電力の少ない優秀なアプリが作れる。viewを書き換えるのはCPUだが、viewそのものを変形したりアニメーションしたりするのはGPUの役目なので、そこを意識してviewの書き換えを極力減らしながら、フェードインなどの効果はGPUにさせる。ネットワーク遅延によるストレスを極力減らすこれはAJAXでも同じ話だが、特にネットワーク遅延の大きいモバイル・ネットワークを利用したアプリケーションを作る場合、通信による遅延をいかにユーザーから隠し、ストレスの少ないおもてなしを提供するかが鍵となる。軟弱なプログラマーはマルチスレッドにたよりがちだが、そこにある「排他制御のワナ」にハマらないように気をつけなければならない。私は基本的には「シングルスレッドで複数の非同期通信を同時に使いこなすことに命をかける」タイプだが、こちらはこちらで気をつけなければならないことが沢山ある(メモリーリークとか、プログラムの煩雑さ、だとか)。携帯アプリの場合、「どれだけ豊富な機能を提供するか」ではなく「(ユーザーに提供する価値を損なわずに)どこまで絞り込めるか」が勝負である。絞り込みすぎたら役に立たないアプリになってしまうので、そのバランスが一番難しい。N900iは、撮影時の解像度は指定できるしマクロ撮影もでき、機能的にはとても充実していたが、肝心の撮影をしたい時に4つもクリックが必要、という最悪の作りであった(参照)。いうことで、「どう作るか」に関しては良く理解しているつもりなので、後の問題は「何を作るか」。2008向けのiPhoneアプリの提出期限まであと約二週間。ブログなんて書いてる時間はないぞ、と。|Commentsこんばんは。08:50新しい才能、若い人、立ち上がったばかりのベンチャー、言ってみればその才能に注目してもらうための手段、資本をまだ持てていない人たちにチャンスを与え、次のステップへの手がかりを与えるためのAwardに、業界でもう何年も実績持ってる人、自分のビジネスアイディア、アプリケーションをラウンチするために十分な手元資金も人脈もあるプロ中のプロがただ学生のノリで乗り込んで、賞狙ってどうするの?と思うのは私だけではないようですね。賞を取ってジョブズからトロフィーを受け取る名誉が目的なら、何のためにAwardが設けられているか、というintentを考え直した方が良いとは思います。18:41いや、コンペから業界の人を排除したい、学生やスタートアップだけを対象としたいのなら、最初からそう明記されているはずですよ。そんな意図を隠しておく必要はないのですから。今回はオープンなコンペなんでしょう。20:48このAwardをとるのに必要なのはまさにその「才能」であって資本や実績は関係ないのでは?若くても優秀なプログラマはたくさんいるし逆もまた然りだと思います。ユーザとしてはiPhone上で動く面白いアプリが使えるようになれば誰が作ってもかまわないです。私はある意味大人気ない?中島さんが素敵だと思います。21:19「シングルスレッドで複数の非同期通信を同時に使いこなす」とは、具体的に、どう言う事をするのですか。今まで、1対1程度のclient/serverのプログラムを書けばよかったので、コネクション毎にスレッドを立ち上げれば良いや、と考えていたのですが、今後、scalabilityのある(1000個位のコネクションをさばく)サーバーを作らなければならないので、「シングルスレッドで複数の非同期通信を同時に使いこなす」必要があると、社長に言われています。Portsという物を、使わなければならないと言う事までは分かっているのですが、いまだに「シングルスレッドで複数の非同期通信を同時に使いこなす」必要性が理解できません。イーサネットでは、複数のパケットが、時分割で一つの物理層を共有している(シェアしている)ので、厳密に言ったら、複数のパケットを同時に受信する事は無いと思います。ネットワークチップにも、プロトコルスタックにも受信バッファがあるので、例え見かけ上複数のコネクション要求が同時に発生したとしても、アプリケーション層で個々のコネクション要求を処理する時間は十分あると思います。Ports等を使う必要があるのではと、疑っています。マルチスレッドのデメリットは、コンテキストスイッチのオーバーヘッドと、メモリー使用量だけだと思うので、例えばマルチコアで、メモリーが豊富にある様な環境では、プログラム構造が単純なマルチスレッドを使った設計の方が良いのではないでしょうか?できれば、「シングルスレッドで複数の非同期通信を同時に使いこなす」メリットと方法を、WindowsとLinux/Unixを例に説明して頂けないでしょうか?よろしくお願いします。21:54私は逆に、「若いやつらよ、発奮しろよ!打ち負かしてみろよ!」という中島さんからのメッセージだと思うのですが。08:15ここにあげられた5つのポイントって、携帯アプリと申しますか、ネットワーク時代のアプリやデバイス全部に対して意識しなければいけないポイントですよね。iPhoneの場合、3番目の項目の補足として「タッチパネル操作の心地よさを最大化する」というのも外せないかと。19:59Satoshiさんのワクワク感よくわかります!我々も(一応会社としてですが)3人でチームを組んでアンドロイドのコンペに出品しました。私は企画と全体のUIデザインで、コーディングは友達の天才君です。一次予選発表は来週です。実はかなーり自信があって、凄い良い物になったと思うのですが、こればかりはわかりませんねー(1800のエントリーがあったとか)。一次を通過して、さらにアプリをブラッシュアップする機会を与えてもらえれば。TypepadTop。