ほぼ未経験の僕、アプリ開発するってよ。[１ヶ月目の学習記録]

##執筆の経緯
RailsでAPIを開発し、それを用いてReact Nativeでネイティブアプリを開発するという目的で学習を開始しました。
具体的には「**物忘れ防止アプリ**」を作成します。
場所と通知をリンクさせるもので例えば以下のような挙動を実現させます。


ex
スーパーに行く前に買い物リストをメモして、スーパーの位置座標を指定する。
買い物に行きスーパーに到着すると、登録した位置情報より通知が来て買い物リストを表示する。



こんなアプリあったらめちゃくちゃ便利だと思いませんか？
僕自身、「切れてしまったマヨネーズを購入しなきゃ！」と買い物に行く前は考えていても
スーパーに着く頃には頭になくて、買い物終えた帰宅途中に「あっ！、マヨネーズ！！！」
とうっかりすることがあるんですよ。。。
「俺ってにわとりなのかよ、、、」って自己嫌悪したくないし、
仕方なく近くのコンビニで割高のマヨネーズを買いたくもない！
そんなこんなで「物忘れ防止アプリ」の作成を志したのです。

記事を書くことでアウトプットすることが主な目的で、1月おきくらいに学習の進捗を綴っていきます。
しかし、同じように何かアプリ開発している方、RubyやRailsを学習している方などに
学習の参考になるような記事も書けたらいいなと考えています！

##簡単な自己紹介
理系の大学生をしています。専門は物理学なのですが、やけに難解です。。。
（現在、量子力学で発狂中です。）

以前小さなプログラミングスクールに２ヶ月通っていて、そこでHTML CSS JavaScriptを学習しました。
それらの知識を用いて、簡単なwebサイトを作成しました。
（ポートフォリオとして公開するまでもない程度のものです。。。）
なので簡単なフロントエンドコーディングなら出来る程度のスキルはあります。

現在はメンターをつけて学習しています。

では、イントロダクションはこの辺にしといて、以下から本編です。

##１ヶ月目の学習進捗

●今月の目標
Rails tutorialに着手し、Ruby on Railsの基本を習得する。
Rails tutorialを理解するために以下の知識を補完する方針で学習を計画しました。

* HTML CSS JavaScript
* コンピュータサイエンス基礎（主に基本情報の内容）
* git
* Linuxコマンド
* Rubyの基礎
* Rubu on Railsの基礎

Rails tutorialに着手する前に幅広い知識を習得することを推奨しているエンジニアが結構多いと感じています。
なので、先人の言う通りガイドに従うことを推奨します。
 

**①Rubyの基本を学習する**
学習時間は30hくらいです。
まずはRubyの基本を学習しました。
使った参考書は「[プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%92%E7%9B%AE%E6%8C%87%E3%81%99%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AERuby%E5%85%A5%E9%96%80-%E8%A8%80%E8%AA%9E%E4%BB%95%E6%A7%98%E3%81%8B%E3%82%89%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E3%83%BB%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E6%8A%80%E6%B3%95%E3%81%BE%E3%81%A7-Software-Design-plus%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4774193976/ref=sr_1_3?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=ruby&qid=1572605332&sr=8-3)」です。
（＊特にアフィリエイトとかはしてないです。）

メンターに勧められて学習を開始するのですが、初めて参考書を手に取った感想は
「これ難しくない...？」でした。
この参考書はある程度の開発経験がある人向けに書かれているので、初心者の人にとっては難しく感じられるかもしれません。
具体的にどこが難しいかというと、基本的なプログラミングの知識を前提としていることでした。なのでググりながら、場合によってはprogate等で学習しながら本を進めることになると思います。

「なんやこれ？」と悩みながら、ググりながら、時にはメンターに質問してという感じでなんとか学習を進めていき、７章まで完成させました。
Railsにはやく着手するためにモジュールや例外処理といった内容については一旦スルーします。

・学んだこと
オブジェクト指向
rubyの仕様
rubyの可読性について

・感想
淡々と英語の文法を学んでいる感覚でした。
現時点では何の役に立つのかわからないし、結構地味なのでお世辞にも「プログラミングたのしいいい！」とはなりませんね笑
仕方ありません。英語の文法だって長文を読み始めてやっと役に立つことを実感するのですから今は我慢しましょう。。。

あとこの本、とにかく自分でコードを書かせる作りのなっているので、それはよかったです。
やっぱり実際にコード書いてみると動かなかったりとか、変なエラーでるとかあるんですよね。
そういうもののエラー処理みたいな経験は今後役に立つと思うので、積極的にコードは書いて行くべきだと思います。

あとrubyの可読性についてなのですが、これは面白い発見がありました。
それは「可読性とは言語の仕様を理解していることで担保されるものだ」ということです。
>11/3追記　「注意」
このテキストは経験者向けでありますが、私はRuby未経験なので上手く作者の意図を汲み取れておりません。
よって所々にその模様が記述されてありますが、この本の著者　伊藤 淳一 様がコメントにて補足説明して頂きました。誤った認識をされないように、コメントを確認されることを推奨します。





