「なぜDartなのか」CTO石川が技術選定に込めた想いとその背景

2020/6/22

2017年11月にリリースした献立アプリ「タベリー」の開発では、iOSはSwift、AndroidはKotlinを選択していた10X。サーバーはGoogle Cloud PlatformのKubernetes Engine、言語はGoを使用していました。2020年5月にリリースした「Stailer」では、モバイルアプリのフレームワークをFlutter、インフラはGoogle Cloud Platform、開発言語はどちらもDartを使用しています。今回は「なぜその技術選定に至ったのか」、「どういった経緯で選定していったのか」についてCTO石川洋資(@_ishkawa)にインタビュー。聞き手は、前回と同じく10Xのソフトウェアエンジニアである北 裕介(@kitasuke)です。


石川 洋資 | @_ishkawa (※写真奥)
Co-Founder, 取締役CTO
面白法人カヤック、LINEでの複数の新規事業開発を経て、メルカリ/ソウゾウへ。 メルカリ/ソウゾウではプリンシパルエンジニアを務める。オープンソースプロジェクトへの参加や執筆活動も行っており、2017/2には「Swift実践入門」を出版
北 裕介 | @kitasuke(※写真手前)
Software Engineer
メルカリUSでモバイル・バックエンドチームのTech LeadやEngineering Managerを務める。その後、メルペイでエキスパートチームのSwift担当として、社内の基盤作りやSwiftコミュニティへの貢献を担う。Swiftコンパイラを学ぶ「わいわいswiftc」や「SwiftcKaigi」の主催。

※なお文中の「10X」は社名を、「10x」は十倍、非連続を意味します。

全員がマルチスキルな10Xの開発チーム

北:今日はStailerにおける技術選定の話を聞きたいです。よろしくお願いします!

石川:よろしくお願いします!本題の前に、Stailerの技術選定には10Xの特徴的な開発体制が大きく関係してくるので先に説明させてください。今10Xには私も含めて7名のエンジニアが在籍していますが、全員がサーバーもモバイルアプリも開発できるマルチスキル集団です。そのため、基本的に1機能のサーバーとモバイルアプリの実装は1人で済ませることが多いのが特徴的だと思います。

北:そうですね。詳しくは前回のブログにも記載しているので、未読の方は是非ご覧ください。

効率的に開発できるFlutterを選択



北:まず最初に、モバイルアプリのフレームワークにFlutterを導入した理由を教えてください。

石川:実はFlutterを採用することは、Stailerの開発が決まった時点でほぼ決めていました。タベリーでは1つの機能を開発する時に、1人のメンバーがサーバーもiOSアプリもAndroidアプリも担当していました。せっかく機能の開発を1人で完結させられるのに、iOSアプリとAndroidアプリで似たようなコードを2度も書くのは冗長ですし、実装の断片化をわざわざ取り込みに行ってるようなものだと感じていました。Flutterを採用すれば開発の冗長性は解消できるし、実装も統一できます。開発ツールやドキュメントの充実、コミュニティの拡大など、信頼できそうなポイントが多くあることも、採用の後押しになりました。

北:逆にFlutter導入で懸念していたことはありますか?

石川:ユーザーインターフェースの品質が下ってしまうことですね。この点をクリアにするために検証を納得するまで行いました。

北:検証にはどれくらいの時間を使って、どういうポイントをチェックしたんですか?

石川:2週間ほどです。想定される構成のアプリを自分の手で作ってみて、手触りや開発コストを確認しました。「クロスプラットフォームにありがちな偽物感をどの程度抑えられるか」「iOSとAndroidで使われるコンポーネントは再現可能か」「iOSとAndroidのUIの分岐をコンポーネントレベルに閉じ込められるか」などが、実際に作ってみてよくわかりました。この検証期間を経て、十分な品質のアプリが妥当なコストで作れると確信したため、導入に踏み切りました。

北:実際Flutterで開発していて困っている、心配していることはありますか?

石川:もちろんすべてが完璧ではないですが、Flutterの開発チームが対応を進めているのがわかっているので特段心配はしていないですね。それよりもやはり実装が1つにまとめられることは相当なアドバンテージで、享受しているメリットが大きいと実感しています。

北:確かに実際手を動かしてみて、開発も効率化できているし実機での検証なども効率的と実感する場面が多いですね。

