゜フトりェアのオヌバヌ゚ンゞニアリングに぀ながる10個のバグ

星間距離、宇宙の゚ントロピヌ、ビゞネス゜フトりェアの芁件など、時間の経過ずずもに増加するこずが保蚌されおいたす。 倚くの蚘事は「耇雑にしないでください」ず曞いおいたすが、その理由や方法を曞いおはいけたせん。 10の明確な䟋を瀺したす。



1.゚ンゞニアはよく知っおいる


私たちの゚ンゞニアは、自分自身を最も賢い人だず考えおいたす。 たあ、私たちはさたざたなものを䜜成するからです。 そしお、この゚ラヌはしばしば過剰な゚ンゞニアリングに぀ながりたす。 100個のモゞュヌルを蚈画および構築しおいる堎合、ビゞネスは垞に101番目のモゞュヌルを芁求したす。 あなたがあなたの匷さを集めお1000の問題を解決するず、圌らはあなたのずころに来お、テヌブルに10,000の新しいものを配眮したす。 あなたはすべおが制埡されおいるず思いたすが、実際には、道路が明日あなたを導く方向を想像するこずさえできたせん。



画像



プログラマヌずしお働いた15幎間で、ビゞネスの問題が完党で安定した゜フトりェア芁件であるこずを䞀床も芋たこずがありたせん。 それらは垞に倉化し、拡倧したす。 そしお、これはビゞネスの性質であり、それを管理する人々の間違いではありたせん。



道埳 カゞノビゞネスは垞に勝ちたす。



2.ビゞネス機胜の再利甚


ビゞネスがたすたす倚くの芁件を予想どおり投げるずき、私たちは時々、「OK、可胜性のあるすべおをグルヌプ化しお芁玄しよう」ず蚀いたす。



画像



これが、ほずんどのMVCシステムがBig ModelたたはFat Controllerで終わる理由です。 しかし、すでにわかっおいるように、ビゞネス芁件が远加されるこずは決しおありたせん。぀たり、これはどこぞも行かないこずを意味したす。 実際、次のように応答する必芁がありたす。



画像



䟋 顧客の1人に察しお䞀床、ナヌザヌプロファむルモゞュヌルを開発したした。 叀兞的なCRUDコントロヌラヌから始めたした。それは単なるナヌザヌプロファむルであり、すべおがシンプルである必芁があるためです。 すべおは、このプロファむルを䜜成および入力するための13の異なるシナリオの実装で終わりたした。゜ヌシャルネットワヌクを介した登録、定期的、簡略化、その埌の線集による迅速化、サブサむトの非垞に異なる倖芳など。 圌らはお互いにほずんど共通点がありたせんでした。 「泚文の衚瀺」ず「泚文の線集」のシナリオも同様に異なりたす。

たず、ビゞネス機胜を氎平に分割する前に、垂盎に分割しおみおください。 モノリスをマむクロサヌビスに分割する䜜業も簡単になりたす。 堎合によっおは、モノリシックになったり、サヌビスでモノリシックになったりするこずもありたす。 そうしないず、システムの䞀郚を倉曎するこずがたすたす困難になりたす。



道埳 孀立したアクションを奜む、結合を避けたす。



ヒント プログラムのナヌザヌに芋える郚分を取りたすフォヌム\ペヌゞ\コマンド。 プログラマヌは、それに関連するすべおのコヌドを理解するためにいく぀のコンテキストスむッチを必芁ずしたすか



3.すべおを䞀般化する


前の段萜ず倚少䌌おいたすが、時にはそれずは独立しお発生したす





時々、゚ンゞニアが持ち蟌みたす。 ビゞネス䞊の問題を解決する代わりに、適切な芪クラスを遞択するこずに時間を費やしたす。 そしお答えは簡単です。



画像



゜フトりェアアヌキテクチャは垞にビゞネス芁件に远い぀きたす。 そのため、今日䜕らかの魔法の助けを借りお完璧な抜象化を芋぀けたずしおも、その有効期限はすぐに来たす-䞊蚘のポむント1を参照-ビゞネスは垞に勝ちたす。 したがっお、アヌキテクチャのビルド品質の最適な尺床は、アヌキテクチャをどれだけ迅速に分解できるかです。 倉曎が簡単ではなく、簡単に削陀できるコヌドの蚘述方法に関する玠晎らしい蚘事がありたす。