以下のコードをご覧ください
（「[プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%92%E7%9B%AE%E6%8C%87%E3%81%99%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AERuby%E5%85%A5%E9%96%80-%E8%A8%80%E8%AA%9E%E4%BB%95%E6%A7%98%E3%81%8B%E3%82%89%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E3%83%BB%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E6%8A%80%E6%B3%95%E3%81%BE%E3%81%A7-Software-Design-plus%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4774193976/ref=sr_1_3?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=ruby&qid=1572605332&sr=8-3)」の引用）

```ruby:qiita.rb
class User
  def initialize(name)
    @name = name
  end
  
  #インスタンス変数を参照する
  def name
    @name
  end
  
  #インスタンス変数を変更する
  def name=(value)
    @name = value
  end
end


user = User.new('hiroki')
#nameメソッドを経由してインスタンス変数（ここでは@name）を取得する
user.name #=> "hiroki"

#name=メソッドを経由してインスタンス変数を変更する
# 変数に代入しているように見えるが、実際はname=メソッドを呼び出している
user.name = 'Bob'
user.name #=> "Bob"
```

これは７章のインスタンス変数をクラスの外から参照、変更するという内容ですね。
初めてこのコードを見たときものすごい違和感を感じて、全然理解できなかったのです。

Q.１つ目の違和感
name=(value)メソッドてなんやねん！
メソッド名にイコールあるしカッコあるし、、、
そんな書き方なんて初めてやん！

Q.２つ目の違和感
user.name = 'Bob'ってなんやねん！
そんなメソッド定義してないやん泣

ていう感じになったんですよね。混乱して発狂しそうになりました。
これは調べてもわからずメンターに聞いて解決しました。

A.１つ目の違和感の答え
valueを引数とするname=メソッドなんですね
つまりわかりやすく書き換えるとこうなります。
name= (value)
このイコール後の空白大事！！！
これなら理解できます。

これがわかると一気に紐解けて２つ目の違和感の答えもわかります

A.２つ目の違和感の答え
name=メソッドを引数をつけて呼んでるんですね。
つまりわかりやすく書き換えるとこうなります。
user.name= ('Bob')
これなら理解できますね。今まで見てきたメソッドの呼び出しであり自然な書き方です。

ではなぜ本書ではこのような書き方をしたのでしょうか。
今まで習ってきた書き方をわざわざやめた理由は何なんでしょうか。
以下に僕なりの考察を述べていきます。（初学者なので稚拙で恐縮ですが。。。）

Rubyの可読性が高いといわれる所以がここにあると思います。
user.name = 'Bob'
この書き方、まるでuserオブジェクトのインスタンス変数nameに文字列'Bob'を代入している
と読めます。インスタンス変数を変更していると直感的に理解できます。
わざわざ「メソッドを呼び出して引数を渡している」
よりも「変数に代入している」の方がシンプルで読みやすいわけですね。その方が可読的です。

つまり
引数にカッコを書かなくてもよい
空白はあってもなくてもよい
という風に書き方に自由度を持たせることで高い可読性を実現しているんですね。

しかし一方でこれは初学者には弊害になり得ります。
書き方が自由すぎて、混乱を招きます。私が感じた２つの違和感がそうですね。

また、本質を理解しないでコードを書いてしまうという危惧もあります。
つまり「変数に代入しているんだ」という誤った理解をしてしまうわけですね。
最終的にはインスタンス変数を変更するので間違ってませんが、実際にはメソッドを経て値を変更していますからね。これは挙動を誤解していることになります。

「Rubyって読みやすくて簡単だよ！」みたいな世間の声とはだいぶ乖離しています。
僕自身、Rubyって簡単なんでしょ？って思ってたけど違いました。
「楽」とか「簡単」とはある程度知識がある人に許されるものなのですね。


