ユーザ! ユーザ!     ユーザ!
   Tonny (@tonnyxu)
     genesix, Inc.
質問:
スマートフォンを持っていない人
質問:
iOSの開発経験がある人
目次
目次
自己紹介
目次
自己紹介
開発プロセス中でのプログラマの立ち位置
目次
自己紹介
開発プロセス中でのプログラマの立ち位置
プログラマとしてできることは何か?
目次
自己紹介
開発プロセス中でのプログラマの立ち位置
プログラマとしてできることは何か?
It’s my babyの苦労と喜び
  感動:animation
  落ちまくる:memory管理
  スピード:開発合宿
  グローバル:English
目次
自己紹介
開発プロセス中でのプログラマの立ち位置
プログラマとしてできることは何か?
It’s my babyの苦労と喜び
  感動:animation
  落ちまくる:memory管理
  スピード:開発合宿
  グローバル:English
未来への道
自己紹介
自己紹介
自己紹介
Tonny
 29.9999998才
 情熱プログラマ
 iPhone: 2008/7から
自己紹介
Tonny
    29.9999998才
    情熱プログラマ
    iPhone: 2008/7から
夢
    百万人のユーザに
    使ってもらえるサー
    ビスを創る
User!
    User!
        User!
User!

なぜ? User!
        User!
Developers!
    Developers!
        Developers!
Steve Ballmer
  Microsoft
    2000
Steve Ballmer
  Microsoft
    2000
http://youtu.be/8To-6VIJZRE
なぜ?
エンジニアの仕事とは?
エンジニアの仕事とは?
エンジニアの仕事とは?
上司を喜ばす?
エンジニアの仕事とは?
上司を喜ばす?
家族を喜ばす?
エンジニアの仕事とは?
上司を喜ばす?
家族を喜ばす?
お金を   ける?
エンジニアの仕事とは?
上司を喜ばす?
家族を喜ばす?
お金を   ける?
 技術を磨く?
エンジニアの仕事とは?
エンジニアの仕事とは?



ユーザを喜ばす
開発プロセス中での立ち位置
開発プロセス中での立ち位置
   よくあるプロセス
開発プロセス中での立ち位置
      よくあるプロセス


企画   設計   開発   テスト   公開
開発プロセス中での立ち位置
      よくあるプロセス


企画   設計   開発   テスト   公開
開発プロセス中での立ち位置
      よくあるプロセス


企画   設計   開発   テスト   公開
開発プロセス中での立ち位置
      よくあるプロセス


企画   設計   開発   テスト   公開




 より良いユーザ体験を提供するため
プログラマとして何が出来る
プログラマとして何が出来る



企画
プログラマとして何が出来る

     自分のアイディアで貢献



企画
プログラマとして何が出来る

     自分のアイディアで貢献
     エンジニアの知識を活用

企画
プログラマとして何が出来る

     自分のアイディアで貢献
     エンジニアの知識を活用
      可能なリスク?
企画
        OS バージョンなど
        優先順位
プログラマとして何が出来る

     自分のアイディアで貢献
     エンジニアの知識を活用
      可能なリスク?
企画
        OS バージョンなど
        優先順位
      実現可能?
プログラマとして何が出来る

     自分のアイディアで貢献
     エンジニアの知識を活用
      可能なリスク?
企画
        OS バージョンなど
        優先順位
      実現可能?
      より良い案?
プログラマとして何が出来る

     自分のアイディアで貢献
     エンジニアの知識を活用
      可能なリスク?
企画
            OS バージョンなど
            優先順位
      実現可能?
      より良い案?
      ...
プログラマとして何が出来る
プログラマとして何が出来る



設計
プログラマとして何が出来る

     UX = User eXperience


設計
プログラマとして何が出来る

     UX = User eXperience
     uXにアドバイス

設計
プログラマとして何が出来る

     UX = User eXperience
     uXにアドバイス
        ここはこのアニメション
設計
プログラマとして何が出来る

     UX = User eXperience
     uXにアドバイス
        ここはこのアニメション
