個人開発２年間の軌跡

## まえがき
Webアプリ開発を始めて２年しか経っていませんが、経験の浅い時の記憶はいま残さないと忘れるので、当時を思い出しながら学習中/開発中に感じたことを記しました。もともとハードウェアやC言語に触れる機会はありましたが、Web技術の知識はゼロでした。客観的に見て自分は、勉強が苦手で新しいことを吸収するスピードは遅い方だと思います。私のように強強ではない人の励みになれば幸いです。


## 対象読者
個人でWebアプリ開発にチャレンジしたい人を対象としています。就職/転職を目指している人には合わないかもしれません。頻繁にブランクがあり、企業やチーム開発で求められることをバッサリあきらめる場面があるので。

## 環境・ツール
- Windows10, 11
- WSL2 Ubuntu
- Django, Python
- gunicorn, Postgres, nginx, https-portal
- ConoHa VPS
- Docker

## 個人開発を始めた動機
それらしい理由としては **『業務における課題解決』** です。かねてより、担当する社員研修の教材をWebアプリ化して、**章末課題レポートでOK判定もらわないと先に進めない仕組みにしたい** と考えていました。そんな願望はあったものの、実現するために必要な学習量が見えず気が引けてました。その後、色々な要因が重なって時間を確保できた時に、 **実現できる見込みは無いけど、とりあえず始めてみるか** 程度のゆるい気持ちでスタートしました。


## 時系列
|期間|イベント|
|---|---|
|2020/9 ～ 11|Web一般知識とDjangoの学習|
|2020/11 ～ 2021/1|Ver.1 制作|
|2021/2 ～ 8|運用、Web開発休止|
|2021/9 ～ 10|Djangoの学習|
|2021/11|Web開発休止|
|2021/12 ～ 2022/1|Ver.2 制作|
|2022/2 ～ 6|運用、Web開発休止|
|2022/7 ～ 8|Dockerの学習、Ver.2のDocker化|


## アプリの主な仕様
- Ver.1： ユーザー管理（講師, 受講生）、教材投稿・閲覧、レポート投稿・判定、進捗に合わせた教材開示
- Ver.2： 全部作り直した上でフォーラム機能の追加

## フレームワークの選定
- Ver.1： ユーザー管理機能が必須。知識ゼロから充実したユーザー管理環境を整えやすいのはDjangoかな、って気がしたので。
- Ver.2： 作り直す気満々であり Djangoである必要はなかったが、良い教材に巡り合い Django のままで行くことに。


## Ver.1 完成までの道のり

