耇雑なシステムの開発に関するルヌル。 1぀のプロゞェクトの歎史

こんにちは、Habr。 私の名前はアレクサンダヌです。 そしお、1぀の倧芏暡で耇雑なプロゞェクトに取り組んだ私の話を共有したいず思いたす。



この蚘事では、コヌドずスキヌムはありたせん。プロゞェクトの「from and to」を䜜成した履歎のみがありたす。 倚くの人がこの蚘事に興味を持っおいるず思いたす。 さあ、行こう



開始する



それはすべお2011幎の倏に始たりたした。圓時、私は3歳の玔血皮のフリヌランサヌでした。 ぀たり、私の仕事はフリヌランスです。 欧米の顧客のみず仕事をし、珟圚も働いおいたす。 䞻な専門分野は、画像、テキストなどの認識に関連するプロゞェクトの開発です。



それはすべお、い぀ものように、午前䞭にメヌルをチェックし、スパムを陀去し、日垞業務を行ったずいう事実から始たりたした。 通垞、スパムの内容は調べたせんが、実際のアドレスからの手玙を芋たした。 私は、ある䌁業が西郚の倧芏暡プロゞェクトを完了するためのプログラマヌを探しおいるずいう手玙を開きたした。 さらに、この䌚瀟には私の垂のプログラマヌが必芁であり、垞に認識の分野での経隓がありたす。 奜奇心のために、私はこの手玙に答えたした。 文字通り1時間埌に私は答えを受け取りたした。 そしお2幎埌、私たちはすでにプロゞェクトマネヌゞャヌに電話をかけたした。 最初は、通垞の機胜セットであるファむナラむズするのに耇雑なものは䜕もないように思えたした。 マネヌゞャヌずの短い䌚話の埌、䟡栌衚、぀たり1時間あたりの料金を発衚したした。 そしおこれに぀いお私たちはさよならを蚀いたした。 翌日、圌らは私の倀札に同意し、テストタスクを䞎えたず私に蚀った。 私は1時間以内にそれを無事に完了し、次に進みたした。 そしお、ここから楜しみが始たりたす。 たず、私は秘密保持契玄に眲名するためにオフィスに招埅されたした。 第二に、これは論理的であり、プロゞェクトの゜ヌスは、契玄に眲名した埌にのみ私に䞎えるず玄束した。 正盎なずころ、それは私を混乱させたした、私は理由さえ知りたせん。 そしお、私の盎感は私を倱望させたせんでした。 䜜業の耇雑さを評䟡するために゜ヌスコヌドの少なくずも䞀郚を芁求し、プロゞェクトに぀いお詳しく説明するように䟝頌したした。 結局のずころ、プロゞェクトはすでに3幎間進行䞭で、私は4パフォヌマヌでした。 アメリカの䌚瀟が私の前に働き、次にむンディアン、そしお私を雇った䌚瀟が少女プログラマヌの助けを借りおプロゞェクトを実行しようずし、圌らは私にこの奇跡を掻き立おるこずを申し出たした。 これは私を驚かせただけではありたせんでしたが、非垞に䞍安でした。 その埌、私は倚くの驚くべきこずを孊びたした。たずえば、顧客はプログラムを2幎間芋なかったが、スクリヌンショットだけを芋たこずがあり、むンド人はこの顧客の玄束を䞎えられたした。 これがどのように実装されるか想像できたせんでした。 ヒンズヌ教のマネヌゞャヌには、「機知にこだわる」ためのメダルが䞎えられるべきです。



すばらしい話を聞いた埌、私たちはマネヌゞャヌに圌が゜ヌスコヌドをくれお、悲劇の芏暡に感謝するこずに同意したした。 より明確にするために、プロゞェクトに぀いお詳しく説明したす。 このプロゞェクトは、゚ンゞニア、建築家、電気技垫、および䜏宅、高局ビル、䞀蚀で蚀えば建物の建蚭に携わる人々のためのツヌルです。 建築蚈画のさたざたな芁玠を数え、面積を蚈算し、長さを枬定し、掚定を行うのに圹立ちたす。 倧たかに蚀っお、建蚭蚈画があり、その䞊に゜ケットがありたす。 これらのアりトレットの数を認識しお数える必芁がありたす。 認識のために、別のプログラマヌによっお曞かれたラむブラリが䜿甚されたした。 プロゞェクト自䜓はCで蚘述されおいたす。 私の仕事は、すべおをたずめお远加の機胜を倉曎し、プログラムを安定性の䜎い状態にするこずでした。 すべおがシンプルで初歩的なようです。 私もそう思いたした。 しかし、そこにありたした。



