# 2021-06-28 プロジェクトでの主な作業と必要なスキル
[2021-06-21 プロジェクトでの主な作業と必要なスキル - HackMD](https://hackmd.io/vwgY0SCHTmG8C_6bWoapFg?both)
## もやし
- 目的
- 7/1 からプロジェクトに参加することになったけど、プロジェクトで必要なスキルやマインドセットとかをあらかじめ共有しておくことで、早くプロジェクトに慣れてほしい。
- 1週間ごとに、できたことをチェックし合う
- 役割
- 参加者: 竹内、堀田
- 終了条件
- 堀田さんが、必要なスキルやマインドセットなどを説明を聞いて、次のアクションが分かっている
## 必要なスキル・知識
まずは、ここに書いてあることが必要になってきます。
最終的には、[Web Developer Roadmap 2020版が出ていたので2019版と比較 - Qiita](https://qiita.com/hirotakasasaki/items/f93335857c17f6ceab9f#devops) とかに書いてあることができれば、一人で生きていけると思います。
### イントロダクション
1. Git
- [ ] Git に関する基本的な知識を持っている
- [ ] Subversionとの違いを理解している
- [ ] ブランチを理解している
- Git については [Git - Book](https://git-scm.com/book/ja/v2) が色々参考になります
- 以下の作業ができる
- [x] ローカルリポジトリの作成 (git init)
- [x] リモートリポジトリのプロジェクトをコピー (git clone)
- [x] ファイルを更新してコミット、リモートリポジトリに反映 (git add, git commit, git push)
- [x] ブランチの作成・一覧の取得・チェックアウト (git branch, git checkout)
- [ ] マージ (git merge)
- [ ] コミット履歴の表示 (git log)
- Git ホスティングサービス (GitHub など) が使える
- [x] プルリクエストが出せる
- [ ] プルリクエストの差分を確認できる
- [x] ブラウザ
- [ ] 開発ツール (VS Code など)
- [x] プルリクエストをマージできる
2. Linux の基本的な操作
- [ ] 基本的なコマンドを使える
- [ ] pwd, cd, ls, cp, mv, rm, mkdir, ln, cat, less, vi, find, grep, xargs, ssh, ps, kill, chmod, chown, curl
- ln(シンボリックリンク作ったりするやつ)
- xargs
- ps
- kill
- [x] vi は編集・保存・終了・保存せずに終了 ができればOK
- [ ] コマンドの使い方が分からないときに help を表示して、読むことができる
- コマンド --help
- コマンド -h
- man コマンド
- コマンド ← オプション必須のときはエラーになってヘルプが表示される
- [ ] 【優先度 低】標準入力・標準出力・標準エラー出力を理解して、パイプラインとリダイレクトが使える
- 標準入力・標準出力・標準エラー出力
- パイプライン
- `cat /path/to/hoge.txt | grep HOGE` は分かる
- リダイレクトとは
- grep HOGE hoge.txt > output_hoge.txt ← 必ず上書き
- grep HOGE hoge.txt >> output_hoge.txt ← 追記
- `>` だと標準エラー出力はファイルに出力されない
3. Markdown
- [x] Markdown が書ける
### バックエンド
1. Python
- [ ] Python で一通りのことができる
- [Python チュートリアル — Python 3.9.4 ドキュメント](https://docs.python.org/ja/3/tutorial/)
- インタプリタが使える
- if, for, 関数などの基本的な制御構文が使える
- リスト, ディクショナリなどの基本的なデータ構造が使える
- モジュールが import できる
- フォーマット済み文字列リテラルが使える
- 簡単なファイル入出力ができる
- 例外処理できる
- クラスを作れる
- [ ] Python でテストが書ける (unittest)
- [ ] pip を使ってパッケージをインストールできる
- [ ] Flask を使って「Hello, world!」を返す
- [ ] 【優先度 低】Poetry を使って仮想環境が作れる
- [ ] 【優先度 低】イテレータやジェネレータ、ラムダ式が使える
2. SQL
- [x] 単純なDML・DDLが書ける
- [x] create table ...
- [x] select (join, where)
- [x] insert
- [x] update
- [x] delete
- [ ] 【優先度 低】トリガーとは何かを知っている
3. REST API
- [ ] 「[O'Reilly Japan - Web API: The Good Parts](https://www.oreilly.co.jp/books/9784873116860/)」を読んでいる
- [ ] 2章
- [ ] 3章
- 次の作業 (REST APIを作る) に必要なさそうな部分は分からなくてもOK。飛ばそう
- 2.6 ログインと OAuth2.0
- 3.2 JSONP の取り扱い
- REST APIの設計について、基本的なことを理解している
- [ ] 一覧取得・登録・詳細取得・更新・削除 を行うAPI仕様書 (Swagger Spec) が書ける
- [Swagger Editor](https://editor.swagger.io/)
- [ ] 何かのフレームワーク(Flask など)を使って、一人でAPIを作れる
4. RDBのインデックスを理解している
- [ ] 【優先度 低】[SQLのインデックスとそのチューニングについてのオンラインブック](https://use-the-index-luke.com/ja) くらいでOK
### フロントエンド
1. HTML・CSS
- HTML を書いたことがある
- CSS を書いたことがある
- Chrome の開発者ツールを使ったことがある
2. JavaScript
- [ ] JavaScript の歴史をざっくり知っている
- [JavaScriptの歴史をざっくりまとめたよ! - Qiita](https://qiita.com/DeployCat/items/c900a6f62862954d62e0) とか
- Node.js
- EC6
- webpack
- Babel
- TypeScript
- ...
- [ ] JavaScript で一通りのことができる
- [JavaScript Primer - 迷わないための入門書 #jsprimer](https://jsprimer.net/) とか
- 基本的な制御構文が使える
- 非同期処理が書ける
- コールバック関数
- Promise
- Async
- 罠を知っている
- this
- `==` と `===` の違い
- ...
- [ ] npm (または yarn) を使ってパッケージをインストールできる
- [ ] JavaScipt を使って簡単なアプリケーションを作れる
- GitHub の今週の人気トップ10のリポジトリを表示するWebページ
- タスクの追加・編集・削除・完了ができるToDoアプリ
3. SPA (Single Page Application)
- [ ] SPA を理解している
- Vue.js
- [ ] 公式ドキュメント [はじめに — Vue.js](https://jp.vuejs.org/v2/guide/index.html) を読んでいる
- コンポーネントが使える
- [ ] Vue.js を使って、ToDoアプリを作れる
- [ ] Vuetify を使って、ToDoアプリを作れる
- [ ] Vuetify を使って、Web API から取得したデータを一覧表示する
### DevOps
1. ネットワークの基本的な知識
- [x] ブラウザでWebサイトを表示する際の大まかな流れを理解している
- DNSとかIPアドレスとか、ロードバランサー(LB)とか
- [ ] TCP
- スリーウェイハンドシェイクを知っている
- アプリケーション通信では「ポート番号」が使われていることを知っている
- HTTP なら 80、SSH なら 22 とか
- NAT, NAPT を知っている
- 【優先度 高】SSHポートフォワーディングが使える
- [ ] HTTP
- HTTPメッセージの構造を理解している
- HTTPステータスコードを理解している
- 2xx は成功とか
2. Docker
- [ ] 以下の作業ができる
- 基本的なコンテナ操作ができる (docker pull, docker run, docker ps, docker start, docker stop, docker rm)
- 実行中のコンテナに入れる (docker exec)
- Dockerfile を作って、イメージを構築できる (docker build)
- [ ] イメージとコンテナの違いを理解している
- [ ] volume を使って、ホストマシンとコンテナでファイルを共有できる
- [ ] Docker Compose を使って、複数のコンテナを管理できる
3. CI/CD
- [ ] CI/CD を知っている
- [ ] 【優先度 低】CI/CD 環境を構築したことがある
4. AWS
- [AWS Hands-on for Beginners](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-hands-on/) の内容を一人でできる
- [ ] ハンズオンはじめの一歩: AWS アカウントの作り方 & IAM 基本のキ
- [ ] スケーラブルウェブサイト構築編
- [ ] AWS 上で静的な Web サイトを公開しよう!
- [ ] Network編#1 AWS上にセキュアなプライベートネットワーク空間を作成する
- [ ] 【優先度 低】サーバーレスアーキテクチャで翻訳 Web API を構築する
- [ ] 【優先度 低】AWS 環境のコード管理 AWS CloudFormationで Web システムを構築する
- 以下のサービスを使ったことがある
- EC2
- S3
- IAM
- RDS
- VPC
- 【優先度 低】CloudWatch Logs
- 【優先度 低】Lambda
- 【優先度 低】CloudFormation
- [ ] AWS CLI が使える
5. 【優先度 低】IaC (Infrastructure as Code)
- Ansible
6. VS Code
- [ ] VS Code で開発できる
- タスクが使える
- 必要に応じて設定や拡張機能をインストールできる
## 結局、何ができるようになればよいのか?
1人で↓のようなことができるようになることを目指しましょう。
1. GitHub とかにリポジトリを作る
- push したり clone したりする
- プルリクエストを出して、マージする
2. Flask を使って、REST API を作る
- [Webアプリ初心者のFlaskチュートリアル - Qiita](https://qiita.com/kiyokiyo_kzsby/items/0184973e9de0ea9011ed) とか
- ローカルで起動できればOK
- 最初は「Hello, World!」を返すだけでOK
- 次は、JSONで、一覧取得・登録・詳細取得・更新・削除 できるAPI仕様書を書いて、それとおりに実装する
- 全部じゃなくていいから、テストを書く
3. REST API を使って、データを DB に登録・参照する
4. Docker 化する
5. 【飛ばしてもいいかも】Poetry を使ってパッケージ管理する
6. Vue.js で作った SPA から API を呼び出して、一覧取得・登録・詳細取得・更新・削除する
7. API を AWS 上で動かす (EC2とか使う)
8. SPA を S3 にホスティングする
9. CI/CD 環境を構築して、リポジトリに push したら、自動でテスト・デプロイが実行されるようにする
## これからのこと
- 1週間ごとに、できたことをチェックし合う
- 6/28(月)の目標
- GitHub にリポジトリ作る
- `README.md` を書く
- 余裕があれば Python のスクリプトを書いて、このリポジトリに入れておくといい気がします
- 7/5(月)の目標
- 「2. Flask を使って、REST API を作る」
- 一覧取得だけでOK
- 余裕があればそれ以外もやる
- 何かあると嫌なので、リポジトリはプライベートにする
- [ ] 7/1はどうする?
- 竹内が聞いておきます!
- [ ] 7/1まで出社するのか?
- 竹内が聞いておきます!
- 長期の目標(いつ頃までに、「結局、何ができるようになればよいのか?」を終わらせるのか?)
- 「結局、何ができるようになればよいのか?」を終わらせるのも重要だけど、それだけじゃない
- 寄り道も重要です
- 試行錯誤する
- 詰まったときに質問・相談する
- 自分をやりやすい環境を整えていく
- 「木こりのジレンマ ジョジョ」でググる
- 1ヶ月で「結局、何ができるようになればよいのか?」の 6 までを目標にする!