はじめに
情報科学系の大学+大学院に6年通って,web系のエンジニアになったはいいものの、いわゆる「web系」のエンジニアは知らなければならない、あるいは使えなければならない技術領域が広すぎて呆然としながら、なんとかなんとか勉強しながら失敗しながら前進する・・という方は意外と多いのではないかと思っています。まさにぼくです。よく企業紹介のスライドとかで出てくる技術スタックも全く知らないソフトウェア・ライブラリばかり…学生時代からweb技術に多く触れてきた同期に引け目を感じながら、なんとかついていっております…。
そこで,今まで科学技術計算系の「プログラミング」さらに言えば自分で書いて、自分で動かすコードしか書いてこなかったし教科書的な知識しかない!という学生の方に、web系で必要な技術領域に関して名前ベースで大雑把にまとめて、ググる指針になる記事を書こうと思い立ちました。
web系開発エンジニアの技術領域
計算機科学一般
応用情報技術者試験くらいのレベルの知識はもっていたほうがいい.OSなど,ある程度低レイヤの知識があるとデバッグで助かったりする.非同期処理やGCなどは,高級プログラミング言語より低レイヤーな知識がないと理解しきれない部分もある。
インフラ
サーバ構築の自動化
- Ansible
- 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基本7レイヤー
- TCP/IPの基本
- L7
- HTTP/HTTPS
- HTTP2/SPDY/QUIC/websocketのようなalternative protocol
- NTP (Network Time Protocol)
- HTTP/HTTPS
- ソフトウェア/ツール
- GUI
- wireshark(パケットキャプチャツール)
- CUI
- ping/nslookup等の基本コマンド
- GUI
ネットワークエンジニアとしてというweb上の資料がよくまとまっていて勉強に良さそう。
セキュリティ
- 暗号化基礎
- 共有鍵暗号・公開鍵暗号
- SSL, HTTPS
- Web アプリケーションにおける様々な脆弱性
- XSS
- CSRF
- OSコマンドインジェクション
- SQLインジェクション
- ...
このあたりを体系的に学びたいなら、いわゆる徳丸本がおすすめ。
開発
プログラミング一般のトピック
- (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 へ
テスト
- 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
他にも分散型メッセージングミドルウェアの詳細比較に例あり。
Push型・Pull型の違いについても抑えておきたい。
資料としてはこちらがよいと思う。
アプリケーション(クライアント)
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
ログ解析
ログ解析は少し特殊で、これだけで関わってくるミドルウェアが多いので別途項目分け。
こちらのスライドにある図がとてもわかり易いです。
アグリゲータ、ストリーム処理
- Fluentd
- Apache Flume
- Logstash
比較はこちらなど。
こちらの記事では push / pull の比較も。
ログデータストア
- Elasticsearch
- Prometheus
- InfluxDB
時系列処理に特化したものが使われることが多い。結果としてTSDB(Time-Series Database)が多い。
ストリームプロセシング
- Apache Spark (Spark Streaming)
- Apache Flink
- Apache Storm
- Apache Samza
- Kafka Streams
分散ストリーム処理エンジンは乱立しているらしい。
こちらのスライド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 もよく利用される。