RSpecでよく用いられるgemについてまとめ

こんにちは。

私の会社ではテスティングフレームワークとしてRSpecが使われます。会社のリポジトリをざっと眺めてみて、よくRSpecと組み合わせて使われているgemたちをまとめてみました。

RSpec + FactoryBotは鉄板の組み合わせの印象です。shoulda-matchersもかなり有用なmatcherが使えるようになり、採用率は高い印象でした。

FactoryBotとshoulda-matchersはメンテナーもあのthoughtbot社ですし、GitHubのstarも多くかなりいいのではないでしょうか。

fakerも採用率が高く、FactoryBotの初期値として利用されているケースが多く見えます。

また、近年のwebシステムは何かしらのAPIを叩いているケースがほとんどかと思います。テストで実際にAPIを叩きに行くのはアンチパターンかと思うので、モックやスタブの用意が必要になります。

それについては個人的にはwebmockでshared_contextとしてAPIのモックを定義しておくのが良さそうに思いました。

RSpecはそれ自体がそれなりに学習コストのかかるフレームワークですが、これらのgemの機能も踏まえて良いテストコードを書けるようにしていきたいですね。

テストデータ系

  • テストデータを生成したり変更したりするタイプのgem

factory_bot_rails

機能

  • fixturesの代替機能で、テストデータ作成に用いられる
  • spec/factories配下にテストデータを記述する

  • specで見るcreate(:hoge)みたいなコードはFactoryBotの機能になります
let(:user) { create(:user) }
  • 上記の場合、spec/factories/users.rbにロジックが書いてあり、それに応じたデータが生成される
  • createが汎用的なワードなので分かりづらいが、本来はFactoryBot.create(:hoge)のように書く
  • spec/rails_helperに設定を書くことでFactoryBotのシンタックスを省略できるテクニックがある
# 本来はこう
let(:user) { FactoryBot.create(:user) }
# この設定を書くことでFactoryBotのシンタックスを省略できる
RSpec.configure do |config|
  config.include FactoryBot::Syntax::Methods
end
  • traitの機能で特性に応じて項目をグルーピングし、文脈に応じたデータを生成することができる
# プレミアムユーザーを作成する
let(:user) { create(:user, :premium) }
factory :user do
  birth_year { '1990' }

  trait :premium do
    is_premium { true }
    premium_registered_at { Time.zone.now }
  end
end

補足

  • fixturesと異なる点は以下があります
    • Rubyファイルに記述する
    • spec側で都度テストデータ投入処理を書く必要がある
      • spec側で引数を渡すなどして動的にテストデータを変更できる
    • モデルのvalidationを通すので正しいデータを作成できる
  • factory_bot_railsfactory_botRailsで使用する際に用いられるgemです
    • 以前はfactory_girlという名前だった
  • thoughtbot社が開発している(大きめの会社がメンテナーなので割と安心)
  • Everyday Rails - RSpecによるRailsテスト入門 でも紹介されている

faker

機能

  • ダミーデータを生成してくれる
  • カバーするデータの範囲は幅広く、住所やメアドをはじめとし、アニメキャラの名前など色々ある
  • 日本語のロケールファイルもある

  • FactoryBotと組み合わせて用いられることが多いイメージ
FactoryBot.define do
  factory :user do
    name { Faker::Name.last_name }
    email { Faker::Internet.free_email }
    password { Faker::Internet.password(8) }
  end
end

補足

  • RSpecに限らず使用可能
  • seedにもよく使われる
  • 1万行あるcsvを生成するスクリプトとかにも使える

timecop

機能

  • 「time trave」と「time freezing」機能を提供する
  • 要は時間を進めたり止めたりして、時刻に依存したテストができるようになる

補足

  • Timecop.returnを忘れると他のテストケースにも影響がある
  • 以下のパターンで対処するのが良さそう

  • spec_helperに書いておく

config.after(:each) do
  Timecop.return
end
  • aroundで書く
around(:each) do |example|
  Timecop.freeze(Time.now + 100.years)
  example.run
  Timecop.return
end
  • beforeとafterで書く
before { Timecop.freeze(Time.now + 100.years) }
after { Timecop.return }

matcher系

  • matcherを増やすタイプのgem

