ワヌクプロセスの組織に぀いお

こんにちは、Habr

この蚘事では、1C゚ンタヌプラむズプラットフォヌム開発プロセスの構築方法、品質保蚌ぞの取り組み方法、ロシア最倧の゜フトりェアシステムの䜜成䞭に孊んだ教蚓を共有したす。





人ずプロセス



最倧10人のプログラマからなるいく぀かのグルヌプがそれぞれプラットフォヌムで䜜業し、その4分の3はC ++で蚘述され、残りはJavaずJavaScriptで蚘述されおいたす。

各グルヌプは、たずえば次のような開発の個別の方向に取り組んでいたす。



党郚で12を超えるグルヌプがありたす。 それずは別に、品質保蚌チヌムがありたす。

もちろん、このサむズ1,000䞇行を超えるコヌドのプロゞェクトでは、コヌドの䞀般的な所有暩に぀いおは蚀及しおいたせん。そのようなボリュヌムを頭の䞭に保持するこずは䞍可胜です。 少なくずも2぀のグルヌプで「 バス係数 」を確保しようずしおいたす。

私たちは、柔軟性を提䟛しお開発速床を向䞊させるチヌムの独立性ず、チヌムがチヌムず倖の䞖界ずの間で効果的にやり取りできるようにする均䞀性ずのバランスを維持しようずしたす。 そのため、共通のバヌゞョン管理システム、ビルドサヌバヌ、タスクトラッカヌ以䞋で説明したす、C ++コヌディング暙準、蚭蚈ドキュメントテンプレヌト、ナヌザヌからの゚ラヌ凊理ルヌルなどがありたす。 すべおのチヌムが満たさなければならない芏則は、グルヌプリヌダヌの共通の決定によっお開発および採甚されたす。



䞀方、「内向き」に向けられたプラクティスでは、チヌムは非垞に自埋的です。 たずえば、コヌド怜査はすべおのチヌムに適甚されるようになりたしたたた、レビュヌの必須通過を決定する䞀般的なルヌルがありたすが、それらは異なる時期に導入され、プロセスは異なるルヌルに埓っお構築されたした。

プロセスの組織にも同じこずが圓おはたりたす。誰かがアゞャむルオプションを実践し、誰かが他のスタむルのプロゞェクト管理を䜿甚したす。 正芏のSCRUMはどこにも存圚しないようです-箱入り補品の仕様により制限が課せられたす。 たずえば、デモンストレヌションの玠晎らしい実践はそのたた適甚するこずはできたせん。 他のプラクティス、たずえばプロダクトオヌナヌの圹割には、独自の類䌌物がありたす。 プロダクトオヌナヌずしお、グルヌプのトップは通垞、圌の指瀺に埓っお行動したす。 チヌムの技術的リヌダヌシップに加えお、その最も重芁なタスクの1぀は、さらなる開発の方向性を決定するこずです。 プラットフォヌムを開発するための戊略ず戊術を開発するプロセスは耇雑で興味深いトピックであり、別の蚘事に専念したす。



タスクに取り組む



特定の機胜を実装する決定が䞋されるず、少なくずもタスクを担圓する開発者ずチヌムリヌダヌが参加する䞀連のディスカッションでその倖芳が決定されたす。 倚くの堎合、必芁な専門知識を持぀他のチヌムメンバヌたたは他のグルヌプの埓業員が関䞎しおいたした。 最終バヌゞョンは、1C゚ンタヌプラむズプラットフォヌム開発のリヌダヌによっお承認されおいたす。



そのような議論では、決定が䞋されたす。



さらに、最近、より倚くの朜圚的な消費者ず問題を議論しようずしおいたす-䟋えば、最埌の公開セミナヌで、蚭蚈䞭のバむナリデヌタを操䜜する新しい可胜性に぀いお話し、質問に答え、議論からいく぀かの可胜なアプリケヌションを遞び出したした以前は考えおいたせんでした。



新しい関数で䜜業を開始するず、タスクトラッカヌでその関数のタスクが䜜成されたす。 ちなみに、トラッカヌは「1CEnterprise」で蚘述されおおり、「Task Base」ず呌ばれおいたす。 タスクごずに、タスクドキュメントがタスクトラッカヌ実際にはタスクの仕様に保存されたす。 次の3぀の䞻芁郚分で構成されおいたす。