道埳 コヌドの耇補は、誀った抜象化よりも優れおいたす。



さらに、コヌドの耇補は、非垞に正確な抜象化を芋぀けるのに圹立぀堎合がありたす。 なぜなら、同じコヌドを同じ方法で䜿甚しおいるシステムの耇数の郚分を芋るず、それらが䞀䜓ずなっおいるものを理解できるからです。 抜象化の品質は、最も匱いリンクの品質によっお決たりたす。 コヌドを耇補するこずにより、さたざたな角床からさたざたな状況を芋お、抜象化の境界をより明確に芋るこずができたす。



4.すべおの倖郚ラむブラリのラッパヌを曞く


䜿甚する倖郚ラむブラリごずにラッパヌラッパヌを䜜成する習慣がありたす䞻に䞻な補品のスタむルに埓うため、堎合によっおは前の2぀の段萜で説明した理由のため。 ゚ンタヌプラむズプログラミングで非垞に䞀般的なアプロヌチ。 Node / Ruby / Pythonのような動的蚀語のプログラマヌは、ラむブラリを远加しお䜿甚を開始するだけです。 しかし、゚ンタヌプラむズ開発者はそのために行くこずができたせん-圌はラッパヌを䜜成する必芁がありたす。 そしお、ラッパヌの別のラッパヌ。 おそらく、これはほずんどのラむブラリがミッシュマッシュであり、オヌプン゜ヌスコヌドがそれほど倚くなかった2000幎代に意味をなすものでした。



しかし、今日は2016幎です。 倖郚ラむブラリヌが倧幅に改善されたした。 圌らはただ幻想的になりたした。 ほずんどの堎合、優れたプログラマヌによっお䜜成され、メむンコヌドよりも優れたテストが行​​われおいたす。 それらには明確なAPIがありたす。 それらにログむンを埋め蟌むこずができたす。 すでに優れたコヌドのラッパヌを曞くのに時間を費やす必芁はありたせん。 さらに、ほずんどのラッパヌは完党に無意味です。 それらのむンタヌフェヌスは、以䞋のラむブラリず非垞に密接に関連しおおり、倚くの堎合、1察1の機胜を反映した圢になっおいたす。 ラむブラリが将来倉曎される堎合、このラッパヌを䜿甚するコヌドのほずんども倉曎する必芁がありたす。 たずえば、ラむブラリを完党に眮き換えお別のラむブラリに眮き換える堎合でも倉曎されない「䞍可知な」ラッパヌを䜜成するこずは、簡単な䜜業ではありたせん。 そのようなタスクは、䞀般的な゜リュヌションの朜圚的な「構成可胜性」の考えずずもに提起されるこずがありたす。そのアむデアに぀いおは、以䞋で説明したす。



道埳 ラッパヌは䟋倖であり、暙準ではありたせん。



5.コヌド品質メトリックのブラむンドアプリケヌション


コヌド品質の抂念に䞍泚意に埓うずすべおの倉数を「private final」ずしお宣蚀する必芁があり、各クラスにむンタヌフェむスが必芁になるなど、コヌドが自動的に適切になりたせん。 FizzBu​​zzたたはHello Worldの ゚ンタヌプラむズ版をただ芋おいない堎合はチェックしおください。 画期的なコヌド。 ミクロレベルでは、各クラスは固い原則に埓っおおり、優れたパタヌンを䜿甚しおいたす。 このコヌドにコヌド品質分析ツヌルを蚭定するず、それは玠晎らしい補品であり、目が痛くなるずいうこずです。 ただし、䞀歩埌退するず、このプログラムが悪倢であるこずがすぐにわかり、「Fizz Buzz」ず印刷されるだけです。



道埳 垞に䞀歩埌退し、党䜓像を芋おください。



同様に、自動化ツヌルはコヌドのテストカバレッゞを適切に定矩したすが、必芁なものをテストしおいるかどうかに぀いおは絶察に蚀いたせん。 圌らはいく぀かのテストでパフォヌマンスを枬定できたすが、別のケヌスではプログラムがデヌタをどれだけうたく凊理しおいるかはわかりたせん。 圌らはすべおミクロレベルを芋おいたすこのクラス\メ゜ッド\文字列は䜕をしたすか そしお、党䜓像を芋るのは人間だけです。



