概要
この記事では、チーム開発を上手くすすめるために必要なことを筆者の体験をベースに重要だと考える要素についてまとめています。
前提
筆者は iOS 開発者として働いていますが、仕事とは別で個人的にアプリ開発したり、チーム開発をしたりしています。その中で、仕事でない時のチーム開発を上手くすすめるために必要なことをまとめています。筆者はハッカソンへの出場や趣味での iOS アプリ開発で何回かチーム開発をしてきましたが、その中で上手くいかなかったことの原因を思い返すと、モチベーションの低下などほとんどが似たような要素に起因していると考えていますのでその対処法についてこの記事でまとめていきたいと思います。
メンバー集め
まずは、チーム開発をするためにはメンバーが必要です。メンバーを集める際には、以下のような観点を考えると良いと思います。
1, メンバーの技術力・スキル
仲良しで集まって自由に開発するのも楽しくて良い部分も多くあるかと思います。ただ、リリースを目的にしたり、比較的難易度の高いものを開発目的にする場合は、自分にないスキルを持ったメンバーを集めたり、技術力の高いメンバーを集めることで、お互いのモチベーションになったり違う視点からのアイデアが出たりするので、後述する中だるみ時期を回避したり普段の開発を上手くすすめるためには重要な要素ではないかと考えています。
2, 目的の共有
開発が長引いてくるとよく陥る現象として、モチベーションの低下があります。そのため、開発を始める前に目的を共有したり、プロジェクトに参加することで達成したいことなどを最初にヒアリングすることで、途中でやることがなくなったり、やろうとしてもハードルが高すぎてそこまでやる気にもなれないといった状態におちいって、メンバー間での熱量の差が生じることを防ぐことにつながると思います。ですので特に、普段開発しているけどデザイナーにチャレンジしてみたいや、普段はフロント開発をしているけど、今後のキャリアのためにサーバー開発もしてみたい、けど仕事では簡単にはアサインされないからチャンスもあまりない、ゼロから色々自分でベースの部分をつくってみたいな人は仕事以外でのこういったアプリ開発を通して、欲しいスキルを磨いたり経験を少しでも積むことができるので、そういった人を集めることで、メンバーのモチベーションを維持することができると思います。(1 と少し矛盾する部分もありますが)
メンバーへの期待値、メンタリティ
メンバーが揃い、アプリ開発がスタートしたら、最初の期間は新鮮さも相まって順調に進むことが多いです。しかし、開発が長引くにつれて、メンバーのモチベーションが低下することがあります。特に、メンバーの中には仕事の忙しさなどで進捗が出せない場合もあります。
このような状況では、自分自身のメンバーに対する期待値を高く設定しすぎないことが重要です。期待値が高すぎると、感情的な対立やチーム内での不和を引き起こすことがあります。なので当然のことですが、メンバーに感謝の気持ちを持ち、彼らが忙しい中で時間を割いてくれていることを理解することが何より大切です。
また、進捗を促進するための話し合いや工夫は必要ですが、メンバーそれぞれが抱える生活や仕事の問題に対して共感と理解を示すことも重要です。自分が正しいという思い込みを持たずに、常に相手の立場に立って考え、支援を提供する姿勢がチームの健全な関係を築く鍵です。
アジャイル開発
アジャイル開発は、プロジェクトを小さな単位に分割し、それぞれを短期間で完了させることを目指します。スクラムはこの手法の一例で、スプリントと呼ばれる短期間(通常は 1〜2 週間)の中で、決定されたタスクを完了させます。スプリントの間に、進捗状況を TODO、WORKINPROGRESS、DONE などで可視化するツール(例:JIRA や Trello)を利用することで、効率的にタスクを管理し、柔軟に要件や優先順位を調整しながら目標に近づきます。
ただし、アジャイル開発の鍵は、手法だけではなく、メンバーのメンタリティにもあります。アジャイルなメンバーは、自分の強みを活かしながらチームのニーズを把握し、必要なタスクを自ら見つけ、積極的に行動します。また、固定観念にとらわれずに新しい方法を探求し、チームにとって最適な解決策を模索します。このメンタリティをチームに共有し、お互いを助け合いながら進めることで、アジャイル開発の真の効果を発揮できます。
開発効率性
リリースを目指すと、開発は長期間にわたり続くことがあります。本業が忙しい中での開発時間の確保は困難な場合もあるため、効率性を追求することが重要です。以下に、私の経験に基づくよく使われて簡単に導入可能な効率的な開発方法を紹介します。
1,静的解析ツールの導入
lint のようなツールを導入することで、コードの可読性を高め、レビューを容易にします。これにより、不要な行の削除やコードスタイルの統一が可能になります。
2, テスタブルなコードの書き方
複雑な処理を小さな関数に分割し、オブジェクトの責務を明確にすることで、処理の流れが追いやすくなります。DI や SOLID 原則を参考にしてください。
3, ORM の導入
データベース操作に ORM を用いることで、SQL を直接書く必要がなくなり、バグの減少やテーブル変更への柔軟な対応が可能になります。
4, CI/CD の導入
CI/CD を利用することで、マージ後の自動配信や静的解析ツール、テストの自動化が実現できます。UI テストの自動化にはスナップショットテストなどが有効です。
スコープの重要性
チームビルディングでは、目的やメンタリティを共有しますが、最終的な成果物と締切を明確にすることも同様に重要です。開発初期には多くのアイデアが浮かび、様々な機能や画面を実装したいという欲求が湧きますが、それらを全て取り込むことは現実的ではありません。範囲が広がりすぎると、プロジェクトの完成が遅れ、チームが燃え尽きてしまうリスクがあります。
オンサイトの重要性
開発が長引くと、プロジェクトに中だるみの時期が訪れることがあります。このような時には、オンサイトでのミーティングが非常に効果的です。オンサイトで直接会話することで、普段は Slack などで行っているコミュニケーションがより深くなり、普段聞き逃されがちな細かな点についても話し合うことができます。これにより、チームとしての結束力が高まり、モチベーションの回復に繋がります。