30代、未経験、コロナ禍でのエンジニア転職活動【1週目】

今週から本格的に転職活動を開始致しました。当然ながらPFはまだまだ改善の余地もあり、まだまだ業界の事も把握し切れていない中の活動開始ですが、結局習うより慣れろ、が私の信条でもありますのでまず行動します。これは私の持論ですが、新卒の時も当時リーマンショックでネットを中心に就活に関しては、とかくある事ない事たくさんの情報に溢れており、最終的には自分の本能を信じるしかないと思います。

 

しかし、題名にあるような環境下での転職活動というのは自分から見ても、ある意味無謀な戦いです。例えば、30代は20代よりも極端に求人が減る、コロナで30件受けても1件書類選考が通るかどうか(これは実際にエージェントに言われた)、PFのレベルが高くないと面接に行けない、とかとか。この辺のことはきっと特に30代の人は気になってくると思うので、できれば毎週自身での振り返りもかねて、ここにリアルを記していきたいと思います。私のスペックやPFはTwitterのプロフィールからwantedlyに行けますので興味ある方はご確認ください。未経験全体の中でのスペックは中の中、PFは下の上ぐらいかなと自分では思ってます。

 

さて、記念すべき1週目です。

本格応募は日曜日から開始、主にwantedly、green、とエージェント経由求人、一応現段階で合格が出れば即行ってもいいと考えている企業を探してエントリーしました。ちなみに、私の軸は、過去の経験が少しでも活かせて、開発の経験が積める企業、です。東京か名古屋で考えております。ネットで情報を見ることしかできない現段階では、私の経験に近ければ近い程志望度は高いですが、全企業面接、書類選考には現時点での100%で臨む意欲があります。

 

応募件数は伏せておきますが、選考の結果だけ割合でお伝えします。

wantedly  面談、面接 60%  アクション無(書類選考結果待ち含む) 30%  お祈り 10%

green          面談、面接 15%   アクション無(書類選考結果待ち含む)55%  お祈り 30%

エージェント 面談、面接 15% アクション無(書類選考結果待ち含む) 66% お祈り 15%

 

というような感じです。面談の後に書類選考等の企業もあるようで、それを含めれば、なるほど、確かに厳しいのかもしれません。しかし、まあそんな絶望する程厳しい訳でもない。30歳で未経験なんて、100件受けても1件面接行けるかどうか、みたいなことを言っているのを見たこともあったので、勝機は充分あるなという思いの方が強いです。恐らく我々のようなおっさんにとって最もハードルが高いのが書類選考、会ってくれさえすれば若者よりも職歴から話せることは多いですから。また、そもそも30代で未経験職種にチャレンジしている時点でその覚悟は伝わるはず。今回はとりあえずこんなことしか伝えられないのですが、もし、同じ30代でネットで言われてるぐらい苦戦している人がいれば、PF、プロフィール、選考企業の見直しで私ぐらいには戦えるようになるかもしれません。gitのコミット数、状況も大事ですね。私も特にPFはまだまだ甘々なので勉強のペースを落とさずがんばっていかないといけません。

 

ちなみに、上の結果からもやはり採用コストが圧倒的に安いWantedlyが突出して面談へのハードルが低く、可能性はありそうです。逆にgreenは相当各社ごとに志望動機をしっかり練らないとなかなか書類選考は通らないですね。

 

ちなみに、本日初面接を受けたのですが、やはり過去の経験や志望動機とかは流石にこの歳なので、あんま構えなくても自然と話せるのですが、PF含めて技術的な質問に対しての課題が浮き彫りになった形でした。その辺はやっぱ個人的にはpaizaに本腰入れて取り組む必要があるなと感じています。paizaでBランクぐらいあれば多少面接で技術的な質問に詰まっても影響少ないですしね。この週末からは改めてしっかりPFを作り込む、paizaにフルコミットしながら技術的なインプットを強化する、をテーマに頑張ります。当然ながら、面談、面接に対してもしっかり企業研究をして1社1社全部ここで決めるぐらいの気持ちで研究、準備もしていく。忙しいですが、ここが本当に人生の最大の分岐点になる、後悔しないように全力で臨もうじゃありませんか。

 