shoulda-matchers

機能

  • model やcontroller のspecで便利なワンライナーのmatcherが書けるようになる

RSpec.describe User, type: :model do
  describe 'relations' do
    it { is_expected.to belong_to :user_group }
  end

  describe 'validations' do
    it { is_expected.to validate_presence_of(:name) }
    it { is_expected.to validate_presence_of(:email) }
  end
end

補足

json_spec

機能

  • jsonを取り扱うためのmatcherが増える

describe User do
  let(:user){ User.create!(first_name: "Steve", last_name: "Richert") }

    it "includes the ID" do
      user.to_json.should have_json_path("id")
      user.to_json.should have_json_type(Integer).at_path("id")
    end

    it "includes friends" do
      user.to_json.should have_json_size(0).at_path("friends")

      friend = User.create!(first_name: "Catie", last_name: "Richert")
      user.friends << friend

      user.to_json.should have_json_size(1).at_path("friends")
      user.to_json.should include_json(friend.to_json)
    end
end

補足

  • メンテされているか微妙かも?
  • 似たgemにrspec-json_matcherもあります

スタブ・モック系

  • スタブやモックを返すタイプのgem

webmock

機能

  • 外部APIなどにアクセスする機能をテストする際に、APIレスポンスのMockを定義できる
  • stub_requestが出てきたらこのgemの機能です

RSpec.shared_context "stub hoge bad request" do
  before do
    api_url = 'https://hoge.com'
    stub_request(:get, "#{api_url}/api/v1/fuga")
      .to_return(
        body: ''.to_json,
        status: 400
      )
  end
end
  • shared_contextで定義したり、rails_helperのconfig.before(:each)に書いているパターンが多い
  • specにいちいち書くと汚くなるから良さそう

補足

  • RSpecに限らず使えるが公式のREADMEにRSpecでの使い方も載っている

vcr

機能

  • 初回にHTTPリクエストした結果を「カセット」として設定したディレクトリにモックデータとしてyamlで保存しておき、2回目以降のリクエストではそれを参照するようにする
  • モックデータがなければ、実際にAPIをコールしそのリクエスト/レスポンスをyamlに保存してくれる

require 'rubygems'
require 'test/unit'
require 'vcr'

VCR.configure do |config|
  config.cassette_library_dir = "fixtures/vcr_cassettes"
  config.hook_into :webmock
end

class VCRTest < Test::Unit::TestCase
  def test_example_dot_com
    VCR.use_cassette("synopsis") do
      response = Net::HTTP.get_response(URI('http://www.iana.org/domains/reserved'))
      assert_match /Example domains/, response.body
    end
  end
end
  • fixtures/vcr_cassettes配下にモックデータが保存される
  • use_cassetteで使用するモックを定義している
  • この例だとfixtures/vcr_cassettes/synopsis.ymlのデータを使う

補足

  • 初回はリアルなリクエストが行われるので注意
  • カセットのディレクトリにモックデータがあれば以降リクエストはモックされる
    • カセットのディレクトリがGitで管理されていればチームメンバーとスタブを共有できる
  • モックは初回に記録した以降変わらないのでAPIの仕様変更には注意が必要

その他

rspec-request_describer

機能

  • request specでdescribeに書いた内容をもとに、subject内でリクエストを発行してくれる

# subject will be `get('/users')`.
RSpec.describe 'GET /users' do
  it { is_expected.to eq(200) }
end

補足

  • いくつか縛りはあるが簡潔で読みやすいspecが書ける
  • Qiitaがわかりやすい

rspec-parameterized

機能

  • 複数の項目の組み合わせでテストを行う際に簡潔に書けるようになる

  • whereとwith_themのブロックを見かけたらこのgemの機能です
describe "plus" do
  where(:a, :b, :answer) do
    [
      [1 , 2 , 3],
      [5 , 8 , 13],
      [0 , 0 , 0]
    ]
  end

  with_them do
    it "should do additions" do
      expect(a + b).to eq answer
    end
  end

補足

  • Qiitaがわかりやすい

CI系

rspec_junit_formatter

機能

  • CircleCIなどで必要みたい

エンジニアがMacBook Pro買ったので環境構築や設定手順を晒してみる

