<?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 Jul 2026 22:02:01 GMT</lastBuildDate><item><dc:creator>Lyle Seaman</dc:creator><title>Error'd: The Song that Never Ends?</title><link>https://thedailywtf.com/articles/the-song-that-never-ends</link><category>Error'd</category><pubDate>Fri, 24 Jul 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/the-song-that-never-ends</guid><description>&lt;p&gt;&amp;#34;Watch to the end&amp;#34;, the scammers demand. In today&amp;#39;s episode of &lt;em&gt;Error&amp;#39;d&lt;/em&gt;, the end is a long
time coming.
But at least it&amp;#39;s amusing. In the meantime, Amazon irked and/or terrified
thousands of their customers last week by mailing out ridiculously inflated
bills. It&amp;#39;s been covered extensively elsewhere but why should we miss all the fun? &lt;/p&gt;

&lt;p&gt;It was
&lt;strong&gt;Willy&lt;/strong&gt; who worried 
&amp;#34;Amazon prices seem to have crept up this month, finance
are going to have something to say&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#a7e89b1dc59e4c3ba3b8571a056825d6"&gt;&lt;img itemprop="image" border="0" alt="a7e89b1dc59e4c3ba3b8571a056825d6" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/07/23/a7e89b1dc59e4c3ba3b8571a056825d6.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;
&lt;strong&gt;Dave A.&lt;/strong&gt; is on the horns of a dilemma. 
&amp;#34;Is it optional or required? Make up your mind, TAP!
I&amp;#39;m TAPping my fingers waiting for you to decide.&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#ffd147510c4b455c9c43e60763e68bf8"&gt;&lt;img itemprop="image" border="0" alt="ffd147510c4b455c9c43e60763e68bf8" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/07/23/ffd147510c4b455c9c43e60763e68bf8.jpeg"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&amp;#34;This rating is through the roof!&amp;#34; exclaims a regular who wants to be 
&lt;strong&gt;Anonymous&lt;/strong&gt; today.
&amp;#34;We&amp;#39;re done with linear rating scales. Now you can have
5 stars on both X and Y axes. Also, given
this is for a company that cleans roofs, we can
make a joke this rating is out of the roof,
and out of the &amp;lt;div&amp;gt; as well. In case you&amp;#39;re
interested and in case you want take a screenshot yourself:
https://mijndakschoon.nl/&amp;#34; It&amp;#39;s real; I checked.
&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#11083f7140b449a48c5218843699cc24"&gt;&lt;img itemprop="image" border="0" alt="11083f7140b449a48c5218843699cc24" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/07/23/11083f7140b449a48c5218843699cc24.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;
&lt;strong&gt;Richard H.&lt;/strong&gt; found a flubstituted email.
&amp;#34;Quickbooks here reminding me that I failed to pay invoice
number &amp;#34;{{rand_invoice}&amp;#34; Or this might be a scam/phishing email. Hard
to tell.&amp;#34; I&amp;#39;ll bet {{money}} on scam.
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#710be181fec049ab8f717ae185783f5f"&gt;&lt;img itemprop="image" border="0" alt="710be181fec049ab8f717ae185783f5f" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/07/23/710be181fec049ab8f717ae185783f5f.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;
&lt;strong&gt;B.J. H.&lt;/strong&gt; is usually quite concise. Usually.
&amp;#34;If this is ALL NORMAL I&amp;#39;m worried what will happen
in an emergency&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#7885ce2a1ae64033b9b46e472925edd9"&gt;&lt;img itemprop="image" border="0" alt="7885ce2a1ae64033b9b46e472925edd9" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/07/23/7885ce2a1ae64033b9b46e472925edd9.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>12</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/the-song-that-never-ends</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>Classic WTF: My Many Girlfriends</title><link>https://thedailywtf.com/articles/classic-wtf-my-many-girlfriends</link><category>Feature Articles</category><pubDate>Thu, 23 Jul 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/classic-wtf-my-many-girlfriends</guid><description>&lt;blockquote&gt;Honestly, with the wildfire smoke and the oppressive heat, maybe it&amp;#39;s time to find a nice quiet cave to hang out in. Something with no natural light and no natural ventilation. I wonder if anybody has a place like that… &lt;a href="https://thedailywtf.com/articles/my-many-girlfriends"&gt;Original&lt;/a&gt;. --&lt;strong&gt;Remy&lt;/strong&gt;&lt;/blockquote&gt;

&lt;p&gt;In the long ago, wild-west days of the late 90s, there was an expectation that managers would put up with a certain degree of eccentricity from their software developers. The IT and software boom was still &lt;em&gt;new&lt;/em&gt;, people didn&amp;#39;t quite know what worked and what didn&amp;#39;t, the &amp;#34;nerds had conquered the Earth&amp;#34; and managers just had to roll with this reality. So when &lt;strong&gt;Barry D&lt;/strong&gt; gave the okay to hire Sten, who came with glowing recommendations from his previous employers, Barry and his team were ready to deal with eccentricities.&lt;/p&gt;
&lt;p&gt;Of course, on the first day, building services came to Barry with some concerns about Sten&amp;#39;s requests for his workspace. No natural light. No ventilation ducts that couldn&amp;#39;t be closed. And then the co-workers who had interacted with Sten expressed their concerns.&lt;/p&gt;
&lt;p&gt;During the hiring process, Sten had come off as a bit odd, but this seemed unusual. So Barry descended the stairs into the basement, to find Sten&amp;#39;s office, hidden between a janitorial closet and the breaker box for the building. Barry knocked on the door.&lt;/p&gt;
&lt;p&gt;&amp;#34;Sten awaits you. Enter.&amp;#34;&lt;/p&gt;
&lt;p&gt;Barry entered, and found Sten precariously perched on an office chair, removing several of the fluorescent bulbs from the ceiling fixture. The already dark space was downright cave-like with Sten&amp;#39;s twilight lighting arrangement. &amp;#34;He welcomes you,&amp;#34; Sten said.&lt;/p&gt;
&lt;p&gt;&amp;#34;Uh, yeah, hi. I&amp;#39;m Barry, I&amp;#39;m working on the Netware 3.x portion of the product, and Carl just wanted me to check in. Everything okay?&lt;/p&gt;
&lt;p&gt;&amp;#34;This is acceptable to Sten,&amp;#34; Sten said, gesturing at the dim office as he descended from the chair. Sten&amp;#39;s watched beeped on the hour, and Sten carefully placed the fluorescent bulb off to the side, in a stack of similarly removed bulbs, and then went to his desk. In rapid succession, he popped open a few pill containers- 5000mg of vitamin C, a handful of herbal and homeopathic pills- and gulped them down. He then washed the pills down with a tea that smelled like a mixture of kombucha and a dead raccoon buried in a dumpster.&lt;/p&gt;
&lt;p&gt;&amp;#34;He is pleased to meet you,&amp;#34; Sten said, with a friendly nod. Barry blinked, trying to track the conversation. &amp;#34;And he is pleased with it, and has made great progress on building it. You will like his things, yes?&amp;#34;&lt;/p&gt;
&lt;p&gt;&amp;#34;Uh… yes?&amp;#34;&lt;/p&gt;
&lt;p&gt;&amp;#34;He is pleased, and I hope you can go to him and tell him that he is pleased with this, and set his mind at ease about Sten.&amp;#34;&lt;/p&gt;
&lt;p&gt;So it went with Sten. He strictly referred to himself in the third person. He frequently spoke in sentences with nothing but pronouns, and frequently reused the same pronoun to refer to different people. The vagueness was confounding, but Sten&amp;#39;s skill was in Netware 2.x- a rare and difficult set of skills to find. So long as the code was clear, everything would be fine.&lt;/p&gt;
&lt;p&gt;Everything was not fine. While Sten&amp;#39;s code didn&amp;#39;t have the empty vagueness of unclear pronouns, it also didn&amp;#39;t have the clarity of meaningful variable names. Every variable and every method name was given a female first name. &amp;#34;Each of these is named for one of Sten&amp;#39;s girlfriends.&amp;#34; Given the number of names required, it was improbable that these were &lt;em&gt;real&lt;/em&gt; girlfriends, but Sten gave no hint about this being fiction.&lt;/p&gt;
&lt;p&gt;There was some consistency about the names. Instead of &lt;code&gt;i&lt;/code&gt;, &lt;code&gt;j&lt;/code&gt;, and &lt;code&gt;k&lt;/code&gt; loop variables, you had &lt;code&gt;Ingrid&lt;/code&gt;, &lt;code&gt;Jane&lt;/code&gt;, and &lt;code&gt;Katy&lt;/code&gt;. &lt;code&gt;Zaria&lt;/code&gt; seemed to be only used as a parameter to methods. &lt;code&gt;Karla&lt;/code&gt; seemed to be a temporary variable to hold intermediate results. None of these conventions were documented, obviously, and getting Sten to explain them was an exercise in confusion.&lt;/p&gt;
&lt;p&gt;It led to some entertaining code reviews. &amp;#34;Michelle here talks to Nancy about Francine, and then Ingrid goes through Francine&amp;#39;s purse to find Stacy.&amp;#34; This described a method (Michelle) which called another method (Nancy), passing an array (Francine). Nancy iterates across the array (using Ingrid), to find a specific entry in the array (Stacy).&lt;/p&gt;
&lt;p&gt;Sten lasted a few weeks at the job. It wasn&amp;#39;t a very successful period of time for anyone. Peculiarities aside, the final straw wasn&amp;#39;t the odd personal habits or the strange coding conventions- Sten just couldn&amp;#39;t produce working code quickly enough to keep up with the rest of the team. Sten had to be let go.&lt;/p&gt;
&lt;p&gt;A few weeks later, Barry got a call from a hiring manager at Initrode. Sten had applied, and they were checking the reference. &amp;#34;Yes, Sten worked here,&amp;#34; Barry confirmed. After a moment&amp;#39;s thought, he added, &amp;#34;I suggest that you bring him in for a second interview, and have him walk you through some code that he&amp;#39;s written.&amp;#34;&lt;/p&gt;
&lt;p&gt;A few weeks after that, Barry got a gift basket from the manager at Initrode.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Thanks for the tip&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Sten did &lt;em&gt;not&lt;/em&gt; get hired at Initrode.&lt;/p&gt;
&lt;!-- Easy Reader Version: This sounds like somebody's Vampire the Masquerade LARP getting out of hand --&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>11</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/classic-wtf-my-many-girlfriends</wfw:comment></item><item><dc:creator>Alex Papadimoulis</dc:creator><title>Classic WTF: Server Room Fans and More Fun</title><link>https://thedailywtf.com/articles/classic-wtf-server-room-fans-and-more-fun</link><category>Feature Articles</category><pubDate>Wed, 22 Jul 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/classic-wtf-server-room-fans-and-more-fun</guid><description>&lt;blockquote&gt;It&amp;#39;s been pretty hot lately. Probably should use a fan to cool off. Mind the trip hazards. &lt;a href="https://thedailywtf.com/articles/Server-Room-Fans-and-More-Server-Room-Fun"&gt;Original&lt;/a&gt;. --&lt;strong&gt;Remy&lt;/strong&gt;&lt;/blockquote&gt;