このブログのテーマは30代に勇気を与えることです。本当に20代よりも新しい技術を習得することが難しい?職歴が邪魔して戦力にならない?いやいや、そんなことはない、と思っています。どんな経験も絶対に無駄ではない、それを買ってくれる企業は必ずどこかにいる、そう信じて戦っていきましょう。私のやり方が決して正解ではありません。自身の信じた戦いを素直にしていくことで色々なやらかしもしてしまうと思いますが、それが30代の皆さんの学びになればと思いますので、まあ正攻法でがんばっていきたいと思います。

 

 

 

 

TECHCAMP卒業したので総括しておきます(今後入学検討の人参考にしてください)

先日長いようで短かったスクールでの学習が完結しましたので、ざっと総括して実際のところどうなの?っていうところを可能な範囲で実体験を共有致します。良いことも悪いことも書きますし、youtubeで卒業生が言っているような事とはちょっとベクトルが違いますし、過ごし方も違います。

 

結論を、一言でいいます。

 

「概ね満足、でもコスパは悪い」

 

です。私のようにあまり時間もなくて最速でエンジニアになりたい人は何かしらのサービスを使うのは必須です。当然過去の人間力を頼りに内定をもらえる人もいるでしょうが、プログラミングスキルといった観点で見れば10週間で完全独力で今の状態になるのは難しいとは思います。なので、スクールには全面的に感謝しかありません。

 

しかし、料金面で見れば高いのは否めません。良く考えるのは大学受験の時、私は最後3ヶ月だけ個別対応の学習塾に行って自分的には大成功の結果になったのですが、そこは完全に1対1の対面で自分の好きな科目だけ学べて、講義外の質問も受け付けてくれてクリスマスにプレゼントとかくれたりして、それでもプログラミングスクールの恐らく5分の1ぐらいの価格だったと思われます。恐らく先生は大学のアルバイトでした。最終的にはこの業界がもっと強烈な競争に晒されて誰でも気軽に受講できる環境になる事を願います。実際の価格とか転職保証の内容をHPで調べて以下確認ください。

 

よく言われる内容を勝手に考えます(星5段階)。他のスクール知らないので比較しようがないので、絶対評価と思ってください。

 

カリキュラム ⭐︎⭐️⭐️

市販の紙の参考書よりは絶対にわかりやすいです。あれを最初にやるから多分挫折するんでしょう。内容の深さでいうと 市販の参考書、公式リファレンス>udemyとかの動画教材>スクール教材、わかりやすさがこれの反対っていうイメージです、なのでudemyとかの動画教材をもっとマイルドにしたような内容がたくさんあるような感じです。詳しくは書けませんが範囲は、インフラ(初歩)、HTML(初歩)、rubyrails(中級)、git(初歩)、javascript(初歩)、デプロイ(初歩)、SQL等(初歩)って感じですかね。最終的にはフリマコピーみたいなサイトが自力で作れるようにはなります。

 

個人的な問題提起として、最終課題まで1ヶ月程で終わってしまい、そのあと完全独力でただひたすらPFを作っていただけだという点です。(質問不可)。要するにちゃんとやれば1ヶ月で終わる内容を2ヶ月掛けてやる計画になっているのでボリューム少ない。これは私が突出して速いわけではなく、グループの5人中4人が同じ状況でした。本来であれば、カリキュラムのボリュームを増やして、もう1ヶ月ぐらい学んだ上、3週間ぐらいでPF作って転職支援って流れぐらいでもいいんじゃないかと思いました。噂によると過去はチーム開発があったがPFの問題でやめた?それならその分安くするか、他のカリキュラムで補填頂きたい。

 

メンター⭐️⭐️⭐️⭐️

