tech.kayac.com

新人研修で Chef, Serverspec, TCP, HTTP, MySQL, ISUCON を担当した @tkuchiki です。

研修は 4/9 - 4/16 の 6日間 で実施し、 2013年技術部新卒研修 の内容を一部変更して行いました。
Go の研修については、今年の新人研修はgoでした を、
ISUCON については 新卒研修の最終日に社内ISUCONを開催しました 〜運営死闘てか死亡編〜 を御覧ください。

研修の目的

研修の目的は以下のとおりです。

  • Linux サーバ構築スキルの習得
  • Serverspec の必要性を学ぶ
  • Chef の cookbook を作成できるようになる
  • TCP・HTTP の理解を深める
  • MySQL の基礎を理解する
  • 実践(ISUCON)を通して課題発見・解決能力を養う

研修の内容

Chef, Serverspec

2013年に行った新人研修同様、予め用意しておいた Serverspec のテストを通るように手でサーバ構築してもらいました。
その後、サーバをまっさらな状態にして、手で構築した内容を Chef の recipe に落としこんで Serverspec のテストを通るように作業してもらいました。

TCP, HTTP

こちらも2013年の新人研修と同じくTCP についてざっくり説明した後に、
tcpdump を使いながら、 3 way handshake がどのように行われているか説明しました。
http についても同様に、telnet で HTTP Request を送り、nc で HTTP Response を返す作業をハンズオン形式で行いました。

MySQL

RDB についての話しや、MySQL の歴史、MySQL の index、 MySQL の lock の話しをしました。
lock については、@ichirin2501MySQLのInnoDBのロック挙動調査 をもとに話しをしてもらいました。
よくまとめられていますので、ぜひご一読ください。

ISUCON

ベンチマーカーやベンチマーカーのジョブスケジューラーも Go で実装しました。

良かった点

TCP・HTTP の研修をハンズオン形式で行った

アンケートの結果で最も要望が少なかったのが、TCP・HTTP の研修でした(特筆してよかった点がなかったことは課題だと思います)。
手で HTTP Request, Response を送る例は、書籍ではあまり見かけないと思いますので、
研修を行う意義のある内容だったのではないかと思います。

MySQL のテキストの質を高められた

@ichirin2501 が良い資料を作成してくれたので、
新卒社員以外にも有益な資料を社内に共有することができました。

改善点

それぞれのスキルセットにあった研修内容ではなかった

今回、サーバサイドエンジニア、フロントエンドエンジニアともに同じ内容の研修を受けてもらいましたが、
サーバ構築演習は内容的にサーバ構築を行ったことがある前提の内容になってしまいましたので、
フロントエンドエンジニアの新入社員には一部内容が難しかったようでした。

フロントエンドの研修がなかった

研修担当者が全員サーバサイドエンジニアだったこともあり、フロントエンドエンジニアの業務に関係する研修が一切行えませんでした。
サーバサイドエンジニアもフロントエンドの知識を持っていたほうが良いと思いますので、今後の課題としたいと思います。

まとめ

短い研修期間だったこともあり、基礎的なことしか教えられませんでしたが、
概ね目標は達成できたのではないかと思います。
今後は、研修期間を長くできるように社内調整を行ったり、基礎だけでなく実践的なことを教えられるようにしていきたいです。

明日から、GWでウキウキですね!!!!!!!!!!!

どうも新人研修のisuconを担当したKonboiです。

昨年、一昨年に引き続き新人研修の最終日に社内ISUCONを開催しました。

isucon用問題を自分が作成し、ベンチをtkuchikiが担当する方向で進めていました。

作成指針

まずはどのような問題にするかを考えました。 社内ISUCONでは、一線で業務を行う先輩エンジニアから研修を終えたばかりの新卒エンジニアまで幅広いエンジニアに対して、楽しんでいただけるような問題を作成できればなと思い以下のの方針で問題を作ることになりました。

  • 新卒入社のエンジニアでも挑戦できる問題にする
    • 新卒研修の内容で加点できるy問題にする
  • 通常の業務できちんと行うべきことを行う問題にする
    • 適切なindexを張る
    • 静的ファイルをapache,nginxなどのwebサーバーで返す問題にする

というのを指針に問題の作成を始めました。

問題作成

今年の研修はGoで行われたので、問題ももちろんGoです。 が、最初は使い慣れているRubyでα版を作ってからGoに移植することにしました。

