ペペロン頭脳

ソフトウェアエンジニアのメモ的なアレ。

14年間勤めたSIerを退職してスタートアップに行く(転職活動編)

14年間勤めたSIerを退職してスタートアップに行く(退職決断編) - ペペロン頭脳
上記のように決断をして、転職活動を開始したのだった。
これが2023年の7月下旬。

どういう方向の転職にするのか

自分はソフトウェアエンジニアである、という意識はどうにも変えられないし変える必要はなかろうと思った。
ただ、口でそうは言っていてもここ数年はいわゆるリーダーであり営業であり…といった役割で、一線でコードを書いていたわけではない。総合デジタルビジネス御用聞きとでも言ったほうがいいかもしれない。
しかしどうせなら思いっきりdevに振り切って転職活動してみようと考えた。20代の頃からくすぶって、色々理由を付けて選択しなかった道を今から目指してもいいじゃないかと考えた。
うちにも採り入れられるものを拾おうとして読んでいた技術ブログとか、登壇スライドとか、そういうものを遠く仰ぎ見るだけじゃなくてその世界に行こうと。コードが価値に直結する世界に行く!と決めた。

しかしなにぶん転職活動は初めてで、自分の市場価値というのがまるでわからない。足りないところはいくつも並べられるが、前述のように日々の仕事と生活で手一杯。武装してから転職というのも現実感がなかった。40手前のこの年齢・この実績で不安はあるが、案外採ってくれるところあったらいいな… という感じでスタートした。

ogijun.hatenablog.com
なお上記は転職決めた直後に見かけ、大いに勇気づけられたエントリ。まさに「ソフトウェアエンジニアになりたいんだ!」という気持ちで転職活動に臨んでいた。

Findyに登録した

ちょうど始めようという時期に、年齢的にもドンピシャなこの方の記事が上がってきて大いに参考にした。とりあえずFindyというのが良いらしいと。
→ Findyさん、エンジニア視点の要望をよく汲んで求人紹介してくれるし伴走も頼もしく、他を併用する必要ありませんでした。
ksss9.hatenablog.com

まずプロフィールを埋めていくわけだが…
このブログも一番書いてたのは10年くらい前、それも大した内容と頻度ではない。GitHubも草を多少なりとも生やしていたのは2017頃まで…。QiitaもZennも書いたことない。
が、恥は捨てて持ってるものは全部連携させて、職務経歴も主要なプロジェクトについて書いた。
職務経歴についてはほぼテンプレ通りに案件内容と使用技術と自身の役割ついて触れつつ、自身がその中で「何をして」「プロジェクトや自分がどうなったのか」を必ず書くようにしていたし面談でもしっかり説明できるようにしていた。

ここ最近のプロジェクトの役割はだいたい「フルスタックエンジニア」「テックリード」になった。他に該当するのがなくて…
嘘ではないのだが… SIerでも数百万〜3,000万円規模のプロジェクトばかりやっているとせいぜいメンバーが3〜10人とかで、必然的にレイヤーは上から下まで見ることになる。よってフルスタック。
そこでリーダーやっていると技術選定とかベースのアーキテクチャ描いたりする。よってテックリード
前職は人材がジョブで分かれる組織になっておらず「営業/PM/PL/メンバ」という分かれ方。「メンバ」は良くも悪くも何でもやる方針。
この辺が一般的なWeb系の組織の形と異なるため、誤解が無いように面接でも色々と説明が必要になった。

あと印象的だったのが、資格欄がないこと。
僕のいたSIerでは資格取得は重視されており、入社前から基本情報の勉強、若手のうちに応用情報まで取れ、そのあとIPAの高度試験にチャレンジしろという流れだった。いずれも合格すれば受験費用と報奨金が出る。あと中堅以上向けの社内認定を受けるのにも、実務経験に加えて資格要件がある。僕はこれのためにAWS DOPを受けた。
こういった保持資格については記載するところがそもそもなく、面接で聞かれることもなかった。文化圏が違うなと感じた。

