2021年の振り返り / 元SIerのCOBOLerがWebエンジニアに転職して2年経過しました

どうもご無沙汰しております。

またまたですが、超絶久しぶりにブログを書いてみてます。

2019年12月にSIerから株式会社マネーフォワードに転職してから、早いもので2年経ちました。 実はまた転職しまして、2021年12月から株式会社エウレカでSREとしてお世話になっています。

転職してから半年たっての振り返りは以下の記事に書いたのですが

ownweight.hatenablog.com

それ以降は全然振り返れてないので、転職&年末ということで仕事もプライベートも振り返っていこうと思います。

今何やっている?

株式会社エウレカ に転職して駆け出しSREとして奮闘中です。
また、副業として Electron + NestJS のTypeScriptスタックでアプリケーションコードも書いてます。

エウレカは大学時代のサークルの同期がいて、副業は地元の幼馴染がおり、その縁で働いています。優秀なエンジニアが友達にいてありがたい限りです。

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

以前は「スキルアップ」を重視して転職したと書きましたが、今回も同じです。

前職でエンジニアとして業務をしていく中で、以前にも増してクラウドインフラの構築・運用スキルが重要だなと思うようになりました。

ここでいうクラウドインフラとは、オンプレミスのサーバーをEC2に単純に代替したような形というよりは、AuroraやFargateなど、AWSのようなクラウドベンダーが広範囲をマネージドしてくれるサービスのことを指しています。

ハードウェアやネットワークに造詣の深いエンジニアがクラウドベンダーに吸収されていっている現状を踏まえると、(事業会社に勤める上では)クラウドベンダー側のそういったエンジニアと協力して、アプリケーションの要件に応じ、適切なマネージドサービスを選択し、よりセキュアで、安く、捨てやすく、負債を産みにくいシステムアーキテクチャを設計、構築し、安定的に運用するスキルが求められていくのかなと思いました。

そこで自らがそのようなスキルを取得するためには、(ざっくりではありますが)SREというロールに転身するのが良いのではないか、というように思いました。(前述のスキルがSREの責務として完全に包含されるかというとそうではないと思いますが)

そこで友人のnariogadyエウレカでSREとして働いているということで、カジュアル面談してみて、Googleが提唱し実践している「Site Reliability Engineering」の概念を噛み砕いた上で組織に落とし込み、更に色々やっていくぞ!という前向きな環境だと感じたので、選考を受けてみることにしました。

www.wantedly.com

業務

本業

前職ではバックエンドエンジニアとしてやってきましたが、今年に入ってオンプレミスのインフラコードのIaC化や、検証環境のサーバーをAWSに移行したりなど基盤部分の改善を行ってきました。

以前よりネットワークやインフラに詳しくなり、またこの領域のスキルを増やしたいと思うようになりました。結果として現職でSREにロールチェンジするきっかけとなった思います。

現職では完全に駆け出し状態なので、案件をこなしていってスキルアップして能動的に改善を行っていけるようになりたいです。

副業

副業ではTypeScriptスタックでの開発スキルを向上することができました。Reactをガツガツ書くことができ、フロントエンド側のスキルを習得できたのはかなり良かったなと思います。強みとかがあるのは大切だと思うのですが、引き続き手広くスキルを伸ばしていくのが良いかなと思っています。

また、ここまではRailsエンジニアとしてやってきたのですが、型のないコードを扱うのが厳しい・・・と思っていたところに NestJS を使って開発して、やはり型のあるコードはランタイムエラーが少なくて良いというのと、IDEの補完がだいぶ仕事をしてくれるなぁという感じでした。

反省点

インプットは結構できたかなと思う一方で、アウトプットが全然できなかったなぁと思います。エウレカは同僚がアウトプットがとても上手なので見習いたいなと思います。

また副業をはじめて忙しくなったので体系的な知識を習得する時間が減り、経験も増えたのでとりあえず当たって砕けろ的なアプローチをしがちになっているのがちょっと微妙ですね。

資格

転職をキッカケにAWS ソリューションアーキテクトアソシエイトを取得しました。