設計
        ここは高さの変化があるよ
プログラマとして何が出来る

     UX = User eXperience
     uXにアドバイス
        ここはこのアニメション
設計
        ここは高さの変化があるよ
        ここはコードで実現できる
プログラマとして何が出来る

     UX = User eXperience
     uXにアドバイス
        ここはこのアニメション
設計
        ここは高さの変化があるよ
        ここはコードで実現できる
        ここは画像ください
プログラマとして何が出来る

     UX = User eXperience
     uXにアドバイス
        ここはこのアニメション
設計
        ここは高さの変化があるよ
        ここはコードで実現できる
        ここは画像ください
        ...
プログラマとして何が出来る
プログラマとして何が出来る



開発
プログラマとして何が出来る

     開発は本業だよね



開発
プログラマとして何が出来る

     開発は本業だよね
     プロになれ!

開発
プログラマとして何が出来る

     開発は本業だよね
     プロになれ!
      より速くできるか?
開発
プログラマとして何が出来る

     開発は本業だよね
     プロになれ!
      より速くできるか?
開発
      より正確にできるか?
プログラマとして何が出来る

     開発は本業だよね
     プロになれ!
      より速くできるか?
開発
      より正確にできるか?
      既にAPIがあるか?
プログラマとして何が出来る

     開発は本業だよね
     プロになれ!
      より速くできるか?
開発
      より正確にできるか?
      既にAPIがあるか?
      どこに答えがあるか?
プログラマとして何が出来る

     開発は本業だよね
     プロになれ!
      より速くできるか?
開発
      より正確にできるか?
      既にAPIがあるか?
      どこに答えがあるか?
      ...
プログラマとして何が出来る
プログラマとして何が出来る



テスト
プログラマとして何が出来る

      ちゃんとやれ!



テスト
プログラマとして何が出来る

      ちゃんとやれ!
      開発中
       Unit Test
テスト    サンプルアプリ
プログラマとして何が出来る

      ちゃんとやれ!
      開発中
       Unit Test
テスト    サンプルアプリ
      開発後
       自動テストじゃなくても良い
       テスト仕様書
プログラマとして何が出来る
プログラマとして何が出来る



公開
プログラマとして何が出来る

     終わりではない



公開
プログラマとして何が出来る

     終わりではない
     ユーザーからのフィードバック
      対応すべき?
公開
      コスト?
プログラマとして何が出来る

     終わりではない
     ユーザーからのフィードバック
       対応すべき?
公開
       コスト?
     KPT
プログラマとして何が出来る

     終わりではない
     ユーザーからのフィードバック
       対応すべき?
公開
       コスト?
     KPT
       Keep
       Problem
       Try
Carlye Lynnes Photography
It’s my babyの苦労と喜び



          Carlye Lynnes Photography
It’s my babyの苦労と喜び



          Carlye Lynnes Photography




ユーザと一緒に育ち、一緒に成長
感動:animation
感動:animation
iOSとほかのスマートフォン
 一番大きな違い
感動:animation
iOSとほかのスマートフォン
 一番大きな違い
より分かりやすいUI
感動:animation
iOSとほかのスマートフォン
 一番大きな違い
より分かりやすいUI
実装は簡単
 ゼロからのハードルが少しある
 なれたら、簡単
 本当はパワフル
 iOS 4.0から、更に簡単
Code Snippet
昔のやり方
昔のやり方
// Old fashion
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.8];
[UIView setAnimationDelegate:self];
[UIView
setAnimationDidStopSelector:@selector(finishDism
iss)];

self.alpha = 0;

[UIView commitAnimations];
現在のやり方(iOS 4.0+)
現在のやり方(iOS 4.0+)
// New fashion
[UIView animateWithDuration:0.8
                 animations:^{
                     self.alpha = 0;
                 }
                 completion:^(BOOL finished) {
                     [self finishDismiss];
                 }];
