web-dev-qa-db-ja.com

開発者間で作業を分割する最良の方法は何ですか

私のチームと私は、約10年前に開発したサイトを再構築しており、アジャイルでそれを実行したいと考えています。

そのため、私が多くの時間を読んだ後(おそらく十分ではない)、開発者間で作業をどのように分割するかという問題に困っています。

より具体的に言うと、サイトは互いにあまり統合されていない別々のモジュールに分割されています。

作業を開発者間で分割するための最良の/最も受け入れられた方法は何ですか?

  • 作業するために各人に異なるモジュールを与える。
  • すべての開発者を同じモジュールに割り当て、モジュールのさまざまな部分(UnitTesting、DALおよびマッピング、ロジック、UI)で作業を分割します。
  • すべての開発者を同じモジュールに割り当て、異なるロジックで作業を分割します(たとえば、各開発者は特定のロジック(おそらくBLのメソッド)を担当し、それはUnitTesting、DAL、およびマッピングとUI ...

それとも、まったく違うものでしょうか?

30
Amir

私のチームは現在、いくつかのリリースで「アジャイル」を目指していますが、大企業の一員であることが必ずしも簡単ではありません。答えがあるように見せかけるつもりはありませんが、私の見解のいくつかを共有することができます。

  • モジュールごとに開発者を分ける:

    • 人々が孤立して働きすぎると、チームはスキルと知識の相互共有から利益を得られないので、注意する必要があります
    • 人々が自分のモジュールに集中しすぎて全体像が見えないと、計画会議や毎日のスタンドアップは誰にとっても信じられないほど退屈になる可能性があります。人々が飽きたら、チェックアウトを開始し、アジャイルがもたらすメリットの多くを失う
    • あなたは本当によく書かれたいくつかのコンポーネント、そして他のコンポーネントでうまくなるかもしれません...それほどではありません。人々が孤立して働くと、あなたの先輩たちは後輩を訓練することができなくなります。
  • 全員が同時に同じモジュールで作業する

    • 私たちは1つのリリースでそれを試しました。経営陣がチーム全体にアジャイルを課すことを決定したとき、それは完全に彼らのやり方になるでしょう。それは絶対的な列車の大破として。通常、1人の開発者が行うはずのことを、9人の開発者のチームが1年で提供しました。 (ここでは誇張しているかもしれませんが、それほどではありません)。
    • 誰も呼吸室がないように感じました。ソフトウェアを気にしていない人たちは、大きなパックの一部であり、グループで薄れるだけなので、自宅にいるように感じました。ソフトウェアに情熱を持っていた私たちの人々は、9人が同意したことを超えて移動したり、境界の外に出たりする自由がなかったので、絶対に窮屈に感じました。
    • すべての会議は、私が自分自身を撃ちたいと思うまで、永遠に終わりました。同じ部屋で意見のある人が多すぎて、同じDLLで作業することを余儀なくされました。ホラー。
  • 前回のリリースでは、別の方法を試すことにしました
    • 何よりもまず、開発グループを3〜4人の開発者の小さなチームに分割します。各チームは互いに比較的孤立して作業しましたが、チーム内では人々はよりまとまりを持って作業しました
    • このアプローチでは、スタンドアップは迅速であり、計画的な会議は堅実な4時間と比較して1〜2時間かかります。
    • 各チームはそのチームの開発者が気にかけていることだけを話し合うので、誰もが夢中になります。
    • 各チームの技術リーダーは他の技術リーダーと定期的に話し合い、プロジェクト全体が軌道に乗っていることを確認します。
    • 人々を特定のモジュールの「所有者」にする代わりに、専門分野を人々に割り当てたので、プロジェクトを最初に開始したとき、人々は独自のモジュールを持っているように感じましたが、数か月後、開発者はお互いのコードをエリアが重なり始めました。
    • コードレビューは不可欠です。これは2番目のリリースで、厳格なコードレビューポリシーがあり、チームの誰もがそれらを愛しています。特定の領域の専門家は、他の誰かがそのコードを変更した場合、常にコードレビューを行います。
    • コードレビューを使用すると、大量の知識を共有でき、チームのコード品質の全体的な改善を目にすることができます。また、コードは頻繁に見直されるため、他の誰かの専門分野に行くと、少なくとも数回はコードをすでに目にした可能性があります。
    • 各チームの大部分はデザインレビューミーティングに夢中になっているので、たとえコードを見たことがない場合でも、チームが担当するすべてのモジュールの一般的なフローに誰もが精通しています。
    • 私たちはこれを約10か月間行ってきましたが、分離されたモジュールアプローチから始めて、すべての人がすべての作業を行うように変形したような感じです。しかし、同時に、窮屈で制限されていると感じる人はいません。そして、彼らがまだある程度の権威を持っていることを確認するために、私たちは彼らをエリアエキスパートとして残しました。

私たちはその最後のことを行っており、改善の余地はたくさんありますが、全体的なチームは非常に満足しており、私たちが巨大企業の一員であるとき、それは多くのことを言います。

「アジャイルに行った」最初の3回で間違った1つの重要なことは、人々が作業方法を教えられ、作業内容を教えられたということです。それはあなたのチームがプロジェクトへの関心を完全に失うようにする一番の方法であり、それからあなたは本当の問題に直面しています。

代わりに、反対を試してください。チームに伝えます。彼らは好きなように行動でき、マネージャー/リーダーとして(もしそうであれば、マネージャーにこれらの言葉を繰り返させないでください)、あなたの仕事は彼らができるだけ生産的で幸せであることを確認することです。プロセスは悪いことではありませんが、プロセスがチームを支援するために必要です。

チームメンバーの一部が単独で作業することを好む場合は、それらを(ある程度)許可します。ペアで作業することを希望する場合は、それを実行します。できるだけ多くの人が自分の作品を選択できるようにしてください。

最後に、これは非常に重要であり、常に見落とされています。あなたはこの権利を手に入れません(あなたがスーパーマン、または少なくともバットマンでない限り)。定期的な回顧会議を開催することは非常に重要です。私たちが回顧展を展開したとき、それらは本によって行われ、それはあなたが座る必要があったさらに別のプロセスのように感じました。それが回顧的目的ではありません。それはあなたのチームの話を聞き、最も痛みを引き起こす領域を特定し、誰もが自分の仕事を進めることができるようにそれらを修正するためのものです。どうやらソフトウェアエンジニアは一般に、製品や機能を提供したり、遡及的ミーティングで伝えなければならない最も重要なメッセージを伝えたりするのが一般的であり、それは彼らの利益のためだけのものだということです。最大の障害物(または最も簡単な障害物、ある種の2Dマップがある)から始めて、障害物を特定して対処し、邪魔にならないようにして、人々が作業を完了するようにします。

37
DXM

チームとミーティングを行い、To-Doリストを見せて、誰が何をしたいのか尋ねます。

16

モジュールで考えないでください。機能要素について考えます。これらの機能要素をユーザーストーリー(またはその他の方法)で説明し、受け入れ基準(おそらく現在のアプリケーションによって定義され、ビジネスが期待する変化)を説明することを忘れないでください。機能要素をバックログに入れます。次に、最初にどの機能を提供する必要があるかをビジネスに優先順位付けさせます(段階的かつ反復的に作業し、優先順位によって最初に実装する必要があるものを指示します)。

元のアプリケーションの少なくとも一部についてこれを取得したら、開発の準備が整います。次に何が起こるかは、選択したアジャイル方法論によって異なります。重要な部分は、各機能が通常複数のタスクに分割され、チームメンバーが実行するタスクを選択することです。これは自己組織化と呼ばれます。アジャイルから始めるとき、自己組織化は、誰かが人気のないタスクと人気のあるタスクがチームによって等しく共有されることを確認する助けを必要とするかもしれません。チームがより成熟すると、開発者は現在の自己組織との意見の相違をためらうことなく、これがチーム内で自動的に処理されます。

モジュールを最初から考えることは、良い方法である必要はありません。なんらかの理由でアプリケーションを書き直している可能性があります。おそらく、不適切なモジュール分離に基づく現在のアプリケーションアーキテクチャは、目に見える問題の背後にある隠れた理由の1つです。また、既存のモジュールの一部の機能が完全に再定義され、別の場所に移動されることもわかります。

10
Ladislav Mrnka

私はデビッドの答えに同意しますが、いくつかの精巧さから利益を得ることができると感じました:

  • アジャイルとは、これらの決定を行わず、チームにプッシュすることを意味します。そのようなプロジェクトマネージャー/リーダーはいません。チームだけ。
  • 作業を分割する方法を最もよく理解しているのは、チームメンバー自身です。
  • バックログについて話し合い、次の反復/スプリントで実現したいことを見つけます。
  • プランニングポーカーまたは同様の方法を使用して、とにかく分割する作業の量を把握し、実際の作業パッケージの分割を開始しますtogether

基本的に、肝心な点は次のとおりです。SEの誰もあなたに代わってその質問に答えることはできません。また、チームとして答えを考えた方がはるかに良いので、それについてあまり意味がありません。

8
Frank

多くの場合、最も単純なアプローチが最善です。

非常に明確で明確な理由を定義できない限り、テスト/ログ/ UI /などのグループにタスクを分割することは避けます。私の推論では、プログラマーに通常の専門分野以外での作業を許可すると、物事を面白くてやりがいのあるものにして、フィールド内で開発および成長できるようになると考えています。時間の制約により専門知識に基づいて作業を分割する必要があると思われる場合は、最低でも、各開発者が引き続き独自のユニットテストを実行し、コードレビューと受け入れテストを使用して問題を特定する必要があります。独自のテストを書くことは非常に機敏であり、テスターが利用可能になるのを待つのは非常に無駄です。

このようなジレンマに直面したとき、私は次のアプローチを採用しました。

  • プロジェクトのスコープを設定します。自分が何に取り組んでいるのかを考え、プロジェクトを一連のタスクに分解して、機能のリストを作成します。

  • 機能に優先順位を付けます。早期に完了する必要がある機能と、顧客にすぐに価値を提供する機能を決定します。開発者が同じモジュールで作業することになっても心配しないでください。ただし、コードのマージを管理するための適切なプロセスとツールがあることを確認してください。

  • チームを関与させ、開発者に、機能をより簡単に管理できるタスクのリストに分類するのを支援するよう依頼してください。グループとしてレビューし、必要に応じてタスクを調整して、タスクをより簡単に推定できるようにします。

  • 各開発者に、実装するタスク、または反復の実行方法に応じてタスクのグループを、開発者が作業したい優先度キューの先頭から選択するように依頼します。

  • 優先度キューの一番上から次のアイテムの選択に進む前に、各開発者に1つの作業だけを完了させるまで作業してもらいます。あなたは時々あなたの人々に仕事を変えさせたくなるかもしれませんが、これは開発者の時間の面で無駄につながります。依存関係のボトルネックがある場合は、タスクの優先順位を調整し、無駄を最小限に抑える必要があります。

  • 重複したイテレーションで開発者を実行することを恐れず、それに応じてリリースを管理します。これは、タスクが完了するのを待つリリース間の無駄な時間を最小限に抑えるのに役立ちます。

結局のところ、アジャイルであるということは、チーム、会社、および顧客にとって適切に機能するソリューションを見つけることです。自分に最適な方法のバランスを見つけてプロセスを調整するのは、あなた次第です。タスクを分割する方法は、非常に大きなプロセスの非常に重要な部分になりますが、積極的に参加を促し、後で発生するプロセス関連の問題の解決が困難になるのを避けるために、できるだけ単純にする必要があります。

4
S.Robins

フレッドブルックス博士のSurgical Teamに言及しない限り、開発者チームの組織的な議論は完了しません。

基本的な式は次のとおりです。作業単位ごとに1つの外科チーム

外科チームの定義

外科チームのコンセプトは、2つの基本的なアイデアに基づいています。

  1. 開発者が少ないクロストークは生産性を低下させるため、作業単位あたりの方が優れています。
  2. 高出力の開発者は低出力の開発者よりもパフォーマンスが優れています(そしてBrooksによると、中出力の開発者などは存在しないため)、実行する最も重要な作業を提供することをお勧めします、そして彼らの気晴らしを制限します。

外科チームは3〜10人の開発者で構成されています。

  1. チーフプログラマー実際のプログラミングのほとんどを行う高出力の開発者。
  2. 副操縦士もう1つの高出力の開発者で、プログラミングだけでなく、会議への出席や要件の収集などの管理タスクも行います。
  3. 1-8アシスタント。 Brooksは、ドキュメント、コードのクリーンアップ、研究、ツール/アルゴリズムの作成、テストなどを担当する開発者としてこれらを説明しています。60年代に戻って、Brooksは正確に8つの役割を提案しましたが、最新必要なツールはわずか1または2で、プロジェクトのニーズに基づいて割り当てる必要があります。

作業単位の定義

チームをまとめることができるようになったので、何を割り当てますか?

  • プロジェクトが非常に小さい場合、これは簡単です。プロジェクト全体に1つの外科チームを割り当てます。
  • それ以外の場合次に、プロジェクト全体のarchitectureを担当する人またはチームから始める必要があります。追加のサブチーム間で作業を分割できるように、ソフトウェアを適切にモジュール化するのが彼らの仕事です。アーキテクチャチームは、開発者を薄くしすぎないように、他の作業にも取り組むことができます。

3つの基本的な許容可能なパターンが現れるはずです。

  1. 各レイヤー(UI、DALなど)ごとに正確に1つのサブチーム
  2. モジュールごとに正確に1つのサブチーム(ホームページ、サポートサイト、ショップ)
  3. 2つの組み合わせ(低レベルのフレームワークチーム、および各モジュールのUI重視のチーム)
3
Kevin McCormick

開発者とモジュール(およびタイムスケール)の数に応じて、私は通常、開発者に1つの興味深いモジュール(およびそれら)と1つのやりがいのあるモジュール(できれば、行っていないもの)を選択し、残りの部分をスキルレベルと時間の制約。これにより、開発者は取り組みたいものとプッシュできるものを得ることができます。

もちろん、これはいつもうまくいくとは限りません...

2
Amy

これが私がすることです:

すべてのモジュールが小さい場合は、それぞれに作業するモジュールを与えることができます。それ以外の場合は、次のようにします。

  1. 各モジュールのサイズ、複雑さ、そのために必要なスキルを定義します。
  2. 各チームメンバーのスキルを定義します。
  3. どのユーザーがうまく連携しているか、どのユーザーが他のユーザーとうまく連携していないかを定義します。
  4. 大きなモジュールを、モジュールのスキル要件とチームのスキルに基づいてうまく連携するチームに割り当てます。
  5. モジュールスキルの要件とチームスキルに基づいて、残りのモジュールを他の人とうまく連携できない人に割り当てます。

他の人と一緒に仕事をしたくない人が最も熟練している人であり、これが一般的なケースである場合、上記は機能しません。したがって、4と5に例外を設けてください。

1
NoChance