こんにちは。

突然ですがMacBook Pro(US配列)を買いました。 備忘も兼ねて設定手順を書いていこうと思います。

スペック(Macの)

13インチMacBook Pro - スペースグレイ
システム構成:
第8世代の1.4GHzクアッドコアIntel Core i5プロセッサ(Turbo Boost使用時最大3.9GHz)
Intel Iris Plus Graphics 645
16GB 2,133MHz LPDDR3メモリ
256GB SSDストレージ
True Tone搭載13インチRetinaディスプレイ
Thunderbolt 3ポート x 2
Touch BarとTouch ID
PRO APPS 065-C171 NONE
SW LOGIC PRO X 065-C172 NONE
バックライトMagic Keyboard - 英語(米国)
アクセサリキット
  • あんまり興味ないw

システム環境設定編

iCloud

  • デスクトップのファイルをiCloudに保存するのをやめる

support.apple.com

トラックパッド

  • クリック:最弱
  • 軌跡の速さ:最速
  • その他のオプションは全てON

マウス

  • 最速

キーボード

  • キーのリピート:最速
  • リピート入力認識までの時間:最速
  • 修飾キーからCaps Lockcommandなどに割り当てて無効化する

Dock

  • サイズ:最小
  • Dockを自動的に表示/非表示にチェック
  • Dockのアプリはすべて消しておく

キーボード

  • WebからGoogle日本語入力をダウンロード
  • 入力ソースひらがな(Google)英数(Google)のみにする
  • ユーザ辞書スマート引用符とスマートダッシュを使用をオフ

アプリ編

Finder

  • あまり使わないが、最低限設定する
  • 表示から表示形式をカラムにし、すべてのオプションを表示にする
  • 環境設定
    • 新規FInderウィンドウで次を表示はホームディレクトリにする
    • タグは全部非表示
    • サイドバーアプリケーションダウンロードデスクトップぐらい

ブラウザ

Google Chrome

  • Webからダウンロード
  • 設定から規定のブラウザChrome
  • 詳細設定からダウンロードの保存先をDesktopに

ランチャー

Alfred4

  • hotkeyoption の Double Tap
  • Powerpackに入る
  • alfred-github-workflowを入れる
    • 自分はgh > loginができなくてこのIssueを見たらできました

メモ

Quiver

  • Markdown対応のメモアプリ
  • 有料

Bear

  • Markdown対応のメモアプリ
  • 無料、機能はQuiverと同等なので好み

エディタ

RubyMine

  • JetBrains社製のエディタ
    • Tools > Create Command-line Launcherを設定してmineでターミナルから開けるようにしよう
  • 有料
  • コードジャンプ性能が凄まじい

Visual Studio Code

  • Microsoft社製のエディタ
    • codeのシェルコマンドを設定してcodeでターミナルから開けるようにしよう
  • 無料
  • 軽量でサクサク動く

ターミナル

iTerm2

  • Preferencesから以下の設定をする
    • GeneralStartupWindows restoration policyOnly Restore Hotkey Window
    • ProfilesDefaultを選択し、透過度やフォントサイズを設定、コントラストを50%ぐらいにする
    • textからフォントサイズを15pxぐらいにしておく(Rictyにしたあとは18pxぐらいが良い)
    • WindowStyleFull ScreenScreenScreen with CursorSpaceAll Spacesにする
    • KeysConfigure Hotkey WindowからHotkeyを設定する
    • hotkeyをcommandのDouble Tapにする
  • これでiTremを起動しておけばHotkeyを押すことで、自分のマウスカーソルのある画面に全画面のターミナルが出てくる

パスワード管理

LastPass

  • PWを生成させて覚えさせることでパスワードを考えなくて&覚えなくてよくなる
  • Chromeの拡張とMacアプリどちらも入れる

その他

Run Cat

  • 動物が走る速度でCPU使用率がわかる
  • 他にもメモリ、ディスク、ネットワークの容量が見れるので便利

DeepL

  • 賢い翻訳
  • アプリ版はcommand + c2回でクリップボードの内容を翻訳してくれるhookがあって便利

開発環境編

パッケージマネージャ

Homebrew

  • brew helpでエラーが出なければOK

brew.sh

VCS

