すずけんメモ

技術メモです

懸垂機できました #vgadvent2013

せっかくなので今年の振り返りをしてみます。個々エンジニアのタイムライン追うことはなかなか無いと思うので、そんな視点で楽しんでいただけると嬉しいです。

クリスマスってなんで蟹じゃなくて鳥なんですか?

1-3月: 分析から始まった1年, HiveとかMahoutとか

この頃はユーザの行動分析的なことを少しやっていた。

それとこの時期は協調フィルタリング周りを触って回したりしていて、実際の問題に適用した時の閾値の設定に悩んだりした。方法自体はシンプルなことをしていたのだけれど、所謂Web上の行動データを対象とした時にはデータの持ち方や効率性ということを考えると工夫の余地が色々あったりして面白い問題だった。よくある議論の種として、ある商品の閲覧情報をベースとしたレコメンデーションをする場合に、ユーザの類似性を利用するか商品間の類似性を利用するかによってシステムの作り方が変わるという点がある。理論を練るという点とこういう系統のシステムを作るという点はある種のコツが必要で、うまくはまるように設計すると最終的には綺麗な世界のコードに落とすことができた。協調フィルタリングの計算は一時期Mahoutも使っていた。今は使っていない。Hive + Hadoop Streaming (mapper)でデータ前処理してMahoutに突っ込むとか、今考えると結構クレイジーなことをしていた。この頃の愛著はMahout in Action (Manning)だった。

またこのころの知見として、実際に動いているデータをモニタリングするということの大切さを痛感した。毎回集計ジョブをHiveで走らせていては頭のなかでやりたいと考えていることがなかなか返ってこなくて非常にストレスフルだった。準リアルタイムに現状を把握するということはこういうタスクについて非常に有効だし必須な手段で、それが今のプロダクトの設計にもつながっている。この頃は頭ではわかっていたもののそういった便利なモニタリング系統を準備出来ていなくて苦労した。このあたりのことは定点観測の仕組みを作る上でのベースになっている。ただ相変わらずHadoop上でしか集計しづらいようなデータというのも当然あって、そのあたりの住み分けをいい感じにしないとPDCAも何も、本番投入して終了、というようなことになってしまっていて全くの本末転倒なことになりかけていた。ログをみたら、GrowthForecastは3月には設置していたらしい。

あとこういうことをしながらフロントのAPIも相変わらず実装していて、ログの回収から分析のタスクからフロントのAPIまで結局やっていた。今思うともう少し分業できたほうが良かった。そんな中、去年から見ていたJenkinsおじいちゃんの面倒を見ていたりした。カオスだ。

個人的にはこのころの成果にあんまり満足できていなかったっぽい。このころの社内エンジニアリング事情をちょっと書いていた。

あと若手Webエンジニア会があった。

4-6月: 少し自由になって手を広げる時期

1つ下の代の新卒の子たちが入社してきて、この時点で新卒2年目に。4月から少し立ち位置とチーム編成が変更に。このころはもうちょっとDMPについてちゃんと知ろうということで海外の事業者の情報を集めたり、論文を読んだりしていた。広告関連論文の輪講をしていたのもこの時期。業界的にDMPというものの認識が米国と日本で少しずれていて、そういうトレンドを日本側が把握していこうとしていた時期だった。

このころは所謂広告データのための基盤づくりを始めた頃。とはいえ前Qからのデータ分析タスクも残っていて、データのWeb上での回遊というのを分布に当てはめて検定してみたりしていた。所謂アトリビューション分析という概念をちゃんと把握したのはこの頃で、ああ自分がやろうとしていて取り組んでいたのはこういうことだったのだなと頭のなかが整理されたのを覚えている。綺麗にやろうとしていても実際の作業の9割はデータの前処理だったりして、どういうデータを得てどう整理していこうかということばかり考えていた。

少しだけネットワーク分析的なことも試していた。前QでやっていたHiveによって前処理していたデータをCytoScapeに突っ込んで俯瞰してみたり、Rでネットワーク関連係数を出して眺めたりした。Sessionizeしたユーザの行動パターンを俯瞰するにはこういったグラフに落としこむというのは直感的だった。長期間にまたがった時の傾向や特定ユーザのパターン(たとえばnode aからnode bに遷移したユーザのみ)などに絞り込んで全体を把握するということは有用な知見をもたらしてくれた。ただ同時に、いわゆる行動パターン自体のモデリングにドメイン知識が多く必要であるということもわかった。僕らが知らないパターンも、実は運営しているディレクターの方が知っていたりする。

そんな分析タスクを少しやりながら、4月から任せられていた基盤作りもしていた。設計を仕立てた上でひとまず管理画面を作ってもらったり作ったり、裏側のストリーム処理の仕組みを作ったりした。基本的にはデータをストリーム処理するパイプのところを優先的にデザインしていったので、最初の設計から大きく変わらずにローンチまで持って行くことができた。DynamoDB + fluentdの採用を決めたのもこのときだった。それまでにバッチ処理によって機能要件を満たせることはわかっていたので、あとは如何に即座に反映され、簡単に利用でき、コスト効率の良い基盤を作るかということをスコープに入れていた。このときの選択は今でも系全体に良い影響をもたらしてくれている。ちなみにこの前の段階ではMongoDBをコアのデータストアとして利用して、運用上の様々問題を引き起こしていたが、DynamoDBを利用するようになってからはそういった問題からは解放されている。うまく用途に合ったのだと思う。このころにGlobal Secondary Indexがローンチされていたら、もっとスムーズに判断を行えていたと思う。