落ちまくる:Memory管理
落ちまくる:Memory管理
C/C++からのプログラマは心配不要
 malloc/free → retain/release
 new/delete → retain/release
落ちまくる:Memory管理
C/C++からのプログラマは心配不要
  malloc/free → retain/release
  new/delete → retain/release
Webからのプログラマは要注意
   ポインターを理解すべき
   メモリ管理の基本ルール
      自分が取ったら、自分で返す
      ペアで書く
Best Practices
Best Practices
ペアで書く・self.hogeを理解する・@privateを使う
  ネットワークに注意・NSZombieを活用する
ペアで書く- @property
ペアで書く- @property
// Hoge.h
@interface Hoge {
       NSString *myStr;
}
@property (nonatomic,copy) NSString *myStr;

@end
ペアで書く- @property
// Hoge.h
@interface Hoge {
       NSString *myStr;   1
}
@property (nonatomic,copy) NSString *myStr;

@end
ペアで書く- @property
// Hoge.h
@interface Hoge {
       NSString *myStr;   1
}
@property (nonatomic,copy) NSString *myStr;

@end
                                     2
ペアで書く- @property
ペアで書く- @property
// Hoge.m
@implement Hoge
@synthesize myStr;


-(void)dealloc{
    [myStr release];
}
@end
ペアで書く- @property
// Hoge.m
@implement Hoge
@synthesize myStr;     3
-(void)dealloc{
    [myStr release];
}
@end
ペアで書く- @property
// Hoge.m
@implement Hoge
@synthesize myStr;     3
-(void)dealloc{
    [myStr release];       4
}
@end
ペアで書く- alloc/release
ペアで書く- alloc/release
NSArray *myArr = [[NSArray alloc] init];



[myArr release];
ペアで書く- alloc/release
NSArray *myArr = [[NSArray alloc] init];

                             1
[myArr release];
ペアで書く- alloc/release
NSArray *myArr = [[NSArray alloc] init];

                             1
[myArr release];

         2
self.hogeを理解する
self.hogeを理解する
@property (nonatomic, copy) NSString *myStr;

@property (nonatomic, assign) BOOL myBool;



self.myStr = @”Tonny Xu”;

NSString *s = self.myStr;



self.myBool = YES;

BOOL b = self.myBool;
self.hogeを理解する
self.hogeを理解する
//self.myStr = @”T” == [self setMyStr:@”T”];

- (void) setMyStr:(NSString *)p{

    if (myStr != p) {

        [myStr release];

        myStr = nil;

        myStr = [p copy];

    }

}
self.hogeを理解する
self.hogeを理解する
// different implementation: assign/retain/copy
// assign
property = newValue;
// retain
if (property != newValue){
     [property release];
     property = nil;
     property = [newValue retain];
}
// copy
if (property != newValue){
     [property release];
     property = nil;
     property = [newValue copy];
}
@privateを使う
@privateを使う
// Hoge.h

@interface Hoge{

    @private

    NSString *myStr_;

}

@property (nonatomic, copy) NSString *myStr;



@end
@privateを使う
@privateを使う
// Hoge.m

@implement Hoge

@synthesize myStr = myStr_;



- (void) dealloc{

    self.myStr = nil;

}

@end
ネットワークに注意
ネットワークに注意
// it’s real code
- (void)dealloc {
    [[NSNotificationCenter defaultCenter]
removeObserver:self];

    NSArray *allDownloads = [self.imageDownloadsInProgress
allValues];
    if ([allDownloads count] > 0) {
        [allDownloads
makeObjectsPerformSelector:@selector(cancelDownload)];
    }
    [imageDownloadsInProgress release];

    [super dealloc];
}
NSZombieを使う
NSZombieを使う
NSZombieを使う
NSZombieを使う
NSZombieを使う
NSZombieを使う
// NSZombieEnabled = YES
NSArray *myArr = [[NSArray alloc] init];
[myArr release];
[myArr release]; // 何が発生しますか?
NSZombieを使う
// NSZombieEnabled = YES
NSArray *myArr = [[NSArray alloc] init];
[myArr release];
[myArr release]; // 何が発生しますか?