別のプログラミング蚀語を孊び、すでに知っおいる問題を解決するためのさたざたなアプロヌチを詊しおください。 これにより、非垞に優れたプログラマヌになりたす。 1぀のこずだけにこだわらないでください。



5.1。 サンドむッチ局


密接に関連するいく぀かの機胜を取り䞊げお、それを10〜20のレむダヌに分割したす。各レむダヌは、他のレむダヌなしでは意味を持ちたせん。 それは、「テスト可胜なコヌド」たたは「共有責任の原則」の抂念を実装するか、それを他のファッショナブルなものず呌びたいからです。 過去には、これは継承によっお行われおいたした。 クラスAはBから継承し、BはCから継承したす。



画像



今日、人々は同じこずをしおいたす。ただし、SOLIDがあるため、各クラスはむンタヌフェむス/クラスのペアで衚され、次のレむダヌに挿入されたす。



画像



道埳 抂念は思慮深いアプリケヌションを必芁ずしたす。 それらは、ツヌルのように、どこでも垞に䜿甚するこずはできたせん。



6.新しい症候矀


ゞェネリック医薬品の研究。 これで、単玔な「HelloWorldPrinter」が「HelloWorldPrinter <String、Writer>」になりたす。

本圓に必芁なフォヌムが垞に同じデヌタ型でむンスタンス化される堎合、ゞェネリックを䜿甚する必芁はありたせん。 ほずんどの堎合、パラメヌタヌで十分です。



戊略パタヌンを研究したした。 これで、すべおのifステヌトメントが戊略になりたす。

なんで



DSLを曞くこずを孊びたした。 今、私たちはどこにでもすべおのためにDSLを持っおいたす。

たあ、私も知りたせん...



モキが芋぀かりたした。 今、私たちはすべおに沿っおチェヌンされたす。

たあ...



メタプログラミングは玠晎らしいこずです。ここずここで䜿っおみたしょう

理由を説明しおください...



拡匵メ゜ッド\コンセプト\䜕か他のものは良いこずです。

そしお、やめたしょう



道埳 䜕もどこにでも垞に適甚する必芁はありたせん。 たた、「道埳」セクションも各段萜に曞かれおはなりたせん。



7.「X – st」






あいたい。 垞に。 議論するのは難しいです。

䟋1 CMSを䜜成しお、クラむアントがこのフォヌム自䜓にフィヌルドを远加できるようにしたす。

結果 顧客はそれを決しお䜿甚したせん。 必芁に応じお、開発者を芋぀けお困惑させたす。 おそらく、本栌的なCMSの代わりに、フィヌルドをすばやく远加する方法に぀いおの短い説明をスケッチする䟡倀がありたした。



䟋2 「蚭定可胜性」を簡玠化するために、デヌタベヌスを操䜜するための倧きなレむダヌを蚭蚈したしょう。 1぀の構成ファむルを線集しお、デヌタベヌスを倉曎できるはずです。

結果 10幎以䞊の䜜業で、客芳的な理由で1぀のデヌタベヌスを別のデヌタベヌスに倉曎する必芁があるプロゞェクトが1぀だけ芋られたした。 そしお、そのこずになるず、「1぀の構成ファむルを線集する」こずは䜕もしたせんでした。 関連する仕事がたくさんありたした。 非互換性、機胜のギャップ。 そしおもう䞀床、クラむアントがデヌタモデルの半分を新しいNoSQLデヌタベヌスに転送するように芁求したした。 デヌタベヌス接続を備えた「マゞックファむル」がありたしたが、最初はリレヌショナルのみで、2番目はすべおではなく、半分ではありたせん。 おそらく、20人のプログラマヌを雇うようなコストのOraklovデヌタベヌスのようなものになるず、これらの構成可胜性のあるダンスはすべお理にかなっおいたす。 しかし、珟代のデヌタベヌスに必芁なのは、広い氎平ORMレむダヌではなく、単玔な垂盎DAOクラスのセットだけです。 SQLずNoSQLをうたく組み合わせた単䞀のモデルはないので、互換性のないひどい間違った抜象化を組み合わせようずするのではなく、それぞれのケヌスでどちらかを䜿甚しお実際に分離する必芁がありたす。



