Wantedlyの技術スタック、まるっと公開。WANTEDLY TECH BOOK 2刊行!(目次付き)

昨年に引き続き、今週末の日曜日(4/9)にアキバ・スクエアで開催される技術書典2で、Wantedlyがどのような技術を駆使してプロダクトを開発して来たのかをまとめたWANTEDLY TECH BOOKを頒布します。

それに先立ち、Wantedly執筆部で編集長を務める、Androidエンジニアの住友さん(@cattaka_net)に話を伺いました。

「例えば、GoとかDockerとかの正しいドキュメントは世の中に沢山あるけれど、正解の情報だけじゃ世の中は成り立たない。サービスの中に新しい技術を取り入れていく中で、どういうことに困るのかは、実際にサービスを運用している人でないとわからない。エンジニア達は、そういった生もの的な情報が手に入りにくい。手に入るとしても、ブログ記事でメモ書きのように残されたもので、そこにたどり着くまでも大変。自分たちが新しい技術を運用していく上で、自分たちにしか言えないことを世の中に共有すべきだと思ったんです。」

自分達のサービスに有用だけど散らばっている情報をまとめ、チームの中で共有していくことがサービスを開発していく上で大切だと、住友さんは話します。

「昔から変わらない普遍的な情報は学校の教科書。5年、10年のスパンのものは商用の技術書。逆に、数日とか、数週間とか一過性の情報のものはブログとかネット上に沢山ありますが、それらを直接実務に使える形でまとめられたものはなかなか見かけません。というのも、そういった情報は移り変わりが激しい業界では賞味期限が1、2年しかない上に、ターゲット層がニッチであり、商業誌でも扱いにくいジャンルなのだと思います。だからこそ、WANTEDLY TECH BOOKのような技術同人誌が必要だと思っています」

Wantedlyは年中、学生・社会人を問わずインターンを受け入れています。Wantedlyのコミュニケーションの特徴として、GitHubを非同期コミュニケーションのツールとして使っていることがあげられます。一般的にGitHub=ソースコードの管理という認識だと思いますが、Wantedlyではドキュメントやそれに伴うコミュニケーションをGitHubのIssueやPR(Pull Request)に紐付けて行なっています。

そのため、情報が増えるほど、毎回新しく来る人がGitHub上で情報を見つけて、キャッチアップするのは大変です。また、そもそもWantedlyのGitHubの運用方法を理解して読まなければなりません。それならば、必要な情報を一度本にまとめた方がいいのではないか、と思ったことWANTEDLY TECH BOOKを作るきっかけになったとのこと。

「各エンジニアには、自分たちのチームに来るインターンの方に知っておいてほしい情報という軸で書いてもらいました。それが結果として、流行のサービスや新しいサービスを運用していく上で気をつけた方がいいことや、困ったことなどの知見がまとまったものになりました。もちろん、インターンへ来ない人や他の会社で働かれている人にも、うちの技術スキルを知ってもらい、それを自社のサービスに活かして欲しいです」

今回、住友さんが執筆したのはWantedly流のGitHubの使い方について。

エンジニアチームだけでなく、ビジネスチーム、カスターマサポートチーム、コーポレートチーム、インターンから派遣社員の方まで、全員がGitHubでコミュニケーションをとっているWantedlyならではの使い方が詰まっています。

初出展のコミケでは50部はけたらいい方と言われている中、去年WANTEDLY TECH BOOK は130部+増刷した20部の合計150部が頒布されました。今年は去年の第1弾と合わせ、限定200部づつ持っていく予定です。

当日はCTOの川崎やデブサミ2017などで登壇もしているインフラエンジニアの坂部なども、会場に駆けつけます。



■WANTEDLY TECH BOOK 2 目次

第 1 章 変化に強いインフラと事例

1.1 はじめに . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

1.2 コンテナのメリット . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

1.3 コンテナを使いやすい現場 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

1.4 Docker を使う理由 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

1.5 Docker を使うときのポイント . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

1.5.1 The Twelve-Factor App . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

1.5.2 リポジトリのルール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

1.6 インフラを支える Microtools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

1.6.1 The UNIX philosophy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

1.6.2 Kubernetes を使うためのツール . . . . . . . . . . . . . . . . . . . . . . . 13

1.7 Wantedly People on Kubernetes 事例 . . . . . . . . . . . . . . . . . . . . . . . . . 16

1.8 おわりに . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

第 2 章 未来に繋ぐ GitHub の使い方

2.1 はじめに . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

2.2 WHY と WHAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

2.2.1 情報の探し方と残し方 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

2.2.2 Issue や PR の間でのリンク . . . . . . . . . . . . . . . . . . . . . . . . . . 19

2.2.3 重要な話はドキュメントにする . . . . . . . . . . . . . . . . . . . . . . . . 20

2.3 連携とキャッチアップ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

