I'm ganna be a Rails engineer

未経験からRailsエンジニアへの道のり

完全未経験から半年でRailsエンジニアとして内定を頂いた話(学習編)

はじめに

こんにちは山口聖也と申します。
2020年2月3日をもちまして晴れてエンジニアとして内定をいただく事ができました。
ここまでの道のりは正直過酷なものでした。「不安」「焦り」色々なものが襲ってきた半年間になりました。
そこで、どのような手順で内定まで行き着けたのか書いてみました。
疑問点、追加でもっと詳しく聞きたい方は僕のtwitterにDMをいただければ対応できますのでお気軽にお願いします。
twitter.com

対象者

僕と同じく未経験からWebエンジニアになりたい方、もしくは既に動き出している方に参考になると思います。
人それぞれ状況、ペースは違いますので一個人の意見として参考にしてもらえると幸いです。

前置き

僕自身プログラミングスクール(ポテパンキャンプ)に3ヶ月間通いました。しかし今回は、取り組んだ内容をまとめる為詳しくは触れません。
気になった方は是非調べてみてください。
camp.potepan.com
以下に僕の学習の流れを記載します。(後から詳しく説明していきます)

7月 ~ Progate & Rails Tutorial ~

一番はじめに手をつけたものは「Progate」です。
「解説スライド」とコードを打ち込む「演習」がセットになっている為、初心者にとってはプログラミングに触れるという点では非常に良いと思います。
僕が取り組んだ項目は以下になります。(Rubyの場合)

最低でもこの項目は一通り取り組むと良いかと思います。(後から役に立つ)
このProgateを取り組むにあたり重要なことは
やりすぎないこと」です。
やればやるほどわかった気になれます。ゲーム内レベルも上がります。しかし、やっていることはドラクエでいう永遠にスライムを倒してるだけにすぎないのでこんな感じでやるんだなと分かればそれで十分です。

次に取り組んだのは「Rails Tutorial」です。
スライムだけを倒していたあの頃と比べると比になりません。
そうです。なんでこんな難しいのって感じになります。
しかし安心してください。みんなそうですし、みんなクリアします。
ここで重要なことは
絶対に2週以上はする」「学習の間を空けない」ことです。
理由は1回じゃ流石に覚えられないし長いから早い事やらんと忘れる。(人間だもの)
ですので

  • 1週目
    • とにかく完走することを目指す(動画解説でも言ってる)。(理解度40%)
    • こんな感じで開発をしていくんだなと掴む
    • 分からん箇所は常に記録しておく(2週目で役立つ)
  • 2週目
    • 完走より理解することにフォーカスする(理解度80%)
    • 1週目で分からん箇所を潰していく
    • 開発者の気分でやる(気分だけでも)

この流れでやればやり切った後に、理解、達成感、さらなる向上心が獲得できます。
ちなみに、動画解説は高いけど本当におすすめです。挫折するよりまし。内定もらえないよりまし。なんでもいいので自分に理由つけて買いましょう。本当に買いましょう。
railstutorial.jp

さて、ここで一息ついてる時間はありません。
休んでる間にまた1人、未経験から内定を貰ってるかもしれない。先に進みましょう。

時間でまとめると
Progate(約2週間) + Rails Tutorial(約2週間) = 約4週間
となります。

8月 ~ インスタグラムクローン ~

次に取り組んだのは「インスタグラム」のクローン作成です。
目的は、Rails Tutorialで身につけた知識の実戦だと思ってください。
これがまあできないできないいざやってみると。。
まあ、最初はそんなもんだな。と自分に思い込ませましょう(気楽に気楽に)
見直しながら、苦戦しながら取り組むことでスピードも上がっていき
だんだんスラスラ書けるようになってきます。
ここで重要なことが
プラスの機能を追加する」ことです。
例えば、

  • Facebookログイン機能
  • パスワード更新機能

などなど。Rails Tutorialには無かった機能を自力で追加していく事で「ググる力」「自走する力」が付いてきます。

作成時間は2週間ほどです。