メンターは良かったと思いますよ。確かにエンジニア経験はない契約社員?アルバイト?なのかもしれませんが、質問したことは解決してくれましたし、変な人もいなかったですね。多分、メンターにいい印象持たなかった人は最低限の質問方法等の礼儀ができてなかったのではないでしょうか。どんな学校でも職場でもそうですが、基本的に優等生がたくさん情報もらえて得です。郷に入れば郷に従えってやつですかね。

 

転職支援、返金保証 ⭐️⭐️

1.5ぐらいの感覚ですね。返金保証は地方企業受けた時点で✖︎、30歳以上はアルバイトOKじゃないと✖︎、年収350万以下OKじゃないと✖︎、週間20件以上受け続けないと✖︎、と色々制約はあります。まあ、それはいいんです、就職率99%、しかもあらゆるスキルの受講生を就職させるのは至難の業です。問題の就職支援ですが、スクールから紹介される案件の3倍ぐらい自分で他の求人から応募することを半ば強制されます。転職サイトで見つけてHPで直応募するとかそれ言っちゃうの笑、ということも伝授頂けます。ということなので、あんまり自力でやっているのと変わらないですね。紹介してもらうメリットってありますか?って質問したところ、選考が通りやすいということでした。それは今後身をもって確認したいと思います。書類の添削とかも一応してくれますが、それなりに新卒の時ちゃんと就活した人ならほとんどノー添削で終わってしまうと思います。

 

仕組み、環境 ⭐️⭐️⭐️

基本的にスラックで時間事に通知が来て、朝礼したり、グループでアウトプットしたりをひたすら繰り返していきます。ライフコーチという人がグループにいて合間合間に確認にくることもあります。ライフコーチがライザップとかのメンター的な役割だと思いますが、そんなに干渉してきません。暖かく見守ってくれる印象でした。悪く言えば、自身のマネジメント力がない人を半ば強制的に1人前にするみたいなマネジメントはしてません。結局本人次第でしょう。マコなり社長がよく言っている強みとしてはここの部分になるんでしょうか。

 

正直、ここはグループ次第ですね。私のグループは上記書いたように5人中4人は卒業時点でオリジナルアプリはほぼ形になっていてAWSでデプロイまでできていましたが、過去2つ上の先輩方のグループは申し訳ないですが大半がオリジナルアプリに着手すらできていませんでした。失礼を承知で言うと、そんな状態でどうやって就活するの?って思います。もし、私のグループもそのような状態で、自身が圧倒的に速く進んでいたらどうでしょう?恐らくここまで自分を律して進めて来れなかったですね。私のグループでも一人だけ過去のグループの平均レベルの人がいましたが、やはり後ろめたいのかアウトプットにはかなり早い段階から参加してくれなくなりましたね。本当にこのグループで良かった、感謝です。

 

環境面で加えて伝えたいのは、教室利用の制限です。私は無料ガイダンスの時点ではお話無かったですし、スマホのHPだと案内どこにあるかよくわからないので注意です。名古屋は平日週2回のみ利用可。家庭がある身としては意外とこれはマイナスポイント大きかったですね。メンターへの質問もITリテラシーがないと最初意外と戸惑うと思います。

 

ざっとこんな感じですが、よく他の卒業生がやっているもう一度受けるならどうする?みたいなのも書いておきます。正直、自身の進め方にあまり後悔ないです。鉄則のようなものと思ってください。

 

①まず、入校前に言われた予習はやりましょう。

私はプロゲートの指定されたコースは全て終えて入校しました。特にHTML。HTMLの基礎の基礎に時間掛けているようでは苦しいです。予習しておけばいいことありますか?って聞いたから教えてくれたのか忘れましたが。

 

②目標は1ヶ月で最終課題攻略、残りをPFデプロイまで、ある程度戦える状態に。卒業したら即就活に入れる心積りを。

