プログラマーはどのようにプロジェクトに協力しますか?


81

私はいつも一人でプログラムしました、私はまだ学生なので、他の誰かとプログラムしたことはありません、私は以前にバージョン管理システムさえ使用していません。

私は現在、プログラマーが会社のソフトウェアでどのように協力するかについての知識を必要とするプロジェクトに取り組んでいます。

ソフトウェアはどのようにコンパイルされますか?バージョン管理システムからですか?個々のプログラマーによるものですか?定期的ですか?誰かが何かを作ることを決心したときですか?それが「機能する」ことを確認するために行われるテストはありますか?

何でもかまいません。


24
チームとしての人々のプログラミング方法は間違いなくプログラミング関連であるため、「プログラミング関連ではない」タグを削除しました。
ブレンダンロング

@Brendan Long:タグを付け直していただきありがとうございます。
Leo Jweda 2010年

回答:


60

実際、これらのプロセスには、多くの企業と同じくらい多くのバリエーションがあります。意味:すべての企業には他の企業とは少し異なる規則がありますが、ほとんどの場所で一般的に使用されている一般的なベストプラクティスがいくつかあります。

常に役立つベストプラクティス

  • プロジェクトのすべてのソースコードとそれをビルドするために必要なものはすべてバージョン管理下にあります(ソース管理とも呼ばれます)。誰でもワンクリックでプロジェクト全体を構築できるはずです。
    さらに、不要なファイル(オブジェクトファイルまたはコンパイルされたバイナリ)は、非常に簡単に再生成でき、リポジトリ内のスペースを浪費するだけなので、リポジトリに追加しないでください。
  • すべての開発者は更新してコミットする必要があります、1日に数回バージョン管理をするます。ほとんどの場合、彼らは作業を終えて十分にテストしたので、些細なバグが含まれていないことがわかります。
  • 繰り返しますが、誰でもシングルクリックでプロジェクトをビルドできるはずです。これは重要であり、誰にとっても簡単にテストできます。非プログラマー(例えば上司)もそうすることができれば大きな利点です。(チームが何に取り組んでいるのかを正確に確認できるようになります。)
  • すべての開発者は、リポジトリにコミットする前に、追加する新機能またはバグ修正をテストする必要があります。
  • リポジトリから定期的に(所定の間隔で)更新し、プロジェクト全体ですべてを構築しようとするサーバーをセットアップします。失敗した場合は、バージョン管理への最新のコミット(どのコミットがビルドに失敗したため)とともに電子メールをチームに送信して、問題のデバッグに役立てます。 この方法は継続的インテグレーションと呼ばれ、ビルドはナイトリービルドとも呼ばれます(これは、開発者が自分のマシンでコードをビルドしてテストするべきではないことを意味するものではありません。前述のように、そうする必要があります。)

  • 明らかに、誰もがプロジェクトの基本的な設計/アーキテクチャに精通している必要があるため、何かが必要な場合でも、チームのさまざまなメンバーが車輪の再発明を行う必要はありません。再利用可能なコードを書くことは良いことです。
  • チームメンバー間で何らかのコミュニケーションが必要です。少なくとも少しは、他の人が何をしているのかを誰もが知っている必要があります。多いほど良いです。これが、毎日のスタンドアップがスクラムチームで役立つ理由です。
  • 単体テストは、コードの基本機能を自動的にテストするための非常に優れた方法です。
  • バグ追跡ソフトウェア(とも呼ばれる時間追跡ソフトウェアは)別のチームメンバーが持っているが、どのような作業であるかのバグを追跡するのは非常に良い手段です。また、テストにも適しています。プロジェクトのアルファ/ベータテスターは、この方法で開発チームと通信できます。

これらの単純なことにより、プロジェクトが制御不能になることはなく、全員が同じバージョンのコードで作業することが保証されます。継続的インテグレーションプロセスは、何かがひどく悪くなったときに役立ちます。

また、メインリポジトリにビルドされないものをコミットすることを防ぎます。
実装に数日かかり、他の人がプロジェクトをビルド(およびテスト)するのをブロックする新機能を含めたい場合は、バージョン管理のブランチ機能を使用してください。

それでも不十分な場合は、問題のプロジェクトで可能であれば、自動テストを実行するように設定することもできます。

もう少し考え

