SIerの若手開発エンジニア向け教育をどうすればよいか考える（その３）

[Stylez  Advent Calendar 2018](https://qiita.com/advent-calendar/2018/stylez) の 16日目です。

[株式会社スタイルズ](https://www.stylez.co.jp/)で代表をしている梶原です。

[前回](https://qiita.com/bonybeat/items/d692c54eff40dc36964e)に引き続き、SIer（受託系）での若手社員（開発系エンジニア　新卒から20代の終わりくらいまで）の教育について考えていることを書いています。

SIer（受託系）ってのは、サービス系の企業と違って、顧客から注文されたシステムを開発します。それと、会社全体としては色々なシステムを作っているので、人事異動とかでまったく内容の違うシステムを担当する可能性も高いです。

たとえば、こんな感じですよね。

ソーシャル系サイト
↓
ガチ社内用業務システム＋会計システム連携
↓
負荷が高いWebメディアサイト
↓
データ分析のバッチシステム

こんなに色々なシステムを一年置きに開発したりすることになります。インフラも今はAWSとかクラウドへの絶賛移行トレンドなので、オンプレサーバー（VMware)からAWS、はては部分的にサーバーレス技術なんかも使いますし、DockerとかKubernetesなんかのコンテナ系技術も必要になってきています。このうえ、AIやれとか。。。。。無理でしょって感じです。

現在40歳前後の人は、クライアント・サーバーが廃れていって、Webシステムの進歩（CGI＝＞Java applet＝＞J2EE=>Springとか）をそのまま体験してきたのですが、今の若いかたは同時並行的に急速に進化している技術の前に突然放り出されてしまった感がありますね。
こんな状況のなかで、技術者教育ってどうすればよいのでしょうか？　

[「SIerの若手開発エンジニア向け教育をどうすればよいか考える（その１）」](https://qiita.com/bonybeat/items/9c7a80cca9482493f07e)　では、自社（株式会社スタイルズ）で実際にやっている新卒から２年目が終わるまでにやっている教育コースのことを書きました。

これはほんとに最低限の教育で

- Java（+Spring Framework）でプログラムが書けるようになること
- Webシステムがどのように動いているかが理解できること
- 良いコードを書くという意識を持てるようにすること
- フロントエンドのことも何となく分かること
- （AWSを中心に）サーバーがさわれること

くらいまでしか出来ていなくて、「初心者レベルを卒業できたかな？」というレベルです。

これ以降、「自分で勝手に育て！」にならないように、成長をサポートするためにはどうしたらよいのでしょうか？　

まずは

- 中級者レベル：一人前の開発エンジニア
- 上級者レベル：立派な開発エンジニア（？）

を目指していくうえでスキルマップをザクッと書いてみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/129241/01505304-1f2c-8afa-4370-e65eb5df1e84.png)


ものすぎくザクッとした内容で申し訳ないです。まー、なかなかこの通りには行かないでしょうが、これを30代の前半までに獲得していければOKな感じでしょうか。上記では、中級者レベルをレベル２、上級者レベルをレベル３としています。

レベル１については[前々回](https://qiita.com/bonybeat/items/9c7a80cca9482493f07e)　書いているので、今回はレベル２について深掘りします。


## 1.　プログラミング（第一言語）レベル２
### 1.1 リファクタリングに取り組み

まずリファクタリングを知る、そしてそれを習慣化する必要があります。これについては、とりあえず以下の「リファクタリング―既存のコードを安全に改善する―」を読書会的に読む必要がありますが、メンター的な先輩がついて、どおうしたらそれを習慣化できるかを話し合っていく必要があります。そのためには「コードレビュー」を習慣的に実施する必要がありますね。

##[新装版 リファクタリング―既存のコードを安全に改善する―](http://www.amazon.co.jp/%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E2%80%95%E6%97%A2%E5%AD%98%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E5%AE%89%E5%85%A8%E3%81%AB%E6%94%B9%E5%96%84%E3%81%99%E3%82%8B%E2%80%95-OBJECT-TECHNOLOGY-Martin-Fowler/dp/427405019X/ref=sr_1_2?s=books&ie=UTF8&qid=1458616485&sr=1-2&keywords=%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0+%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AE%E4%BD%93%E8%B3%AA%E6%94%B9%E5%96%84%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF)

- リファクタリング―最初の例
- リファクタリングの原則
- コードの不吉な臭い
- テストの構築
- リファクタリング・カタログに向けて
- メソッドの構成
- オブジェクト間での特性の移動
- データの再編成
- 条件記述の単純化
- メソッド呼び出しの単純化
- 継承の取り扱い
- 大きなリファクタリング
- リファクタリング、再利用、現実
- リファクタリングツール
- 部品から全体へ
- Javaのバージョンアップに伴うリファクタリングをめぐる環境の変化

##1.2 良いコードへの取り組み

##[リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック](http://www.amazon.co.jp/gp/product/4873115655/ref=ox_sc_sfl_title_2?ie=UTF8&psc=1&smid=AN1VRQENFRJN5)
はすでに２年めで読書会的に呼んでますが、これも良い習慣としてのコードレビューが必要です。

##1.3 フレームワークへのより深い理解

これは社内教育ではなかなか難しいですね。
[JAPAN SAP USERS' GROUP（JSUG、ジェイサグ）](https://jsug.doorkeeper.jp/) や[PHP勉強会](https://phpstudy.doorkeeper.jp/)の勉強会に定期的に参加して、先達の話を効くのが一番だと思います。

# 2.　フロントエンド　レベル２
## 2.1 特定のJavaScriptフレームワークでの基本的実装

スタイルズでは、Angularをメインで扱っていますが、でもAngularを使うのは業務系システムをSPA(シングルページアプリケーション)として開発するようねケースでは以下のような適切だと考えています。
- フルスタック
- Typescriptとの併用

でも、小規模なシステムでも、それでよいのかというとちょっと迷うところで、reactとかVueなのかなーと思います。
なんにしろ、実際にプロジェクト（実業務の意味）で使わないと意味がないので、JavaScriptフレームワークを本格的に使うプロジェクトに順次アサインすることが一番大事なことだと思います。

# 3.　インフラ　レベル２
## 3.1 シェルスクリプトを日常的に便利に使えること

AWSだろうとオンプレだろうと、シェルスクリプティングの基礎は、日常的なことを自動化するためにとても大事です。毎日同じログの整理をする、その結果を関係者にslackやメールで送信する。毎日、自分が予定を確認して手作業で30分かかることを、自動1分で終わるでようにできれば本当に大きな違いですよね。

あー、それと同じタイミングで、正規表現の基本的なテクニックを学んでおくのも大事です。

###[シェルプログラミング実用テクニック](https://www.amazon.co.jp/%E3%82%B7%E3%82%A7%E3%83%AB%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%AE%9F%E7%94%A8%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-Software-Design-plus-%E4%B8%8A%E7%94%B0/dp/4774173444)

- 第1章　準備運動
- 第2章　不定型な文章や設定ファイルの検索と加工 
- 第3章　ファイルの取り扱いとシステムの操作 
- 第4章　ファイルシステムをデータベースにする 
- 第5章　大きなデータを処理する 
- 第6章　画像、表計算ソフト、その他特殊なデータを扱う 
- 第7章　CLI的インターネットとの付き合い方 
- 第8章　計算 

###[反復学習ソフト付き 正規表現書き方ドリル](http://www.amazon.co.jp/%E5%8F%8D%E5%BE%A9%E5%AD%A6%E7%BF%92%E3%82%BD%E3%83%95%E3%83%88%E4%BB%98%E3%81%8D-%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE%E6%9B%B8%E3%81%8D%E6%96%B9%E3%83%89%E3%83%AA%E3%83%AB-WEB-PRESS-plus/dp/4774145092/ref=sr_1_2?s=books&ie=UTF8&qid=1458600709&sr=1-2&keywords=%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE)

- 第1章　学習の進め方と素振りソフトウェアについて
- 第2章　正規表現の基本 正規表現って何？
- 第3章　基本的なメタキャラクタ
- 第4章　部品を組み合わせて使う
- 第5章　正規表現の便利な機能
- 第6章　より実践的な正規表現

## 3.2 Dockerの現実的な利用

Dockerを使って思い通りの開発環境を構築できるようになるのがターゲットスキルになると思います。

[Dockerで開発環境構築を10倍楽にしたはなし](https://techblog.kayac.com/developing-with-docker-compose)あたりまでを理解しながら自分で対応できるということかな、と思います。

ただ、今後のコンテナ技術の普及スピード次第では、現実に追い越されてしまう可能性はあります。

# 5.　RDBMS　レベル２

##SQLのパフォーマンスの理解
##複雑なSQLの記述

それなりに複雑なSQLをちゃんと書けるようになってほしいです。想定レベルとしては以下くらいでしょうか。

##[スッキリわかる SQL 入門 ドリル215問付き!](http://www.amazon.co.jp/%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8B-SQL-%E5%85%A5%E9%96%80-%E3%83%89%E3%83%AA%E3%83%AB215%E5%95%8F%E4%BB%98%E3%81%8D-%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4844333933/ref=pd_cp_14_3?ie=UTF8&refRID=1T98M4P3G7BCN5V0W78X)

- 第1章 はじめてのSQL
- 第2章 基本文法と4大命令
- 第3章 操作する行の絞り込み
- 第4章 検索結果の加工
- 第5章 式と関数
- 第6章 集計とグループ化
- 第7章 副問い合わせ
- 第8章 複数テーブルの結合
- 第9章 トランザクション
- 第10章 テーブルの作成
- 第11章 さまざまな支援機能
- 第12章 テーブルの設計

SQLのパフォーマンスについては、各DBMSで「実行計画」を想定しながらSQLを書けることを想定しています。

##[SQL実践入門──高速でわかりやすいクエリの書き方 (WEB+DB PRESS plus)](http://www.amazon.co.jp/SQL%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80%E2%94%80%E2%94%80%E9%AB%98%E9%80%9F%E3%81%A7%E3%82%8F%E3%81%8B%E3%82%8A%E3%82%84%E3%81%99%E3%81%84%E3%82%AF%E3%82%A8%E3%83%AA%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9-WEB-DB-PRESS-plus/dp/4774173010/ref=asap_bc?ie=UTF8)

- 第1章：DBMSのアーキテクチャ──この世にただ飯はあるか
- 第2章：SQLの基礎──母国語を話すがごとく
- 第3章：SQLにおける条件分岐──文から式へ
- 第4章：集約とカット──集合の世界
- 第5章：ループ──手続き型の呪縛
- 第6章：結合──結合を制する者はSQLを制す
- 第7章：サブクエリ──困難は分割するべきか
- 第8章：SQLにおける順序──甦る手続き型
- 第9章：更新とデータモデル──盲目のスーパーソルジャー
- 第10章：インデックスを使いこなす──秀才の弱点

#6.全体的なアーキテクチャースキル　レベル２

特にシステムのスケールアウト性に関する基本的なノウハウを学んでほしいですね。たとえば、AWS上でのElasticsearchやElasticCacheの構築や利用ができるようになってほしいです。あと、サーバー負荷を計測してどこにボトルネックがあるかを判断するとか、それを解消するため知識とかも獲得していく必要があります。

#7.データベース設計の初歩

データベース設計（とりあえずRDBMS）については学ぶのがとても難しいスキルです。良い書籍も少ないですし、データベース設計について自身を持っている先輩というのもあんまりいないんじゃないかと思います。

- 第1章 データベースを制する者はシステムを制す
- 第2章 論理設計と物理設計
- 第3章 論理設計と正規化～なぜテーブルは分割する必要があるのか?
- 第4章 ER図～複数のテーブルの関係を表現する
- 第5章 論理設計とパフォーマンス～正規化の欠点と非正規化
- 第6章 データベースとパフォーマンス
- 第7章 論理設計のバッドノウハウ
- 第8章 論理設計のグレーノウハウ
- 第9章一歩進んだ論理設計～SQLで木構造を扱う

とりあえずレベル２まで（入社 3-5年目くらい）というイメージで書いてみました。

そのうち、レベル３（入社 6-8年目くらい）についても書いてみたいと思います。