こんにちは。
メディア広告部門(MDH) ADテクノロジー局のサーバサイドエンジニアの小林です。
17卒で入社したての新米社員ですが、早く事業部貢献できるように日々頑張っております。
今回は僕がMDHに来てから初の外部向け勉強会「オレシカナイトvol.2」が開催されましたので、その様子をお伝えしたいと思います。
発表は以下のとおりです。
- 1年目でgolangとscalaを触った話
- DSPでGolangの屍を超えた話
- Java、scalaをやってきてgoに思うこと
- マイクロサービスのためのフレームワークgoaのご紹介
- Goにおけるテスト可能な設計 – Javaとの比較
そもそもオレシカナイトとは・・・?
「俺(オレ)達の屍(シカ)を越えて行けナイト」の略とのこと。
MDHのエンジニアが新規技術に挑戦するにあたって踏んできた地雷をお披露目する会です。
今回は最近MDH内で盛り上がっているGo言語がテーマでした。
GoはMDH内に限らず社内外でも採用事例が増えており、今後注目の言語ということで沢山の方々にお集まりいただきました。
1. 1年目でgolangとscalaを触った話
はじめに、16卒MDHエンジニアの大江がGoとScalaを使ってみて感じたことについて発表しました。
要約すると「Scalaには苦しめられたが golangはシンプルで幸せだった話」と言うことで、この言葉だけでもScalaに対する恨みの大きさが伝わってきます。
Scalaのよく言われる特徴として高機能の代わりに覚えるのが大変と言うのがありますね。
大江はその問題に言及しつつ、Scalaは人によって書くコードが結構変わるが、Goはシンプルな分そのような問題がなく、大規模プロジェクトでもスムーズに開発できたとのこと。
筆者も研修でGoを使いましたが、他人のソースコードの読みやすさに感動しました。
2. DSPでGolangの屍を超えた話
次は、MDHエンジニアの片田です。最近はTableauにはまっているそうです。
DSPでは標準化されたプロトコルの制限で100ms以内にレスポンスを返さなければいけません。
GoでDSPを開発した際、この100msの壁が超えられずに苦しんだが、Go標準の超優秀ツールpprofを使ってチューニングしたらハッピーになれたと言うお話です。
Goだとgoroutineを使うだけで簡単に並列処理が記述できてしまうため、ついつい安易に使いがちですが、そこに罠があったなど、まさにオレシカナイト!という発表でした。
3. Java、scalaをやってきてgoに思うこと
続きましては、株式会社AJAの森によるgoでの末尾再帰最適化についての発表です。
末尾再帰というのは再帰関数の中でも、関数の最後が自身の関数呼び出しで終わるものです。
通常の再帰関数は、関数コールのたびにコールスタックが成長するため、呼び出し階層が深くなりすぎるとstack overflowしてしまいます。
一方、末尾再帰による再帰関数はコンパイラによりループに変換することができるので、stack overflowすることなく、実行速度も若干改善します。
これが末尾再帰最適化です。
関数型言語では一般的な機能ですがGoでは存在しないとのこと。
メーリングリストでは部分的に対応しているとされていますが、末尾再帰最適化が効くコードは発見できなかったそうです。
悲しい。
4. マイクロサービスのためのフレームワークgoaのご紹介
休憩が明けてからの発表はMDHエンジニア渋江によるgoaの紹介です。
goaはマイクロサービスのためのフレームワークでDSLを書くだけでルーティング、バリデーション、コントローラー、swagger specを自動生成してるとのこと。
これは便利。
ただ、エラーハンドリングをする際には自分でmiddlewareを実装しないといけないそうで、若干ハマったそう。
これはめんどい。
しかし、ビジネスロジック以外の部分(特にswagger)が自動で生成されるされるのはとても便利そうなので、筆者も機会があったら検討してみようと思います。
5. Goにおけるテスト可能な設計 – Javaとの比較
トリを飾るのはMDHエンジニア大澤による自動テストについての発表です。
今回は自動テストの中でも単体テストに焦点を絞り、依存性の話から始まり、Java、Goにおける実装方法の比較を行いました。
まずは単体テストで重要な、依存性の分離ついてのおさらいです。
依存性の分離を行わないと、依存するコンポーネントのテストが連鎖的に失敗したり、外部システムに依存するテストになってしまったりと、信頼性の薄いテストになってしまいます。
次にJavaにおいて依存性の分離を含めた単体テストの実装をどのように行うかの解説です。
Javaは長年培われてきた資産のおかげで、ほぼ制限なく安全なテストコードをかけるといいます。
更に、その比較としてGoでの単体テストの実装について考察しました。
そして、Goではその言語機能からどうしても安全でないコード(テスト用のコンストラクタを通常コードで用いてしまう等)が発生しうるので、プログラマの責任が比較的大きいという結論にたどり着きます。
これは筆者も最近悩んでいる問題でもあり、テストコードのことを考えるとJava系の言語の偉大さがよくわかります。
以上が、今回のオレシカナイトのレポートになります。
次回は(も)ぜひご参加ください。
次回のオレシカナイトは…
2017年9月27日(水)19:00~ (18:40受付開始)開催します!
今回のテーマは…
「Ameba広告システムの裏側見せます-オレシカナイトVol.3-」
以下URLからエントリーください。
https://cyberagent.connpass.com/event/64176/
皆さまのご参加を心よりお待ちしております!
Profile:
株式会社サイバーエージェント
メディア広告部門(MDH) ADテクノロジー局
サーバサイドエンジニア
小林賢
▼メディア広告部門(MDH)
Ameba Ownd:https://ameba-ad-pr.amebaownd.com/
Facebook:https://www.facebook.com/AmebaAds.CyberAgent/
Twitter:https://twitter.com/amebaads_pr