それぐらいですね。
バックスと2人で、この後紹介してくれるバックスと2人で開発してて、
僕は主に開発基盤周りとUI周りを担当してました。
バックスです。iOSの開発を担当しております。
入社した年はトレバーの1年前なので、
2017年10月とか。
なので、もう6年目なんですけど、
もうそんなに経ったんだなっていう感じです。
趣味なんですけど、
入社してから続けていることとして、
ジムに通ってまして、
それは今でも何とか続いているっていうような感じです。
社内ではおすすめのプロテインとか、
そういったものをアドバイスとかをしたりしています。
アドバイスをくれるタイプのキャラクターなんでしょうね。
そうですね。スラックのプロテインっていう用語を通知セットにしています。
そうなんですね。
プロテインって叫べば飛んでくるんですか?
そうですね。
そうなんだ。
いちいちちょっと遊ばれてたんですけど、
日本時代にプロテインって言われて。
呼んだみたいな。
でもちゃんとおすすめのプロテイン聞かれたら対応してますんで。
対応する。すごい。責任感がすごい。
通知きましたね。誰か送りました?
いやいや。スティーブ悪い顔してるからスティーブが送ってる可能性あるな。
やりたかった。放送中にプロテインって送りたかった。
ありがとうございます。そんなVAXが。
今回のPGAでの担当としてはどんなところなんですか?
そうですね。僕は2人で開発を基本的にしていて、
なかなか担当をどう分けるかみたいなのがあったんですけど、
一応僕はバックエンドとのやり取りとか、
あと入力回りとか、
あとチャットのどういった技術を採用するかっていうところの
技術選定とかを担当していました。
なるほどね。後でもちょっと話が出てくるかもしれないですけど、
VAXの方が1年ぐらい早くタイムスリーにいたので、
そのあたり裏側の仕組みとのつなげ込みとかが
トレバーよりも知見があるから、
こういうちょっと役割分担に最初してたっていうところもあるんですよね。
はい、その通りです。
プロジェクトの中ではもちろん、
iOSチームとはまた別の会議体とか、
何か開発の流れってあったと思うんですけど、
どういうルーティーンで進んでたとかってありますか?
そうですね、いろんなプロジェクトがあって、
最初はそのプロジェクトと同じように夕会ですね。
夕方にやる会という感じで毎日報告するっていうのがあったり、
あとは企画内容が出てきたときに
みんなで集まるっていうことでやってたんですけども、
そうすると進捗管理がなかなか難しいみたいなことが出てきて、
途中からスクラム開発を導入して、
スプリント計画をして、
そこでうまく回るようになったみたいなこともあったりして、
今はそのような感じでやっております。
そうですね。
進捗の管理とかが基本的に各プラットフォームに閉じてて、
一つの仕様書をもとにiOSはiOSでタスクを切って進める、
AndroidはAndroid、バックエンドはバックエンドみたいな風にやってたんですけど、
それぞれ足並み揃えて一つ一つ機能を作っていって、
早めにみんなが触れる状態にしてフィードバックをもらうっていうのを、
各プラットフォームを横断した形で進捗の管理をしたいねって話になって、
今の体制になったっていう感じですね。
なるほどね。
事前にバックスとトレバーの話を聞いていって、
3つぐらいトピックをお二人からいただいていて、
その話に入っていきたいなと思っております。
それぞれのトピックの詳しい話は若干僕はついていけないところがあるので、
GLにもバトンタッチをしつつ、
そもそもこのラジオを撮ろうってなったきっかけがあって、
トレバーが結構Twitterで発信してくれているんですけど、
ご自身もTwitterで。
そうですね。
ラジオの概要欄にもアカウント載せていこうかなと思う。
ペンギンのペンから飛んでるんで、
Gは発音しないやつです。
ペンタロスね。
はい、そうです。
ペンタロス。
昨日リリースしたときに、
こういう技術使ってますよとか、
こういう工夫してますよというツイートをしてくれて、
それを見て今回詳しく話を聞いてみようとなりました。
事前に出てきたテーマとしては、
データフロー設計の話その1、
あとはUI周りの話ですね。
がその2。
あとはそれぞれ分担とか領域がちょっと違っていたので、
それぞれが見るそれぞれの頑張ったポイント、苦労したポイントみたいなところで、
面白い話があったので聞いてみたいと思っています。
データフローの話については、
先ほどもあった通り裏側とのつなぎ込みとかっていうのは、
VAXがメインで見てたっていうこともあったので、
VAXにちょっと紹介してもらおうかなと思っていて、
UIは取れたんですね。
じゃあ、ジールにバトンタッチ。
そうですね。データフローの話ってことで、
この事前にちょっと話をしたときに、
このチャット開発がそもそもどういうところが難しかったとか、
そういうところ苦労したポイントみたいなのを聞くときに、
やっぱり今までの予定の取り扱いと、
そのチャットの取り扱いっていうところで、
ちょっと違いがある部分があったとか、
そのあたりが結構苦労したみたいなポイントがあったので、
どういうところが難しかったみたいなところを、
VAXとかのほうからお話しいただければなと思いますが、いかがですか。
そうですね。まずそのチャットを開発する場合に、
どういったことを考えないといけないかっていうと、
WebSocketっていうリアルタイムで通信するための規約があるんですけど、
それを使うか否かっていうところなんですけど、
これまでTimeTreeはWebSocketを使ったっていうこともなくて、
あとは予定が基本的にはプッシュ通知へ飛んできてっていう流れになるので、
今回開発期間とかっていうのもあって、
そのWebSocketをいきなり使うっていうのは難しいだろうっていう判断になり、
今回はプッシュ通知によって、
相手のメッセージを受け取ったり、
こちらのメッセージを送信して、
それがトリガーになってっていうところを考えたという感じです。
そうですね。WebSocketはWebSocketなりに苦労があると思うんですけども、
プッシュ通知もなかなかいろんな課題があって、
例えばプッシュ通知ってベストエフォートのサービスになってて、
プッシュ通知が届かないっていうケースがあったり、
あとはエイロードっていう形でプッシュ通知が届いたときにデータが一緒に送られてくるんですけども、
そちらが制約のある中で作るという感じになっていて、
その制約の中でチャットっていうものを実現するのにはどうしたらいいかっていうのを考えていかないといけないっていうのがありました。
そこら辺のメッセージ送受信の規約みたいなのも最初にみんなで相談して決めて、
それに沿ってバックエンドがまず決めてくれて、それに沿ってクライアントが実装していったっていうのがあります。
でもやっていくうちにやっぱりこれ違うなみたいなのがあったりして、
そこから早い調整みたいなのがやっぱりありましたね。
結構クライアント側で気づいてみたいのが結構多かったってことなのかな。
そうですね。当然バックエンド側もやっぱりこういう仕様にしたいみたいなのがあったんですけど、
実装してみて分かることみたいなのが結構…
そうですよね、確かに。
そうなんですよ。やってみて、やっぱこれの方がいいなとか、ここ違うなみたいなのを気づくっていうのはありましたね。
具体的にどんなところとかって今思い出せる範囲でありますか?
そうですね。結構あったと思うんですけど。
メッセージの取り方とか、例えばメッセージを最初に表示するときに、
ここからここまで取るみたいなのがあると思うんですけど、
例えば過去の案件を取るとかっていうのがあると思うんですけども、
そこの取り方をどうするかとかっていうのがあったり、
あとはそのプッシュ通知が飛んできたときに、
クライアント側が適切にメッセージを同期するっていう形をしないといけないんですけど、
そこら辺がうまく動いてないんじゃないかなとか、そういった気づきがありましたね。
結構、タイムスタンプをベースとしたページング処理っていうのが個人的には初めて触ったというか、
いろいろ考えてある部分だったので、その辺もタイムツリーの中では新しい部分だったなと記憶してますね。
割とスラックとかのスラックAPIとかを見ると、
スラックが採用している手段なんですけど、タイムスタンプベースでやるっていうのは、
そこら辺はもうインターフェースはこういう仕様だってことはわかるんですけど、
中でどう動いているかっていうところまでは判断がつかないので、
そこはタイムツリー側でいろいろ調整していこうという流れでした。
マイクロビューまで見てIDにしてるっていう。
そうですね、マイクロビューまで見てます。
それはマイクロビューはかぶらないっていうことが設定の条件としてなってます。
そうすることで、送信環境とかの問題で後から差し込まれたメッセージとかがあったとしても、
タイムスタンプをベースにバックエンドとやり取りすることで、
適切な範囲の中で適切な量のメッセージを受け取れる。
現在時刻から何分前まで20件くださいみたいな問い合わせができるみたいな感じですね。
予定の話とどう違うかみたいな話もしましたけど、
さっきWAXデータフォローとか入力周りとかもやってるみたいな話もありましたけど、
送ってうまくいかなかったときの取扱いとか、そういうところにも違い出ますか?
基本的にはタイムツリーで予定を登録して、
もし通信状況が悪かったりするってこともあるので、
その場合は自動で再送信という形を取ってるんですが、
チャットの場合は自動再送信というより、
失敗したことがユーザーさんの目から見て分かって、
再送信できるっていう形が最適かなということで、
そこは予定と違ってるんですよね。
なるほど。
1時間前に自分が送ったって思ったメッセージが送られてなくて、実は。
次タイムツリー開いたときに自動で再送信しちゃうと、
1時間前に送るはずだったメッセージが今届いちゃうっていう、
よく分かんないことが発生しちゃうので、それを防ぐためって感じですかね。
なるほど。
そのバグがあると途端に夫婦仲が悪くなったりしちゃいますね。
予定は確かにいつ入れるかっていう部分だけの違いが、
そんなにインパクトがないってことなんですよね、きっと。
だけどチャットの場合はいつ届くかっていうところに結構重要なポイントがあるから、
そこは失敗に倒した方がいいよねみたいな話なんですね。
この辺りどうやって決めていったんですか。
他のメッセージアプリとか。
そうですね。結構世の中にいろんなメッセージアプリがあるので、
こちらの動きとかも参考にさせていただいて、実装っていうことも言いましたし、
もちろんタイムツリーではこっちの方がいいよねみたいなのもあって、
そちら側に倒したみたいなのもあると思います。
なるほど。
次そしたらあれですかね、今度UIの最適化とかっていうあたりも結構頑張ったポイントみたいなのがあったので、
UI周りにちょっと聞いていこうかなと思うんですけど、
結構UI周りで工夫した点とか苦労した点とかそのあたりちょっとお聞きできればなと思います。
いかがでしょうか。
そうですね。最初開発基盤担当したって言ったんですけど、
これは主にUI周りのことなんですけど、
3つ課題があって、
1つはタイムツリーのアプリにそのまま開発、そのチャットの機能を組み込んだまま開発しちゃうと、
毎回ビルドに時間がかかっちゃう。動作を確かめるのに時間がかかっちゃうっていうやつと、
あとはバックエンドと用を挑んで開発を始めたので、
実際のデータを受け取りながら開発するというのができない。
UI先行でどんどん作っていかなきゃいけないっていうのを何とかしないといけなかったっていうのが2つ目。
3つ目がすごいパターンが多かったんですよね。
一番作らなきゃいけないテキストメッセージ、自分のと相手のがあったり、
URLが含んであったらOGPを出してあげなきゃいけなかったりとか、
今の一例ですけど、さっきの送信ステータスとかがあったり、送信完了、送信している失敗とかですね。
いろいろパターンが多かったので、たくさんのパターンをできるだけ早く検証しなきゃいけないっていうこの3つの課題がありましたね。
ビルド時間と同時並行で開発しなきゃいけないのと、たくさんのパターンを網羅的に出さなきゃいけない、確かめなきゃいけない。
それぞれ対応するために最初のビルド時間に関しては、完全にタイムツリーと分けたアプリを最初は作りました。
チャットの機能だけを出すアプリを作って、そこでビルドをして確かめられるようなミニアプリを作りました。
2つ目のバックエンドと同時並行で開発しないといけない、UIをどんどん先行で作っていけないというものに対しては、これもミニアプリと綴る部分があるんですけど、
UI部分だけ別のフレームワーク、モジュールとして切り出して、そこでテストデータを自分で用意して、
それもバックエンドから取ってくるとかじゃなくてアプリの中で完結するようなテストデータを用意して、
そこで動作、見た目をバックエンドなしで出せるようにするということをしました。
3つ目のたくさんのパターンを網羅しないといけないというものは、UIの開発部分にSwiftUIを全面的に採用するということで、
少ないサブビルドでたくさんのパターンを出せるようにする、一度に確認できるようにするという工夫をしました。
なるほど、すごい盛りだくさん。
基本的にデータフロー周りとかAPI周りをしっかり考えてくれる、あとは技術選定、そのやり取りをするためのデータフローを整えるための技術選定とかをしっかりやってくれてたので、
その辺何も気にせず、自分はデータを受け取って出すというインターフェースだけしっかり作れば、あとは好き勝手にやっていいという状態だったので、すごい動きやすかったですね。
今回のUIの周りの開発については、新しい技術とかそういうのをうまく使いながらやってたみたいなイメージがあるんですけど、
その辺りについてはどんなものを使ったとか、この辺もしかしたらデータの話も入ってくるかもしれないんですけど、その辺も教えてもらっていいですか。
タイムツリーではもう1年前ぐらいからかな、本格的に本番環境でSwiftUIを使い始めて、
別の機能だとタイムツリーTodayっていう機能があるんですけど、そこでもほぼほぼSwiftUIが使われてるんですよね、その機能単位では。
そこの知見を生かして、チャット側でもSwiftUIを作るという決定をしました。
ただそのTodayもそうなんですけど、SwiftUIちょっと画面遷移周りとかが結構扱いが難しくて、その辺の知見はUIキットっていう動かしながらのフレームワークの方が我々も対応できることが多い。
っていうのがそのTodayの開発で分かっていたので、その知見をそのまま生かして、画面遷移とデータフロー周りとのやり取りですね。
その辺のUIキットでコントローラー部分を作って、実際にデータを表示させる部分、ビュー一つ一つに関してはSwiftUIで実装するっていう形に落ち着いてます。
それ以外の部分、UI周りで言うと、これも去年あたりから全面的に新しく作る部分は採用してるんですけど、
そのUIキットの中でもデータの差分更新を得意としているディファブルデータソースっていうデータソースを使ったり、
あとはセルの登録のところにレジスターっていうのを使ったりしてますね。
チャットのデータ整形ですね。バックエンドから受け取ったデータをそのまま表示するっていうわけではなくて、
クライアント側で表示したいようにデータを整形する必要があるんですけど、
その整形部分にはSwift Collectionsのオーダーセットっていうものを使ったりとか、
整形するアルゴリズム部分ですね。これまんまなんですけど、にSwift Algorithmっていうライブラリを使ったりしてます。
このSwift AlgorithmとかSwift Collectionみたいなやつとかは初採用って感じなんですか?
そうですね。Swift Collectionsはちょっと自分が知らないところでチームメンバーがもしかしたら使ってるかもしれないんです。
あ、違うわ。チャットからそういえばライブラリインポートしましたね。
なるほど。じゃあ初採用。
そうですね。この辺もバックスがこれ使うといいんじゃないかなっていうのを選んでくれて。
技術選定で。
Swift Collectionsとアルゴリズム、それぞれAppleの紹介動画ではチャットが例でこういうふうに使えばいいよっていうふうに出てるんですよ。
Swift AlgorithmもSwift Collectionsも。
コレアみたいな。
そうですね。見た瞬間コレアってなって、ユースケースドンピシャーのものを見つけられたので。
すごいですね。なんか自分たちのために作られた動画かと思いました。
そうですね。
僕たちのために言ってくれてるみたいな、Apple側みたいな。
それがあれか。事前に聞いた去年、前回のWWDCの発表があったやつ。
昨年。
バックスがこの動画使いそうじゃないみたいなふうにスラックで給付してくれてたんですけど、本当にやりたかったことがそのまま紹介されてたんですよ。
なるほど。
具体的に言うと、みなさん他のメッセージングアプリとかでも日付ごとにラベル入ってるじゃないですか。何月何日はここから、何月何日はここからみたいな。
セクションみたいなやつ。
あとはお互いの仕様の認識違いとかがあったりしたんですよ、クライアントとサーバーの。
その辺ちゃんとクライアントデータフローの設計とかやってくれてる時にバックスが気づいて、バックエンドとやり取りして仕様を固めていってくれたっていうのもバックスなんで、
その辺はすごい自分もこれね、バシバシやっていかないとなって思いながらやってました。
なるほどなるほど。
なんか想定しているデータが返ってこなかったりっていうのはバックスがいち早く気づいてバックエンドにバグというかレポート上げてたりとかしてるのを覚えました。
これは載せられるかわかんないですけど、開発の終盤ですね、リリース1週間前ぐらいにバックスが霊の風邪を引いてしまって。
霊の風邪、霊の流行ってるやつ。
それで世間的に流行ってる霊の風邪が引いてしまって、その時はすごい心細かったんでね、改めて存在の大きさ、でかさを感じたところです。
そうかそうか、結構離脱しますもんね、あれになると。
なんでこのタイミングなのかなっていう。
これまでいっぱい流行ってきたのに、そこまで何もなかったのにね。
自分がかかったぐらいの時にだいたい収まり始めたんですよね。
じゃあ最後、それぞれ15秒間のPR枠があるので採用アピールをお願いします。
じゃあバックスからいきますか。
そうですね、もしタイムツリーって言うとカレンダーっていうイメージがあると思うんですけども、実際にはいろんなことをやっていて、その一つがカレンダー統計っていうのもあると思います。
特にカレンダーに興味がないとかっていう方もぜひタイムツリーの開発に興味を持っていただけたらなと思っております。
ありがとうございます。
Appleが発表したりとか、スイストの最新機能とか、こういった最新のものを触れる環境があるので、そういうの興味ある方はどんどん来ていただいて、一緒にタイムツリーの中身を進化させていけたらなと思ってます。
あとは雑談会も最初話したんですけど、すごいiOSチーム仲良いので、その仲の良さを感じに一回雑談会に参加してみるとかでもいいんですけど。
ゲスト参加できるんですか?
ゲスト参加できますよ。
新メンバーのシングとかニーガンとかは、iOS毎日朝会やってるんですけど、採用前にその朝会に参加してもらったりとかしてましたね。
本当にカジュアルにいろんな話できると思うんで、興味がある方連絡いただけたらなと思います。
はい。放送の概要欄にもカフェミーティング、みんなと気軽にお話しできるような面談のフォームとかも貼っておくので、興味がある方ぜひ。
はい。
はい、じゃあここまでいろいろ詳しく聞いてきましたチャット開発の話なんですけど、
多分ですね、これあと5回、6回ぐらい放送続けられるぐらいバックとかトラブルの話とかいっぱいあると思うんですけどね。
またおいおいちょっとずつネタが出てきたらこざしにしていければなと思って。
そうですね。
僕が聞いても結構面白かったんで、お二人様ありがとうございます今日は。
ありがとうございました。
また機会があったらぜひよろしくお願いします。
ぜひぜひお願いします。