これが一番大事、鉄則です。卒業時点でやっと最終課題終わりました状態では、フリマもどきをPFで就活をしなければなりません。それかPFに時間をとられながらCAに言われるがまま半端な就活をするか。それだけは避けなくてはならないと個人的には思います。ついて行くことが難しいなら土日も10時間、やるしかないぐらいの気概が必要です。もちろん時にはリフレッシュも大事ですけどね。

 

③なんでそこのスクールに入るのか?答えられますか?

マコなり社長がカッコ良くてとかはダメですよ。柳井社長、似鳥社長が好きでそこの商品使っている人いないでしょう?マコなり最高、の人はdivの選考受けてください。ちなみに私は料金は高くてもいいから有給消化中に完結して、それなりに名の通った企業への就職実績があったからです。(今思えば、サイバーエージェント諸々の就職実績はにわかに信じられません。受けることすら恥ずかしくてできません)料金高い方がカリキュラムの内容いいでしょって思ってしまったところは反省点でもありますね。とにかく金で時間を買ったということです。そこに後悔はありません。

 

④質問はしましょう。元を取るつもりで。

オリジナルアプリに入ると質問を全く受け付けて頂けません。それはカリキュラムの内容に関しても、です。なので、そこに入る前に少しでも疑問があることはメンターに質問して解決しておきましょう。っても、実際自分で作ってみないとこんな事が起こるのか的な部分はわからないことが多いのですが。

 

⑤とにかく手を動かして知識を定着させましょう。

これも鉄則です。いくら受け身でインプットしても数日すれば忘れます。見る→実装する→テスト受ける、これを最速で回して行くのがいいでしょう。最終課題の前に実装課題という質問不可のテスト実装みたいなのがあるのですがどうせそこで復習します。

 

こんな感じですかね。とにかくこれから受講を考えている人、入るのは全然止めないのですが、周りがどんな進捗でも自分を強く律して上記のことは守って頂くことが重要だと考えますし、当然こんなことライフコーチは言ってくれません。おすすめとしてはprogateのHTMLとRUBYを一通りやった上で2週間のお試し入会をして、最速でカリキュラムを進めて、2週間時点で追加実装のカリキュラムを見てここまでできるようになるなら続けたいって思えるかどうかで決めたらいいんではないでしょうか?

(こんなこと言ったら怒られるかもしれません。なんか注意きたら削除します。でも本実際そんな感じだと思います)。

 

最後に自分への追い込みもかねて、kentaさんの問題の発言を共有しますね。

カイジという漫画で人生色々と積んで、多額の借金を返済する為にギャンブル船に乗らされて勝ち残らなければどういう境遇に沈められるかわからないという状況にも関わらず、自分の陥った状況が認識できていなくて、負けたのにヘラヘラして照れ笑いしながら退場していく若者の描写がありましたが・・・・・ショボイポートフォリオしか作れない人は、まさにその若者と同じ状況だと思います。」

いや、これは言い過ぎ(笑)って思いましたが、言い得て妙です。せっかく参加するなら、勝つんだ、勝たなきゃゴミだっていう強い意識が必要ですね。

 

www.youtube.com

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

テックキャンプ 最終課題まとめます

最終課題が終わったので、ミスした点を振り返りながら再発を防ぎます。

細かいコードの記述などは致しません。あくまで自身用の復習の為に羅列していく形式ですので、実際にどういうコードを記述するかはこの内容をヒントに別の方の記事で確認をお願い致します。

 

テックキャンプ の最終課題ではメルカリクローンのようなアプリケーションを実装しました。以下復習点羅列。

 

ER図、README

・DBに保存できないクレジット情報、deviseに標準設定されているパスワードはカラム作成不要。

・画像登録にActiveStrageを使用する場合はimageカラムも不要。

・1対1のアソシエーション(投稿商品と購入データ、等)は親にhas_one、子にbelongs_to

・重要なのは、ここで作成した設計図は完全では無いということ。実装に関してはこのER図に固執するのではなく、都度修正しながら作っていくのが重要。しかし、全体像はここで考えておく。

 

