---
# System prepended metadata

title: 2019 年 2 月に退職してから 1 年間の学習記録

---

# 2019 年 2 月に退職してから 1 年間の学習記録

## はじめに
退職して一年という節目を迎えるので、これまでやってきた学習内容を整理する。

![](https://i.imgur.com/VHoX11N.jpg)


## 学習記録

### HTML/CSS
Webアプリケーション開発をするにあたって、必要最低限の知識に絞って学習したつもりである。CSSについては苦手意識が強く、最初の頃は思った通りにスタイルが当たらないことが多くてフラストレーションを感じていた。セレクタで指定する影響範囲のスコープについて意識し始めた頃に、苦手意識が薄くなっていったのを覚えている。チーム開発では、Bootstrapを使えばなんとかなると思っていて、クラスの命名規則やスタイルのコーディングルールを決めなかったことがあった。最終的に、お互いのスタイル が干渉するのを直す作業で手戻りが多く発生した。それ以降、命名規則はGoogle等のスタイルガイドに従い、Prettierで整形することでコーディングを統一することにした。この経験から、ベストプラクティスでなくても良いが、最低限書き方は統一すべきという意識が芽生えた。

### JavaScript
フローや論理式が理解できれば、それをコーディングできるようにはなった。
* [チュートリアル： 迷路生成プログラム](https://github.com/Matsuhaya/generate-maze-tutorial)
* [遺伝的アルゴリズム(GA)シミュレータ](https://github.com/Matsuhaya/ga-triangle)

Chromeの開発ツールでデバッグするようにして、開発効率が上がった。
自動テストは、そろそろ実践したいと考えているがまだ手をつけれていない。
フレームワークに関して、VueやReactは学習のためにチュートリアルを実践した程度。
仮想DOMは素晴らしいメリットがあるが、フレームワークを使ってメリットがあるほどの規模のアプリケーションをつくらなかったため、必要性がなかったので使用していない。

バックエンドは、Node.jsでチャットボットのAPIを作成した。最初、MVCをどうやって構成していいかが全くわからなかったので、基本的にLaravelを参考にして自分で構築した。フロント側でシナリオの進行を管理していて、サーバー側はリクエストに応じた応答データを返す仕様にした。デモのために使用してもらうことを目的としたので、最終的に認証機能やバリデーション機能は取り除いたので、パッケージで実装したのはセッション機能くらい。MVCモデルを参考にして作ったアプリケーションで、メインの動作で非同期処理や再帰関数を実装した。

Node.jsについては、Udemyの学習がメインだった。トータル36時間あって、60%くらいをハンズオンで実装しながら進めた。
[NodeJS - The Complete Guide (incl. MVC, REST APIs, GraphQL)](https://www.udemy.com/course/nodejs-the-complete-guide/)

**関連技術：**
`JavaScript/Node.js/Express/Mongoose/MongoDB/Swagger/Heroku/GitHub/Trello/Slack`

```
読んだ本
- 確かな力が身につくJavaScript入門
- 初めてのJavaScript
- 関数型プログラミングに目覚めた!IQ145の女子高校生の先輩から受けた特訓5日間
- Node.js 中級者を目指す
- リーダブルコード
- 初めての自動テスト
```

### PHP
セッションやログイン機能を実装した管理画面をもつアプリケーションを実装できる程度。Laravelはチュートリアルをこなした程度で、基本的にMVCモデルや認証機能の学習のために触っていた。開発環境はMAMPを使用。MySQLのポート番号が被っているとかで、環境構築にとても苦労した記憶がある。また、password_hash()で、ハッシュ化のアルゴリズムが公開されていているのに、なぜ第三者が復号できないのかという疑問を持つ良いきっかけも得られた。

```
読んだ本
- はじめてのLaravel5.5入門 ~AWS Cloud9で学ぶ~
- PHPフレームワーク Laravel入門
```

### シェルスクリプト
fishで簡単なプログラムを書いてみた。
[fish shell でお誕生日をお祝いしましょう](https://github.com/Matsuhaya/fish-birthday)

あとは、複数画像を一括リサイズするのにFFmpegをワンライナーで操作する程度。作業の自動化をするのであれば、シェルスクリプトでどんどんコードを書いて公開すべきだと感じた。他人のコードを見て、もっと勉強したい。

### MongoDB
ドキュメントデータベースは、チャットボットを実装するのに適していると考えたし、RDBMSを使うよりも開発コストがかからなそうだという理由で採用したとおもう。結果的に、スキームを変更しやすかったし、JSON形式で一貫してデータのやり取りができたのでとても便利だと思った。ただ、正規化ができないため、Webアプリケーションで個別にデータを管理する必要があるものに関しては使用すべきではないと思う。ORMはMongooseを使用した。JavaScriptの慣れた記法で、データベース操作ができるのはとても直感的でわかりやすかった。

```
読んだ本
- MongoDBの薄い本
```

### MySQL, PostgreSQL
PHPでアプリケーションを制作したときに、MySQLを使用した程度。あとは、チーム開発のアプリケーションのためにDB設計をして、MySQL WorkbenchでER図を記述するところまではやった。SQLについては、PostgreSQLを利用して、本を見ながら実行して動作を学んだ。

```
読んだ本
- SQL 第2版 ゼロからはじめるデータベース操作
- 失敗から学ぶRDBの正しい歩き方
```

### Firebase
認証、Realtime Database、Cloud Storageを利用したことがある程度。基本的にはドキュメントをみるが、Youtubeで検索したチュートリアルを見ながら進めることが多かった。MongoDBを使い始めてからは、Cloud Storageしか利用していない。

### AWS
下記の本を見ながら、サーバー構築する流れを2周ほどやった。あとは、サーバーレスでカレンダーの予定を通知するSlackBotを作った。POSTするデータ形式がJSONではなくform-urlencodedであったとか、OAuth 2.0 クライアント IDの設定みたいなところでつまづいたと記憶している。

![](https://i.imgur.com/Puy1ave.png)

```
読んだ本
- Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版
```

### Git/GitHub
Gitを学んだ時、もっと早く覚えておくべきだったと強く感じたことを覚えている。それまでは、後で見返してわかるようにと残しておいたたくさんのコメントで溢れていたが、管理をGitに任せることで不要なコメントを全て削除できた。日頃は、基本的な操作しかしていない。ブランチは機能ごとに作成して、実装完了したらdevelopにmergeする方式で開発している。issueを立てた開発の流れを確認したが、必要性がなかったので使っていない。たまにしか使わない機能(rebaseとか)は、その都度調べで実行している。

```
読んだ本
- わかばちゃんと学ぶ Git使い方入門
- やりたいことが今すぐわかる 逆引きGit入門
```

### API
チーム開発のアプリケーションのために、Swaggerを用いてAPI設計をした。フロントとサーバーを切り分けて開発できる、ということを実感できた。GitHubのAPIや、SwaggerHubの類似サービスの設計を参考にして設計した。

```
読んだ本
- Web API: The Good Parts
```

### インフラ
デプロイはさくら、AWS、Herokuを利用している。Dockerのようなコンテナは、学習のためにすこし触ったことがある程度で、興味はあるが必要に駆られなかったため時間を割いていない。

### ネットワーク
APIを実装してデプロイしたこともあり、HTTPプロトコルでのデータのやり取りはなんとなく掴めてきたという認識。最初は理論からと思い、ネットワークはなぜつながるのかを手に取ったが難しくて半分ほどで読むのをやめてしまった。ならば、手を動かそうと思い、Wiresharkでパケットの中身を見ながら勉強しようと思ったが、これまた情報量が多すぎてどうしていいかわからず諦めてしまった。結果的に、本を見ながらAWSでEC2のクラウドサーバー構築を一通りやってみたのが最初の取っ掛かりとしてよかったと思う。理論を勉強したあとは、もっとサーバーを構築しながら理解を深めたい。

```
読んだ本
- Webを支える技術
- ネットワークはなぜつながるのか 第2版
- マスタリングTCP/IP 入門編 第5版
```

### セキュリティ
CORSについては、APIの実装でつまずいたので対策について調べることが多かった。あとは、暗号化やハッシュ化についても興味本位で調べた。暗号については、最初にお堅い本から入るのではなく、エンターテイメントとして選んだサイモン・シンの暗号解読を読んだのがとてもよかった。セキュリティに関しては、基本的な知識が不十分なので、応用情報の勉強をしながら基本的なところを整理できればと思っている。

```
読んだ本
- 暗号解読
```

### 低レイヤー
プログラムはなぜ動くのかがとても面白く読めたと同時に、コンピュータの仕組みに関する前提知識がほとんどないことを改めて認識した。実務経験がないのでなんとも言えないが、低レイヤーの知識があることが問題解決につながったり、知識を体系的に整理する上で役に立つのは自分でも想像できる。単純に、好奇心もあるしので少しずつ時間をかけて勉強したいと思っている。

```
読んだ本
- OSの仕組みの絵本
- プログラムはなぜ動くのか 第２版
```

### チーム開発
半年間のチーム開発の中で、うまく進めるためにはどうすればいいかのヒントが欲しくて下記のような本を読んだ。そのまま導入してもだめだと思ったし、結果的に本のやり方をそのまま実践したことはほとんどない。けど、このチームメンバーと状況の中で、どのように進めたらいいかの議論にとても役立った。この分野は、知識よりも経験から得られるものがとても多いので、いろんなことを試してみるのが良いと思った。
```
読んだ本
- マンガでわかるプロジェクトマネジメント
- アジャイルサムライ−達人開発者への道−
- エクストリームプログラミング
- カイゼン・ジャーニー
- リーン顧客開発
```

### 英語
英語については、2017年から海外の仕事を担当することになり、英語力が業務効率のボトルネックになりそうということもあって、継続的に学習していた。業務では、会話は苦しいが文章でのやり取りはなんとかこなせる程度だったと認識している。

2019年2月にTOEICを受験した。

| LISTENING | READING  | TOTAL    |
| --------  | -------- | -------- |
| 375       | 265      | 640      |

リスニングが実力より上に振れた点数になっている可能性は多いにあるが、概ね受験した感触に近いスコアだった。リーディングが相対的にかなり低いのは、思い当たる節があった。時間が全く足りずに多くの長文問題を未回答のまま提出してしまっていたからだ。理由も自覚していて、長文をパッと見たときに、文章の構成を頭の中で理解することがすぐにできなかった。これは、単語やイディオムを覚えることに加えて、文法について慣れる必要があるのではないかと強く感じた。圧倒的に、英語の文章を読んでいる量が少ないと思った。

そこで、自分にとって継続して行うべき学習は、英文標準問題精講を繰り返し読むことだという結論に達した。長文が出てきたときに、構文が頭に入っていないのでなんども繰り返し同じところを読んでしまうという自分の弱点を克服できそうだと感じたからだ。また、文章の内容がとても面白く、解説を読むのが楽しいのでモチベーションを保つ意味でもいい勉強法だった。前半100ページ強の初級の内容を2週、3周と繰り返し読んでいる。精錬された文章を繰り返し読むとよいのは、プログラミングに関しても同じだと思う。

また、UdemyやYoutubeでチュートリアルをするときも英語の教材を選んでいる。これは、英語学習というよりは教材の質の問題もあるのだが、結果的に勉強にはなっていると思う。

今後も引き続き学習するが、英語学習についてはこれまで通り**文章読解**にフォーカスしていこうと考えている。

```
読んだ本
- 英文標準問題精講(100ページ強を3週目)
```

## 振り返って

### 印象的だった体験
全4回のアルゴリズムの講義を受ける機会があった。内容は、ビット演算, スタックとキュー, 二分木探索, ニューラルネットワーク, Unityで物理演算シミュレーションを体験といった内容。その中で特に印象に残っているのが、微分、積分で現実世界の現象をモデル化してシミュレーションしているが、「なぜ時間について微積しているのか？」という質問が出たことだ。大学で公式を暗記して満足していた私にとって、それはとても印象的な質問で、何故なのかについてしばらく考えることになった。自分がいかに、暗記したツールを使って物事を説明できたつもりになっていたのかといったことに意識が向いた。

人によって、ある物事に対して深い関心が向くきっかけは異なると思うが、プログラミングの世界はそのきっかけが多いように感じる。それは、抽象的な思考をする回数が多いからだろうか。とにかく、これまでならなんとなくで満足していたラインを、踏み込んでもっと知りたいと思えるようになったし、その方が楽しいと思えるようになった。人間の認知、言語、宗教や哲学、数学、物理、電気等、いろんな分野のことをもっと知りたいという欲求が強くなってきている。現在、とても勉強するのが楽しい。このエネルギーがあるうちに、いいきっかけだと思って多くのことを考えたり吸収したいと思う。

### 自分の興味の変化
会社をやめる前は、IoTやPythonの機械学習を勉強していた。Web技術を学ぼうと決めてからは、JavaScriptとPHPしか書いていない。最新の技術も気にはなるが、どちらかというと基本的な部分を学びたいという欲求が強いと思う。最初は、ライブラリやjQueryを使うのも嫌で、どうすれば綺麗なコードが書けるかを考えるのが好きだった。3、4ヶ月経ったくらいで、リファクタリングが楽しいのでそればかりに時間をかけてしまい、あまりに学習効率が悪いことに思い至ってからは、優先順位をつけてコードを書くことを意識したように思う。プログラミングのどこが好きかと聞かれたら、ロジックを考えてコーディングする作業が好きなのだと答える。現在持ち合わせている知識を組み合わせて、その場面での最適な意思決定をする作業が得意なのではないかという感覚がなんとなくある。だから、しばらくは基礎的な知識を体系的に整理することに時間を注ぎたい。

### 今年時間を割きたいこと5つ
- 暗号技術
- 低レイヤー
- データ構造とアルゴリズム(Atcoder)
- 関数プログラミング(Haskel)
- 数学（微分、積分、線形代数）

あとは、Web技術や情報科学の基礎についての知識が薄いので、応用情報技術者試験を受験してその辺を勉強するつもり。ただ、何より実務経験を積みたい。なので、上記は業務周辺の知識の勉強に置き換わる可能性が十分にあると思う。コードを書くことが楽しいので、自分がコードを書くことで自己肯定感を高く保てるようになりたい。