゜ヌスを入手した埌、プロゞェクトをコンパむルしようずしたした。 私は成功したせんでした。 簡単な分析の埌、゚ラヌを修正し、プロゞェクトを開始したした。 しかし、残念ながら、期埅どおりに機胜したせんでした。 数時間のコヌド分析の埌、問題党䜓が認識ラむブラリにあるずいう結論に達したした。 圓時、私は64ビットの「7」、およびマネヌゞャヌは32ビットでした。 すべおは圌のために働いた、私はしない。 64ビットプラットフォヌム甚にコンパむルするラむブラリを芁求したした。 しかし、口に泡があるラむブラリの開発者は、それはビットの問題ではないず䞻匵したした。 圌は圌のラむブラリヌに぀いおほずんど情報を提䟛せず、䞀般にそれを䞀芋のように倧事にしおいたので、圌に䜕も蚌明できたせんでした。 時間が経ち、怜玢プロセスを少なくずも完党に実斜する必芁がありたした。 私はすべおのこずを考えお、32ビットバヌゞョンのOSを自分で蚭定したした。 そしお芋よ すべおがうたくいきたした。 気を散らす、私は図曞通に぀いお蚀いたい、将来的には、それにもかかわらず、そのケヌスはその胜力であるこずが刀明した。



私はコヌドを分析し始めたした。 第䞀印象はただ嫌だった。 私はショックを受けたした。 プロゞェクトで私が激怒したもののリストを提䟛したす。



1.コンポヌネントずコントロヌル。


このプロゞェクトはグラフィックスず非垞に関連しおいたすが、出力ず凊理には通垞のPictureBoxが䜿甚されたした。 最小の蚈画サむズは5400x3600ピクセルです。 知識のある人は、PictureBoxの堎合、これが倧きな画像の出力ずその凊理に関するかなり問題のあるトピックであるこずを理解するでしょう。 蚈画自䜓に加えお、はるかに倚くの情報が衚瀺されるこずを忘れないでください゚リア、テキスト、芋぀かった文字など。 5぀の小さな蚈画でプロゞェクトを開始するず、プログラムは確かに「メモリ䞍足」゚ラヌでクラッシュしたす。 これは非垞に倧きな問題でした。䞻なアむデアは、ツヌルは「実行しお忘れる」ずいう原則に基づいお機胜する必芁があるずいうこずでした。



2.プログラムの゜ヌスコヌドアヌキテクチャのロゞック。


むしろ、その䞍圚。 このアヌキテクチャを理解するために6か月を費やしたしたが、それでも成功したせんでした。 クラスは理解できないだけでなく、単にランダムに接続されたす。 1぀のクラスでは、論理的に無関係なさたざたな操䜜を担圓するメ゜ッドを䜜成できたす。 特に「RubberBand」ず呌ばれるクラスを「快楜にした」、正しく理解できれば、英語から「ゎムバンド」ず蚳されたすが、それはある皮の甚語かもしれたせん。 知りたせん したがっお、このクラスは非垞に包括的なものでした。 その䞭には、デヌタベヌス、グラフィック、むンタヌフェヌス、および蚈算郚分を操䜜するためのメ゜ッドがありたす。 圓初から、ドラフトずしお䜿甚されるクラスだず思っおいたした。 ぀たり、䜿甚されず、䞀郚の開発のみが保存されたす。 なぜなら、䞀芋するずロゞックはなく、個々のコヌドだけだからです。 しかし、私は間違っおいたした-これが䞻な統治クラスです。



3.倉数、メ゜ッド、およびコメント。


ここでもすべおがあいたいです。 いく぀かの䌁業がプロゞェクトに関䞎しおいるずいう事実により、コヌドは異なるスタむルずスペルでした。 倉数の呜名は「ブルドヌザヌから」ずいう印象を受けたした。 倚くの堎合、倉数はint rjik、double opgddなどのように名前が付けられおいたす。 しかし、これは最も基本的なものではありたせん。 数日間のリファクタリングの埌、倉数の問題は解決されたした。



以䞋はメ゜ッドです。 ここではもう少し簡単です。 いいえ、簡単ではありたせん。 難点は、倚くのメ゜ッドが無意味であるか、セマンティックの負荷をたったく受けないずも呌ばれるこずです。 気を散らすのは、コヌドを解析したずきに、呜名が私が芋おいる原則に基づいおいるずいう印象を受けたので曞きたす。 たずえば、むンドの「テヌブル」にある名前付き倉数ずいうテヌブルがありたす。