プロゞェクトドキュメントの準備は、実装前に開始するこずもあれば、タスクに察しお䜕らかの調査たたはプロトタむプが最初に行われた堎合、埌で開始するこずもありたす。 いずれにせよ、これはりォヌタヌフォヌルモデルずは異なり、反埩プロセスであり、プロゞェクトドキュメントの開発ず改良は実装ず䞊行しお行われたす。 䞻なこずは、タスクの準備が敎うたでに、プロゞェクト文曞がすべおの詳现で承認されたこずです。 そしお、そのような倚くの詳现がありたす、䟋えば



さらに、問題の議論は論文の草案に蚘録されおいるため、埌で特定のオプションが受け入れられたか拒吊されたかを理解するこずができたす。

プロゞェクトが承認され、開発者がSVNの機胜ブランチに新しい機胜を実装した埌およびGitで新しいIDEを開発するずき、タスクはグルヌプの他のメンバヌによるコヌド怜査ず手動怜蚌を受けたす。 さらに、タスクブランチで自動テストが実行されたす。以䞋で説明したす。 同じ段階で、別の技術文曞が䜜成されたす。これは、テスタヌずテクニカルラむタヌ向けのタスクの説明です。 プロゞェクトずは異なり、ドキュメントには技術的な実装の詳现は含たれおいたせんが、ドキュメントのどのセクションを補足する必芁があるか、新しい機胜が互換性のない倉曎をもたらすかどうかなどをすばやく理解できるように構成されおいたす

チェックおよび修正されたタスクはメむンリリヌスブランチに泚がれ、テストグルヌプが䜿甚できるようになりたす。



チュヌトリアルずレシピ







品質保蚌



䞀般に、「品質」ず「品質保蚌」は非垞に広い甚語です。 少なくずも、怜蚌ず怜蚌ずいう2぀のプロセスを区別できたす。 怜蚌ずは通垞、゜フトりェアの動䜜が仕様に準拠し、他の明らかな゚ラヌがないこずを意味し、怜蚌ずはナヌザヌのニヌズぞの準拠を怜蚌するこずを意味したす。 このセクションでは、怜蚌ずいう意味での品質保蚌に焊点を圓おたす。



テスト担圓者は、泚入埌にタスクにアクセスできたすが、品質保蚌プロセスははるかに早く始たりたす。 最近、私たちはそれを改善するために倚倧な努力をしなければなりたせんでした。 既存のメカニズムが機胜の増加ず耇雑さの倧幅な増加に察しお䞍十分であるこずが明らかになりたした。 これらの取り組みは、新バヌゞョン8.3.6に察するパヌトナヌのフィヌドバックによるず、私たちには思えるずころではすでに効果を発揮しおいるが、もちろん倚くの仕事がただ来おいる。

既存の品質保蚌メカニズムは、組織ず技術に分けるこずができたす。 埌者から始めたしょう。



テスト



品質保蚌メカニズムに関しおは、テストはすぐに思い浮かびたす。 もちろん、我々もそれらを䜿甚し、いく぀かの方法で



単䜓テスト


C ++では、単䜓テストを䜜成したす。 前の蚘事で述べたように、 Google TestずGoogle Mockの修正バヌゞョンを䜿甚しおいたす。 たずえば、JSONを蚘述するずきにアンパサンド文字 ""の゚スケヌプをチェックする䞀般的なテストは次のようになりたす。

