はじめに
この記事は、Photocreate Advent Calendarの1日目です。
私がフリーランスになって数ヶ月後の2017年1月から、業務委託として、フォトクリエイトさんの主にPHPによるサーバーサイドの開発をお手伝いしております。
神奈川県平塚市という都心からはだいぶ離れているところに住んでいることもあり、早い段階からリモートワーク中心でやらせていただいております。
25%社員、75%業務委託
現在(この記事が投稿される2018年12月)は、社員のエンジニアが少なく、私のように業務委託のエンジニアが多数関わっている現場です。
正確に数えたわけではないですが、感覚的には社員が25%だとすると、その3倍の75%は業務委託なのではないかと思います。
今後は、正社員の採用も積極的に行っていくとのことですので、この比率は変わっていくことでしょうし、業務委託であっても責任とセットで適切に権限を与えてくれる現場ではあります。
1年目はひたすらテストを書いていた
1年目は自動テストの基盤を構築し、Symfony2
のプロジェクトにひたすら機能テストを書いていました。
昨年のSymfonyアドベントカレンダーに下記の記事を投稿しているので、気になる方はご覧になってください。
機能テストをひたすら書くというのは、リモート中心で、かつフルコミットではない私にとってはとても都合がよかったように思います。
- 機能テストを書くのに、深い業務知識は要らない(結果、深い業務知識は得られない)
- 機能テストの
Pull-Request
を出しても、レビュアー(主に社員)からのフィードバックは少なめ -
Pull-Request
がマージされるたびに、カバレッジがあがっていくのは気持ちいい
Symfony2以前のPHPアプリケーションがレガシーでやばいんだけど、売上の大半はそこが稼いでいるという現実
前述の記事では触れていないのですが、Symfony2
で作られているアプリケーションはここ数年(2016年、2017年)に新規もしくは既存のリニューアルとして開発されたものが多く、それ以外のものはPSRが広く普及する2013年より前に作られたものが大半です。
かつ、それらのレガシーPHPアプリケーションが売上の大半を占めているようです。
そんな中、技術的負債を返そうというのろしがあがる
2017年後半だったと記憶していますが、社内の体制が変わり、CCCフォトライフラボグループ
の一員になった株式会社コトコトさんから新たに担当役員とテックリードがJOINし、より適切な技術を積極的に活用し、技術的負債を返済する(作り直すべき部分は作り直す)方針が掲げられました。
これに関しては、別の方が書いてくれるので、詳細は乞うご期待なのですが、納品などのバックエンドシステムは、それまでのオンプレサーバー + レガシーPHP
から、AWS + Golang
へ刷新されていってます。
SoE
とSoR
の話
担当役員の所信表明的な話の中で印象に残っているのは、SOE (System of Engagement)
とSOR (System of Records)
の話です。
端的にいうとシステムには、見た目や操作性などを通じてユーザーとつながる側面と、情報を正確に「記録」する側面と、2つ側面があって、どちらがいい(新しい)とか悪い(古い)ということではなくて、どちらも大事だし、それぞれ適材適所な技術選定があるべきという話でした。
SoE
とSoR
そのものの話は、某CTOの下記のスライドがよくできているので、参照ください。
前述のバックエンドシステムはまさに、SOR (System of Records)
の領域であり、静的型付けでシンプルで強力な並行処理を持つGolang
が適切であり、高い可用性と拡張性のためにインフラは順次AWS
に移行していきました。
現状、ほとんどのサービスはAWS上で動いています。
PHP7
は柔軟さを残しつつも十分に早くなったし、より型に厳密になった
一方、SOE (System of Engagement)
の領域として、長らく使われてきたPHP
が選択されました。
既存メンバーのスキルセットからしても当然だとは思いますが、PHP7
は十分に早くなったし、より型に厳密になったので、現実的な選択だったのではないかと思います。
iOS
アプリのバックエンド(APIおよび管理画面)をLaravel + Vue.js
で開発
2018年2月末だったと記憶していますが、新規iOS
アプリのバックエンド(APIおよび管理画面)開発を任されました。
それまで使われていたSymfony
ではなく、APIにはLumen
、管理画面にはLaravel + Vue.js
を採用しました。
元々、遅延していたプロジェクトのリカバリーということもあり、限られた期間の中での開発は大変でしたが、この開発を通じてテックリードと直接、技術的な話をたくさんしましたし、ディレクターさんからも一定の評価を得られた気がしてます。
PHPのサーバーサイド開発をリードする人がいなかった
2018年になり、新体制が本格的にスタートしたものの、テックリードは、前述のバックエンドシステムの刷新で忙しく、PHPのサーバーサイドについては今までどおりの開発体制が続いていました。
経験のあるPHPエンジニアが多数いる環境なので、大変心強いのですが、PHPのサーバーサイド開発は様々な問題を抱えています。
- レガシーPHPで作られた既存コードがとにかくツラい
- デプロイなどリリースフローが属人的
- レビューで何をどこまで指摘すべきか、人によって粒度や質にバラツキがある
-
Symfony2
側には自動テストがあるものの、Bundle
が必要以上に分かれすぎててツラい - 誰かが作った良さそうな仕組みに問題が見つかり、廃れていき、メンテされなくなる
特にどういった実装がいい設計、もしくはいい実装なのか、という判断をくだせる人が社員・業務委託関係なくいなかったように感じていました。
リモートで業務委託という立場ですが、色々な方々とお話をしているうちに、この判断を任されてみようと思うようになりました。
前述のiOS
アプリのバックエンド開発が終わったタイミングで、「名前は何でもいいので、肩書きください」とテックリードにお願いし、正式なものになりました。
2018年7月にチーフエンジニアとなる
チーフエンジニア
とは、「サービスの発展、技術的な問題解決及び技術力の底上げに貢献するポジション」と定義されていて、契約書上にも明記されています。
PHPによるサーバーサイド開発をリードしていくことをミッションとしています。
新たなユーザーとの絆(Engagement
)のために
チーフエンジニア就任のタイミングで、レガシーPHPはリニューアル(式年遷宮)して、Symfony系はフレームワークのバージョンアップ対応など延命していくことを提案しました。
様々な検討や議論を積み重ね、現在進行形で、このリニューアルプロジェクトは動いています。
技術的には、フロントエンドにNuxt.js
(Vue.js
)、サーバーサイドにLaravel
を採用し、モバイルアプリと同じようなストレスのないユーザー体験を実現していきます。
おわりに
余談ですが、この記事が投稿された翌日の12月2日に、第13回湘南国際マラソンにて人生初のフルマラソンを走ります。
フォトクリエイトさんもスポンサーとして、スタートからフィニッシュまでオールスポーツのプロスポーツカメラマン総勢30名が皆さまの勇姿を撮影
してくれるので、恥ずかしくない形で写れるように頑張って完走しようと思います。
フォトクリエイトさんのサービスは、マラソンに代表されるスポーツにとどまらず、結婚式や学校行事など、ユーザーの思い出を写真というカタチにするサービスです。
多くの人にとってそうであるように、私にとっても身近なサービスが多いので、チーフエンジニアになったことを契機に今まで以上に積極的に関わっていきたいと思います。
少しでもフォトクリエイトさんに興味をお持ちいただけたようでしたら、ご応募をお待ちしておりますとのことですので、よろしくお願いします。
明日の記事は @yoshiokahideki さんによる IoT機器とIFTTTとSlackで仕事環境の改善してみた (Photocreate Advent Calendar 2日目 ) です。
ではでは。