あとこの頃は嬉しい事に、アドテク周りのエンジニアの方々とお話できる機会が。

相変わらず交流会もやった。

6-7月: 課題だらけのリリース、学びの多いリリース

で、この後に7月頭でのリリースがあったのだけれど、これが課題だらけになってしまった。端的にいうと、

  • インフラメンバーに相談するのが遅れて迷惑をたくさんかけてしまった
    • キャパシティプランニングできたのがリリース2週間前だった
    • 一つボトルネックを解消して、ベンチして、またボトルネックを見つけて、ベンチして・・・・
    • しかし本番と似た傾向のトラフィックを受けてまた失敗
    • 原因はDynamoDBへの接続コストだった。結局apiをScalaで実装しなすことになる。

結局いろんなエンジニアに頼って、お願いして、試行錯誤して考えて実装して、そしてまた失敗してお願いしなおして…というのを繰り返した。インフラチームにはかなり無理をいって融通を利かせてもらったし、僕よりミッションクリティカルなシステムのローンチを控えていたクルーにも助けてもらった。この時期が一番ひどいエンジニアリングをしていたし、最も勉強になった時期だった。その辺の話は 学びの多かった6月の振り返り | Source にも書いた。コアだったデータの書き込み部分や収集部分というのは安定して稼働していたけれど、api系統の調整で完全にいろんな人に迷惑をかけてしまった。api書きながらHiveクエリ書いてstream用プログラム書いてJenkins用デプロイスクリプト書いてモニタリングできるように整備して…とかいろいろ並行してやっていた。GitHubのパンチカードを振り返ってみると、このときの1週間は土日も出てきて、平日も深夜まで残っていて大分ラストスパート感に溢れていた。これが心の傷か。*1

曖昧な設計書

7-9月: 稼働するシステムを整備し、改善し続ける

そんなぎりぎりのリリースになってしまったので、ひたすら整備業をしていた。

  • vagrant + puppetでapiサーバのテスト環境作成
  • EC2タグで設定切り替える仕組み作り
  • apiのE2EテストをJenkinsで
  • 開発者環境でもJenkinsでも同様のテストを行えるようにアプリケーションを疎に
  • apiをScalaで再実装

それと夏インターンTreasureのメンターをやったりした。僕のチームは地球を作っていた。なかなかクールだった。

道具を揃えてカイゼンする

10-12月: もっと良い物が見えるように、やはりまだ整備し続けた

引き続き整備業をしつつ、いろいろ進めた。

  • ElasticSearch + Kibana3の検証
  • DynamoDBのデータをHive + Sqoopでバックアップ
  • 古い管理画面をapi化して、新しい管理画面にごっそり移行
  • JenkinsからPull Requestにテスト結果を通知できるようにした
  • スロークエリログをチームメンバーが見やすくするようにする仕組み作り
  • ソフトウェアメトリクス測定の仕組み作り
  • バッチジョブ通知系統の刷新

これもエンジニアリングだ by @katzchang

Jenkinsの運用周りについては アプリケーションポータビリティとJenkinsの有り方に関する所感 - すずけんメモ でも書いたのだけれど、よりシンプルに役割の分離が進みつつある。本当は外部のCIサービスでも上手く回るようにしたいんだけど、まだそこまでうまくアプリケーション側を整備できてない。

第6回若手Webエンジニア交流会 #wakateweb on Zusaar は10月にやった。

また、AWS re:Invent 2013に行かせてもらった。初めての海外カンファレンスだったけれど、いろんなエンジニアとも話せたし、セッションも勉強になるものが多くて有意義だったし、刺激をもらった。

蟹画像を加工していたら22時になってしまった。

それと、サブロク会議という、弊社全体で経営課題について議論する会があって、去年に引き続き参加させてもらった。一年を通して「データをまとめあげていい感じに使う」というタスクに取り組んできたけど、そういうものが後々技術スタックとして活かせるのではないかと考えを巡らせることができた。また、専門家ではない人に自分の仕事を上手く伝えるよう努力しなければならないということも感じた会議だった。いくらエンジニアが汎用的に使える仕組みを作っていても、それを上手に説明しないとその素晴らしさが伝わらないと思っている。なのでそこは引かないで努力するようにした。

まとめ

懸垂機できました*2

こうみると今年も色々なことに取り組み、そして社内外含め色々な方にお世話になった年でした。みなさま本当にどうも有り難うございました。まだまだ来年もやりたいこと山盛りです。

ということでこの記事は、VOYAGE GROUP エンジニアブログ : Advent Calendar 2013 最終日、24日目の記事でした。祝完走!