めんどくさがりなので、ピアソンVUEで自宅受験しました。ドキドキでしたが、部屋からチンニングマシン以外のものを出してすんなりと受験できました。久しぶりの資格習得だったので嬉しかったです。

これからも定期的に資格取れると良いな・・・

プライベート

プライベートでは1LDK -> 2LDKに引っ越して家が広くなりました。在宅環境も1年半でかなり整ってきて、なかなかオフィスに行くメリットを感じづらいです。

趣味ではプロ野球、格闘技、今年からMリーグの観戦を楽しんでいますが、ギターをあまり弾かなくなってしまったので、コンテンツを消化するだけでなく何か上達するような趣味をしたいですね。

コロナ禍でなかなか人と会えなかった一年でしたが、友達とはなんだかんだ結構会えたような気がします。

健康面

今年は自分も奥さんもペットのうさぎさんも健康でした。

運動不足なのでチンニングマシンを買ってコツコツ筋トレしています。

www.amazon.co.jp

金銭面

お金についてはマネーフォワード ME見える化はしていたのですが、色々工夫したりyoutubeでちょっと勉強するようになりました。

youtube両学長つみたてシータさんを参考にしました。

資産ポートフォリオ的には大半が預金だったのですが、つみたてNISAをはじめたり、企業型確定拠出年金の掛金を最大にしたりと運用に回すようになりました。

生活防衛資金も十分溜まったので、余ったお金も預金にせずにSUSTENに回してみています。

楽天経済圏

銀行・証券・カード・携帯・ネット・でんき・ガスを楽天経済圏へ移行しました。

楽天市場でのポイントの倍率が7倍くらいになりましたが、Amazon Primeの購買体験が良すぎて楽天市場は結局あまり使いませんでした。(高額な家電やふるさと納税の時くらいですかね)楽天ポイントは貯まりやすいので、あんまりガチらなくても良い感じにはなると思います。

楽天回線は全然電波入らないので結構不満で、携帯はahamoにしようかなと思ってます。 また引っ越すと楽天ひかりとガスは解約になり、再度、東京電力東京ガスから契約し直さないといけないので、経済圏を維持するのも結構手間です。 あとZは競合なので楽天銀行からPayPayやLine Payに入金できないのがしんどいです。

個人事業主

副業をはじめたので個人事業主として開業してみました。マネーフォワードシリーズを使っていて、開業にはマネーフォワード クラウド開業届を利用しました。請求書はマネーフォワード クラウド請求書を使って作成しています。(今のところすべて無料です。)

今後は初めての確定申告や経費計上などが待ち受けていますが、これは来年の振り返りに取っておこうと思います。

来年の抱負

  • SREとして自分の氷帝コールを見つける f:id:ownweight:20211230220524j:plain
  • エウレカでSREとして戦力になる
  • Zenn、ブログ、登壇、Twitter、アドカレなど何でも良いからアウトプット増やす
  • リファラルできたらする
  • IaC力強化
  • 認定Kubernetes管理者(CKA)資格習得
  • Policy as a code やっていく
  • Go力強化
  • 副業の継続、案件リリース&安定運用、できたら単価上げる

  • 家族と自分自身の健康

それではまた。

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がわかりやすい

エンジニアが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

元SIerのCOBOLerが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の直感的な言語仕様
    • 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は大きなつらみポイントかと思います。

もし未経験でWeb系に転職して、有給消化中に何を勉強するか?となったら私はGit(GitHub)と答えるでしょう。

なぜなら、Gitはチーム開発において重要なものであり、 扱いが下手だとチームに迷惑がかかるからです。

現場に入る前にはなにか技術書的なやつは1つぐらいはやっておくべきでしょう。 以下をおすすめします。

www.udemy.com

ただ私の場合ですが、これは勉強も大事ですが、結局慣れが一番でした。

Gitは毎日使うので、いつの間にかできるようになっています。(アドバイスになってない)

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

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

おわりに

転職してよかったか?

良かったです。:waiwai:

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

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

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

https://twitter.com/_MoneyForest