<?xml version="1.0" encoding="utf-8" standalone="no"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" version="2.0"><channel><title>The Daily WTF</title><link>http://thedailywtf.com/</link><description>Curious Perversions in Information Technology</description><lastBuildDate>Fri, 24 Apr 2026 11:52:53 GMT</lastBuildDate><item><dc:creator>Lyle Seaman</dc:creator><title>Error'd: April Showers</title><link>https://thedailywtf.com/articles/april-showers</link><category>Error'd</category><pubDate>Fri, 24 Apr 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/april-showers</guid><description>&lt;p&gt;&amp;#34;RFC 1738 (and 3986) disagree&amp;#34; and so does
&lt;strong&gt;Daniel D.&lt;/strong&gt;
&amp;#34;Reddit API has some weird app creation going on with
lots of recently migrated and undocumented stuff. But having redirect
URL set to localhost (or 127.0.0.1) usually works. Well, if
you don&amp;#39;t disagree with Sir Tim Berners-Lee about what URL
is. Which Reddit does. hostnumber = digits &amp;#34;.&amp;#34; digits &amp;#34;.&amp;#34;
digits &amp;#34;.&amp;#34; digits&amp;#34;. I&amp;#39;d file this one with all the websites that try to perform validation on email addresses, and get it wrong.
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#ad5bfafde9a74b7a8c38d429a364be48"&gt;&lt;img itemprop="image" border="0" alt="ad5bfafde9a74b7a8c38d429a364be48" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/04/23/ad5bfafde9a74b7a8c38d429a364be48.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;&amp;#34;Why aren&amp;#39;t we getting any resumes?&amp;#34; wondered
&lt;strong&gt;Fred G.&lt;/strong&gt;
&amp;#34;This is a snippet from a job posting. I&amp;#39;m sure
it worked perfectly when HR tested it.&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#2c21d5766e724b9095103c6c537adfa3"&gt;&lt;img itemprop="image" border="0" alt="2c21d5766e724b9095103c6c537adfa3" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/04/23/2c21d5766e724b9095103c6c537adfa3.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;&amp;#34;Service required...&amp;#34; was
&lt;strong&gt;Chris H.&lt;/strong&gt;&amp;#39;s title for this gem.
&amp;#34;My 2022 Chevrolet has been at the dealer for recall
service for two weeks now, &amp;#34;waiting for parts&amp;#34;. That doesn&amp;#39;t
stop GM from emailing every few days with a reminder
that the car needs the recall service, and inviting me
to schedule it at a dealer (that isn&amp;#39;t actually a
dealer) located a convenient 2500 mile drive from my home
(about 200 times the distance to the dealer where the
car currently sits), and providing a non-existent placeholder phone number
to contact them at to schedule the recall service.&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#78cac2590ecf4996a2f4ee79e0b38b49"&gt;&lt;img itemprop="image" border="0" alt="78cac2590ecf4996a2f4ee79e0b38b49" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/04/23/78cac2590ecf4996a2f4ee79e0b38b49.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;&amp;#34;How to subtly tell your customers that you don&amp;#39;t wish to be contacted&amp;#34; explains
&lt;strong&gt;Yuri&lt;/strong&gt;.
&amp;#34;The bank&amp;#39;s staff must be wondering why no one wants
to talk to them...Is it their suit&amp;#39;s brand that is
throwing everyone off? Can they blame it on COVID?&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#81b84743c3a9405f8ed25c9c18b86029"&gt;&lt;img itemprop="image" border="0" alt="81b84743c3a9405f8ed25c9c18b86029" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/04/23/81b84743c3a9405f8ed25c9c18b86029.jpeg"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;&amp;#34;Bad money formatting by tax software&amp;#34; 
&lt;strong&gt;Adam R.&lt;/strong&gt; complained.
&amp;#34;I&amp;#39;m ashamed to admit it, but yes, I did pay
Intuit money to file my taxes. This should really be
a free service provided by the government, but, y&amp;#39;know, *lobbying*.
You&amp;#39;d think that a business focused on tax preparation software
would know how to properly format currency values, but in
this case they failed to set the proper number of
decimal points.&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#a9085ecfb2d2403ebd3d856e0c2a1179"&gt;&lt;img itemprop="image" border="0" alt="a9085ecfb2d2403ebd3d856e0c2a1179" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/04/23/a9085ecfb2d2403ebd3d856e0c2a1179.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;

&lt;div&gt;
	&lt;img src="https://thedailywtf.com/images/inedo/buildmaster-icon.png" style="display:block; float: left; margin: 0 10px 10px 0;"/&gt; [Advertisement] 
	&lt;a href="https://inedo.com/BuildMaster?utm_source=tdwtf&amp;amp;utm_medium=footerad&amp;amp;utm_term=2018&amp;amp;utm_content=Self_Service&amp;amp;utm_campaign=Buildmaster_Footer"&gt;BuildMaster&lt;/a&gt; allows you to create a self-service release management platform that allows different teams to manage their applications. &lt;a href="https://inedo.com/BuildMaster/download?utm_source=tdwtf&amp;amp;utm_medium=footerad&amp;amp;utm_term=2018&amp;amp;utm_content=Self_Service&amp;amp;utm_campaign=Buildmaster_Footer"&gt;Explore how!&lt;/a&gt; 
&lt;/div&gt;
&lt;div style="clear: left;"&gt; &lt;/div&gt;
</description><slash:comments>2</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/april-showers</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>CodeSOD: Tune Out the Static</title><link>https://thedailywtf.com/articles/tune-out-the-static</link><category>CodeSOD</category><pubDate>Thu, 23 Apr 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/tune-out-the-static</guid><description>&lt;p&gt;&lt;strong&gt;Henrik H&lt;/strong&gt; (&lt;a href="https://thedailywtf.com/articles/years-go-by"&gt;previously&lt;/a&gt;) sends us a simple representative C# line:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;&lt;span class="hljs-function"&gt;&lt;span class="hljs-keyword"&gt;static&lt;/span&gt; &lt;span class="hljs-keyword"&gt;void&lt;/span&gt; &lt;span class="hljs-title"&gt;GenerateCommercilaInvoice&lt;/span&gt;()
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is a static method which takes no parameters and returns nothing. Henrik didn&amp;#39;t share the implementation, but this static function likely does something that involves side effects, maybe manipulating the database (to generate that invoice?). Or, possibly worse, it could be doing something with some global or static state. It&amp;#39;s all side effects and no meaningful controls, so enjoy debugging &lt;em&gt;that&lt;/em&gt; when things go wrong. Heck, good luck &lt;em&gt;testing&lt;/em&gt; it. Our best case possibility is that it&amp;#39;s just a wrapper around a call to a stored procedure.&lt;/p&gt;
&lt;p&gt;This method signature is basically a commercila for refactoring.&lt;/p&gt;
&lt;!-- Easy Reader Version: For some reason, the spellchecker extension I use in VS Code has stopped working, and that's annoying me. --&gt;&lt;div&gt;
	&lt;img src="https://thedailywtf.com/images/inedo/proget-icon.png" style="display:block; float: left; margin: 0 10px 10px 0;"/&gt; [Advertisement] 
	ProGet’s got you covered with security and access controls on your NuGet feeds. &lt;a href="https://inedo.com/proget/private-nuget-server?utm_source=tdwtf&amp;amp;utm_medium=footer&amp;amp;utm_content=GotYouCoveredFooter&amp;amp;utm_campaign=Cyclops2020"&gt;Learn more.&lt;/a&gt;
