Upgrade to Pro — share decks privately, control downloads, hide ads and more …

20220218_Rails開発プロジェクトチームの始め方と入り方 in 銀座Rails#42

Masato Mori
February 18, 2022

20220218_Rails開発プロジェクトチームの始め方と入り方 in 銀座Rails#42

2022/02/18銀座Rails#42で発表したスライドです。
https://ginza-rails.connpass.com/event/237582/

Masato Mori

February 18, 2022
Tweet

More Decks by Masato Mori

Other Decks in Programming

Transcript

  1. About Me
 • 森 雅智: @morimorihoge
 • BPS株式会社でRailsの受託開発チームをやってたり、週1大学非常勤で Web開発を教えてたりします
 •

    Ruby/Rails歴は11年くらい。Web開発は17年くらい
 ◦ いわゆる受託業務アプリケーション開発屋です
 • 銀座Rails#37より銀座Railsの運営を引き継いでいます
 About BPS & TechRacho
 • Web受託開発の他、電子書籍製品・勤怠・入退室サービス
 • TechRachoという自社技術Blogを運営しています
 ◦ 平日毎日更新してます
 ◦ https://techracho.bpsinc.jp/ • お仕事相談、転職相談、TechRachoへのご意見など気軽にどうぞ
 ◦ https://www.bpsinc.jp/ 2

  2. よくある光景
 6
 新しくXXXというサービスを作ろう!予算も付けたぞ! Y開発部長、後はよろしく! 社長
 Y開発部長
 はい、分かりました(開発メンバーの稼働って空いてたっけ・・・ (開発チームに)新規サービス立ち上げたいんだけど、手の空けられそう な人いる? 開発チーム


    直近3ヶ月先までは現行サービスの追加開発で皆埋まっちゃってます ね。現行追加開発の方を止めて良ければ空けられますよ Y開発部長
 なるほど(ですよね~ 社長、開発リソース的にいっぱいいっぱいなので、現行サービスの追加 開発を待ってもらうことはできますか? 社長
 現行サービスはうちの稼ぎ頭だからそれは無理。なんとかして!
  3. よくある光景
 7
 新しくXXXというサービスを作ろう!予算も付けたぞ! Y開発部長、後はよろしく! 社長
 Y開発部長
 はい、分かりました(開発メンバーの稼働って空いてたっけ・・・ (開発チームに)新規サービス立ち上げたいんだけど、手の空けられそう な人いる? 開発チーム


    直近3ヶ月先までは現行サービスの追加開発で皆埋まっちゃってます ね。現行追加開発の方を止めて良ければ空けられますよ Y開発部長
 なるほど(ですよね~ 社長、開発リソース的にいっぱいいっぱいなので、現行サービスの追加 開発を待ってもらうことはできますか? 社長
 現行サービスはうちの稼ぎ頭だからそれは無理。なんとかして! \(^o^)/
  4. 開発メンバー圧倒的に足りない問題
 • 「新しいこと」をやろうと思ったとき、社内にいるエンジニアは既存のプロジェ クトで手一杯になっていることが多い
 • 他のプロジェクトの手を緩めることができない場合、企業として取り得る選 択肢は以下
 ◦ 自社社員を育成する:時間がかかり、即効性がない 


    ◦ 採用する:昨今では(特に無名)企業に取ってはかなり難しい 
 ◦ 外注する:他のパートナー企業やフリーランス個人に依頼する 
 ◦ その他にも、企業ごと開発会社を 買収するとかもあります
 8
 プロジェクトに時間制限がある場合には、実質外注が一番現実な選択肢 となる

  5. 本日のシナリオの前提
 • 発注元の会社をA社とする
 • A社には少なくとも1人のエンジニアが在籍している
 ◦ CTOとかエンジニアチームがある等はそれぞれケース分けします 
 • プロジェクト着手(発注)時点で全仕様が確定しておらず、何らかのアジャイル的開

    発手法によって開発を行う
 ◦ いわゆる請負契約ではなく準委任契約を想定します 
 • 発注先の開発会社をD社とする
 • A社内での社内政治等による予期しない負の要素は考慮しない
 • D社は請け負った業務をこなすための最大限の努力を行う善良さを持つ
 11

  6. A社が外注先を検討する前に明確にすること
 • プロダクト(サービス)の責任者を決める
 ◦ PdM(Product Manager)・ PO(Product Owner)他色々な名前の種類があるが、名前は問わない 
 ◦

    事業部や部署名ではなく 、必ず担当者の名前で明確に文書化(記録)する こと
 ▪ ※経験上ここで人の名前が出てこないプロジェクトは後になってから意思決定で揉めることが 多い
 ◦ ビジネスサイドとの橋渡し・責任役でもあるので外注先に担当してもらうのは困難 
 • 外注先を含めたプロジェクト体制図案を作成し、希望する役割・指揮系統構成を検 討する
 ◦ 開発会社であるD社もA社がどのような座組を望んでいるかが知りたい 
 ◦ 具体的な例は後述
 • システムのどの程度まで外注先に触らせて良いのかを考えておく
 ◦ 個人情報を扱う場合などに本番環境のアクセス権限を許すのであれば、NDA等契約内容にも影響 するはず
 ◦ 別途インフラやSRE部門があって実運用に関する部分は自社で管理したい、など各々事情がある はず
 13
 発注元の立ち上げ

  7. 開発体制図例C: 開発に関する内容を全て外注する(2)
 • 利点
 ◦ 信頼でき、うまく連携できるパートナー開発会社が見つかれば、すべてうまく進む 
 • 欠点
 ◦

    開発や保守運用、ビジネス周りも含めたノウハウがD社に集約されてしまうので、謀反を起こされた り仲が悪くなると辛い(ベンダーロックイン) 
 ◦ 請負形態でなく納品がない分、成果物管理を疎かにするとD社がいなくなったときに何も残らなかっ たということになりがち 
 ▪ そうなったサービスの開発を拾い上げるのはとても大変(高コスト)or不可能なことも 
 19

  8. 開発体制によるトレードオフ
 A: 開発・タスク管理を含むメインをA社
 
 
 
 
 
 B: 大まかな機能設計までA社


    
 
 
 
 
 C: 開発に関する内容を全てD社に外注
 20
 発注側の負担増
 自社controllable
 ベンダーロックインリスク 
 単価増・柔軟さ減
 単純化しすぎという感じもあるが、経営層にざっくりリスクを伝 える面では多分間違ってはいない

  9. 開発の文化的合意形成を行う
 • PM担当者が明示的に決めておくと良いこと
 ◦ プロジェクト管理の方法と ルール・使い方
 ▪ ツールは何を使う?Issueは誰が作るか?優先度管理の手法は?Issueテンプレートはどうす る?
 ◦

    プロダクト責任者との コミュニケーション・記録方法 
 ▪ 偉い人に限って電話とかを使ってくるケースもあるので、そういった場合に必ず文字でも共有 するなどのルールを決めておく 
 ▪ 開発者に記録が残らない形での直接依頼・相談はやめてね 、とかは決めておきたい 
 • 開発責任者が決めておくと良いこと
 ◦ ソース・リリース管理周り 
 ▪ PR作成のルール(粒度・description)、branch policy、開発・staging・本番環境の扱いとdeploy ポリシなど
 ◦ 設計周り
 ▪ 定番系Gemで使うのが決まっているものの 決め(認証系・非同期Job・セッション管理・テストフ レームワーク、Rubocop、etc.) 
 ▪ 大きなレベルでの設計に関する 考え方(routingのnamespaceで機能を分けるとか、mountable engineに分解しようとかetc.) 
 23
 全部最初に決めなくても良いが、決めていくと開発における迷いがなくなるので進めやすくな る。「これを決めるのは後回しにしよう」というのも合意の一つ

  10. 開発チームキックオフMTG
 • 参加者
 ◦ プロダクト開発に関わる全員 が望ましい
 • プロジェクト概要の共有
 ◦ どんなシステムを作るのか、

    見えている範囲での ゴールイメージを共有する
 ◦ 発注元のビジネスや、対象システムを使ってどうやって収益を上げようとしているのか等、大まかな レベルでのビジネス背景を共有 する
 ▪ ※必要なテストの粒度や要求品質などはこの辺りから読み取れることも多い 
 • コミュニケーションチャネルの構築
 ◦ SlackやGitHub、BacklogにJira、Redmineなど、情報共有のチャンネルやプロトコルを決める 
 ◦ 電話はオススメできないが、どうしても必要なら開発会社側は誰か一人に窓口は集約する 
 • 開発定例MTGの調整
 ◦ 最初期は1週間に1回以上は定例を開催する 
 ◦ A社・D社お互いのメンバーの顔を合わせて精神的距離を近くすると、色々と円滑に進めやすい 
 ▪ ※適切な距離感を保てないと感じたら早めにテコ入れする 
 25
 キックオフ後、各自すぐに動けるタスクがある状態にするのがベスト
 例:整地済みリポジトリをcloneしてローカル環境を整える、など

  11. ドキュメントの整備
 • 最新の開発情報に関するポインタ情報をWiki等にまとめておく
 ◦ 開発に必要な各種アカウント情報 
 ◦ リポジトリURLや、必要なら別途あるGoogle Drive等の開発リソースへのリンク 


    ◦ チームメンバーが忙しくても、 最悪ここを見れば自分から把握しに行くことができる ようにしておく
 • README.md(初期ローカル環境構築手順)のメンテナンス
 ◦ 理想はリポジトリをcloneしてREADME.mdだけ読めばローカル環境が構築できて、テスト実行やロー カル動作確認ができること 
 ◦ APIキー等リポジトリに置けない情報が必要な場合でも、 誰に聞けば分かるか が書かれていること
 31

  12. 新規JOINメンバーに適したタスク
 • README.mdにある環境構築手順のアップデート
 ◦ ある意味これ以上このタスクに向いている人はいない 
 ◦ 単純なタスクなので分からない時にも質問しやすい(確実にREADMEが間違ってるはず) 
 •

    変更差分が見ればすぐに分かる類いの修正
 ◦ 文言修正や影響範囲の小さそうな見た目CSS修正 
 • 運用サイドから上がってきたバグの再現性確認
 ◦ 操作手順を再現する過程でシステムの動きを追うので理解を深めやすい 
 ◦ 改修自体に手を付けられなくても、再現確認してもらえるだけで既存メンバーのサポートにはなる 
 • 既存機能の微改修(カラム追加など)や独立性の高い新規機能開発
 ◦ 既存機能を参考に書けたり、既存との副作用を気にしなくて実装できる機能は比較的着手しやすい 
 33
 なるべく短い期間で取り組めて、完了が明確なタスクが良い。 
 自分のPRがmergeされると精神的安心を得られるので、その辺りも気にするとなお良い 

  13. 普段から意識するポイント
 • 平易に書かれたテストコードを読めば何をやっているのか分かるような機能のド キュメント化は不要
 ◦ むしろメンテされないドキュメントが増えてしまうことでノイズになる可能性すらある 
 • テストコードを見ても「なぜ?」が分からない仕様にはコメントが欲しい
 ◦

    僕はソースコメント派ですが、PRやcommit commentでも(プロジェクトルールに従う 
 • 使われなくなったコードの削除
 ◦ 純粋にノイズにしかならないので、なるべく気が付いたら殺していきたい 
 • CIや各種環境で発生するwarningログ対策
 ◦ 経緯をしらないと放置して良いのかまずいのか判断が付きにくいので迷う 
 34

  14. モデルC(ほぼ丸投げ)の他のやり方
 • 0->1の完全新規開発の場合、要件定義・基本設計あたりまでを準委任契約で進 め、開発は請負契約で進めるという手もある(結構メジャーです)
 ◦ 発注側:準委任契約の完成しないリスクを回避 できる
 ◦ 受注側:全請負の想定外のオーバー稼働による原価割れを回避 できる


    • 要件定義が終わったタイミングで他社と相見積もりを取ることも可能
 ◦ 他社からも同程度の価格で見積が出てくる保証はないですが・・・ 
 • 請負契約になる分、途中からの仕様変更は追加開発扱いで別料金になるデメリッ トもあります(料金内でやってくれるかは相手次第)
 38
 契約形態や座組の調整は最初にしくじると後から修正するのが難しい ので、事前に自社の望んでい る動き方になるのかを十分に検討したい 

  15. 自社開発(内製)>>>>>>SIer/開発会社(外注)?
 • 自社に当該サービスに愛を持ってくれる優秀なエンジニアが十分に確保できる なら圧倒的に内製が良いが、世の中そう都合良くはない
 ◦ プロジェクトの失敗リスク
 ◦ 欲しい時に十分な数のエンジニアはいない(特にスタートアップ)
 • 働き方として「自分は開発だけやりたい」というタイプの人もいる


    ◦ 僕は同じプロジェクトにずっとじっとしていられないタイプ
 • 勉強会とかに全く出てこない「すごいエンジニア」も沢山います
 ◦ 全然しらない会社で突然そういう人と仕事できたりすると楽しい
 • フリーランスが最高?
 39
 価値観は人それぞれ。他人の評価に惑わされすぎず自分の価値観で判断したい