Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

PHPerKaigi2023|技術負債とプロジェクトと私たち(technical debt&p...

PHPerKaigi2023|技術負債とプロジェクトと私たち(technical debt&project&us)

PHPerKaigi 2023におけるセッション「技術負債とプロジェクトと私たち」の資料です。

登壇:
takedajs / ヒエイ / おのぽん

概要:
サービス運用者の皆さん、技術負債解消に向き合えてますか?
機能拡張に対して技術負債がネックになり開発効率が落ちることに、何度も頭を悩ませた事があるのではないでしょうか。

ローンチして8年のフォトウエディング・前撮りの日本最大級のクチコミサイト「Photorait」では、サービスを更に拡大するべく新機能の開発を行いながら、長い年月の中で生まれたレガシーなシステムや非効率な運用フローなど、技術負債への課題解消も並行して行っています。

本セッションでは、新たな機能開発を止めずに並行して行っている負債解消への取り組みと、事業メンバーへの理解促進、そして今後の開発サイクル加速のために実施していることを発表します。

対象者
・サービス運用エンジニア全般
・技術負債改善の進め方を知りたい方
・事業メンバーの理解や賛同を得る方法を知りたい方

More Decks by 株式会社ウエディングパーク

Other Decks in Programming

Transcript

  1. 武田 翔平 (@takedajs) # エンジニアリングマネージャー # 新卒入社9年目 # 猫2匹飼育😺 ヒエイカザト

    (@zosokh) # チーフエンジニア # 中途入社4年目 # ⚾ちなヤク🐧 おのぽん(@onopon_engineer) # エンジニア # 中途入社1年目 # 卓球ガチ勢🏓
  2. ローンチ
 - 2015年1月 
 
 開発メンバー
 - ディレクター, エンジニア, デザイナー(十数名)

    
 
 利用技術
 - PHP (CodeIgniter, Laravel)
 - React, jQuery
 - Golang
 Photoraitについて

  3. • テストコードを書く習慣がない
 ◦ 書く方法がわからない
 ◦ PHPUnitを実行できる環境がない 
 ◦ 書いて何が良くなるのかわからない 


    
 • いくつかは設置してあるテストコード 
 
 • 書く人と書かない人がいる
 なんとなく書かれている意図のないテストコード 
 当時のチームとテストコード

  4. 誰でも実行しやすいPHPUnit環境をつくる 
 Dockerでテスト環境を用意 
 
 • テスト用ローカルDBを立ち上げ 
 
 •

    1コマンドでDockerコンテナ上での PHPUnitを実行
 
 • 他アプリケーションに依存しないテ ストコード設計
 
 テストコード環境づくり

  5. ルールとフロー作成
 途中でぶち当たった壁
 • 既存プロジェクト(テストコード無し)にテストを書くのは大変 
 
 • カバレッジ目標は達成できても、カバレッジ目標のためのテストコードになる 
 ◦

    テストコード量産が目的になる/テストの質が下がる 
 ◦ カバレッジ値に追われてしまう
 
 • 「書き方が分からない」を解決していないので、テストコードを書く人が偏る 

  6. 事業の定例で、イラストを用いてテストコード施策を紹介 
 
 
 
 
 
 
 
 事業メンバーへの活動共有


    ディレクターや営業など、エンジニア以外のチームメンバーへ「わかりやすく」 

  7. 社内LTや外部登壇での活動共有
 • PHPerKaigi2022での登壇
 • 社内勉強会でのテストコード施策について深堀り 
 • 他、勉強会などでの発表
 メリット:
 •

    共感の声が聞ける
 • 他社でも同じ悩みを持った人が多くいる事を知る 
 • 「こんな活動しています」の声も聞く事ができた 

  8. なぜテストコードの量と質は向上しなかったのか
 ◯テストコードを意識したコーディングになっていなかった 
 ・密結合となってしまっている箇所が多い 
 ・Fat Controllerとなってしまっている 
 → 1テストケースを書くための関連データが多い

    
 どうしても負の気持ちが先行してしまい
 必要最低限のケース追加に抑えようとしてしまう 
 テストコードに対して負の感情がなくなる何かが必要 
 リファクタリングしようにもテストを書かないといけない 
 がしかし、書きたくない・・・(手を加えたくない) 

  9. Seederにおける課題
 ◯ マスターデータ(固定データ)を作るのに向いているが、 カラムの一部変更などができない 
 例)◯:Role(1: 管理者, 2: 閲覧者, 3:

    編集者 etc)← Roleのidは固定データであってほしい
 △:User(1: WP太郎, 2: WP二郎)
 
 
   可変データをSeederで作るとテストの質を上げづらい 
 ← 必ずしも1がWP太郎、2がWP二郎である必要はなく、  そうなるとも限らない idが100以外の時(idが可変時) 
 も通るべき
 名前やメアドも固定でなくても良い 
 idが101以外の場合もNotFound 
 の状況であってほしい 

  10. CustomSeederによる改善箇所
 テストケースの質を上げやすくなった 
  = より本番に近いデータでのテストが可能に 
 
 • SeederとCustomSeederの棲み分けが明確 


    ◦ Seeder:マスターデータ
 ◦ CustomSeeder:可変データ
 
 • リレーショナルなデータ構造も可変idで書くことが可能となる 
 • テストデータの作成が楽になる
 少しだけテストコードと向き合える状況を作れた 

  11. 必要なバリデータだけを組み合わせて利用できるようにした
 バリデータを作成するためのValidationAbstractを作り、 
 それらのバリデーションを集めて利用することのできるValidationAggregatorAbstractを用意した。 
 MailAddressValidationAggregator 
 RequiredValidator
 MaxLengthValidator 


    MailAddressFormatValidator 
 ・上記のAggregator, ValidatorはそれぞれAbstractを継承 
 ・Validatorはboolを返すvalidateメソッドを持つ 
 ・Aggregatorは所有するValidatorのvalidateメソッドを順番に実行し、実行結果を保有 

  12. 改修後のコード
 • バリデーションひとつひとつを 疎結合にできた
 • バリデーション毎にテストを書けば良いので、 
 テストコードを簡潔に書ける ようになった
 •

    新たにバリデーションを追加する場合も、都度 
 AggregatorやValidatorを作成し、必要な 
 バリデーションを利用すれば良い状況となった 
 他のエンジニアも率先して利用してくれるようになった 
 ロジック
 テスト

  13. なぜ状況は好転したのか?
 チームの皆が新しい取り組み(=挑戦)を面白がってくれるため 
 • 変化に柔軟なプロジェクトだった 
 ◦ 自分の挑戦を周囲のエンジニアが面白がって肯定してくれる(= 応援してくれる)
 


    • 「こうあるべき」という ビジョンや認識が同じ であり、ゴールまでの 組織の変化を楽しんでくれる 
 
 • 思い立ったタイミングで挑戦できる 
 
 • 誰かが挑戦しているとそれに触発され、新しい挑戦が生まれる 

  14. 入社1ヶ月後、他プロジェクトのエンジニアとペアプロを行なったことを機に、 
 エンジニアが誰でも参加できる座談ミーティング を定期的に開催することを推進してもらえた 
 
   ミニマムでミーティングの開催をし続け、少しずつ自身の認知・信頼へと繋げることができた 
 普及活動のための種蒔き
 入社直後の目標:部署内外問わず、自身を認知・信頼してもらう


    入社直後訪れたチャンス 
 入社時の想い:チームの皆がいち早く社会に価値を提供できる環境作り をしたい
 自身の考えや想いをプロジェクトに合った形で一緒に提案・賛同してもらえる状況を作る必要がある 
 入社8ヶ月後…
 
 ・本セッションへの登壇 
 ・社内エンジニアを対象としたテストコード研修会開催 
 → オープンソース化しました!(ウエディングパーク テストコードで検索♪ 💻)
 etc...
 活動の場を広げることができた 
 
 WPテストコード 
 詳細はこちら▼ 

  15. まとめ
 フェーズ2
 チームと
 テストコード体制
 
 フェーズ3
 更なる開発の
 加速を目指して
 
 フェーズ1


    事業成長に
 伴う課題
 
 • 開発体制の変化
 
 • 事業成長するにつれて起 きた課題
 
 • テストコード導入提案 
 
 • テストコード環境作りとカ バレッジ値可視化
 
 • カバレッジ目標を設定し たテストコード推進
 
 • 事業メンバーを巻き込ん で応援されよう
 • 日々のタスクの中にプラ スαの改善を
 
 • 周りが挑戦を面白がって くれる環境が大事
 
 • みんなの手で、今よりもっ と社会へ価値提供できる 未来を目指して