非エンジニア人事に読んでほしい！『採用・人事担当者のためのITエンジニアリングの基本がわかる本』のススメ

# はじめに

自社のエンジニア採用活動を改善するために、[『採用・人事担当者のためのITエンジニアリングの基本がわかる本』](https://www.amazon.co.jp/dp/479816531X) を手に取った。私のようなIT技術に詳しくない採用担当向けに、技術のことだけでなくダイレクトリクルーティング等の施策の具体的なアドバイスまで丁寧に書かれており、おすすめできる一冊。

すでにエンジニア採用の難しさを体感している方は、1章は飛ばして良さそう。という訳で、2章から、自社・自身の視点でまとめていきます。このQiita初投稿を、エンジニア採用に格闘しているすべての仲間たちに捧げます。※自社に関係無いと思われた部分や、復習が不要と思った部分は割愛していますので悪しからず。

# 『採用・人事担当者のためのITエンジニアリングの基本がわかる本』まとめ

## 第2章 作るものから学ぶ

### Webアプリケーションとその構造

冒頭のこのパートでは、エンジニア採用に必要なIT用語の理解のため、アプリケーションがどう動き（機能）、価値を提供するかという流れに沿った仕組みや、用語どうしの関係性が説明されている。

基本的だが重要な点を復習。

- **アプリケーション**とは
    - さまざまなデバイスの上で動く特定の目的を果たすためのソフトウェア
- **Webアプリケーション**とは
    - Web基盤を利用した何らかのアプリケーション

Webアプリケーションの主要な構成要素が「**フロントエンド**（クライアントサイド）」と「**バックエンド**（サーバーサイド）」。

アプリケーションを見るユーザーの側の部分フロントエンド。数秒の間にいろいろな処理を行うのがバックエンド。この両者の間のデータのやり取りのことが**リクエスト**＆**レスポンス**。そのルールを用途ごとに決めたのが**プロトコル**。

フロントとバックがやり取りをして最終的に人間（ユーザー）が理解できる形で情報が表示される。フロントの本質的な役割はレスポンスにより送られてきたデータを読み込んで描画すること。

本書ではECサイトが例に挙げられているが、他のユーザーの購買状況に応じて在庫数の表示を変化させることを可能にするのがデータを保存し管理する**データベース**とその機能を提供する**データベースサーバー**。

・・昔の研修で学んだ記憶もあり、すべてなんとなく知ってはいたが、説明できるレベルではなかった。ここで改めて頭の中を整理できて良かった。

### プログラミング言語

既出のすべてのソフトウェアはプログラミング言語を使って開発されている。プログラミング言語の役目は人間がコンピュータに行わせたい処理（究極的には回路上の信号）の仲介役。

採用活動においては、なぜ自社がこのプログラミング言語を選んだのか？を把握して、候補者に伝えられることが重要。自社のエンジニアリング思想に共感してくれるエンジニアを見つけることにつながる。なるほど。

更に、それぞれの言語の特徴や共通点（**オブジェクト指向型**かどうか、**命令型**or **宣言型**、**静的型付け**or **動的型付け**、**強い型付け**or **弱い型付け**）が頭に入っていると、候補者の強みを自社技術に転用しやすいか、キャッチアップしやすいか、も推測できるようになる。ここはエンジニアに教えてもらいながら、更に深堀りしたいところ。ただ、当然ながら、キャッチアップできるかどうかは、「この言語を習得したい！」という意欲も大きなファクター。

弊社で使用している言語を中心にまとめた。

#### フロントエンド系

-  **HTML（弊社使用）**
    -  どんなプログラミング言語でWebアプリケーションを作っても、最終的にはこれで表現される。つまり、Webページの表現のための基本の言語
-  **CSS（弊社使用）**
    -  Webページの装飾のためのもの
    -  単独ではなくHTMLとセットで使われる
-  **Javascript（弊社使用）**
    -  技術発展の速度が速く勢いのある言語
    -  一度衰退し、Ajax技術の台頭とともに復権
-  **Typescript（弊社使用）**
    -  Javascriptの拡張。互換性があり、併用が可能
    -  保守性が高い

#### バックエンド系

-  **Java（弊社使用）**
    -  最も広く普及している。利用人口が多い
    -  設計者の意図が他の開発者に伝わりやすい。開発のルールから逸脱したコードが書かれにくい
-  PHP
    -  Wordpressがこれで作られているためメディア系で良く用いられている
    -  容易に習得しやすい反面、品質が人によってバラつきやすい
-  Scala
    -  JavaのライブラリをScalaから利用できる。Javaを知る人なら習得しやすい
    -  Javaや他の言語の良い特徴を合わせ持った言語として生まれた比較的新しい言語だが、Javaも進歩していて、Scalaならではの機能は減っている
-  Go
    -  C言語に迫る処理速度と高い表現力
    -  Docker, KubernetesはGoで書かれている
-  C++
    -  モバイルアプリ、ゲーム開発で用いられている
    -  習得の難易度が高い
-  C#
    -  C++とJavaのハイブリッド
    -  ゲーム開発で良く用いられる。例: Unity
    -  .NET Frameworkでの開発を想定

#### モバイル系

- **Objective-C（弊社使用）**
    - C言語ベースに機能が拡張された
    - iOSアプリの開発
- **Swift（弊社使用）**
    - iOS開発で用いられる比較的新しい言語
    - Objective-Cよりも安全で書きやすい
- Kotlin
    - 2017年にAndroid用公式言語に採択される。それまではJavaが主流
    - Javaで開発したコードを呼び出せる

### ライブラリとフレームワーク

両者の違い、わかっていなかったし、本書を読んでもちゃんと腹落ちしなかった。両者の境界は曖昧らしいので、エンジニアと会話する中で雰囲気をつかむしかないのかもしれない。

- **ライブラリ**とは
    - よく使う処理のコードを他の開発者が使えるように汎用的にまとめたもの
    - パッケージとも言われる
    - 開発しているプロダクトの特徴を伝える目的で使われる。例）機械学習ライブラリ
- **フレームワーク**とは
    - 特定のジャンルのアプリケーションを効率よく作るための考え方と、それを実現するための部品
    - 実装に関する思想を反映していることが多い

#### フロントエンド系

- **Vue.js（弊社使用）**
    - Angularを洗練して使いやすくしたもの
- **React（弊社使用）**
    - Facebook主導で開発されている
    - モバイル開発のためのフレームワークReact Nativeがある
    - アプリケーションの状態を管理するライブラリReduxと使われる
- Angular
    - Google主導で開発されている
- Nuxt.js
    - Vue.jsベース
    - UI以外のWebアプリケーション開発に必要な機能がある

#### バックエンド系

- **Spring Framework（弊社使用）**
    - Javaで最もよく使われているフレームワーク

### データベース

#### Relational Database Management System

- MySQL, PostgreSQL, Oracle Database

#### **NoSQL**

データ同士の関係性を柔軟に変えられる。データベースの高速化・高機能化に使われる。

- **MongoDB（弊社使用）**
    - ドキュメント指向型。JSON, XMLを単位としてデータを格納

### インフラ

様々なソフトウェアを動かすための土台。

- **AWS（弊社使用）**
    - Amazon EC2
        - レンタルサーバーとして使われる
    - Amazon S3
        - データを安価に保存するためのストレージ
- Google Cloud Platform
    - AWSの基本的なサービスは同様に提供されている
    - 機械学習に強い

## 第3章 作る人から学ぶ

それぞれのエンジニアの役割分担は会社によって大きく異なるので注意。一般的にはこうだが自社ではこう、と語れることが重要とあった。

### **フロントエンドエンジニア**

- コアスキル: HTML, CSS, Javascript, Javascriptフレームワーク
- サブスキル: バックエンド、デザイン、UIUX

### **バックエンドエンジニア**

- コアスキル: 何らかのプログラミング言語への深い理解
- サブスキル: データベース、インフラ、フロント

### **インフラエンジニア**

- コアスキル: インフラ、OS、ハードウェア
- サブスキル: ネットワーク、セキュリティ、サーバーサイド

### **モバイルエンジニア**

- コアスキル: モバイルアプリ実装、ハードウェア特性の知識
- サブスキル: サーバーサイド、デザイン、UIUX

### 職位

弊社のリーダー層は、本書で説明されているいくつかの職位を兼任している。組織が成長したら専任にしていくべきなのだろう。

- エンジニアリングマネージャー、テックリード、プロダクトマネージャー

## 第4章 作り方から学ぶ

### チーム開発の指針となる概念

- 開発手法
    - 開発工程の進め方に設けられたルール

企業の特性やプロダクトに相性の良い物が選ばれる。弊社はアジャイルを採用。

### 開発を支援する概念とツール

#### バージョン管理

- **Git（弊社使用）**

#### プロジェクト管理

- **JIRA（弊社使用）**

#### CI/CD

- **Jenkins（弊社使用）**

#### インフラ環境構築

- **Ansible（弊社使用）**

#### エディタ

- **Visual Studio Code**
- **Eclipse**

## 第5章 実践編：エンジニアリング知識を採用業務に応用する

エンジニア採用担当者としての習熟度ごとに、4章までに学んだ知識の応用の例が述べられる。

### エンジニア採用担当者としてのレベルの定義

#### レベル0: ワーカー

エンジニアの指示に従うだけで、作業をこなすだけのレベル。ここは卒業したはず。

#### レベル1: セクレタリー

エンジニア採用の要望の背景を理解している。採用することで解決したい組織の課題を理解しているレベル。求人票や採用要件を明確に書くことができる。

ここはもうちょっとで卒業（と言いたい）。

#### レベル2: パートナー

エンジニアから技術についてアドバイスをもらいながら採用プロセスの設計をエンジニアと対等な立場でアドバイスできる。

採用競合の分析ができる。事業上の競合だけでなく、使用技術が似ている会社が採用競合となることを理解している。

#### レベル3: プロフェッショナル

エンジニアを採用にどこまでコミットさせるか、採用チームのマネジメント、エンジニアが集まりたくなる組織づくりなど。採用・組織づくりのアドバイザー、といったところだろうか。

自社とエンジニア業界の接点、採用広報の設計をするために、QiitaやTwitter、はてなブログでエンジニアが接している生の情報に接する必要があるそうだ。このレベルまで上がると、エンジニアが好む雰囲気を察知して発信するセンスが備わっているのかもしれない。

## 第6章 応用編：学びを深め、学び続けるために

### エンジニアと会話しよう

社内のエンジニアと語ることが一番効率の良い学習方法。

-  自分が技術について勉強していることを伝えよう
-  こんな低レベルなことを聞いたら無知がバレる、という恥ずかしさを捨てて、わからないことは聞こう
-  求人票など、「モノ」を見せてアドバイスを求めてみよう

# おわりに

この本が良かった理由は2点。

1. 「わかったつもり」になっていたIT用語を大まかに整理できたこと
1. エンジニア採用担当がIT知識を身につける目的を再認識できたこと。その目的とは、社内外のエンジニアとのコミュニケーション。

採用待ったなし状態の弊社。スカウトや面談もしつつ、採用母集団形成、採用広報、腰を据えて取り組むべき課題もあり何からやればいいのか悩んでいた。しかし本書を読み、まずは社内のエンジニア１人ひとりの技術的な強みを知ることから始めようと前向きな気持ちに。

非エンジニア人事に本当におすすめします！