Did I just sign-up to Prime? Is this hell? Are we in hell.

Having grown up around the internet I consider myself fairly good at opting out of 'hidden' opt-ins during a checkout process. But this is the second time using Amazon recently where I just can't tell.

The first time I hit a 'bug'1 where you genuinely couldn't opt-out of Prime. Choosing "no thanks" during the pre-checkout step had no effect. Cancelling through the modal at checkout didn't work either. I was caught in a Prime loop. I had to use someone else's account to complete the order since they had previously used and cancelled their Prime 'trial'2.

This time I think I opted-out successfully but I have absolutely no idea. Going to my account and looking at the Prime settings leaves me none the wiser. All the text suggests I've already been forced into paying for Prime. I think the only way to tell is to wait until I see the charge or not I guess.

This is the 5th biggest company by market cap in the world, according to a Google of "biggest companies in the world". This is regarded as one of the best/most desirable tech jobs in the world. According to conventional wisdom the people who build the website aren't complete clowns. But... just look at this shit? Why is Amazon regarded as somewhere to emulate?

I have nothing intelligent to add here. No grand point to make. I just don't know how anyone feels positive about working in software anymore. I don't know how we get out of bed in the morning. It's all like this, dark patterns, value capture over value generation. Going into 2024 where does the motivation for any of this shit come from? It's all terrible, we're in hell, this has to be hell; the alternative is too bleak to consider.3

  1. Super convenient for Amazon's bottom line I'm sure...
  2. Not a trial, just a subscription with an initial discount, a trial would allow you to make a purchase decision at the end.
  3. The irony of posting this on AWS is not lost on me.

Interviewing and failure

3rd May 2022

In today's therapy session pretending to be a blog post I want to try and process my recent interview failure.

This might be hard to believe but this was only the second ever time in almost 9 years I've failed to proceed to the offer stage for an interview. The first time was my first ever interview; when, as a bright-eyed young physical sciences graduate who could barely FizzBuzz, I was asked a bunch of questions about big-O notation and whiteboard algorithms. Something I'd never encountered and have never really had to think about since.

That first experience dented my confidence so much I jumped into the first job I was offered afterwards (at the very next interview). This turned out to be a reasonable turn of events. That job taught me SQL extremely thoroughly and was a fairly ideal first role. Plus, in retrospect, it was probably more interesting than doing Java XBRL processing.

4 roles and 9 years later I find myself dealing with the same shock and feeling of inadequacy. Impostor syndrome on steroids.

So what happened? I failed to guess what side of bed a random code reviewer was going to get out of bed on a random morning. Maybe. Maybe I pushed my luck by applying for a Python role when the last time I did Python was a tutorial 7 years ago? Maybe I'm not as good as I think I am? Maybe I actually am an impostor? Maybe if real people who get paid to code for a job think I'm crap they're right?

But then I do get paid to code for a job. And every job I've had has been extremely happy with my work. And I know I'm in the top 30% (being modest) at least of developers just by comparison with others. I still have one company wanting to hire me 2 and a bit years after seeing my code-test.

This isn't a "hiring is broken" or "interviewing is broken" post because the process was actually very well planned out. And the take home test was quite fun (and I'd rather have take home tests than whiteboard algorithms, the aformentioned big-O incompetence). And they had an initial screen call to show they were willing to invest in the process. And they gave feedback with the rejection!

However the arbitrary-seeming scoring or evaluation of take home tests has unsettled me. When you submit code for review in your day job you can at least discuss decisions and tradeoffs with your reviewer even if they dislike the code on principle. A take home test is always a best-guess process. You don't know if the single reviewer who will be reading your code values abstractions or simplicity. You don't know if you're designing for the future or showing your prototyping skills. You don't know if test coverage is a plus or marks you down as a worrier.

In this case I thought I was designing to support one future use-case (extended formula parsing and evaluation) when in retrospect it was likely they were looking for a different future extension (sorting and searching). The design made trade-offs for formula evaluation that would have made the latter use-case more inefficient and slightly harder to implement. But there were easy changes that could be made such as indexing data for searching or changing the underlying storage structure to make sorting efficient.

And so I find myself revisiting and justifying every choice. It's like when you wake up at 3am and think of the perfect comeback 2 weeks after an argument with someone you'll never see again. The response turning to ash in your mouth. If I could just point out that I'm aware of the tradeoffs I made in a conversation with an actual person they'd surely see my genius. I'd show them all. Mark my words, I'd show them all.