&lt;p&gt;&amp;#34;It&amp;#39;s that time of year again,&amp;#34; &lt;b&gt;Robert Rossegger&lt;/b&gt; wrote, &amp;#34;you know, when the underpowered air conditioner just can&amp;#39;t cope with the non-winter weather? Fortunately, we have a solution for that... and all we need to do is just keep an extra eye on people walking near the (completely ajar) server room door.&amp;#34;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;img itemprop="image" alt="" src="https://thedailywtf.com/images/12/q3/svr/IMG_20110709_231027.jpg"/&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&amp;#34;For as long as anyone can remember,&amp;#34; &lt;b&gt;Mike E&lt;/b&gt; wrote, &amp;#34;the fax machine in one particular office was a bit spotty whenever it was wet out. After having the telco test the lines from the DMARC to the office, I replaced the hardware, looked for water leaks all along the run, and found precisely nothing. The telco disavowed all responsibility, so the best solution I could offer was to tell the users affected by this to look out the window and, if raining, go to another fax machine.&amp;#34;&lt;/p&gt;
&lt;p&gt;&amp;#34;One day, we had the telco out adding a T1 and they had the cap off of the vault where our cables come in to the building. Being curious by nature, I wandered over when nobody was around and wound up taking this picture. After emailing same to the district manager of the telco, suddenly we had the truck out for an extra day (accompanied by one very sullen technician) and the fax machine worked perfectly from then on.&amp;#34;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;img alt="" src="https://thedailywtf.com/images/12/q3/svr/malvault.jpg"/&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&amp;#34;I found this when I came back in to work after some time off,&amp;#34; writes &lt;b&gt;Sam Nicholson&lt;/b&gt;, &amp;#34;that drive is actually earmarked for &amp;#39;off-site backup&amp;#39;. Also, this is what passes for a server rack at this particular software company. Yes, it&amp;#39;s made of wood.&amp;#34;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;img alt="" src="https://thedailywtf.com/images/12/q3/svr/Backupdrive.jpg"/&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&amp;#34;Some people use &amp;#39;proper electrical wiring&amp;#39;,&amp;#34; writes &lt;b&gt;Mike&lt;/b&gt;, &amp;#34;others use &amp;#39;extension cords&amp;#39;. We, on the other hand, apparently do this.&amp;#34;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;img alt="" src="https://thedailywtf.com/images/12/q3/svr/fans.jpg"/&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&amp;#34;I was staying at a hotel in Manhattan and somehow took a wrong turn and wound up in the stairwell,&amp;#34; wrote &lt;b&gt;Dan&lt;/b&gt;, &amp;#34;not only is all their equipment in a public place (without even a door), it&amp;#39;s mostly hanging from cables in several places.&amp;#34;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;img alt="" src="https://thedailywtf.com/images/12/q3/svr/IMG00070-20110622-0836.jpg"/&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&amp;#34;I spotted this in China,&amp;#34; writes &lt;b&gt;Matt&lt;/b&gt;, &amp;#34;This poor switch was bolted to a column in the middle of some metal shop about 4m above ground. There were many more curious things, but I decided to keep a low profile and stop taking pictures.&amp;#34;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;img alt="" src="https://thedailywtf.com/images/12/q3/svr/IMG_2435.jpg"/&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt; &lt;/p&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/classic-wtf-server-room-fans-and-more-fun</wfw:comment></item><item><dc:creator>Mark Bowytz</dc:creator><title>CodeSOD: Classic WTF: Fork and Log</title><link>https://thedailywtf.com/articles/classic-wtf-fork-and-log</link><category>CodeSOD</category><pubDate>Tue, 21 Jul 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/classic-wtf-fork-and-log</guid><description>&lt;blockquote&gt;We keep our summer break going. Today, there&amp;#39;s something floating in the pool, and I don&amp;#39;t think it&amp;#39;s a Snickers bar. &lt;a href="https://thedailywtf.com/articles/Fork-and-Log"&gt;Original&lt;/a&gt;. --&lt;strong&gt;Remy&lt;/strong&gt;&lt;/blockquote&gt;

