Software development deadlines. They haunt our dreams, ruin our weekends, and yet, somehow, we’re always shocked when we miss them. From tiny web projects to colossal AAA games, the software industry has an infamously bad reputation for blowing past deadlines and budgets. But how do software engineers manage to be worse than, say, the folks who bid on highway systems?

The Known Unknowns: We Sort of Know What We’re Dealing With

Before we tackle the real villain, let’s touch on the “known unknowns.” These are the things we anticipate will pose questions or challenges. When a project kicks off, developers huddle with domain experts to map out the grand plan. This early phase is rife with questions:

  1. Architectural Trade-offs: “Should we use Framework X for rapid development? Will it scale if our user base explodes?”
  2. Technical Feasibility: “Is there a library that does what we need? Do we have to build it from scratch?”
  3. Project Management Triangle: “Do we write quick-and-dirty code now, knowing we’ll refactor later, or aim for scalability and security from the get-go?”

These questions are predictable and somewhat manageable. We know they’ll pop up and can plan (read: guesstimate) for them. But then come the…

Unknown Unknowns

Unknown unknowns are the sneaky, unpredictable gremlins that can throw a project into chaos. They are the reason even the most detailed plans can blow up spectacularly.

Examples of Unknown Unknowns

So, what do these elusive unknown unknowns look like in practice? Here are a few examples:

  • The Market/Product Changes: This is the most common. When you’re building software you are building it for an end user with a purpose in mind. But you can never know FOR SURE that you’re building the right thing. You will only really know what needs to change when you first watch a user play with it. That’s why it’s so important to get it into the hands of real users as quickly as possible.
  • Emerging Technology Changes: A new version of a critical framework or library is released midway through your project, rendering your current approach obsolete.
  • Unforeseen Integration Issues: An external API you depend on changes or is deprecated without warning, requiring significant rework. This literally happened to me this week, and I spent two days fixing a problem that worked the first time with the old API. And this was a tiny python script and a Make.com workflow… not some giant HIPAA compliant stack that has five engineers working on it. That kind of change could mess up a project by months.
  • Unexpected User Behavior: During testing, users interact with your software in completely unanticipated ways, uncovering bugs and usability issues that require substantial fixes. Think of yourself as an explorer here; learning new ways your system can be used, and how users can f*@&k it up.
  • Regulatory Changes: New laws or industry regulations come into effect, necessitating changes to your software to remain compliant.
  • Team Changes: Key team members leave the project, taking with them critical knowledge and slowing down progress as new members are onboarded.

The Exploratory Nature of Software Development

Software development often feels like your are Indiana Jones navigating a jungle with a half-baked map. Sure, you have a rough idea of where you’re going, but the terrain can change unexpectedly. When developers estimate how long a task will take, they’re picturing a perfect world scenario. It’s tough to convey to managers or clients—who often see programming as a kind of magic—why one feature is a cakewalk and another is a nightmare.

Agile vs. Waterfall: Why Flexibility Matters

This is why traditional waterfall methodologies, which demand every detail be nailed down upfront, often fail in software development. Designing everything on paper without accounting for unforeseen problems is a recipe for disaster. Agile methodologies, with their iterative and flexible nature, help mitigate the chaos of unknown unknowns by allowing for continuous reassessment and adaptation.

Agile is by no means perfect though. Agile projects fail for different reasons: scope creep, running out of budget, not being disciplined in prioritizing features, not launching quick enough, over-engineering, and plain old building bad software.

The Myth of Big Design Up Front

Big design upfront (BDUF) robs software of its most powerful trait: adaptability. The ability to iterate, update, and improve on the fly is crucial. Agile approaches embrace this, understanding that no one can predict every challenge. The flexibility to pivot based on real-world feedback and emerging obstacles is what keeps projects on track—relatively speaking.

Making Software Development More Predictable

