退職しました

8月末付で1年ちょっと務めた会社を退職しました。 自分がやってきたことを整理するためにも、退職エントリを書いてみようと思います。

IT未経験からの採用

社会人1社目でした。ですが新卒入社ではありません。 いわゆる真面目系クズで、だらだらと大学生活を6年続けて2017年3月に退学しました。

手に職をつけるためにどうしようか、と考えたときに、元々理系学部(非CS)に通っていてITには抵抗がなかったたこともあり、学歴よりも実力が評価されると言われていたプログラマーになろうと決意します。

今思えばオンラインのプログラミング学習サービスに取り組む、などいくらでも方法はあったのだろうと思いますが、無職期間を過ごすという選択肢がそもそも思い浮かばなかったのと、学位取得を目指して編入という道も視野に入れていたため、未経験でアルバイト採用してくれるIT企業を探すことにしました。

流石にそんな企業ないとは思っていたので、プログラミングスクールに通うことも視野に入れていましたが運良く内定いただけたのでそのまま就職(アルバイト採用)しました。

どんな会社だったか

主に物流システムなどの受託開発を行なう、十数人ほどの小規模な会社でした。 そんな中で、自社サービスとして新規開発中の在庫管理システムがあり、その iOS アプリ開発を担当することになります。

当時のプロジェクトは、

  • iOS アプリ開発、運用の経験者はいない
  • プロトタイプの開発者(以下同僚氏)とプロダクトの責任者が1人ずつ
  • 使用ライブラリは FMDB (SQLite を扱うライブラリ) のみ
  • CocoaPods などのパッケージ管理システム無し
  • Git などのバージョン管理システム無し
  • 設計書や仕様書もざっくりとしたものだけ

といった状況で、MVC すら知らない私はとりあえず UIKit の使い方を覚えてオレオレ設計の独自実装を進めました。今思い返すとガチガチのスパゲッティコードに、副作用のオンパレード、DRY ガン無視だった気がします。恐ろしい…

1人開発者に…

2人で開発を進めて数ヶ月が過ぎ、同僚氏が客先に常駐することになりプロジェクトを離れました。その影響でシステムの管理画面とサーバ部分の開発も担当することになったのですが、当時 HTTP やサーバの基礎知識すらなかった私にとってはかなりの苦行でした。
引き継ぎ時点での技術スタックはこんな感じです。

フロントエンド

バックエンド

同僚氏はそもそもプログラミング初心者(でも私よりは経験があった)で、まともなメンターもいなかったようなので仕方がないとは思いますが、 フロントは jQuery 無しで Ajax 直書き、サーバサイドも WAF 使わずに何重にも重なったネスト処理で実装されていました。 当時の私でも流石に危機感を覚えて、

  • Express.js
  • Pug(Jade)
  • jQuery/Bootstrap

を導入して再実装しました。

セキュリティ面では SQL インジェクションはもちろん、HTTPS 非対応、パスワードも平文で保存といった状況でしたが、なんとか対応しました。結局半年以上かかりましたが、自信はありません。
今思えば、経験の浅い内はフルスタックの WAF の恩恵に授かるべきだったなと切実に思います。

開発メンバー追加

10月頃から採用が始まり、新メンバーが入ってきました。
個人的にはまともな知識と経験のあるエンジニア採用してくれよという気持ちしかありませんでしたが、体力のない会社なので叶わない願いでした。
チーム開発に向けて危機感を覚えたので

  • Git/SourceTree/GitLab
  • ESLint

を導入します。 定期的にメンバーが増えたり減ったりしていったので、Markdown を覚えてドキュメントも少しだけ整備しました。 一応最終的には GitLab の MergeRequest ベースで開発を行うようにできたかな(根付いたかは別)と思います。

余談ですが、Web 開発経験がある即戦力のエンジニアと一緒に仕事ができたのは、結局辞める2か月前くらい。話が通じる人がいるだけでこんなに違うんですね。

Docker との出会い

初心者あるあるですが、開発環境構築に見事に躓きました。
VMWareVirtualBox のような仮想環境の知識もなく、流行りに乗っかりたい気持ちが強かったので、Docker を導入することに。 Docker for Desktop と Express4 が出て日が浅かったので、古めの情報ばかりでかなり苦労しました。