上記のリストは、一見すると非常に重いものになる可能性があります。必要に応じてそれに従うことをお勧めします。バージョン管理とバグトラッカーから始めて、必要に応じて、後で継続的インテグレーションサーバーをセットアップします。(大規模なプロジェクトの場合は、すぐに必要になります。)最も重要な部分の単体テストの作成を開始します。それが十分でない場合は、それらをもっと書いてください。

いくつかの便利なリンク:
継続的インテグレーションデイリービルドはあなたの友達ですバージョン管理ユニットテスト

例:

最近では、バージョン管理のために、個人的なプロジェクトにGitを使用する傾向があります。Subversionも人気があり、たとえば、 Windowsサーバーを使用している場合 VisualSVNは非常に簡単にセットアップできます。クライアントにとって、TortoiseSVNは多くの人に最適です。これがGitとSVNの比較です。

バグ追跡ソフトウェアの場合、JiraBugzillaが非常に人気があります。以前の職場でもマンティスを使用しました。

継続的インテグレーションソフトウェアには、Teamcityがあります 1つに(また、CruiseControlとそれに対応する.NETが注目に値します)。

「プロジェクトのメインデザインは誰が決めるの?」という質問に答えてください。

もちろん、それが主な開発者です。
企業では、主任開発者は、プロジェクトの財務/マーケティング担当者と話し合い、企業の財務能力、計画された機能、ユーザーからの要件、および利用可能な時間に応じてアーキテクチャを決定する人です。

これは複雑な作業であり、通常は複数の人が関わっています。チームのメンバーは、プロジェクト全体または特定の部分の設計について参加またはブレインストーミングするように求められることもあります。


4
Git overSubversionを検討する必要があります。SubversionはCVSよりも優れており、GitはSubversionよりもはるかに優れています。また、Subversionには、習得は簡単ですが、いくつかの癖があります。特にプラグインの形で。TortoiseSVNは優れていますが(Windowsシステムで作業している場合)。
シャム2010年

5
@ Shyam-実際、Gitについて聞いたことがあります。それには利点がありますが、「はるかに優れている」とは言えません。特にそれがまだまともなWindowsクライアントを持っていないことを考えると。それでも、それは個人的な好みなので、私はそれを私の答えに追加しました。
Venemo 2010年

@Venemo:それはプログラミングを退屈にしませんか?コードをすぐにテストできず、ビルドを待ってから、作成した内容の効果がほとんどまたはまったく見られない場合は、また、プロジェクトの主なデザインは誰が決めるのですか?(言語、機能、ライブラリ、フレームワーク、アーキテクチャなど)
Leo Jweda

2
@Laith J:1。一般的な仕事は退屈です2.忍耐強いことは美徳です。3.誰がプロジェクトを設計するかは関係なく、顧客が決定します。あなたが持っている「どのように」革新的、幻想的、または素晴らしいアイデアに関係なく。成果物。生きるために働く、働くために生きてはいけない。
シャム2010年

1
@ Shyam-私は個人的にGitについて何も知りませんし、私がほとんど知らないことを判断しません。これを炎に変える必要はありません。違いはここでよく説明されています:stackoverflow.com/questions/871/…そして私はこの単純で日常的なことを達成するのがとても難しいまでGitに変更しません:stackoverflow.com/questions/2733873/…。また、SVNのアプローチの方が好きで、習得もはるかに簡単です。そして、私はシンプルが好きです。
Venemo 2010年

13

私も学生です。最近、ソフトウェアエンジニアリングのコースを修了し、学期全体が巨大なグループプロジェクトで構成されていました。まず、学期全体で12人が行ったことを3人で行うことができたと言うことから始めましょう。人と一緒に働くのは大変なことです。コミュニケーションが鍵です。

間違いなくリポジトリを利用してください。各人はリモートですべてのコードにアクセスし、何でも追加/削除/変更できます。しかし、Subversionの最良の部分は、誰かがコードを壊した場合、以前のバージョンに戻って、そこから何が悪かったのかを評価できることです。ただし、コミュニケーションは依然として重要です。競合が発生しないように、チームメートが何をしているのかを把握してください。コードに腰を下ろさないでください。リポジトリにすばやく意味のあるコミットを行って、最も効果的にしてください。

** Redmineなどのバグトラッカーもお勧めします。すべての人にアカウントを設定し、さまざまな優先順位でタスクを割り当てたり、特定の問題に対処したかどうか、またはさらに問題が発生したかどうかを追跡して確認することもできます。