䟋3 ゚ンタヌプラむズクラむアント甚のOAuth認蚌システムを構築したした。 このシステムの管理者向けに、Google OAuthによる管理者の承認ずいう別のレベルを远加するよう求められたした。 「安党なはずだから」 誰かが私たちのOAuth認蚌に䟵入した堎合、少なくずも管理者アカりントを䜿甚䞍可にする必芁がありたす。 Google OAuthは信頌できるものなので、ここで気にする必芁はないようです。

結果 このシステムをハッキングしたい人は、OAuthレむダヌを突砎する必芁はたったくありたせん。 この脆匱性はもっず簡単なもので芋぀けるこずができたす垞にそうです。 その結果、2レベルのOAuthをサポヌトするすべおのコストおよびそれらはシステム党䜓を通過したしたはほずんど結果をもたらしたせんでした。 この時間を費やしお、䞀般的な脆匱性を修正するこずをお勧めしたす。



画像



道埳 これらの特性のすべおを、「-st」で終わるものを䞍倉の指定ずしお受け取らないでください。 それらには䟡栌がありたす-シナリオ\履歎\䜿甚法を明確に定矩しおください。



8.自転車の建蚭


最初はい぀もクヌルです。 しかし、数幎埌にはすでに遺産の貚物になりたす。

いく぀かの䟋





䜕が悪いのか





道埳 再利甚。 善を借りる。 決定を確認したす。

自転車を䜜るこずに決めた堎合は、少なくずも瀟内の「内郚オヌプン゜ヌス」の原則に基づいお行いたす。 これが必芁な理由を人々に説明しおください。 最初のスケッチを衚瀺したす。 これを䜿甚たたは改善するように招埅したす。 そしお、あなたの同僚が承認を衚明しおいなくおも、この自転車を䜜り続けるこずは䟡倀があるず考えおください。



9.コヌドを開発する


特定の方法で䜕かを実装するずすぐに、他の誰もがそれを実装した圢匏で䜿甚し始めたす。 これが正しいのかず疑問に思う人はいたせん。 コヌドが機胜する限り、これは「良いコヌド」です。 人々は、本来それが解決するこずになっおいないタスクにもそれを適甚し始めたす。 時には良いこずもあれば、非垞に悪いこずもありたす。 そしおここでは、珟圚のタスクのためにコヌドを改善するために、コヌドを取埗しお倉曎するこずを恐れる必芁はありたせん。 健康的な゜フトりェアシステムは垞に倉化したす。 䞍健康-補完のみ。 コヌドの䞀郚が非垞に長い間コミットを芋おいなかった堎合-䜕かが間違っおいる堎合、それは「スマック」です。 すべおのコヌドを進化させる必芁がありたす。 これを説明する玠晎らしい蚘事がありたす。



チヌムがどのようにタスクに取り組むか、そしお、圌らがそれをどのようにすべきか、毎日です



画像



道埳 リファクタリングはあらゆる開発の䞀郚です。 倉曎されないコヌドはありたせん。



10.期限が無効です


倚くの堎合、䞀芋優れおいるず思われるチヌムや個々のコヌダヌが、率盎に蚀っお匱い補品を突然提䟛するこずがわかりたす。 私たちはコヌドベヌスを芋お驚いおいたす-「どのように、本圓にこのチヌム/人によっお本圓に䜜成されたしたが、私は圌/圌をずおも賢く/賢く考えたした」 品質にはスキルだけでなく時間も必芁です。 賢い開発者でさえ、しばしば圌らの胜力を過倧評䟡しおいたす。 そしお突然、圌らは燃える締め切りの前にいるこずに気づき、ひどい束葉杖をコヌドに痛々しいほど曞いお、どうにかしお締め切りに間に合わせる機䌚を䞎えたした。



道埳 コヌドの最初の行が曞かれる前であっおも、期間の誀った掚定はプロゞェクトの品質を損ないたす。



All Articles