その時の知見を自分なりにまとめて Qiita に投稿してみたりもしました。

qiita.com

qiita.com

Kubernetes そして GKE へ

コンテナで開発したはいいものの、サーバへのデプロイ方法が全くわかりませんでした。 ちょうどこの頃 Docker 関連の Meetup に行ってみた影響もあり、Kubernetes めちゃくちゃかっこいいじゃん、どうせなら本番環境でもコンテナ使いたいよね、みたいな流れで GKE でのデプロイに挑戦することにしました。無知って怖いですね…。

一応プロジェクトの要件的に toB の顧客ごとにサーバを立てたいというのがあり、当時はマルチテナントの考え方すら知らなかったので、k8s で顧客ごとに Deployment を作るのがマッチしていると主張して周りを押し切りました。本番用のコンテナイメージを作ったり、yaml に四苦八苦したりしましたが、k8s の勉強会やイベントに足を運んでとにかくインプットを重ね、デモ環境になんとかデプロイできました。 CI/CD までは手が回らなかったですが、

  • SourceTree に Tag をつけて Push
  • Cloud Build (当時は Container Builder) で Tag を検知して Image を自動で build、 Container Registry に自動で Push
  • 手動で GKE に kubectl apply -f hoge.yaml

といった具合にデプロイする環境を作りました。

アーキテクチャ(主にモバイルアプリ)

コンテナ関連技術とは別に、モバイルアプリのアーキテクチャにも興味を持ち始めました。 この頃には、学習コストや導入コストを考えずに流行り物に乗っかってしまう癖が完全に着いてしまっていたので

  • MVVM with RxSwift

を新たに採用しました。 一応 Flux やクリーンアーキテクチャはオーバーデザインだろうと判断しての MVVM なので、ある程度妥当性はあった……と思いたいです。

いろんなスライドや記事を参考にしましたが、公式のサンプルコードが非常に参考になりました。RxSwift 自体 Pure Swift で書かれていますし、ライブラリに手こずったらソース読もうね、というマインドはここで身につけられた気がします。

転職

技術選定や新技術の導入など、色々と自由にさせてもらっていましたが、徐々に不満を感じるようになりました。

まずは、インフラ・セキュリティ・運用面でのコストやその重要性が経営層に認識されていないことです。
会社にインフラエンジニアのような人はおらず、 Web の経験者も少ないので、普通はパブリッククラウドのマネージドサービスを最大限に利用する方針になると思います。 しかし経営層は「適当に VPS サーバ借りて構築すればいいじゃないの?」というスタンスで、GCP の利用料を月1万に抑えても釘を刺されたりして、コストの必要性を理解してもらえませんでした。 監視運用にどれだけの学習コストと人的コストかかるかわかってんのかよクソが。。。

次に、社内の環境に限界を感じたことです。
CTO やメンター的なエンジニアが不在で、システムをどう構築するか(アーキテクト的な領域?)を考える負担が自分に集中していました。 最低限の情報収集能力は身につけていたつもりなので試行錯誤しながら構築していましたが、 ベストプラクティスやネット記事には載らないような常識については、経験者がいる方が絶対に学習効率はいいはずです。 ハイレベルな環境に身を置いてもっと強いエンジニアに影響を受けながら成長したい、という思いが強くなりました。

(あとは年収の低さも大きな要因でした。昇給の時期に会社の現状と将来性を察してしまいました。)

そんな感じで、ふと参加した勉強会のスポンサーになっていた Forkwell さんのスカウトサービスに登録してみたらトントン拍子に話が進み、 今の会社にお世話になることになりました。

jobs.forkwell.com

これからは

Swift と Firebase で iOS アプリの開発をやっていく予定です。
サーバサイドとインフラも捨てがたいのですが、Firebase を身につけて置いて損は絶対にないなと思ったので頑張ります。
あとは純粋にプログラミング力高めたいです。アウトプットも少しずつ増やしていきます(予定)。

文章力が皆無なので冗長になってしまいました。備忘録的なものだからと自分に言い聞かせて、とりあえずここまで書ききった自分を褒めたいと思います。