私のチームと私は、約10年前に開発したサイトを再構築しており、アジャイルでそれを実行したいと考えています。
そのため、私が多くの時間を読んだ後(おそらく十分ではない)、開発者間で作業をどのように分割するかという問題に困っています。
より具体的に言うと、サイトは互いにあまり統合されていない別々のモジュールに分割されています。
作業を開発者間で分割するための最良の/最も受け入れられた方法は何ですか?
それとも、まったく違うものでしょうか?
私のチームは現在、いくつかのリリースで「アジャイル」を目指していますが、大企業の一員であることが必ずしも簡単ではありません。答えがあるように見せかけるつもりはありませんが、私の見解のいくつかを共有することができます。
モジュールごとに開発者を分ける:
全員が同時に同じモジュールで作業する
私たちはその最後のことを行っており、改善の余地はたくさんありますが、全体的なチームは非常に満足しており、私たちが巨大企業の一員であるとき、それは多くのことを言います。
「アジャイルに行った」最初の3回で間違った1つの重要なことは、人々が作業方法を教えられ、作業内容を教えられたということです。それはあなたのチームがプロジェクトへの関心を完全に失うようにする一番の方法であり、それからあなたは本当の問題に直面しています。
代わりに、反対を試してください。チームに伝えます。彼らは好きなように行動でき、マネージャー/リーダーとして(もしそうであれば、マネージャーにこれらの言葉を繰り返させないでください)、あなたの仕事は彼らができるだけ生産的で幸せであることを確認することです。プロセスは悪いことではありませんが、プロセスがチームを支援するために必要です。
チームメンバーの一部が単独で作業することを好む場合は、それらを(ある程度)許可します。ペアで作業することを希望する場合は、それを実行します。できるだけ多くの人が自分の作品を選択できるようにしてください。
最後に、これは非常に重要であり、常に見落とされています。あなたはこの権利を手に入れません(あなたがスーパーマン、または少なくともバットマンでない限り)。定期的な回顧会議を開催することは非常に重要です。私たちが回顧展を展開したとき、それらは本によって行われ、それはあなたが座る必要があったさらに別のプロセスのように感じました。それが回顧的目的ではありません。それはあなたのチームの話を聞き、最も痛みを引き起こす領域を特定し、誰もが自分の仕事を進めることができるようにそれらを修正するためのものです。どうやらソフトウェアエンジニアは一般に、製品や機能を提供したり、遡及的ミーティングで伝えなければならない最も重要なメッセージを伝えたりするのが一般的であり、それは彼らの利益のためだけのものだということです。最大の障害物(または最も簡単な障害物、ある種の2Dマップがある)から始めて、障害物を特定して対処し、邪魔にならないようにして、人々が作業を完了するようにします。
チームとミーティングを行い、To-Doリストを見せて、誰が何をしたいのか尋ねます。
モジュールで考えないでください。機能要素について考えます。これらの機能要素をユーザーストーリー(またはその他の方法)で説明し、受け入れ基準(おそらく現在のアプリケーションによって定義され、ビジネスが期待する変化)を説明することを忘れないでください。機能要素をバックログに入れます。次に、最初にどの機能を提供する必要があるかをビジネスに優先順位付けさせます(段階的かつ反復的に作業し、優先順位によって最初に実装する必要があるものを指示します)。
元のアプリケーションの少なくとも一部についてこれを取得したら、開発の準備が整います。次に何が起こるかは、選択したアジャイル方法論によって異なります。重要な部分は、各機能が通常複数のタスクに分割され、チームメンバーが実行するタスクを選択することです。これは自己組織化と呼ばれます。アジャイルから始めるとき、自己組織化は、誰かが人気のないタスクと人気のあるタスクがチームによって等しく共有されることを確認する助けを必要とするかもしれません。チームがより成熟すると、開発者は現在の自己組織との意見の相違をためらうことなく、これがチーム内で自動的に処理されます。
モジュールを最初から考えることは、良い方法である必要はありません。なんらかの理由でアプリケーションを書き直している可能性があります。おそらく、不適切なモジュール分離に基づく現在のアプリケーションアーキテクチャは、目に見える問題の背後にある隠れた理由の1つです。また、既存のモジュールの一部の機能が完全に再定義され、別の場所に移動されることもわかります。
私はデビッドの答えに同意しますが、いくつかの精巧さから利益を得ることができると感じました:
基本的に、肝心な点は次のとおりです。SEの誰もあなたに代わってその質問に答えることはできません。また、チームとして答えを考えた方がはるかに良いので、それについてあまり意味がありません。
多くの場合、最も単純なアプローチが最善です。
非常に明確で明確な理由を定義できない限り、テスト/ログ/ UI /などのグループにタスクを分割することは避けます。私の推論では、プログラマーに通常の専門分野以外での作業を許可すると、物事を面白くてやりがいのあるものにして、フィールド内で開発および成長できるようになると考えています。時間の制約により専門知識に基づいて作業を分割する必要があると思われる場合は、最低でも、各開発者が引き続き独自のユニットテストを実行し、コードレビューと受け入れテストを使用して問題を特定する必要があります。独自のテストを書くことは非常に機敏であり、テスターが利用可能になるのを待つのは非常に無駄です。
このようなジレンマに直面したとき、私は次のアプローチを採用しました。
プロジェクトのスコープを設定します。自分が何に取り組んでいるのかを考え、プロジェクトを一連のタスクに分解して、機能のリストを作成します。
機能に優先順位を付けます。早期に完了する必要がある機能と、顧客にすぐに価値を提供する機能を決定します。開発者が同じモジュールで作業することになっても心配しないでください。ただし、コードのマージを管理するための適切なプロセスとツールがあることを確認してください。
チームを関与させ、開発者に、機能をより簡単に管理できるタスクのリストに分類するのを支援するよう依頼してください。グループとしてレビューし、必要に応じてタスクを調整して、タスクをより簡単に推定できるようにします。
各開発者に、実装するタスク、または反復の実行方法に応じてタスクのグループを、開発者が作業したい優先度キューの先頭から選択するように依頼します。
優先度キューの一番上から次のアイテムの選択に進む前に、各開発者に1つの作業だけを完了させるまで作業してもらいます。あなたは時々あなたの人々に仕事を変えさせたくなるかもしれませんが、これは開発者の時間の面で無駄につながります。依存関係のボトルネックがある場合は、タスクの優先順位を調整し、無駄を最小限に抑える必要があります。
重複したイテレーションで開発者を実行することを恐れず、それに応じてリリースを管理します。これは、タスクが完了するのを待つリリース間の無駄な時間を最小限に抑えるのに役立ちます。
結局のところ、アジャイルであるということは、チーム、会社、および顧客にとって適切に機能するソリューションを見つけることです。自分に最適な方法のバランスを見つけてプロセスを調整するのは、あなた次第です。タスクを分割する方法は、非常に大きなプロセスの非常に重要な部分になりますが、積極的に参加を促し、後で発生するプロセス関連の問題の解決が困難になるのを避けるために、できるだけ単純にする必要があります。
フレッドブルックス博士のSurgical Teamに言及しない限り、開発者チームの組織的な議論は完了しません。
基本的な式は次のとおりです。作業単位ごとに1つの外科チーム
外科チームのコンセプトは、2つの基本的なアイデアに基づいています。
外科チームは3〜10人の開発者で構成されています。
チームをまとめることができるようになったので、何を割り当てますか?
3つの基本的な許容可能なパターンが現れるはずです。
開発者とモジュール(およびタイムスケール)の数に応じて、私は通常、開発者に1つの興味深いモジュール(およびそれら)と1つのやりがいのあるモジュール(できれば、行っていないもの)を選択し、残りの部分をスキルレベルと時間の制約。これにより、開発者は取り組みたいものとプッシュできるものを得ることができます。
もちろん、これはいつもうまくいくとは限りません...
これが私がすることです:
すべてのモジュールが小さい場合は、それぞれに作業するモジュールを与えることができます。それ以外の場合は、次のようにします。
他の人と一緒に仕事をしたくない人が最も熟練している人であり、これが一般的なケースである場合、上記は機能しません。したがって、4と5に例外を設けてください。