新人研修用プログラム by Python

本記事は[TIS Engineer Advent Calendar 2015](http://qiita.com/advent-calendar/2015/tis)、11日目の記事です。そんなわけで、今年実施した新人研修プログラムについて書こうかなと思います。
こうした内容を共有することで、ゆくゆくは会社ごとに研修プログラムを作る手間がなくなり、また興味がある人が自習することができるようにもなると良いなと思います。

## 研修プログラム

研修プログラムは大まかに2ステージに分け、全体としては約2ヶ月ぐらいのスケジュールで行いました。
研修に際してどの言語を使うか？というのは議論がいろいろあったのですが(Javaも候補にあった)、書きやすさと規約的な点(PEP8によるスタイルチェックetc)、配属後の業務での使用頻度を考慮し、Pythonとしました。

研修プログラムメニュー

* プログラミング基礎(1week)
 * 開発環境設定
 * 基本処理の実装
* Webアプリケーション編(1week)
* チーム開発演習編
 * 企画書作成(1week)
 * 実装(3week)
 * テスト(1week)
 * プルリク(2week)
* 講義
 * Git/GitHubの使い方
 * クラウドインフラ基礎
 * 読みやすいコードの書き方
 * UI/UX講座
 * CI入門
* 輪講
 * [増補改訂版Java言語で学ぶデザインパターン入門](http://www.amazon.co.jp/dp/4797327030)
 * [SCRUM BOOT CAMP THE BOOK](http://www.amazon.co.jp/dp/4798129712) ※こちらは本配布のみ
* その他
 * 日報
 * 電話応対

珍しいのは、チーム開発演習編の中の「プルリク」編だと思います。チーム開発演習はいくつかのチームに分かれて行うのですが、プルリク編では他のチームの開発したアプリケーションを使ってみて、発見したバグやあった方がいい機能についてプルリクを作って送る、というものです。

このプルリク編があるため、各チームはドキュメントの整備やソースコードのリファクタリング、またテストなどをきちんとしておかないといけません。また、人のコードを読んだりいつかGitHubでプルリクを送る練習にもなります。

あとは、アプリを作る前に企画書をきちんと書くフェーズを入れました。
今回、チーム開発演習のお題は「「リモートで働く仲間とコミュニケーションを行うのに有用なWebサービス/ツール」を開発する」だったのですが、開発に際し以下点を企画書にまとめて発表してもらいました。

* 想定するユーザー
* ユーザーが抱える課題
* 開発するサービスがそれをどのように解決するのか
* 既存のサービスと差別化している点(新規性)
* 事業化(マネタイズ)のプラン

課題ファーストなのはSIerチックな感じですが、実際仕事をする際は上記のような、端的に言えば「なぜそれが必要で、費用対効果はあるのか」という点は説明が求められる箇所なので、ここで体験しておいてもらいました。やはり最初は課題設定が甘かったり自分たちの思いが言葉にできてなかったりという点があり、結構苦労しているチームが多かったように思います。コードはもちろんですが、こちらもしっかりレビューを入れるようにしました。
作ってもらうサービスも実際使ってもらえるものになるように意識してもらい、開発期間中にはUI/UX講座も行いました。

研修の全体像はこのような形になります。以下では、公開可能なものについて実際使用した資料をご紹介しようと思います(確認が取れ次第、順次追加していきます)。

## プログラミング基礎

[NLP100本ノック](http://www.cl.ecei.tohoku.ac.jp/nlp100/)にPythonによる基本的な処理が結構まとまっていたので、そちらを参考に課題を作成。

[icoxfog417/python_training](https://github.com/icoxfog417/python_training)

Extraとしては、Web APIを叩くのと非同期処理(asyncio)を入れました。この辺はよく使うの処理なので。
また、テストコードの書き方についてもここで習得してもらうようにしています。

ここでの指摘事項は以下のような感じでした。

* 短く簡潔に
 * リスト内包表記やlambdaなどの活用
 * [collections](http://docs.python.jp/3.4/library/collections.html)など、使える機能便利機能は積極的に使う(楽で早くて短くかける)
* コードのリーダビリティ(「読める」コード)
 * 名詞・動詞、単数形・複数形、三単現のsなどの適切な使用->辞書・翻訳サイトなどを活用
 * 名前の省略を行う場合は、一般性を考慮する(attributeはattrなど。有名なライブラリのAPIなどを参考にしてもよい)。迷うくらいなら、多少長くても意味が通じる名前を付ける
 * コメントは書くが、なるべくコメントがなくても伝わるようにする。また、処理の内容よりも処理の必然性の方が読む方にとってはありがたいことが多い("文字列を結合"ではなく、"ログ出力のために処理結果を文字列にまとめる"など)
 * PEP8を守る
* ユーザビリティ
 * コマンドラインで、ヘルプをつけるなど
 * 可搬性(他の人の環境でもすぐに動くように)
  * 環境依存のコード・ファイルはリポジトリから除外。特に、他の人がPyCharm使っているとは限らないのでideaの設定ファイルは除外。
* 設計
 * ファイルの読み込み/書き込みといった汎用処理はモジュール化する
 * Extra課題では、データの定義(models)と処理(gurunabi_service.py)を分離
 * Private/Publicの指定(内部的にしか使わないものは隠蔽する。特にapi key等の機微かつ変更されると動かなくなるようなものはPrivateにする
 * ファイルの読み込みなど、外部リソースへのアクセスは必要最小限にする(必要なだけアクセスし、使いまわす可能性がないならすぐ閉じる)
 * DRY and Simple (同じ処理を繰り返し書かない、かつシンプルに)
* その他
 * asyncio.Semaphoreによる並列プロセスの数の制御([参考](http://postd.cc/fast-scraping-in-python-with-asyncio/))

## Webアプリケーション編

最初にMVCアーキテクチャの説明をしました。

[Web Application Tutorial](https://docs.google.com/presentation/d/1whFnASJKNTblT6o2vF84Cd0j8vhICouXcJAnBdGmMCw/edit?usp=sharing)

(平成の世代だとスラムダンクを知らない人もいるとの情報を得、それだと業務上コミュニケーションに困るのでスラムダンクネタで統一)

その後実践編ということで、[Django](https://www.djangoproject.com/)/PostgreSQLを使って「日報管理」というお題で開発をしてもらいました(全社共通の日報システムが正気とは思えないくらい使いにくかったので、こうだったらいいなというものを作ってもらうという体で)。

実装を必須としたのは以下の機能です。

* ユーザー管理機能(Login/Logout)
* 日報一覧の表示(検索機能含む)
* 日報の登録・編集・削除
 * 一覧はログインできるユーザー全員が参照可能。
 * ただし、登録・編集・削除できるのは自分の分のみ。

出来たら追加で、というのは以下の機能。それ以上の機能は好きに足していいという感じにしました。

* コメント機能
* リッチテキスト/Markdown書式対応
* カレンダー表示

私が実装例として作ったのがこちらになります。

[Nippon no Nippou](https://github.com/icoxfog417/nippou)


## チーム開発演習編

2人で1チームで、サポートとしては各人のOJT担当計2名がつくという体制で進めました。
ここからはOJT側からは特段の指示は出さず、レビューのタイミングなどはすべて新人側で考え回数や日程を調整してもらうようにしました。チーム内でのタスク管理や進捗確認の方法についても同様です。
そのあたりの運営は、[SCRUM BOOT CAMP THE BOOK](http://www.amazon.co.jp/dp/4798129712)を参考にしてもらいました。ただ、今年は渡しただけだったので、ここはもう少し解説があった方が良いと思いました(実際振り返りでそうした意見もありました)。

以下が、実際に3チームが作ったアプリケーションになります。よろしければご参照ください。

* [気軽に質問ができて答えが返ってくるシステム　.Chain()　の企画・設計・開発](http://tech-sketch.jp/2015/09/stc-training-2.html)
* [リモートワーカーに最適な環境を提案するシステム（Zone）の企画・設計・開発](http://tech-sketch.jp/2015/09/stc-training-1.html)
* [ブレインストーミングをするためのWebアプリケーション「Brain Hacker」の企画・設計・開発](http://tech-sketch.jp/2015/09/stc-training-3.html)


## 講義

### Git/GitHubの使い方

Atlassianのチュートリアルを紹介。これを期にいろんなサイトを見ましたが、これが一番わかりやすかったです。

[Git チュートリアル](https://www.atlassian.com/ja/git/tutorial/git-basics)

あとは、コマンドの全体像として以下を。

[1slide で理解するGit](http://qiita.com/icoxfog417/items/b47f8f033a367b65ff37)

### 読みやすいコードの書き方

弊社の熟練エンジニアによるご解説を頂きました。

[良いコードとは](http://www.slideshare.net/nbykmatsui/ss-55961899)

### UI/UX講座

以下の資料をベースに行いました。これはとても分かりやすく、私自身も参考になりました。

[ITエンジニアに易しいUI/UXデザイン](http://www.slideshare.net/ksc1213/ituiux-16732374)

### CI入門

以下の資料を参考に。

* [継続的インテグレーションとテストの話](http://www.slideshare.net/pfi/ss-12878066)
* [デバッグ・サイクルを高速に回してコード品質を改善する（1） ―― 「繰り返しビルド＆テスト」に必要な環境とは](http://www.kumikomi.net/archives/2010/11/ep38ci1.php)

## おわりに

いかがだったでしょうか。新人研修時の参考にしていただければ幸いですし、資料などはそのまま使っていただいて構いません。また、うちではこうしてる、などありましたら是非コメントなど頂ければと思います。