ユーザー登録

・deviseを導入するとモデルやコントローラの作成が若干変わる。rails g devise 名前、等。

・registrationは新規登録、sessionはログイン、サインアップは新規登録、サインインはログイン、意外とこんがらがる。

・バリデーション等がdeviseでどこまで標準装備されているか確認しておく。

・deviseでコントローラは基本的にいじらない。application_controllerにストロングパラメーターの設定をする。

・ルーティング時にスコープを設定する。

devise_scope :users do
get '/users', to: redirect("/users/sign_up")
end

・テストコード時、Eメールの重複をチェック

it "emailが重複する場合登録できないこと" do
@user.save
another_user = FactoryBot.build(:user, email: @user.email)
another_user.valid?
expect(another_user.errors.full_messages).to include("Email has already been taken")
end

 

商品出品機能

・form_withの使い方として、モデルを指定した場合は、データの受け手のストロングパラメータの設定時、requireでモデルを紐づける。個人的に変数をviewに反映させる、部分テンプレートでデータの数だけ表示させるみたいな処理はこの形式の方がやりやすいので基本はこの形で設定することにしている。また、モデルを指定する場合はURLの指定がいらない。

・form_withでデータを入力する時点で、変数にデータが入っていればedit、入っていない空のインスタンスであればcreateアクションを呼び出す。

・userと紐づけるので、アソシエーションと、ストロングパラーメータのmergeを忘れない。

・エラーメッセージの出力は部分テンプレートをform_withのオブジェクトと結び付けて発動できるよう設定する。

都道府県等の変更が発生しないデータ、はカラム名のモデルを作成し、ActiveHashを設定する。

class Postage < ActiveHash::Base
self.data = [
{ id: 1, name: '--' },
{ id: 2, name: '着払い(購入者負担)' },
{ id: 3, name: '送料込み(出品者負担)' }
]
end

基本はHTMLでcollection_selectと合わせてプルダウンの選択式にする。

