【初心者向け】好奇心駆動成長

この記事は、[Makuake Product Team Advent Calendar 2018](https://qiita.com/advent-calendar/2018/makuake) 12日目の記事です。
弊社メンバーのうち何人かが業務委託という形でMakuakeに関わらせていただいているのですが、そのご縁で今回主に別案件を担当中の自分もAdvent Calendarに参加させていただきました。ありがとうございます！

自分はこの夏に他業種から転職した初心者なのですが、最近`仕事に対する向き合い方がイイね！`と褒められたので、ちょっと大仰ですが自分のスタイルを`好奇心駆動成長`と題して書いてみたいと思います。

誰かの役に立てたら嬉しいです！

# 最初に結論
- **好奇心を原動力に、1つのコードからなるべく多くのことを学ぶようにすると、やってて楽しいし周りのエンジニアさんに褒められる！**
- **一度実装したコードでも、書き換えたり、気になる点を調べたりすると知識がどんどん広がって楽しい！**

# この記事の前提
1. 初心者による初心者のための記事です:pray:
1. 先輩や同僚に頼りすぎず、自分自身で理解を深めるための方法になっています:fist:
1. 今自分はHTML, CSS, PHP, Ruby on Rails等触っているので、web系向きの記事かもです:raised_hands:
2. 主な対象読者は、`「もっと成長したい、楽しみたい」と感じてる初心者`か`「もっと部下に成長してもらいたい」と思っている先輩/上司`あたりかなと思ってます:bust_in_silhouette:
1. 必ず取り返しのつく環境でやりましょう:japanese_goblin:

# 好奇心駆動成長って？
実装する時に湧いた`ここ変えるとどうなるかな？`, `なんでこの記述なんだろう、別の書き方でもいけるよな？` といった好奇心/疑問を逃さず調べたり確認したりすることで、担当したタスク以上の知識を身に着けましょう！という考えです。造語です！

# 実際にやってみる
普段は自分が実装したコードに対してやるんですが、今回は弊社 = ジシバリの社長からお題となるコードをもらったので、それに対して実際にコメントを書いたりコードをいじったりしてみようと思います。
お題はこちらです↓([プロジェクトオイラー](https://projecteuler.net/)のやつですね)

```theme_original.rb
# フィボナッチ数列の項は前の2つの項の和である. 最初の2項を 1, 2 とすれば, 最初の10項は以下の通りである.
# 
# 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
# 数列の項の値が400万以下の, 偶数値の項の総和を求めよ.
# 
# Note:この問題は最近更新されました. お使いのパラメータが正しいかどうか確認してください.

MAX_NUMBER = 4_000_000
fibonacci_numbers = [0, 1]
loop do
  next_fibonacci = fibonacci_numbers[-1] + fibonacci_numbers[-2]
  break if next_fibonacci > MAX_NUMBER
  fibonacci_numbers << next_fibonacci
end
even_fibonacci_numbers = fibonacci_numbers.select { |number| number % 2 == 0 }
result = even_fibonacci_numbers.inject(:+)

p result
```

では実際に`学んだこと`や`自分だったらこう書く(こう書いてしまう)`を書き込んでいきます！:fist:

## 実際にやってみる - 気になった点を調べてみる
```theme01.rb
# フィボナッチ数列の項は前の2つの項の和である. 最初の2項を 1, 2 とすれば, 最初の10項は以下の通りである.
# 
# 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
# 数列の項の値が400万以下の, 偶数値の項の総和を求めよ.
# 
# Note:この問題は最近更新されました. お使いのパラメータが正しいかどうか確認してください.

MAX_NUMBER = 4_000_000
# こういう書き方があるんですね。自分なら4000000と素直に書いてしまいます
# ","のおかげで桁が読みやすいですが、試しに","を使ってみましょう
MAX_NUMBER_test = 4,000,000
# やっぱり普通に","を使うとint型じゃなくstringになるんですかね。int型のまま桁を区切るためには"_"を使えばいいんですね！
# …
```
一応、実際に`irb`でやってみました。

```test.rb
2.4.1 :001 > MAX_NUMBER = 4,000,000
 => [4, 0, 0] 
2.4.1 :002 > MAX_NUMBER += 1
TypeError: no implicit conversion of Integer into Array
	from (irb):2:in `+'
	from (irb):2
```

やはりダメでした。というか`integer`だとか`string`だという話ではなく、配列になっていることがわかりましたね。
配列の書き方として、こういったシンプルな書き方もできると学ぶことができました！面白い！

では続きを見てみましょう。

```theme01.rb
# …
fibonacci_numbers = [0, 1]
loop do
  # 配列なのに"-1"とは…
  next_fibonacci = fibonacci_numbers[-1] + fibonacci_numbers[-2]
  break if next_fibonacci > MAX_NUMBER
  fibonacci_numbers << next_fibonacci
end
# …
```
ここで一旦また手元でやってみます。

```test.rb
2.4.1 :001 > test_array = (0...10).to_a
 => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
2.4.1 :002 > p test_array[-1]
9
 => 9 
2.4.1 :003 > p test_array[-2]
8
 => 8 

```
`-1`は配列の最後の値、`-2`は配列の最後から2番目の値を指定することができるみたいです:open_mouth:
また、気になったので`()`ではなく`[]`を使ったらどうなるか試してみます

```test.rb
2.4.1 :001 > hoge = [0...10].to_a
 => [0...10] 
2.4.1 :002 > p hoge
[0...10]
 => [0...10] 
```

これは配列ではなく範囲オブジェクトになっているんですかね…？でも`[]`がついてますね、もう少し見てみましょう。

```test.rb
2.4.1 :001 > hoge = [0...10].to_a
 => [0...10] 
2.4.1 :002 > huga = (0...10)
 => 0...10 
2.4.1 :003 > hoge == huga
 => false 
2.4.1 :004 > hoge[1] = "test"
 => "test" 
2.4.1 :005 > p hoge
[0...10, "test"]
 => [0...10, "test"]
```

`hoge == huga`が`false`なので、範囲オブジェクトではないですね。
`0...10`という範囲オブジェクトが1つだけ格納された配列になっていたようです。

といった感じで、`気になったら調べる`、`手元でいじってみる`を時間が許す限りやっています！

## 実際にやってみる - 書き換えてみる
では次に、自分なりに(自分ならこう書いてしまう、というコードに)この処理を書き換えてみたいと思います。
元のコードには`loop`文や`配列`が使われているので、
　　1. loop以外の繰り返し処理を使う
　　2. 配列は使わない
の2点を抑えて書いてみたいと思います。

```theme01.rb
# フィボナッチ数列の項は前の2つの項の和である. 最初の2項を 1, 2 とすれば, 最初の10項は以下の通りである.
# 
# 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
# 数列の項の値が400万以下の, 偶数値の項の総和を求めよ.
# 
# Note:この問題は最近更新されました. お使いのパラメータが正しいかどうか確認してください.

MAX_NUMBER = 4_000_000
fibonacci_first = 0
fibonacci_second = 1
fibonacci_sum = 0
result = 0

until fibonacci_sum > MAX_NUMBER do
  #フィボナッチ数を作る
  fibonacci_sum = fibonacci_first + fibonacci_second
  #2で割り切れるならresultに足す
  if (fibonacci_sum % 2 == 0)
    result += fibonacci_sum
  end
  #フィボナッチ数を更新する
  fibonacci_first = fibonacci_second
  fibonacci_second = fibonacci_sum
end

p result
```

書き換えました！今回は4,000,000という上限が決まっていたので`until`にしよう！と直感で決めました。
少し制約を設けてみると、かえって発想が広がる気がします！
更に書き換える場合、
>1. 偶数か否かの判定を全てのフィボナッチ数に対して実施しているため、処理が遅くなりそう
2. 偶数を判定するロジックはいくつか考えられるので試してみたい

といった点がヒントになるかなあと感じました。これはまたどこかでチャレンジしたいですね！

# 大事にしていたこと
## 1. 好奇心を見逃さない
細かな`なぜ？` がこの考え方の原動力になっていると思います！
`ここ変えるとどうなるんだろう？` `なんで似たような機能があるんだろう？` `どういう形で値を受け取っているんだろう？` といった細かな疑問や好奇心を見逃さないでいると、他の方から「よく気がついたね！」「勘がいいね！」と言われることが増えました:relaxed:

## 2. エラーに立ち向かう
今でも正直エラーが出るとウッ:tired_face:となるんですが、めげずにエラーに立ち向かったおかげで、少しは耐性がつきました！
こうして自分が書いた内容でエラーを起こすと多少原因がわかりやすいこともあり、エラーに慣れるのにはちょうど良いのかもしれません。

## 3. 学んだことは後でまとめる
後でまとめ直すと、その度に気づくことや学べること、やりたいことが出てくるので、好奇心の尽きない良いサイクルを回せました！

# 最後にもう一回 好奇心駆動成長について再掲
- **好奇心を原動力に、1つのコードからなるべく多くのことを学ぶようにすると、やってて楽しいし周りのエンジニアさんに褒められる！**
- **一度実装したコードでも、書き換えたり、気になる点を調べたりすると知識がどんどん広がって楽しい！**

# 終わりに
読んでいただきありがとうございました、是非:thumbsup:やアドバイス、よろしくお願いします！:bow:

そろそろ今年のAdvent Calendarも折り返しですが、明日以後の[Makuake Product Team Advent Calendar 2018](https://qiita.com/advent-calendar/2018/makuake) もお楽しみに！