Git

  • brew install git
  • gitでエラーが出なければOK

GitHub

  • .sshキーの生成
    • mkdir ~/.ssh
    • 以下を参考に

qiita.com

シェル

zsh

カラースキーム

github.com

フレームワーク
  • Prezto
    • 既存の.zshrcに設定を書いているならBackupをとっておきましょう
  • .zpreztorcを編集します
    • zstyle ':prezto:module:prompt' theme 'xxx'の部分をcloudに変更します
    • zstyle ':prezto:load' pmodule \の色々読み込まれている部分以下を追加します
'git' \
'syntax-highlighting' \
  • .zshrcを編集します
    • フレームワークと関係ないですが、lsが見づらいので変えてあげましょう
    • export LSCOLORS=gxfxcxdxbxegedabagacadを追記します

github.com

フォント

github.com

その他

プログラミング言語

  • 各言語、以下の手順で設定していきます
    • バージョン管理ツールのインストール
    • 言語の最新安定版のインストール
    • パッケージ管理ツールのインストール

Ruby

  • MacにはRubyがデフォルトで入っています
 % which ruby
/usr/bin/ruby
バージョン管理ツールのインストール
  • brew install rbenv
  • ~/.zshrcに以下を書く
eval "$(rbenv init -)"
  • シェルの再起動
    言語の最新安定版のインストール
  • rbenv install x.x.x
  • rbenv global x.x.xRubyのバージョンを変更
  • ターミナルを再起動
  • Rubyのパスを確認
% which ruby
~/.rbenv/shims/ruby
  • ruby -vでバージョンが切り替わっていることを確認
    パッケージ管理ツールのインストール
  • BundlerRubyにデフォルトで組み込まれている
  • 以下のコマンドで確認
% bundler -v
Bundler version x.x.x

python

  • Macにはpythonがデフォルトで入っています
 % which python
/usr/bin/python
バージョン管理ツールのインストール
  • brew install pyenv
  • ~/.zshrcに以下を書く
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
  • シェルの再起動
    言語の最新安定版のインストール
  • pyenv install x.x.x
  • pyenv global x.x.xpythonのバージョンを変更
  • ターミナルを再起動
  • pythonのパスを確認
% which python
~/.pyenv/shims/python
  • python --versionでバージョンが切り替わっていることを確認
    パッケージ管理ツールのインストール
  • PipenvPoetryをインストールする
% brew install pipenv
% brew install poetry
  • 以下のコマンドで確認
% pip --version
pip xx.x.x from ~~
% poetry --version
Poetry version x.x.x

Node.js

  • MacにはNode.jsは入っていません
    バージョン管理ツールのインストール
  • brew install nvm
  • ~/.zshrcに以下を書く
source $(brew --prefix nvm)/nvm.sh
  • シェルの再起動
    言語の最新安定版のインストール
  • nvm install x.x.x
  • nvm use --delete-prefix vx.x.xの実行
  • nvm use x.x.xでNode.jsのバージョンを変更
  • ターミナルを再起動
  • Node.jsのパスを確認
% which node
/usr/local/opt/nvm/versions/node/vx.x.x/bin/node
  • node --versionでバージョンが切り替わっていることを確認
    パッケージ管理ツールのインストール
  • npmyarnをインストールする
% brew install npm
% brew install yarn
  • 以下のコマンドで確認
% npm -v
x.x.x
% yarn -v
x.x.x

Go

  • MacにはGoは入っていません
    バージョン管理ツールのインストール
  • brew install --HEAD goenv
    • goenvはbrewだと古いバージョンが入ってしまうので、--HEADオプションを付ける
  • ~/.zshrcに以下を書く
export GOENV_ROOT=$HOME/.goenv
export PATH=$GOENV_ROOT/bin:$PATH
eval "$(goenv init -)"
  • シェルの再起動
    言語の最新安定版のインストール
  • goenv install x.x.x
  • goenv global x.x.xでNode.jsのバージョンを変更
  • ターミナルを再起動
  • Goのパスを確認
% which go
~/.goenv/shims/go
  • go --versionでバージョンが切り替わっていることを確認
    パッケージ管理ツールのインストール
  • 言語自体に組み込まれているgo modを使えば良いので必要ない
    GOPATHを通す
  • ~/.zshrcに以下を追記
