私は定期的に、実際のロケット外科医によって構築されたシステムの保守作業を行うよう求められます。どこから始めればよいか分からないほど、多くの間違いがあります。
いいえ、待ってください。最初から始めましょう。プロジェクトの初期の段階で、設計者はシステムをスケーリングする必要があると言われており、スケーラビリティの問題の原因はアプリケーションとデータベース間のトラフィックであると読みました。このトラフィックを最小限に抑えるようにしました。どのように?すべてのアプリケーション ロジックを SQL Server ストアド プロシージャに配置します。
真剣に。アプリケーションの大部分は、XML メッセージを作成する HTML フロント エンドによって機能します。中間層が XML メッセージを受信すると、ドキュメント要素のタグ名を呼び出すストアド プロシージャの名前として使用し、SP を呼び出して、XML メッセージ全体をパラメータとして渡します。SP が返す XML メッセージを受け取り、フロントエンドに直接返します。 アプリケーション層には他のロジックはありません。
(スキーマのライブラリに対して受信 XML メッセージを検証するためのコードが中間層にいくつかありました。しかし、1) 少数のメッセージのみが対応するスキーマを持っていること、2) メッセージが実際には準拠していないことを確認した後、それを削除しました。 3) メッセージを検証した後、エラーが発生した場合、メソッドはメッセージを破棄しました。「このヒューズボックスは本当に時間の節約になります - 工場でペニーがプリインストールされています!」)
以前、間違ったことをするソフトウェアを見たことがあります。たくさん。かなり書いてきました。しかし、このシステムの設計とプログラミングに具現化されている、あらゆる可能なターンで間違ったことをするという冷徹な決意のようなものを見たことがありません。
まあ、少なくとも彼は自分が知っていることで行きましたよね?うーん。どうやら、彼が知っていたのはアクセスだったようだ。そして、彼はAccessを本当に理解していませんでした。またはデータベース。
このコードの一般的なパターンは次のとおりです。
SELECT @TestCodeID FROM TestCode WHERE TestCode = @TestCode SELECT @CountryID FROM Country WHERE CountryAbbr = @CountryAbbr Invoice.*、TestCode.*、Country.* を選択 FROM 請求書 JOIN TestCode ON Invoice.TestCodeID = TestCode.ID JOIN Country ON Invoice.CountryID = Country.ID WHERE Invoice.TestCodeID = @TestCodeID AND Invoice.CountryID = @CountryID
じゃ、いいよ。クエリオプティマイザーも信頼していません。しかし、これはどうですか?(もともと、これは「これまでに遭遇したソース コードで最高のコメントは何ですか?」に投稿する予定でしたが、この 1 つのコメントだけでなく、書くべきことがたくさんあることに気付き、事態は手に負えなくなりました。)多くのユーティリティ ストアド プロシージャの最後に、次のようなコードが表示されます。
-- NULL を修正 SET @TargetValue = ISNULL(@TargetValue, -9999)
はい、そのコードは、あなたが気が狂わないように、それが行っているとは信じられないことを正確に行っています。変数に NULL が含まれている場合は、その値を -9999 に変更して呼び出し元に警告しています。この番号が一般的にどのように使用されるかを次に示します。
-- 目標値を取得 EXEC ap_GetTargetValue @Param1、@Param2、OUTPUT @TargetValue -- NULL 値のターゲット値を確認します IF @TargetValue = -9999 ...
本当。
このシステムの別の側面については、thedailywtf.com のI Think I'll Call Them "Transactions"というタイトルの記事を参照してください。私はこれを作り上げているわけではありません。私は誓います。
このシステムに取り組んでいると、ある学生に対する Wolfgang Pauli の有名な応答をよく思い出します。
これは、これまでで最悪のプログラムではありません。これは間違いなく、私の 30 年間のキャリア全体で取り組んできた中で最悪のものです。しかし、私はすべてを見たわけではありません。何を見た?