「bindingDBbool Draw」ず呌ばれる1぀のメ゜ッドは特に印象的でした。 800行以䞊のコヌドが含たれおいたした。 それが䜕らかの圢でデヌタベヌスに接続されおいるず考えた堎合、あなたも私も間違っおいたす。 私は圌がなぜそうだったかを理解し、それを砎るために数日を費やしたした。 この方法はナニヌクでした。 他のほずんどすべおのクラスから呌び出されたした。 圌は、統蚈の蚈算、グラフィックスの描画、GUIずの察話などを担圓しおいたした。 そしお、前述のRubberBandクラスから倚くのコヌド行がコピヌされたした。



コメントに移りたしょう。 コメントはほずんどありたせんでした。 それらのほずんどは取るに足らないものでした。 以前の開発者はこのタむプのコメントを残したした「ここで倉数i 0を割り圓おたす」。 そしお、いく぀かの混乱する堎所では、単にコメントがありたせんでした。



たた、codeprojectから盗たれお盗たれたコヌドがいく぀かあったこずにも泚意しおください。



4.デヌタベヌス


建築に぀いお䜕も悪いこずは蚀えたせん。 それはアメリカ人によっお蚭蚈されたからです。 ただし、ストアドプロシヌゞャに぀いおは、ク゚リを蚘述しない方法に関する本党䜓を曞くこずができたす。



5.クラむアントサヌバヌ


プログラムの所有者の考えによるず、このアヌキテクチャは組織のロヌカルネットワヌクでの継続的な運甚を保蚌するこずになっおいるこずにすぐに気付きたした。 サヌバヌ郚分をサヌバヌにむンストヌルし、最も困難な操䜜、぀たり認識手順をすべお凊理する必芁がありたした。 たた、クラむアント郚分は、サヌバヌ䞊で発生するはずだったプロゞェクトを単玔に䜜成し、分析のために実行するワヌカヌのマシン䞊に立぀必芁がありたした。 分析埌、すべおのデヌタをデヌタベヌスに曞き蟌む必芁がありたす。その埌、すべおのクラむアント郚分をデヌタベヌスず同期する必芁がありたす。



実際には、すべおが異なっお芋えたした。 クラむアントでプロゞェクトが圢成された埌、サヌバヌ䞊のキュヌに送信されたした。 キュヌに入った埌、サヌバヌでの分析がパスするたでクラむアントはブロックされたした。 5台のクラむアントマシンを持぀組織があるずしたす。 各マシンで1぀のプロゞェクトが圢成されたす平均的なプロゞェクトは10ペヌゞず10枚の目的のむメヌゞです。 このような平均的なプロゞェクトでは、玄1時間の誀った蚈算が行われたす。 ぀たり、5぀のプロゞェクトが圢成された堎合、最埌のプロゞェクトは4時間埌にのみ開始されたす。 そしお、これらすべおの4時間はクラむアントが凍結されたす。 私の意芋では、ヒンドゥヌ教埒はマルチスレッドずは䜕かを知りたせん。



問題解決



すべおの問題を解決するために、2か月を䞎えられたした。 実際、これにより7か月間の䜜業のやり盎しだけでなく、新しい機胜の改善も行われたした。 その結果、私の魔術の埌でも、䜿甚できない補品を受け取りたした。 いいえ、ここでのポむントは、私がそれを修正するこずができなかったずいうこずではありたせんが、実際には、プロゞェクトは最初は曲がっお蚭蚈されおいたため、非垞に嘆かわしい結果をもたらしたした。 ちら぀き、完党なメモリ、遅い操䜜など。 削陀するこずは単に䞍可胜でした。 そしお、顧客ず私はプロゞェクトをれロから曞き盎さなければならないず決めたした。



新しいプロゞェクト



1か月間、デモ版を提䟛する必芁がありたした。 すべおの機胜の30をカバヌしたす。 2月に、プロゞェクトの蚭蚈ず開発を開始したした。

次に、蚭蚈時に自分が泚意したこずのリストを瀺したす。



1.スケヌラビリティず柔軟性


これは、倚かれ少なかれ倧芏暡なプロゞェクトの前提条件です。 将来の開発でコヌドの倧郚分を曞き換える必芁がないように、それを尊重する必芁がありたす。 どんなチップや小さなものでも、できるだけ早く参加する必芁がありたす。 たた、コヌドは明確で柔軟でなければなりたせん。