### Webサイト[『Django Girls』](https://tutorial.djangogirls.org/ja/)による学習
Web一般知識、開発ツールの基本という最低限の前提知識を与えてもらってから、Djangoの基本、アプリ制作 に取り組むという構成のおかげで挫けず学習できました。本編だけでなく、[Django Girls: Extensions](https://tutorial-extensions.djangogirls.org/ja)のHerokuデプロイまで実施。httpsが付いたURLでアプリ画面が表示された時は嬉しかったです。
研修本番もHerokuで乗り切ろうとしましたが、無料版は同時接続数20と判明。本番はこの数を超えるので課金が必要…。この時、課金するならVPSにしたい、Linuxに自分でシステムを乗せてWeb公開できれば自信がつきそう、と考えました。HerokuはVPSでデプロイできなかった時の保険としました。従量課金サーバーは怖いのでAWS等は候補外です。
（そういえばHeroku無料枠廃止で、学習し始めの人には何が鉄板になるんでしょうかね。。）

### 書籍[『Django for Beginners』](https://www.amazon.co.jp/dp/1735467200/)による学習
まだ自分で何かを作れる気がしなかったので基礎固めを続けることに。本屋で[『Django開発入門』](https://www.amazon.co.jp/dp/B09RB1NXHY/)を購入。立ち読みした時は「やるぞ！」って感じでしたが、DjangoやWeb技術の理解が浅い状態で、PycharmやSourceTree、メール機能実装など、当時の自分には把握できないことが重なり学習が嫌になってしまいました。（当時の自分には早かっただけなので、気になる方はぜひご自身の目で確認してください）  

とはいえ諦めるわけにもいかずネットを彷徨っていたところ『Django for Beginners』に目が止まりました。洋書は初めてで不安でしたが、DeepLに助けてもらい問題なく学習できました。ただ、読み返す用のMarkdownファイルを作り（※1）ながら学習していたので、かなり時間を費やした気がします。（ ※1: 翻訳結果を整えてコード情報を加えるの繰り返し :persevere:）
書籍の構成は、章が変わるごとにプロジェクトを新規作成し、少しずつ大きなアプリを制作する形式。構成だけでなく解説もスモールステップなので、人によってはまだるっこしいと感じるかもしれませんが、当時の私にとっては本当にありがたかったです。

### いよいよVer.1 アプリ制作
アプリの仕様検討では、学習を断念した『Django開発入門』に手書きスケッチでアプリイメージを固める方法が記されており、参考にさせてもらいました。
書籍にならって自分でも落書きしながらアプリのイメージを形作っていきました。（雑すぎるスケッチだったので捨てた様子 :cry: ）
コードに落とし込む段階では『Django for Beginners』を読み返したり、ネットの情報を参考にしながら、どうにか完成まで漕ぎ着けました。この時に海外のFAQサイトも活用できるようになり、[頑張って投稿](https://learndjango.com/tutorials/django-markdown-tutorial)にもチャレンジしました。海外の人から **それは私の問題でした** って返信があった時は非常に嬉しかったです。とはいえ、いまでも日本のFAQサイトを最初にチェックします。。

### ドメイン取得
どこかのサイトを参考にしたと思いますが作業メモ紛失。
お名前.com の公式ページの解説を一番丁寧に読んだ記憶はあります。
　
### ConoHa VPS デプロイ
ブログ[『DjangoでWebサービスをリリースする手順』](https://blog.codecamp.jp/django-release-basic)を中心に、国内外様々なサイトにお世話になりながら、どうにかアプリをデプロイできました。アプリ仕様に修正したい点は多々ありましたが、変にいじって再デプロイできないことが心配で、今回は余計な手出しはせずに研修本番を乗り切ることにしました。ここで、一旦アプリ開発は終了。残り時間は教材内容の修正に充てました。

## Ver.2 完成までの道のり
Ver.1の完成から半年以上、Web開発を休止しました。勉強もせず。再開するにあたって Ver.2 の制作スケジュールを立案しました。Django開発の記憶は無くしていたので、もうDjangoにこだわる必要はないと思いながらネットサーフィンしていました。Go言語とかできるとカッコいいなぁ等、余計なことを検討しながら結局はDjangoに落ち着きました。
決め手はudemy講座。プレビュー動画をみて、**これができれば以前よりも望む形にできるかも**と思えたのです。

### udemy講座 [『【Python】 Django3で「本当に使える」WEBアプリケーションを開発しよう』](https://www.udemy.com/course/reallysite/) による学習
講座に沿って進めてDjangoスキルを高めつつ、アプリ再構築について考えることにしました。講座を最後まで学習しましたが、GCP利用や後半の仕様は自分のアプリには不要なので、中盤までの仕組みを参考にしました。
この講座で特に良かったのは、無理にクラスベースビュー開発に寄せていない点です。『Django for Beginners』は最終課題アプリでクラスベースビューで固める方法を採用していて、正直理解度はイマイチでした。Ver.1はそのクラスベースビューで固めたお手本アプリを改造して作ったので、自分で組み上げた感が薄かったです。時間的にそうする他なかったのですが、次は全部作り直したいと考えていました。

講座の解説は全体的にわかりやすいです。特徴を以下に挙げておきます。
- 関数ベースビューを主体にしながら、クラスベースビューも適材適所で用いる
- Bootstrap の利用
    - Bootstrap臭という言葉があるみたいですが、今は不満を感じないのでひとまず他の技術には手を出さない予定です。
- テンプレートの使い方
    - 実現可能なことが増えました。Ver.2作成においては『それはテンプレートに頼りすぎじゃね？』と怒られそうな使い方をしたかもしれません。
- モデルリレーションの丁寧な解説
    - ForeignKey、OneToOneField、ManyToManyField について理解度を上げたい人におすすめしたいです
　
### Webサイト[『Snow Tree in June』](https://snowtree-injune.com/django-series-dj000/) で学習
Ver.2 アプリ開発の前に、デプロイ作業の苦手意識を解消することにしました。アプリ完成後の作業に不安があるようでは、安心して開発できないと考えたのです。サーバーをリセットしても確実にデプロイできる、その自信を手に入れたかったのです。
このタイミングで見つけたのが、SnowTreeさんのサイト。このサイトの丁寧さがあればサーバーリセットしても再現できると思いました。

早速サイト内容に沿って作業したかったのですが、まずは、まぐれで動いているサーバーを初期化しなければなりません。それにはVer.1のバックアップが必要。でもバックアップの取り方が分からない。。(dumpdata/loaddataは検索Hitしているはずですが、怖くて手を出していない様子)
結局 ConoHa VPS のイメージ保存機能を使うことにしました。（時間が経つと消えると知ったのはだいぶ後になってから :scream:）
ドキドキしながらサーバーリセットした後は、サイト内容に沿って作業することで小さなアプリをデプロイできました。
SnowTreeさんのサイトはDjango関連も丁寧ですが、Pythonの言語仕様の話も、他ではサラッと流されている話題を深堀しているので非常におすすめです。

### Ver.2 アプリ制作
SSHで本番サーバーにつないで直接開発することにしました。きっと今時のやり方ではないんだろうなぁと思いましたが、独り作業なので良しとしました。
udemy講座のアプリ仕様はGCP利用を前提としていたので、VPS のUbuntuに乗せる形にして、本番環境で動く状態にしました。これをベースにVer.2を開発しました。ちなみにこの時ハマったことをQiitaに投稿していたので[リンクを貼っておきます。](https://qiita.com/gmasa/items/f136ddfd4fd36d7348d1)
udemy講座のおかげで、自分で理解しながら部品を組み立てている感覚を持って制作できました。開発前の落書きはVer.1同様、捨ててしまったけど:cry:
ただ、当時はPythonの理解が今よりもイマイチだったので、コードを見返すと無駄が多いです。Ver.3 はPythonらしいシュッとしたコードを目指します。　
　
## Ver.3 に向けて
Ver.3に取り組む前に、まずはVer.2を本番データ込みでいつでも動作できる環境を作ることにしました。資料としてすぐに見返せるようにしたいのです。次のVer.3もコードは全部書き直したいので、当然モデルの構成は変わります。アプリの仕様や教材内容も変えていくので、一つのアプリで過去Ver.データを読むことは考えないことにしました。つまり毎年異なるアプリをリリースして、それをローカルで気軽に確認できるようにしたいということです。
いよいよ **Dockerを勉強するしかない** と考えました。


### Docker学習
[とまと家さんの記事](https://note.com/tomatist/n/na1bd7cd1bf33)が、やりたいことに一致していましたが、内容的に作業の羅列なので理解するには基礎知識が必要と判断しました。その後、Web記事を読み漁って、わけわからない期が続いた後、[Python VTuber サプーさんの講座](https://www.youtube.com/watch?v=B5tSZr_QqXw) で、Dockerの概念がようやく理解できました。しかし、docker-composeを扱っていないので他の講座を探すことに。
同じくYouTube [山浦さんの講座](https://www.youtube.com/watch?v=lZD1MIHwMBY)。すごい長尺。途中まで順調でしたが Rails 利用のところでエラー。粘ってみましたが、docker初歩を学習中かつ rails を使ったことがない状態で エラー対策する気になれず断念。（再チャレンジしていないので問題が特定できないまま。Macなら起きなかったのかなと思うけどMac無いし。。振り返ると、WSL2 ubuntu とコンテナ側の権限が合っておらず、パーミッションエラーが起きたと予想。違うかもしれないけど。）
　
udemy講座[『駆け出しエンジニアのためのDocker入門』](https://www.udemy.com/course/docker-startup/)で、docker-compose まで学べましたが、まだ自分の環境を作れる気がしない。。とまと家さんの記事を再確認してみて、前よりは分かるけど、うーーーん、モヤモヤが消えない。

Zenn [『docker-composeでDjango開発環境を構築する』](https://zenn.dev/dsonoda/articles/dbe14ca8af617ed85b1f) これはだいぶ良さそう。これに沿って進めてみましたが途中から理解できなくなりました。。。（くどいですが私の実力不足が原因です）
元気を取り戻して参考元の記事を確認することにしました。最初にリンク先を確認しているはずですが、英語サイト 即 スルー をかましたようです。

## Webサイト[『Dockerizing Django with Postgres, Gunicorn, and Nginx』](https://testdriven.io/blog/dockerizing-django-with-postgres-gunicorn-and-nginx/) で学習
DeepLに頼りながら読み始めたら、 **はじめからこれ読んどけば良かったじゃん** ということに。。取り組み方として **コードやコマンドのコピペはしない。ベースイメージのVer.も変えてみる** という方針を採りました。
alpineって何？ apkコマンド？ おれは普通のubuntuで行く！ って生意気な態度で臨んだら、案の定、色々苦労しました:tired_face:。良いところまでいきましたが、最後の作業でどうにもならない状態に。一旦振り出しに戻って、今度はほぼお手本通りに進めることにしました。2度目は理解も進み、実際に nginx, gunicorn, postgres の組み合わせでサンプルアプリを動かすことができました。（本当は4回やっている）
　
### SSL対応
上のWebサイトの末尾にSSL対応記事のリンクがあり、内容確認しましたが難しそうだったので他をあたることにしました。行き着いたのが、https-portal というDockerイメージを使う方法。Qiita 等の色々なサイトを参考に動作させることができました。
途中、当たり前のように **もうイヤだ** という状況に陥っています。やることなすことスムーズにいかないのなんなんですかね。多くのケースで注意力散漫が原因ってわかっていますが:sleeping:

### Ver.2 Docker化
以下のような流れで、Ver.2 Docker化を進めました。
1. 今動いているものはお手本の寄せ集めで、よくわからないものが入っている。とはいえ、ローカルPCでも構わないので Ver.2 がDockerで動く様子を早く見たくて移植作業に着手。
1. ローカルPCで Ver.2 のDocker化は実現できたけど、Ver.3開発を見据えて今やるべきことがあるはずなので、状況を整理。
1. https-portal, nginx, gunicorn, postgres を利用するパターンの、自分なりのテンプレを構築してから、本番環境で Ver.2 のDocker化に挑戦。
1. **俺のDocker開発テンプレート** の構築
1. サーバーのDockerインストール
1. テンプレートを使って Ver.2 のDocker化、デプロイ

## 最後に
Docker作業の詳細は別記事にしたいと考えています。。元気が出たら頑張って書きます。

↓ 書きました。
[『Docker学習、私はこう取り組んだ』](https://qiita.com/gmasa/items/8194fb0c58771cb5b4f4)