ぼくのかんがえた さいきょうの新人研修

# お断り

- これは過去に社内LTで発表した内容です。
- 実際にこの内容を実施した実績も予定もありません。
- レビューを受けたりはしていないので、至らないところもあると思います。
- ネタ半分としてお読み下さい。

---

# 前々から考えていた…

- もし自分が新人研修カリキュラムを作ることになったら
- 十分な研修期間があったら

---

# 対象者

- Web系フルスタックエンジニアを目指す人向け
- 初心者の頃の私を想定
- 前提スキル
  - Cプログラミング基礎
  - Rubyプログラミング基礎
  - Linuxコマンド基礎
- 情報系の専門教育は受けていない

---

# コンセプト

簡単でいいから自分で作ることで原理を理解する

---

# では始めます

---

# PC自作

- 自作本を読む
- パーツを選ぶ
- 秋葉原に買いに行く
- 自分で組み立てる

なぜそんなことをするか？
→コンピュータ・アーキテクチャを学ぶため

---

# コンピュータ・アーキテクチャといえば

- パターソン＆ヘネシーが有名だが、それ以前にPC自作できるくらいの知識がないと読んでもピンとこないと思う。

この本もオススメ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/79394/d0c1bb97-0aa3-bb07-2bbc-71a95fa4b152.png)

---

# Linuxインストール

- 自作したPCにインストール
- ディストロはなんでもよい
- [Linux From Scratch](https://ja.wikipedia.org/wiki/Linux_from_Scratch)は時間がかかる割に教育的効果は小さいので素人にはオススメできない


---

# ネットワーク構築入門

1. LANケーブル（クロス）とPC2台を使い、IPアドレスとネットマスクを合わせて通信する
1. ハブを使って複数台のPCを接続する
1. ルータを設定してネットワークアドレスの異なるPC同士を接続する
1. ONU（光回線終端装置）とPCをつなぎ、グローバルIPを設定してインターネット直接続
1. ドメインをとってDNSを設定。ドメインでアクセス

---

# SSL対応Webサーバ構築

1. Let's Encryptでサーバ証明書を取得
1. nginxをインストール
1. nginxにサーバ証明書を設定してSSL対応

ここで公開鍵暗号と電子署名の基礎、opensslコマンドの使い方も学ぶ。

- [公開鍵暗号をプログラムで扱う方法のまとめ](https://qiita.com/kunichiko/items/7d4945d8b512ea1a3446)
- [opensslとかディジタル署名とか](http://d.hatena.ne.jp/ozuma/20121017/1350486666)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/79394/6683d6d9-f40b-f3b8-6357-1c040f3647d0.png)


---

# Unixプロセスモデル

- この辺はなんとなくじゃなくてしっかり理解
  - 環境変数
  - fork, exec
  - シグナル
  - スレッド
  - パーミッション
  - ファイルディスクリプタ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/79394/309fbfad-01d8-93f1-7eb7-f981259d535e.png)

本当は「詳解UNIXプログラミング」か「Linuxプログラミングインタフェース」を読んでほしい…

---

# ネットワークプログラミング初歩

- ソケットを使ったTCP/IPプログラミング
- Rubyで
  - [ネットワークプログラミングの基礎知識](http://x68000.q-e-d.net/~68user/net/)が素晴らしい資料だけどPerlなんで読み替え
- echoサーバ、echoクライアント

---

- HTTPサーバ（GETだけ対応でよい。RFCとかうるさいことは言わない）
- forkを使って並行サーバ化
- マルチスレッドで並行サーバ化

---

# rack入門

- rackとは
  - RubyにおけるWebサーバとWebアプリケーション間のやりとり方を定める仕様である
  - webrick, unicorn, pumaなどはrack対応Webサーバ
  - sinatra, RailsなどはWebアプリケーション
- Webサーバをrack対応
  - つまり、rackアプリケーションを呼び出せるようにする

---

# TCP/IP入門

- [3分間ネットワーク](http://www5e.biglobe.ne.jp/aji/3min/)のレイヤ３とレイヤ４を読む
- 目標は
  - SYN, ACK, FINの意味
  - コネクション状態遷移
  - を理解する
- （ゆくゆくは）Linuxカーネルのネットワーク関連パラメータの意味が理解できるようになればいいなあ
- 演習としてWiresharkを用いたパケットキャプチャ、netstatを用いたコネクション状態確認などを行うことになろう

---

# リレーショナルデータベース入門

- SQLの書き方
- サンプルDBでインデックスを張って、インデックスの威力を思い知る
  - O(n)とO(log n)の違い
- B+ツリーの構造を学ぶ
  - [MySQL with InnoDB のインデックスの基礎知識とありがちな間違い](http://techlife.cookpad.com/entry/2017/04/18/092524)
- 実行計画の読み方を学ぶ
  - インデックスが使われているか確認できるようになる

---

# トランザクション分離レベル

これをMySQLとPostgreSQLで実験する

||ダーティリード|ファジーリード|ファントムリード|
|---|---|---|---|
||トランザクションの途中で、他トランザクションでCOMMITされていないUPDATEやINSERTの影響を受けてしまうこと|トランザクションの途中で、他トランザクションでCOMMITされたUPDATEの影響を受けてしまうこと|トランザクションの途中で、他トランザクションでCOMMITされたINSERTの影響を受けてしまうこと|
|READ UNCOMMITED|起きる|起きる|起きる|
|READ COMMITED|起きない|起きる|起きる|
|REPEATABLE READ|起きない|起きない|起きる|
|SERIALIZABLE|起きない|起きない|起きない|

---

# 言語処理系自作入門

- yacc/lexを使って独自言語のインタープリタを作る。
- ↓この本を読んで実践

![image.png](https://qiita-image-store.s3.amazonaws.com/0/79394/9691aea8-2024-122f-ec07-c092bc5b536e.png)

~~正直あまり意味は無い。~~
インタープリタ自作本でもっといい本があったら教えてください。

---

# OS自作入門

- 「12ステップで作る組込みOS自作入門」の実践
  - マイコン実機上で動くOSを自作
  - BIOSの力も借りず、電源投入後最初に動くコードから書く
  - マイコンボードとPCをRS232-Cでつないで開発
  - OSが行っていることを実感とともに理解する
  - リンカとローダに対する理解も深められる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/79394/959710c8-43ed-6d97-5a11-e0464ce3faf0.png)

---

# 落穂ひろい

- CPU＞メモリ＞＞＞ネットワーク、ディスクという速度感覚
  - ネットワーク、ディスクのスループットを測定
  - pingでネットワークのRTTを測定
  - [モダンCPU命令のクロックサイクル数](https://qiita.com/aosho235/items/60bd41a5b41bcc3b6ea9)
  - [みんなが知っているべき数値](https://www.slideshare.net/kumagi/ss-78765920/4)
- 文字コード
  - 各種文字コードのファイルを16進ダンプしてみる
  - 文字化けに自分で対応できるようになること


---

# これくらいやれば十分だろう

- まだ物足りない人には…
- 書籍「コンピュータシステムの理論と実装」
  - NANDからテトリスまで
- 書籍「アンダースタンディングコンピュテーション」
  - ラムダ計算、チューリングマシン
 
---


# 完

---

# 採用情報

[ヴァル研究所](https://www.val.co.jp/)ではこういった研修を受けたいエンジニア志望の方を募集しています（…たぶん）。