Just let me work

12th August 2021

Just let me work

Why is it that every business larger than about 10 people falls back into the same waterfall model of operation? Why is it that development capability becomes a resource to turn on and off like a tap? Why can't I just do my goddamned job?

Here's a thought, if you make and build widgets in your state-of-the-art Widgetmaster 3000 factory maybe making widgets is pretty core to your goddamned business and everyone in the business should have quite a bit of insight into the care and feeding of widgets.

So if your core competency is software maybe you want people across your organisation to know the first goddamned thing about computers, such as what the difference is between an OS and a browser. Maybe rather than creating a silo for all the strange, stooped, socially awkward weirdos whose role is to take your perfect handcrafted requirements and turn them into exactly what you specified you should involve them in discussions about the direction of the business?

Sidebar here, you'd hope the widget scenario would pan out like that but actually what happens is it gets bought by some private equity parasites who load the business up with debt and scoop out its brains because we live in, if not the worst, then perhaps the top 20% worst implementations of a market economy. Just below the one where every food company switched to manufacturing for furries, so everyone died hungry, but happy, in their fursuit.

Maybe the people whose day to day work involves modelling complex domains and spotting commonalities and differences between abstract concepts are actually good at doing exactly that and have rather more context for spotting what ideas are workable and which ideas are inescapable morasses of complexity and bugs than you, the person who learned to compose an email just-so?

Just because your interview process now selects for developers who obsess over rebuilding the hash-map rather than shipping doesn't mean you can't do something else. Maybe you should stop constructing tests to select for the developers who want to use your company as the proving ground for their novel take on the binary tree?

Every goddamned business out there doing software does the same thing. "The Business" holds lots of high level meetings where people who make $1000s every hour decide what is going to be built. That's then handed off to some people who can make eye contact such as sales, product and marketing to refine and scope. Then additional high level meetings are held where the same people agree what should be achievable. Maybe that 3 month project to tell where bird photos are taken is actually a 5 day piece of work, but the follow on 2 month phase to tell what bird the photos are of dooms the whole project?

Either software is core to your business or you outsource it. If it is core, actually make it the core and let's stop this make-pretend implementation of Agile and actually build self-directed cross-functional teams who have enough oversight of the business to deliver value reliably and with minimal fuss.

Trusting Humpty Dumpty packages

17th June 2021

When someone tells you their name it's highly likely they're being honest with you. They might be using a nickname or a short version of their full name but they're probably not lying to you. I, for example, hate my name but I still tell people my real name, most of the time, unless I'm drunk and playing the fool.

Given I trust most people I meet to tell me their real name, shouldn't I also tell them my phone passcode if they need to make a call?

Probably not. In fact someone who is lying about their name is more than likely not someone you should trust with your phone login.

So why do businesses and compliance teams mandate that code may not use pre-release or alpha/beta versions of packages? Package versions are, after all, just names we attach to versions of a codebase. There's no guarantee that the named version is fit for purpose even if it is a stable version or even that the installed package matches the available code of that version.

Unless you have a commercial support contract with some entity you're probably going to be fine installing unstable versions of the software. With open source software the code is all there to read, what has changed between versions is fully available and the maintainer owes you nothing with their versioning scheme/approach. You're going to be fine because you're auditing the package code and testing it thoroughly before deploying, right. ... Right?

Agile is hell

5th June 2021

I needed to take my car to the garage, it had taken several goes to start in the morning and was making weird noises. I had played it safe and taken the bus to work instead. I managed to book it in during lunch and they were able to fit me in the next morning.

So the next day I clattered and spluttered across town to the garage, praying the engine wouldn't explode. Made it in one piece. Drop into the reception by the workshop. I always find those places intimidating, having no knowledge about cars or what work involves when you're not sitting in a cosy office all day. I explained the problem I'd been having, I obviously wasn't able to be any more specific than "it makes weird noises", due to the aforementioned lack of car knowledge.

"Sure, bring it in we'll have a look and get it back to you hopefully by the end of the day. Will you need a courtesy car and what number can we contact you on?". I stared blankly at the mechanic. I'm sure he's not an idiot. God knows I have no idea what he does, but he does seem to be missing the point.

"Uh", I started nervously, "that's not how I was planning to do this".

"Oh?". He seemed to be waiting for me to spell it out, obviously not taking the hint.

