ネクストスキル週次ゼミ受講開始(4月のゼミまとめ)
4 月から、ネクストスキルの週次ゼミを受講しはじめました。
もともと講師の方と面識があり、以前からいろいろ教えてもらっていましたが、今回週次ゼミを始めるとのことで、良い学習の機会になりそうだったので、受講することにしました。
以下のようなメリットを感じたため、受講を決めました。
- 1 年を通して週次で受講するため、良いペースメーカーになりそう。
- わからないことは質問ができる
- カリキュラムで、アプリケーションの設計、インフラ設計、Web 周りの学習があった
- IT エンジニアとしての幅広い基礎知識の学習、メンテナンスができそう
カリキュラムは Web アプリケーション開発にとどまらず、フロント、OS、インフラ(パブリッククラウド)、プロジェクト管理方法などなど、かなり幅広く、IT エンジニアとしてのスキルを全体として底上げできるように思えました。
1 ヶ月受講してみて
1 ヶ月受けてみての感想ですが、開発における知識を体系的に学習できていると思います。
また、ホワイトボードを使って、図で順を追って説明してもらえるので、スライド一辺倒よりわかりやすく感じました。
30 分ごとに質問タイムがあり、気軽に質問でき、LINE でも質問可能です。かなり手厚い。
おそらく講師の方が、たくさんの本を読み、経験を積んだ得た内容に裏打ちされているため、開発に関する優先度が高い知識や、今の主流な方法を学べてると思います。
もちろん週 2 時間で全てを完全に理解し、使いこなせるようになるわけではないですが、体系化されて圧縮されているので、そこから自分で学習することができそうです。
知らなければ調べることもできないですし、効率が悪くなりますしね。
4 月に学んだこと
4 月に学んだことは以下です。
週次で 2 時間なので、4 月は、合計 8 時間でした。
第 1 週
エンジニアのスキルロードマップと、Web について学びました。
- エンジニアのスキルアップ
- ロードマップ
- 開発に関わるロール
- システムを俯瞰した観点と、何を作るのかという観点
- 何ができたら一人前か
- フロント、サーバサイド、インフラそれぞれ
- その他知っておいた方がいいこと(Git やセキュリティ、リーダブルコードなど)
- Web とは、Web アプリとは
Web アプリの基本構成から、エンジニアのロールを眺めてみるのは新鮮でした。図にするとしっくりくるなと。だいたいシステムの境界、WebAPI の境界で分かれるなと思いました。
エンジニアロードマップの、Frontend と Backend を眺めました。 最近社内でもちらほら見かけてましたが、このとき初めてみました。グローバルなスキルの全体像がわかるため、定期的に確認しようと思います。
また、スキルの中でも情報設計が廃れづらいという話がありましたが、その通りだなと思います。PM だろうが、エンジニアだろうが、どんな職種でも必要なスキルだと思います。
第 2 週
第 1 週の話を踏まえ、Web の仕組みについて学習しました。
- そもそも Web とは
- Web の要素(Web ブラウザ、Web サーバ)
- ブラウザのリクエストから、サーバがレスポンスを返すまで何が起きているのか、順番にみていった
- 通信の様子をみながら、HTTP を理解する
- HTTP 上に、Web サーバ(nginx)をたてて、アクセスしてみた。ディレクトリ構造などを確認
- ngrep を入れて、パケットをキャプチャ
- Web アプリとは何か
- ruby で簡単な Web サーバを作った
- Web サイト・Web アプリの基本的な構成パターン
- Web サイトと Web アプリの違い
- 3 世代の構成パターン
nc コマンドを初めて知りました。curl は 主に http(アプリケーション層)などですが、nc は TCP or UDP(トランスポート層)から選んで通信することができるようです。
AWS だと ELB などを使えば、apache, nginx は不要ではないかと思っていましたが、必要になるパターンもあるようです。いくつかリンクを教えてもらいました。
- ALB 経由で公開する AP サーバに(リバースプロキシ用の)Web サーバーを利用する意味はあるのか?立ち止まって考えてみた
- Nginx を利用して CloudFront 対応の WordPress を環境を最適化してみた
- Amazon クラウドでの最適なロードバランサーの選択
上記を見ると、以下のような面で、apache や nginx を検討することがあるようです。
- アクセス制御や、ALB でできない複雑なルーティングをしたい
- Wordpress のサーバ直で来られるより、Nginx のサーバで門前払いしたい。あとサクッとベーシック認証したい
- レート制限など、やることによってはコスト面で有利になることもある
第 3 週
Web フレームワークについての解説と実装を学習しました。
- フレームワークを使わず、Web アプリを実装
- まずフレームワークを使った Web アプリと比較
- フレームワークの役割とは
- ルーティングの機能、コントローラーの実装
- HTML の構築(テンプレートエンジン)
- OR マッパー
- WebAPI と Ajax
第 4 週
月の最後は、受講者の事前アンケートで内容を決める方式で、以下の内容を学びました。
- ポートとソケットとコネクション(TCP/IP)
- Web フロント・サーバサイドのフレームワークの選択
- Web セキュリティの基本
- XSS, SQL インジェクション, CSRF などよくある脆弱性の解説、デモ
- テスト駆動開発
- Ruby によるテスト駆動開発のデモ
- Ruby でのアプリケーション設計例(Service クラスなど)
学んだ内容について気になったところ
4 月に学んだ内容から、追加で気になったことを調べたり、手を動かしてみたりしました。
Kotlin(Java)で HTTP サーバを作成
Socket 通信をあまり触る機会がなかったので、良い機会でした。
ゼミでは Ruby で作成していたので、Kotlin で HTTP サーバを作ってみました。(Kotlin といっても、JVM で動作させますし、Java の機能を使うんですが)
HTTP リクエストを受け取り、固定の HTTP レスポンスを返すだけです。
import java.net.ServerSocket
private const val LISTEN_PORT = 8000
fun main() {
ServerSocket(LISTEN_PORT).use { serverSocket ->
serverSocket.accept().use { socket ->
socket.getInputStream().bufferedReader().use { input ->
socket.getOutputStream().bufferedWriter().use { output ->
var line = input.readLine()
while (line.isNotEmpty()) {
println(line)
line = input.readLine()
}
val response = """
HTTP/1.1 200 OK
Content-Type: text/html
<!DOCTYPE html>
<head>
<title>kotlin server</title>
</head>
<body>
<h1>hello kotlin!</h1>
</body>
</html>
""".trimIndent()
output.write(response)
output.flush()
}
}
}
}
}
curl で HTTP リクエストを送信してみます。
$ curl -v http://localhost:8000/hello.html
* Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 8000 (#0)
> GET /hello.html HTTP/1.1
> Host: localhost:8000
> User-Agent: curl/7.64.1
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Type: text/html
* no chunk, no close, no size. Assume close to signal end
<
<!DOCTYPE html>
<head>
<title>kotlin server</title>
</head>
<body>
<h1>hello kotlin!</h1>
</body>
</html>
* Closing connection 0
お手軽に書いているので、以下のような問題や、課題が考えられます。
- リクエストパスに応じて、返す HTML リソースを変更する
- 1 リクエストを捌いてプログラムが終了してしまう
- 複数リクエストで捌けない(マルチスレッドにするか、ノンブロッキングにするかとか)
ちゃんと HTTP サーバを作ろうと思うと、やることがいっぱいありますね。
ミドルウェアや、Web フレームワークありがたや。。
最後に
週 2 時間学習して、気づいたことや気になったことを自分で調べたり、ちょうどいい感じで学習できていると感じました。
5 月以降も引き続きがんばります。