<%= f.collection_select(:category_id, Category.all, :id, :name, {}, {class:"select-box"

そもそものカラム名はこれらのIDを取得できるように設定しておく。

・同じバリデーションを複数のカラムに設定する場合、with_optionsで纏める。

with_options presence: true do
validates :category_id, numericality: { other_than: 1,
message: "must be other than --"}
validates :condition_id, numericality: { other_than: 1,
message: "must be other than --"}

・テストコード、ActiveStorageを使っている場合は、Fakerを使用できない。after

buildで指定の画像を指定する。

after(:build) do |item|
item.image.attach(io: File.open('app/assets/images/item-sample.png'),
filename: 'item-sample.png')

 

商品一覧表示機能

・個人的には部分テンプレート、collectionオプションで変数を利用するやり方がわかりやすい。eachで繰り返し処理をすることもできるが、記述が長くなる。

 

商品編集・削除機能

・どのユーザーならそのページに行けるかという条件分岐を設定する。また、そのような条件分岐は基本的にbefore_actionでまとめておく。

・移動先のパスとmethodに注意する。railsroutesで確認。パスの記述方法は全体で統一する。prefixがないやつはただ省略されているだけ。

<%= link_to '商品の編集', edit_item_path(@item.id), method: :get, class: "item-red-btn" %>
<p class='or-text'>or</p>
<%= link_to '削除',item_path(@item.id), method: :delete, class:'item-destroy' %>

・編集がうまく行った場合といかなかった場合の処理を指定する。redirect_to、renderの違いを意識する。redirect_toではインスタンスが空になってしまう為、ページを再編集に指定しても入力データが反映されないのでエラーメッセージが出せない。

 

商品購入機能

・一つのフォームで複数のテーブルにデータを保存したい場合はフォームオブジェクトを利用する。これをしないと入力ミスがあった際に個別のエラーメッセージの出力等ができない。具体的には、自身でActiveModelを作成してそこにクラスを定義、

①attr_accessorでカラムに保存する要素を全て使用できるように設定、

②バリデーションを定義

③saveメソッドを定義して各テーブルにデータを保存する処理を定義。

複数のテーブルにアソシエーションがある場合は、saveメソッドの処理の順番を注意する。親テーブルのデータをcreate,それを変数定義し親テーブルのIDを取得するような記述の仕方が必要。

④コントローラでストロングパラメータのフォームオブジェクトモデルをrequireする。

⑤createアクションに入ってsaveメソッドが実行される時、フォームオブジェクトの設定が反映される。

フォームオブジェクト内の記述はエラーにならない。データが保存されない等の時は、saveメソッド内のcreateアクションにcreate!と入れるとなぜcreateできないかエラーメッセージが表示される。

def save
@purchase = Purchase.create(user_id: user_id, item_id: item_id)
Address.create(purchase_id: @purchase.id, post_number: post_number,
prefecture_id: prefecture_id, city: city, house_number: house_number,
building_name: building_name, phone_number: phone_number)
end

 

 

クレジット機能

railsの入力フォームの送信処理をキャンセルする記述をjsに記述

②jsにフォーム送信がされた時にカード情報をHTMLより取得、それを暗号化(トークンの作成)、公開鍵に取得と設定、をする記述

トークンの情報を取得できるようHTMLにInsertHtmlでHTMLにinput要素を嵌め込む。その際、実際に表示しないようhidden属性を適用する。

④カード情報を残さないように、removeする処理を記述。

railsのコントローラーにPAY.JPに秘密鍵の作成、トークンと価格の情報をストロングパラメータに入れ込む記述。

⑥PAY.JPに購入データがうまく反映されてれば、環境変数を設定。

herokumasterを行う。

・公開鍵、秘密鍵は機密情報。js、rails上の記述も暗号化しておく。

Payjp.api_key = ENV["PAYJP_SECRET_KEY"]

・カード情報も機密情報、直接カード番号等をテーブルに保存する、ストロングパタメータに入れ込むような設定は違法。

・Jsはrails上ではエラーが確認できないので、検証ツール、debuggerを使用する。

 

本番環境における設定エラー

・画像のエラー解消の為にはDBのリセットが必要な場合が。

`% heroku run DISABLE_DATABASE_ENVIRONMENT_CHECK=1 rails db:drop db:create db:migrate`

 

・herokuエラーが発生する場合は、ログを確認する。

2020-10-24T02:16:56.252945+00:00 app[web.1]: [fb36fcf1-76b4-4c7e-9179-eeacaedebd95]

2020-10-24T02:16:56.252946+00:00 app[web.1]: [fb36fcf1-76b4-4c7e-9179-eeacaedebd95] ActionView::Template::Error (Mysql2::Error: Table 'heroku_f5d134c0865131d.purchases' doesn't exist):

自身の場合は、マイグレーションファイルを右クリック削除してしまったことで、エラーが発生。

bundle exec rake db:migrate:status

マイグレーションファイルの状態を確認、

Status   Migration ID    Migration Name

--------------------------------------------------

   up     20201015102415  Devise create users

   up     20201016071057  ********** NO FILE **********

NO FILEとなっているのは、ターミナル上はデータが残っているのに、rails上は削除されている状態。これがエラーの原因。

 

これの修正としては、このファイルをdownにして、コマンドで削除する。それで削除できない場合は、

rails db:migrate:reset

で一旦データベースを全て白紙にして、再度rails上に残っているマイグレーションファイルでマイグレートする。何回も誤って消してしまった場合はこちらでもいいかもしれません。この辺は他の方の記事の確認をお願い致します。ちなみに、herokuマスターでrubyを最新版にするとか、procfileがないよとか、webpackが最新じゃないよ、とか出てましたがこれは無視してもこのアプリの動作には問題ありませんでした。基本的には、まずログを確認する事が重要です。