「ニューヨークのスタートアップで働きはじめて6ヶ月の気づき」というタイトルで、GunosyBeerBashにて発表しました
ちょっと前になるが、「ニューヨークのスタートアップで働きはじめて6ヶ月の気づき」というタイトルで、GunosyBeerBashにて発表した。前職Gunosyにて、久しぶりの勉強会登壇だった。
OKpandaという、英語学習アプリを提供するニューヨークにあるスタートアップで働き始めて、約半年が経った。とても多国籍なチームで、東京と京都での過酷な合宿、冬のニューヨークを乗り越え、自分の中でも振り返りたかったのでまとめてみた。
発表資料は以下。
日常編
半分以上ネタである。ニューヨークのスタートアップで働きながら日常的な気づきは以下の3つ。
- 寿司が美味しくなくても折れない心
- ニューヨークの寒さに折れない心
- 議論に折れない心
寿司が美味しくなくても折れない心
美味しいご飯を食べるには、それなりに高いお金を払う必要がある。Netflixで見れる「Jiro Dream of Sushi」というドキュメンタリーがアメリカで人気で、寿司の話をすると、ニューヨークでは大体「Jiroって知ってるか?」と聞かれる。ちなみに、安い寿司は、お米がシャバシャバです。
ニューヨークの寒さに折れない心
気温がマイナスなんて普通。東京以北に住んだことがない私には辛い。ある日には、大雪で15時以降外出禁止、全交通停止、レストランやその他の店も閉店なんてこともあった。ちなみに、凄いのはここからで、次の日の朝には見事に雪かきが終わっている。
議論に折れない心
常に主体性と主張を問われる。「いいアイデアない?」なんて軽々しく聞くと、「君はどう思うの?」と聞かれる。これは、非常に既視感のある光景だ。そう、リクルート。詳しくはリクルートのDNAとかを読んで欲しい。
日常編まとめ
正直な話、食事はアメリカの食事に慣れているので大きな問題ではない。ただ、焼き肉や寿司といったご褒美系ご飯が、ちょっと高いというくらいだ。 あと、発表では書かなかったが、ニューヨークで一緒に働いたり、リモートをしたり、複数のロケーションで働いている。リモートワークは一つのテクニックだと感じた。そして、維持するのはとても難しい。特に時差がある場合は、難しいく、正直ベストプラクティスが知りたい。
技術編
日本では会ったことがないタイプのエンジニアと働いており、綺麗なコード、設計思想みたいなものを常に求められている。ちなみに、この内容は日本のイケてるエンジニアの方々には当たり前すぎる内容だと思うので、読み飛ばしてほしい。
メソッド名は英語で読めるものに
例えば、あるビューコントローラに何かを表示するような以下のメソッド。
- (void)presentFromRootViewControler:(UIViewController *)rootViewControler { // Do something }
修正後こうなった。
- (void)presentToViewController:(UIViewController *)viewController { // Do something }
頂いた指摘は、
- Controllerのスペルが間違えていた
- rootViewControlerかどうかわからない
- Fromではなくて、Toかwidth
よく見ると中学校の英語レベルのミスだ。多分化だからこそ、明確に英語的に正しく読めるようなメソッド名をつける必要がある。
メソッドを分割する
メソッドは細かい単位に分割。意外と忘れがち。
- (id)init { self = [super init]; if (self) { self.backgroundColor = [UIColor whiteColor]; self.layout.cornerRadius = 5; UIImageView *imageView = [UIImageView alloc] init]; imageView.image = [UIImage imageNamedUniversal:@"someImage.png"]; [self addSubView:imageView]; imageView.keepHorizontaCenter.equal = 0.5; imageView.keepTopInset.equal = 10; } return self; }
みたいな長い初期化メソッドがあったら、以下のように分割してあげると読みやすかったりする。
- (id)init { self = [super init]; if (self) { [self configureUI]; [self layoutUI]; } return self; } - (void)configureUI {} self.backgroundColor = [UIColor whiteColor]; self.layout.cornerRadius = 5; UIImageView *imageView = [UIImageView alloc] init]; imageView.image = [UIImage imageNamedUniversal:@"someImage.png"]; }
モジュール化と依存関係の整理
小さいチームで、複数のアプリをメンテナンスするため、各機能をモジュール化し、再利用出来るように心がけている。 例えば、広告を管理するクラスAが、広告SDK Bをimportしているとしよう。クラスA内でこのSDKを用いているため、AはSDK Bに依存していることになる。これは、実行時の依存も、コード的にもどちらもそうである。
そこで、Protocolを用いてこれを解消する。つまり、protocolを定義し、Aをprotocolに依存させ、SDK Bでそのプロトコルを採用する。すると、SDK BをAにプラグインできるようになる。
まとめ
国際的なエンジニア達と近くで働く中で多くの事を学んでいる。日常的には、国際人として働く難しさ、日本の心地よさ。技術者としては、常に最善を求めてリファクタリングし続けることや、基本的な設計に対する考え方を学んでいる。