`man -abba` would be nicer, as the author said in the original post.
$ man --abba --format=json
["gimme", "gimme", "gimme"]
https://www.youtube.com/watch?v=OrnUuXiVgBc
Edit: It's also a way better song, no wonder I remember it better.
Well one day I am working on a new set of features to help support the new clinic that’s coming online and for whatever reason the question that should by all rights show up, does not. As I am getting deeper into debugging why, I pepper the code with nonsensical and slightly angry debug statements that show up alongside the questions. After solving the problem I happily clean up and commit the fixed code and move onto the next thing.
Well, it turns out I didn’t clean up all the debug statements. The statement I left in said I SEE YOU!!! in big red letters if you answered a particular set of questions in a particular way. This was discovered by a patient. Of the psychiatric clinic that just came online. On the questionnaire meant to evaluate paranoia.
Since then I have started using things like aaa and 111 as my debug markers.
I often use my initials and "DEBUG", so that the string (A) is distinctly grep-able before committing code and (B) if it somehow ends up in production it's not totally mysterious.
I once heard a guy — named Ed — who responded to a query about something with, "Well, I'm special." You can guess how he was referred to from then on ....
If you use language expressions that automatically become file/line info, that frees you from juggling unique labels. Then it can be saved into your IDE as a insertable code snippet.
It goes without saying that a real interactive debugger session is even better, but it isn't always convenient or possible.
(licenseActive = true) != true
I still remember the first time that happened to me, I think it had to do with some (not yet diagnosed) race condition on a PHP server between the HTTP requests it served, and the debugger had a side-effect of blocking the next request while I was inspecting the first one.
That reminds me of another thing: Some debuggers allow you to set breakpoints and set them to not suspend or pause execution, but to emits a log-message to the debugger or terminal instead.
Those are an upgrade over print-statements in that:
1. You can't accidentally commit it and it doesn't show up to make your diffs weird
2. You may be able to dynamically change what things it prints out without restarting the program
As in "MYNAME: " prefixed to whatever useful information I might need.
I like the 5 pounds because they are visually easy to find on the screen, too.
Combine that with a build system that is so utterly and entirely broken that the only way to be sure is to do a fresh checkout each time, and with a hardware set-up that involves writing the binary onto flash memory and plugging it into a device that is located under somebody else's desk in another room and then perhaps you have the Debugging Cycle From Hell.
Don't people believe in debuggers any more?
even the bots do it (joke)
https://github.com/workarea-commerce/workarea/blob/master/co...
Some context:
- The 5th Element is a cool movie
- My sister's dog was named Leeloo Dallas Multipass and she was like my favorite dog of all time
- I was the original developer of the `ProductMultipass` search query feature
- Turns out, funny comments make other developers like your product more
// We are liiiiiving in a material world, and I am a ma-ma-material org.
const materialOrgs = await db_read<Org>(organizations, { type: 'materials' });
I don't think I'd be anywhere near as productive without:
- Conditional breakpoints
- Debugger.Launch
- Debugger.Break
- Debugger.Write
Conditional breakpoints are essential, just run as normal and it'll only break when your bizarre edge case is hit.Debugger.Break and Debugger.Launch are like a breakpoint that gets hit even when you're not debugging, and prompts you to attach a debugger. ( Launch won't pause if you already have one attached, but especially useful when you want to attach to a start-up routine in an IIS hosted web-app. )
Debugger.Write writes to a different output stream, and like all Diagnostic.Debug statements, isn't even compiled into release builds, so there's zero chance of it ending up in prod.
These are essential tools for rapid debugging. Printing nonsense and hoping to spot it feels 20+ years out of date.
The point I was trying to make is that you shouldn't be print debugging in 2024.
My experience in cpp is 5 times worse than in .net
.., the world runs off print statements sprinkled throughout by a very frustrated and angry developer
And we should also teach them not to get their delicate timing out of whack because they'll immediately stop dropping incoming samples if any of them gets interrupted by a debugger.
I'm sure everyone will be delighted.
Another example is GitHub changing the default branch name from master to main due to their perception that the existence of a master implies the existence of slaves.
People got grumpy about master/slave being replaced with server/client, superior/subordinate, leader/follower, and similar terms but that actually largely benefits as well in that it makes things clearer. Anyone who has dealt with bus protocols that support the more complex "multi-leader" setups or peer-to-peer setups knows how the master/slave terminology can be confusing and potentially limiting in accurately describing the parts of the system.
And the git master/main thing also is more a matter of just making things easier to pick up. Master can be confusing there for the same reasons it's confusing in bus topologies. Main instead is obvious. It's the main/mainline branch of the project. And that also helps set the divide for main vs feature vs maintenance branches (and release tags).
So yeah some of it was done under the guise of politics but that's generally been more about getting an excuse to make the change without people dismissing it rather than the underlying reason for the change to happen.
So, putting politics aside, I don't really care as long as it isn't breaking existing stuff. My only point of contention has been the politics behind some of the pushes.
Reads almost like a haiku
struct Simba {
- mother: u32,
- father: u32,
+ parent: u32,
+ parent: u32,
}
"I don't think this will compile"
My first encounter with this was as a young developer at an electronics manufacturing company. When discussing a request from a customer to change a particular undesirable behavior of the device, I referred to this as a "bug" in an e-mail to them.
I was quickly reprimanded / corrected, with the explanation that -- while "bug" is a somewhat innocuous term to engineers, to non-engineer types it brings to mind a whole host of bad images, fears, and can lead to canceled contracts under the premise that we've delivered bad-faith product. I was initially very resistant to this idea, but I've seen the wisdom in this as I've matured as an engineer over the past 20 years since this run-in.
For a related example, it reminds me of this issue that was opened on llama.cpp by a user who was concerned that the software had been "hacked":
https://github.com/ggerganov/llama.cpp/issues/33#issuecommen...
> Hey, I was reading your Readme.md and I saw that your repo was hacked. I want to ask what this means and wanted to check if the users like me also get the impact of hacking. Or, this is not the thing I should worry about?
Of course, the repo was not hacked -- but the founder of the project mentioned that it had been "hacked together" (as a term of humility / self-deprecation) and some users got the wrong idea of what he meant by that.
So I don't think this is about censorship, so much as good public relations. "Don't spook the horses" -- not all words mean the same things to engineers as people whose perceptions of technology are shaped more by movies and headlines.
After much checking it was realised that this was because the checksum literally was 0xBAD....
Sometimes this leads to embarrassing issues. I remember one case where a Chinese guy named Hui was unable to make a blog post on his team's official public blog. Turned out that his name was on the list of banned words because of https://en.wiktionary.org/wiki/%D1%85%D1%83%D0%B9#Russian
$ pulseaudio
W: main.c: D-Bus name org.pulseaudio.Server already taken. Weird shit!
I thought a user facing error message like this is inappropriate, so politely took the issue upstream [1].Lennart, who I had spent some time with in real life a few months previous, didn't yet have the reputation for being the person he is today. I thought he'd be pretty reasonable about it. Instead he closed the bug as "won't fix" and left the comment, "Sorry, but please don't waste my time, will you?".
I was pretty shocked by his response, I lost a lot of respect for him at this moment and then wrote a long ass blog post about professionalism of developers and appropriate language for user facing error messages.. but still, Lennart tainted himself and showed the person we now know him as. (Also, if you are reading this Lennart, fuck you).
Ubuntu ended up carrying a patch simply to remove this inappropriate language, I never checked if it was eventually cleaned upstream or if other distros also removed it.
EDIT: I just checked, and it was eventually removed in 2011 [2]
[0] https://bugs.launchpad.net/ubuntu/+source/pulseaudio/+bug/44...
[1] https://lists.freedesktop.org/archives/pulseaudio-bugs/2009-...
[2] https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/commi...
Those that have never interacted with him don't care, I agree (I mean, why would they?). But those that have, i'd suggest is a minority that can tolerate him.. but ho-hum, neither of have statistics on this so we'll never know.
When I met and had discussions with him in 2007 he was mild and seemed to be constructive, i'd suggest his "bullish personality" became more prevalent with time.
People will claim it's unprofessional, and it is. The problem is that when other's are also unprofessional you can't convince them by being professional.
If you look at who moves up the social ladder fastest and retains their power the longest, they are typically hard-headed people. The have an almost unreasonable amount of confidence in themselves, and in many ways they are delusional.
However, I would argue such a personality is better than being timid. Ultimately, past the computers and the programs we are humans, and human effects come into play. Success is not just measured by correctness; it's measured by perception.
You could instead provide a real argument, not "well what you say is used to defend abusers!"
Yes, and famously Hitler wanted economic strength for his country. I guess wanting economic strength makes you Hitler? ... wait no, definitely not.
I don't have patience for these weak types of arguments. Saying nothing at all is free and easy, I would look into that more if I were you. Seems more your pace.
Many years ago, someone replied to me saying, “you’re right, but your comment is so abrasive,” and that really stuck with me.
Humility and grace can go a long way, even in internet conversations.
It's one thing to think I'm wrong, it's another all together to warp my argument to make me appear crazy. Or pro-abuse. Or whatever. That, to me, isn't in good faith and I quickly lose the motivation to be kind. I work under the assumption the people I talk to aren't stupid, they're aware of what they're doing. I won't extend pity or give people the innocence of a child. In my eyes, that is even more offensive.
Ineffective assholes are nonentities. Therefore all assholes worth noticing are effective, and all ineffective people worth noticing are nice.
I believe there's a name for this effect, but what it is escapes me at the moment.
He's doing that only because it's his job: his employer has an agenda (i.e. steering Linux fast enough and disruptively enough at a low level, so that serious competitors cannot arise), and he's implementing that agenda without a care in the world.
Would I personally take such a ruthless mercenary over more community-minded folks? No.
On the basis of profanity alone, your action seems far worse than their's?
I can use profanity in my communication, but I would never put foul language in an error.. same as I wouldn't in documentation or a formal letter.
Just imagine a pop-up dialogue box on Windows or OSX showing an error with "Weird Shit!" in it. Could you?
Why does it upset you so?
So tell me, why would it be "funny"? Are you, or have you ever been responsible for content end users might see?
Regardless, the Lennart tirade added into the anecdote really just convinces me that the anecdote is there purely for axe-grinding.
> Are you, or have you ever been responsible for content end users might see?
Yes. I don't do such things because of curmudgeons like yourself. But as a user I wouldn't mind at all, and think it's funny.
I remember a swearword appearing in a very big national company login form once, and I'd have felt sorry for the dev if it wasn't so hilarious.
Eventually it turned out that it was the single word "sheep" - which taken out of the relevant alt.* context was pretty harmless.
Talk about a moment when I thought my career had crashed and burned...
Please, do contextualize it?
I didn't want to make it too easy for people trying to crack our tools so, if such a problem were detected, the error message spat out to the console bore no relation to what had gone wrong.
By "bore no relation" I mean the error message would be one of a number of lines of dialogue from a scene in a House episode where House is trying to figure out who Wilson's girlfriend is... which led to this:
https://gist.github.com/gregoryyoung/871736
Yes, Greg Young (the event sourcing guy) ran into an error that said "Because I wanna ask you about your girlfriend. I must know who she is, or you would've told me her name," because he'd moved Smartassembly minus the licensing DLLs. Of course, he didn't realise what he'd done "wrong" so he tweeted it to his considerable following and it went viral.
Because I'm exactly the sort of walking cliche you'd expect I was blissfully unaware of the unfolding drama, being away on sabbatical snowboarding at the time. I hadn't taken my laptop with me, I'd disabled data roaming on my phone to avoid a whopper of a bill after a couple of months away, and had only a gen 1 iPad to access email and internet. So of course I came back in the evening to discover that it had all kicked off, with this ludicrous chain of emails where people were trying to figure out what was going on, until somebody had the sense to go and look in our source control system (which at the time was still svn for most things), and figure out that it was my fault.
People saw the funny side and it wasn't that big a deal but the reason I bring this up is that the last line of dialogue in that scene is, "Your mama," delivered by Wilson to House, and it was also the error message for the final failure scenario I was looking for. I'm glad that one didn't get printed.
However, if they missed one, it would move a random vertex by some random amount which is obviously very visible when rendering a 3D scene.
When people complained about this on forums (usenet mostly), they outed themselves for using pirated software.
To this day I still think Google’s motto only referred to “Do no System.exit(0)”.
Suddenly the customer tells us they have "repurposed" an "internally developed program" and they cancel our contract. The sales rep was upset that he would not be getting a commission on the sale and mentioned that he had "even sent them a demo", which led to the discovery of what had happened. My boss and I went to the customer's site to "finalize the paperwork", and when we were shown the application (which had extremely minor UI changes) I checked if the hidden click spot still worked, and it did! The customer was horrified. My boss was outraged.
We ended up getting paid the full contract amount plus a large bonus in exchange for agreeing not to sue. The sales rep decided to leave voluntarily rather than be fired.
Did you draw inspiration for it from Bullock's The Net (1995) by any chance?
This was all in the era of Gates' Open Letter to Hobbyists[1], when "Micro-Soft" was licensing their code to companies, perhaps because direct sales to hobbyists didn't work out.
[1] https://en.wikipedia.org/wiki/An_Open_Letter_to_Hobbyists
Kinda verbose, ain't it? Just speaking from my own personal experience, usually when I resort to print-debugging I'm already pretty punchy and more likely to use a quick "ASDFASD" or similar.
You can't automate checking for random strings, right?
You won't need to submit that particular string working at Google, right?
Confused sysadmins wondering if this is SOX code...
Seems easy enough?
No, but you can make the string configurable.
> Kinda verbose, ain't it?
I always used the word "doberman" for this purpose. I've never written code for a project that legitimately included the name of a dog variety. A simple grep for "doberman" in the production release CI pipeline catches it. If one ever did slip thru I figured it wouldn't be too offensive to anybody.
- Nothing happens
- Easy to find string in code, output, wherever
I occasionally need to override the hook, for example when using mktemp -t, or when some floating-point data actually contains a run of 9s. But mostly, it is quite specific at catching stuff that shouldn't be checked in.
This solves many of the concerns raised in this thread about readability, automation, avoiding typos in the magic string.
The tricky thing you have to solve is how to push the code that defines the custom logging function, but there are solutions.
One afternoon, I added the phrase "[Ww]ombo\s[Cc]ombo" (it supported regular expressions) and an expansion set (&prodbomb; evaluated to &wca; &wcb; to create "womb combo") but only in prod. In debug builds, it would produce "Wombat Combat"in bright red text.
This was a useful way to mark pages as "Don't build this in prod yet" - a habit some teams had of just yolo'ing their development branches right into production instead of doing a rebase to main. More than one build was saved by it within a few months.
Is nobody reviewing code before merging it upstream?
Every line was reviewed but that doesn’t mean it would be caught every time. And if it’s automatable to catch things like this it should be.
During development this would sometimes break but only in very specific circumstances, and because they were so absurd and seemingly specific to our local development environment I just added an error message saying "watch and amaze while the application eats itself!" Or something to that effect. It was inspired by an error I saw with the Discworld game for the original PlayStation.
Of course, once this hit production it turns out the det of circumstances necessary to trigger this error wasn't quite as specific as I'd thought, and support was overloaded by hundreds of people calling in to report the error, worried that their money was gone. Of course, people using these feature were high rollers placing very large bets, so management was not happy...
Fortunately I wasn't fired and we fixed the issue very quickly, but man I felt the edge of that sword really close to my neck. It was at one of my first jobs as well nearby 20 years ago. I definitely learned some valuable lessons that week. :o)
The same experience. I was working for a pornography company and where I was configuring load balancers. I had a test page of semi-naked red deviless with the words "Hello Minion" above her head which I had forgotten to remove.
So during peak times, when the misconfigured LB went active it threw that page to the public, advertisers and the other white labelled websites.
We had a good laugh; the dude was fired on the spot tho.
(alt text: vintage meme depicting two dogs using a computer, captioned ‘On the Internet, nobody knows you’re a dog.’)
> The header of the marshaled object reference begins with a distinguished signature (‘MEOW’)⁶ [...].
> ⁶ A Microsoft Program Manager who shall remain anonymous claims that MEOW stands for Microsoft Extended Object Wire representation. The author, while somewhat gullible, is skeptical of this story but is willing to give the aforementioned source the benefit of the doubt.
— Don Box, Essential COM
In high school, my friend had a habit of titling draft papers something inappropriate. Which was funny when we were peer editing each other. But inevitably, one time he forgot to change it back. We sat down in English class and as the teacher was walking around collecting papers, he glanced down at his and suddenly UH I GOTTA GO TO THE BATHROOM. He sprinted out the door straight to the computer lab and printed off a copy that didn't have a bunch of profanity in 24 point font at the top. I about died laughing.
Now I just use my initials at the start of a debug line.
Alternatively - maybe it wasn't the difficulty of finding it but the (perceived?) difficulty in requesting that it be changed?
E - maybe the likely alternative is the "the customer has nukes so please fix it" entitlement? https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95644#c4
The nuclear-armed client seems entitled, but I don't think he necessarily is.
But still, there's no more mind-numbing, infuriating, exhausting feeling, than to find out that a thing you were debugging for the last hour was supposed to be a "fun little joke". Fun? You know what's fun: when stuff just works. That's about the most fun thing there is.
Generally people make way to much assumption about software behavior «just work» is easily confused with «works as I personally expected»
You’re assuming too much, expecting too much, and get frustrated. I don’t think you deserve it, but I don’t think you have the right mindset about it either.
He is somewhat right. I think Easter eggs belong in computer games and user facing stuff like website or online forum.
There shouldn’t be jokes in something like man or grep.
But I'm in the team that software is made by people, and that should be reflected. Jokes, like always, must be respectful to strangers, and strangers have to be polite and allow others to express themselves, jokes are not a trap.
There definitely should be jokes in man and grep, it's just have to be of good taste (this one was good). We're not in a high stake diplomatic field. Removing all the jokes by principle is just giving in to the great consensus leveler that crushes humanity. Embrace humanity, don't crush it.
But I expected it could be inferred from my post.
That’s quite a belief and would certainly affect how you perceive easter eggs.
If this triggers you so much then maybe, just maybe you chose the wrong career path. You know, all that "if you can't stand the heat, get out of kitchen. If you can't stand the debugging, ...." ;-)
[1] It doesn’t work after midnight???
> The developer of the man-db, Colin Watson, decided that there was enough fun and the story won't get forgotten and removed the easter egg completely.
https://git.savannah.gnu.org/cgit/man-db.git/commit/?id=b225...
(lol, this is not a mission critical, internet connected system)
I'm all for easter eggs (and haven't added one in forever, maybe unit test test strings), but they shouldn't interfere with regular operation. This particular one could've been updated to only trigger for a certain command, for example.
I thought the easter egg only occurs when man is called without arguments.
What obligation does a developer/maintainer have in this situation? If the hospital is using free/open source code, it's on them to understand how it works and how to fix it.
It’s just a difference in personality. Claiming that liking Easter eggs is the essence of humanity is a pretty extreme exaggeration.
Claiming that the parent claimed that easter eggs are "the essence of humanity" is an extreme exaggeration.
Most people won't come across your Easter egg since it's hidden. The ones that do encounter it will likely stumble over it, as did the OP, who had their CI pipeline broken. I think easter eggs are a poor tool to "remind people there were people on the other end of the line".
Edit: at least outside of entertainment software
Some of these old easter eggs are great, and I don't think we do enough of that anymore.
Yet another reason I have a hard time trusting software that is the product of integrating many disparate pieces with different engineering processes into something used in any life-safety or mission-critical application.
If you want free-as-in-beer software, you'll take what I give you, easter eggs and all.
Anything else is just entitlement.
Your pipeline will error with an unexpected result from man, you can grep the man code for “gimme” and remove it in 2 minutes, far quicker than reading a man page.
I miss the Linux world of the 90s before all the money grabbers came. I accept I’m in a tiny minority, and that would be fine. Sadly corporate interests overwhelm the ecosystem now.
- the free version does something goofy at 11:11, but works fine otherwise
- the paid version is identical to the free version, but it doesn't do anything goofy at 11:11
Of course it would be trivial to just do this:
if time.now() == time(hours=11, minutes=11):
sleep(60)
freeversion()
But if you've got a pipeline which absolutely must not fail then you should probably be paying the maintainer. Hacking around the easter egg would hopefully feel enough like an admission of guilt to just talk your boss into paying.This easter egg was entirely deterministic, though.
> Because we wanted the "manpath" - 'man -w'
Developer plants an easter egg. It was a good one ... and it was a reasonable assumption it wasn't gonna break anything. Several people have a good chuckle. Someone gets affected negatively by it, so the developer says, "fair play, that wasn't the intent, let's remove it". Everyone hugs it out and moves on.
I have no idea if this was the full story, or if his Twitter was aflame with negativity, but I imagine if this happened today, the tone would be much more combative than the exchange on the Stack Overflow page (eg: this HN thread, which is full of 'Easter Eggs Bad! Bugs!') -- which is a real shame.
If humour be the bugs of life, play on.
Waiting for the bug report that the fix broke someone’s workflow. https://xkcd.com/1172/
Great song to roller disco to. Great beat, great build up. Prior to taking up roller skating (inline) I wouldn't have given the song much credence, but I get a little surge of adrenaline just thinking about having weaved through crowds of noobs with this song pumping.
I'm starting to think that many tolerance-preaching people are the most intolerant bunch by far.
Easter eggs can certainly be problematic when used in APIs (or similar) where access is intended to be automated (and therefore vulnerable to surprises).
But in user facing code, easter eggs are perfectly fine.
Yes, Google is a corporation and yes, Google tries to build a product people want to use.
(Building things that people like is a good thing.)
That said, I've put a small number of user-facing easter eggs in publicly-traded MegaCorp code before. In every case, it was an inside joke among devs that the higher-ups never knew about it. The C-Suite is uptight and we definitely would have been reprimanded if they were aware.
It's always shakey to use the length of `stderr` for that
They were made public. They were horrific. Assume all code may become public.
Idiots using nasty comments or test data and then this leaking to management or users is nothing new, always a fireable offense showing immature behavior and lack of professionalism, something any company desperately need in software devs.
I still don't understand what they were trying to accomplish...
I can easily see that as a test for deployment image generation where you want to fiddle with the available man pages and test whether they will be accessible.
MANROFFSEQ= MANPAGER=cat man sprintf
The trouble was that it threw a kernel panic at certain times of the day. I troubleshooted it to no end - reinstalled Linux, did an EFI update. I chalked it up to something I did because I was running 16 GB of RAM when QNAP said max RAM was 8 GB.
Fast forward to this year, and it fails to load up completely.
It turned out that it was a silicon degradation bug that was a problem with J1900 devices.
I wasted so much time over the years trying to troubleshoot something that I could not fix…
Colin was being paid, of course, but not primarily for maintaining man.
Having said that, I once worked at a company (incidentally one where Colin worked, though after he'd left to join Ubuntu) where a developer added a line to the T&Cs that meant that a user granted their soul to the company. The intention was to check if the execs/legals checked the T&Cs like they promised to. They did not. Many souls were captured.
kidding, but also: please get the perspective..
There are certainly different points of view here.
I'd immediately take the easter egg out because I just assume if I hear about a bug once, I'm going to hear about it again. The selfish reason to fix any bug ASAP: it's an easy way to make life easier for my future self.
And yeah, also, why fuckup someone else's tests needlessly.
> I will raise a glass of wine for the good impressions of whoever at 0:30am is taking care of automated tests instead of a glass of wine.
Automated tests.
I mean, are you writing automated tests of /usr/bin/man ?
I don't know what you're doing.
Why does man print “gimme gimme gimme” at 00:30? (2017) - https://news.ycombinator.com/item?id=27994194 - July 2021 (211 comments)
Why does man print “gimme gimme gimme” at 00:30? - https://news.ycombinator.com/item?id=15747313 - Nov 2017 (159 comments)
Why does man print “gimme gimme gimme” at 00:30? - https://news.ycombinator.com/item?id=15746972 - Nov 2017 (1 comment)
Why does man print “gimme gimme gimme” at 00:30? - https://news.ycombinator.com/item?id=15742221 - Nov 2017 (1 comment)
Well, a year or two after I set that up, I got a text early one morning from a coworker who said the phones must have been hacked because they're not working right and whenever they try to call anywhere they hear a scary voice. When I took a look, it turned out that something went wrong somehow and all calls were getting forwarded to the last extension I added, which was 666. Needless to say, people weren't amused by my intended easter egg and felt insulted by the laughter.