最短でWeb業界で給与を得るための最小知識2020

「最低でもこれだけ知ってないと」的なあれこれが飛び交ってますが、逆にどこまで覚えることや学ぶことを削れるか思考実験してみました。
クラウド(AWS, Azure, GCPなどです)を使ったWeb開発やそれらに近接したDevOpsと呼ばれる職種を想定しています。

過去の自分を振り返って、列挙した知識や技術スタックをいくつか身につけてWeb業界に潜り込めばなんとか生き延びられそうと思ったんですけどどうでしょうか。

# 目指すキャリアとの対応表

コメントいただいて職場や役割によって「開発するけどデプロイしない」「運用メイン」など色々あり得ることを思い出したので、ざっくり「Webアプリケーション開発」か「インフラ構築/運用」かで特に優先した方が良さそうな知識と技術スタックを分けてみました。

知識/技術スタック|Webアプリケーション開発|インフラ構築/運用
---|---|---
[ハードウェア](https://qiita.com/mazgi/items/30d77099445288af0bda#%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A7%E3%82%A2)|-| :star: 
[ネットワーク](https://qiita.com/mazgi/items/30d77099445288af0bda#%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF)|-| :star: 
[Linux](https://qiita.com/mazgi/items/30d77099445288af0bda#linux)|-| :star: 
[Linuxコマンド](https://qiita.com/mazgi/items/30d77099445288af0bda#linux%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89)|- | :star: 
[Webサーバー](https://qiita.com/mazgi/items/30d77099445288af0bda#web%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC)|-| :star: 
[Webアプリケーション/HTTP](https://qiita.com/mazgi/items/30d77099445288af0bda#web%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3http)| :star: |-
[HTML/CSS/JavaScript](https://qiita.com/mazgi/items/30d77099445288af0bda#htmlcssjavascript)| :star: |-
[バージョン管理/Git](https://qiita.com/mazgi/items/30d77099445288af0bda#%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E7%AE%A1%E7%90%86git)| :star: | :star: 
[データ/データベース](https://qiita.com/mazgi/items/30d77099445288af0bda#%E3%83%87%E3%83%BC%E3%82%BF%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9)| :star: |-

# 分野別の知識/技術スタック

## ハードウェア

- IOPS
    - 大きければ大きいほど良いものです
    - 課金で増やせます [^2]
- ストレージサイズ
    - 大きければ大きいほど良いものです
    - 課金で増やせます [^2]
- CPU(論理)コア数
    - CPUには種類がありますが `AMD64` とか `X86_64` ってやつだけ使ってれば外しません
    - もしiOS/AndroidアプリケーションやIoTなどの分野に興味がある場合は追加で `ARM` というやつが登場します
    - クラウドなら課金で増やせます、物理だと課金だけでは増やせないこともある [^2]
- メモリサイズ
    - 大きければ大きいほど良いものです
    - クラウドなら課金で増やせます、物理だと課金だけでは増やせないこともある [^2]
- ネットワークの帯域
    - 大きければ大きいほど良いものです
    - クラウドなら課金で増やせます、物理だと課金だけでは増やせないこともある [^2]
- 仮想マシン/コンテナ
    - 言葉だけ知っておきましょう
    - EC2とGCEは仮想マシンです
    - ECS,EKSとGAE,GKEはコンテナのプラットフォームです
    - VirtualBoxやVMWareなどの仮想マシンとDockerなどのコンテナを触ったことがあると尚良いと思います
- 無限大も可変長もそうそう存在しないこと
    - どこに書くか迷っていましたがハードウェアの制約を受けるのでここに書きました

## ネットワーク

- `ifconfig`, `ip addr show` などの結果からIPv4アドレスが見つけられる
    - `123.456.789.012/33` は正しいIPv4アドレスではない
    - `00:00:5e:00:53:00` はIPアドレスではなくMACアドレス
    - `2001:db8::/32` はIPv4アドレスではなくIPv6アドレス
- 2つのIPv4アドレスをみて同じサブネットにいるかどうか判別できる
- `example.com` などのFQDNはDNSによって `192.0.2.1` などのIPv4アドレスに解決される
    - IPv6アドレスの場合は `2001:DB8::1` などですが2020年現在ではIPv4だけでもまだ生きていけそう

## Linux

- RHEL, CentOSとDebian GNU/Linux, Ubuntuが違うこと
    - パッケージにはRPMやDebがありますがこれらは違うものです
    - 同じ名前のパッケージ(例えばnginx)をインストールしても設定ファイルのpathが違うことがある
- 権限/permission/user/group
    - ユーザーとグループには名前と数値で振られたIDがあります
    - 同じユーザー/グループ名でもIDが違えば、それは違うユーザーやグループです
    - `ls -l` などで表示されるユーザー/グループの権限は覚えましょう `rwxr--r--` とか `644` とかそういうやつです
    - `root` ユーザーのIDは `0` です、これは特別なユーザーで普段から使うべきものではありません
- シェルにはbash, zsh, ashなど種類がある
    - 微妙に違うのでシェルスクリプトを書くときにハマったりします
- ファイルシステム
    - 種類がありますが意識することは稀でしょう、選べる場合は `EXT4` か `XFS` を選べば大きく外しません
    - ファイルPATHは大文字小文字を区別します
    - ファイル名には次の文字種だけ使えば安全です: 半角アルファベット, 数字, `-`, `_`, `.`
        - ただし `.` を1文字目に使うと `ls` などで表示されず焦ります、特に意図がなければ2文字目以降に使うのが安全です
- ファイルの拡張子とファイルの内容が関係ないことを知っている
- Docker
    - `docker run` くらいはしたことあると良いですね

## Linuxコマンド

- SSHでリモートログイン
- `ls`, `cd`, `rm` などの基本的なコマンド
- vimの挿入モードとコマンドモード切り替えくらいはできると便利です
    - `i` とか `a` とか押してテキスト編集して、 `ESC` とか `Ctrl+[` 押して `:wq` とかするあれです
    - 「エディタはvim選びましょう」という意味ではなく、多くのLinuxサーバーでvimは使えるため [^1]

## Webサーバー

- Apacheとnginxがカタカナで読める
    - Apache -> アパッチ
    - nginx -> エンジンエックス
- Apacheかnginxを起動してHTMLを配信できる
- Basic認証を設定できる
- TLS/SSL証明書を設置できる

## Webアプリケーション/HTTP

_Webアプリケーション開発する場合、ここが一番多様になるでしょう。_
_「この言語やWebフレームワークが好き」というものがあればそれを選び、特にこだわりがなければ作りたいWebサービスや行きたい職場に合わせて選ぶのが良いのではないでしょうか。_

私自身は最近こういうやり方を試してます :arrow_down_small: 
[「手っ取り早くWebフロントエンド + WebAPIを作り始める方法2020」メモ - Qiita](https://qiita.com/mazgi/items/6377888d4f3cdeccbb2e)

- Webフロントエンドとサーバーサイドの区別がつく
    - Webブラウザが解釈できるのはあくまでHTML/CSS/JavaScriptです
    - Webブラウザでの処理は1人のユーザー向けなこと
    - サーバーサイドの処理は複数のユーザー向けに並列実行されること
- プログラミング言語とWebフレームワークとライブラリの存在を知っている
    - Rubyはプログラミング言語, Ruby on RailsはWebフレームワーク, `mysql2` はライブラリです
    - 興味のあるプログラミング言語の特性、インタプリタ(スクリプト)方式かコンパイル方式か、型のあり/なしなどを知っているときっと役立ちます
        - Javaのような言語や `go run` のような実行方法、TypeScriptのような例もあるのであまり深入りしなくても生きていけます
- 何かのプログラミング言語でWebサーバーを起動できる
- 何かのWebフレームワークを使って(あるいは使わずに)、 `/` にアクセスしたとき `here is /` 、 `/foo` にアクセスしたとき `here is foo` と表示できる
- ファイルの中身が `{"foo":1,"bar":"baz"}` だったときに「JSONだ」と気づける

## HTML/CSS/JavaScript

- テキストエディタで数行ずつHTML, CSS, JavaScriptを書ける
    - HTML, CSS, JavaScriptが区別できており各ファイルで完結できるという意味です
- ブラウザの「要素を検証」画面を開いたことがある

## バージョン管理/Git

- バージョン管理という概念
- Gitと `git add`, `git commit`, `git push`, `git pull` くらいのコマンド
    - [GitHub.com](https://github.com/)というGitのホスティングサービスがとても頻繁に使われます、無料でアカウント作って練習できるので慣れましょう
    - コンフリクトしたら周りの人に助けてもらうくらいの気持ちでいいと思います
    - おそらく日本語で一番易しく書かれた参考書籍
        - [いちばんやさしい Git&GitHub の教本](https://www.amazon.co.jp/dp/B07LBSWJNP)
        - [わかばちゃんと学ぶ Git 使い方入門](https://www.amazon.co.jp/dp/B071D4D6XX)

## データ/データベース

- テーブルとリレーションの概念
    - ER図読んだことあるとなお良し
- Create, Read, Update, Delete (CRUD)という概念
    - SQLで `INSERT`, `SELECT`, `UPDATE`, `DELETE` までしてみるとなお良し

[^2]: 物理サーバーに関しての「IOPS, ストレージサイズ->課金で増やせる、CPU(論理)コア数, メモリサイズ, ネットワーク帯域->課金だけでは増やせないこともある」ですが、「サーバーを買ってくることで(大規模なシステム停止を伴わずに)解決できるか?」といった考えが頭にあって書きました、ベテランの方にとっては曖昧な表現で恐縮です。IOPSはNVMeでそれなりの数値を, ストレージサイズはSASあるいは安価に済ますならSATAのHDDでそれなりの容量を叩き出せ、またIaaS各社も根本ではPCI-E接続など流通している規格に法っていると推測され、IaaS事業者ではない組織のオンプレミスサーバーでも近しい性能を得られます。しかしCPUコア数はTDP, 消費電力, 重量などの問題でラックに置けない、メモリサイズとメモリの規格は一定CPUに依存するため間接的にCPUと同じ問題に遭遇する、ネットワーク帯域はIDCの複数フロア, ラックに大変更が生じうる、などなど「サーバー1台だけ買ってきてもどうにもならない(こともある)」といった意図の文章でした、Web API叩くだけで誰でも100コアほどのCPU論理コアや0.5TB超のメモリが使えるなんてクラウドって便利ですね。伝われば幸いです。See also: [Amazon EBS Volume Types](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-volume-types.html), [(GCP)Local SSDs](https://cloud.google.com/compute/docs/disks/#localssds), [(Amazon EC2)Optimizing CPU Options](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-optimize-cpu.html), [(Amazon EC2)Memory Optimized Instances](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/memory-optimized-instances.html), [(GCP GCE)Machine types](https://cloud.google.com/compute/docs/machine-types), _Azureはあまり使ったことないんです、勉強します_

[^1]: 少なくとも `vim-tiny` または `vim-minimal` などの軽量版[Vim](https://www.vim.org/)がインストールされているはずです。Vimの元となった[Vi](http://ex-vi.sourceforge.net/)エディタの最新版は[ダウンロードページ](https://sourceforge.net/projects/ex-vi/files/)を見ると2005年リリースの `050325` のようです。