この記事ははてなデベロッパーアドベントカレンダーを始めます - Hatena Developer Blogの最終日の記事です。昨日は id:ichirin2501 の MySQLでINSERTのデッドロックに嵌る人を1人でも減らすために - ichirin2501's diary でした。
こんにちは、id:stanaka / @stanaka です。今年のはてなデベロッパーアドベントカレンダーも最終日です。
2015年もSwiftのOSS化から、JavaScriptでデスクトップアプリを書けるElectronや、 Chainer, TensorflowなどのDeep Learningライブラリ、AWS RDSのAuroraの東京リージョンでのリリースなどなど、 大小様々な技術が登場しました。 はてな社内でも新しい技術の採用方針については時々議論になるのですが、 社内向けに書いた技術選択を考えるための観点について整理したものを紹介します。
ここでは技術選択の観点として、技術そのもの、技術の適用先、開発組織、そしてエンジニア個人の4つの軸を取り上げてみました。
(ちなみに、ここでの技術選択は、いわゆるWebサービス/スマホアプリ開発のための技術を想定しています。 技術そのものをサービスの競争優位の中核とする場合は、よりリスクをとった選択をする必要がでてくるでしょう。)
技術そのものの観点
- その技術が使えるもので筋が良いかどうか
- ある技術を採用する際には、解決したい課題があるはずでそれをちゃんと解決してくれることが必須条件でしょう。
- その上で筋がよいことが期待されます。筋が悪い技術を採用してしまうと、1年後には誰も使っていない、という状況になってしまうことになるかもしれません。
- 信頼できる人/会社での採用実績があるかどうか、で判断するという手もあります。
- 安定しているかどうか
- 新しく登場した技術は枯れておらず不安定ですし、時間が経つと徐々に枯れて安定します。githubで公開されているOSSの場合はissueの活発さなどは参考になります。
- バージョンが上がる際に、どれほど後方互換性に気をつかってくれるか、というコミッタの方針にも影響を受けます。気軽にバージョンを上げたら動作しなくなった、という経験は誰しも持っているものでしょう。
- このあたりは、 イノベーター理論で考えてもよいでしょう。技術のユーザーが増えれば増えるほど、安定して使えることが期待できます。
- 代替技術へ撤退可能かどうか
- 技術の採用はリスクがあり、ある程度の確率で失敗するものです
- 失敗した場合に別の技術で置き換えることがどれぐらい可能か
- OSSの場合、技術の方向性にキャッチアップできるか、影響を与えられるか
- 積極的にissue登録する/pullreqを送る、コミッタになることによって、その技術に関する情報やノウハウを入手しやすくなったり、方向性に影響を与えることができるようになり、結果としてよりうまく技術を使えるようになりやすくなります。
技術の適用先の観点
- 適用するサービス/システムの規模/想定寿命はどれぐらいか
- 期間限定のキャンペーンと、10年使われる可能性のあるWebサービスでは、技術選択の方針は大きく異なります。期間限定のもので実験的にリスクのある技術を採用してノウハウを蓄積し、それを長寿命のサービスに生かす、というのは王道パターンだと思います。
- 予想以上に使われ続ける可能性はあるか
- たいていのWebサービスは予想以上に使われ続ける可能性はあると思っています。はてなブックマークは今年10周年を迎えましたが、過去のコードやデータスキーマはまだまだ現役です(途中一度リニューアルしていますが)。少なくとも技術的要因でサービスを閉じることになってしまうのは、エンジニアとしては避けたいものです。
- 使われ続ける時にリソースを割き続けられるか
- システムを動かし続ける以上、多少のメンテナンスコストはかかり続けますし、仕組みが古くなるとメンテナンスコストは上昇していきます。技術を採用した際に将来のメンテナンスコストまで思いを馳せておきたいものです。
- はてなブログはリリース後、4年経過していますが継続的に開発し続けることで技術的負債が増えすぎないような取り組みをしています。id:hitode909のYAPC発表 Perlの上にも三年 〜 ずっとイケてるサービスを作り続ける技術 〜やid:amagitakayosiの東京Node学園祭2015での発表 フロントエンドに秩序を取り戻す方法でそこからの知見を公開しています。
開発組織の観点
- その技術を使えるエンジニアを必要数、育てられるか
- 新しい技術を採用した場合は、それを扱えるエンジニアが必要になります。特定の人だけがそれを扱える場合は、異動などの際の障害となります。はてなでは、はてな教科書( https://github.com/hatena/Hatena-Textbook )にSwiftやScalaなどの新規採用した技術についてのドキュメントも増やすようにしています。
- 開発/運用ノウハウを維持できるかどうか
- 組織が成長すると新しいエンジニアが入ってきますので、彼ら/彼女らにも教育を施して戦力化しなければなりません。はてなでのノウハウのチーム間での横展開のための社内技術勉強会を毎週開催しています。
- 採用に有効かどうか
- いまでもある技術を採用している、というのは採用に有効です。言語やミドルウェアだけではなく、機械学習、インフラ、最近はIoT関連など、サービスを作る上で使われている技術やそのノウハウを公開して、自社に興味をもってもらうことも重要です。
エンジニア個人の観点
- その技術を習得するモチベーションがわくかどうか
- 技術の習得は、個人的なモチベーションに寄るところが大きく、モチベーションがわかない技術はいくら時間をかけてもなかなかモノにはできません。各エンジニアの好奇心を喚起したり、キャリア構築に有利となるような技術はモチベーション向上に寄与するでしょう。
- どれぐらいの時間でモノにできるか
- これまでに習得してきた技術とは考え方が違ったり、そもそもまったく別の分野の技術を習得するのには時間がかかります。アウトプットを期待される時期に対して勉強する時間を十分確保できるかどうかも鍵になるでしょう。
まとめ
技術が進歩する限りはより良い技術を選択し続ける、というのは永遠のテーマかと思います。 新しい技術を採用することは当然リスクもありますが、そのリスクをうまくコントロールしながら技術的ノウハウを蓄積していくことで、 モダンかつ厚みのあるエンジニアリングチームを作っていけるのではないでしょうか。
2016年も新しく登場する技術を取捨選択しながら、楽しいエンジニアライフを送りましょう。では、よいお年を!