次はいよいよ自作アプリ(ポートフォリオ)作成です。
今まで得た知識を存分に発揮できるよう頑張りましょう。

8月後半~10月初旬 ~ ポートフォリオ作成 ~

ポートフォリオを作る上で重要だと感じた事は以下4点です。

  • Rails Tutorialの機能だけでなく+した機能を追加する
    • ぶっちゃけ誰でも作れてしまうし、この人やる気あるんかと思われがち
  • UX/UIを気に掛ける
    • 採用する側も人です。当然第一印象、使いやすさが大事
  • テストをできるだけ書く
    • やはり開発をする上で必要不可欠なこと
  • デプロイはAWS
    • herokuより「お??」と思ってもらえる。

以上4点を踏まえて一言で大切なことは
自走能力を証明」することです。
自分以外にもライバルがいる事常に頭の片隅においてください。挫折している暇はありません。(ちなみに100回ぐらいなりました。)

Rails Tutorialの機能だけでなく+した機能を追加する

Rails Tutorialに毛を生やした程度では、ガイドラインに沿ってコードを写経しているだけですので、自走能力を証明できません。
最低でも(投稿サイトの場合)

  • 記事一覧表示機能
  • 記事詳細表示機能
  • 記事投稿機能
  • 管理ユーザー登録機能
  • 管理ユーザーログイン機能
  • 画像投稿機能
  • DBテーブルのリレーション機能
  • DBトランザクションの制御機能
  • ページネーション機能
  • 単体テスト
  • 統合テスト

の機能+自分自身であったらいいなと思う機能を追加してみてください。
なんか知ったかぶり感が満載ですが、こちらの動画を参考にしております。
www.youtube.com

UX/UIを気に掛ける

採用側は、おそらく一人一人に割ける時間は多くはありません。
人の第一印象は0.3秒で決まる(確か)のと同じように、ポートフォリオにも「第一印象」があります。
そこで重要になるのがデザインと使いやすさです。
ぐちゃぐちゃな見た目は相手に一瞬でマイナス評価を与えますし、使いにくさも同様です。

  • みやすいデザイン
    • 各コンテンツの配置、色など
  • 操作性の良さ
    • ログイン機能もありつつゲストログイン機能も搭載など

意外に見落としがちなポイントですが、自分が採用側だったらどう思うか??
を意識することで解決に近づきます。

テストをできるだけ書く

開発をしていく上で大事なのはテストをかける事です。
完璧に書くのは未経験の時点では不可能です。自分もそうでしたし、きっと採用側もそう思っています。
大事なのは「こんなに頑張って書いたぞ!!」の誠意が見えるぐらいの質にしましょう。
Rails Tutorialではminitestを用いて記述しましたが、ポートフォリオRspecを用いましょう。
色々なサイトを参考にするのもいいですが僕がお勧めするのはこちらの電子書籍です。
leanpub.com
詳しく対象者がRails Tutorial修了者になっていますので、問題なく読めるかと思います。
こちらで学習を進めながら単体テスト、統合テストをできるだけ多く書くと良いと思います。

デプロイはAWS

herokuは大体の人が用います。
採用側からすると、herokuかとなる事もあります。(一部では)
そこで難易度は一気に上がりますが、AWSを用いてデプロイを行いましょう。
参考にしたサイトはこちらです。
qiita.com
デプロイまでの道のりは容易なものではありませんが大変わかりやすくまとめられています。
僕の場合ポートフォリオ制作で一番苦労した点がここでした。
一週間以上エラーで本番環境に画面が出力されませんでした。。
しかし、やればできます。やらなければできません。ただそれだけです。(今だからこそ言えてます。当時は絶望でした。)

参考まとめ

学習、ポートフォリオ制作にあたり参考、活用させていただいたコンテンツをいかにまとめておきます。

  • Progate

prog-8.com

railstutorial.jp

leanpub.com

  • AWSデプロイ

qiita.com

  • 参考YouTuber

www.youtube.com

  • オンラインサロン

kentakatsumata.net

最後に