そういうあれこれを経つつ、入力できるものは全部入力してエージェントと面談し、企業の反応を待った。

「いいね」をそこそこもらえた

なんだかんだ反応はそこそこもらえた。世の中にはこんなにたくさんTech企業があり、こんなに多くの求人があるのかと世間知らずを自覚した。

いいねが付いて、こちらからも話聞いてみたいなと思うところに返して、まずはカジュアル面談しましょうとなる企業が10弱あった。
最初のうちはどんな企業があるのか、エンジニア組織のカルチャーがどんなものかも知らない状態なので手当たり次第面談を申し込んだ。
「子供の用事で1時間抜けます」とか休憩扱いにしてGoogle Meetしていた。訪問無しで話ができるいい時代になった。

色々と聞いているうちに、自身の経歴についてはわりと好意的に捉えてもらえることがわかった。純粋なエンジニアとしてはブランクが数年あるものの、そこまでに身に着けた土台やリーダー・営業等のプラスアルファは評価されていると感じた。

あと事業領域についても幅広く見ていたが、どうも自分はWebマーケティングとかファイナンスとかにはピンと来ないことに気づいた。
ドメイン知識を全く持っていないというのに加え、物理的な形がないものに惹かれない質ということに今更ながら気付くなど。
一方で、現実のハードと繋がっているサービスや一次産業・二次産業DXには興味を持った。選考まで進んだ企業はいずれもここに含まれる。

ちなみに大手企業やメガベンチャー系がいいねをくれることも少なくなかったが、勝手にビビって敬遠していた。
なにぶん、言葉としては知っているが実践経験なしの領域が多く、ハイレベルエンジニアを求めている組織では即戦力にはなれない自覚があったため。
「あー、スクラムですね!えっと、本は読んだことあります…。なんちゃってなら少しやったことあります…」
「DDDのドメインオブジェクトの役割ですか!あー、えー……」
年齢的にこの辺りの経験が豊富で自分の言葉で語れて登壇経験もありますよくらいじゃないと戦えないんじゃないかと。
Findyの職務経歴だけみるとそのレベルの人材に見えちゃうかもしれないけど、そこまで到達できてなくて… あとコーディング面接とかも勘弁してください…
(受けてたら案外イケたのかもしれないがもはや知る由もない)

こういう志向だったため、コンタクトを取ったのは自然とスタートアップに絞られた。
選考まで進んだ企業に対しては現在のレベル感については正直に伝えた上で、先方の求めるレベルや重視することについても話してもらい、感触を確かめながら進んでいった。
「今から学習だときついっすよ」と暗に言われるケースもありはしたが、ほとんどの企業ではdev頻出用語で会話ができて、アプリでエラーが出たときの問題切り分けのプロセスなんかが説明できれば問題ない、自学できるならばOKという感触だった。それよりも長く働いてもらうためのカルチャーマッチを重視しているところが多い印象だった。

そして内定、受諾

8月から活動を本格開始して3ヶ月半、
数十社の「いいね」を精査し、前述の通り10社ほどとカジュアル面談を行い、そのうち3社の選考に進み、1社はすぐにお祈りとなり、もう2社は内定をいただくことができた。

上司に退職を切り出すのも辛かったが、この2社から1社を選ぶのも同等に辛かった。提示された待遇はこちらの意向を汲んでもらいほぼ同等、人・チームでは優劣付けられず、事業内容はまったく異なるがどちらも面白く社会的意義がある。
最終的に、出勤時の経路とリモート率で判断することとなり、僅差で次点となった1社に辞退の連絡をした。こちらをとても評価してくれて、ぜひ来てほしいと言ってくれて、しかも自身の趣味の部活まである環境だったため苦渋の決断だった。