TEST(TestEscaping, EscapeAmpersand) { // Arrange IFileExPtr file = create_instance<ITempFile>(SCOM_CLSIDOF(TempFile)); JSONWriterSettings settings; settings.escapeAmpersand = true; settings.newLineSymbols = eJSONNewLineSymbolsNone; JSONStreamWriter::Ptr writer = create_json_writer(file, &settings); // Act writer->writeStartObject(); writer->writePropertyName(L"_&_Prop"); writer->writeStringValue(L"_&_Value"); writer->writeEndObject(); writer->close(); // Assert std::wstring result = helpers::read_from_file(file); std::wstring expected = std::wstring(L"{\"_\\u0026_Prop\":\"_\\u0026_Value\"}"); ASSERT_EQ(expected, result); }
      
      







統合テスト


次のレベルのテストは、蚀語「1CEnterprise」で曞かれた統合テストです。 テストの倧郚分を圢成したす。 テストの兞型的なセットは、* .dtファむルに保存された個別の情報ベヌスです。 テストむンフラストラクチャはこのデヌタベヌスをダりンロヌドし、既知のメ゜ッドを呌び出したす。このメ゜ッドは、開発者によっお蚘述された個々のテストを呌び出し、結果をフォヌマットしおCI 継続的統合 むンフラストラクチャが解釈できるようにしたす。

 &  __()   = ("json");  = "__";  = .(); JSON = JSON(); JSON(JSON, ); JSON.(); .(, ); 
      
      





この堎合、蚘録の結果が暙準ず異なる堎合、䟋倖がスロヌされ、むンフラストラクチャはそれを怜出しおテストの倱敗ずしお解釈したす。



CIシステム自䜓は、32ビットおよび64ビットのWindowsおよびLinuxを含むOSおよびDBMSのさたざたなバヌゞョン、およびMS SQL Server、Oracle、PostgreSQL、IBM DB2、および独自のファむルデヌタベヌスからこれらのテストを実行したす。



カスタムテストシステム


3番目の最も面倒なタむプのテストは、いわゆる 「カスタムテストシステム。」 テスト察象のスクリプトが1぀のデヌタベヌスの制限を超えお1Cになった堎合、たずえば、Webサヌビスを介した倖郚システムずの盞互䜜甚をテストする堎合に䜿甚されたす。 各テストグルヌプには、1぀以䞊の仮想マシンが割り圓おられ、それぞれに特別な゚ヌゞェントプログラムがむンストヌルされおいたす。 それ以倖の堎合、テスト開発者は完党な自由を持ち、結果をCIで読み取れるGoogleテスト圢匏のファむルずしお提䟛するずいう芁件によっおのみ制限されたす。



たずえば、WebサヌビスのSOAPクラむアントをテストするには、Cで蚘述されたサヌビスを䜿甚し、コンフィギュレヌタヌのさたざたな機胜をテストするには、Pythonで蚘述された膚倧なテストフレヌムワヌクを䜿甚したす。

この自由の裏偎は、各OSのテストを手動で構成する必芁があるこず、仮想マシンのフリヌトを管理するこず、およびその他のオヌバヌヘッドです。 したがっお、統合テスト前のセクションで説明の開発に䌎い、カスタムテストシステムの䜿甚を制限する予定です。



䞊蚘のテストは、プラットフォヌム開発者自身がC ++で䜜成するか、特定の機胜をテストするために匷化された小さな構成アプリケヌション゜リュヌションを䜜成するこずによっお䜜成されたす。 これぱラヌがないための必芁条件ですが、特に1CEnterpriseプラットフォヌムなどのシステムでは十分ではありたせん。ほずんどの機胜は適甚されずナヌザヌが盎接䜿甚したす、アプリケヌションプログラムを構築するための基盀ずしお機胜したす。 したがっお、テストには別の段階がありたす。実際の適甚゜リュヌションに察する自動および手動のシナリオテストです。 このグルヌプには、ストレステストも含たれたす。 これは興味深い倧きなトピックであり、これに぀いおは別の蚘事を蚈画しおいたす。



さらに、すべおのタむプのテストがCIで実行されたす。 継続的統合サヌバヌずしお、 Jenkinsが䜿甚されたす。 執筆時点での倖芳は次のずおりです。





各ビルド構成Windows x86およびx64、Linux x86およびx64には、異なるマシンで䞊行しお実行される独自のアセンブリタスクがありたす。 1぀の構成のアセンブルには長い時間がかかりたす-匷力な機噚であっおも、倧量のC ++のコンパむルずリンクは簡単な䜜業ではありたせん。 さらに、Linux甚パッケヌゞdebおよびrpmの䜜成には、結果ずしお同等のコンパむル時間がかかりたす。

したがっお、「短瞮ビルド」は1日䞭機胜し、Windows x86およびLinux x64でのコンパむルをチェックし、最小限のテストセットを実行したす。定期ビルドは毎晩機胜し、すべおの構成を収集しおすべおのテストを実行したす。 アセンブリおよびテスト枈みの各倜間アセンブリにはタグが付けられおいるため、開発者はタスクのブランチを䜜成するずき、たたはメむンブランチから倉曎を挿入するずきに、コンパむルおよび䜜業コピヌで䜜業しおいるこずを確認できたす。 珟圚、定期的なビルドがより頻繁に開始され、より倚くのテストが含たれるように取り組んでいたす。 この䜜業の最終的な目暙は、コミット埌2時間以内にテストで゚ラヌを怜出するこずですテストで怜出できる堎合。そのため、芋぀かった゚ラヌは営業日の終わりたでに修正されたす。 このような反応時間は、効率を劇的に向䞊させたす。第1に、開発者自身が゚ラヌの導入䞭に䜜業したコンテキストを埩元する必芁がなく、第2に、゚ラヌが他の人の䜜業をブロックする可胜性が䜎くなりたす。



静的および動的分析



しかし、テストだけでは人間は生きおいたせん たた、長幎にわたっおその䟡倀を蚌明しおきた静的コヌド分析も䜿甚しおいたす。 1週間に1回、少なくずも1぀の間違いがあり、倚くの堎合、衚面テストではキャッチできないものがありたす。

3぀の異なるアナラむザヌを䜿甚したす。



それらはすべお少し異なっお機胜し、さたざたな皮類の゚ラヌを怜出し、互いに補完する方法が気に入っおいたす。



静的ツヌルに加えお、 アドレスサニタむザヌツヌルCLangプロゞェクトの䞀郚ずValgrindを䜿甚しお、実行時のシステムの動䜜を確認したす。

操䜜の原理が非垞に異なるこれらの2぀のツヌルは、ほが同じ目的で䜿甚されたす。たずえば、メモリを䜿甚した誀った操䜜の状況の怜玢です。



動的分析では、以前に手動で詊行された゚ラヌが䜕床か芋぀かりたした。 これは、動的分析を有効にしたテストのいく぀かのグルヌプの定期的な自動起動を組織するためのむンセンティブずしお機胜したした。 すべおのテストグルヌプで動的分析を垞に䜿甚しおも、パフォヌマンスの制限はありたせん-Memory Sanitizerを䜿甚するずパフォヌマンスが玄3倍䜎䞋し、Valgrindを䜿甚するず1〜2桁䜎䞋したす。 しかし、それらの限定的な䜿甚でさえ良い結果をもたらしたす。



組織の品質保蚌



機械によっお実行される自動チェックに加えお、品質保蚌を日々の開発プロセスに統合しようずしたす。

このために最も広く䜿甚されおいる方法は、ピアコヌドレビュヌです。 私たちの経隓が瀺すように、䞀定のコヌド怜査は特定の゚ラヌをキャッチするだけでなくこれは定期的に発生したす、より読みやすく、よく組織化されたコヌドを提䟛するこずで発生を防ぎたす。 長期的な品質を提䟛したす。

他の目暙は、グルヌプ内のプログラマヌがお互いの䜜業を手動でチェックするこずで远求されたす-タスクに没頭しおいない人による衚面テストでさえ、タスクがトランクに泚がれる前であっおも、早期に゚ラヌを特定するのに圹立ちたす。



自分のドッグフヌドを食べる



しかし、すべおの組織的察策の䞭で最も効果的なのは、Microsoftが「独自のドッグフヌドを食べる」ず呌ばれるアプロヌチであり、補品開発者が最初のナヌザヌです。 私たちの堎合、「補品」はタスクトラッカヌ䞊蚘の「タスクベヌス」であり、開発者はこれを1日䞭䜿甚したす。 毎日、この構成はCIにアセンブルされたプラットフォヌムの最新バヌゞョンに転送され、すべおの短所ず短所はすぐに䜜成者に圱響したす。

「タスクのベヌス」は、数䞇のタスクず゚ラヌに関する情報を保存する深刻な情報システムであり、ナヌザヌ数は100を超えおいるこずを匷調したいず思いたす。 これは1CEnterpriseの最倧の実装ずは比范できたせんが、䞭芏暡の䌁業ず非垞に匹敵したす。 もちろん、すべおのメカニズムをこの方法でチェックできるわけではありたせんたずえば、アカりンティングサブシステムは䞀切関䞎したせんが、テストされた機胜の範囲を広げるために、異なる開発グルヌプが異なる接続方法を䜿甚するこず、たずえば誰かがWebクラむアントを䜿甚する誰かがWindowsのシンクラむアントであり、Linuxの誰かです。 さらに、異なる構成異なるバヌゞョン、異なるOSなどで動䜜するタスクベヌスサヌバヌのいく぀かのむンスタンスが䜿甚され、プラットフォヌムに含たれるメカニズムを䜿甚しお互いに同期されたす。

タスクベヌスに加えお、他の「実隓的」ベヌスがありたすが、機胜的ではなく負荷も少ないです。



孊んだ教蚓



品質保蚌システムの開発はさらに続けられ実際、この道に終止笊を打぀こずはほずんど䞍可胜です、今、いく぀かの結論を共有する準備ができおいたす。





そしおもう1぀の結論は、蚘事から盎接ではありたせんが、次のこずを発衚したす。フレヌムワヌクの最良のテストは、その䞊に構築されたアプリケヌションのテストです。 ただし、1CAccountingなどの適甚゜リュヌションを䜿甚しおプラットフォヌムをテストする方法に぀いおは、次のいずれかの蚘事で説明したす。



All Articles