そして、前に述べたように、ユニットテストは大いに役立ちます。頑張ってください!これがお役に立てば幸いです:-)


グループプロジェクトで本当に貴重な教訓を学んだように見えます。人と仕事をするのは大変ですが、あなたはそれをするのに多くの時間を費やすでしょう。そしてそれもやりがいがあります。
高性能マーク

バグトラッカーのための1 -私たちが使用するもの(他の人を知らない)私たちはメモを追加することができ、そして何かが、それが固定された後3ヶ月を起動した場合、我々は、バグの全体の歴史をたどると、多くの方の事を思い出すことができます
Rox 2010年

私が大学にいたとき、グループが関与するすべてのプロジェクトは、グループダイナミクス、コミュニケーション、または弱いリンクのために提供できませんでした。あなたが会社で働くときの利点は、完全に無能またはやる気のない同僚(通常)がそれほど長くぶらぶらしないことです。
ベンジョール2010年

@ Benjol-これ以上同意できませんでした!皆様からのフィードバックに感謝します:
Elaina R

8

大きなことは次のとおりです。

  • 計画—人々がどこに行くのかわからなければ、どこにも行きません。したがって、プロジェクトの開始には、密談して計画を立てるのに数人(多くの場合、プロジェクトの灰色のひげ)が必要です。計画はそれほど詳細である必要はありませんが、それでも必要です。
  • バージョン管理システム—これがないと、一緒に作業することはできません。また、物事がコミットされない場合、それらはカウントされないという確固たるコミットメントが必要です。「ああ、それは私の砂場の1つにあります」はただの言い訳です。
  • 課題追跡システム—電子メールフォルダでこれらを追跡することはできません。間違いなくデータベースに裏打ちされている必要があります。
  • 通知システム—人々は、自分が維持しているコードに物事がコミットされたとき、または自分が責任を負っているバグにコメントが付けられたときを知る必要があります。IRCと同様に、電子メールこのために機能します(もちろん、誰もがそれを使用する場合)。
  • ビルドシステム—これがどのように発生するかは実際には問題ではありません。ただし、1つのアクションで、開発サンドボックスとメインリポジトリの両方の現在の状態の完全なビルドを取得できます。これに最適なオプションは、使用している言語によって異なります。
  • テストスイート—テストスイートは、人々がばかげたエラーを回避するのに役立ちます。ビルドと同じくらい簡単に実行できる必要があります(ビルドの一部であることは良いことです)。テストは正確さの大まかな代用にすぎないことに注意してください。しかし、テストは何もないよりもはるかに優れています。

最後に、計画の遂行に向けて協力する意欲が必要です。それは非常にしばしば難しい部分です。


継続的インテグレーションシステムと同様に、項目別の要件が役立ちますが、実際には、リストされている他のものの側面です。
ドナーフェロー

8

プログラマーが会社のソフトウェアでどのように協力するか

開発者がチームとして作業することはありません。チームは最悪だ。 ディルバートはグーフィーのようなコミカルなキャラクターだからではなく面白いです。彼は本物であり、人々は彼がいる状況を認識しているので、彼は面白いです。

漫画


7

一般に、ビルドアーティファクトをリポジトリにチェックインしないことをお勧めします。リポジトリには、ソースツリー、ビルド構成など、人間が作成したものがすべて含まれます。ソフトウェアエンジニアは、コードのコピーをローカルファイルシステムにチェックアウトし、ローカルでビルドします。

ビルドプロセスの一部として実行される単体テストを用意することもお勧めします。このようにして、開発者は自分の変更によって単体テストのいずれかが無効になったかどうかを即座に知ることができ、変更をチェックインする前にそれらを修正する機会があります。

バージョン管理システム(Subversion、CVS、Gitなどのいずれか)およびビルドシステム(たとえば、JavaにはAntとMavenがあります)のドキュメントを調べることをお勧めします。


ビルド結果がリポジトリにない場合、大規模プロジェクトの開発者はどのようにしてテストビルドを実行できますか?私はいつも一人で働いていたので、これが私の精神だけであるかどうかはわかりませんが、プログラムを実行するときは常に物事が「機能する」ことを確認します。
Leo Jweda 2010年