While we can’t eliminate all the unknowns, there are strategies to make software development more predictable. The problem is that most of this stuff makes you slow down. There is always a trade off. So enjoy!

  1. LAUCH EARLY AND OFTEN: Get your system into the hands of real users as soon as possible. If you’re not embarrassed to let users play with it, you’ve launched too late. I just wrote about this.
  2. Adopt Agile Methodologies: Agile frameworks like Scrum and Kanban promote iterative development, continuous feedback, and flexibility, making it easier to adapt to changes and unforeseen issues.
  3. Frequent Check-ins and Reviews: Regularly scheduled reviews, stand-ups, and retrospectives help catch issues early, before they spiral out of control.
  4. Automated Testing: Implement a robust suite of automated tests to catch regressions and integration issues early in the development process.
  5. Continuous Integration/Continuous Deployment (CI/CD): Use CI/CD pipelines to automate the deployment process, ensuring that new code integrates smoothly with existing systems.
  6. Risk Management: Proactively identify potential risks and develop contingency plans to address them if they arise.
  7. Maintain a Flexible Architecture: Design systems with modularity and scalability in mind, allowing easier adjustments as requirements evolve.
  8. Clear Documentation: Ensure comprehensive and up-to-date documentation so that new team members can quickly get up to speed and existing members can easily reference past decisions.
  9. Cross-Training Team Members: Promote knowledge sharing and cross-training within the team to prevent project delays if someone leaves or is unavailable.

Embrace the SOME of the Chaos

Software development is messy, unpredictable, and often maddening. But by recognizing the difference between known unknowns and unknown unknowns, and embracing methodologies that allow for flexibility, we can navigate the chaos more effectively. Next time a deadline whooshes by, remember: it’s not (just) about poor planning. It’s about the nature of the beast itself.

In the end, the key to handling software project deadlines is accepting that some things will always be out of our control. So, let’s embrace SOME of the chaos, adapt on the fly, and maybe, just maybe, we’ll get a bit closer to hitting that elusive target. And if not, there’s always more tea, whiskey and a good sense of humor to see us through. Although that will never make your boss our your client happy.

Previous ArticleNext Article
I help companies turn their technical ideas into reality.

CEO @Sourcetoad and @OnDeck

Founder of Thankscrate and Data and Sons

Author of Herding Cats and Coders

Fan of judo, squash, whiskey, aggressive inline, and temperamental British sports cars.

Leave a Reply

Image generation comparison from February 2026

I spend a lot of time generating images these days for presentations. My typical workflow is fairly scientific: I ask Midjourney to produce a relatively cute image of a frog, a toad, a robot, or some other vaguely anthropomorphic creature doing something related to the slide I’m about to present.

Once I get the image, I expand the background by about 90% so the character ends up in the corner of the slide. That gives me a nice, relatively clean area to drop text on top. Sometimes I use Photoshop to do the expansion. Sometimes Midjourney cooperates. ChatGPT is actually pretty good at this too. Nano Banana is… enthusiastic. It tends to try a little too hard right now.

That’s fun and all. But the more interesting comparison isn’t cute amphibians. It’s boring enterprise diagrams.

Recently I had to generate some architecture visuals for an RFP response. Rather than suffer alone, I decided to turn it into a model comparison experiment.

Below is a slightly simplified (but very real-feeling) prompt I used. The company is fictional. The buzzwords are not:

Create a clean, executive-level architecture diagram titled “Closed-Loop Member Intelligence Platform.”

The layout should be 16:9 and structured left to right with a circular optimization loop surrounding the system.

On the left side, show multiple member touchpoints feeding into the platform:
- Website (class browsing, account login)
- Mobile App (workout tracking, push notifications)
- In-Club Kiosks (check-in terminals)
- Wearable Device Integrations (fitness trackers)

Label this section: “Member Interactions Across Digital & Physical Channels.”

All touchpoints should flow into a large central hub labeled:

“Unified Member Profile & Real-Time Event Engine”