&lt;p&gt;A few years back, &lt;strong&gt;Adam C.&lt;/strong&gt; was brought in to help with some performance problems that appeared while load testing a VXML Platform.  The project was already well behind and they couldn&amp;#39;t figure out why the system kept falling over under a very slight load. To make matters worse, Adam had absolutely no prior knowledge of the system or its software other than Wikipedia’s definition of what &lt;a href="http://en.wikipedia.org/wiki/VoiceXML"&gt;VXML&lt;/a&gt; is. 
&lt;/p&gt;&lt;p&gt;
A veteran to these sorts of situations, Adam grabbed a coffee, a donut, and then started picking through the application logs to get a feel for what the system is doing and where something might be going wrong.
&lt;/p&gt;&lt;p&gt;
Looking in /var/log/messages, he was pleased to find with several days’ worth of messages, but over and over again, the same entry popped up:
&lt;/p&gt;
&lt;blockquote&gt;
&lt;pre&gt;Exception encountered writing error log. 
&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;
&amp;#34;Seriously, who logs an error that they can&amp;#39;t log an error? ...and is that even possible?&amp;#34; Adam wondered aloud after seeing the same senseless message for what he figured to be the hundredth time.
&lt;/p&gt;&lt;p&gt;
Frustrated, and hoping to learn what ludicrous conditions might precipitate a log to contain such a message, Adam dug into the source and hit paydirt in the form of this wonderful nugget of code:
&lt;/p&gt;&lt;blockquote&gt;
&lt;pre&gt;public void error(String logID, String errStr) {
  StringBuffer errLogCmd = new StringBuffer(&amp;#34;/usr/bin/logger -p &amp;#34;);
  try {
    Runtime rt = Runtime.getRuntime();
    errLogCmd.append(errlogFacility);
    errLogCmd.append(&amp;#34; -t &amp;#34;);
    errLogCmd.append(logID);
    errLogCmd.append(&amp;#34; &amp;#34;);
    errLogCmd.append(errStr);
    rt.exec(errLogCmd.toString());
  } catch (Exception ele) {
    System.out.println(&amp;#34;Exception encountered writing error log.&amp;#34; + ele.getMessage());
  }
}
&lt;/pre&gt;
&lt;/blockquote&gt;
As he mentally parsed his way through the code, Adam could feel his breakfast tickling up from the back of his throat in reaction to the number of WTF’s he found himself facing.
&lt;p&gt;&lt;/p&gt;&lt;p&gt;
He couldn’t decide what about the implementation was worse -  forking off an external process to log something,  the fact that log4j could have been used to send stuff to syslog (which the project used elsewhere), or that  since the program&amp;#39;s output was already piped to /usr/bin/log, just doing a System.out.println() would have been equivalent to this code.
&lt;/p&gt;&lt;p&gt;
As it turned out, this wasn’t the root cause behind the performance problems, but needless to say, that code got junked rather quickly and he moved on to looking for the next performance bottleneck.
&lt;/p&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>4</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/classic-wtf-fork-and-log</wfw:comment></item><item><dc:creator>Alex Papadimoulis</dc:creator><title>CodeSOD: Classic WTF: The Table Selector</title><link>https://thedailywtf.com/articles/classic-wtf-the-table-selector</link><category>CodeSOD</category><pubDate>Mon, 20 Jul 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/classic-wtf-the-table-selector</guid><description>&lt;blockquote&gt;It&amp;#39;s summer break time, which as always, means we dip back into classic articles. Today, we pick which table we want. &lt;a href="https://thedailywtf.com/articles/The-Table-Selector"&gt;Original&lt;/a&gt;. --&lt;strong&gt;Remy&lt;/strong&gt;&lt;/blockquote&gt;

&lt;p&gt;&amp;#34;In my native language of German,&amp;#34; writes &lt;b&gt;Christian&lt;/b&gt;, &amp;#34;the word quellcode is a pretty direct translation of &amp;#39;source code&amp;#39;.&amp;#34;&lt;/p&gt;
&lt;p&gt;&amp;#34;Unfortunately, bad code seems to cross language barriers - as does that famous three-letter explicit adjective. But occasionally I’ll find a piece of quellcode that deserves its own special, localized expletive: quäl-kot. When I stumbled across this interface in our quellcode, &lt;em&gt;quäl-kot&lt;/em&gt; was the first thing that came to my mind.&amp;#34;&lt;/p&gt;
&lt;blockquote&gt;
&lt;pre&gt;public interface ITableSelector
{
    string selectTable1();

    string selectTable2();

    string selectTable3();

    string selectTable4a();

    string selectTable4b();

    string selectTable5();

    string selectTable6();

    string selectTable7a();

    string selectTable7b();

    string selectTable8();

    string selectTable9a();

    string selectTable9b();

    string selectTable10();

    string selectTable11();

    string selectTable12();

    string selectTable13();

    string selectTable14a();

    string selectTable14b();

    string selectTable14c();

    string selectTable14d();

    string selectTable15();

    string selectTable16();

    string selectTable17();

    string selectTable18();

    string selectTable19();

    string selectTable20();

    string selectTable21a();

    string selectTable21b();

    string selectTable22();

    string selectTable23();

    string selectTable24();

    string selectTable25();

    string selectTable26();

    string selectTable27();

    string selectTable28();

    string selectTable29();

    string selectTable30();

    string selectTable31();
}&lt;/pre&gt;
&lt;/blockquote&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>11</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/classic-wtf-the-table-selector</wfw:comment></item><item><dc:creator>Lyle Seaman</dc:creator><title>Error'd: Princess Pricing </title><link>https://thedailywtf.com/articles/princess-pricing</link><category>Error'd</category><pubDate>Fri, 17 Jul 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/princess-pricing</guid><description>&lt;p&gt;&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Sam&lt;/strong&gt; suggests this Error&amp;#39;d indicates 
&amp;#34;Disney+ preparing the ground for usage-based billing.&amp;#34; I&amp;#39;m intrigued by the idea that Disney might charge by the minute, but I suspect the reality is far more mundane.
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#13e08caf609f4133afd419a76acb432a"&gt;&lt;img itemprop="image" border="0" alt="13e08caf609f4133afd419a76acb432a" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/07/15/13e08caf609f4133afd419a76acb432a.jpeg"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Silly prices at online shopping sites don&amp;#39;t usually make it through the gauntlet here, but I&amp;#39;m making an exception for the math, as 
&lt;strong&gt;Rob H.&lt;/strong&gt; points out 
&amp;#34;it ain&amp;#39;t mathin&amp;#39;.&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#0924416949684290b36ad0d823129181"&gt;&lt;img itemprop="image" border="0" alt="0924416949684290b36ad0d823129181" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/07/15/0924416949684290b36ad0d823129181.jpeg"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;and 
&lt;strong&gt;Harrison&lt;/strong&gt; suggests a novel kind of discounting math 
&amp;#34;I went to the supermarket later at night for some
beers, and had a snoop around the yellow sticker items
for anything I might need or could freeze. This bakery
item was priced in reverse, Was: 0.00, Now 1.99, discounted
by negative infinity percent, and infinity is even printed upside
down somehow.&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#d41527fab58d46fa97f4477dfcbf659d"&gt;&lt;img itemprop="image" border="0" alt="d41527fab58d46fa97f4477dfcbf659d" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/07/15/d41527fab58d46fa97f4477dfcbf659d.jpeg"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;We&amp;#39;ve got a mojibake from 
&lt;strong&gt;dragoncoder047&lt;/strong&gt;:
&amp;#34;Was browsing through the widget options on my iPhone home
screen and found that Game Center had decided to do
this. Mind you, my iPhone was, and always had been,
set to English.&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#c4fb48f719b34b5393e274cc6bc48f2a"&gt;&lt;img itemprop="image" border="0" alt="c4fb48f719b34b5393e274cc6bc48f2a" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/07/15/c4fb48f719b34b5393e274cc6bc48f2a.jpeg"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;Finally a combination of typical time travel and package tracker shenanigans, not explained by time zone hijinks.
&lt;strong&gt;Evelyn&lt;/strong&gt; notes 
&amp;#34;Apparently the package was registered in July, on its way
during January, and then got back to July.&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#ef7d6784e50a48eebfaf4b912c8caa55"&gt;&lt;img itemprop="image" border="0" alt="ef7d6784e50a48eebfaf4b912c8caa55" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/07/15/ef7d6784e50a48eebfaf4b912c8caa55.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>9</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/princess-pricing</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>CodeSOD: Wait Longer</title><link>https://thedailywtf.com/articles/wait-longer</link><category>CodeSOD</category><pubDate>Thu, 16 Jul 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/wait-longer</guid><description>&lt;p&gt;&lt;strong&gt;Karen&lt;/strong&gt; was maintaining some specification tests that were flaky. Not &lt;em&gt;extremely&lt;/em&gt; flaky, but three or four times out of a thousand, the tests would just fail. The tests were complicated, and some of the operations were timing sensitive, so it wasn&amp;#39;t precisely surprising- but the problem was that they were actually generous with their timing windows. The unit tests passed consistently, it was only these functional, specification-based tests that failed.&lt;/p&gt;
&lt;p&gt;So, for example, there were sections in the tests where they wanted to wait at &lt;em&gt;least&lt;/em&gt; 2ms. Since the code and tests were in TypeScript, they used the &lt;code&gt;setTimeout&lt;/code&gt; function, which per standard JavaScript documentation &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Window/setTimeout"&gt;warns that it may wait longer&lt;/a&gt;. But again, Karen was &lt;em&gt;fine&lt;/em&gt; with longer.&lt;/p&gt;
&lt;p&gt;Unfortunately for Karen, the documentation for NodeJS is less specific, as &lt;a href="https://nodejs.org/api/timers.html#settimeoutcallback-delay-args"&gt;it makes no guarantees&lt;/a&gt; about when the timeout function gets invoked. This means that it can fire the timeout &lt;em&gt;before&lt;/em&gt; the time has elapsed.&lt;/p&gt;
&lt;p&gt;After many, many hours of debugging, that was exactly the situation that Karen found herself in. Which is why her very simple &lt;code&gt;wait&lt;/code&gt; function went from:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-typescript"&gt;&lt;span class="hljs-keyword"&gt;export&lt;/span&gt; &lt;span class="hljs-keyword"&gt;const&lt;/span&gt; &lt;span class="hljs-title function_"&gt;wait&lt;/span&gt; = (&lt;span class="hljs-params"&gt;ms:&lt;span class="hljs-built_in"&gt;number&lt;/span&gt;&lt;/span&gt;) =&amp;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;complete&lt;/span&gt;) =&amp;gt;&lt;/span&gt; &lt;span class="hljs-built_in"&gt;setTimeout&lt;/span&gt;(complete, ms));
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To the much more awkward:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-typescript"&gt;&lt;span class="hljs-keyword"&gt;export&lt;/span&gt; &lt;span class="hljs-keyword"&gt;const&lt;/span&gt; wait = (&lt;span class="hljs-attr"&gt;ms&lt;/span&gt;: &lt;span class="hljs-built_in"&gt;number&lt;/span&gt;) {
    &lt;span class="hljs-keyword"&gt;const&lt;/span&gt; target = performance.&lt;span class="hljs-title function_"&gt;now&lt;/span&gt;() + ms;
    &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;complete&lt;/span&gt;) =&amp;gt;&lt;/span&gt; {
        &lt;span class="hljs-keyword"&gt;const&lt;/span&gt; &lt;span class="hljs-title function_"&gt;checkReady&lt;/span&gt; = (&lt;span class="hljs-params"&gt;&lt;/span&gt;) =&amp;gt; {
            &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (performance.&lt;span class="hljs-title function_"&gt;now&lt;/span&gt;() &amp;gt; target) {
                &lt;span class="hljs-title function_"&gt;complete&lt;/span&gt;();
            } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; {
                &lt;span class="hljs-built_in"&gt;setTimeout&lt;/span&gt;(checkReady, &lt;span class="hljs-number"&gt;1&lt;/span&gt;);
            }
        }
        &lt;span class="hljs-built_in"&gt;setTimeout&lt;/span&gt;(checkReady, &lt;span class="hljs-number"&gt;1&lt;/span&gt;);
    });
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This version of the function checks the time every millisecond, and only completes the operation if we&amp;#39;ve waited &lt;em&gt;at least&lt;/em&gt; as long as our target duration. This ensures that the timeout never fires &lt;em&gt;too soon&lt;/em&gt; and it fixes the janky tests. But it&amp;#39;s also terrible. Terrible that it exists. Terrible that this is the best solution. Terrible that our functional tests need to be so time sensitive. And terrible that the Node runtime actually breaks the one consistent scheduling guarantee that pretty much every other scheduler does: that it&amp;#39;ll wait &lt;em&gt;at least&lt;/em&gt; as long as you asked, but might wait much longer.&lt;/p&gt;
&lt;p&gt;At best, we can say, &amp;#34;at least it&amp;#39;s only testing code.&amp;#34;&lt;/p&gt;
&lt;!-- Easy Reader Version: wait for it… --&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>11</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/wait-longer</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>CodeSOD: The Error Check</title><link>https://thedailywtf.com/articles/the-error-check</link><category>CodeSOD</category><pubDate>Wed, 15 Jul 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/the-error-check</guid><description>&lt;p&gt;Today&amp;#39;s submission is less a WTF and more a, &amp;#34;Yeah, that&amp;#39;d annoy me too.&amp;#34;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Stevie&lt;/strong&gt; works in a code-base that&amp;#39;s largely C, which means function return values are usually used to communicate to status codes. The standard:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-c"&gt;BOOL success = someFunc();
&lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (!success) {&lt;span class="hljs-comment"&gt;// handle the error&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If &lt;code&gt;someFunc&lt;/code&gt; returns &lt;code&gt;TRUE&lt;/code&gt;, we succeeded, otherwise we failed.&lt;/p&gt;
&lt;p&gt;There&amp;#39;s nothing wrong with that convention. But there is something wrong with one of the long-time developers on the project, because they have their own idiom for doing this. And they&amp;#39;ve been around long enough that &lt;em&gt;their&lt;/em&gt; approach is the convention other developers follow. It&amp;#39;s not &lt;em&gt;wrong&lt;/em&gt;, per se, just confusing:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-c"&gt;BOOL error = someFunc();
&lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (error == FALSE)
{
    &lt;span class="hljs-comment"&gt;//handle the error&lt;/span&gt;
    errorCode = GetLastError();
    &lt;span class="hljs-comment"&gt;//…&lt;/span&gt;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Yes, pretty much anywhere an error can happen, they check if &lt;code&gt;error == FALSE&lt;/code&gt;, and if that&amp;#39;s true, they have an error.&lt;/p&gt;
&lt;p&gt;I&amp;#39;d say, &amp;#34;at least they&amp;#39;re consistent&amp;#34;, but they&amp;#39;re not. It&amp;#39;s the convention, sure, but nobody wrote this down as the convention. New developers come in all the time, and they start out writing code in a more &amp;#34;normal&amp;#34; pattern. But the existing code has its pattern, and there is a &lt;em&gt;lot&lt;/em&gt; of it. It has a mass and an inertia that is stronger than any developer. They don&amp;#39;t change the code, the code &lt;em&gt;changes them&lt;/em&gt;.&lt;/p&gt;
&lt;!-- Easy Reader Version: if (easyReader == FALSE) This doesn't go the way you'd expect, does it? --&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>32</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/the-error-check</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>CodeSOD: AAYFN</title><link>https://thedailywtf.com/articles/aayfn</link><category>CodeSOD</category><pubDate>Tue, 14 Jul 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/aayfn</guid><description>&lt;p&gt;&lt;strong&gt;Jason M&lt;/strong&gt; sends us some Ruby code.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-ruby"&gt;&lt;span class="hljs-keyword"&gt;def&lt;/span&gt; &lt;span class="hljs-title function_"&gt;bv&lt;/span&gt;(&lt;span class="hljs-params"&gt;prop, tv=&lt;span class="hljs-string"&gt;&amp;#34;Yes&amp;#34;&lt;/span&gt;, fv=&lt;span class="hljs-string"&gt;&amp;#34;No&amp;#34;&lt;/span&gt;, nv=&lt;span class="hljs-string"&gt;&amp;#34;Not Specified&amp;#34;&lt;/span&gt;&lt;/span&gt;)
  v = &lt;span class="hljs-variable language_"&gt;self&lt;/span&gt;.send(prop)
  &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; v === &lt;span class="hljs-literal"&gt;true&lt;/span&gt;
    tv
  &lt;span class="hljs-keyword"&gt;elsif&lt;/span&gt; v === &lt;span class="hljs-literal"&gt;false&lt;/span&gt;
    fv
  &lt;span class="hljs-keyword"&gt;else&lt;/span&gt;
    nv
  &lt;span class="hljs-keyword"&gt;end&lt;/span&gt;
 &lt;span class="hljs-keyword"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The obvious WTF here is the function name and parameter names. &lt;abbr title="Always Abbreviate Your Function Names"&gt;AAYFN&lt;/abbr&gt;(always abbreviate your function names) seems to be the convention here. But it also contains a more Ruby-specific WTF.&lt;/p&gt;
&lt;p&gt;The function name &lt;code&gt;bv&lt;/code&gt; is short for &amp;#34;boolean value&amp;#34;, obviously. &lt;code&gt;tv&lt;/code&gt; is the &amp;#34;true value&amp;#34;, &lt;code&gt;fv&lt;/code&gt; is the false value, and &lt;code&gt;nv&lt;/code&gt; is the null value. So this is really about pretty-printing boolean values and converting them to strings. While the terrible names make it hard to understand, it&amp;#39;s not &lt;em&gt;that hard&lt;/em&gt; to figure out what&amp;#39;s going wrong here. I hate it, don&amp;#39;t get me wrong, but it just makes me sigh with disappointment, not groan.&lt;/p&gt;
&lt;p&gt;No, the thing that makes me groan is &lt;code&gt;v = self.send(prop)&lt;/code&gt;. This is a very Ruby idiom that lets you access a member of the class by name; essentially it&amp;#39;s like doing &lt;code&gt;self.prop&lt;/code&gt;, but since &lt;code&gt;prop&lt;/code&gt; is a variable containing a property name, we have to &lt;code&gt;send&lt;/code&gt; it.&lt;/p&gt;
&lt;p&gt;This is metaprogramming by strings, which is the main reason I end up hating it. But in this specific instance, it offers us a lot of potential issues. First, if &lt;code&gt;prop&lt;/code&gt; is anything not boolean, we just return &amp;#34;Not Specified&amp;#34;, which is incredibly misleading. I&amp;#39;d argue that if we attempt to use it on a non-boolean field we should throw an exception. Which opens the question: if &lt;code&gt;prop&lt;/code&gt; doesn&amp;#39;t &lt;em&gt;exist&lt;/em&gt;, is that a non-boolean field, or is that a &amp;#34;enh, just call it null&amp;#34; situation? Because right now, that &lt;em&gt;will&lt;/em&gt; throw an exception. It&amp;#39;ll also throw an exception if the thing being accessed is a function that takes parameters. These behaviors may be surprising.&lt;/p&gt;
&lt;p&gt;Now, I don&amp;#39;t know the calling pattern. It&amp;#39;s possible that whatever function calls this already has a good list of the allowed boolean values, and will never call this on a &lt;code&gt;prop&lt;/code&gt; that doesn&amp;#39;t exist. Certainly, that&amp;#39;s what &lt;a href="https://rubyguides.dev/reference/core-classes/send-method/#using-send-with-care"&gt;the Ruby docs recommend&lt;/a&gt;. But I&amp;#39;m going to hate it anyway, because this kind of runtime metaprogramming by passing strings around is eternally asking for trouble. And while I haven&amp;#39;t done a huge amount of Ruby, I&amp;#39;ve done enough to know that any non-trivial codebase &lt;em&gt;ends up like this&lt;/em&gt; once the metaprogramming band-aid is taken off.&lt;/p&gt;
&lt;p&gt;Now, if you don&amp;#39;t mind, I&amp;#39;ll go back to doing my metaprogramming with C++ templates, which are simple, clear, and never result in wildly unmaintainable code because you ended up reimplementing LISP in template operations.&lt;/p&gt;
&lt;!-- Easy Reader Version: "Just monkey patch it," seems to be the dominant way to solve problems in Ruby, and I hate it --&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>17</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/aayfn</wfw:comment></item><item><dc:creator>Ellis Morning</dc:creator><title>The Easy No</title><link>https://thedailywtf.com/articles/the-easy-no</link><category>Feature Articles</category><pubDate>Mon, 13 Jul 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/the-easy-no</guid><description>&lt;blockquote&gt;
&lt;p&gt;There were thousand tickets in the backlog, and I was on the trail of a &lt;a href="https://thedailywtf.com/articles/the-hot-fix"&gt;weird printer issue&lt;/a&gt;. I had a suspect, but that wasn&amp;#39;t enough to close the ticket. I&amp;#39;m &lt;strong&gt;Anonymous&lt;/strong&gt;. This is my story.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Whenever you hit the Print button, a request launches into the ether. “Print one copy of this file, double-sided.”&lt;/p&gt;
&lt;p&gt;But you can’t just chuck it out there aimlessly. You gotta tell it where to go. So that’s why we have Internet Protocol, or IP. Every computer, every printer, every device on every network has one or more IP addresses for different operations. They’re just like the address you scribble on the envelope holding Grandma’s Christmas card. Send your print request to the right IP, and you’re in business. Send it to the wrong IP, and they’ll be shaking their heads on the other end. “Print? But all I know how to do is tell you the weather!”&lt;/p&gt;
&lt;p&gt;As for what happens next, you’re at the mercy of the program’s error handling. If you’re lucky, they’ll send a detailed error message. If you’re not, they could ignore you, act up in weird ways, or completely self-destruct in a violent crash.&lt;/p&gt;
&lt;p&gt;I was neck-deep in a Tech Support ticket concerning a printer in Human Resources. Not only was Grandma’s Christmas card landing in Pluto, the Plutonians were writing back, in the form of mysterious complaints that were nothing like the documents the printer had been tasked with.&lt;/p&gt;
&lt;p&gt;My troubleshooting hadn’t shot much trouble at all, so I’d bugged some friends for ideas. Reynaldo had been reminded of an old, retired HR program for logging anonymous employee complaints. While our developer friend Megan quit our icy outdoor break spot to dig up dirt from the software side of things, Reynaldo and I went to his cubicle to trace IPs. He suspected a conflict … and that’s just what his command-line requests revealed. We leaned over his laptop together, studying a couple of terminal windows and their cryptic output to his even-more-cryptic inputs.&lt;/p&gt;
&lt;p&gt;“Whenever that printer got set up in HR, it received an IP that was already in use by this server—” he jabbed an index finger at the relevant part of the screen “—which is apparently still up and running, even though I swear it was decommissioned.” Reynaldo frowned. “Who wants to bet that stupid complaint program has some kind of ability to print cached complaints?”&lt;/p&gt;
&lt;p&gt;I frowned, too. “We won’t know for sure unless Megan digs something up.”&lt;/p&gt;
&lt;p&gt;Reynaldo flashed me a look of pure cynicism. It wasn’t an indictment of Megan’s skill, more skepticism toward the idea of anyone having properly documented this mess. We had better odds of hitting a billion-dollar jackpot.&lt;/p&gt;
&lt;p&gt;I sighed. “It’s an easy workaround, at least: assign the printer a new IP. But we’ve got bigger problems here. Why’s this zombie server still up and kicking? Why’d an IP conflict ever occur in the first place?”&lt;/p&gt;
&lt;p&gt;“Don’t get me started on our FUBAR IP allocation and tracking.” Reynaldo’s lowered voice contained plenty of venom. “We’re talking multiple pools to track, multiple spreadsheets that have to be manually edited. Problems that are easy enough to fix! Why spend money on honest-to-goodness network management software?”&lt;/p&gt;
&lt;p&gt;Short-term budgeting preventing long-term improvements: a damned shame we’d both seen all too many times. Being a tech support drone, having an innate desire to help that no amount of baloney could stamp out, I once more found myself longing to fix the unfixable.&lt;/p&gt;
&lt;p&gt;“In my ticket notes, I’ll make noise about a more permanent solution,” I said. “At the very least, some bigwig oughta leap at the chance to save 3 cents of electricity a year by putting the complaint-spewing server out of its misery.”&lt;/p&gt;
&lt;p&gt;I’d already resolved to contact Leila, the new head of HR, about this ticket. She needed to hear about Hothead, the manager-type who, in a fit of frustration, had taken a hair dryer to the same printer and nearly trashed it. I could also tell her about these lingering network vulnerabilities that would continue causing problems for everyone down the line.&lt;/p&gt;
&lt;p&gt;I decided to do it without telling Reynaldo. I had the feeling that if I let him in on it, his eyes would roll clear out of his skull.&lt;/p&gt;
&lt;hr/&gt;
&lt;p&gt;Working from Reynaldo’s cube, I assigned the HR printer a new IP address and once again cleared its queue. Then I sent Tony, the ticket holder, a private message asking him to give printing another go. I felt pretty good about his chances, but I’d wait for him to give me the all-clear before closing the ticket.&lt;/p&gt;
&lt;p&gt;With the messaging app still open on my phone, I saw that Megan had invited me to drop by her cube. From Networking Central, I hoofed it up to Developers’ Row.&lt;/p&gt;
&lt;p&gt;Megan’s cube was a familiar spot filled with bright, cartoony posters and figurines, the only splashes of color for miles. The titles and characters drew blanks in my over-the-hill brain. I kept meaning to ask her what they were, why she liked them. Another time, maybe. I found her with her back toward me, leaning intently in her swivel-chair toward the single monitor over her laptop docking station.&lt;/p&gt;
&lt;p&gt;“Now a good time?” I asked under my breath.&lt;/p&gt;
&lt;p&gt;She whirled around, tense, then relaxed with a smile, her gaze livelier than I’d seen it in a while. She picked up a small external memory stick from her desk to proffer my way. “That’s the HR application’s source code!” she murmured in conspiratorial fashion. “Guess where it came from?”&lt;/p&gt;
&lt;p&gt;I smirked. “I know the answer should be ‘a code repository,’ but in this joint, that’s asking too much.”&lt;/p&gt;
&lt;p&gt;“You’re right!” she replied. “It was never in a repo, never in source control. It lived and died on one dev’s local machine, a dev who retired way before I got here. His successor hung onto all the old code from that guy’s machine, just in case. But yeah, we don’t officially support the application anymore.”&lt;/p&gt;
&lt;p&gt;Megan turned around, using her keyboard to tab over to an open window in a code editor. From over her shoulder, I saw line after line of an archaic programming language that the Egyptians might’ve used to build the pyramids.&lt;/p&gt;
&lt;p&gt;“This code’s an undocumented disaster,” she said.&lt;/p&gt;
&lt;p&gt;“There was an IP conflict at that,” I told her. “The print requests were going to a server that’s still running this thing. We assigned the printer a new IP, but the mystery server remains a head-scratcher.”&lt;/p&gt;
&lt;p&gt;“I’ll trace through and figure out what it does when it gets a print request. Improve its error-handling in general,” Megan promised, more excited than daunted by the prospect. “I mean, if it is still up and running, I could tweak, recompile, and redeploy it so it doesn’t—”&lt;/p&gt;
&lt;p&gt;Insistent metallic knocks sounded behind us. “Excuse me!”&lt;/p&gt;
&lt;p&gt;It was the sort of pointed voice that somehow ignored your ears and stabbed into your gut instead. Megan froze, tense. I turned to find a woman at the threshold with the bearing of a vindictive hall monitor, rapping a fist against the cube’s bare metal frame.&lt;/p&gt;
&lt;p&gt;She leveled a withering frown at Megan. “I was hoping for a status update on the Hewville refresh! Did I hear you say you were planning to work on something else?” The question sounded more like a threat.&lt;/p&gt;
&lt;p&gt;This had to be Megan’s boss. Megan remained tense from head to foot. “I—”&lt;/p&gt;
&lt;p&gt;“I need you to focus on your assigned projects. The things you can actually bill your time against.” After delivering the condescending reminder, the boss’ glare shifted my way. “And you are?”&lt;/p&gt;
&lt;p&gt;I shoved unease aside and put on the game face I’d spent decades perfecting. “Tech Support. I meant no harm, ma’am. I was just asking Megan for help with an open support ticket.”&lt;/p&gt;
&lt;p&gt;“She doesn’t have time for that!” the boss scolded. “If you truly need help from this department, then you must escalate your ticket through the proper channels.”&lt;/p&gt;
&lt;p&gt;I already knew how that went: pulling together screenshots, logs, and other detailed information, only to receive half of a sentence fragment a few days later, asking for something I’d sent with the first message. In this case, I knew someone would just wag a finger at me about the HR application being out of support. Thanks but no thanks.&lt;/p&gt;
&lt;p&gt;Megan struggled to muster one last defense. “This program’s still running on a server somewhere!”&lt;/p&gt;
&lt;p&gt;“For changes to existing code, the proper procedure is to file a formal change request through the Project Management Team. The PMT will create a billing code and assign appropriate resources, if they deem it a proper use of development time.” The boss then looked at me like I was a used tissue she was ready to throw in the trash. “If that’s all, I suggest you head back to Tech Support, Mr. … ?”&lt;/p&gt;
&lt;p&gt;No way was I handing her my name on a platter. I tried to glance Megan’s way, but she was staring at her lap. I felt bad leaving her in that lurch, but staying would only make things worse for the both of us.&lt;/p&gt;
&lt;p&gt;“Later,” I said, both a goodbye and a promise.&lt;/p&gt;
&lt;p&gt;I got the hell out of Devsville, slipping down flight after flight of stairs with a lead weight in my chest. For a moment, Megan had brightened in the face of a collaborative challenge. I’d felt a little more alive, too.&lt;/p&gt;
&lt;p&gt;Thank God someone had been there to make sure no one helped each other.&lt;/p&gt;
&lt;p&gt;The same sicknesses plagued the joint year after year. Almighty budgets. Status quo worship. Hierarchy and miles of red tape. Promising young people like Megan had their spirits crushed, and schmucks like me just put their heads down. Still a huge pile of other support tickets waiting for me, after all.&lt;/p&gt;
&lt;p&gt;The frustration and resentment, the desire to do something to fix this, burned in my chest like a bonfire.&lt;/p&gt;
&lt;p&gt;Back at my desk, I found a message from Tony confirming the new printer was behaving at last. Bolstered by my friends’ findings, I closed his ticket with notes about how the resolution was only a band-aid on a gaping wound. I messaged Megan, too, thanking her for trying.&lt;/p&gt;
&lt;p&gt;And with that emotional bonfire still raging, I settled in and typed out a long email to Leila, detailing in full the most recent shenanigans I’d been a part of.&lt;/p&gt;
&lt;p&gt;By the time I finished, I had one bit of good news: Aggie, my old mentor who’d turned manager a few years back, had accepted my meeting request to meet the next afternoon.&lt;/p&gt;
&lt;p&gt;She wasn’t my boss, which meant it was still safe to vent her way. I had every intention. My resentment would no longer let itself be buried under this or that technical hiccup. It was insisting upon action.&lt;/p&gt;
&lt;hr/&gt;
&lt;p&gt;The next day, I walked to the downtown coffee shop well ahead of the appointed time, glad to have the excuse to be somewhere else. Bought myself a drink and sat down where I could watch the door.&lt;/p&gt;
&lt;p&gt;Five minutes late turned into ten … then twenty. No Aggie.&lt;/p&gt;
&lt;p&gt;It was totally unlike her. Sure, she’d canceled last-minute before, but she’d always got in touch with me to let me know.&lt;/p&gt;
&lt;p&gt;Caffeine jitters fueled a fear I couldn’t shake off. I sent PMs and left voicemails on her cell and work phones, asking her to respond when she could. Back at work, I asked around the department, including my boss.&lt;/p&gt;
&lt;p&gt;She’d been AWOL the whole day. No one knew what was up.&lt;/p&gt;
&lt;p&gt;Hours of work still stretched in front of me. I could barely sit in my chair, much less look at my monitor.&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Just call me, Aggie,&lt;/i&gt; I willed, staring at the cell phone clutched in my hand.&lt;/p&gt;
&lt;p&gt;She didn’t. Not that afternoon, not that evening. Beneath my fear was this strange gut feeling, this knowing sense that my worries were justified. It was crazy, but there was no talking myself out of it.&lt;/p&gt;
&lt;p&gt;Early the next morning, they roped the whole department into the big conference room. Nobody knew what was going on until a small, ashen group of managers, directors, and directors of directors filed to the front and called for attention.&lt;/p&gt;
&lt;p&gt;I already knew, deep down, what was coming.&lt;/p&gt;
&lt;p&gt;“We’ve we received some very unfortunate news,” one of the senior directors spoke. “Agatha Shaw … passed away in her home after a heart attack.”&lt;/p&gt;
&lt;p&gt;A few gasps escaped the assembly. Otherwise, you could’ve heard a pin drop. Wide-eyed looks of shock surged through us like lightning.&lt;/p&gt;
&lt;p&gt;Aggie.&lt;/p&gt;
&lt;p&gt;My gut had known all along, but my brain still wasn’t having it. Somebody somewhere must have goofed up royal, I thought. Happens all the time in this joint. Aggie had more life and fight in her than I ever did. I—&lt;/p&gt;
&lt;p&gt;“Those of you who reported directly to Ms. Shaw will report to Bill Watson for now,” the director continued. “Dismissed.”&lt;/p&gt;
&lt;p&gt;The brass began showing themselves out.&lt;/p&gt;
&lt;p&gt;The rest of us just sat there, too stunned to move. &lt;i&gt;That’s it?&lt;/i&gt; I marveled. No memorial? No counseling? No time off? Not one drip of sympathy?&lt;/p&gt;
&lt;p&gt;I could only look on helplessly as Bill Watson, my boss, walked right over to me. He put his hand on my shoulder, leaned over, and muttered into my ear: “My office.”&lt;/p&gt;
&lt;p&gt;While my brain reeled, my feet stood me up obediently. They marched me right off to the next chair I dropped into, the one opposite the large desk in Bill’s office.&lt;/p&gt;
&lt;p&gt;He settled in on his side. “It’s a real shame about Aggie. We’re screwed without her.”&lt;/p&gt;
&lt;p&gt;I just sat there, still reeling.&lt;/p&gt;
&lt;p&gt;”My manager is looking for someone to step up in a big way.” Bill nodded in my direction. “You’re ready. You deserve it. Her direct reports are reporting to me for now; over the next few months, I’m transitioning them to you. The promotion will follow, as soon as the next performance review comes around!”&lt;/p&gt;
&lt;p&gt;We were just cogs in that joint. Never before had the point been driven home so viscerally. Righteous rage surged up from within, clearing my brain and shooting strength through my limbs. I jumped out of that chair and glared down at him. “Hell no! Find someone else!”&lt;/p&gt;
&lt;p&gt;I got the hell out of there and dragged myself all the way home to collapse on my couch.&lt;/p&gt;
&lt;br/&gt;
&lt;p&gt;&lt;b&gt;To be continued ...&lt;/b&gt;&lt;/p&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/the-easy-no</wfw:comment></item><item><dc:creator>Lyle Seaman</dc:creator><title>Error'd: Einfach so</title><link>https://thedailywtf.com/articles/einfach-so</link><category>Error'd</category><pubDate>Fri, 10 Jul 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/einfach-so</guid><description>&lt;p&gt;Do you say &amp;#34;a FAQ&amp;#34; or &amp;#34;an eff eh cue&amp;#34;?  Peter says eff eh cue I think.&lt;/p&gt;

&lt;p&gt;&amp;#34;This is a test&amp;#34;
&lt;strong&gt;Peter G.&lt;/strong&gt; harrumphed testily.
&amp;#34;Create an FAQ with exactly nine entries. Nine? Nine.&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#67f8e4c8a1e640379d670a4039d1e54b"&gt;&lt;img itemprop="image" border="0" alt="67f8e4c8a1e640379d670a4039d1e54b" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/07/09/67f8e4c8a1e640379d670a4039d1e54b.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&amp;#34;I think I spent over $NaN?&amp;#34; said an anonymous. 
&amp;#34;This was an interesting offer on myminifactory.com with tight expiry date. Didn&amp;#39;t claim.&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#9b22730c427144faa646895be1411d53"&gt;&lt;img itemprop="image" border="0" alt="9b22730c427144faa646895be1411d53" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/07/09/9b22730c427144faa646895be1411d53.jpeg"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;And a different reader expected a speedy delivery anon.
&amp;#34;It was about 23:10 UTC when I took this screenshot,
the time zone I keep my PC in, yet local
time my pizza was estimated to arrive at 19:05 CST.
Naturally, I should expect to receive my pizza about four
hours ago! Not my typical experience with delivery as of
late, I must say, but a welcome change nonetheless...&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#cd43a695c8e846cf858cc3b72ba77094"&gt;&lt;img itemprop="image" border="0" alt="cd43a695c8e846cf858cc3b72ba77094" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/07/09/cd43a695c8e846cf858cc3b72ba77094.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Super saver 
&lt;strong&gt;Michael R.&lt;/strong&gt; lamented 
&amp;#34;That hurts, I missed 6 coupons that would have saved
me 0%.&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#ec9a5b21636b4b4bad633abdb4393820"&gt;&lt;img itemprop="image" border="0" alt="ec9a5b21636b4b4bad633abdb4393820" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/07/09/ec9a5b21636b4b4bad633abdb4393820.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;And our 
&lt;strong&gt;dragoncoder047&lt;/strong&gt; ground this out between his teeth.
&amp;#34;Refactored the runtime spritesheet packer in a game engine I
contribute to, and wound up with this extremely helpful error
message. Turns out that the problem was the ggggggggggggggg wasn&amp;#39;t
properly detecting ggggggggg and was putting all the ggggggggggggg&amp;#39;s in
the same ggggggggggggggggggg. I think. Ggggggggggggg!&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#189885dc898f4fe4b7ef095e9f1ef99e"&gt;&lt;img itemprop="image" border="0" alt="189885dc898f4fe4b7ef095e9f1ef99e" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/07/09/189885dc898f4fe4b7ef095e9f1ef99e.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=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>18</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/einfach-so</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>Flushed Out</title><link>https://thedailywtf.com/articles/flushed-out</link><category>Feature Articles</category><pubDate>Thu, 09 Jul 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/flushed-out</guid><description>&lt;p&gt;While a project manager is frequently called upon for their planning ability, the real skill we want from project managers is their ability to &lt;em&gt;communicate&lt;/em&gt;. The job of a project manager is to align the team &lt;em&gt;doing&lt;/em&gt; the work, with the organization goals &lt;em&gt;driving&lt;/em&gt; the work, with the management and leadership teams trying to &lt;em&gt;understand&lt;/em&gt; the work, while juggling all the constraints like budgets, timelines, and the endlessly changing expectations for the project. A good project manager is worth their weight in gold. A bad one will &lt;em&gt;cost&lt;/em&gt; their weight in gold.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mark&lt;/strong&gt; was hired on as a contractor, reporting to Tegan. Tegan was fresh out of business school, complete with an MBA and a variety of project-management training certifications. Unfortunately for Mark and the rest of the team, and especially unfortunately for Tegan, she had absolutely no real world experience. To make matters worse, this wasn&amp;#39;t just a software project: they were working on a system which matched newly developed software with newly designed mechanics and custom build control electronics. A group of experienced software engineers, mechanical engineers, and electrical engineers all found themselves reporting to a bright and shiny MBA. It&amp;#39;s a role that she probably could have grown into, but management saw all the acronyms she continuously put after her name, and decided she could just take the whole thing over with no real guidance.&lt;/p&gt;
&lt;p&gt;It went badly pretty much from the beginning. Tegan was &lt;em&gt;not&lt;/em&gt; a talented communicator. For example, Mark&amp;#39;s team needed to know: on what timeline were the electrical engineers going to deliver the first prototypes, so the software team could start running bench tests of their software? Tegan&amp;#39;s response was a fortune cookie message about balancing the complicated pipelines and lanes on the Gantt chart and hitting all of their milestones; like a fortune cookie, it was vague, important sounding, but ultimately empty.&lt;/p&gt;
&lt;p&gt;Of course, the natural reaction amongst the engineers was to just route around the damage: the various teams could talk to each other just fine without going through Tegan. That, unfortunately, did not go over well with management. Tegan, as the project manager, was their insight into the project. They needed her in the loop on everything. And she couldn&amp;#39;t just be &lt;em&gt;informed&lt;/em&gt;, she had an MBA. She needed to be making decisions. But she was unqualified to make those decisions, which meant the project gradually ground to a halt. Tegan&amp;#39;s emails got more vague, her meetings got longer but accomplished less, and after a certain point, she just &lt;em&gt;stopped replying&lt;/em&gt; to key email threads.&lt;/p&gt;
&lt;p&gt;The first few days of radio silence seemed like a gift. But as time passed and Tegan seemed uninterested or unable to reply to any of the questions the team had for her, the project started to flounder. The engineering teams escalated this problem to management. Management presumably went back to Tegan. At some point, feeling the weight of everything going wrong around her, Tegan sent out this email, which is definitely the best and clearest communication she managed during the project. It&amp;#39;s arguably the clearest, and most accurate communication one could make in this situation:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Team,&lt;br/&gt;
I understand all the issues but there are complex interrelations that must be worked out. I am currently constipated on each issue and will let you know when there is movement.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tegan&lt;br/&gt;
MBA, CAPM, PMP&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Her email cost the project &lt;em&gt;many&lt;/em&gt; person-hours as all the engineering teams took a break to have a good laugh about the project manager admitting, in writing, that she was full of crap.&lt;/p&gt;
&lt;p&gt;There was, eventually, movement. Tegan moved on to a new position at a different company. Her replacement, Pam, wasn&amp;#39;t a new hire, but instead a transfer from another department. She wasn&amp;#39;t a great project manager, certainly not worth her weight in gold, but she had enough experience to avoid the worst mistakes, and most important: she was good at &lt;em&gt;regular&lt;/em&gt; communication in order to keep things moving.&lt;/p&gt;
&lt;!-- Easy Reader Version: I've worked with many a crappy project manager --&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>10</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/flushed-out</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>CodeSOD: Module Test</title><link>https://thedailywtf.com/articles/module-test</link><category>CodeSOD</category><pubDate>Wed, 08 Jul 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/module-test</guid><description>&lt;p&gt;&lt;strong&gt;TJ&lt;/strong&gt; inherited a NestJS project. The original developers left the team many years ago, but they&amp;#39;ve left their mark in the codebase.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-typescript"&gt;&lt;span class="hljs-comment"&gt;// ProjectsModule.ts&lt;/span&gt;
&lt;span class="hljs-meta"&gt;@Module&lt;/span&gt;({
  &lt;span class="hljs-attr"&gt;controllers&lt;/span&gt;: […],
  &lt;span class="hljs-attr"&gt;providers&lt;/span&gt;: […],
  &lt;span class="hljs-attr"&gt;exports&lt;/span&gt;: […],
})
&lt;span class="hljs-keyword"&gt;export&lt;/span&gt; &lt;span class="hljs-keyword"&gt;class&lt;/span&gt; &lt;span class="hljs-title class_"&gt;ProjectsModule&lt;/span&gt; {}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;NestJS is a dependency-injection oriented framework for TypeScript code. It offers &amp;#34;providers&amp;#34; (dependencies that can be injected), &amp;#34;controllers&amp;#34; (as one would expect), and lets you bundle them together into &amp;#34;modules&amp;#34;. Modules can depend on other modules, letting you build a modular and flexible graph of dependencies. This means that the empty module isn&amp;#39;t &lt;em&gt;wrong&lt;/em&gt; here.&lt;/p&gt;
&lt;p&gt;No, for it to be wrong, we need to write some tests:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-typescript"&gt;&lt;span class="hljs-comment"&gt;// ProjectsModule.test.ts&lt;/span&gt;
&lt;span class="hljs-title function_"&gt;describe&lt;/span&gt;(&lt;span class="hljs-string"&gt;&amp;#34;ProjectsModule&amp;#34;&lt;/span&gt;, &lt;span class="hljs-function"&gt;() =&amp;gt;&lt;/span&gt; {
  &lt;span class="hljs-title function_"&gt;it&lt;/span&gt;(&lt;span class="hljs-string"&gt;&amp;#34;can be created&amp;#34;&lt;/span&gt;, &lt;span class="hljs-function"&gt;() =&amp;gt;&lt;/span&gt; {
    &lt;span class="hljs-keyword"&gt;const&lt;/span&gt; projectsModule = &lt;span class="hljs-keyword"&gt;new&lt;/span&gt; &lt;span class="hljs-title class_"&gt;ProjectsModule&lt;/span&gt;()
    &lt;span class="hljs-title function_"&gt;expect&lt;/span&gt;(projectsModule).&lt;span class="hljs-title function_"&gt;toBeTruthy&lt;/span&gt;()
  })
})
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Since modules are just containers for related code objects, there isn&amp;#39;t much to &lt;em&gt;test&lt;/em&gt; here. While &amp;#34;dynamic modules&amp;#34; which execute code are a thing, they don&amp;#39;t execute that code &lt;em&gt;at construction time&lt;/em&gt; anyway. This test will always pass. It isn&amp;#39;t a test, it doesn&amp;#39;t do anything. It likely doesn&amp;#39;t even get their coverage up, since whatever providers or controllers it&amp;#39;s referencing aren&amp;#39;t covered by this test. It&amp;#39;s a test that tests nothing but the framework it runs on top of.&lt;/p&gt;
&lt;p&gt;&amp;#34;At least there are tests,&amp;#34; TJ writes.&lt;/p&gt;
&lt;!-- Easy Reader Version: TRWTF are the endless web frameworks that do the same things differently. It's the XKCD standards comic, but in Hell. --&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>9</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/module-test</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>CodeSOD: On Hold</title><link>https://thedailywtf.com/articles/on-hold</link><category>CodeSOD</category><pubDate>Tue, 07 Jul 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/on-hold</guid><description>&lt;p&gt;&amp;#34;&lt;strong&gt;Dragoncoder&lt;/strong&gt;&amp;#34; supports a web application that has a &amp;#34;wait time&amp;#34; for access. I hate that that&amp;#39;s a thing, but I recognize that there are real-world constraints where this might make sense. Still, I hate it. But that&amp;#39;s not the WTF.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-javascript"&gt;      &lt;span class="hljs-keyword"&gt;var&lt;/span&gt; minutes = &lt;span class="hljs-built_in"&gt;parseInt&lt;/span&gt;( &lt;span class="hljs-number"&gt;12&lt;/span&gt; , &lt;span class="hljs-number"&gt;10&lt;/span&gt;);
      &lt;span class="hljs-keyword"&gt;var&lt;/span&gt; time = &lt;span class="hljs-variable language_"&gt;document&lt;/span&gt;.&lt;span class="hljs-title function_"&gt;getElementById&lt;/span&gt;(&lt;span class="hljs-string"&gt;&amp;#39;waitTime&amp;#39;&lt;/span&gt;);

      &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; ( minutes &amp;lt; &lt;span class="hljs-number"&gt;2&lt;/span&gt;) {
        time.&lt;span class="hljs-property"&gt;innerText&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#34;Your estimated wait time is 12 minute.&amp;#34;&lt;/span&gt;
      } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (minutes &amp;lt; &lt;span class="hljs-number"&gt;60&lt;/span&gt;) {
        time.&lt;span class="hljs-property"&gt;innerText&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#34;Your estimated wait time is 12 minutes.&amp;#34;&lt;/span&gt;
      } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (minutes === &lt;span class="hljs-number"&gt;60&lt;/span&gt;) {
        time.&lt;span class="hljs-property"&gt;innerText&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#34;Your estimated wait time is 0 hour.&amp;#34;&lt;/span&gt;
      } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (minutes &amp;lt; &lt;span class="hljs-number"&gt;120&lt;/span&gt; &amp;amp;&amp;amp; (minutes % &lt;span class="hljs-number"&gt;60&lt;/span&gt; === &lt;span class="hljs-number"&gt;1&lt;/span&gt;)) {
        time.&lt;span class="hljs-property"&gt;innerText&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#34;Your estimated wait time is 0 hour and 12 minute.&amp;#34;&lt;/span&gt;
      } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (minutes &amp;lt; &lt;span class="hljs-number"&gt;120&lt;/span&gt;) {
        time.&lt;span class="hljs-property"&gt;innerText&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#34;Your estimated wait time is 0 hour and 12 minutes.&amp;#34;&lt;/span&gt;
      } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (minutes &amp;gt; (&lt;span class="hljs-number"&gt;60&lt;/span&gt; * &lt;span class="hljs-number"&gt;4&lt;/span&gt;)) {
        time.&lt;span class="hljs-property"&gt;innerText&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#34;Your estimated wait time is more than 4 hours.&amp;#34;&lt;/span&gt;
      } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (minutes % &lt;span class="hljs-number"&gt;60&lt;/span&gt; === &lt;span class="hljs-number"&gt;0&lt;/span&gt;) {
        time.&lt;span class="hljs-property"&gt;innerText&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#34;Your estimated wait time is 0 hours.&amp;#34;&lt;/span&gt;
      } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; {
        time.&lt;span class="hljs-property"&gt;innerText&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#34;Your estimated wait time is 0 hours and 12 minutes.&amp;#34;&lt;/span&gt;
      }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This wait time page is initially rendered by their backend, but after that point, gets served up by a cache at the edge of their CDN. That makes sense, since &amp;#34;have the users hammer your backend while they&amp;#39;re waiting&amp;#34; is a bad idea.&lt;/p&gt;
&lt;p&gt;Note the line &lt;code&gt;var minutes = parseInt( 12 , 10);&lt;/code&gt;. This is rendered from the backend, which is of course my least favorite way to send data from the server side to the client side.&lt;/p&gt;
&lt;p&gt;But that&amp;#39;s not the core problem here. The core problem is: what the hell are they outputting?&lt;/p&gt;
&lt;p&gt;If your wait time is less than 2, or less than 60, we tell you that your wait time is 12 minutes. Or &amp;#34;12 minute&amp;#34;, because who cares about pluralization? If your wait time is exactly 60 minutes, we tell you that your wait time is &amp;#34;0 hour&amp;#34;, which I assume means you&amp;#39;ll have enough time to watch the classic airplane disaster movie, &lt;em&gt;Zero Hour&lt;/em&gt;, which you surely know &lt;em&gt;Airplane!&lt;/em&gt; is a remake of.&lt;/p&gt;
&lt;p&gt;I can only think that the &lt;em&gt;text&lt;/em&gt; is also being generated by logic on the server side- though our submitter doesn&amp;#39;t suggest that&amp;#39;s the case. Though they do wonder why the code couldn&amp;#39;t be something like: &lt;code&gt;Your estimated wait time is: ${Math.floor(wait_time_minutes / 60)} hours and ${wait_time_minutes % 60} minutes&lt;/code&gt;, which is both fewer bytes to send from your cache &lt;em&gt;and&lt;/em&gt; more useful to the end user.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Or maybe we just make this wait time go away.&lt;/em&gt; Again, I don&amp;#39;t know why it&amp;#39;s there, there may be a good real-world constraint that requires it, but… &lt;em&gt;is there&lt;/em&gt;? Is there really?&lt;/p&gt;
&lt;!-- Easy Reader Version: Ticket drop times, I know. I don't know that's what our submitter works on, but even so, I hate these kinds of wait events. Countdown pages annoy me! --&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>28</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/on-hold</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>Best of…: Classic WTF: Difficult Personality</title><link>https://thedailywtf.com/articles/classic-wtf-difficult-personality</link><category>Best of…</category><pubDate>Mon, 06 Jul 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/classic-wtf-difficult-personality</guid><description>&lt;blockquote&gt;As the US took this weekend to celebrate their complicated relationship with tyranny, we reach back through the archives for another story of tyrants. If you think about it, the Declaration of Independence is basically the same thing as quitting without notice. &lt;a href="https://thedailywtf.com/articles/Difficult-Personality"&gt;Original&lt;/a&gt; --&lt;strong&gt;Remy&lt;/strong&gt;&lt;/blockquote&gt;

&lt;p&gt;It was &lt;b&gt;Steve&lt;/b&gt;&amp;#39;s first week on the job, and he had plenty of questions about the code base and the new features he was supposed to implement. He muddled through for most of the week, but Friday morning he hit a brick wall and needed to talk to Bill, the architect.
&lt;/p&gt;&lt;p&gt;
&amp;#34;Can I meet with you for like an hour to go over things?&amp;#34; Steve asked.
&lt;/p&gt;&lt;p&gt;
&amp;#34;No.&amp;#34;
&lt;/p&gt;&lt;p&gt;
&amp;#34;Can I get half an hour then? I h-&amp;#34;
&lt;/p&gt;&lt;p&gt;
&amp;#34;&lt;i&gt;No&lt;/i&gt;. Company meeting, every Friday, &lt;span onclick="cornify_add();return false;" title="click me!"&gt;12-5pm&lt;/span&gt;&lt;script type="text/javascript" src="//www.cornify.com/js/cornify.js"&gt;&lt;/script&gt;. It should be on your calendar. I&amp;#39;ll forward the invite.&amp;#34;
&lt;/p&gt;&lt;p&gt;
Bill also couldn&amp;#39;t free up time in the morning, so that meant Steve was stuck until Monday afternoon. Still, it probably wasn&amp;#39;t all bad. He assumed that since this was a small company, in startup mode, it was going to be one of those meetings that was less meeting and more party. He had heard about one company in town that had a kegger every Friday afternoon.
&lt;/p&gt;&lt;p&gt;
Steve really should have known better. During his interview, the actual technical questions were thin on the ground. It focused more on &amp;#34;soft skills&amp;#34;, like time management. He fielded a lot of questions about how best to manage his time. The other question that really stuck out in his mind was the standard, &amp;#34;Have you ever had to deal with a difficult personality in the workplace? How did you deal with it?&amp;#34; It was memorable, less because the question itself was unusual, but because at least six variations of the same question showed up in the interview.
&lt;/p&gt;&lt;p&gt;
On his very first day, he learned who the difficult personality was: Frank, the boss and grand-high pooba of the dev team. Around 2PM Frank lumberghed &lt;!-- this is my new favorite verb. Honestly, one of the best things about English is how easily words can change parts of speech. Verbing nouns and nouning verbs is just a basic part of the language. I honestly think that's a big part of the reason English has spread so virally. That and the fact that two successive global empires have used English as their lingua franca.--&gt; himself into Steve&amp;#39;s cube. &amp;#34;Yeah, we&amp;#39;ve got a little problem,&amp;#34; Frank said. &amp;#34;I&amp;#39;ve noticed you spending a great deal of time in the break room.&amp;#34;
&lt;/p&gt;&lt;p&gt;
&amp;#34;Oh, yeah, I was just going back for more coffee,&amp;#34; Steve said with an awkward laugh. &amp;#34;You know how it is with programmers- we&amp;#39;re fueled by caffeine.&amp;#34;
&lt;/p&gt;&lt;p&gt;
&amp;#34;Yeah, well, if you could just go ahead and make sure you&amp;#39;re at your desk doing work, that would be great.&amp;#34;
&lt;/p&gt;&lt;p&gt;
As it turned out, Frank had gone easy on Steve because it was Steve&amp;#39;s first day. The next day, Steve sat in on Bill&amp;#39;s planning meeting- a 4-hour marathon to organize the development backlog and parcel out work. Halfway through, Bill called for a break. He and a few other co-workers darted outside to gradually commit suicide via cancer, while everybody else hung around the room committing suicide by donut. And then Frank walked in.
&lt;/p&gt;&lt;p&gt;
&amp;#34;What&amp;#39;s happening?&amp;#34;
&lt;/p&gt;&lt;p&gt;
&amp;#34;It&amp;#39;s um… just a little break,&amp;#34; one of the devs replied. &amp;#34;Bill&amp;#39;s outside.&amp;#34;
&lt;/p&gt;&lt;p&gt;
&amp;#34;I see.&amp;#34; Frank loitered in the room until Bill returned. The instant Bill&amp;#39;s foot crossed the threshold of the meeting room, Frank&amp;#39;s human facade was stripped away, and a spitting, slavering demon replaced him. He proceeded to dress Bill down, back up and right back down for disrespecting his team, disrespecting the company, disrespecting Frank and Frank&amp;#39;s poor elderly mother with his attitude. He closed with, &amp;#34;They&amp;#39;re &lt;i&gt;developers&lt;/i&gt; and I want them sitting around and developing! Not waiting for you to finish your smoke breaks!&amp;#34;
&lt;/p&gt;&lt;p&gt;
On Thursday, Steve got to drive a meeting to show off the latest batch of features the dev team had completed. When he turned on the projector, Frank asked, &amp;#34;What&amp;#39;s wrong with your computer?&amp;#34;
&lt;/p&gt;&lt;p&gt;
&amp;#34;Um… nothing?&amp;#34;
&lt;/p&gt;&lt;p&gt;
&amp;#34;The desktop is wrong! None of the icons are in the right place!&amp;#34;
&lt;/p&gt;&lt;p&gt;
Like most developers, Steve had changed the wallpaper and reorganized his desktop to suit his working style. Unfortunately, his transgression against the default desktop settings set Frank off on a long rant that consumed the entirety of the meeting. Steve was lucky, Frank claimed, that he wasn&amp;#39;t fired on the spot. Standard work was vitally important, and personalization was frowned upon. &amp;#34;It&amp;#39;s vitally important that any developer can use any other developer&amp;#39;s computer- we can&amp;#39;t afford to waste a minute of time just because you needed to be a special little snowflake!&amp;#34;
&lt;/p&gt;&lt;p&gt;
By the time the Friday afternoon meeting rolled around, Steve should have been expecting some kind of Frank-led time management course. Instead, Bill handed him a mop. &amp;#34;New blood gets mop duties. Start in the break room, and then hit the other common areas.&amp;#34;
&lt;/p&gt;&lt;p&gt;
&amp;#34;Excuse me?&amp;#34;
&lt;/p&gt;&lt;p&gt;
&amp;#34;Frank&amp;#39;s orders. Every Friday, we spend the afternoon cleaning the office, from top to bottom.&amp;#34;
&lt;/p&gt;&lt;p&gt;
&amp;#34;There isn&amp;#39;t a cleaning crew?&amp;#34;
&lt;/p&gt;&lt;p&gt;
&amp;#34;Oh, there is,&amp;#34; Bill said. &amp;#34;Frank doesn&amp;#39;t trust them to do a good job.&amp;#34; That weekend, Steve decided to take Frank&amp;#39;s lessons on time management to heart, and immediately left to seek employment that didn&amp;#39;t involve wasting his time.&lt;/p&gt;
&lt;!-- Easy Reader Version: Cleanliness and godliness: both a waste of time? --&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>13</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/classic-wtf-difficult-personality</wfw:comment></item></channel></rss>