テストビルド(およびビルドプロセスによって作成されたデータ)は、インストーラーにバンドルされるか、ネットワーク共有上のフラットファイルシステムとしてバンドルされるため、簡単にコピーできます。彼らはなどのバグ修正、上のフィードバックを提供できるように、専用のテスターを持っている場合に有用である
graham.reeds

3

あなたが求めていることの基準はありません。むしろ、慣習があり、これらは組織の規模と成熟度に大きく依存します。小規模な組織、たとえば数人のプログラマーの場合、コーディング、ビルド、およびテストを行う個々の開発者にとっては、おそらく非公式なことになるでしょう。

大規模な組織では、専任のビルドエンジニアとプロセスが存在する場合があります。この種の組織は通常、チェックインされたソースコードを使用して、定期的に、たとえば1日に1回、正式なビルドを実行します。このプロセスには通常、BVT(ビルド検証テスト)とおそらくいくつかの回帰テストも含まれます。開発者はリポジトリからコードをチェックアウトし、ローカルで自分の部分で作業してからチェックインします。

マイクロソフトやグーグルのような最大の組織では、完全に専用のグループと完全なラボがあり、多かれ少なかれ継続的に構築され、各実行の結果が利用可能になります。これらの組織には、何がいつチェックインされるか、コードレビュープロセスが何であるかなどについて、非常に正式なプロセスと手順があります。


では、MSとGoogleの開発者はどのようにコードをテストしますか?私たちが何をしようとも、コードをコンパイルして実行しない限り、それが機能することを確信することはできません。
Leo Jweda 2010年

上記のように、それはあなたが所属しているチームに依存します。Windowsのような最大のチームは、個々の修正のローカルテストを容易にする大きくて複雑なブランチ構造を持ち、変更がWinMainに到達するまでブランチを上に移動するときに、統合の問題を早期に特定します。5,000人の開発者やSDETのようなものが製品に取り組んでいるとき、それはあなたがしなければならないことです。ところで、MSのSDETは実際にたくさんプログラムします。それらのテストコードは製品コードと一緒にチェックインされ、同様のコーディングおよび品質基準を満たす必要があります。
jfawcett 2010年

3

ソフトウェア開発を扱うためのクックブックはありませんが、あなたが唯一の開発者であるプロジェクトで作業している場合でも、一般にバージョン管理システムがビルドシステムの中心となるはずです。この場合でも、バージョンを元に戻してバージョンログを読み取ることができれば、バグを修正するのに非常に役立ちます。これはバージョン管理システムの唯一の機能ではありませんが、これだけでバージョン管理システムのインストール、構成、および保守が正当化されます。

ビルドは、新しいコードを追加するときに各開発者が実行することも、「ビルドサーバー」によって定期的に実行することもできます。最後のアプローチでは、より多くのセットアップが必要ですが、ビルドエラーをより早く見つけるのに役立ちます。


2

短い答え-「それは異なります」。

現在、私は自分でプロジェクトに取り組んでいるので、VCSを構築/使用するのは私です。私はあなたが震えによって一緒にプロジェクトに取り組んでいるチームを持っている他の場所を知っていますメールでます。または、VCSを使用する大規模な(+5)チーム。

その点で、私は少なくともいくつかのVCSを学ぶことを強くお勧めします、そしてJoelSpolskyは素晴らしい入門チュートリアルを持っていますMercurialのためのをます。バザール(私の個人的な選択)は似ており、Gitは類似性の点で次に近いですが、おそらくどちらよりも人気があります(少なくともATM)。その後、比較してかなり弱いSVNがあります。

実際、ジョエルはあなたの質問のほとんどについて話します-彼が持っている10年間のアーカイブを読むことをお勧めします-それはすべて非常に有用な情報であり、そのほとんどはあなたの現在および近い将来の状況に関連しています。


ただし、ほとんどの人は(少なくともビジネスでは)これらの新しい分散型VCSを使用しないため、SVNはおそらく学ぶのに最も役立ちます。
ブレンダンロング

1
ほとんどすべてのバージョン管理システムは、何もないよりも優れています。例外はVSS、RCS、SCCSです。この時代には誰もそれらを使うべきではありません。(実際に誰も使用していなかった場合でも、それは別の話です。)
Donal Fellows 2010年

@Brendan Long:人々は、私が過去2年間働いてきたビジネスで、「これらの新しい分散型VCS」(特に私の場合はgit)を使用しています。
PTBNL 2010年