export GOPATH=~/go
export PATH=$GOPATH/bin:$PATH

DB

MySQL

  • brew install mysql
  • バージョンを確認
% mysql --version
mysql  Ver x.x.x ~~~
  • mysqlユーザーを作成する
% mysql.server start
Starting MySQL
. SUCCESS!
% mysql -u root
mysql> create user hogehoge01@localhost identified by "hogehoge";
Query OK, 0 rows affected (0.01 sec)

mysql> grant all on *.* to hogehoge01@localhost;
Query OK, 0 rows affected (0.01 sec)
  • GUIMySQLを操作できるSequel Aceをダウンロードしよう
  • 先ほど作成したユーザーで接続

f:id:ownweight:20200731031301p:plain

コンテナ

Docker

  • dockerhubからDocker for Macをダウンロードしてインストール
  • docker versionで確認しましょう

クラウド

AWS

  • cliをインストールします

docs.aws.amazon.com

GCP

  • cliをインストールします

cloud.google.com

Firebase

  • cliをインストールします

firebase.google.com

メインフレーム担当のCOBOLerがSIerのSEからWebエンジニアに転職して半年経過しました

はじめまして。

超絶久しぶりにブログを書いてみます。(Railsの学習記録は消しちゃった笑)

私は2019年の2月に転職を思い立ち、2019年12月に新卒入社から3年8ヶ月勤めた銀行系SIerから、 SaaS企業のサーバーサイドエンジニアへと転職しました。

転職してから気づけば半年経過してしまったので、振り返りも兼ねて、色々と書いてこうと思います。

スペック(当時)

今何やっている?

会社名や業務内容は伏せますが、 SaaS企業のサーバーサイドエンジニアとしてバリバリ業務で開発してます!(フロントも結構書くけど)

個人学習ではReact-Reduxを勉強していて、 re-ducksパターンを用いてなにかアプリを作ろうかなと試行中です。

転職しようと思ったきっかけ

色々あるのですが、「新卒時と価値観が変わったこと」が大きな理由かと思います。 新卒時の私は以下のような軸で会社を選びました。

  • 大手で社会的信用があること
  • 給料の良さ
  • 安定していること
  • 残業があまり多くないこと(これはハズレ引いた)

しかし、実際に社会人として経験を積んでいく中で、 本当に自分が会社に求めていることは「スキルアップできること」ではないかと思うようになりました。

そして、今いる環境は自分にとって「スキルアップできる」場所ではなかったため、 転職活動を行いました。

転職活動について

2019年の2月に転職を思い立ち、8月半ばに内定をもらい、2019年11月末で退社しました。 5月から6月は社内異動や出向の線を探っていて、中断していたので4〜5ヶ月ぐらいの活動でした。

就活面と勉強面で分けて書きます。 こうしてみると、意外と少ないですね...笑

ポートフォリオは転職活動で上手くいかなかったら作ろうと思っていましたが、 転職できたので結果的に作りませんでした。

やったこと(就活面)

  • 自己分析
    • 友人に相談
    • はてブに経歴や転職に対する思いなどを書く
  • Wantedlyに登録
  • カジュアル面談に行く
  • 社内転職の相談(メインフレームから先端技術系の部署へ)→断念
  • 面接&コーディングテスト

やったこと(勉強面)

転職活動について振り返り

転職活動については情報収集→行動を繰り返すのみという感じですが、 会社を決める際に1個だけこれやんなくて正解だったなと思ったことがあります。

それは「この人と働きたい!」と思って決めることです。

働きたい人がいるに越したことはないのですが、 ベンチャーやWebエンジニア界隈は人の流れが早いため、 いざ転職してみたらその人辞めてた・・・ということは十分ありえます。

カジュアル面談をしてくださった企業のエンジニアの方々はTwitterで定期的に見ていますが、 結構いなくなってる人多いなという印象です。

実際、今の会社で私のカジュアル面談をしてくれたEMは別のスタートアップに行ってしまいましたし、 面接官を担当してくれたリードエンジニアの方はチャレンジを求めて他プロダクトの担当に異動してしまいました。

転職時のプログラミング学習振り返り