今思い返せば、やってよかったなと思えますが、当時は本当になれるのか不安もあったし、挫折しそうにもなりました。
しかし、いつか絶対内定を勝ち取るんだという強い意志だけは持ち続けたことが大きな要因でした。
皆さんも、同じ状況、もしくは、これから始めるかただと思いますが、諦めず続けることができれば必ず達成できると思います。
思い返せば、いい思い出になります。頑張っていきましょう。

タピオカから学ぶオブジェクト指向プログラミング入門

あっという間に12月になりましたね。

今年に入りプログラミング学習、転職活動という事で凄まじいスピードで時が過ぎ去って行きますね。
あと1ヶ月気を抜いてはならん!!という事で今回は
オブジェクト指向プログラミング入門』をタピオカクラスを使って学習してみました!!!

はじめに

今回の学習にあたり我らが伊藤淳一さんの動画を参考にしました。(勝手に尊敬させていただいてます)

参考の動画と違う点は2つございます。
1・たい焼きではなくタピオカ(流行ってるからしただけ)
2・テストは書いてません(TDDの方がいいぞ)

へなちょこですので物足りない方はたい焼きの方がいいです。美味しいしね。

twitter.com

www.youtube.com

構成

今回はタピオカという事で注文時にありそうな物をクラスの中に入れてみます。

#タピオカ

#1・飲み物の種類

#2・トッピング
  #:種類によって値段変動

#3・サイズ(S, M, L)
  #:サイズによって値段変動

#4・氷 (少なめ、ふつう、多め)

#5・砂糖 (少なめ、ふつう、多め)

#6・合計料金

STEP1

タピオカクラスを作りインスタンス変数に必要な要素を入れます。

class Tapioca
  attr_reader :juice, :size, :topping, :ice, :suger
  def initialize(juice, size, topping, ice, suger)
    @juice = juice #飲み物の種類
    @size = size #サイズ
    @topping = topping #トッピング
    @ice = ice #氷の量
    @suger = suger #砂糖の量
  end
end

tapioca_1 = Tapioca.new('黒糖ミルクティー', 'S', 'ミルクフォーム', '少なめ', '多め')
puts tapioca_1
tapioca_2 = Tapioca.new('黒糖ほうじ茶ラテ', 'M', 'タピオカ倍増', '多め', 'ふつう')
puts tapioca_2

この時点で出力しようとしても

#<Tapioca:0x00007fe4868ab1b0>
#<Tapioca:0x00007fe4868aafa8>

このようにうまく出力されないので
to_sメソッドを上書きします!

STEP2

def to_s
    "飲み物: #{juice} | サイズ: #{size} | トッピング: #{topping} | 砂糖: #{suger} | 氷: #{ice} "
end

こんな感じにto_sメソッドを上書きすると

飲み物: 黒糖ミルクティー | サイズ: S | トッピング: ミルクフォーム | 砂糖: 多め | : 少なめ 
飲み物: 黒糖ほうじ茶ラテ | サイズ: M | トッピング: タピオカ倍増 | 砂糖: ふつう | : 多め 

受け取った情報を出力することができました!!

STEP3

次にトッピングやサイズによって値段を変更するプログラムを書いていきます。

  #ミルクフォーム  = +30円
  #タピオカ倍増   = +50円
  #コーヒーゼリー  = +70円

  def charge
    amount = 550
    if size  == "S"
      amount -= 150
    elsif size == "L"
      amount += 100
    end
    if @topping == "ミルクフォーム"
      amount += 30
    elsif @topping == "タピオカ倍増"
      amount += 50
    elsif @topping == "コーヒーゼリー"
      amount += 70
    end
    amount
  end

ふつうサイズのトッピング無しの値段を550円とします。
そしてif文で各サイズ、各トッピングの応じて値段を追加し最後にamountで出力させるようにします。

次に先ほどのto_sメソッドに料金を追加します。

飲み物: 黒糖ミルクティー | サイズ: S | トッピング: ミルクフォーム | 砂糖: 多め | : 少なめ | 合計:  430飲み物: 黒糖ほうじ茶ラテ | サイズ: M | トッピング: タピオカ倍増 | 砂糖: ふつう | : 多め | 合計:  600