&lt;/div&gt;
&lt;div style="clear: left;"&gt; &lt;/div&gt;
</description><slash:comments>10</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/tune-out-the-static</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>Representative Line: Comment Overflow</title><link>https://thedailywtf.com/articles/comment-overflow</link><category>Representative Line</category><pubDate>Wed, 22 Apr 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/comment-overflow</guid><description>&lt;p&gt;Today, we look at a representative comment, sent to us by &lt;strong&gt;Nona&lt;/strong&gt;. This particular comment was in a pile of code delivered by an offshore team.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-javascript"&gt;&lt;span class="hljs-comment"&gt;// https://stackoverflow.com/questions/46744740/lodash-mongoose-object-id-difference/46745169&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;#34;Wait,&amp;#34; you say, &amp;#34;what&amp;#39;s the WTF about a comment pointing to a Stack Overflow page. I do that all the time?&amp;#34;&lt;/p&gt;
&lt;p&gt;In this case, it&amp;#39;s because this particular comment wasn&amp;#39;t given any further explanation. It also wasn&amp;#39;t in a block of code that was doing anything with either lodash, Mongoose, or set differences. It was, however, repeated multiple times throughout the codebase, because the entire codebase was a pile of copy-pasta glued together with the bare minimum code to make it work.&lt;/p&gt;
&lt;p&gt;In at least one place, the comment was probably correct and helpful. But it got swept up as part of a broader copy/paste exercise, and now is scattered through the code without any true purpose.&lt;/p&gt;
&lt;!-- Easy Reader Version: If you need AI to generate millions of lines of slop, you're just not trying hard enough. --&gt;&lt;div&gt;
	&lt;img src="https://thedailywtf.com/images/inedo/proget-icon.png" style="display:block; float: left; margin: 0 10px 10px 0;"/&gt; [Advertisement] 
	Keep the plebs out of prod. Restrict NuGet feed privileges with ProGet. &lt;a href="https://inedo.com/proget/private-nuget-server?utm_source=tdwtf&amp;amp;utm_medium=footer&amp;amp;utm_content=PlebsFooter&amp;amp;utm_campaign=Cyclops2020"&gt;Learn more.&lt;/a&gt;
&lt;/div&gt;
&lt;div style="clear: left;"&gt; &lt;/div&gt;
</description><slash:comments>12</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/comment-overflow</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>Turning Thirty</title><link>https://thedailywtf.com/articles/turning-thirty</link><category>Feature Articles</category><pubDate>Tue, 21 Apr 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/turning-thirty</guid><description>&lt;p&gt;&lt;strong&gt;Eric O&lt;/strong&gt; worked for a medical device company. The medical device industry moves slowly, relative to other technical industries. Medical science and safety have their own cadence, and at a certain point, iterating faster doesn&amp;#39;t matter much.&lt;/p&gt;
&lt;p&gt;Eric was working on a new feature on a system that had been in use for thirteen years. This new feature interacted with a database which stored information about racks of test tubes, and Eric&amp;#39;s tests meant creating several entries for racks of test tubes. And that&amp;#39;s when Eric discovered that the database only allowed thirty racks. Add any more, it would just roll right back over to one.&lt;/p&gt;
&lt;p&gt;This was odd. The database was small- less than 40MB, even in production- and there were automatic tasks to purge old data for compliance purposes. Why a hard limit of thirty?&lt;/p&gt;
&lt;p&gt;Eric had only been at the company for a year, so he asked one of the more senior team members, Lester. &amp;#34;Oh yeah, that was before my time. You should probably ask Carl.&amp;#34;&lt;/p&gt;
&lt;p&gt;Later that day, Eric happened to bump into Carl around the coffee maker, and asked the question. &amp;#34;Oh, yeah, I do vaguely remember something about that. It was in the requirements for the product. I thought it was weird, but didn&amp;#39;t think too much about it. You should probably ask Elise, she&amp;#39;s been here like twenty years.&amp;#34;&lt;/p&gt;
&lt;p&gt;Well, now it was getting curious. Eric went over to the &amp;#34;old building&amp;#34;, as it was named, the original office for the company on the other side of the parking lot. Most of the offices had moved to the new building a decade earlier, and it mostly served as fabrication and storage, but a few offices remained.&lt;/p&gt;
&lt;p&gt;Elise was on the third floor, down a poorly lit hallway, sitting in an office with water-stained acoustical tile in its ceiling. &amp;#34;Oh, yeah, I put that into the requirements document. It&amp;#39;s funny, I thought it was weird too, but the system you&amp;#39;re working on was a replacement for an older system. Our requirements were derived from those. Let me think… Irving worked on that, but he&amp;#39;s dead, god rest him. Penny is retired. Oh, you know, Humbert is still around. He didn&amp;#39;t work on that, but he worked on some of the systems that came before that. He&amp;#39;s upstairs and on the other side of the building.&amp;#34;&lt;/p&gt;
&lt;p&gt;Eric went upstairs and to the other side of the building. The fourth floor had been last remodeled circa 1985, and the ugly industrial paint on the wall was made even uglier by the fact that someone had replaced most of the flourescent tubes with LEDs. &lt;em&gt;Most&lt;/em&gt;. The mismatched color temperature started Eric down the path of a headache.&lt;/p&gt;
&lt;p&gt;Humbert was in an office similar to Elise&amp;#39;s. On his desk was a plaque commemerating 40 years of service with the company. Eric asked about the limitation, and Humbert laughed.&lt;/p&gt;
&lt;p&gt;&amp;#34;You&amp;#39;re working on the latest version of a product that initially started on an old PDP-11 running &lt;a href="https://thedailywtf.com/articles/a_case_of_the_mumps"&gt;MUMPS&lt;/a&gt;. I mean, the first versions, anyway. We ran to desktop computers as fast as we could. I wrote a version for DOS in… oh… &amp;#39;86? I knew none of the facilities we worked with had more than ten or fifteen racks of tubes, and I needed somehow to limit the size of the database so it all fit on a single 5 1/4&amp;#34; floppy disk. I picked thirty, because it seemed like a good round number. Honestly, I&amp;#39;m shocked that the limit still exists.&amp;#34;&lt;/p&gt;
&lt;p&gt;So was Eric. There had been several ground-up-rewrites since 1986, before the one Eric maintained had been released thirteen years ago. Each one of them had chosen to maintain the same limitation, without ever considering why it existed. The rule had simply been copied, mindlessly, for 40 years.&lt;/p&gt;
&lt;p&gt;&amp;#34;I&amp;#39;m kind of impressed,&amp;#34; Eric said to Humbert, &amp;#34;in a horrified way.&amp;#34;&lt;/p&gt;
&lt;p&gt;&amp;#34;Me too, kid, me too.&amp;#34;&lt;/p&gt;
&lt;!-- Easy Reader Version: I've worked on systems like this, and I expect that someone at some point did a weird workaround to make it possible to have "subracks", where you could divide each real rack into thirty subracks, thus allowing you to have more than the abritrary limit usually allowed. --&gt;&lt;div&gt;
	&lt;img src="https://thedailywtf.com/images/inedo/proget-icon.png" style="display:block; float: left; margin: 0 10px 10px 0;"/&gt; [Advertisement] 
	Keep all your packages and Docker containers in one place, scan for vulnerabilities, and control who can access different feeds. ProGet installs in minutes and has a powerful free version with a lot of great features that you can upgrade when ready.&lt;a href="https://inedo.com/proget?utm_source=tdwtf&amp;amp;utm_medium=footer&amp;amp;utm_content=PlebsFooter"&gt;Learn more.&lt;/a&gt;
