「一人で書いて、一人で使うコード」しか書いたことがない新卒web系開発エンジニアがだいたい必要な技術領域をつかむ

# はじめに

情報科学系の大学＋大学院に6年通って，web系のエンジニアになったはいいものの、いわゆる「web系」のエンジニアは知らなければならない、あるいは使えなければならない技術領域が広すぎて呆然としながら、なんとかなんとか勉強しながら失敗しながら前進する・・という方は意外と多いのではないかと思っています。まさにぼくです。よく企業紹介のスライドとかで出てくる技術スタックも全く知らないソフトウェア・ライブラリばかり…学生時代からweb技術に多く触れてきた同期に引け目を感じながら、なんとかついていっております…。

そこで，今まで科学技術計算系の「プログラミング」さらに言えば自分で書いて、自分で動かすコードしか書いてこなかったし教科書的な知識しかない！という学生の方に、web系で必要な技術領域に関して名前ベースで大雑把にまとめて、ググる指針になる記事を書こうと思い立ちました。

# web系開発エンジニアの技術領域
## 計算機科学一般
応用情報技術者試験くらいのレベルの知識はもっていたほうがいい．OSなど，ある程度低レイヤの知識があるとデバッグで助かったりする．非同期処理やGCなどは，高級プログラミング言語より低レイヤーな知識がないと理解しきれない部分もある。