普段ならやばいクエリを気付かずに仕込むことは簡単なのに、 わざとウィークポイントを仕込むとなると、なかなか難しさがありました。

出来上がった問題は、簡易版のtwitterアプリケーションのようなものです。

app.png

機能としては

  • 新規登録
  • ログイン/ログアウト
  • 投稿
  • フォロー
  • アイコン画像を返す
  • 投稿一覧ページ
  • 投稿一覧の情報をjson形式で返すAPI

以上の機能となっております。

この機能をRubyでひと通り作ってからGoに移植しました。

移植の際には ISUCON本戦の第3回大会第4回大会大会のGo言語実装を参考にさせてもらいました。

ありがとうございます。

テスト作成

研修の一貫としてISUCONの問題からアプリケーションのテストコードからソースを作成してもらう時間が研修の一環であったので幾つかテストコードを作成しました。

HTMLの構造のチェックにはgokogiriを使い、PerlのTest::mysqldのGo版であるgo-test-mysqldを使ってテストコードを作成しました。

DB周り以外は過去のISUCON本戦のベンチを参考にしました。

新卒エンジニアにとっては、アプリケーションの概要は分かっているものの、 それをいざテストコードからアプリケーションコードに書き換えるには、非常に手こずっていた印象を受けました。 (正直僕が新卒だったら手も足も出ない可能性しかないです)

そのため、ある程度したらいくつかライブコーディング的に説明しながらアプリケーションのコードを書いたりしました。

新卒エンジニアがみんながコードを書いている時にテストコードを追加するというタイムアタックを隠れてやってました。

とギリギリ進行していた社内ISUCONですがあるところでつまずきました。

そうベンチです。

ベンチが上手く動かないまま色々と試行錯誤を進めました。

社内ISUCON当日

無常にも時間は過ぎていくもので、当日の朝を迎えました。

参加チームは 2人1組で

  • 新卒エンジニアチーム 4組
  • 先輩エンジニアチーム 5組

全9組となりました。

inhouse.png

虚しくもベンチが動かないまま、社内ISUCONが始まりました。

参加者の人はソースコードをみたり、 gitの環境を進めたりとベンチが回らないなりに実装を進めていました。

並行して運用のリアルISUCONが平行で進み。

午後1時ぐらいからベンチが動き始めISUCONが始まりました。

それまではざわざわしていた会場も静かになりだし各チーム、コードと向き合っておりました。

その後は淡々と進んでいき、あっという間に時間は過ぎました。

競技終了の時間を迎え、10分間アプリケーションが動くか何度の確認をしてもらった後に最終ベンチを行いました。

結果新卒氏チームで優勝したのは

clorets : 小坂、森本 チーム

が僅差で優勝しました。

先輩エンジニアは、全チーム新卒チームより高スコアをだし面目を保つことが出来たのではないかと思います。

ベンチが遅れてしまったので参加者には迷惑をかけました。 ですが、社内ISUCON後の新卒エンジニアからアンケートをとってみると

  • 設定を変更することで、処理速度が変わることを実感することができて、とても楽しかった。
  • エンジニア同士で勝負ごとをするのがおもしろかった

など思ったよりも評判が良く、全員が もう1度挑戦してみたい という意見でした。

出題側としては申し訳なさもありつつ、楽しんでもらえて良かったです。

まとめ

  • 新卒エンジニア達が社内ISUCONを通して少しでもチューニングの面白さを感じてもらえた。
  • ISUCONを作るのは本当に難しく大変!!
    • ISUCON本戦出題者の大変さとすごさを改めて感じました。 本当にすごいっす。
  • 社内ISUCONだったのでチャレンジできました。
    • 社内で失敗しないよう努力はしますが、最悪失敗しても大丈夫な環境でチャレンできるの本当によかったです。
  • 主催する方はゆとりと余裕をもって準備することを声を大にして言っておきます!

お疲れ様でした!!!

新人研修のgo担当だったhandlenameです。

昨夏、Go言語を積極的に推進していきます。という宣言を出しましたが、 この一環として新人研修で扱う言語としてgoが選ばれました。

研修では何をやったのか

Webサービスの開発・運用に関わる要素を対象としました。 goの研修に使える時間は合わせて10時間程度と限られていたこともあり、 かなり内容を絞っています。

開発環境の準備

研修に入る前に、受講者それぞれに開発環境の準備をしてもらいました。

  • brew install go
  • 環境変数の設定
  • エディタの設定(保存時にgofmt自動実行)

