The Daily WTF 日本語 ノート

The Daily WTF 日本語

The Daily WTFは、Alex Papadimoulisが作成したプログラミング志向のユーモアブログです。このブログは、ソフトウェア開発とテクノロジーの世界に関する話を中心にしています。主に、プロジェクトの問題、コードの例、ITに関するおかしな話を基にしています。このサイトには、多くの開発者が仕事で遭遇する奇妙でおかしな体験の膨大なコレクションが含まれており、技術的に関連するものであれば、技術的なものか個人的なものかにかかわらず、すべてがテック関連です。

ノートのスレッド

語り手は、突然の病で亡くなった友人であり指導者でもあるAggie Shawの突然の死に対処することに苦労しています。語り手は悲しみに打ちひしがれ、上司の期待にもかかわらず、いつものように仕事に戻ることが不可能だと感じています。彼らは感情に対処し、喪失を受け入れようと、有給休暇を使い始めます。語り手の友人Meganは連絡を取り、会うことを提案し、非常に必要な聞き役と慰めの感覚を提供します。会っている間、語り手は仕事に対する感情や不満を打ち明け、Meganは対等なパートナーと独自のITグループを始めることができると提案します。語り手はこのアイデアに触発され、フリーランスになることやMeganと新しいビジネスを始めることなど、選択肢を模索し始めます。彼らが調査し計画を進めるにつれて、リスクと不確実性にもかかわらず、目的と興奮の感覚を見つけます。語り手は仕事に戻りますが、それは2週間の辞職を伝え、新しい未来の計画を立てるためだけです。彼らはAggieの古いオフィスで、彼女の存在の象徴であるアヒルのおもちゃを見つけ、それがつながりの感覚と前進するためのモチベーションを与えます。語り手は、古い仕事を捨て、Meganをそばに置いて、新しい章を始めることを決意しています。語り手が仕事を辞めるという決断は、困難な職場環境から逃れるだけでなく、新しい目的と充実感を見つけることでもあります。
詐欺師は、ユーザーにコンテンツを最後まで視聴するように強く求めます。これは、今日の「Error'd」エピソードで長期的なコミットメントとしてユーモラスに提示されたタスクです。Amazonは最近、数千人の顧客に大幅に値上げされた請求書を送り、かなりの警戒を引き起こし、広範な懸念を引き起こしました。顧客の一人であるWillyは、Amazonの価格の突然の上昇について懸念を表明し、財政的な精査を予想しました。Dave A.は、アクションがオプションなのか必須なのかを疑問視し、ソフトウェアプロンプトの優柔不断さを強調しました。匿名のユーザーは、屋根掃除会社のためにX軸とY軸の両方に表示されたユニークな5つ星評価システムを発見し、ユーモラスにそれが「屋根の外」であると述べました。Richard H.は、ランダムに生成された請求書番号を参照する疑わしいQuickBooksのメールに遭遇し、それが詐欺であることを強く示唆しました。B.J. H.は、異常に冗長で警告的なシステムメッセージを受け取り、そのようなテキストが「正常」と見なされた場合の緊急プロトコルに関する懸念を引き起こしました。このエピソードでは、移行の困難を軽減することを約束する.NET 9への移行ガイドの広告も含まれていました。
CdXz5zHNQW_k8sU0XsDKx.png
レミーは、不快な天候のため、暗くて換気の悪い洞窟に後退することをユーモラスに提案する。この感情は、マネージャーが風変わりなソフトウェア開発者を容認していた過去の職場力学を反映している。90年代後半、ITブームの中、マネージャーたちは開発者たちの普段と違う行動に慣れていた。輝かしい推薦状を持っていたステンを採用するにあたり、バリーと彼のチームは風変わりなことに備えていた。初日、ステンは自然光がなく、換気口を閉じられるワークスペースを要求した。バリーは地下にあるステンのオフィスを発見し、ステンはそこを暗くするために蛍光灯を取り除いていた。ステンは終始三人称で話し、「ステン」と自分を呼び、代名詞を混乱させるような使い方をした。また、大量のビタミン剤と奇妙な匂いのするお茶を摂取していた。ステンのコーディングスタイルも同様に奇妙で、彼のいわゆるガールフレンドにちなんで、すべての変数とメソッドに女性の名前を使用していた。命名規則は存在したが、文書化されておらず、解読が困難だった。コードレビューは手の込んだ物語となり、実際のロジックを理解するのが難しくなった。彼の風変わりな性格とコーディングスタイルにもかかわらず、ステンの主な欠点は生産性の低さだった。彼はチームの要求に追いつけず、解雇につながった。バリーは後に別の会社に慎重な推薦状を提供し、ステンに彼のコードを説明するように提案した。ステンはその会社に採用されず、バリーは感謝のギフトバスケットを受け取った。
技術者は、整備不良のインフラストラクチャと型破りなソリューションに繰り返し直面しています。一般的な問題の1つは、電力不足のエアコンから生じており、サーバー室の開いたドアの近くでつまずきの危険に注意するよう警告が発せられています。別の技術者は、広範なトラブルシューティングと回線テストを行ったにもかかわらず、雨天時にしか断続的にしか機能しないファックス機に苦労しました。この問題は最終的に、ケーブルが保護されていなかった露出した電話会社の保管庫にたどり着き、経営陣に写真証拠が送られた後、迅速な修正につながりました。さらに不穏な発見として、ソフトウェア会社の木製サーバーラックの上に無造作に置かれた「オフサイトバックアップ」ドライブがありました。場当たり的なソリューションのさらなる例としては、標準的な電気工事から逸脱し、適切な設置よりも露出した接続を好む、型破りな配線が使用されています。マンハッタンのホテルでは、ネットワーク機器が公共の階段の吹き抜けでケーブルから不安定にぶら下がっており、完全に固定されていませんでした。中国では、金属加工工場で柱に数メートル高くボルトで固定されたスイッチが見つかり、産業現場でのさらに珍しい設置が浮き彫りになりました。これらの事件は、さまざまな環境におけるITインフラストラクチャ管理における専門的な基準の普及の欠如を強調しています。これらは、ベストプラクティスへの準拠ではなく、即興と怠慢のパターンを示唆しています。
CdXz5zHNQW_LC8T1Da23x.jpeg
CdXz5zHNQW_dTcL1Jd4qx.jpeg
カレンは、仕様テストで数千回に数回発生する不安定さに遭遇しました。これらの複雑でタイミングに敏感なテストは、寛大なタイミングウィンドウと合格した単体テストにもかかわらず、時折失敗しました。問題はJavaScriptのsetTimeoutに起因しており、ドキュメントではそれ以上待つ可能性があると示唆されているにもかかわらず、Node.jsでは指定された時間が経過する前にコールバックを呼び出すことができます。カレンの単純な待機関数は、当初、遅延を導入するためにsetTimeoutを使用していました。広範なデバッグの後、彼女はこのタイミングの不一致が不安定なテストの根本原因であることを発見しました。これを解決するために、彼女は経過時間を1ミリ秒ごとに継続的にチェックするように待機関数を書き直しました。この新しい関数は、ターゲット期間が満たされた後にのみ操作が完了することを保証し、早期のタイムアウトを防ぎます。効果的ではありますが、このソリューションは非効率的と見なされ、機能テストの厄介な時間感度を浮き彫りにしています。また、Node.jsランタイムのスケジューリング保証の欠陥も指摘しています。著者は、そのような回避策が必要であることに落胆を表明しています。
提供されたRubyコードは、ブール値の pretty-print と文字列への変換に使用される、boolean value の略である bv という名前の関数を定義しています。この関数は、それぞれプロパティ名、true の値、false の値、null の値を表す prop、tv、fv、nv の 4 つのパラメータを取ります。この関数は send メソッドを使用して、クラスのメンバーに名前でアクセスします。これは、文字列によるメタプログラミングを可能にするRubyのイディオムです。このアプローチは、ブール値以外のフィールドに対して「Not Specified」を返すなど、潜在的な問題につながる可能性があり、誤解を招く可能性があります。ブール値以外のフィールドに関数を適用しようとした場合は、例外をスローすべきであると主張されています。プロパティが存在しない場合や、アクセスされているものがパラメータを取る関数である場合、例外がスローされるため、関数の動作は驚くべきものになる可能性があります。Rubyのドキュメントでは、これらの問題を回避するために、許可されるブール値の良いリストを持つことが推奨されています。しかし、文字列を渡すことによる実行時のメタプログラミングの使用は、依然として問題を引き起こし、コードベースの保守を困難にする可能性があります。テキストの著者はこのアプローチを嫌っており、メタプログラミングにはC++テンプレートの使用を好んでおり、よりシンプルで明確であると考えています。著者は、重要度の高いRubyコードベースは、メタプログラミングの使用により、しばしば保守不能になると考えています。全体として、コードとそのアプローチは問題があり、エラーが発生しやすいと考えられています。
語り手のAnonymousは、人事部でのプリンターの問題解決の経験を語る。印刷ジョブが誤った宛先に送られ、奇妙な出力が発生しており、原因は古い、文書化されていない人事プログラムにあると疑われた。語り手と同僚のReynaldoは、廃止されたサーバーがまだ不可解なことに稼働しており、プリンターとIPアドレスが競合していることを発見した。Reynaldoは、このサーバーが忘れられたプログラムからの古い、匿名の苦情をキャッシュして印刷しているのではないかと推測した。開発者のMeganはプログラムのソースコードを提供し、それが引退した開発者によって作成された文書化されていない混乱であることを確認した。Meganはプログラムのエラー処理を改善することを申し出たが、彼女の上司が割り込み、サポートされていないプロジェクトでの作業を禁止した。企業の官僚主義に不満を感じたAnonymousは、新しい人事部長にメールで懸念をエスカレートさせた。一方、Anonymousは、会社を悩ませているシステム的な問題について話し合うために、メンターのAggieとの会議を手配した。悲劇的なことに、会議が行われる前にAggieは心臓発作で予期せず亡くなった。語り手は、会社の非効率性と、貴重なメンターを失ったことに対する未解決の不満を抱えたままだった。
会話は、ピーターが「eff eh cue」と言うことから、FAQの読み方についての議論から始まります。その後、テストについて言及され、ピーターは正確に9つの項目を持つFAQを作成するように依頼されます。匿名の人物は、不明な金額を費やし、有効期限が短いためにmymini-factory.comの興味深いオファーを逃したことに言及します。別の読者は、配達予定時間と現地時間のずれを示すスクリーンショットを共有し、迅速な配達を期待していることを表明します。読者は遅延を珍しいと感じますが、変更を歓迎します。マイケル・Rは、0%節約できたはずの6つのクーポンを逃したことを嘆き、それを残念に思っています。Dragoncoder047は、ランタイムスプライトシートパッカーのリファクタリング中に役に立たないエラーメッセージに遭遇したゲームエンジンのフラストレーションを共有します。エラーメッセージは不明瞭で、Dragoncoder047は問題を発見する必要があり、それは特定の要素の不適切な検出に関係していました。会話は、企業が自信を持って望むペースでソフトウェアをリリースできるソフトウェアリリース管理ツールであるBuildMasterの広告によって中断されます。広告は、読者に今日BuildMasterをダウンロードして、その機能とメリットを活用することを奨励しています。
CdXz5zHNQW_PE38MQ2etW.png
プロジェクトマネージャーの真の価値は、計画能力だけでなく、コミュニケーションスキルにある。有効なプロジェクトマネージャーは、制約を管理しながら、チーム、組織の目標、リーダーシップの間のギャップを埋める。有能なプロジェクトマネージャーは無価値であるのに対し、不適切なものは高額なものとなる。Teganは、MBAを取得し、認定を受けていたが、実務経験はなかった。彼女は複雑なプロジェクトを指揮するよう任命された。彼女は、経験豊富なエンジニアチームを効果的に管理するために必要な基本的なコミュニケーションスキルが不足していた。重要なタイムライン情報を求められたとき、Teganは漠然とした無益な回答を提供した。エンジニアリングチームは、Teganを迂回して直接協力し始め、彼女にプロジェクトの洞察を求めていた管理層を不快にさせた。未経験により、十分な情報に基づいた決定ができないTeganのコミュニケーションは悪化し、プロジェクトは停滞した。彼女の最終的なメールは、「便秘」であると述べており、進歩ができないことをユーモラスに強調していた。最終的に、Teganはプロジェクトを離れ、彼女の後任であるPamは、プロジェクトを前進させるために必要な一貫したコミュニケーションと経験をもたらしたが、特に優れたものではなかった。
アプリケーション「Dragoncoder」は、作者が好まないものの、現実世界での正当性があるかもしれないユーザーへの待機時間を実装しています。中心的な問題は、この待機時間を表示する責任を負うJavaScriptコード内にあります。minutes変数は12にハードコーディングされており、コードは推定待機時間を表示するための奇妙なロジックを示しています。実際のminutesの値に関わらず、表示される待機時間はほとんどのシナリオで一貫して「12 minute」または「12 minutes」です。待機時間がちょうど60分であっても、「0 hour」と表示されます。作者は、変数がクライアントサイドJavaScriptであるにもかかわらず、出力テキストもサーバー生成であると推測しています。より効率的でユーザーフレンドリーなアプローチは、テンプレートリテラルを使用して時間と分を動的に計算して表示することでしょう。作者は、待機時間機能自体の必要性に疑問を呈し、その存在の強い根本的な理由がない場合は削除される可能性があることを示唆しています。待機時間ページは、初期のバックエンドレンダリング後にCDNによってキャッシュされます。minutes変数のバックエンドレンダリングも、理想的とは言えないデータ転送方法として指摘されています。作者は、複数形の処理の欠如を別の軽微な欠陥として強調しています。60分を「0 hour」と表示するコードの出力は、皮肉を込めて有名な映画に結び付けられています。作者は、待機時間表示のための、よりシンプルで動的なクライアントサイド計算を提案しています。最終的に、作者は待機時間機能の必要性を再評価することを提案しています。
著者は、独立宣言を無断で退職することに例えて物語を始める。スティーブは新しい会社で最初の週を迎え、コードベースに苦労し、アーキテクトのビルに助けを求める。ビルは、必須の金曜日の会社会議のため不在である。スティーブは、会社のスタートアップという状況を考えると、会議はパーティーのようなインフォーマルなものになるかもしれないと予想する。しかし、面接では時間管理と難しい性格の人々への対処に焦点が当てられていたことを思い出す。スティーブはすぐに、その難しい性格の人物が上司のフランクであり、休憩室で時間を過ごしていることで彼を叱責することを知る。フランクは開発者の時間と活動を極度に管理している。計画会議中、フランクは休憩を取ったビルを激しく叱責する。木曜日、機能デモンストレーション会議は、スティーブのパーソナライズされたコンピュータデスクトップに関するフランクの怒りによって脱線する。フランクは、誰でもどのコンピュータでも使用できるように、開発者はワークステーションをパーソナライズすべきではないと考えている。金曜日の午後、スティーブはフランクの命令で清掃業務のためにモップを与えられる。フランクは、清掃員を信用しないため、開発者自身がオフィスを清掃することを義務付けている。この経験により、スティーブはフランクの時間管理の教訓を退職という形で適用し、別の場所での雇用を求めることになる。
語り手は、テクニカルサポートの専門家であり、人事部のプリンターが「意味不明な文字を印刷する」という新たな課題に直面しています。チケット保持者のトニーから、この問題は実際に現地へ行く必要があるほど深刻であることを知らされます。向かう途中、彼は以前のメンターで、その後昇進したアギーと短く再会し、コーヒーの約束をします。彼の目的地は、普段は避けたい部署である人事部ですが、以前難しい案件で彼を助けてくれた役員のレイラのことにも思いを巡らせます。到着すると、彼はトニーの上司である年配の男性が、プリンターをドライヤーで修理しようとしており、機械を損傷させる危険があることに気づきます。語り手は介入し、ドライヤーのプラグを抜き、丁寧かつ断固として「ホットヘッド」にプリンターへの潜在的な損害について伝えます。その後、ホットヘッドに別のプリンターを使用するように指示し、自身で問題を解決することを約束すると同時に、レイラにこの件について報告する計画も立てます。ホットヘッドが去った後、語り手はプリンターを点検し、驚くほど損傷がなく、一連のテスト印刷の後で完全に機能することを発見します。その後、トニーと会い、ホットヘッドが彼のボスであることを確認し、語り手がこの件を新しい人事部長に報告してくれることに感謝の意を表します。トニーは、プリンターは古いものの、彼らの部署にとっては「ここに来て新しい」ものであると説明します。後で、休憩中に、語り手は同僚のミーガンとレイナルドにその日の出来事を話し、彼らに「意味不明な文字」の印刷物を見せます。「チェリルと一緒に働くのは安全だと感じない」や「ジョンが私をじっと見つめ続ける」といった、匿名の社内苦情が書かれたページです。ミーガンは、テスト印刷は問題なく機能するという事実からも、ネットワークの問題である可能性を示唆します。ネットワーク管理者であるレイナルドは、印刷物の性質を認識し、匿名の社内苦情のための古い、廃止されたはずのイントラネットシステムを思い出します。苦情が意図せず印刷されていることに気づき、レイナルドは問題の発生源を調査するためにIPアドレスを追跡することを決定します。語り手は、この珍しい技術的問題の解決に協力する準備ができています。
ファイルパスの区切り文字は、クロスプラットフォームソフトウェアを記述する際に課題となることがあり、すべてのプログラミング言語がそれらを処理するための簡単なAPIを持っているわけではありません。C++ 17以前は、開発者はファイルパスの区切り文字を処理するためにプリプロセッサのマジックを使用する必要があり、しばしばBoostライブラリ群を使用していました。一般的な解決策は、条件付きコンパイルディレクティブを使用してパス区切り文字のプリプロセッサ定数を定義することでした。このアプローチにより、開発者は異なるファイルパスの規約で動作するようにパスを組み立てることができました。しかし、一部の開発者は、パス区切り文字を追加してから正しいものに置き換えるといった間違ったアプローチを取り、重複したエラーを起こしやすいコードにつながりました。この間違ったアプローチは、コードベース全体にコピー&ペーストされることが多く、同じ欠陥のあるロジックが複数箇所に存在することになりました。複数の開発者が使用していたにもかかわらず、コードはリファクタリングされず、一部のケースでは依然として間違ったパス区切り文字を生成していました。幸いなことに、現代のWindowsは間違ったパス区切り文字に対して寛容ですが、これは悪いコーディングプラクティスを容認するものではありません。より良いアプローチは、パス区切り文字の定数を定義し、コードベース全体で一貫して使用することです。BuildMasterのようなセルフサービスリリース管理プラットフォームを使用することで、開発プロセスを合理化し、このようなエラーの可能性を減らすことができます。
ゲイリーは、最近のプロジェクトの成功により、マネージャーとの会議で称賛されることを期待していました。彼は、不条理なほど多くの重複したコントローラーと整理されていないインフラストラクチャを持つ混沌としたアプリケーションを引き継いでいました。システムは、稼働時間の短さと、手動で信頼性の低いデプロイプロセスに悩まされていました。バックログも同様に管理不能で、優先順位や明確なタスクの説明が欠けていました。しかし、ゲイリーと彼のチームは、これらの重要な問題に対処するために主導権を取りました。彼らは、冗長なリソースを排除し、戦略的な計画を実装することで、クラウドコストを大幅に削減しました。CI/CDパイプラインの実装は、デプロイを合理化し、システムの稼働時間を劇的に改善しました。ゲイリーはこれらの成果を発表する準備ができており、称賛を期待していました。それにもかかわらず、マネージャーたちは、時代遅れのロードマップに対する進捗の欠如という認識について懸念を表明しました。ゲイリーが大幅なコスト削減と開発サイクルの改善について説明したにもかかわらず、マネージャーたちは、対処されていないロードマップ項目に固執しました。彼らは、ロードマップの改訂に関するゲイリーの提案を非生産的として却下しました。最終的に、ゲイリーは評価されていないと感じて会議を終えました。この経験により、ゲイリーは不満を示すために履歴書の更新を開始しました。
Gretchen の開発チームは、会社買収の一環として Initech に買収されました。Initech は、彼らの成功したソフトウェア製品と開発タレントに興味を持っていました。当初、Gretchen のチームはプロジェクトに対する自律性を与えられ、成功していました。既存のコードを再利用するか書き直すか、独自のツールを選択することができ、それが肯定的な結果につながりました。しかし、Gretchen は後に、絶え間ない「火消し」を特徴とする問題のあるプロジェクトに割り当てられました。プロジェクトのコードベースは、不十分な null 処理などの悪いプラクティスを示していました。アプリケーションは、もはやアップデートを受け取っていない古いバージョンの NodeJS に制約されていました。Gretchen は、一貫したコーディング規約の欠如とログ記録の不在に気づきました。既存のログ記録メカニズムさえも効果がなく、メッセージの内容に関係なく「DEBUG」という単語だけを出力していました。コードは、リクエストボディを検証なしに直接データベースに挿入することで HTTP リクエストを処理していました。この特定の機能は、リクエストデータをコピーするための 2 つの異なる方法を試みることで、優柔不断さを示していました。さらに、システムは多くの領域で直接 SQL クエリに依存しており、重大な SQL インジェクションの脆弱性を生み出していました。コードには重要な認証チェックも欠けており、ほとんどのエンドポイントは完全に保護されていませんでした。管理 API のような重要なエンドポイントでさえ、認証が構成されていない重複バージョンがありました。この状況は、プロジェクト内のセキュリティとコード品質における深刻な欠陥を浮き彫りにしました。
レガシーファイナンスアプリケーションには、多くの副作用があると批判されているC#メソッド、ValueAGPFundが含まれています。このメソッドは、入力パラメータと内部クラスメンバーを変更し、複数の異なる操作を実行します。また、CheckPreviousValuationIfRequiredというメソッドとも連携します。この後者のメソッドは、特定のパラメータに基づいて以前の評価データを取得および処理するように設計されています。ValueAGPFundがCheckPreviousValuationIfRequiredを呼び出し、それがValueAGPFundを呼び返すという循環依存関係から、重大な問題が発生します。さらに、CheckPreviousValuationIfRequiredのreturnステートメントに欠陥があり、null値にアクセスしようとするとNullReferenceExceptionが発生します。このエラーは、おそらく以前の評価データが存在する場合にのみValueAGPFundを再帰的に呼び出すことを意図していた本来のロジックを覆い隠しています。現在の実装では、この関数はnullを返すか、例外をスローするかのどちらかになります。これらの明白な欠陥にもかかわらず、アプリケーションは正しく機能していると報告されています。提出者は、問題のあるコードであるCheckPreviousValuationIfRequiredとそのValueAGPFundとの連携が冗長である可能性があると疑っています。しかし、予期せぬ副作用があるかどうか、またはシステムの他の部分がスローされたNullReferenceExceptionに依存しているかどうかを確認せずに削除することをためらっています。提出者は皮肉を込めて、単体テストが通常このようなリスクを軽減することを指摘しており、単体テストの欠如または不十分さを示唆しています。中心的な問題は、これらの相互依存するメソッドの複雑で潜在的に壊れたロジックにあります。
Daniel は、データが存在すると予想されるにもかかわらず、データベースクエリが結果を返さないという問題に遭遇しました。彼はデータベース操作のために execute_read というラッパー関数を使用していました。この関数は、いくつかの疑問のある設計上の選択を示していました。1つの問題は only_one パラメータで、これは専用のデータベースライブラリ関数とは異なり、戻り値を大幅に変更していました。別の問題は、クエリタイミングのしきい値を決定するために env.is_production() を使用していたことで、これは設定パラメータで処理すべきであることを示唆していました。しかし、最も重大な欠陥は、広範な例外ハンドラでした。このハンドラは、すべてのエラーを無差別にキャッチし、ログに記録しましたが、関数の実行を続行させました。その結果、Daniel のクエリに構文エラーがあった場合、関数はその例外をキャッチし、空の結果セットを返しました。これにより実際のエラーが隠蔽され、Daniel はデバッグにかなりの時間を費やすことになりました。彼は最終的にログの中に埋もれたエラーを発見しました。著者は、特にネットワークの問題が発生する可能性のある本番環境では、このようなサイレントフェイルの危険性を強調しました。エラーの明確な兆候なしに空の結果を返すことは、重大な混乱とデバッグの困難につながります。
読者のAdam R.さんが、毎日メールで郵便物のスキャン画像を送信するサービスであるUSPS Informed Deliveryに関する投稿を寄せました。彼はメールの件名に「None」という珍しい表示があることに気づき、プログラミングのエラーを示唆しました。別の読者であるCarlosさんは、Mint Mobileのテンプレートエンジンに関する問題を共有し、システムの間違いを暗示しました。Robert F.さんは、Carboniteからの奇妙な通知について報告しました。それによると、バックアップファイルが100万日以上後に削除されるとのことで、ドライブを再接続するための途方もなく長い期間が提示されました。The Beast in Blackさんは、Claude Codeさんが単語を使用したことについてコメントし、その意味を問い、遅いシステムは意図的に正直なのかもしれないと示唆しました。Peter S.さんは、Sixtのロイヤリティプログラムに不満を表明しました。そこでは、「シルバー」ステータスに到達するために広範なデータフィールドを入力する必要があり、上位ティアと比較して特典が不明確でした。Adamさんの投稿を受け取った後、著者はYouTube動画に気を取られ、コラムの完成が遅れました。これらの投稿は、デジタルサービスでユーザーが遭遇するさまざまな技術的な不具合や奇妙な点を浮き彫りにしています。これらのエラーは、通知における奇妙なテキストから、重要なアクションに対するありえない期間まで多岐にわたります。著者は、共有された動画リンクによって引き起こされた気を散らすものについて、ユーモラスに認識しています。
CdXz5zHNQW_T1g81Fpnst.png
著者は、コードにおけるハンガリアン記法に強い不満を表明しています。その誤用と不適切な日付処理の例を挙げています。特定のコードスニペットでは、隠しフィールド Hdn_SelectedDate から初期化された変数 sCDate2 が使用されています。プレフィックス s は文字列を示唆していますが、変数は日付を保持しており、CDate2 という接尾辞は説明されていません。別の隠しフィールド Hdn_SelectedShifts は、10.5 が 10:30 を表す倍精度浮動小数点数として時間を格納しています。この値はその後 DateTime.FromOADate を使用して操作されます。著者は、OLE オートメーションの歴史と、1899 年 12 月 30 日からのオフセットというその特異な日付表現について掘り下げています。このシステムは、1900 年がうるう年として扱われた Excel のバグを引き継いでいます。コードはその後、時間を表す倍精度浮動小数点数を OADate に変換し、時間を抽出し、それを日付文字列と結合します。著者は、C# の AddHours メソッドがより簡単な解決策であっただろうと指摘しています。さらに、時間データは、より一般的な形式ではなく、ドロップダウンのために手動で浮動小数点数としてエンコードされていました。この複雑なプロセスは、著者のハンガリアン記法に対する一般的な嫌悪感を強化しています。
開発者は、テスト駆動開発やドメイン駆動開発のような方法論を取り巻くドグマに注意すべきです。ドメイン駆動開発(DDD)自体は健全な実践ですが、その原則は厳格に適用される可能性があり、否定的な結果につながる可能性があります。DDDの核となる考え方は、技術的な詳細から切り離して、ビジネスドメインを抽象的な言葉でモデル化することです。これにより、より効果的でカスタマイズされたドメインロジックが可能になります。しかし、特にバズワードの連発とともに、DDDへの準拠を自慢するチームは警告の兆候となる可能性があります。例としてこの問題を示します。CakeSessionRepositoryInterface の「ドメイン」クラスは、DDDの原則に明らかに違反しています。DDDにおけるリポジトリは、ドメインオブジェクトのデータストレージを抽象化する必要があります。認証チェックの処理、Cookieとのやり取り、セッション情報の管理、またはCakePHPのような特定のWebフレームワークへの依存を行うべきではありません。提供されたコードスニペットは、その簡潔さにもかかわらず、DDDの根本的な誤解と誤用を示しています。これは、チームが真にDDDを実践していたのではなく、表面的な解釈に固執していたことを示唆しています。DDDの誤用は、方法論を厳格なドグマとして扱う危険性を浮き彫りにしています。
フランクは、ReactのuseMemo関数を使用した珍しいJavaScriptコードに出くわしました。useMemoフックは通常、コストのかかる計算を最適化するために使用されます。しかし、この場合、それは認証を決定するために使用されており、変数の値を単純にチェックするだけでした。具体的なコードスニペットは、一見非論理的な条件を示していました:session && token && !group === false。著者は、認証されるためには、sessiontokengroupがすべてnullでない必要があると説明しています。より簡単なアプローチはsession && token && groupまたは!!(session && token && group)でしょう。著者はgroupの否定について疑問を呈し、それがどのように正しい認証結果を生み出す可能性があるのかを尋ねています。彼らは、短絡評価を含むJavaScriptの&&演算子の動作について詳しく説明しています。次に、提供された式を分析し、null === falseがfalseと評価されることを説明しています。著者は、そのコードが意図したとおりに機能することに信じられないという思いを表明し、それが賢明な設計というよりも、偶然の演算子の蓄積の結果である可能性を示唆しています。彼らは、それがLLMによって生成されたコードであるか、スキル不足の開発者の産物であると推測し、明確な意図の欠如を強調しています。
提供されたPHPコードスニペットは、不備のある日付処理を示しています。まず、ロシア語の月名の配列が定義されています。次に、コードは投稿を処理するループに入りますが、投稿を2回冗長にチェックしています。主な問題は、日付の解析と表示方法にあります。日付は文字列として取得され、ピリオドを使用して部分に分割されます。コードは、2番目の日付部分の数字を調べて月番号を抽出しようとします。月の最初の数字が「0」であるかどうかをチェックし、そうであれば2番目の数字を、そうでなければ最初の数字を取得します。この抽出された単一の数字が、月配列のインデックスとして使用されます。しかし、このロジックは、月のインデックスとして常に単一の文字しか抽出しないため、不備があります。年の後半の月では、インデックスが「1」になることが多く、実際にはどの月であっても「January」が誤って表示される結果となります。著者はこれを残酷だと指摘し、コードのロケール固有性を指摘しています。記事では、組み込みのPHP日付関数を使用することが簡単な修正策になると提案しています。PHPの柔軟な構文について、'if :' や 'endif' のような代替ブロック表記が可能であり、コードベース内でスタイルの混乱を招く可能性があるという観察がなされています。著者はまた、異なるプログラミングパラダイムを混在させる可能性についても言及しています。
父親が、2012年頃から始まった息子たちのITキャリアへの関与について語る。彼の3人の息子は、著名なVIPの支援を受けた有望なウェブプロジェクトで職を得た。その後、息子たちは父親にプロジェクトへの投資を依頼し、父親はそれに応じた。プロジェクトは遅延し、予算を超過し、未完成のままローンチされた。その後、CEOは父親を招き、問題を解決させた。父親はそこで、プロジェクトの見積もりが5,000ドルからそれ以上の金額まであり、あるベンダーはインドからの安価な労働力の外部委託を計画していたことを発見した。機能回復後、CEOはFacebookがPHPを使用しているという話に触発され、プロジェクトをPHPで書き直すべきだと宣言した。その後、書き直し期間の見積もり会議が開かれ、ほとんどの人が数週間で済むと示唆したが、父親は少なくとも7ヶ月という現実的な見積もりを提示した。その結果、彼は「十分に先見の明がない」として解雇された。息子たちはさらに1年間残り、PHPによる書き直しの遅延について報告した。著者はこの経験を通して、最も経験豊富な個人ほど、人気はないものの、最も正確な時間とコストの見積もりを提供することが多いと示している。そして、読者に世代間の職場における奇妙な体験談を共有するよう促している。
CdXz5zHNQW_f5FfsCMMuS.png
提供されたコードは、Qtアプリケーション内で parametersFilter という関数を定義しており、プローブ設計に使用されている可能性が高いです。この関数は、プローブのタイプ、位置インデックス、およびプローブ設計リストを入力として受け取ります。入力パラメータに基づいて、tofrom という2つの文字列のペアを生成することを目的としています。コアロジックは、さまざまなシナリオを処理する一連の条件分岐を含んでいます。これらのシナリオには、pos の値(-1、0、または最後の要素のインデックスであるかどうか)と probeDesign リストの長さのチェックが含まれます。関数はまた、プローブ部分の type をチェックし、特に「stylus」要素を探します。コード内の異なる分岐は、リストが空の場合や要素が1つだけの場合などのエッジケースを処理します。これらの条件の主な目的は、リストに対する境界チェックを実行することです。典型的な操作の大部分は、最後の else ステートメントで発生します。分析によると、元のコードは、その複雑さにもかかわらず、おそらく簡略化できる可能性があります。著者は、untodesu の「2行」が、冗長なエッジケース処理を合理化する可能性のある、よりシンプルなバージョンの関数が可能であることを示唆していると推測しています。コードの構造は、元の開発者が特定のエッジケースに対処するためにこの関数を過剰に設計した可能性があることを示しています。関数の複雑さは、提供されたリスト内で異なる位置とプローブタイプを処理する必要性から生じています。ソフトウェアリリースツールの広告もテキスト内に提供されています。
提供されたテキストは、困難な労働環境における3つの異なる経験を紹介しています。最初の話は、匿名の開発者の経験を詳述しています。そこでは、クライアントのマイナーな問題である回転するリフレッシュアイコンが最優先事項となり、週末の無給の残業を要求されました。彼らの会社の焦点は、CEOの重要性によって決定され、クライアントの力に基づいたフラストレーションのたまる優先順位付けを浮き彫りにしました。ダニエル・オーナーによる2番目の話は、大手小売業者のために動的なデジタルフライヤーを継続的に作成するために、「つぎはぎとダクトテープ」を使用していた会社について説明しています。この不十分なソリューションは8年間機能し、処理能力のかなりの部分を消費しました。ブライアンによる最後の話は、軍産複合体内の有害な労働環境を例示しています。ブライアンの人生は、実際のニーズよりも巨大な企業によって左右されていました。彼は、プロジェクトの引き継ぎの後、絶え間ないプレッシャー、厳しい労働シフト、そして尊敬の欠如に直面しました。この経験は、将来の雇用機会の申し出にもかかわらず、業界に対する否定的な認識につながりました。これらの例は、一部の労働環境がどれほど困難になりうるかを強調することを目的としています。テキストは、読者に同様の経験を投稿するよう呼びかけ、ProGetの広告で締めくくられています。
CdXz5zHNQW_VMaidyJewz.jpeg
このテキストは、FooとBarエンティティ間のデータを同期するために使用される、設計の悪い「データポンプ」アプリケーションを批判しています。このアプリケーションは、Quarkusで書かれ、レガシーシステムとやり取りする夜間バッチジョブを含んでいます。バッチジョブの主な機能は、Fooエンティティに基づいてBarエンティティを特定し、更新することです。コードは、Barエンティティの欠落をフィルタリングする代わりに、すべてのFooエンティティを取得するため、非効率的です。中核的な問題は、複数のWebサービス呼び出しを行うトランザクション内の更新プロセスにあります。この設計は、タイムアウト、競合、データベース接続の枯渇といったパフォーマンスの問題につながります。長期間続くトランザクションの使用、Webサービス呼び出しの数、適切な接続プール設定の欠如がすべてこれらの問題に寄与しています。著者は、トランザクションを手動で管理する必要性と、Webサービスの不安定さを批判しています。根本的な問題は、参照的に不正なデータを作成することにつながるバッチジョブアプローチそのものです。著者は、再設計によってバッチジョブが完全に排除され、状況が改善されることを示唆しています。テキストは、パッケージ管理プラットフォームの広告で締めくくられています。
JBのデータベースには、一意のIDを生成するために設計されたthree_alpha_numericsという名前のテーブルが含まれています。このテーブルには、3文字の文字列を格納するdigit列と、その数字が数値であるか('Y')否か('N')を示すis_numeric列の2つの列があります。このテーブルの主な目的は、効率的な一意のID生成を促進することです。ストアドプロシージャは、このテーブルを別のテーブルと結合し、未使用の数字でフィルタリングすることにより、一意のIDを生成するためにこのテーブルを利用します。しかし、ストアドプロシージャはis_numericが'Y'である行のみを考慮します。その結果、非数値データを含むテーブルの大部分は決して利用されません。このテーブルは、約1,000個の一意のIDの限られたセットの生成を可能にし、これは十分であると見なされます。この設計は、これらのIDを生成するために多くの情報を犠牲にしています。このようなセットアップは、データベースで一意のIDを生成するという複雑なタスクを管理するために不可欠です。未使用の英数字のトリプレットは、このアプローチの結果として生じます。この設計は、非効率性があっても、一意の数値識別子の生成を優先します。その後、テキストにはBuildMasterの宣伝広告が含まれています。