当時は必死こいて手当たりしだいにやっていたのですが、 強いて言えば、「技術を学ぶ順序」をもっと意識したほうが良かったと思います。

技術を学ぶ順序は【保存版】Web系エンジニアにジョブチェンジするための学習順序と教材一覧【随時更新】がベストアンサーだと思います。

プラスして、Developer Roadmapsを見ておくのが良いでしょう。

学習を始めると知らない言葉がたくさん出てくると思うので、これらに照らし合わせ、どこの技術のことを言っているのか把握すると良いと思います。

言語についてはとりあえずRubyをやっていましたが、以下の強みはあるかと思います。

  • 転職のしやすさ
    • RubyRails)を導入している案件(企業)の多さ
      • PHPも多いが、Rubyの方が若干モダン気味
  • 挫折のしにくさ
    • Rubyの直感的な言語仕様によるストレスの無さ
    • 日本語ドキュメントの豊富さ
    • エントリーポイントとなるRails Tutorialの質の高さ

自分の中で戦略があるなら、pythonやGoでもいいかと思います。 また、Rubyで学習をしていても、pythonやGoを扱う企業に入社することは可能です。

これは未経験を雇うバイブスを持っている企業であれば、成長曲線の描き方やマインドセット、カルチャーフィットを重視して採用するためです。

ただサーバーサイド言語としてのRubyの市場価値は低下していると思うので、GoやTypeScriptがメインの技術スタックの会社に行ったほうがキャリア的には有利だったかなという思いはあります。

よくある話題と、それに関する私見

Twitterなど話題になって、当時「実際どうなん?」と気になってた点について見えてきた部分、今思う部分について、書いていこうと思います。

未経験がオファーされる年収はどのくらいか?

何十社もの企業からオファーを提示して頂いたわけではないのですが、「20代半ば・未経験」が提示してもらえる金額は、肌感として「400万もらえれば良い方」ぐらいかなと思います。

会社の資本力にもよるところがあり、私が転職した会社はそれなりの規模、かつ前職年収を結構考慮する会社だったため、 現状維持の年収で転職できました。もっと資本の少ない会社に転職していたらダウンしていたと思います。

スクールを使うのはダメなのか?

たびたびエンジニア界隈ではスクールに関する論争が起こります。

私はスクールという選択肢は全く頭になかったのですが、通うのは全然いいと思います。 実際自分の同僚にスクール卒の人がいるのですが、皆さん優秀です。

通うことによって一部の思想が強いエンジニアに毛嫌いされ、選考で問答無用に落とされる可能性があるのかな?と思いますが、言わなければいいだけですし、気にしなくていいと思います。

ただ、良質な教材が欲しければ、書籍を始め、udemy、progate、ドットインストール、youtubeを探せば良いです。 メンターが欲しければ、mentaやオンラインサロンなどを利用すれば良いです。刺激が欲しければ、Twitterでそれっぽいハッシュタグを検索して、爆速で成長している人を見つければ良いです。

価値を感じる点があるとすれば、チーム開発はなかなかできないと思うので、スクールでその経験ができる点については貴重かと思います。(ただし、Gitをつかわないとあまり意味はないかと思います。)

SIerでの経験は役に立たないのか?

SIerでの経験は「コンビニのバイト」程度に考えておくのが賢明です。という動画を見て思ったことです。(勝又さんの信者ではないです)

この動画については以下の趣旨で、SIerでの経験を「コンビニのバイト」程度に考えようね。としています。

  • SIerでの経験を活かそうとし過ぎている

JVM系言語の経験を活かして転職しようとしても、結局環境があまり変わらずコスパが悪くなる可能性が高いので、モダンな技術を学んで転職したほうが良い。

→ 不確定要素が強いので時間を無駄にする可能性が高い。

そうですねって感じです。

web系企業でJVM系言語が選ばれる場合は、OSSを使って大規模な業務システムの開発してきた経験のあるベテランエンジニアが集まって、堅牢で高品質、高可用性が求められるプロダクト(マイクロサービス)を作りたいケースなどが考えられるので、未経験レベルの人はお呼びではない場合が多いんじゃないかなーと思います。

社内で別の案件に参画して〜、は実際に自分がダメでした笑