Inside the central hub, include:

- Web SDK
- Mobile SDK
- API Gateway
- Event Streaming Layer
- Clickstream Data Capture
- CRM Data Sync
- Identity Resolution Engine

Include a small sub-caption:
“Event-level data unifies anonymous visitors and active members into a single dynamic profile.”

From the central hub, arrows should flow to a right-side activation layer labeled:

“Real-Time Engagement & Orchestration”

Include these outputs:

- Personalized Workout Recommendations
- Dynamic Class Availability Messaging
- Triggered Retention Offers
- Membership Upgrade Campaigns
- A/B Testing & Experimentation Engine

Surround the entire diagram with a circular arrow labeled:

“Continuous Optimization & Revenue Growth”

Along the circular loop, include metrics:

- Engagement
- Conversion
- Retention
- Lifetime Value

Design style should be modern, minimal, and suitable for an enterprise SaaS presentation.
Use neutral tones with one accent color to indicate data flow.
Avoid clutter.
Make the architecture clear and readable for both technical and executive audiences.

Here are the results.

ChatGPT

Clear winner for “looks like a human consultant made this at 11:30 p.m. before a board meeting.” The text was incredibly legible. The layout was balanced. The hierarchy made sense. It genuinely looked like something you’d expect in a mid-market SaaS pitch deck.

I even did a reverse image search on some of the icons. No exact matches. That suggests they were generated rather than assembled from some common icon pack. Which is pretty cool.

Claude

Claude did something interesting. Instead of just giving me a static diagram, it generated a React application that rendered the architecture visually inside its canvas. I should have guessed this is what that nerd would do… in fact I did guess, but whatever.

That has upsides. I can tweak the code. I can modify the layout. I can version control it. That’s appealing to the nerd in me.

But technically it failed the homework assignent. It wasn’t what I asked for. I asked for a diagram image. What I got was a React app that displayed a diagram that I had to screenshot.

That said, I actually liked the aesthetic. It felt a little more “me.” Slightly less textbook. Slightly more product-thinking.

Gemini (Nano Banana)

The undisputed champion of 2026 in image generation, nano banana, was actually my least favorite of all of the designs. I think there’s something really weird about the arrows on the outside ring of this diagram. Why are there two arrows between “Engagement” and “Conversion”? Why are they different sizes? I did actually find a couple of exact matches when searching for some of these icons here, so so there might be some assembly on top of generation going here, but I cannot tell because these icons are so universal that it’s likely that that could just be a coincidence.

Midjourney

Ah, Midjourney. My current favorite for keynote frogs.

Completely and utterly useless for generating readable diagrams.

It’s phenomenal at stylized imagery. I’ve tuned it so much over time that it practically knows my aesthetic preferences better than I do. It’s like it’s been trained specifically to make amphibians that align with my personality.

The Omni feature (object permanence) is genuinely impressive. If you’re telling a visual story and need a character to look consistent across multiple scenes, or you’re creating a children’s book to convince your six-year-old that haircuts are not a violation of human rights, it’s fantastic.

But enterprise architecture diagrams? Nope, sucksville.

Wrapping Up

I was pretty sure that nano banana was going to run away with this one. Everyone I know works in banking or finance or medicine has been telling me how great the model is for generating diagrams and process flows. They’ve been raving about how things that were not possible three months ago are now completely durable with this model. It was a little bit of a surprise to see that my personal favorite was good old-fashioned ChatGPT. I think, for my personal use, I’m probably going to use Claude to generate diagrams because they’re a lot easier for me to tweak once they’ve been generated.

That said, I think this experiment showed that when I do this kind of work in the future, I’m just going to load up the same prompt in three different models and just pick the one I like the most. Some of it’s going to be personal tastes; some of it’s going to be how well the model interpreted the prompt, and some of it’s going to be the state of that particular LLM and its model on that given week.

And I’m going to stick to only using Midjourney for generating cute pictures of toads.