GoではなくDartを選んだ理由

北:次に開発言語について教えてください。今回Dartを採用していますが、Dartってチャレンジングですよね。Goではダメだったんですか?

石川:タベリーの時は自分に馴染みがあり、開発体験も良く、GCPのサポートが厚いという理由でGoを選びました。ただGoだと言語仕様上、表現の幅とコンパイル時に検証される範囲が狭いので、注意を割かないといけなかったり運用でサポートしないといけないといった点があり、違う言語を探そうと思ったんです。Goが適した場面は色々あると思うのですが、自分たちがアプリケーションを記述する言語に求めるものとは一致しないなと思いました。



北:Dartはどういった経緯で選んだのですか?

石川:まず代替としてはSwiftとKotlinも考えましたが、iOSとAndroidでの経験から規模が大きくなるとコンパイルが遅くなって、開発の生産性に深刻な影響を与える可能性がある。それと、SwiftやKotlinにはXcodeやIntelliJが実質必須であり、エディタの自由がないのも躊躇するポイントで、最終的には選択肢から外しました。次に、求める言語の表現の幅を満たしつつ、開発体験が良い言語として、TypeScriptが候補に挙がっていました。TypeScriptにはGCPのSDKがある程度揃っており、JavaScript由来のデメリットは想定されますが、無難な選択肢ではあったと思います。

同時期のFlutterの検証を通じて、Dartも開発ツールが充実していることは分かっていました。DartにはGCPのSDKは全くありませんがgRPCが使えれば実装できるし、選択肢に入ると思いました。最終的には2週間ほどの検証を経てSDKは実装できると判断し、正式にDartを採用することに決めました。多くのメンバーがサーバーとモバイルアプリの開発を兼任するので、言語を揃えればスイッチのハードルを下げられるというのが決め手になりました。

北:実際にDartで開発してみて、どう感じていますか?

石川:そうですね。モバイルアプリとサーバーが同じ言語だからと言って、考えることは全く異なりますし同じように開発できるわけではないです。ただ言語が統一できると言語のツールやプラクティスが再利用できますし、切り替えのストレスが少ないので、良い選択だったと思っていますね。

北:Dartは初心者でも書きやすいですよね。それに慣れると効率よく書けるし、あんまり癖がない言語かなと思います。なんかモダンなJavaみたいな印象ですね。

「10Xバリュー」を体現したStailerの技術選定

北:サーバーもモバイルアプリも両方開発出来る人を採用しようと最初から思っていたんですか?

石川:いえいえ、そういう訳ではありません。どちらも出来る人が自然と集まってきた、というのが実情ですね。今も役割を分けないのはこの体制が生産的だという実感があるからです。役割を分けるとどうしても溝が出来やすいですし。今後もこの状態は続けていきたいし、Stailerの技術選定はこの体制を維持しやすいと思っています。



北:というと?

石川:もちろんドメイン知識は人それぞれ違って、モバイル中心の人もいればサーバー中心の人もいます。ただローテーションはカジュアルに行えていると思います。コードは担当メンバーがその時の状況に合わせて適切に書き換えていきますが、ローテーションすることで書き換える方の背筋も伸びるし、書き換えられる方も任せられる、という関係性ができています。「自律」的に動いていないと書き換えないし、「背中を合わせて」いないと任せられない。前提をたどれば、書き換える理由は「10xから逆算」した結果でもある。10Xのエンジニアチームはこうやってバリューを体現しています。

北:今、採用フォームはモバイルとサーバーと分けていますが、意味があるのですか?

石川:採用フォームはあくまで入り口として分けさせてもらいました。自身が得意だと思う方を選択してもらえればと思います。もちろん最初からモバイルもサーバーも全部やって欲しいという意味ではなく、得意な領域から開発してもらい、徐々に自分の領域を広げていってもらえれば良いと思っていますし、今の10Xにはそういった成長環境が揃っていると思います。

北:それは入社3ヶ月めの僕も実感しているところです。今日はありがとうございました!

この記事に関連する求人情報
ソフトウェアエンジニア(サーバー)
ソフトウェアエンジニア(モバイルアプリ)

RECRUIT

10xへの到達率は、まだ0.1%。
あなたの力が、必要です。

JOIN OUR TEAM

CONTACT

10Xへの取材依頼やお問い合わせはこちらから。

CONTACT US