2.4 連携するときに気をつけること . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

2.4.1 監視するものは減らしたい . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

2.4.2 情報は多すぎると読まれない . . . . . . . . . . . . . . . . . . . . . . . . . 24

2.4.3 連携する際の重要度 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

2.4.4 タスクの進捗はわかりやすくする . . . . . . . . . . . . . . . . . . . . . . . 24

2.5 打ち合わせの議事録 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

2.5.1 全体で Issue の1つのコメントに書き込んでいく . . . . . . . . . . . . . . 25

2.5.2 1人が Issue の1つのコメントに書き込んでいく . . . . . . . . . . . . . . 26

2.5.3 Google Docs で全員で議事録を共有する . . . . . . . . . . . . . . . . . . . 26

2.6 外部ツール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

2.6.1 Google アナリティクス . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

2.6.2 Domo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

2.6.3 TreasureData、BQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

2.6.4 Dropbox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

2.6.5 Zeplin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

2.6.6 Crashlytics / Firebase Crash Reporting . . . . . . . . . . . . . . . . . . . 28

2.7 おわりに . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

第 3 章 Wantedly People で動いている機械学習

3.1 はじめに . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

3.2 マイクロサービスとしての機械学習 . . . . . . . . . . . . . . . . . . . . . . . . . . 31

3.2.1 1 つのことだけを上手くやる . . . . . . . . . . . . . . . . . . . . . . . . . . 31

3.2.2 サーバ構成例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

3.3 機械学習環境 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

3.3.1 事例: 名刺情報からのプロフィールの構築 . . . . . . . . . . . . . . . . . . 37

3.4 動き続けるシステムで精度を保証したい . . . . . . . . . . . . . . . . . . . . . . . 38

3.5 企業で機械学習を導入すること . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39

3.6 おわりに . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

第 4 章 Wantedly における開発環境の Docker 化

4.1 はじめに . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

4.1.1 様々な人がプロジェクトに関わるカルチャー . . . . . . . . . . . . . . . . . 41

4.1.2 Microservices architecture の広がり . . . . . . . . . . . . . . . . . . . . . 41

4.1.3 中途半端な bootstrap script . . . . . . . . . . . . . . . . . . . . . . . . . . 42

4.1.4 システムライブラリ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

4.2 目指すべきもの . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

4.2.1 ユーザビリティを損なわないか . . . . . . . . . . . . . . . . . . . . . . . . 43

4.2.2 透過的に使えるインターフェイスか . . . . . . . . . . . . . . . . . . . . . . 43

4.2.3 事例: Whalebrew . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43

4.3 なにをつくったか . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43

4.4 どうやったか . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

4.4.1 Dockerle を分ける . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

4.4.2 docker-compose を使う . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

4.4.3 コンテナ内でホストと同じ SSH の鍵や設定を使う . . . . . . . . . . . . . 47

4.4.4 Vendor directory は volume mount しない . . . . . . . . . . . . . . . . . . 48

4.4.5 コンテナ内からホストの localhost にアクセスする . . . . . . . . . . . . . 50

4.4.6 Middlewares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

4.5 おわりに . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

第 5 章 実践 Kubernetes 53

5.1 WHY(はじめに) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

5.2 WHAT(なにをするか) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

5.3 定義とルール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

5.3.1 オペレーションを統一化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

5.3.2 マニフェストファイルと kubectl を用いたオペレーション . . . . . . . . . 57

5.3.3 クラスタリング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

5.3.4 統一化したオペレーションになるとアプリケーションエンジニアはどう嬉

しい? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

5.3.5 アプリケーション固有の方言をなくす . . . . . . . . . . . . . . . . . . . . 59

5.3.6 CI/CD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

5.3.7 ローカル上で確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65

5.4 Kubernetes のマニフェストの解説 . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

5.4.1 Namespace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

5.4.2 Service . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

5.4.3 Deployment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

5.5 Blue-Green Deployment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

5.6 Rolling Deploy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69

5.7 QA で確認して Production にリリース . . . . . . . . . . . . . . . . . . . . . . . . 70

5.7.1 QA デプロイ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70

5.8 まとめ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72

Wantedly, Inc.'s job postings
Anonymous
Anonymous
Picture?height=40&width=40
4f0f8e38 6610 425f 903b c081e9e8e2bf?1528614662
9fb598fe 1684 4714 94fc 2a3a82b6cbec
Users%2f438148%2favatars%2f75e6bd89 7078 4582 88a9 cc224bf784ee
35 Likes
Anonymous
Anonymous
Picture?height=40&width=40
4f0f8e38 6610 425f 903b c081e9e8e2bf?1528614662
9fb598fe 1684 4714 94fc 2a3a82b6cbec
Users%2f438148%2favatars%2f75e6bd89 7078 4582 88a9 cc224bf784ee
35 Likes

Weekly ranking

Show other rankings

Page top icon