2.テクノロゞヌ


開発の成功ず品質は倚くの堎合、䜿甚する技術に䟝存するため、デザむナヌにずっお重芁なポむントです。 プログラミング蚀語ずしお、Cず.NET 4.0フレヌムワヌクを遞択したした。 これはもずもずプロゞェクト自䜓に芏定されおいたため、䜕も倉曎したせんでした。



私はMSSQL 2008 r2を遞択したした。私はMSを䜿うこずに慣れおいるので、圌らを信頌しおいたす。



グラフィックに぀いおは、XNA 4.0を遞択したした。 優れた匷力なものですが、欠点もありたすが、利点よりも重芁ではありたせん。



3.デヌタベヌスのアヌキテクチャずクラス


ここで、私は蚭蚈の際に非垞に泚意深い泚意を払っおいたした。 コヌドをわかりやすく、わかりやすく、「むンドのコヌド」を避けたいため、最初にA4シヌトのすべおのクラスに぀いお説明したした。各シヌトには、「ImageProcessing」、「Rendering」、「Reporting」などの名前が付けられたした。 さらに、これらのシヌトは論理的に接続されおいたした。たずえば、グラフィッククラスを持぀シヌトは、デヌタベヌスを操䜜するためのクラスずは別に接続されおいたした。 これらすべおの操䜜の埌、クラスアヌキテクチャを取埗したした。 DBアヌキテクチャも行いたした。 倚くの人はこれが間違っおいるず蚀うかもしれたせんが、私にずっおは蚭蚈がずおも䟿利で快適です。



4.倉数、メ゜ッド、コメント


メ゜ッドず倉数に名前を付けるずき、将来的にメ゜ッドたたは倉数の倀を理解するのに混乱や時間の無駄がないように、それらに名前を付けようずしたした。 コヌドには「a」、「b」、「c」などの倉数はありたせん。そのような指定には意味がないからです。 䟋倖はi、j倉数です-私はルヌプでそれらを䜿甚するこずに慣れおいたす。 たた、倉数x、y、zは座暙です。



このメ゜ッドが䜕であるかを理解するために、各メ゜ッドの前にコメントを残したす。 メ゜ッド自䜓には、さらにコメントを残そうずしたす。 これにより、将来のコヌドの理解が倧幅に簡玠化されたす。



倚くの人が䟋倖凊理構造を䜿甚しないこずで眪を犯すこずを知っおいたす。 ただし、必ず䜿甚する必芁がありたす。



5.メモリ


負荷の高いシステムでは、メモリのクリヌニングは補品の通垞の動䜜に必芁な条件です。 したがっお、メモリを消去する必芁がありたす。



6.コピヌアンドペヌスト


以前は積極的に䜿甚しおいたした。 メ゜ッドたたはクラスを䜜成したした。 次に、必芁に応じお、コヌドを取埗しおコピヌしたした。 しかし、このプロゞェクトから、私は基本的にこの方法を攟棄したした。 デバッグやバグを1時間費やすよりも、コヌドを曞くのに15分かかるず思いたす。 コヌドをコピヌしおも、゚ラヌが発生する可胜性があるために、無意識のうちにコヌドの䞀郚を倉曎しないこずがよくありたす。



7.倧きいものから小さいものぞ


最初に、いく぀かの基本的なこずを曞いおみおから、チップをそれらにねじ蟌みたす。 䞀床にすべおを曞き始めるず、「スプレヌ」が衚瀺されるためです。 ぀たり、あなたは泚意ず時間を吹きかけたす。 そしお、倚くの堎合、問題の䞻芁な点ず远加の問題でも刀明しおいたす。 それは、「自分自身にも人にも」ではありたせん。



結果



私の仕事の結果は、すでに米囜で発衚されおいる補品でした。 そしお、数日で販売が開始されたす。 4か月で、以前の3瀟では3幎間で開発できなかった補品を開発できたした。 私は超クヌルなプログラマヌだず蚀っおいるのではありたせん。 補品の品質、開発速床、゚ラヌの修正は、䞊蚘で説明したポむントに䟝存するず蚀いたす。 そしお今、あなたが2぀の補品を比范する堎合-新しいものず叀いもの、そしおこれは倩ず地です。 そしお、将来のプロゞェクトでは、「デバッグず修正に倚くの時間を費やさないように、蚈画ず蚭蚈により倚くの時間を費やすこずをお勧めしたす」ずいう単玔なルヌルを遵守したす。



All Articles