どうでしょう。
このようにするとクラスの中のタピオカの『注文設計図』なるものから具体的な注文の内容を作り出すことが出来ました。

このようにクラスとは設計図みたいなもので、具体的な物を作る上でひいつようになってくる物なんですね。

最後に

今回は簡単に自分なりに作りながら学習しました。
1つ大事だと思うことはただ見て理解するだけで終わらず、少し変えるだけでもいいので自分で形ある物を作ってみると頭に残りいいインプットができると思います。
それではみなさんあと1ヶ月気を抜かず頑張りましょう!!

面接は技術よりも勘違いさせる力が重要かもね ~「イケメン」か「ブサイク」か~

お久しぶりです。
サボっていたわけではありませんと言いたいところですが少しサボっておりました。

と言うわけでタイトルにもある通り今回は
『面接においての勘違いさせる力とは』について書いていきます。
他の方達の面接対策とは少し違った視点なので参考になると思います。

前提

これは僕が最近読んだ
『人生は、運よりも実力よりも「勘違いさせる力」で決まっている』
と言う本を参考にさせて頂いております。
今回は面接に活かせるであろう事を自分なりに完結にまとめました。

人生は、運よりも実力よりも「勘違いさせる力」で決まっている

人生は、運よりも実力よりも「勘違いさせる力」で決まっている

錯覚資産て何よ?

結論から言いますとズバリ
『人々が自分に対して持っている、自分に都合のいい思考の錯覚』
及び、それを引き起こす事実のことです。
........よくわからんわ。ってなりますよね。

イケメンかブサイクか

さて先ほどの説明では理解出来なかったと思いますので、例をあげて説明していきます。
登場人物は2人です。

①清潔イケメンの人
②ブサイクな人

話している内容は全く同じ事にします。

この場合、圧倒的な確率でイケメンの人が面接に通るのです。
ここで重要なのが通った理由は単純な
イケメンだったから』ではないと言う事です。
じゃぁなんだよって思いますよね。

本当の理由は
イケメンだし清潔だしなんだか仕事出来そうだ』と思わせたからです。
つまり何が言いたいかと言うと、イケメン仕事ができるは全くもって繋がりがないのにも関わらず、たとえブサイクの人の方が仕事ができていてもそう勘違いされてしまうという事です。
これこそ『錯覚資産』なのです。

は???見た目が全てってことか??舐めてるのか??と思われてしまうかもしれませんがこれはいくら面接感の方がその仕組みを知っていたとしても無意識のうちに頭でそう解釈してしまうものだと、筆者は語っております。

結論

僕自身も含め未経験から今まさにエンジニアへ転職を目指す上での最後の難関は面接の場だと思っております。
そこまで学習してきた事、技術はもちろんとても重要です。
しかし、それ以上に大事なのは相手にいかに勘違いをさせるかが重要だと考えています。
これは嘘をついて騙し良いように見られろとは言っておりません。
技術の印象をより持たせるためにまずは
『お?????』『なんか仕事できそうだぞ???』と思わせることがとても重要だということ。
その上で、技術とか今までやってきた事を話す事でより高評価に繋がると思います。

最後に

なんか薄い内容になってしまった感は否めないですがこれは参考にさせていただいた書籍の1%ほどの内容です。

僕自身も未経験からエンジニアを目指しております!!
皆さんも一緒に頑張りましょう!!

AtCoderをRubyで解いてみた!!(前編)

来たるコーディングテストへの対策として何が一番いいのか色々試しております。

 

その中で日本語&他の人の回答も見れるという点からAtCoderというサイトにたどり着きました!!(こりゃいいぞ)

自分の回答と照らし合わせてより良いコードとも照らし合わすことができるのでこりゃ最高ってことで自分なりに解いて見直しをしてみました!!

 

atcoder.jp

それじゃあ行ってみよう!!

 

 

 

前提


 まずこちらの

AtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~ - Qiita