どちらも飲みながらの面談や、内定前から全社ミーティング&懇親会などに呼んでくださるなど、スタートアップってこういう感じだよな、楽しいな、という体験をさせてもらった。
各社、採用をとても大切にしていることがよく伝わってきた3ヶ月半だった。

これから

先日の最終出社を経て、有給消化中。
40日フルフルで溜まっていた分の半分も消化できなかったが…強気になりきれず、できるだけ後任に押し付ける仕事を減らしたいのと早めに次へ入りたいのとであまり休めなかった。
気になっていた技術書をいくつか買ったが、順調に積読中…

2/1から新しい仕事が始まる。
技術スタックとしては、Node.js, TypeScript, Nuxt.js, Firebase(Cloud Functions, Firestore), など。
いままでAWSでやってきた人間なので、GCPは早く乗りこなせるようになりたい。あと素のVueしか触ってなかったのでNuxtもお勉強だな…

兎にも角にも、色んなことが半端だった「SE」から、憧れていた「ソフトウェアエンジニア」にようやくなるのだ。
やっていく。

14年間勤めたSIerを退職してスタートアップに行く(退職決断編)

あるいは、NTT(系)退職エントリ。

これを書く意味

退職決めてから、動機とか志向とか幾度となく人に伝えてきたわけですが
相手の属性や立場に応じて話すこと/隠すことを組み換えているうちに段々本心が上書きされていっているような気がした。
ピュアな本音を失うことが無いようにいま書いておきたい。

TL;DR

  • 40手前の自称ソフトウェアエンジニア、SIer歴14年。
  • 人と事業は好きだったが、高い業務負荷や管理職に上がれという圧や社内イントラのクソさに耐えかねて外に出ることを決断した。

転職決意時の状況

部署とポジション

ここ5年ほど、新規事業立ち上げ系の部署にいた。ポジションとしては開発・営業の両方をできる人でやっていた。
コード書けるし、新規にアーキテクチャ設計したりしつつ、リーダーとして委託先も巻き込みプロジェクトを進めて、一方で顧客折衝もできるしビジネス系の会議のファシリもやるし契約ごとも担当できる的なポジション。
ただ、それ以前からあくまで自分の軸はソフトウェアエンジニアで、営業だのはプラスアルファの価値という志向だった。

事業の領域は楽しかったし好きではあった。人月商売から脱して、プロダクト売りでやっていこうというのも良かった。チームの人間関係もよく、顧客/事業パートナーとの関係も良かった。

段々、年次的に「カチョー」になれという圧が強まってきた。カチョーを目指す前提の年次目標が設定されるようになってきた。カチョーにも色々スタイルがあるが、当然ながら中間管理職としての働きが必要で、数字をあれこれしたり人をあれこれしたりが必要である。
さらに、所属部署は「新しい事業を作る」のがミッションなので、当然これを対内/対外で推進することが求められる。チームを動かして、直上の部長を援け、外ではパートナー企業を説得し、中では社長への稟議が通るよう図る…というような。
コードを書くだの手を動かすのはどんどん下に任せて、下を育てていくことが求められるポジションである。腕があっても技術「だけ」をやっていると白い目で見られる空気である。

なおこういう企業の方が多数だと思うが、いわゆるICのまま上のグレードに上がっていくというキャリアパスはない。カチョーに上がれたか、上がれなかったか、それが優秀さを測る尺度である。

業務負荷

上記のような状況で、プロジェクトに3つ4つ並行で入っているので、昼間は朝から夕方まで内部定例・顧客定例・委託先定例…と会議で埋まる日もあった。週の半分以上は打ち合わせをしている。
共働きで子が2人いる。未就学と小学生である。
すると18時〜22時までは迎え・飯・宿題の監督・風呂・寝かせで潰れるので、そこからエンジンを掛け直して1時2時まで自分の作業をするような状況が続いていた。
記録としては19-22時で働いたことにして

夕食時なんかも22時からの仕事が頭を離れずに心理的な余裕がなく、せっかくの団欒でも優しくなれない。子供が言うことを聞かないときの沸点が下がってしまっていた。

