DropboxのThe (not so) hidden cost of sharing code between iOS and Android という記事を読んだ。
異なるプラットフォーム間で共通のc++のコードを使った開発をしようとしたが、1回しか開発しない利点よりも、共通のコードで開発をすることによるオーバーヘッドが大きくなってしまったため、それをやめてちゃんと本来の言語で開発するようにした話。
4つのカテゴリにオーバーヘッドを分類している。
1つ目はライブラリとフレームワーク。本来その環境で使えたライブラリの置き換えや、それぞれのプラットフォームでc++を使えるようにするためのツールなどを使う必要があった。しかし、それらは本来不要なものだった。それらのOSSに貢献はしたが、本来の環境のほうがより良い貢献がて来たはずと考えている。
2つ目は開発環境の話。GoogleやAppleはIDEなどの環境を使わないことで、特にデバッグが大変だった。また、ツール以外にも頻繁に更新されるAndroid/iOSの開発環境に合わせて、c++の開発環境を作り続けるのにも大きな時間をかける必要があった。(XcodebuildとGradleの両方に対応し追従する必要がある)
3つ目は、異なるプラットフォームへの差分の対処の話。例えばカメラロールなど、iOSとAndroidが同じモバイルアプリといえども、実装に影響を与える違いがあった。その結果、実装は1回だけでは終わらなく、異なるプラットフォームでは動かせないということが起こる。多くの時間を統合のために費やして、プラットフォーム固有のコードを書く必要もあった。これによって、コードを1度書けばよいという利点は、大きく損なわれてしまった。
4つ目は、訓練と採用と人材の維持の話。モバイルの開発者と、c++でスタック開発を続けるという業務内容がマッチしなかった。一般的に、モバイルの開発コミュニティは新しい技術やパターンが頻繁に出てきてそれらが採用されていく。最良な開発者は最新の状況についていきたいと考える。標準的なスタックのようなものに対して、最新の技術とチャレンジを追求するのは相反している。
1回だけ実装すればよいというのが、実際にはそうならなかったという実装的な面と、それをやりたいエンジニアがいなかったという人材的な2つ問題が理由となって、dropboxでは、c++で共通のコードを開発することをやめた。