iPhone登場初期からのiOSエンジニアたちは「TimeTree」をどう見る?
──自己紹介をお願いします。
佐藤新悟(以下、佐藤):まだスマホがない2006年に旧Yahoo! JAPAN(現LINEヤフー)に新卒入社しました。Mac好きでしたのでYahoo!メッセンジャーのMac版クライアントを担当させてもらえることになり、iPhone登場前からObjective-Cに触れています。その後、社内でiOSアプリ開発メンバーに選ばれたことがきっかけでiOSエンジニアになりました。TimeTreeの創業メンバーと一緒に仕事をしていた縁で、2016年からTimeTreeに入社してiOSアプリ開発をしています。
荒木秀太(以下、荒木):私も旧Yahoo! JAPAN出身で、当時はデスクトップのウィジェット開発をしていました。ウィジェットのようなアプリをiPhoneでも動かせるということで、iPhone 3Gの発売後にすぐに購入し、デベロッパー登録もしました。そこからiOSエンジニアとして活動を続けています。転職していったんはiOS開発から外れた時期もありますが、縁あってTimeTreeに入社するときに再びiOSを開発したいと希望してiOSエンジニアに戻りました。
市川勝(以下、市川):学生時代からWindowsのフリーウェアを開発していたことで、2005年に旧Yahoo! JAPANに入社し、検索事業でバックエンドからフロントエンドまで手がけるWebエンジニアとして働いていました。佐藤と同じく、iOSアプリ開発の社内公募で手を挙げてiOSエンジニアとなりました。当時ヤフオクや防災速報アプリを開発し、後に荒木に引き継ぐなど、3人とも最初の会社で密な関係だったと思います。後に佐藤からTimeTreeに誘われて入社しました。
──皆さんベテランのiOSエンジニアですね。皆さんから見たらTimeTreeはどんなプロダクトですか?
佐藤:カレンダーシェアサービスです。正直、最初に見たときは「Googleカレンダーでいいのでは?」と思いました。しかし実際に開発に携わって知ったのですが、「TimeTree」はアプリの思想として「共有」を前提にしています。またユーザーさんの声を通して、テクノロジーに慣れていない方でも使いやすいことが大きな特徴だと気づきました。
荒木:最初はただのカレンダーアプリだと思っていました。ですが開発側にまわり、先ほど佐藤の話にもあったように「共有」が前提としてあり、共有することによってユーザーさんの課題を解決するプロダクトだと知りました。
市川:ぼくも初見は「Googleカレンダーでいいのでは?」でした。しかし自分の家庭に導入してみるとコンピュータに明るくない家族もすんなり使えて驚いたんです。ユーザーさんに優しく簡単に予定を共有できる体験を通して印象が変わりました。
──iOS版の特徴、技術的なポイントは?
荒木:技術面では、iOSの基本機能を大事にしています。例えば画面下のタブやカレンダー表示の動きはiOSのネイティブの機能です。奇抜な動きはしないので説明不要で幅広いユーザーさんに使っていただけています。ただし、基本を重視しつつも、どうすれば予定を確認しやすくなるか、予定を素早く登録できるかも重視している点です。またオフラインでの使い勝手も大事にしています。
佐藤:データ管理にはCore DataというApple純正のフレームワークを使っています。意外とみんな使いたがらないのですが、あえて選んでるのが特徴です。例えば現在だとRealmが有名ですが、外部OSSを使うか標準を使うかはよく検討した上で選択することが大事だと思います。TimeTreeでは基本は標準、満たせない要件があるなら外部を使うという順番にしています。
市川:TimeTreeは標準をベースにしているところが多く「流行をがっつり採り入れてしまい、(後になって)外すのに苦労している」ことがあまりありません。画面周りのコードを見てもMVCやObservableObjectを使ったMVVMなど標準的なアーキテクチャになっています。
荒木:例えばRxSwiftをがっつり使っていると、Apple純正のSwiftのCombineに移行しづらいですし、Concurrencyも工夫が必要になったりします。
──フロントエンドは変化が早いので技術的な負債がたまりやすいと聞きますが、iOSもそうなのですね。うまく回避している印象です。
荒木:実を言うと、外部のライブラリに頼っていた部分もありました。Objective-CからSwift、SwiftUIやCombineが出てきたタイミングで標準に移行していました。それをやっていたのが市川です。
市川:剥がしてました(笑)
見るべきは今年のWWDCではない? 技術的負債解消のヒント
──技術的な負債の解消について、課題はありましたか?
佐藤:元々RestKitという高機能なライブラリーがあり、初期バージョンから使っていました。それがObjective-Cで書かれていたのですが、Swift化を進めていく中でObjective-Cに依存する部分が残っているとSwiftのメリットを最大限生かせないので、結構前からSwiftの内製ライブラリに置き換えていきました。また、RestKitはあまりメンテされてないこともリスクに感じていました。
なのでRestKit脱却の必要性は感じていたのですが、あらゆるところで使われていたのでなかなか進められず、そこで業務委託という形で入社前の市川に手伝ってもらいました。
市川:ユーザーさんの予定にも影響があるので、とても慎重に作業していました。ユーザーさんやデータの数が多く、影響範囲が広いので。
荒木:ユーザーさんのなかには月に数百から千件もの予定を抱えている人もいます。次第にデータが蓄積して「重い」と苦情があり、現在表示している画面だけ描画する処理に変えるなど改善してきました。
──となると、Appleの発信内容に注目ですね! 直近だとWWDCもありましたが、注目しているところはありますか?
佐藤:やはりSwift 6となりConcurrently周辺でパラダイムシフトが起きていることです。Appleも段階的に移行できるようにしているので、なるべく追従できるようにと考えています。
荒木:個人的には新しいテストフレームワーク「Swift Testing」が気になっています。簡潔に書けるようになるので、今後は主流になるかと思います。あと今年はVision Proがすごく話題でした。TimeTreeはARアプリではありませんが、最低限動くようにして、Vision Proの理解も深めていこうと考えています。iPadなど互換モードで動く他のデバイスもキャッチアップする必要があると肝に銘じています。
──WWDCはライブで見ていますか?
佐藤:キーノートをライブで見る人はSlackチャンネルで盛り上がっていたりします。翌日のエンジニア向けセッション「Platforms State of the Union」はiOSチームみんなで見ています。
荒木:ブレイクアウトセッションだとみんなで同じものをみるのではなくNotionで「見たリスト」を作り、サマリーを作成したり、朝会で共有したりします。
佐藤:最新のWWDCウォッチも大事ですが、最新機能は最新OSでしか動かないので、逆に数年前にリリースされた最低サポートバージョンから利用できる機能も重要です。しかし数年前だとみんな覚えていないので、市川が主導してiOS16の新機能を持ち回りで共有しています。いい取り組みだと思います。
Flutterなども普及する中で、ネイティブ開発にこだわる理由は?
──新機能の開発で、大事にしているポイントはありますか?
佐藤:見た目は、デザイナーに作成してもらったモック通りに作ればいいのですが、画面遷移や詳細はエンジニアに委ねられるところがあり、デザイナーの意図をくみながら自分たちで考えたり、レビューしてます。単に機能が動けばいいだけではなく、使いやすさや気持ちよさにも配慮しているエンジニアが多いと思います。
市川:ちょうど昨日、ある画面デザインにおいてセーフエリアの有無で実装がハッキーになってしまい、チームと相談していました。最終的には、デザイナーと協力することで実装もデザインもよくなりました。UIだけでなくUXも考慮して、デザイナーとエンジニアが共に高めていけるのがTimeTreeの良さだと思っています。
──Flutterのようなクロスプラットフォーム開発も一般化する中で、iOSネイティブな開発にこだわる理由は?
荒木:一度iOS開発から離れて実感したのですが、iOS開発はUIにおいていろんなことができることが面白さでもあり大切なポイントでもあります。その点、Flutterだと細かいUIの作りこみができないところがあり、物足りなさを感じるのが懸念点です。
佐藤:僕はずっとAppleが好きで「iPhoneを使うしかないでしょ」と思っている人間なので公正な目で見られないかもしれませんが、iOSにはAppleの哲学が詰まっていて使いやすさにも繋がっていると思います。標準通りに使えばアプリもキビキビ動くのがいいですね。
──では、Android版とはどのように調整していますか?
荒木:Androidもネイティブで開発しているので、ボタンの位置も含めて、できるだけ差分のないように作っています。仕様は細かくドキュメントに書き出し、iOSとAndroidの両チームが相互に確認し合えるような体制にしているので、ここはチーム力で達成できていると思います。また、iOSとAndroid双方の解像度を高めるための施策として、TimeTreeメンバーにはiOSとAndroidの2台持ちになるよう会社携帯を貸与しています。自分だと個人端末がAndroidで、会社用がiOSです。
コードレビューはボディビル大会? 技術力を支えるのはチームの力
──コードレビューで工夫されていることはありますか?
佐藤:コードレビューでは絶対的な正解はないけど人によって書き方が違ってしまうことがあります。TimeTreeでは、みんなで話し合ったコーディング規約が土台にあり、基本的にはAppleのAPIデザインルールなどのドキュメントに沿うようにしています。後は特別なことはしていませんが「ナイスバルク!」くらいですかね(一同、笑)
荒木:これを読んでいる方のために補足しますね(笑)。コードレビューは修正の指摘になりがちなので、良いと思ったことは「良い!」とちゃんと伝えるようにしています。「この対応は大変だっただろうな」「すごく工夫してくれたな」と思ったら「ナイスバルク!」と伝える文化があるんです。もともとはボディビルダーのかけ声で「いい筋肉がついてるね」という称賛の意味なんですけど。筋トレしてない人もノリで声をかけてくれます(笑)
市川:TimeTreeに転職してきたら、メンバーがめちゃくちゃ褒めてくれるのでテンションが上がります。指摘もすごく気を遣って丁寧にしてくれていると思いました。佐藤は「特別なことをしていない」と言いましたが、こういう雰囲気作りができるのは特別なことに感じます。
──iOSのチームビルディングについても教えてください。
佐藤:基本的に仕事は各職種のメンバーが集まったプロジェクトチームごとで進行していますが、iOSエンジニアの横のつながりを持てるように、毎朝30分ほどの朝会、週次で1時間ほどの定例会議があります。技術相談とか真面目なパートもありつつ、コミュニケーションを目的とした雑談パートも設けています。
旅行に行ったとか、レトロゲーム機を修理したとか、そういった業務に関係のない話題を交わし合い、その内容が面白いので編集して社内ラジオという形で(社内限定で)毎週配信しているんです。このおかげかiOSエンジニアは話すのが上手だと言われます。
市川:初めて参加した時は面食らいましたよ。ずっと雑談してて。話を振られた時はドキドキしました。
──最後にTimeTreeで働くことで開発者として成長したと感じることなど読者にメッセージをお願いします。
荒木:TimeTreeはカレンダーを共有するアプリですが、本当の目的は「共有」にとどまりません。共有した先にあるコミュニケーション設計や、もっと風呂敷を広げ「誰かと予定を共有しやすい」社会の実現を目指しています。TimeTreeのエンジニアとして働く中でこのような深掘りができるようになり、自身の成長を感じます。またTimeTreeは世界で多くのユーザーさんにご利用いただいています。自分が実装した機能が世界中で使われていると思うと、すごくモチベーションになります。
佐藤:TimeTreeのエンジニアは「いいプロダクトを作ろう」という気持ちが強い人が多いです。いいプロダクトとは、ユーザーさんに価値を届けられるものであり、技術的にも正しく作られているものです。みんなそこのバランス感覚を持った人たちなので刺激を受ける毎日です。
市川:TimeTreeは歴史が長く、ユーザーさんも世界各国に多くいて、いろんな課題があります。今はユーザーさんが増えてサービス変更が難しくなっていますが、TimeTreeではみんな前向きで「これを解決したらユーザーさんの生活が良くなるし、面白い!」とそれぞれの課題に取り組んでいるところが自分の刺激であり、糧になっています。僕たちの話を聞いてもし共感していただける方がいればぜひ一緒に仕事をしたいですね。
TimeTreeでは一緒に働く仲間を募集しています!
iOSはもちろん、TimeTreeではBackendやAndroidなど幅広くエンジニアを募集しています。本記事で興味を持たれた方はぜひTimeTree採用サイトからご応募ください。