の10問をRubyで自分なりに解きました。

こちらを別のタブで開き問題をみながら解いてみてください!

 

次にこちらの

AtCoder に登録したら解くべき精選過去問 10 問を Ruby で解いてみた - Qiita

を参考にリファクタリングしました!!

 

いやぁ、とても勉強になる。

Paizaなどはたとえ自分が合っていたとしても他の回答がみられないので僕みたいな経験がない身からするとやりずらかったです。

 

第1問


 

*自分*

a, b = gets.split.map(&:to_i)
puts (a * b).even? ? 'Even' : 'Odd' 

 *模範*

a, b = gets.strip.split.map(&:to_i)
puts (a * b).even? ? 'Even' : 'Odd' 

 *ポイント*

 if分は3項演算子でシンプルにすればコードが短く書ける。

条件演算子(?:) - 条件分岐 - Ruby入門

第2問


 

*自分*

s = gets.split("").map(&:to_i)
puts s.sum 

*模範*

puts gets.strip.split("").map(&:to_i).inject(:+) 

*ポイント*

・ sumメソッドはRubyバージョン2.4以降から利用できるメソッドみたい。

 どうやらAtCoderRubyバーションは2.3だから使えない。

・模範はinjectメソッドを使っているがこれからの事を考えて覚えておく必要性はない気がする。

・わざわざ変数に入れなくても

puts gets.split("").map(&:to_i).sum

としてもよかった。

第3問


 

*自分*

回答できませんでした。 

*模範*

 _n = gets.to_i
as = gets.strip.split.map(&:to_i)
cnt = 0
while as.all?(&:even?) do
      cnt = cnt.succ
      as = as.map { |a| a / 2 }
end

puts cnt

*ポイント*

・ 『全てが偶数である』という判別にall?という便利なメソッドがある。

・ Whileのループ技もしかっかり身につけたいところ

all? (Enumerable) - Rubyリファレンス

第4問


 

*自分*

 回答できませんでした。

*模範*

 a, b, c, x = 4.times.map { gets.to_i }
cnt = 0
(0..a).each do |i|
  (0..b).each do |j|
    (0..c).each do |k|
                      cnt += 1 if i * 500 + j * 100 + k * 50 == x
          end
     end
end

puts cntputs cnt

*ポイント*

 ・同形式の複数の標準入力はtimesメソッドで受け取る。(コードが簡潔)

・複数の変数の組み合わせはeachメソッドで入れ子の繰り返しを行う

・後置if文記法を使う(コードが簡潔)

第5問


 

*自分*

n, a, b = gets.split(" ").map(&:to_i)n, a, b = gets.split(" ").map(&:to_i)

result = []

(1..n).each do |m|

     result << m if m.to_s.split("").map(&:to_i).sum.between?(a, b)

end

puts result.sum

*模範*

n, a, b = gets.strip.split.map(&:to_i)

n,a,b = STDIN.gets.chomp.split(" ").map(&:to_i)
result = 0

(1..n).each do |i|
    j = i
    sum = 0
    while j > 0
       sum += j % 10
       j = j / 10
    end
    if sum >= a && sum <= b
        result += i
    end
end

puts result 

*ポイント*

・各桁の和を求めるには10で割った余りの合計を足していく方が主流だそうです。

・後置if文て結構便利なんだなってこんぐらいから痛感する。

betweenメソッドは初めて触れたが使い勝手がいい。

between? (Comparable) - Rubyリファレンス

 

感想


 

いざやってみるとプログラミングって難しいと改めて実感しますね。

しかし、論理立てて1つ1つ解いていくのはやはり楽しさの1つですね。

*1『チェリー本』で基礎は学習意しておりますが、その他での重要さはズバリ

『メソッド』だと感じました。

いくら配列や文字列の仕組みを理解できてもそこに変化を与えるメソッドを覚えないと意味がないと感じました。

コーディングテストに向けてさらに勉強あるのみですね。

後編は近々あげま〜す!!(自己満)

それじゃバイバイ!!

 

*1チェリー本