ただ、自分はメインフレーム担当のCOBOLerでしたが、SIerで習得して現在でも役立っているスキルとしては、以下のようなものがあるので、「コンビニのバイト」よりは役立つよーという所感です。

  • 人月や工数ベースで会話できる
  • シーケンス図やE-R図などの設計成果物が読める
  • PMBOKなどをベースにプロジェクトマネジメントに関するコントロールができる

また、今の30代後半〜40代のCTOやマネジメントクラスの、 採用に対して裁量権を持っているエンジニアは大抵SIerを経由して来ています。

そういう人たちは「SIer出身だったら最低限ここはわかるだろう」みたいなバイアスを持っていることもあります。 (この意見自体がバイアスかかってるけど・・・笑)

エンジニアに転職してから最初の3ヶ月は辛い?

未経験からハイレベルな会社にエンジニアとして入社すると最初の3ヶ月は心理的負担は避けられない件について

【仕事辛い】未経験エンジニアが採用された入社3ヶ月後の仕事事情と対処法

など、エンジニアに転職してからの最初の3か月はしんどい説があるかと思います。

確かに、入社したらすぐコード書けるはずもなく、以下のような難所が待っています。

  • 環境構築
  • 担当プロダクトの業務要件、機能の理解
  • プロダクションコードの仕様理解
  • 使用ライブラリの把握
  • マイクロサービスの関連性をはじめとした、全体アーキテクチャの把握
  • GitフローやGitHubフローに則った開発
  • DB、テーブル構造の理解
  • SQLでのデータ抽出
  • SwaggerなどAPIドキュメントを読んでやり取りされるデータ、リソースの理解

自分は幸いにも未経験が多い部署でオンボーディング資料が充実していた&周りに恵まれたので辛くなかったです。

ただ、多かれ少なかれしんどい部分はあるかと思いますので、ストレスを下げるTipsを記載してみます。

ストレスを下げる方法

その1. エンジニアの仕事の流れを理解する

最初はエンジニアの仕事の仕方がわからないと思いますが、細部は違えど、以下のような流れがあるはずです。 これらを抑えておけば大やけどはしないはずです。(これは実際に自社のSlackに書いてあった内容で、すごくいいなと思ったので書きます)

  • 要件把握
    • どんな背景・課題があるか
    • 何を実現する必要があるか
  • 見積もり
    • 期限はいつか
    • どのぐらいかかりそうか
  • 修正箇所把握、修正方針決定
    • この時点で必ず先輩からレビューをもらう
    • 見積もった内容から変更があれば報告する
  • 実装
    • 大幅な手戻りがないようにWIPとして最初にPRを作ってこまめにレビューしてもらう
  • テスト
  • リリース
その2. 質問力を上げる

質問力を上げると「質問の意味がわからない」「質問が下手」などのご指導をされることなく、回答をもらいやすくなります。

esakibelaなどのドキュメンテーションツールがある場合は、そこに質問内容をまとめてから聞くといいでしょう。ラバーダッキングにもなり、話しながら自己解決するという愚行を防ぐことができます。

また、やっちゃいけない質問をしないという対策も有用です。アンチパターンとしては以下のようなものがあります。

【エンジニア向け】質問の仕方ワースト5【質問テンプレート付き】

その3. Gitを理解する

冒頭のブログにも出てくるように、Gitは大きなつらみポイントかと思います。 これは勉強も大事ですが、慣れが一番です。

Gitは毎日使うので、いつの間にかできるようになっています。

エディタの機能を使うのもオススメです。 自分はdiffはVScodeやRubyMineの機能で確認するほうがわかりやすいので、そちらで確認し、そのままadd→commit→pushまで行います。

一方、ブランチ操作やコミットログの編集などはターミナルがやりやすいので、そっちから行います。

おわりに

転職してよかったか?

良かったです。:waiwai:

もし似たようなキャリアパスで悩んでいる方がいれば、TwitterでDMくれれば相談にのりますよ。(忙しくて見れない可能性もあるけど)

もし最後まで読んでくださった方がいたら、ありがとうございました。 またたまーにブログを書いてこうと思うので、よろしくおねがいします。

よければTwitterフォローしてください。

https://twitter.com/MoneyForesto