文系エンジニア未経験がアプリケーションを作れるようになるまで

## はじめに
僕は現在ITスタートアップでソフトウェアエンジニアとして働いています。プログラミングの学習歴はおおよそ2年です。
先日、最新の技術記事が自動配信されるSlackアプリ[「Winkie(ウィンキー)」](https://winkie.app)をリリースしました。
画像を添付

この記事では、文系大学生でプログラミングのことは全くの無知識だった僕が、この2年間を通して何をどのように勉強してサービスをリリースするレベルまでのエンジニアになったかを割と詳細に書いていきたいと思います。

プログラミングや、エンジニアという仕事に興味があるけど自分にもできるか不安だという方や、エンジニアの勉強を始めたけれど何から手をつけていいかわからないという方の参考に少しでもなれると幸いです。

## プログラミングを学びたいと思ったきっかけ
そもそも文系だった僕がなぜプログラミングを学びたいかと思ったか、それは身に付けておけば今後重宝されるスキルだと思ったからです。まあ、浅いかもしれませんがみんな初めはそんなものなんじゃないでしょうか？時間のある大学生のうちに何か1つでも社会に出て役立つようなスキルが欲しいと思ったのです。
学び初めのとき、同時に新卒就活もしていて、IT企業には大変関心があったのですが、別にエンジニアになろうなんて微塵も思っていませんでしたし某大手IT企業の総合職や、国内のコンサルティングファームの内定も持ってました。
なので本当にプログラミングは仕事にしたいからとかそんな明確な目的ではなく、なんとなく役立ちそうだからでした。
まあ、これからの時代にITシステムに疎いことに対する漠然とした不安みたいなものは少しあったかもしれませんが。

## スタートアップにエンジニアとして参画
初めは独学でやろうと思ったのですが、プログラミング学習は挫折しやすいとみんなが口を揃えておまじないみたいに言っていたので、継続的に学べる環境に飛び込むことにしました。1人で勉強してやるより仕事として取り組んだ方がスキルもより効率的に身に付くと考えエンジニアとしてインターン生として雇ってくれるところに参画しました。


##0ヶ月目~2ヶ月目 
### 「たのしいRuby」を2周 
まずはじめに[「たのしいRuby」](https://www.amazon.co.jp/%E3%81%9F%E3%81%AE%E3%81%97%E3%81%84Ruby-%E7%AC%AC6%E7%89%88-Informatics-IDEA-%E9%AB%98%E6%A9%8B/dp/4797399848)を2周くらい読みました。最初はclassとかマジで訳わかんないと思いつつもなんとか読み進めました。

### paiza
次に[paiza](https://paiza.jp/challenges/info)という、プログラミング学習サイトで、問題を解きながらプログラミングの基本的な処理の書き方なんかを学びました。これを大体1週間ちょっとやって、B問題が解けたり解けなかったりくらいのレベルまでいきました。

### スクレイピング
次にRubyのスクレイピングライブラリNokogiriを使って好きなサイトをスクレイピングしてみるっていうのをやりました。スクレイピングの詳細は前述した「たのしいRuby」なんかをみながらやっていった気がします。

### SQLの本を読んだ
次に[スッキリわかるSQL入門](https://www.amazon.co.jp/gp/product/B07L3MX199/ref=dbs_a_def_rwt_hsch_vapi_tkin_p1_i1)を読んでデータベースの操作方法について学びました。問題例も多くのってて、これのクイズを実際にDBをローカルでたてて解きながら（全部じゃないですが）進めた覚えがあります。

### 社内ハッカソン
その後社内ハッカソンが開催されて（僕ははじめ出る気なかったんですが）、社長にお前も出るよな？みたいな感じで半ば脅迫を受け、周りのエンジニアたちに恐れ慄きながらもなんとか期間内に作って参加しました。
この時はLINEBOTでのハッカソンでした。この時初めてデプロイを体験しました。herokuにpushするだけでしたがとても苦労したのを覚えています。
ですがこの時、自分で1から考えてサービスを作るってめちゃくちゃ楽しいんだなって実感しました。

## 3ヶ月目~4ヶ月目
### Reactチュートリアル
次にフロントエンドの勉強をということで、[Reactチュートリアル](https://ja.reactjs.org/tutorial/tutorial.html)をやりました。
五目並べを作るチュートリアルで、多少理解が難しい箇所も当時ありましたがなんとか完成させることがありました。チュートリアルの最後に追加問題が5,6問あるのでそれも試行錯誤しながら解きました。

### Redux
次にReduxの勉強をしました（それに合わせてRedux-sagaも）。これが本当によくわかんなくて、マジで自分プログラミング向いてないって思いました（まあ別にこれは今でも思ってますが）。それくらい概念とかが理解できませんでした。
それとこの時Udemyの解説動画を見て勉強したのですが、動画という形式が自分の学習方法としてあまり良くなかった気がしています。
個人的にはReduxも公式のチュートリアルがあるので、この辺りで学習するのがいいかなと思いますが。
まあ、一旦しないってのもありかと思います。

## 5ヶ月目~7ヶ月目
### フロントエンドのissue解決
ここまで学習していよいよ本格的に会社の業務に参画しました。まずは社内ツールのフロントエンドのissue(バグの改修とかリファクタリングとか)解決をしました。他人の書いたコードを読むっていうのが結構それまでなかった経験だったので、大変でしたね〜。

## 7ヶ月目~10ヶ月目
### 顧客向けプロダクトの開発
アプリケーションのチーム開発に慣れてきたところで顧客用の製品の開発に参加しました。ここでは分析グラフを1つ受け持ち（確か棒グラフだった）、それのフロントエンド部分を実装しました。本番製品で一つの機能を1から実装したことはなかったのでいい経験になりました。
あとグラフの実装も特殊でd3.jsで実装しました。

## 11ヶ月目
### アプリケーションの仕様策定・設計
この辺りから、単にコードを書くだけではない業務も担当するようになりました。
具体的には、自社で開発しているサービスの新機能として、どのようなユースケースが想定され、そのユースケースをどうアプリケーションに落とし込んでいくかといったところをチームメンバーと話し合いながら考えていきました。
そのため、このタイミングでドメイン駆動開発（DDD)やユースケース駆動設計についても学び始めました。

## 1年目 ~ 1年4ヶ月目
### 自社サービスのスタートアップに入社
ちょうどプログラミングの勉強を始めてから1年くらいのタイミングで、自社サービス開発を行うスタートアップにエンジニアとして正社員として入社しました。社会人1年生ってことで溢れんばかりの期待とちっぽけな不安を胸に働き始めました。

### デザイナーさんとのやりとり
自分はメインの担当がフロントエンドだったこともあり、デザイナーさんと連携しながら開発を進めてました。
実際の開発業務の流れとしては、
機能のユースケースから最適なページの構成・レイアウト・UIを考えてフリーハンドで書いてから、それをもとにデザイナーさんがFigmaでデザインを起こしてくれて、それをみて実装するって感じです。

## 1年5ヶ月目~2年目
### AWS amplifyとの出会い
この辺りから新規サービスの開発の方に参加するようになりました。
以前まで参加していたプロジェクトはバックエンド側はScalaでの実装で、自分には当時全くのちんぷんかんぷんだったのですが、
新規サービスのMVP開発で最小限の工数で作るということになり、amplifyを使った構築になりました。いわゆる今流行りのサーバーレスってやつですね。
そもそもAWSをほぼ触ったことがそれまでなかったので、AWSの勉強から始めました。lambdaが何かとか、s3が何かとか。

### ハードウェアの実装
また、自社サービスではRaspberry Piを使っているので、その開発プロジェクトにもちょっとだけお邪魔しました。
この時初めてGoを触りました。
センサからこのRaspberry Piに送られてきたデータをChromiumで静的ファイルを動かして、接続したディスプレイに表示させるみたいなことをやってました。

### Scalaのお勉強
うちの会社のエンジニアはScala大好きな人たちばっかりで、俺も書きて〜って感じでちょっとずつ勉強を始めました、
有名なコップ本を雑に2周くらいした後、自社のプロダクトのソースコード見たり、それを真似してちょっとコード修正したり、プチ機能を追加したりしてました。やっぱ実際のコードを触るのが一番いいですね。

### Slackアプリ「Winkie」の作成
これは会社の同期と一緒に何か作ろうってなって、僕がアイデアを出して2人で作り始めました。
Scalaは勉強はしてはいたけど、まだ全然物になってなくて、一緒にやってる同期に手取り足取り教えてもらいながら実装しました。
ScalaでAPIサーバーを1から実装したことがなかったのですが、1から作るのはいい勉強になりますね。
だんだん書けるようになってきて、ある程度自分で実装が進められるようになりました。

##終わりに
いかがでしたか？文系大学生でプログラミングのことは全くの無知識だった僕が、この2年間を通して何をどのように勉強してどのような経験を積んできたかが少しはお分かりいただけたかと思います。
エンジニアの仕事は、辛いこともありますが、ものを作るのが好きな人や、学ぶことが好きな人には結構楽しい仕事でもあると思います。
これからエンジニアの勉強をしようとしている方の参考に少しでもなれれば幸いです。