32 comments

[ 4.0 ms ] story [ 60.1 ms ] thread
OP here, thanks for submitting!
"Give me six hours to chop down a tree and I will spend the first 4 sharpening the axe"
This is the reminder I needed. For some projects the python LSP I am using in Neovim just breaks sometimes. Always so frustrating when I start fuzzy searching instead of just jumping to a declaration or restart it.
The caveat is that you might end up shaving a yak.

More often than not I end up three or four tasks deep while trying to fix a tiny issue.

https://m.youtube.com/watch?v=_UZFI-8D5uA

I think some people frame Yak shaving as a bad thing but I'm not sure it always is, and often even it is it is bad because you're resolving debt.

The example with Hal is funny, repeatable (I share it frequently), but also the tasks are (mostly) independent. It feels more like my ADHD. They're things that need to get done, easy to put off/triage, and but make doing other tasks difficult so maybe they actually shouldn't be put off?

But there's also the classic example we're doing something is a bigger rabbit hole than expected. Usually because we were too naïve and oversimplified the problem. An old manager gave me a good rule of thumb: however long you think something is going to take, multiply it by 3. Honestly I think that number is too low and most people miss the mark. I'm pretty sure he stole it from Scotty from Star Trek but forgot that even that is fantasy.

Personal I think you have to be careful about putting off the little things. It's a million times easier to solve little problems than big ones. So you have to remember that just because it's a little problem now doesn't mean it'll grow. The danger is that it's little, so you forget about it. The shitty part is that if you tell you boss they get upset at you if you solve it now but you look like a genius if you solve it after it festers. Invisible work...

https://scifi.stackexchange.com/questions/99114/source-of-sc...

Engineering is a continual lesson in axe-sharpening (if you have 6 hours to chop down a tree, spend the first 4 sharpening your axe).

My favorite framing, from Kent Beck: “first make the change easy, then make the easy change.”

Using the debugger to understand/read code is invaluable. Seeing live stacks is so powerful compared to static analysis.
Ugh, this brings on flashbacks to when I had to work with Ruby, and the *** debugger would break with every single release. The RubyMine IDE that 45% of the company used was based on some bizarre custom Ruby gems to enable debugging, and that crap would take a month to be fixed by JetBrains. 10% used VSCode where debugging would sometimes work and sometimes not.
Also, FYI: Claude is very good at fixing tools
If you like what you just read you should probably never install Emacs.

You're welcome.

My friend once told this joke:

> "A good programmer, when encountering a debugger bug," he paused, cleared his throat, and said solemnly: "should immediately drop the program they're debugging and start debugging the debugger instead!" The auditorium once again erupted in thunderous applause.

"first we shape our tools, then our tools shape us"
I aim for the Boy Scout rule - always leave things better than you found it. It’s always a balance and you have to not lose the forest for the trees. Always ask what is the end goal, and am I still moving forward on that.
It's not just the tools, it is your tests. Most times you encounter and fix a bug, your first question should be 'Why didn't my tests catch this?'
> The very desire to fix the bug prevented me from seeing I had to fix the tool first, and made me less effective in my bug hunt

Kenneth Stanley's book "Why Greatness Cannot Be Planned: The Myth of the Objective" is dedicated to this phenomenon

If you're still dipping your toes into an LLM world, this is an excellent place to begin. I helped with a deploy at work the other day, we have some QA instructions (Notion). I pointed the LLM at one of the sections, asked it to generate task list for each section, and once that looked good, had to convert the processes into a set of scripts. The latest models make short work of scriptable stuff that you can use for debugging, testing, poking, summarizing, etc.
My version of this is ‘always be toolin’, but then of course one must use judgement lest it be better to just get on with it.
Excellent advice. I try to follow it in my daily work, with some success.

Excellent follow-up advice: now stop fixing your tools, and go fix your actual problem instead. I try to follow it in my daily work, with noticeably less success.

> So I fixed the debugger (it turned out to be a one-line configuration change)

That line links to the commit, which adds

    .withDebug(true)
to an invocation of GradleRunner in a file named AllFunctionalTests.kt in the krossover project.

My question is:

Why can the software choose whether, when I run a debugger on it, the debugger will work?

It can't, of course, so what's going on?

I would fix my tools but apparently my CPU is too old to run the Rust debugger which needs SSE4.
Good lesson! Can be tempting to fix the problems up the chain especially if the problem might happen again in the future. It depends on how much time, attention, and number of steps up the chain. Sometimes a work around keeps you moving forward but you miss some interesting (rare? learnings).