開発環境・社内イントラ周り

開発機はプロジェクトの金で買えるので、スペックはある程度選べる。が、減価償却が面倒なので高額なものは忌避された。(プロジェクトはたいてい1年で区切りなので、未来のプロジェクトに負債を乗っけることになる)
MBPが20万円未満で買えない時代になってしまったし。

技術スタックとしてはAWSPostgreSQL(Aurora)かDynamoDB、PythonかTypeScript、フロントはVue あたりがメインで古くはなかった。

ただそういったものを駆使していくにあたり、社内ネットワークから外に出るのにF**kin認証プロキシを通すので
やれあのCLI環境変数から読んでくれるが、プラグインの方が完全未対応だからクローンしてソースにパッチ当てなきゃとか、それ系のトラブルシュートがしばしば必要だった。
ちなみにこのFxxkinプロキシはSlackへのアクセスをブロックする。ChatGPTも最初期はアクセスできていたが、やがて塞がれた。数年前、突然GitHubがブロックされたときは「正気か!?アクセスできないとOSS利用も何もできないんですけど!?」と申請を出して解除させた。

在宅勤務の体制はコロナ初期からしっかりしていたが、いわゆるVDI限定ということで
事務スペックの仮想マシンに帯域の細い閉域網からRDPして、そこからさらに開発機にRDPして、みたいなエクスペリエンスが提供されていた。
なお勤怠管理や経費申請等々はこの事務スペック環境からしかできない。その手のイントラは最近になって脱IE(ActiveX依存だった)されたが、Edge対応後の認証用常駐ツールが不安定でログインできない日が続いたりとか素晴らしいエクスペリエンスだった。
なおUIについても推して知るべしで。腹が立つからもう書かない。

そして決意

もともと、上の開発環境・社内イントラへの不満は通奏低音のようにあって、それこそ10年以上前からあって、
でも「顧客の課題を解決する、開発とかはそのための手段でしかなくて、顧客のものを預かっている以上セキュリティは大事で、利便性が犠牲になるのはある程度仕方なくて、だって事業内容でこの会社に入ったんでしょう?」みたいな「はい…」としか言えない空気感と、今残ってる人はある程度諦めたり麻痺したり、そもそも不便と思ってなかったりする人たちであり、そこに混じっていると自分も麻痺してきて…
とはならず、なんかついに(やっと?)「もううんざりだ」って気持ちになった。
Edge対応後のグダグダが決定的だった。

そこに業務負荷きついのが続いてる状況と、
さらに管理職になったときの心理的な負荷とか、上司はみんな尊敬してるけど自分には務まる気がしないという不安や、一種の精神安定剤としてコード書く仕事確保してたのも今後は無理だろうなぁとか、エクセルとパワポと、biz話のタテツケ考えてあちこち説得するのがメインになるのかぁとか、
そういった諸々が、ちょうどかつての優秀な同期が「俺2回目の転職したよ」と一緒にランチに行ったのをきっかけに堰を切ったように濁流となって押し寄せてきた。

もともと転職を一度もしないのはリスクだとも思っていたし、今しかねえだろうと。特にプレイヤー転職ならば年齢的に限界だ。
なお余談だが前職はIT産業が「電算」と呼ばれていた頃からあり、新卒で入って定年まで勤め上げる人も少なくない。同期は30人ほどいたが、現在も20人以上残っている。つまり定着率はそこそこ高く、そういった面では「いい会社」であると言える。

そういった流れで、同期とランチして間もなくFindyに登録した。

心残り

ある。

冒頭に書いた通り、事業は好きだった。
出張もあって、現場作業もあって、デジタルだけで閉じずに現実世界を相手にしているのも面白かった。
(これは転職先を選ぶ際にも大きく影響した)
AIを中心に据えて、徐々に稼げるようになってきて、これからというタイミングでもあった。