------------------------------------

[Session started at 2011-01-23 23:34:42
 +0900.]
2011-01-23 23:34:54.935 TestApp[453:207]
 *** -[__NSArrayI retain]: message sent
 to deallocated instance 0x6248040
MTG
e eti ng
m
            MTG
            ミーティ
                 ング
どうすれば集中できる?
genesixの答えは
genesixの答えは

 開発
 合宿
RedBull
RedBull   午前2時過ぎ
成果物
成果物




instaqlock
成果物




instaqlock   ミクフォトアップローダー
成果物




instaqlock   ミクフォトアップローダー
               Social 有料TOP 1
効率の検証
効率の検証
時間
 二泊三日
効率の検証
時間
 二泊三日
生産性
 git コミット回数: 112回
 増えた行数:3468行
効率の検証
時間
 二泊三日
生産性
 git コミット回数: 112回
 増えた行数:3468行


 genesixの定期活動になった!
グローバル:English
グローバル:English
弊社のUXデザイナー@mikihirocksがHIGのチェック
シートをリリースした。
グローバル:English
弊社のUXデザイナー@mikihirocksがHIGのチェック
シートをリリースした。
      http://bit.ly/flHYBu
グローバル:English
弊社のUXデザイナー@mikihirocksがHIGのチェック
シートをリリースした。
      http://bit.ly/flHYBu

  リリースする時に、既に遅れてしまった。
グローバル:English
弊社のUXデザイナー@mikihirocksがHIGのチェック
シートをリリースした。
      http://bit.ly/flHYBu

  リリースする時に、既に遅れてしまった。
我々はエンジニアだ
グローバル:English
弊社のUXデザイナー@mikihirocksがHIGのチェック
シートをリリースした。
      http://bit.ly/flHYBu

  リリースする時に、既に遅れてしまった。
我々はエンジニアだ
  日本語版のiOSのAPI文書を待つ?
グローバル:English
弊社のUXデザイナー@mikihirocksがHIGのチェック
シートをリリースした。
      http://bit.ly/flHYBu

  リリースする時に、既に遅れてしまった。
我々はエンジニアだ
          遅 い!
  日本語版のiOSのAPI文書を待つ?
グローバル:English
弊社のUXデザイナー@mikihirocksがHIGのチェック
シートをリリースした。
      http://bit.ly/flHYBu

  リリースする時に、既に遅れてしまった。
我々はエンジニアだ
  日本語版のiOSのAPI文書を待つ?
この時代、この世界は
  英語のみだ!
What to do?
What to do?
アップルの英語ドキュメントを読んでみよう!
What to do?
アップルの英語ドキュメントを読んでみよう!
WWDC 2010のビデオを見てみよう!
  字幕を使っても良い
What to do?
アップルの英語ドキュメントを読んでみよう!
WWDC 2010のビデオを見てみよう!
  字幕を使っても良い
英語圏に質問を投げてみよう!
  stackoverflow.com
  devforums.apple.com
What to do?
アップルの英語ドキュメントを読んでみよう!
WWDC 2010のビデオを見てみよう!
   字幕を使っても良い
英語圏に質問を投げてみよう!
  stackoverflow.com
  devforums.apple.com
TOEICをやってみよう!
   ECナビは年内のTOEIC受験がタダだ
     genesixの親会社
英語が苦手
って言い訳だ!
やれば、出来る!
未来への道
未来への道
スマートフォン
 iOS
 Android
未来への道
スマートフォン
  iOS
  Android
モバイルインターネット
 10年前?
 現在?
未来への道
未来への道

  genesixを日本一の
スマートフォン開発会社に
一言しか覚えない?
ユーザを喜ばす!
もう少し覚える?
Memoryは命だ!
また余裕がある?
Best Practicesを!
一緒に
 ご清聴ありがとう
  ございました。
やりませんか?
一緒に
やりませんか?

1.29.user,user,user