幸いここで躓いた受講者はいなかったようです。

Tour of Go

プログラミングは全くの未経験、という受講者はいなかったので、 いきなりTour of Goでgoのコードを書いてもらいました。

基本文法/制御構文/データ構造/並列処理 の4つのセクションに分割し、 それぞれについて課題提出と講評を行いました。

テストについて

TDDとは行かないまでも、CIを回すのが基本! ということでテストについての解説を行いました。

goはテストについての考え方が独特なので、 他の言語の例を挙げつつ解説しました。

  • なぜテストを書くのか
  • testingパッケージについて
  • テストの書き方
  • テストの実行方法

ファイルの操作

osioパッケージを用いた低レイヤーな操作や、 ioutilbufioパッケージを使った ファイルの読み書きの方法について紹介しました。 課題ではファイル操作を行うコマンドラインツールを実装しました。

  • ファイルの作成・削除
  • ファイルの読み書き
  • flagの使い方

HTTPサーバー・クライアント

APIでやりとりする簡単なHTTPサーバーアプリケーションを実装し、 net/httpパッケージの使い方について触れました。

  • HTTPサーバーの書き方
  • HTTPリクエストの送り方
  • encoding/jsonを用いた
  • XSSを防ぐためには

database/sql

社内で多く用いられているmysqlを対象に解説・課題を行いました。

  • database/sqlパッケージの使い方
  • SQLインジェクションを防ぐためには

研修で他の言語ではなくgoを扱うメリット・デメリット

メリット: 開発環境の準備が楽

チュートリアルとして使用したTour of Goに至っては ブラウザさえあればgoのコードを実行できます。 受講者の中にはまだプログラミングに不慣れな人もいるので、 余計なところで躓かない、というのは大きなメリットです。

研修開始前に実行環境のセットアップまでは済ませてもらっていたので、 スムーズに研修を始めることが出来ました。

メリット: ドキュメントが充実している

公式のドキュメント、 とくに標準パッケージのリファレンスが充実しているのが助かりました。 ドキュメントの充実は研修にかかわらず言語を学ぶ際には大きなメリットですね。

今回の研修では標準パッケージのみを用いたので、 この恩恵を特に受けることが出来ました。

デメリット: 体系的に学べる教材がない

「この本を読んでおくといいよ」と言うことができません。 書籍は何冊か出ていますが、刊行年数が古く、 バージョンアップで追加されたり非推奨になったりしたものを ちゃんと把握していないと役に立たない知識になってしまいます。

言語仕様が小さいので大仰な教材は必要ない、ということかもしれませんが・・・。

今回の研修ではTour of Go以外はオリジナルの資料・課題を用意し、 課題の解説・講評時に関連するトピックを紹介する形式を取りました。

デメリット: コードの癖が見えない

コードを読めばなんとなく書いた人のスキルが見えてくるものです。 goの場合gofmtコマンドでコードフォーマットするのが基本なので、 インデントが揃ってない、改行の入れ方が適当、など、 そういった細かい「いけてない」書き方は覆い隠されてしまいます。 研修で扱うのは比較的単純なコードばかりなのでなおさらです。

もちろんきれいなコードが書けるのはいいことではあるのですが、 研修を行っている側としては受講者それぞれのレベルを 判断するための材料が減ってしまいます。

課題の提出はGithubのPull Requestで

業務でgit & Githubを使用しているためこれに慣れてもらうというのが目的。 案の定手元の関係ないファイルを全部コミットしてしまったり、 コメントが不適切だったりと突っ込みどころが多くあったので、 課題内容と合わせて講評を行いました。

また、Pull Requestにすると提出されたコードのそれぞれの行にコメントが付けられるので、 講評がしやすいというメリットもあります。 課題ごとにラベルを指定して、Github APIで提出状況を可視化する、 ということも行っていました(主に研修を行う側用)。

研修を終えて

研修終了後にアンケートを取ったところ、

  • 「goroutineについてもっと取り上げて欲しかった」
  • 「interfaceについてもっと知りたいです」

という意見が見受けられました。

業務で使うプログラミングの基本、というところに注力したので、 なかなか応用まで手を伸ばせなかった感が否めないところです。

準備・実際の研修ともにもっと時間をとり余裕を持って行う、 というのが次回以降の課題となりそうです。

このあと新人研修シリーズとしてエントリーが続く予定です。

過去の新人研修シリーズはこちら!