**②基本情報技術者試験の内容**
学習時間は５hくらい
基本情報の参考書「[情報処理教科書 出るとこだけ! 基本情報技術者 テキスト&問題集 2019年版](https://www.amazon.co.jp/%E6%83%85%E5%A0%B1%E5%87%A6%E7%90%86%E6%95%99%E7%A7%91%E6%9B%B8-%E5%87%BA%E3%82%8B%E3%81%A8%E3%81%93%E3%81%A0%E3%81%91-%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85-%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-2019%E5%B9%B4%E7%89%88/dp/4798159174/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=%E3%81%A7%E3%82%8B%E3%81%A8%E3%81%93%E3%81%A0%E3%81%91%E5%9F%BA%E6%9C%AC&qid=1572644883&sr=8-1)」を使用。
内容は全てをやるわけでは無くて、Rails tutorialを学習する上で必要になる範囲のみを学習しました。

・学んだこと
データベース（SQL）
ネットワーク
アルゴリズムとデータ構造

このコンピュータサイエンスの基礎知識が後々学習するRails tutorialで効いてきました。（詳しくは後述）

・感想
正直、めっちゃ面白かったです。特にデータベース。
多くの情報を関連付けてテーブルにして整理する方法が体系的に学べます。
情報の扱い方がわかって、なんだかFBIにでもなった気分です。

**③web技術の基本**
学習時間 5hくらい
「[イラスト図解式 この一冊で全部わかるWeb技術の基本](https://www.amazon.co.jp/s?k=%E3%81%A7%E3%82%8B%E3%81%A8%E3%81%93%E3%81%A0%E3%81%91%E5%9F%BA%E6%9C%AC&__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&ref=nb_sb_noss)」　を使用。
これも後のRails tutorialを学ぶための準備です。
これも後からめちゃくちゃ効いてきます。

・学んだこと
これはWebに関することを一通り網羅していて多岐に渡ります。
キーワードとしては
Web HTML TCP/IP URL HTTP Cookie セッション 3層アーキテクチャ バックエンド言語とフロントエンド言語　セキュリティ　webシステムの構築 ...です。

・感想
これめっちゃ良書！
Web系エンジニアを目指す初学者には是非ともオススメしたい一冊です。
この本を読んでから、何となく聞き流していてあまり理解していないことと、聞いたことはあるけど理解していなかったことなどが理解できました。点と点が繋がる感覚があって、Webを俯瞰できた気がします。

**④git**
学習時間 4h
これもRails tutorialの事前学習
「[ドットインストール git入門](https://dotinstall.com/lessons/basic_git)」を使用。

・学んだこと
簡単なバージョン管理の方法
主に使われるgitの基本操作

・感想
ドットインストール様様。。。
良質な内容なのに、なんと無料で学習できてしまいました。
バージョン管理ってすごい便利！って実感しました。

**⑤Railsの教科書**
学習時間 6h
「[Railsの教科書](http://igarashikuniaki.net/rails_textbook/)」を使用。
実は先にRails tutorialに着手しましたが、難解で理解出来ずこのテキストを先に学習しました。
なのでRails turoial前に学習することをオススメします。

・学んだこと
クライアントサイドとサーバサイドでのやりとり（HTTP）
MVCモデルの挙動
CRUD
Gemとbundler

・感想
これめっちゃ良い！！！
手を動かしながら実際にアプリケーションを作成して、挙動を追います。
ブラウザがどんな命令（リクエスト）をサーバーに対して送り、それに対してアプリがどのようなレスポンスをしているのか。という動きをわかりやすい図を使いながら学習できます。
Gemとbundlerの話もよかったです。Rails tutorialだとここまで詳しく解説されていなくてめちゃくちゃ混乱したのですが、解決です！
こんな良質な内容を無料で学べるなんて本当にいい時代ですね。

**⑥Rails tutorial**
学習時間　10h
ついにきましたね。Rails tutorial。
今まで色々と事前学習で準備してきたので、なんだかRPGで中ボスでも討伐する気分ですね。感慨深い。
ここで現時点で僕が持っている知識（中ボスを倒すための武器）を一度整理します。

* HTML CSS JavaScript　＊
* コンピュータサイエンス基礎（主に基本情報の内容）　②③
* git　④
* Linuxコマンド　＊
* Rubyの基礎　①
* Rubu on Railsの基礎　⑤
　

（＊は既に学習済みです。数字はこの１ヶ月で学習したもので、前述の学習した内容と対応します。）

中ボスを倒すくらいにはこのくらいの武器が必要になると思います。
エンジニアは学ぶこと多いですね、、、。

・学んだこと
まだ２章までなので、内容は多くありません。
がしかし、やっていることは高度です。

リモートリポジトリでのバージョン管理
デプロイ
MVCモデル
データベース

・感想
本格的です。まさかHerokuを用いてデプロイまでするとは思いませんでしたね。
エラーでつまづくことも多く歯ごたえ抜群です。
やはり上記の知識が一つでもかけたら、理解度がグンと落ちるのではないかと感じました。
また解説がところどころ雑です。。。
難しい易しいではなく単純にガイドが雑な箇所でつまづいた経緯があるので、あまり良いテキストとは言えないというのが初心者ながらの感想です。

##まとめ
Rails tutorialを学ぶのに必要な知識を整理して、学習しました。
こうすることで無理なくステップアップ出来ました。
Rails tutorialの内容を見るに、私が上記で列挙したような網羅的な知識は必須であると感じました。
Rails tutorialが理解できない人は、自己否定せずに上記知識抜けがないか確認して学習をしてみるといいと思います。
Rails tutorial自体は決して難解ではないので、基礎知識があれば読破できると思います。

またこうやって書き出してみると、意外と勉強してないなって思いました。
11月はもっと絞っていきます！