&lt;/div&gt;
&lt;div style="clear: left;"&gt; &lt;/div&gt;
</description><slash:comments>36</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/turning-thirty</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>CodeSOD: Good Etiquette</title><link>https://thedailywtf.com/articles/good-etiquette</link><category>CodeSOD</category><pubDate>Mon, 20 Apr 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/good-etiquette</guid><description>&lt;p&gt;&amp;#34;Here, you&amp;#39;re a programmer, take this over. It&amp;#39;s business critical.&amp;#34;&lt;/p&gt;
&lt;p&gt;That&amp;#39;s what &lt;strong&gt;Felicity&lt;/strong&gt;&amp;#39;s boss told her when he pointed her to a network drive containing an Excel spreadsheet. The Excel spreadsheet contained a pile of macros. The person who wrote it had left, and nobody knew how to make it work, but the macros in question were absolutely business vital.&lt;/p&gt;
&lt;p&gt;Also, it&amp;#39;s in French.&lt;/p&gt;
&lt;p&gt;We&amp;#39;ll take this one in chunks. The indentation is as in the original.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-vbscript"&gt;&lt;span class="hljs-keyword"&gt;Public&lt;/span&gt; &lt;span class="hljs-keyword"&gt;Sub&lt;/span&gt; ExporToutVersBaseDonnées(ClasseurEnCours As Workbook)
&lt;span class="hljs-keyword"&gt;Call&lt;/span&gt; AffectionVariables(ToutesLesCellulesNommées)
&lt;span class="hljs-keyword"&gt;Call&lt;/span&gt; AffectationBaseDonnées(BaseDonnées)
BaseDonnées.Activate
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The procedures &lt;code&gt;AffectionVariables&lt;/code&gt; and &lt;code&gt;AffectationBaseDonnées&lt;/code&gt; populate a pile of global variables. &amp;#34;base de données&amp;#34; is French for database, but don&amp;#39;t let the name fool you- anything referencing &amp;#34;base de données&amp;#34; is referencing another Excel file located on a shared server. There are, in total, four Excel files that must live on a shared server, and two more which must be in a hard-coded path on the user&amp;#39;s computer.&lt;/p&gt;
&lt;p&gt;Oh, and the shared server is referenced not by a hostname, but by IP address- which is why the macros were breaking on everyone&amp;#39;s computer; the IP address changed.&lt;/p&gt;
&lt;p&gt;Let&amp;#39;s continue.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-vbscript"&gt;&lt;span class="hljs-comment"&gt;&amp;#39;Vérifier si la ligne existe déjà.&lt;/span&gt;
        &lt;span class="hljs-keyword"&gt;If&lt;/span&gt; ClasseurEnCours.Sheets(&lt;span class="hljs-string"&gt;&amp;#34;DATA&amp;#34;&lt;/span&gt;).Range(&lt;span class="hljs-string"&gt;&amp;#34;Num_Fichier&amp;#34;&lt;/span&gt;) = &lt;span class="hljs-number"&gt;0&lt;/span&gt; &lt;span class="hljs-keyword"&gt;Then&lt;/span&gt;
        Num_Fichier = BaseDonnées.Sheets(&lt;span class="hljs-number"&gt;1&lt;/span&gt;).Range(&lt;span class="hljs-string"&gt;&amp;#34;Dernier_Fichier&amp;#34;&lt;/span&gt;).Value + &lt;span class="hljs-number"&gt;1&lt;/span&gt;
Insérer_Ligne: &lt;span class="hljs-comment"&gt;&amp;#39;(étiquette Goto) insérer une ligne&lt;/span&gt;
    Application.&lt;span class="hljs-keyword"&gt;GoTo&lt;/span&gt; Reference:=&lt;span class="hljs-string"&gt;&amp;#34;Dernière_Ligne&amp;#34;&lt;/span&gt;
            Selection.EntireRow.Insert
&lt;span class="hljs-comment"&gt;&amp;#39;Copie les cellules (colonne A à colonne FI) de la ligne au-dessus de la ligne insérée.&lt;/span&gt;
            &lt;span class="hljs-keyword"&gt;With&lt;/span&gt; ActiveCell
                    .Offset(&lt;span class="hljs-number"&gt;-1&lt;/span&gt;, &lt;span class="hljs-number"&gt;0&lt;/span&gt;).Range(&lt;span class="hljs-string"&gt;&amp;#34;A1:FM1&amp;#34;&lt;/span&gt;).Copy
&lt;span class="hljs-comment"&gt;&amp;#39;Colle le format de la cellule précédemment copiée à la cellule active puis libère les données du presse papier&lt;/span&gt;
                    .PasteSpecial
                    .Range(&lt;span class="hljs-string"&gt;&amp;#34;A1:FM1&amp;#34;&lt;/span&gt;).Value = &lt;span class="hljs-string"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;span class="hljs-comment"&gt;&amp;#39;Se repositionne au début de la ligne insérée.&lt;/span&gt;
                    .Range(&lt;span class="hljs-string"&gt;&amp;#34;A1&amp;#34;&lt;/span&gt;).&lt;span class="hljs-keyword"&gt;Select&lt;/span&gt;
            &lt;span class="hljs-keyword"&gt;End&lt;/span&gt; &lt;span class="hljs-keyword"&gt;With&lt;/span&gt;
            Application.CutCopyMode = &lt;span class="hljs-literal"&gt;False&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Uh oh, &lt;code&gt;Insérer_Ligne&lt;/code&gt; is a label for a &lt;code&gt;Goto&lt;/code&gt; target. Not to be confused by the &lt;code&gt;Application.GoTo&lt;/code&gt; call on the next line- that just selects a range in the spreadsheet.&lt;/p&gt;
&lt;p&gt;After that little landmine, we copy/paste some data around in the sheet.&lt;/p&gt;
&lt;p&gt;That&amp;#39;s the &lt;code&gt;If&lt;/code&gt; side of the conditional, let&amp;#39;s look at the &lt;code&gt;else&lt;/code&gt; clause:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-vbscript"&gt;        &lt;span class="hljs-keyword"&gt;Else&lt;/span&gt;
Cherche_Numéro_Fichier: &lt;span class="hljs-comment"&gt;&amp;#39; Chercher la ligne ou le numéro de fichier est égale à NumFichier.&lt;/span&gt;
                        &lt;span class="hljs-keyword"&gt;While&lt;/span&gt; ActiveCell.Value &amp;lt;&amp;gt; Num_Fichier
                &lt;span class="hljs-keyword"&gt;If&lt;/span&gt; ActiveCell.Row = Range(&lt;span class="hljs-string"&gt;&amp;#34;Etiquettes&amp;#34;&lt;/span&gt;).Row &lt;span class="hljs-keyword"&gt;Then&lt;/span&gt;
                    &lt;span class="hljs-keyword"&gt;GoTo&lt;/span&gt; Insérer_Ligne
                &lt;span class="hljs-keyword"&gt;End&lt;/span&gt; &lt;span class="hljs-keyword"&gt;If&lt;/span&gt;
                ActiveCell.Offset(&lt;span class="hljs-number"&gt;-1&lt;/span&gt;, &lt;span class="hljs-number"&gt;0&lt;/span&gt;).Range(&lt;span class="hljs-string"&gt;&amp;#34;a1:a1&amp;#34;&lt;/span&gt;).&lt;span class="hljs-keyword"&gt;Select&lt;/span&gt;
            &lt;span class="hljs-keyword"&gt;Wend&lt;/span&gt;
            &lt;span class="hljs-comment"&gt;&amp;#39;Vérifier le numéro d&amp;#39;indice de la ligne active.&lt;/span&gt;
                &lt;span class="hljs-keyword"&gt;If&lt;/span&gt; Cells(ActiveCell.Row, &lt;span class="hljs-number"&gt;165&lt;/span&gt;).Value &amp;lt;&amp;gt; ClasseurEnCours.Sheets(&lt;span class="hljs-string"&gt;&amp;#34;DATA&amp;#34;&lt;/span&gt;).Range(&lt;span class="hljs-string"&gt;&amp;#34;Dernier_Indice&amp;#34;&lt;/span&gt;) &lt;span class="hljs-keyword"&gt;Then&lt;/span&gt;
                    ActiveCell.Offset(&lt;span class="hljs-number"&gt;-1&lt;/span&gt;, &lt;span class="hljs-number"&gt;0&lt;/span&gt;).Range(&lt;span class="hljs-string"&gt;&amp;#34;A1:A1&amp;#34;&lt;/span&gt;).&lt;span class="hljs-keyword"&gt;Select&lt;/span&gt;
                    &lt;span class="hljs-keyword"&gt;GoTo&lt;/span&gt; Cherche_Numéro_Fichier
                &lt;span class="hljs-keyword"&gt;End&lt;/span&gt; &lt;span class="hljs-keyword"&gt;If&lt;/span&gt;
            ActiveCell.Offset(&lt;span class="hljs-number"&gt;0&lt;/span&gt;, &lt;span class="hljs-number"&gt;0&lt;/span&gt;).Range(&lt;span class="hljs-string"&gt;&amp;#34;A1:FM1&amp;#34;&lt;/span&gt;).Value = &lt;span class="hljs-string"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
        &lt;span class="hljs-keyword"&gt;End&lt;/span&gt; &lt;span class="hljs-keyword"&gt;If&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We start with another label, and… then we have a &lt;code&gt;Goto&lt;/code&gt;. A &lt;code&gt;Goto&lt;/code&gt; which jumps us back into the &lt;code&gt;If&lt;/code&gt; side of the conditional. A &lt;code&gt;Goto&lt;/code&gt; inside of a while loop, a while loop that&amp;#39;s marching around the spreadsheet to search for certain values in the cell.&lt;/p&gt;
&lt;p&gt;After the loop, we have &lt;em&gt;another&lt;/em&gt; &lt;code&gt;Goto&lt;/code&gt; which will possibly jump us up to the start of the &lt;code&gt;else&lt;/code&gt; block.&lt;/p&gt;
&lt;p&gt;The procedure ends with some cleanup:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-vbscript"&gt;&lt;span class="hljs-comment"&gt;&amp;#39;----- &lt;/span&gt;
&lt;span class="hljs-comment"&gt;&amp;#39; Do some stuff on the active cell and the following cells on the column&lt;/span&gt;
.-----
BaseDonnées.Close &lt;span class="hljs-literal"&gt;True&lt;/span&gt;
&lt;span class="hljs-keyword"&gt;Set&lt;/span&gt; BaseDonnées = &lt;span class="hljs-literal"&gt;Nothing&lt;/span&gt;
&lt;span class="hljs-keyword"&gt;End&lt;/span&gt; &lt;span class="hljs-keyword"&gt;Sub&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I do not know what this function does, and the fact that the code is largely in a language I don&amp;#39;t speak isn&amp;#39;t the obstacle. I have no idea what the loops and the gotos are trying to do. I&amp;#39;m not even a &amp;#34;never use &lt;code&gt;Goto&lt;/code&gt; ever ever ever&amp;#34; person; in a language like VBA, it&amp;#39;s sometimes the best way to handle errors. But this bizarre time-traveling flow control boggles me.&lt;/p&gt;
&lt;p&gt;&amp;#34;Etiquettes&amp;#34; is French for &amp;#34;labels&amp;#34;, and it may be bad etiquette but I&amp;#39;ve got some four letter labels for this code.&lt;/p&gt;
&lt;!-- Easy Reader Version: GOTO considered harmful? Yeah, to my *sanity* --&gt;&lt;div&gt;
	&lt;img src="https://thedailywtf.com/images/inedo/proget-icon.png" style="display:block; float: left; margin: 0 10px 10px 0;"/&gt; [Advertisement] 
	ProGet’s got you covered with security and access controls on your NuGet feeds. &lt;a href="https://inedo.com/proget/private-nuget-server?utm_source=tdwtf&amp;amp;utm_medium=footer&amp;amp;utm_content=GotYouCoveredFooter&amp;amp;utm_campaign=Cyclops2020"&gt;Learn more.&lt;/a&gt;
&lt;/div&gt;
&lt;div style="clear: left;"&gt; &lt;/div&gt;
</description><slash:comments>16</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/good-etiquette</wfw:comment></item><item><dc:creator>Lyle Seaman</dc:creator><title>Error'd: Having a Beastly Time</title><link>https://thedailywtf.com/articles/having-a-beastly-time</link><category>Error'd</category><pubDate>Fri, 17 Apr 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/having-a-beastly-time</guid><description>&lt;p&gt;It&amp;#39;s time again for a reader special, and once again it&amp;#39;s all &lt;strong&gt;The Beast In Black&lt;/strong&gt; (there must be a story to that nick, no?).&lt;/p&gt;

&lt;p&gt;&amp;#34;MySQL is not better than your SQL,&amp;#34; he pontificated, 
&amp;#34;especially when
it comes to the Workbench Migration Wizard&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#7369002fc20e41b89b64ed7f32ef3641"&gt;&lt;img itemprop="image" border="0" alt="7369002fc20e41b89b64ed7f32ef3641" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/04/05/7369002fc20e41b89b64ed7f32ef3641.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&amp;#34;Sadly,&amp;#34; says he, 
&amp;#34;Not even gmail/chromium either.&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#149c9109443f4521b1a38b91bd0bcc22"&gt;&lt;img itemprop="image" border="0" alt="149c9109443f4521b1a38b91bd0bcc22" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/04/05/149c9109443f4521b1a38b91bd0bcc22.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&amp;#34;Updated software is available, but there are no updates!&amp;#34; he puzzled.
&amp;#34;Clicking Install Now just throws
that dialog right back in my face. I&amp;#39;m re-cursing.&amp;#34; Zero, one, does it really make a difference?
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#e9ea57c886984dc8a106df503a2fd923"&gt;&lt;img itemprop="image" border="0" alt="e9ea57c886984dc8a106df503a2fd923" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/04/05/e9ea57c886984dc8a106df503a2fd923.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&amp;#34;Questions&amp;#34;
&lt;strong&gt;The Beast in Black&lt;/strong&gt;
&amp;#34;I do, in fact, have a question...&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#f5c83f7bc02644a895f1f9aa5ec368a1"&gt;&lt;img itemprop="image" border="0" alt="f5c83f7bc02644a895f1f9aa5ec368a1" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/04/05/f5c83f7bc02644a895f1f9aa5ec368a1.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;One of the foundational guides to my [lyle, not bib] engineering career
was John Bentley&amp;#39;s &lt;em&gt;Programming Pearls&lt;/em&gt;. These are not those.
&lt;br/&gt;
&amp;#34;Veni, vidi: vc. No pearls of wisdom here, just litter.&amp;#34; says
&lt;strong&gt;The Beast&lt;/strong&gt;.
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#4e13a188deb94473abcc6148d106458c"&gt;&lt;img itemprop="image" border="0" alt="4e13a188deb94473abcc6148d106458c" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/04/05/4e13a188deb94473abcc6148d106458c.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;


&lt;div&gt;
	[Advertisement] &lt;b&gt;Plan Your .NET 9 Migration with Confidence&lt;/b&gt;&lt;br/&gt;Your journey to .NET 9 is more than just one decision.Avoid migration migraines with the advice in this free guide. &lt;b&gt;&lt;a href="https://inedo.com/support/whitepapers/dotnet-guide?utm_campaign=dotnet&amp;amp;utm_source=tdwtf-footer"&gt;Download Free Guide Now!&lt;/a&gt;&lt;/b&gt;
&lt;/div&gt;
&lt;div style="clear: left;"&gt; &lt;/div&gt;</description><slash:comments>12</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/having-a-beastly-time</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>CodeSOD: We'll Hire Better Contractors Next Time, We Promise</title><link>https://thedailywtf.com/articles/we-ll-hire-better-contractors-next-time-we-promise</link><category>CodeSOD</category><pubDate>Thu, 16 Apr 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/we-ll-hire-better-contractors-next-time-we-promise</guid><description>&lt;p&gt;&lt;strong&gt;Nona&lt;/strong&gt; writes: &amp;#34;this is the beginning of a 2100 line function.&amp;#34;&lt;/p&gt;
&lt;p&gt;That&amp;#39;s bad. Nona didn&amp;#39;t send us the entire JavaScript function, but sent us just the three early lines, which definitely raise concerns:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-javascript"&gt;&lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (res.&lt;span class="hljs-property"&gt;length&lt;/span&gt; &amp;gt; &lt;span class="hljs-number"&gt;0&lt;/span&gt;) {
  &lt;span class="hljs-keyword"&gt;await&lt;/span&gt; (&lt;span class="hljs-keyword"&gt;function&lt;/span&gt; (&lt;span class="hljs-params"&gt;&lt;/span&gt;) {
    &lt;span class="hljs-keyword"&gt;return&lt;/span&gt; &lt;span class="hljs-keyword"&gt;new&lt;/span&gt; &lt;span class="hljs-title class_"&gt;Promise&lt;/span&gt;(&lt;span class="hljs-function"&gt;(&lt;span class="hljs-params"&gt;resolve, reject&lt;/span&gt;) =&amp;gt;&lt;/span&gt; {
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We await a synchronous function which retuns a promise, passing a function to the promise. As a general rule, you don&amp;#39;t construct promises directly, you let asynchronous code generate them and pass them around (or await them). It&amp;#39;s not a thing you &lt;em&gt;never&lt;/em&gt; do, but it&amp;#39;s certainly suspicious. It gets more problematic when Nona adds:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This function happens to contain multiple code repetition snippets, including these three lines.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That&amp;#39;s right, this little block appears multiple times in the function, &lt;em&gt;inside&lt;/em&gt; of anonymous function getting passed to the &lt;code&gt;Promise&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;No, the code does not work in its current state. It&amp;#39;s unclear what the 2100 line function was supposed to do. And yes, this was written by lowest-bidder third-party contractors.&lt;/p&gt;
&lt;p&gt;Nona adds:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I am numb at this point and know I gotta fix it or we lose contracts&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Management made the choice to &amp;#34;save money&amp;#34; by hiring third parties, and now Nona&amp;#39;s team gets saddled with all the crunch to fix the problems created by the &amp;#34;savings&amp;#34;.&lt;/p&gt;
&lt;!-- Easy Reader Version: "lowest bidder" plans to make as much, if not more profit, than the highest bidder- they just plan to spend way less doing it. --&gt;&lt;div&gt;
	[Advertisement] &lt;b&gt;Plan Your .NET 9 Migration with Confidence&lt;/b&gt;&lt;br/&gt;Your journey to .NET 9 is more than just one decision.Avoid migration migraines with the advice in this free guide. &lt;b&gt;&lt;a href="https://inedo.com/support/whitepapers/dotnet-guide?utm_campaign=dotnet&amp;amp;utm_source=tdwtf-footer"&gt;Download Free Guide Now!&lt;/a&gt;&lt;/b&gt;
&lt;/div&gt;
&lt;div style="clear: left;"&gt; &lt;/div&gt;</description><slash:comments>14</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/we-ll-hire-better-contractors-next-time-we-promise</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>CodeSOD: Three Letter Acronyms, Four Letter Words</title><link>https://thedailywtf.com/articles/three-letter-acronyms-four-letter-words</link><category>CodeSOD</category><pubDate>Wed, 15 Apr 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/three-letter-acronyms-four-letter-words</guid><description>&lt;p&gt;&lt;strong&gt;Candice&lt;/strong&gt; (&lt;a href="https://thedailywtf.com/articles/negative-creep"&gt;previously&lt;/a&gt;) has another WTF to share for us.&lt;/p&gt;
&lt;p&gt;We&amp;#39;re going to start by just looking at one fragment of a class defined in this C++ code: &lt;code&gt;TLAflaList&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Every type and variable has a three-letter-acronym buried in its name. The specific meaning of most of the acronyms are mostly lost to time, so &amp;#34;TLA&amp;#34; is as good as any other three random letters. No one knows what &amp;#34;fla&amp;#34; is.&lt;/p&gt;
&lt;p&gt;What drew Candice&amp;#39;s attention was that there was a type called &amp;#34;list&amp;#34;, which implies they&amp;#39;re maybe not using the standard library and have reinvented a wheel. Another data point arguing in favor of that is that the class had a method called &lt;code&gt;getNumElements&lt;/code&gt;, instead of something more conventional like &lt;code&gt;size&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Let&amp;#39;s look at that function:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-cpp"&gt;&lt;span class="hljs-function"&gt;&lt;span class="hljs-type"&gt;size_t&lt;/span&gt; &lt;span class="hljs-title"&gt;TLAflaList::getNumElements&lt;/span&gt;&lt;span class="hljs-params"&gt;()&lt;/span&gt;
&lt;/span&gt;{
	&lt;span class="hljs-keyword"&gt;return&lt;/span&gt; mv_FLAarray.&lt;span class="hljs-built_in"&gt;size&lt;/span&gt;();
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In addition to the meaningless three-letter-acronyms which start every type and variable, we&amp;#39;re also adding on a lovely bit of hungarian notation, throwing &lt;code&gt;mv_&lt;/code&gt; on the front for a member variable. The variable is called &amp;#34;array&amp;#34;, but &lt;em&gt;is&lt;/em&gt; it? Let&amp;#39;s look at that definition.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-cpp"&gt;&lt;span class="hljs-keyword"&gt;class&lt;/span&gt; &lt;span class="hljs-title class_"&gt;TLAflaList&lt;/span&gt;
{
	…
	&lt;span class="hljs-keyword"&gt;private&lt;/span&gt;:
		TLAflaArray_t mv_FLAarray;
		…
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Okay, that gives me a lot more nonsense letters but I still have no idea what that variable is. Where&amp;#39;s that type defined? The good news, it&amp;#39;s in the same header.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-cpp"&gt;&lt;span class="hljs-keyword"&gt;typedef&lt;/span&gt; std::vector&amp;lt;INtabCRMprdinvusage_t*&amp;gt; TLAflaArray_t;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So it&amp;#39;s not a list or an array, it&amp;#39;s a vector. A vector of bare pointers, which definitely makes me worry about inevitable use-after-free errors or memory leaks. Who owns the memory that those pointers are referencing?&lt;/p&gt;
&lt;p&gt;&amp;#34;IN&amp;#34; in the type name is an old company, good ol&amp;#39; Initrode, which got acquired a decade ago. &amp;#34;tab&amp;#34; tells us that it&amp;#39;s meant to be a database table. We can guess at the rest.&lt;/p&gt;
&lt;p&gt;This isn&amp;#39;t a codebase, it&amp;#39;s a bad Scrabble hand. It&amp;#39;s also a trainwreck. Confusing, disorganized, and all of that made worse by piles of &lt;code&gt;typedef&lt;/code&gt;s that hide what you&amp;#39;re actually doing and endless acronyms that make it impossible to read.&lt;/p&gt;
&lt;p&gt;One last detail, which I&amp;#39;ll let Candice explain:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I started scrolling down the class definition - it took longer than it should have, given that the company coding style is to double-space the overwhelming majority of lines.  (Seriously; I&amp;#39;ve seen single character braces sandwiched by two lines of nothing.)  On the upside, this was one of the classes with just one public block and one private block - some classes like to ping-pong back and forth a half-dozen times.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;!-- ERV: WTFBBQ TMAMCUAIR? --&gt;&lt;div&gt;
	&lt;img src="https://thedailywtf.com/images/inedo/proget-icon.png" style="display:block; float: left; margin: 0 10px 10px 0;"/&gt; [Advertisement] 
	ProGet’s got you covered with security and access controls on your NuGet feeds. &lt;a href="https://inedo.com/proget/private-nuget-server?utm_source=tdwtf&amp;amp;utm_medium=footer&amp;amp;utm_content=GotYouCoveredFooter&amp;amp;utm_campaign=Cyclops2020"&gt;Learn more.&lt;/a&gt;
&lt;/div&gt;
&lt;div style="clear: left;"&gt; &lt;/div&gt;
</description><slash:comments>18</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/three-letter-acronyms-four-letter-words</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>A Hole in Your Plan</title><link>https://thedailywtf.com/articles/a-hole-in-your-plan</link><category>Feature Articles</category><pubDate>Tue, 14 Apr 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/a-hole-in-your-plan</guid><description>&lt;p&gt;&lt;strong&gt;Theresa&lt;/strong&gt; works for a company that handles a fair bit of personally identifiable information that can be tied to health care data, so for them, security matters. They need to comply with security practices laid out by a variety of standards bodies and be able to demonstrate that compliance.&lt;/p&gt;
&lt;p&gt;There&amp;#39;s a dirty secret about standards compliance, though. Most of these standards are trying to avoid being overly technically prescriptive. So frequently, they may have something like, &amp;#34;a process must exist for securely destroying storage devices before they are disposed of.&amp;#34; Maybe it will include some examples of what you could do to meet this standard, but the important thing is that you have to have a &lt;em&gt;process&lt;/em&gt;. This means that if you whip up a Word document called &amp;#34;Secure Data Destruction Process&amp;#34; and tell people they should follow it, you can check off that box on your compliance. Sometimes, you need to validate the process; sometimes you need to have other processes which ensure this process is being followed. What you need to do and to what complexity depends on the compliance structure you&amp;#39;re beholden to. Some of them are surprisingly flexible, which is a polite way of saying &amp;#34;mostly meaningless&amp;#34;.&lt;/p&gt;
&lt;p&gt;Theresa&amp;#39;s company has a process for safely destroying hard drives. They even validated it, shortly after its introduction. They even have someone who checks that the process has been followed. The process is this: in the basement, someone set up a cheap drill press, and attached a wooden jig to it. You slap the hard drive in the jig, turn on the drill, and brrrrzzzzzz- poke a hole through the platters making the drive unreadable.&lt;/p&gt;
&lt;p&gt;There&amp;#39;s just one problem with that process: the company recently switched to using SSDs. The SSDs are in a carrier which makes them share the same form factor as old-style spinning disk drives, but that&amp;#39;s just a thin plastic shell. The actual electronics package where the data is stored is quite small. Small enough, and located in a position where the little jig attached to the drill guarantees that the drill won&amp;#39;t even touch the SSD at all.&lt;/p&gt;
&lt;p&gt;For months now, whenever a drive got decommissioned, the IT drone responsible for punching a hole through it has just been drilling through plastic, and nothing else. An unknown quantity of hard drives have been sent out for recycling with PII and health data on them. But it&amp;#39;s okay, because &lt;em&gt;the process was followed&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The compliance team at the company will update the process, probably after six months of meetings and planning and approvals from all of the stakeholders. Though it may take longer to glue together a new jig for the SSDs.&lt;/p&gt;
&lt;!-- Easy Reader Version: On the flip side, some standards are weirdly prescriptive, like requiring a hardware firewall between sections of the network, down to the specific brands allowed. --&gt;&lt;div&gt;
	&lt;img src="https://thedailywtf.com/images/inedo/buildmaster-icon.png" style="display:block; float: left; margin: 0 10px 10px 0;"/&gt; [Advertisement] 
	&lt;a href="https://inedo.com/BuildMaster?utm_source=tdwtf&amp;amp;utm_medium=footerad&amp;amp;utm_term=2018&amp;amp;utm_content=Self_Service&amp;amp;utm_campaign=Buildmaster_Footer"&gt;BuildMaster&lt;/a&gt; allows you to create a self-service release management platform that allows different teams to manage their applications. &lt;a href="https://inedo.com/BuildMaster/download?utm_source=tdwtf&amp;amp;utm_medium=footerad&amp;amp;utm_term=2018&amp;amp;utm_content=Self_Service&amp;amp;utm_campaign=Buildmaster_Footer"&gt;Explore how!&lt;/a&gt; 
&lt;/div&gt;
&lt;div style="clear: left;"&gt; &lt;/div&gt;
</description><slash:comments>41</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/a-hole-in-your-plan</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>CodeSOD: Non-cogito Ergo c_str</title><link>https://thedailywtf.com/articles/non-cogito-ergo-c-str</link><category>CodeSOD</category><pubDate>Mon, 13 Apr 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/non-cogito-ergo-c-str</guid><description>&lt;p&gt;&lt;strong&gt;Tim&lt;/strong&gt; (&lt;a href="https://thedailywtf.com/articles/expressing-a-leak"&gt;previously&lt;/a&gt;) supports a relatively ancient C++ application. And that creates some interesting conundrums, as the way you wrote C++ in 2003 is not the way you would write it even a few years later. The standard matured quickly.&lt;/p&gt;
&lt;p&gt;Way back in 2003, it was still common to use C-style strings, instead of the C++ &lt;code&gt;std::string&lt;/code&gt; type. It seems silly, but people had Strong Opinions™ about using standard library types, and much of your C++ code was probably interacting with C libraries, so yeah, C-strings stuck around for a long time.&lt;/p&gt;
&lt;p&gt;For Tim&amp;#39;s company, however, the migration away from C-strings was in 2007.&lt;/p&gt;
&lt;p&gt;So they wrote this:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-cpp"&gt;&lt;span class="hljs-keyword"&gt;if&lt;/span&gt;( ! &lt;span class="hljs-built_in"&gt;strncmp&lt;/span&gt;( pdf-&amp;gt;&lt;span class="hljs-built_in"&gt;symTabName&lt;/span&gt;().&lt;span class="hljs-built_in"&gt;c_str&lt;/span&gt;(), prefix.&lt;span class="hljs-built_in"&gt;c_str&lt;/span&gt;(), &lt;span class="hljs-built_in"&gt;strlen&lt;/span&gt;( prefix.&lt;span class="hljs-built_in"&gt;c_str&lt;/span&gt;() ) ) ) {
    &lt;span class="hljs-comment"&gt;// do stuff&lt;/span&gt;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is doing a &amp;#34;starts with&amp;#34; check. &lt;code&gt;strncmp&lt;/code&gt;, &lt;code&gt;strlen&lt;/code&gt; are both functions which operate on C-strings. So we compare the &lt;code&gt;symTabName&lt;/code&gt; against the &lt;code&gt;prefix&lt;/code&gt;, but only look at as many characters as are in the prefix. As is common, &lt;code&gt;strncmp&lt;/code&gt; returns 0 if the two strings are equal, so we negate that to say &amp;#34;if the &lt;code&gt;symTabName&lt;/code&gt; starts with &lt;code&gt;prefix&lt;/code&gt;, do stuff&amp;#34;.&lt;/p&gt;
&lt;p&gt;In C code, this is very much how you would do this, though you might contemplate turning it into a function. Though maybe not.&lt;/p&gt;
&lt;p&gt;In C++, in 2007, you &lt;em&gt;do not&lt;/em&gt; have a built-in &lt;code&gt;starts_with&lt;/code&gt; function- you have to wait until the C++20 standard for that- but you have some string handling functions which could make this more clear. As Tim points out, the &amp;#34;correct&amp;#34; answer is: &lt;code&gt;if(pdf-&amp;gt;symTabName().find(prefix) != 0UL)&lt;/code&gt;. It&amp;#39;s more readable, it doesn&amp;#39;t involve poking around with &lt;code&gt;char*&lt;/code&gt;s, and also isn&amp;#39;t spamming that extra whitespace between every parenthesis and operator.&lt;/p&gt;
&lt;p&gt;Tim writes: &amp;#34;String handling in C++ is pretty terrible, but it doesn&amp;#39;t have to be this terrible.&amp;#34;&lt;/p&gt;
&lt;!-- Easy Reader Version: Strings were a mistake. We shouldn't use text to communicate anymore. Let LLMs do that, we can just use pure numbers and mathematics. --&gt;&lt;div&gt;
	&lt;img src="https://thedailywtf.com/images/inedo/proget-icon.png" style="display:block; float: left; margin: 0 10px 10px 0;"/&gt; [Advertisement] 
	ProGet’s got you covered with security and access controls on your NuGet feeds. &lt;a href="https://inedo.com/proget/private-nuget-server?utm_source=tdwtf&amp;amp;utm_medium=footer&amp;amp;utm_content=GotYouCoveredFooter&amp;amp;utm_campaign=Cyclops2020"&gt;Learn more.&lt;/a&gt;
&lt;/div&gt;
&lt;div style="clear: left;"&gt; &lt;/div&gt;
</description><slash:comments>25</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/non-cogito-ergo-c-str</wfw:comment></item><item><dc:creator>Lyle Seaman</dc:creator><title>Error'd: Youth is Wasted on the Junge</title><link>https://thedailywtf.com/articles/youth-is-wasted-on-the-junge</link><category>Error'd</category><pubDate>Fri, 10 Apr 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/youth-is-wasted-on-the-junge</guid><description>&lt;p&gt;&lt;/p&gt;&lt;p&gt;&amp;#34;My thoughts exactly&amp;#34; muttered 
&lt;strong&gt;Jason H.&lt;/strong&gt;
&amp;#34;I was in a system that avoids check constraints and
the developers never seemed to agree to a T/F or
Y/N or 1/0 for indicator columns. All data in a
column will use the same pattern but different columns in
the same table will use different patterns so I&amp;#39;m not
sure why I was surprised when I came across the
attached. Sort the data descending and you have the shorthand
for what I uttered.&amp;#34; How are these all unique?
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#4af53c55b8564b34a6f12916571c92fd"&gt;&lt;img itemprop="image" border="0" alt="4af53c55b8564b34a6f12916571c92fd" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/04/05/4af53c55b8564b34a6f12916571c92fd.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;
&amp;#34;I&amp;#39;d better act quickly!&amp;#34;
&lt;strong&gt;Hugh Scenic&lt;/strong&gt; almost panicked.
&amp;#34;This Microsoft Rewards offer might
expire (in just under 74 years)!&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#50a5533b37f54e6ebbfc460136507205"&gt;&lt;img itemprop="image" border="0" alt="50a5533b37f54e6ebbfc460136507205" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/04/05/50a5533b37f54e6ebbfc460136507205.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;#34;Copy-copy-copy&amp;#34; repeated 
&lt;strong&gt;Gordon&lt;/strong&gt;.
&amp;#34;Not sure I want the team to be in touch
- my query might be best left unanswered.&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#617f1082b64f442aa146e47115c5b6fa"&gt;&lt;img itemprop="image" border="0" alt="617f1082b64f442aa146e47115c5b6fa" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/04/05/617f1082b64f442aa146e47115c5b6fa.jpeg"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;
&amp;#34;Was Comcast&amp;#39;s episode guide data hacked by MAGA?&amp;#34;
&lt;strong&gt;Barry M.&lt;/strong&gt;
wondered. &amp;#34;This is
not the usual generic description of Real Time.&amp;#34; 
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#6af551a6d02e417eb4d0fb3470f8fbb1"&gt;&lt;img itemprop="image" border="0" alt="6af551a6d02e417eb4d0fb3470f8fbb1" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/04/05/6af551a6d02e417eb4d0fb3470f8fbb1.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;#34;&lt;strong&gt;Holiday Workshop for Children&lt;/strong&gt;
learning how to write web pages, apparently,&amp;#34; notes self-named 
&lt;strong&gt;Youth P.&lt;/strong&gt;
&amp;#34;You need a new category - because it is no
error to involve young people in a
web design workshop during their holidays. A little bit of
a surprise was that it will happen in a local
museum, and that children between 8 and 12 are the
target audience - should they really already think about their
work future?&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#c3cced1e818d499ea652a80a7d1cbc71"&gt;&lt;img itemprop="image" border="0" alt="c3cced1e818d499ea652a80a7d1cbc71" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/04/05/c3cced1e818d499ea652a80a7d1cbc71.jpeg"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;
&lt;div&gt;
	[Advertisement] &lt;b&gt;Plan Your .NET 9 Migration with Confidence&lt;/b&gt;&lt;br/&gt;Your journey to .NET 9 is more than just one decision.Avoid migration migraines with the advice in this free guide. &lt;b&gt;&lt;a href="https://inedo.com/support/whitepapers/dotnet-guide?utm_campaign=dotnet&amp;amp;utm_source=tdwtf-footer"&gt;Download Free Guide Now!&lt;/a&gt;&lt;/b&gt;
&lt;/div&gt;
&lt;div style="clear: left;"&gt; &lt;/div&gt;</description><slash:comments>9</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/youth-is-wasted-on-the-junge</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>CodeSOD: Take a Percentage</title><link>https://thedailywtf.com/articles/take-a-percentage</link><category>CodeSOD</category><pubDate>Thu, 09 Apr 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/take-a-percentage</guid><description>&lt;p&gt;When looking at the source of a major news site, today&amp;#39;s anonymous submitter sends us this very, very mild, but also very funny WTF:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-html"&gt;	&lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;div&lt;/span&gt; &lt;span class="hljs-attr"&gt;class&lt;/span&gt;=&lt;span class="hljs-string"&gt;&amp;#34;g-vhs g-videotape g-cinemagraph&amp;#34;&lt;/span&gt; &lt;span class="hljs-attr"&gt;id&lt;/span&gt;=&lt;span class="hljs-string"&gt;&amp;#34;g-video-178_article_slug-640w&amp;#34;&lt;/span&gt;
		 &lt;span class="hljs-attr"&gt;data-type&lt;/span&gt;=&lt;span class="hljs-string"&gt;&amp;#34;videotape&amp;#34;&lt;/span&gt; &lt;span class="hljs-attr"&gt;data-asset&lt;/span&gt;=&lt;span class="hljs-string"&gt;&amp;#34;https://somesite.com/videos/file.mp4&amp;#34;&lt;/span&gt; &lt;span class="hljs-attr"&gt;data-cinemagraph&lt;/span&gt;=&lt;span class="hljs-string"&gt;&amp;#34;true&amp;#34;&lt;/span&gt; &lt;span class="hljs-attr"&gt;data-allow-multiple-players&lt;/span&gt;=&lt;span class="hljs-string"&gt;&amp;#34;true&amp;#34;&lt;/span&gt;
		 &lt;span class="hljs-attr"&gt;data-vhs-options&lt;/span&gt;=&lt;span class="hljs-string"&gt;&amp;#39;{&amp;#34;ratio&amp;#34;:&amp;#34;560:320&amp;#34;}&amp;#39;&lt;/span&gt;
		 &lt;span class="hljs-attr"&gt;style&lt;/span&gt;=&lt;span class="hljs-string"&gt;&amp;#34;padding-bottom: 57.14285714285714%&amp;#34;&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Look, I know that percentage was calculated by JavaScript, or maybe the backend, or maybe calculated by a CSS pre-processor. No human typed that. There&amp;#39;s nothing to gain by adding a rounding operation. There&amp;#39;s nothing truly &lt;em&gt;wrong&lt;/em&gt; with that line of code.&lt;/p&gt;
&lt;p&gt;But I can&amp;#39;t help but think about the comedic value in controlling your page layout down to sub-sub-sub-sub-sub-sub-sub-sub-pixel precision. This code will continue to have pixel accuracy out to screens with quadrillions of pixels, making it incredibly future proof.&lt;/p&gt;
&lt;p&gt;It&amp;#39;s made extra funny by calling the video player &lt;code&gt;VHS&lt;/code&gt; and suggesting the appropriate ratio is 560 pixels by 320- which is not &lt;em&gt;quite&lt;/em&gt; 16:9, but is a frequent letterbox ratio on DVD prints of movies.&lt;/p&gt;
&lt;p&gt;In any case, I eagerly await a 20-zetta-pixel displays, so I can read the news in its intended glory.&lt;/p&gt;
&lt;!-- Easy Reader Version: I bet the person responsible has memorized all the digits of pi --&gt;&lt;div&gt;
	&lt;img src="https://thedailywtf.com/images/inedo/buildmaster-icon.png" style="display:block; float: left; margin: 0 10px 10px 0;"/&gt; [Advertisement] 
	&lt;a href="https://inedo.com/BuildMaster?utm_source=tdwtf&amp;amp;utm_medium=footerad&amp;amp;utm_term=2018&amp;amp;utm_content=Confidence&amp;amp;utm_campaign=Buildmaster_Footer"&gt;Utilize BuildMaster&lt;/a&gt; to release your software with confidence, at the pace your business demands. &lt;a href="https://inedo.com/BuildMaster/download?utm_source=tdwtf&amp;amp;utm_medium=footerad&amp;amp;utm_term=2018&amp;amp;utm_content=Confidence&amp;amp;utm_campaign=Buildmaster_Footer"&gt;Download&lt;/a&gt; today!  
&lt;/div&gt;
&lt;div style="clear: left;"&gt; &lt;/div&gt;
</description><slash:comments>19</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/take-a-percentage</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>CodeSOD: Two Conversions</title><link>https://thedailywtf.com/articles/two-conversions</link><category>CodeSOD</category><pubDate>Wed, 08 Apr 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/two-conversions</guid><description>&lt;p&gt;The father of the &amp;#34;billion dollar mistake&amp;#34; &lt;a href="https://en.wikipedia.org/wiki/Tony_Hoare"&gt;left us&lt;/a&gt; last month. His pointer is finally null. Speaking of null handling, &lt;strong&gt;Randy&lt;/strong&gt; says he was &amp;#34;spelunking&amp;#34; through his codebase and found this pair of functions, which handles null.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-java"&gt;&lt;span class="hljs-keyword"&gt;public&lt;/span&gt; String &lt;span class="hljs-title function_"&gt;getDataString&lt;/span&gt;&lt;span class="hljs-params"&gt;()&lt;/span&gt; {
    &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (dataString == &lt;span class="hljs-literal"&gt;null&lt;/span&gt;) {
        &lt;span class="hljs-keyword"&gt;return&lt;/span&gt; Constants.NOT_AVAILABLE;
    }
    &lt;span class="hljs-keyword"&gt;return&lt;/span&gt; asUnicode(dataString);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I assume &lt;code&gt;Constants.NOT_AVAILABLE&lt;/code&gt; is an empty string, or something similar. It&amp;#39;s reasonable to convert a null into something like that. I don&amp;#39;t know where this fits in the overall stack; I&amp;#39;m of the mind that you should retain the null until you absolutely can&amp;#39;t anymore; like it or not, a &lt;code&gt;null&lt;/code&gt; means something different than an empty string. Or, if we&amp;#39;re going that far, we should be talking about using &lt;code&gt;Optional&lt;/code&gt; or nullable types.&lt;/p&gt;
&lt;p&gt;But that call to &lt;code&gt;asUnicode&lt;/code&gt; seems curious. What&amp;#39;s happening in there?&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-java"&gt;&lt;span class="hljs-keyword"&gt;private&lt;/span&gt; String &lt;span class="hljs-title function_"&gt;asUnicode&lt;/span&gt;&lt;span class="hljs-params"&gt;(String rawValue)&lt;/span&gt; {
    &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (rawValue != &lt;span class="hljs-literal"&gt;null&lt;/span&gt;) {
        &lt;span class="hljs-keyword"&gt;return&lt;/span&gt; HtmlUtils.htmlUnescape(rawValue);
    }
    &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; {
        &lt;span class="hljs-keyword"&gt;return&lt;/span&gt; rawValue;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This function, which is only called from &lt;code&gt;getDataString&lt;/code&gt;, checks for a null. Which we know it won&amp;#39;t get, but it checks anyway. If it isn&amp;#39;t null, we unescape it. If it is null, we return that null.&lt;/p&gt;
&lt;p&gt;Well, I suppose that fits my rule of &amp;#34;retaining the null&amp;#34;, but like, in the worst way you could do it. It honestly feels like, if the &amp;#34;swap the null for an empty string&amp;#34; happens anywhere, it should happen &lt;em&gt;here&lt;/em&gt;. If I ask for the unescaped version of a null string, an empty string is a reasonable return. That makes more sense that doing it in a property getter.&lt;/p&gt;
&lt;p&gt;This code isn&amp;#39;t a trainwreck, but it makes things confusing. Maybe it&amp;#39;s because I&amp;#39;ve been doing a &lt;em&gt;lot&lt;/em&gt; of refactoring lately, but confusing code with unclear boundaries between functions is a raw nerve for me right now, and this particular example is stepping on that nerve.&lt;/p&gt;
&lt;p&gt;While we&amp;#39;re talking about unclear boundaries, I object to the idea that this class is storing &lt;code&gt;dataString&lt;/code&gt; as an HTML escaped string that we unescape any time we want to look at it. It implies that there&amp;#39;s some confusion about which representation is the canonical one: unescaped or escaped. We should store &lt;em&gt;the canonical&lt;/em&gt; one, which I think is unescaped. We should only escape it at the point where we&amp;#39;re sending it into an HTML document (or similar). Convert &lt;em&gt;at the module boundary&lt;/em&gt;, not just any time you want to look at a string.&lt;/p&gt;
&lt;!-- Easy Reader Version: "convert at module boundaries" seems like too tall a demand for a lot of developers --&gt;&lt;div&gt;
	&lt;img src="https://thedailywtf.com/images/inedo/buildmaster-icon.png" style="display:block; float: left; margin: 0 10px 10px 0;"/&gt; [Advertisement] 
	&lt;a href="https://inedo.com/BuildMaster?utm_source=tdwtf&amp;amp;utm_medium=footerad&amp;amp;utm_term=2018&amp;amp;utm_content=Confidence&amp;amp;utm_campaign=Buildmaster_Footer"&gt;Utilize BuildMaster&lt;/a&gt; to release your software with confidence, at the pace your business demands. &lt;a href="https://inedo.com/BuildMaster/download?utm_source=tdwtf&amp;amp;utm_medium=footerad&amp;amp;utm_term=2018&amp;amp;utm_content=Confidence&amp;amp;utm_campaign=Buildmaster_Footer"&gt;Download&lt;/a&gt; today!  
&lt;/div&gt;
&lt;div style="clear: left;"&gt; &lt;/div&gt;
</description><slash:comments>15</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/two-conversions</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>CodeSOD: Proper Property Validation</title><link>https://thedailywtf.com/articles/proper-property-validation</link><category>CodeSOD</category><pubDate>Tue, 07 Apr 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/proper-property-validation</guid><description>&lt;p&gt;&lt;strong&gt;Tim H&lt;/strong&gt; inherited some code which has objects that have many, many properties properties on them. Which is bad. That clearly has no cohesion. But it&amp;#39;s okay, there&amp;#39;s a validator function which confirms that object is properly populated.&lt;/p&gt;
&lt;p&gt;The conditions and body of the conditionals have been removed, so we can see what the flow of the code looks like.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-cpp"&gt;&lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (...) {
    &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (...) {

    } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (...) {

    } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (...) {
        
    } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (...) {
        
    } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (...) {
        
    } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (...) {
        
    } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (...) {
        
    } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (...) {
        
    } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (...) {
        
    } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (...) {
        
    } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (...) {
        
    } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (...) {
        
    } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (...) {
        
    } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (...) {
        
    } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (...) {
        
    } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (...) {
        
    } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (...) {
        
    } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (...) {
        
    } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (...) {
        
    } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (...) {
        
    } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (...) {
        
    } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (...) {
        
    } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (...) {
        
    } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (...) {
        
    } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (...) {
        
    } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (...) {
        
    } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (...) {
        
    } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (...) {
        
    } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (...) {
        
    } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (...) {
        
    } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (...) {
        
    } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (...) {
        
    } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (...) {
        
    } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (...) {
        
    } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (...) {
        
    } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (...) {
        
    } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (...) {
        
    } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (...) {
        
    } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (...) {
        
    }
} &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; {
  &lt;span class="hljs-comment"&gt;// default&lt;/span&gt;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It&amp;#39;s important to note that this conditional doesn&amp;#39;t validate &lt;em&gt;every&lt;/em&gt; property on the object. Just most of them.&lt;/p&gt;
&lt;p&gt;Even with autocomplete I feel like this is going to make you wear out your &amp;#34;{&amp;#34; key.&lt;/p&gt;
&lt;!-- Easy Reader Version: Too many properties --&gt;
&lt;style&gt;.comment { border: none; }&lt;/style&gt;&lt;div&gt;
	[Advertisement] Picking up &lt;b&gt;NuGet&lt;/b&gt; is easy. Getting good at it takes time. &lt;a href="https://inedo.com/support/whitepapers/nuget-guide?utm_source=tdwtf&amp;amp;utm_medium=Footerad&amp;amp;utm_campaign=nuget"&gt;Download our guide to learn the best practice of NuGet for the Enterprise.&lt;/a&gt;

&lt;/div&gt;
&lt;div style="clear: left;"&gt; &lt;/div&gt;</description><slash:comments>26</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/proper-property-validation</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>CodeSOD: The Update Route</title><link>https://thedailywtf.com/articles/the-update-route</link><category>CodeSOD</category><pubDate>Mon, 06 Apr 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/the-update-route</guid><description>&lt;p&gt;Today&amp;#39;s anonymous submission is one of the entries where I look at it and go, &amp;#34;Wait, that&amp;#39;s totally wrong, that could have never worked.&amp;#34; And then I realize, that&amp;#39;s &lt;em&gt;why&lt;/em&gt; it was submitted: it was absolutely broken code which got to production, &lt;em&gt;somehow&lt;/em&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-javascript"&gt;&lt;span class="hljs-title class_"&gt;Collection&lt;/span&gt;.&lt;span class="hljs-title function_"&gt;updateOne&lt;/span&gt;(query, update, &lt;span class="hljs-keyword"&gt;function&lt;/span&gt;(&lt;span class="hljs-params"&gt;err, result, next&lt;/span&gt;)=&amp;gt;{
&lt;span class="hljs-keyword"&gt;if&lt;/span&gt;(err) &lt;span class="hljs-title function_"&gt;next&lt;/span&gt;(err)
...
})
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So, &lt;code&gt;Collection.updateOne&lt;/code&gt; is an API method for MongoDB. It takes three parameters: a filter to find the document, an update to perform on the document, and then an object containing other parameters to control how that update is done.&lt;/p&gt;
&lt;p&gt;So this code is simply &lt;em&gt;wrong&lt;/em&gt;. But it&amp;#39;s worse than that, because it&amp;#39;s wrong in a stupid way.&lt;/p&gt;
&lt;p&gt;When creating routes using ExpressJS, you define a route and a callback to handle the route. The callback takes a few parameters: the request the browser sent, the result we&amp;#39;re sending back, and a next function, which lets you have multiple callbacks attached to the same route. By invoking &lt;code&gt;next()&lt;/code&gt; you&amp;#39;re passing control to the &lt;em&gt;next&lt;/em&gt; callback in the chain.&lt;/p&gt;
&lt;p&gt;So what we have here is either an absolute brain fart, or more likely, a find-and-replace failure. A route handling callback got mixed in with database operations (which, as an aside, if your route handling code is anywhere near database code, you&amp;#39;ve also made a &lt;em&gt;horrible&lt;/em&gt; mistake). The result is a line of code that doesn&amp;#39;t work. And then someone released this non-working code into production.&lt;/p&gt;
&lt;p&gt;Our submiter writes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This blew up our logs today, has been in the code since 2019. I removed it in a handful of other places too.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Which raises the other question: why didn&amp;#39;t this blow up the logs &lt;em&gt;earlier&lt;/em&gt;?&lt;/p&gt;
&lt;!-- Easy Reader Version: Obviously diseased code released in 2019. Is this where COVID came from? --&gt;&lt;div&gt;
	&lt;img src="https://thedailywtf.com/images/inedo/proget-icon.png" style="display:block; float: left; margin: 0 10px 10px 0;"/&gt; [Advertisement] 
	ProGet’s got you covered with security and access controls on your NuGet feeds. &lt;a href="https://inedo.com/proget/private-nuget-server?utm_source=tdwtf&amp;amp;utm_medium=footer&amp;amp;utm_content=GotYouCoveredFooter&amp;amp;utm_campaign=Cyclops2020"&gt;Learn more.&lt;/a&gt;
&lt;/div&gt;
&lt;div style="clear: left;"&gt; &lt;/div&gt;
</description><slash:comments>8</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/the-update-route</wfw:comment></item></channel></rss>