@Donal Felllows:RCSは私が使用したリストの唯一のVCSですが、RCSを使用する方が何もないよりはましだと思います。新しいものに移したほうがいいというあなたのより広い点に同意します。
PTBNL 2010年

@PTBNL:RCSからCVSへの移行は非常に簡単です。あなたが逃げなければならない主なことは、休暇中に去った誰かによってリポジトリをロックさせることです!CVSよりも優れたバージョン管理システムがあることは間違いありませんが、実際には間違いなく機能します。
ドナーフェロー

1

適切なプログラミングは、経験から大きな恩恵を受ける深いものです。ペアプログラミングは、認識の複数のプロセッサを実行するようなものです...一方が他方から見たものを見落とす可能性があり、それらが通信している限り、それは大きな進歩をもたらす可能性があります。


5
これは質問とは関係ありません。
ダンベン2010年

1
/ disagree-私の考えでは、ペアプログラミングは最も興味深く、多くの場合、「プロジェクトで一緒に作業するプログラマー」の最も生産的なエディションです...これは本質的に問題でした。確かにそれの縮図ですが、確かに私のお気に入りのものです。
Hardryv 2010年

1

まず、チームはリポジトリを使用して作業します(これは、プロのバージョン管理、または「ライブ」ディレクトリと見なされる一連のディレクトリですが、リビジョン管理システムは事実上の標準です)。また、プロジェクトの管理戦略は、作業方法(ウォーターフォール、アジャイルなど)によって異なります。イテレーションで作業する場合は、自立したコンポーネント/プラグイン/モジュール/ライブラリを構築し、サインオフが完了するまで単体テストを実行します。チームとして、あなたはチームで働いています。つまり、プロジェクト全体で同時にどこでも作業するわけではありません。代わりに、プロジェクトのレルム内で実行するタスクを取得します。場合によっては、自分のものではないコードを修正する必要がありますが、それは通常、奇妙な動作が発生したときに発生します。基本的に、開発するパーツのテストを行っています。

これを例に挙げてみましょう。あなたは建設労働者のチームの中にいます。建築家は建物の計画を持って来ます、職長は建設する必要があるものを見て、それから建設業者を雇います。石工は壁を作り、強度をチェックし、うまく接着します。電気技師は建物内のすべての配線を行い、電気が流れるようにします。それぞれの人には自分の仕事があります。時々、電気技師は、特定の壁を彫ることができるかどうかを石工と話し合いたいと思うかもしれませんが、常に職長と協力しています。

これがあなたの助けになることを願っています!


0

通常、ソース管理システムにはソースコードが含まれており、通常はバイナリはありません。ビルドして実行する場合は、コードをチェックアウトしてローカルマシンでビルドします。

一部の場所では、すべてが機能することを確認するためにナイトリービルドを実行しています。サーバー側で実行される自動テストもあるかもしれません。ビルドなどが失敗した場合、誰かに自動的に通知されます。


0

ソース管理を使用する方法の良い紹介は、EricSinkのソース管理HOWTOhttp //www.ericsink.com/scm/source_control.htmlです

彼の例では、SourceGear Vaultを作成して以来使用していますが、メソッドは他のバージョン管理システムにも適用できます。


0

これもまた、オープンソースプロジェクトを検討する必要がある理由の1つです。

大規模なオープンソースプロジェクト(Chromium、Mozilla Firefox、MySQL、Popular Gnu Softwareなど)で働く主要な開発者は専門家です。彼らは多くの経験を持っており、これらのプロジェクトは何百人ものそのような専門家からのアイデアで何年にもわたって進化してきました。

回答で言及されている他のすべて(計画、バージョン管理システム、問題追跡システム、通知システム、ビルドシステム、テストスイートなど)は、これらのオープンソースプロジェクトで見つけることができます。

本当に実践的な経験が必要な場合は、人気のある大きなオープンソースプロジェクトをいくつか実行してから、(バージョン管理を使用して)任意のプロジェクトからソースを取得して自分でビルドすることを強くお勧めします。

PS:私は学生でもあり、オープンソースプロジェクトに参加することは、これまでの人生で最高のことです。私を信じて!あなたも同じように感じるでしょう。


OpenSourceに言及する-それはそれを書く奇妙な方法の1つです-彼らがデータベース接続情報などを含むソースファイルをチェックインするとき、彼らは物事を台無しにしたいかもしれない人々からその情報をどのように保護しますか?
Leo Jweda 2010年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.