アラフォーCOBOL開発者がDjangoでWebアプリを作った話

#はじめに
Djangoを使用して初めてWebアプリを作成しましたのでその経緯や過程を書いてみました。この記事ではあまり開発内容には触れておりませんのでご了承ください。

#作ったもの
Web
[django-starchart.herokuapp.com](https://django-starchart.herokuapp.com/)

Github
[hayatek/star-chart](https://github.com/hayatek/star-chart)
汚いコードですが、公開します。。

#Webアプリの概要
フォームに入力されたGitHubリポジトリのスター数をGitHub APIより取得してグラフで比較することができるアプリです。

Celeryを使ってGithubから毎日1回データを取得して日次のグラフを作成するのと、月次では毎月1日のデータを蓄積したグラフを作成します。

#開発者について
IT業界の経験は10年以上、ずっとメインフレームコンピュータなどのレガシーな環境でCOBOLでの開発をやってきました。タイトルにアラフォーCOBOL開発者と書きましたが、最近はCOBOLすら書いていなくて完全にエクセルで資料作ってる人です。

#なぜ作ったか？
レガシーな環境からWebエンジニアへの転職を考えており、ポートフォリオになるようなWebアプリを作るために始めました。Pythonを選んだ理由は機械学習にも興味があり、機械学習をやる前にPythonに慣れておくのが良いだろうと考えていたからです。
また、Webアプリと言えばAPIだと思っていたのと、現職でも英語を使って仕事をしており、海外の人にも使ってもらえるようなアプリがいいと考えていたのでGithubを題材に選びました。

#何から始めたか？
とりあえずPythonの土台を作るためにprogateを一周やって、YouTubeのDjangoチュートリアルで簡単なゲストブックアプリを作ってDjangoの構造を理解しました。その知識を元に作り始めました。

#開発期間
開発期間は2019年4月〜2019年12月の9ヶ月間、合計時間は正確ではありませんが400時間弱ぐらいだと思います。HTMLとCSSは齧った程度の知識がありましたがPython,Django,Dockerなどほぼ知識0からだったのとBootstrapやchart.jsなどのライブラリについても学びながらアプリに実装していきました。それらの基礎を学ぶ時間も全て含んでいます。

#使用技術
##言語
- HTML
- CSS
- Javascript
- Python

##ライブラリ、FWなど
- Django
- Bootstrap
- GraphQL
- chart.js
- Celery
- Docker
- CircleCi

##本番環境
- Heroku

#アプリの構成
```
star-chart(プロジェクトルート)
├── chart
├── config
├── core
├── locale
├── staticfiles
├── templates
├── manage.py
├── Dockerfile
├── Procfile
├── Procfile.real
├── requirements.txt
├── requirements_local.txt
├── runtime.txt
├── docker-compose.yml

```

#大変だったところ
###Docker絡み
途中で業務を想定するならDockerで作るべきだと気付いて使ってみたのですが、一つのエラーに5日間溶かした事もありDocker絡みのエラーにはかなり悩まされました。

[DockerでAlpineイメージを使ってpandasのインストール&importエラーが発生した時にやったこと](https://qiita.com/hayatek/items/42da7e66b0eeea3f3f38)

何をするにもDjango on Dockerでやるとこうなるみたいな日本語チュートリアルが少なかった気がします。

###デザイン周り
HTML、CSSの知識不足もありますが、デザインセンスがないのでどうしたらイケてるデザインになるのか最後まで分からなかったです。

###ジョブの定期実行
GithubのAPIを毎日1回定期的に叩いてスター数をDBに格納する機能をつけたのですが、Celeryも日本語記事が少なくて苦労しました。結局公式ドキュメントを読み込んで実装しました。

[Django on DockerでCelery beatを使ってジョブの定期実行を実装](https://qiita.com/hayatek/items/060c786b862344418658)

###Herokuへのデプロイ
Dockerを導入した理由としてデプロイが簡単になりそうというのもあったので、本番環境にもそのままデプロイする気でいたのですが、全く思い通りにいかなかったです。
さらに初めてのデプロイなのにCircleCiを使って自動デプロイをやろうと欲張ってしまいそこでまた混乱しました。

普通のアプリをデプロイするだけでかなり手間取ったのですが、Celeryのデプロイもかなり時間がかかりました。
実験的なアプリのためHerokuの無料プランで動かす事を考えていたのですが、1Dynoで複数のワーカーを動かすという事例が少なくて中々デプロイできませんでした。その辺りはまた別のQiita記事を書こうと思ってます。

#心掛けたこと
とにかく今後業務でやっていく事を意識して、エラーで詰まった時も簡単な方に逃げずに時間がかかっても事象を理解して解決する事を心掛けました。

#今後追加したい機能
- リポジトリのサジェスション機能
- CSSやフロントエンドを体系的に学んでデザインの見直し

ただ、このアプリの開発に期間としては9か月もかけてしまったので今後は機械学習やブロックチェーンなど手を動かしながら次に作るものを考えていきたいです。

#レガシーな環境との違いについて
メインフレームコンピュータ(汎用機)などのレガシーな環境でCOBOLを使って開発してきた身として初めてWebアプリを作成しましたが、感覚的に10倍ぐらい？難しかったです。

あまり込み入ったロジックを組んでいないのもあってか、意外と言語的な違いによって躓くことは少なかったような気がします。
それよりもレガシーとWebでは環境的なところで学ぶべき事の量が全く違うと個人的には思いました。今回躓いたのはほとんどその部分でした。

例えばつい最近もローカルに保存したDBの内容を本番環境に移行したいと思って下記のコマンドを打ってエラーになりました。

```
docker-compose run app /bin/sh -c "python manage.py dumpdata > xxx.json"
```
うまくいけばDjangoの中のDBを全部ダンプしてくれてあとはloaddataすれば一瞬でデータ移行が終わるという凄い機能なのですが、コマンドを実行してみたら

```
Permission Deniedエラーが出る
→Docker固有のエラーなのかどうかの切り分け
→どうやらdockerとホストの権限設定の問題
→dockerとmac(unix)の権限設定について調べる
→Dockerファイルにchown追加する
→解決
→再度dumpdata
→今度は何も表示されない
→Djangoのdumpdataの仕様を調べる
→オプションいじってやっとエラーが表示される
→今度はpostgreのエラー
→postgreとdockerの間のエラー？
→・・・
```

みたいな感じで、docker、unix、django、postgreなどの知識を踏まえてそれらがどう関わってエラーになってるのかみたいな事を延々とやって解決していくという、そういうプログラムだけではない広範囲な知識が必要になるので大変でした。

ただ、stackoverflowを始めネット上の世界中のリソースを使えるというのは、そもそもネットアクセスが禁止されてるレガシー環境でやってきた自分にとっては大きな違いでした。

そして、個人的に感じた最も大きな違いはワクワクする！という事でした。何度もエラーに打ちのめされてきましたが、毎日ワクワクしながら開発してました。

これからもPython,Django以外にも色んなWeb技術を使って開発していきたいと思います。

#Special Thanks
###[progate](https://prog-8.com/)
ほぼCOBOLしかやった事ない人間が、よしPythonやってみよう！というきっかけをくれたのは間違いなくprogateでした。progateがなかったら自分でWebアプリを作るという事を始めてなかったかもしれません。最初のとっかかりを与えて頂きありがとうございます。

###twitterの方々
100daysofcodeタグを始め、たくさんのモチベーション高くプログラミング学習している方に出会いました。twitterがなかったら途中で挫折していたかもしれません。皆さん、ありがとうございました!

###[酒井潤さん](https://twitter.com/sakaijun)のUdemy講座
Pythonの文法や書き方でレファレンス的に使わせて頂きました。特に業務ではこう使う、という現役エンジニアならではの視点が参考になりました。

[現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル](https://www.udemy.com/course/python-beginner/)

###Django on DockerのUdemy講座
Django on Dockerのチュートリアルを探してた時にYouTubeで見つけてUdemyの有料版を購入しました。テスト駆動開発もセットになっててDockerの実装はほぼこのチュートリアルで学びました。英語ですが、分かりやすい発音で英語学習にも最適でした。

[Build a Backend REST API with Python & Django - Advanced](https://www.udemy.com/course/django-python-advanced/)

###現場で使える Django の教科書《基礎編》
この本は本当に教科書でした。情報が整理されていてDjangoの全体像がスッと頭に入ってきました。基礎的な部分から現場ではこうする！というベストプラクティスまで大変参考になりました。Djangoの教科書的な本を探しているならこの本一択だと思います。

[現場で使える Django の教科書《基礎編》](https://www.amazon.co.jp/dp/B07GK7BWB7/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)

###Qiitaの記事
[[Python] Djangoチュートリアル - 汎用業務Webアプリを最速で作る](https://qiita.com/okoppe8/items/54eb105c9c94c0960f14)
書ききれませんが、ここに挙げたもの以外もたくさんの記事に助けられました！

###[stackoverflow](https://stackoverflow.com/)
エラーに関する情報がかなり溜まっていてほとんどのエラーを解決してくれました。今後自分にも知見が溜まったらコミュニティにも貢献していきたいです。

#終わりに
肌感覚的にDjangoで個人開発してる人はあまり多くない気がします。他のフレームワークを使った事がないので比較は出来ませんが、一連のWebの技術を覚えられたので、まだ使った事がない人は一度使ってみてはいかがでしょうか。

とりあえずポートフォリオ的なものが出来たので、来年から(厳しいとは思いますができれば英語が使える環境で)Web系自社開発企業のエンジニアを目指して本格的に転職活動を始めようと思います。
以上、最後までお読み頂きありがとうございました！