チームも好きだった。
実はこの部署の前、まったく希望していない営業配属になってメンタルぶっ壊れていたところに手を差し伸べてくれたのが今の部長だった。その人がいなければその時点で辞めていたかもしれないし、そうすべきだったと思う。
その後、その部長の目利きで人が徐々に増えてきて、能力的にも人柄的にもいい人が集まった。
部長の根回しがあり、新卒で入ってくる後輩も優秀だった。

そういった面はとても良い環境だったゆえに、最後の最後まで現職残留の選択肢は残っている状態だった。

また、中堅で同ポジションの同僚がもう一人いて、彼も同じく子持ちで同じような働き方をしていて…
組織として、自分の責任とは思わないが、結果的に自分が去ることで彼の負荷が更に上がってしまうのは心苦しく思う。当然、短期的にそうなっても長期的には解決するよう管理層が対処すると信じているが。

そういったあれこれがあったが、俺は俺の生活と心の安定と、何より家庭運営を最優先にしたかった。それだけはもう譲るわけにいかない、と決心して今の環境を脱することに決めた。

じゃあ辞めて何やろうとしたのか、どこへ行くのか

これは転職活動編として、別エントリに書いた。
peperon-brain.hatenablog.com

Lambda+API Gatewayで画像を返す時に気をつけるべきx+1個のこと

qiita.com

この記事のおかげでやりたいことができた…のだが、
CloudFront以外全部押さえたのにレスポンスがバイナリで返ってこない!と4時間ぐらいハマったのであと1つの重要ポイントを書いておく。

CloudFrontかませないで、APIGWに直接アクセスしに行くケースの話です。

クライアントのAcceptヘッダはワイルドカード指定不可、明示必要

  • APIGWのバイナリメディアタイプ: image/jpeg
  • 呼び出しクライアントからのAcceptヘッダ: image/* あるいは */*

と指定すれば通ると思い込んでたんですよ。
でも返ってくるのはBASE64のテキスト。
マジで分からなくて組み合わせを試していった結果、クライアントからのワイルドカード指定はNGなんだとわかりました。タイプ明示する必要がある。

実験結果

実験はPostmanで実施しました。

APIからのレスポンスに含めているContent-Type APIGWバイナリメディアタイプ指定 クライアントAcceptヘッダ 結果
image/jpeg image/* */* NG
image/jpeg image/jpeg */* NG
image/jpeg image/* image/jpeg OK
image/jpeg image/* image/png, image/jpeg OK
image/jpeg image/* image/jpeg, image/* OK
image/jpeg image/* image/png, image/* OK(!?)
image/jpeg image/* image/*, image/jpeg NG
image/jpeg image/* image/* NG (!!)
image/jpeg image/* (none) NG
image/jpeg image/* image/png OK (!?)
image/jpeg image/jpeg image/png OK (!?)
image/jpeg image/jpeg image/* NG
image/jpeg image/png image/* NG
image/jpeg image/png image/png OK (!?)
image/jpeg image/png image/jpeg OK (!?)
image/jpeg image/png image/png, image/jpeg OK (!?)
image/jpeg image/png (none) NG


この結果から言えることは、

  • APIGW側バイナリメディアタイプはタイプ明示でもワイルドカードでもよいが、クライアントAcceptヘッダのワイルドカード指定はNG。受け付けてくれない
    • Acceptヘッダにワイルドカードよりも高い優先順位にタイプ明示があれば、それは正常に扱われる
  • jpegpng、指定が食い違うケースでもなぜかバイナリ変換されて返ってくる謎。
    • 少なくともAPIレスポンスに指定したContent-Typeは見ていないように思える
    • が、APIGWがjpegでクライアントAcceptがpngでも通るってどういう挙動なの…?

ちとよくわからない挙動もありつつ、
Acceptヘッダは*/*とかにせず、image/jpegとか明示が必要ということは確かな模様。