# 概要
買取プラットフォーム(CtoBtoB)のサービス開発
アジャイル開発(スクラム)に最も力をいれながら、事業部や開発チームが一丸となり、「ビジネスとして当てることができる開発」や「MVPを意識した開発」に着手致しました。
基本的には、私一人で提案して何かを実行するというよりは、チーム一人一人から出てきたアプトプットを全員で議論し、改善するスタイルをとっております。そのため、私がチームにジョインした後のチームの変容や私の学びを記載します。
# メンバー
要員数: 約13名(オフショア開発者を除く)
内訳:
PO:2名(事業部と開発部)
PM:1名
SM(スクラムマスター ):1名
エンジニア:4〜7名
デザイナー:2名
※海外のオフショア開発部隊は10〜20名在籍
# 担当業務
・スクラムイベントへの議論参加、スクラムイベントの見直し、改善
・バックエンドエンジニア、フロントエンドエンジニアとして、機能開発や改修。
# 担当したサービスの概要
買取のプラットフォームサービスを展開するWebサービスを担当致しました。
- 一般のエンドユーザーが当社サービスへ不用品の買取依頼を行い、当社はその依頼をもとに、加盟頂いている加盟店様に買取案件を提供し加盟店側の査定が確定した段階で当社にマッチング対価として収益が入る構造となっております。
- 当社も自社で買取サービスを提供しているため、買取依頼に対して自らが出張買取やユーザーの店頭持ち込みに対して査定を行い、自社の販売網で販売するというビジネスモデルをとっております。
## 当社の課題
- 顧客によって良い買取体験が何か、ロールモデルがないためどのような機能の開発に着手すれば良いか試行錯誤する段階。
- 競合他社と差別化しながらいかに市場を占有するかが問われている。
- 本サービスはもともと他社で運営していたサービスとなるため大部分でレガシーな環境がある。
- 大規模なレガシー環境を修繕するほどのコストをかけられない。など
# 当社の取り組み
※ 戦略に関わる部分もあるため割愛し、開発側で注力した部分を抜粋。
## ◆アジャイル開発(スクラム)
上記の課題に対して、どのように開発を進めるべきか、検討する余地がありました。
そこで当社は、約1年半ほど前からアジャイル開発を導入し、スクラムの開発手法を取り入れ、チーム主体で開発を推し進めて参りました。
当社の開発は、スクラムを忠実に取り入れて開発を進めるスタイルが特徴的で、日頃の開発の中での気づきや課題などをスクラムイベントの中で議論し、次回のスプリントで改善に活かしています。
【スクラムの中で出てきた課題やレトロスペクティブでの議論の例】
・スクラム開発であるはずなのに、社内の事業部側で要件定義されたものがおちてきていないか?(ウォーターフォールになってきていないか)それをスクラムに戻すにはどうすればよいか?
・現在作ろうとしているものは車ではないのか?まずは自転車をつくるべきではないのか?そうするために何を変えるべきか?
・本番のバグ改修において、改修が終わった時点ですぐに、臨時リリースすべきなのか?もしもそれがインパクトが低い、もしくはユーザーストーリーができあがらないならば、わざわざコストかけて臨時でリリースする必要はないのではないか?
・チケット(バックログアイテム)は、粒度の荒いものになっていないか?サブチケット化して属人化を減らせないか?作業タスクを分解できないか?
・チケットのポイントを振る際に、不確実性の高い状態に対して、どのようにポイントを見積もるべきか?などです。
上記のように、スプリント毎に出てくるこれらの課題を、チーム全員で議論や改善を繰り返しながら開発を進めることができているため、
開発のゴールがぶれることなく、ユーザーにとって価値のある機能やサービスを開発することができ、結果的にKPIで設定した指標を達成できるチームとなりました。
### 当社のスクラムの成果
- 開発した機能がユーザーの満足度向上につながる確率が高い。
- 事業部の戦略をもとに、どのような機能開発や進め方が良いのかを開発チームが提案し、実行することができる
- いつ誰がチームやプロジェクトに入っても同じ仕事をする(同じ成果を出す)ことができる
- 開発者のほとんどが、フロントエンド とバックエンドを担当できる
- 開発メンバーは全員、同じ情報を持っている(ブラックボックスが少なく情報が共有されている)
- ビジネス環境の変化、当社組織の変化があっても、すぐに柔軟に対応できる。
## ◆開発に関して
当社は、企業やサービスの買収、購入などによって母体が大きくなりました。その弊害として、複数の言語で、一昔前に開発されたサービスが複数あるため、いろんな言語で保守改修、もしくは機能追加する必要がありました。
当プロジェクトで経験した言語やサービス
- バックエンド:Python, Django, Django Rest Framework, PHP, CakePHP
- フロントエンド :Vue.js, TypeScript, HTML(Smartyテンプレ), CSS, SCSS
- インフラ:AWS(EC2, S3, RDS, DynamoDB, Lambda, Amplify, SES, GraphQLなど)、Docker, docker-compose, RUNDECKなど
・当社の開発における考え方として、以下のようなものがありました。
- レガシーな環境にできるだけテコ入れしない
- 既存のシステムに機能追加する場合には、新しい技術を導入できないかを問う
- MVPの思想を持った実装
これらを踏まえて、以下のような開発や対応をとっておりました。
・バックエンド側はCakePHP3で作られており、フロントはSmartyのテンプレートが使われているというレガシーな状態に、新規で機能を追加したい要望が出てきた際に、既存のコードにそのまま機能を追加せずに、新たにVue.js+TypeScriptでのフロントエンドのリポジトリを生やし、RestAPIで連携するといったような形を取ったことで、レガシー技術を増やすことなく新たにモダンな技術を導入しております。
また、プラットフォーム型のビジネスモデルのため、そのディレクトリ構造においても考慮し、ユーザー、加盟店、自社の管理ページ、共通ページなどとうまくディレクトリをわけられるように対応しておりました。
・既存のシステムからRDSにのみ保存されていた情報を、DynamoDBにも同時に保存されるようにしたことでDBの疎結合ができ、処理速度の向上やサーバレス化を目的にした再設計を行いました。
・サーバレスで対応ができるようAWSのLambdaを利用しました。Lambdaを使ってユーザーがマイページの情報を変更した際に、それをトリガーにしてDynamoDB側も情報アップデートがかかる仕組みの構築や、一定の期間に加盟店から査定が入らなかった場合にその通知をユーザーに送信するなどといった形で積極的に開発に取り入れておりました。
・レガシーな環境にできるだけテコ入れをしないよう考慮しました。常に考えていたことは、既存のレガシーなデザインやコードを改修した際にどのようなリターンが見込まれるのか?という投資対効果です。その効果が低ければ、やらないか、見送りという選択をとり、効果が見込まれるなら、ユーザーに及ぼす価値の大きな部分から順位付けして開発に着手しておりました。
## 最終的な成果
- ビジネスと開発をうまくマッチングするために、アジャイルのスクラムが効果を発揮しており、ユーザーにとってもチームにとっても、良い結果をもたらしている
- 他社から引き継いだレガシーな環境に対して最低限の改修に留めつつ、試行錯誤で技術をアップデートできており、疎結合化を意識した開発を取り入れ設計の改善が行われている。