"In order to optimize flow and avoid any build up of blocking dependencies on your garage, I was going to bring in the affected components one at a time. That way I can split the work with the garage across the road. I'll want an estimate on each component and a timeline for the total fix. That way I'll be able to plan when I can get my car back. That's just optimal surely?". He seemed to be looking at me like I was an alien. I was beginning to worry this garage had been the wrong choice, it had been very well reviewed on Google but sometimes these places buy positive reviews.

"Mate... It uh, doesn't really work like that". He's surely just taking the piss, how else would it work?

"I really think this is how we should do it. I'm willing to make it worth your time".

"Well ok, I guess for double my usual rate. But it's not the normal way of doing it". I see, he was trying to pull one over on me. But I don't want my repair to be stuck in his garage for weeks while he holds me over a barrel. At least he saw sense.

So I go out, first thing to check I guess is the car headrest, manage to jimmy it off with the tools I bought with me. I bring it in. "First up, can you give me an estimate of how long it will take to review this item and how long the overall fix will take?".

"Don't really know mate, uh, 30 minutes to check that and maybe a fortnight for the whole car?". A fortnight? That's a lot longer than I expected but there's no other way around it. Split over 2 garages that should make it a week; if I really need it fixed I can spread it over 3 garages for an even quicker fix. So I remove the car battery and pop over the road, go through the same rigmarole at the other garage but he, too, sees sense. This project's off to a great start.


So you're probably reading this wondering, what on earth is the author on about? Alternatively you've worked in any corporate software development environment (you write Java or C#) and you know exactly what this about.

I hope you'll forgive me for stretching an analogy way past breaking point, but I hoped to really get to the absurdity of modern "Agile" practice and this analogy really struck home for me. Modern Agile projects are a hellscape, where the meaning of Agile has been so warped that it stands counter to everything some folks wrote in their manifesto back in the day, a more innocent time.

When writing about Agile one always has to counter the people who chime in "oh but that's not Agile as the founders meant it". But if every time I said I was giving you a "gift" I actually punched you in the mouth you'd soon learn the revised meaning of "gift". And, dear developers, we're well and truly in need of reconstructive dental work.

Agile has destroyed all fulfillment in the career of software development.

Some old German bloke with a big beard once wrote about the alientation of labour. It would be rather delusional to claim software developers are uniquely victims of this; but corporations have long sought to convert their software development workforce into assembly line robots, with no-code tools the ultimate aim. Originally they did this by specifying the system to death in waterfall. Now Agile has replaced waterfall as the means by which to remove agency from software developers. New emperor, still nude.

So what, exactly, is the problem with Agile as currently constituted?

Simply put, by fragmenting the work of building a system into many discrete chunks and preventing any run-of-the-mill developer having an overview of the system, domain and project constraints the development workforce is reduced to the role of a stenographer (no disrespect to stenographers, they're highly skilled). Faithfully implementing whatever 'the business' decides is needed in whatever order, with daily counts standups to ensure no developer develops notions and goes off script.

The whole picture, the business-need to be solved or feature to be created, is first filtered through levels of people who don't really understand the technical constraints in place and what is reasonable in the existing system. It is split up into fragments so that each developer only has a part or parts of the elephant and then those parts are estimated in a vacuum. Then an estimate for the whole is constructed off those sub-estimates.

No developer has enough pieces of the puzzle to see that they're constructing a jigsaw of cost and deadline overruns while delivering something that doesn't meet whatever the original aim was.

So what's the solution?

Unsurprisingly enough the answer is in the Agile manifesto and it can be done, I've seen it happen.

Software development needs to be reimagined as a much more people-facing role. Developers need to work in tandem with end-users and internal non-developer coworkers and have a deep knowledge of the problem domain. There should be no internal meetings to discuss feature work or project scope without as many developer representatives as possible.

Businesses seem to have a mortal fear of a horde of shabby developers who can't make eye contact invading their inner sanctum. But without including developers in the entire process development as work will continue to suck and the output of (corporate) development projects will continue to be shoddy.

The most important thing a developer can do isn't code. It's act as an analyst of what's possible and how to deliver it. This is a call for more meetings. Not useless standups but meetings with end-users to hear feedback. With internal users/'stakeholders' of systems to understand the goals of a project. With both groups early and often to work through the any adjustments that must be made as requirements change and constraints are encountered.