## インフラ
### サーバ構築の自動化
- **Ansible**
    - [Ansibleをはじめる人に。](http://qiita.com/t_nakayama0714/items/fe55ee56d6446f67113c)
    - [入門Ansible](https://www.amazon.co.jp/dp/B00MALTGDY)
- Chef
- puppet
- Itamae
    - 国産。Cookpad製。

### サーバの設定テスト
- Serverspec

### VM/仮想環境
- Vagrant (サーバクライアント型）
- docker (コンテナ型）
    - Kubernetes (Docker オーケストレーションエンジン)

このあたりは様々なソフトウェアのハンズオンでよく利用されるので勉強しておくと良さそう。
特に Docker や Kubernetes (i18n などと同じノリで k8s と略されることが多い) は現代的なソフトウェアエンジニアリングでは多用される技術スタックの一部である。スケールアウトの容易性からアプリケーションを k8s に乗せて本番運用するようなケースも多くあります。後述の Cloud サービスでも Amazon EKS (AWS), GKE (GCP) などで利用可能。

### IaaS, PaaS, SaaS
- AWS (Amazon Web Services)
- GCP (Google Cloud Platform)
- Azure (Microsoft)

必ずしもインフラを自社で持たない企業も増えています。

## ネットワーク
- 知識
    - OSS基本７レイヤー
    - TCP/IPの基本
    - L7
        - HTTP/HTTPS
            - HTTP2/SPDY/QUIC/websocketのようなalternative protocol
        - NTP (Network Time Protocol)
            - http://eng-entrance.com/what-is-ntp
- ソフトウェア/ツール
    - GUI
        - wireshark（パケットキャプチャツール）
    - CUI
        - ping/nslookup等の基本コマンド

[ネットワークエンジニアとして](http://www.infraexpert.com/)というweb上の資料がよくまとまっていて勉強に良さそう。

## セキュリティ
- 暗号化基礎
    - 共有鍵暗号・公開鍵暗号
- SSL, HTTPS
- Web アプリケーションにおける様々な脆弱性
    - XSS
    - CSRF
    - OSコマンドインジェクション
    - SQLインジェクション
    - ...

このあたりを体系的に学びたいなら、いわゆる[徳丸本](https://www.amazon.co.jp/dp/4797393165)がおすすめ。

## 開発

### プログラミング一般のトピック
- (Web開発における)プログラミング言語
    - 筆者は Java はじめとした JVM 系の言語を利用する Web エンジニアだが、世間一般では Ruby, Perl, PHP, Python などのスクリプト言語もよく使われる。
    - 関数型言語
        - Haskell, Scalaとか。
- KISS, DRY, YAGNIなどの基本原則
- 非同期プログラミング
    - リアクティブプログラミング
        - RxJava, Reactor..
    - コルーチン

### アプリケーション（共通）
#### 設計
- **デザインパターン**
    - 一般的なものは知識として知っておくと便利
- UML (Unified Modeling Language)
    - 設計を図にするための共通プロトコル的なもの
    - クラス図・シーケンス図あたりは頻出
    - PlantUML という UML 言語があるのでそちらも合わせて覚えよう．
- MVC, MVVM等のMV*アーキテクチャ
    - 最近は Flux も流行り。
    
#### SCM
- **git**
- subversion

バージョン管理ツール．これは大学でも使ったことがあるひとが多いかも．gitがだいぶ一般的ですが，subversionも今だ現役です.ホスティングサービスとしてはGitHubやBitbucketがよく知られます．オンプレで動作するGitLabやGitHub enterpriseもあります。

#### SCM on web
- GitHub
- GitLab
- Bitbucket

#### ビルド自動化/CI/CD
- Jenkins
- CircleCI
- TravisCI
- Drone

参考になるページ：[Java製アプリを Eclipse から実行したことしかない新人に「ビルドツールとは？」を説明してみる…そして CI へ](http://qiita.com/Mura-Mi/items/225825cc3715dc04d923)

#### テスト
- TDD
- Unit test
- 境界値分析
- Performance Test / Stress Test

### アプリケーション（サーバ）

#### Webフレームワーク
- Ruby on Rails (Ruby)
- Spring (Java)
- Play (Scala/Java)
- Laravel, CakePHP (PHP)
- Django, Flask, Pyramid (python)
- Express (Node.js・サーバサイドJavascript）

#### その他のライブラリ・ミドルウェア等
##### イベントバス
- Akka 

##### メッセージキュー
- Kafka
- RabbitMQ
- ActiveMQ
- Redis 

他にも[分散型メッセージングミドルウェアの詳細比較](http://postd.cc/dissecting-message-queues/)に例あり。
Push型・Pull型の違いについても抑えておきたい。
資料としては[こちら](https://www.slideshare.net/laclefyoshi/ss-67658888)がよいと思う。

### アプリケーション（クライアント）
#### native
- Android 
- iOS

##### ゲームエンジン
- **Unity** (C#)
- Cocos-2dx (C++)
- Unreal

##### その他
- アーキテクチャ。MVVM, MVP, クリーンアーキテクチャ...
- Flutter などのモバイルアプリケーションフレームワーク

#### Javascript / HTML / CSS
##### MV*ライブラリ（フレームワーク）
- **React** + Redux
- Angular2
- **Vue.js**

##### フレームワークのフレームワーク（？）
- Next
- Nuxt

Node.js のサーバを内包して、 SSR などに簡単に対応できる。

##### UIライブラリ
- **bootstrap**
- material-ui

##### jQuery
- jQuery

##### パッケージマネージャ
- **npm**
- **yarn**
- bower

##### タスクランナー
- **Gulp**
- Grunt

##### トランスパイラ
- webpack
- browserify
- babel
- 
JS方言をブラウザで読めるように変換してくれるツール

##### linter
- ESLint

##### JavaScript方言
- ES6, TypeScript, CoffeeScript

##### CSSプリプロセッサ
- SASS(SCSS)
- Stylus
- LESS

## データベース

### RDBMS
- MySQL
- PostgreSQL
- SQLite
- Oracle (商用)
    
### NoSQL
- Key-Value
    - Redis, memcached
- Row oriented
    - HBase, Cassandra
- Document DB
    - MongoDB
- Graph DB
    - Neo4j

原則として RDBMS を使うことが多いと思うが、スケールアウトの容易さや処理の複雑性が上がったことなどから NoSQL も重要性が増している。
    
### TSDB (Time Series DB)
- InfluxDB
- OpenTSDB
- Druid
- Prometheus
   
## ログ解析
ログ解析は少し特殊で、これだけで関わってくるミドルウェアが多いので別途項目分け。
[こちらのスライド](https://www.ospn.jp/osc2017-fall/pdf/OSC2017_TokyoFall_Hitachi.pdf)にある図がとてもわかり易いです。

### アグリゲータ、ストリーム処理
- Fluentd
- Apache Flume
- Logstash

比較は[こちら](https://qiita.com/ykzkiy/items/eef3071a0667cb4d5136)など。
[こちらの記事](http://sitotkfm.hateblo.jp/entry/2016/12/10/222304)では push / pull の比較も。

### ログデータストア
- Elasticsearch
- Prometheus
- InfluxDB

時系列処理に特化したものが使われることが多い。結果としてTSDB(Time-Series Database)が多い。

### ストリームプロセシング
- Apache Spark (Spark Streaming)
- Apache Flink
- Apache Storm
- Apache Samza
- Kafka Streams

[分散ストリーム処理エンジンは乱立している](https://qiita.com/takanorig/items/aaa4f116d1564ec20dd3)らしい。 
こちらのスライド[IoT時代におけるストリームデータ処理と急成長の Apache Flink](https://www.slideshare.net/takanorig/iot-apache-flink)もわかりやすい比較。
というかなんで同じ Apache Foundation でこんなにあるんや。。

### ログ可視化 / BI tools
- Kibana (from Elastic Stack)
- Grafana
- Tableau

Elasticsearch + Logstash + Kibana = ELK stack
Elasticsearch + Fluentd + Kibana = EFK stack (日本で流行しているとされる）

### SaaS for Logging
- Newrelic
- Mackerel

## データ分析
Web 系の話じゃないの？と言われそうだが、最近はビッグデータ解析を迫られるエンジニアも多そうなので大項目として分離した。

### Hadoop エコシステム
大規模データ解析のための技術の集合体。

#### Hadoop コア
- YARN
    - リソース管理
- HDFS
    - ファイルシステム
- MapReduce
    - 分散データ処理

#### その他
- Apache Spark
    - 高機能な分散データ処理。MapReduce を置換する。
- Apache Impala / Apache Hive
    - SQL による HDFS 上のデータの分析
- Apache Zeppelin
    - Spark などの処理を web 上で記述できる notebook アプリケーション。
- Apache Kudu
    - HDFS と HBase の間を補完するカラムナ（列志向）ストレージエンジン。
    - Cloudera 製。
    
### その他の分析環境
- R
- Python

といった言語がデータアナリストが多く利用する言語と言われる。CV界隈では MATLAB もよく利用される。