Ask HN: How do you overcome decision fatigue in software development?

158 points by jb1991 ↗ HN
Name any kind of project in nearly any domain, and you can choose from a dizzying array of possible language choices and tech-stacks. The modern state of software development in nearly any mature ecosystem, and many even that aren't so mature, allows for building just about anything on any platform. Want to build a web app, but don't like javascript? There are so many options in languages that compile to JS, as well as languages with front-end WASM frameworks. Want to write a websocket server? Nearly any language can do that now too. Want to store your data? Phew don't get me started on the infinite ways to do that one, with or without a database, with or without a server... it just seems overwhelming, in part because software development is very time-consuming. You don't want to spend all the time on the inferior choice or the choice that will bite you later and trigger a rewrite and decision fatigue all over again. Or so the psychology seems to go. How do you deal with it?

122 comments

[ 3.6 ms ] story [ 192 ms ] thread
Most of the time and in most places use proven, boring, technologies.

There's time and place for using cutting edge solutions. But if that time is 'always' and that place is 'everywhere', you might be doing it wrong.

Keep things simple.

Well said! Over the years working in web development, "Keep it Simple" saved me countless times. Unless a project has strict requirements for a new, novel and/or complex solution, stick with the simplest, proven, heavily-tested option--usually the most boring. When selecting tools for your stack, ask yourself: "How will my end users/customers benefit from this tool?" For example, very few will care if you used Angular, React, Vue or jQuery for your front-end as long as the page works well.
Keep it simple and get the basics right. That's when having good education matters. College won't prepare you to the market in sense of cutting-edge technologies but will give you good basics on "boring" but essential knowledge that helps you think in terms of trade-offs and evaluate new technology properly. So you don't have to shoot yourself in the foot jumping into, say, an Electron bandwagon and writing big, resources-consuming applications when something simpler could suffice or adopting NoSQL and having to deal with the lack of ACID just because "shiny new tech" and "everybody is doing it".
Exactly. I was very close to using Mongo for a project that had mostly relational data and a few unstructured fields. MySQL with a few JSON columns worked much better in the end.
We asked for a basic inventory management product that would have uniqueness constraints, mainly relational data, and be used by a small group of users. Our devs wanted to test out angular to see if it would speed up development on other projects (fair enough), and pitched dynamoDB on AWS. Angular took just as long or longer as their usual methods, required outside consultants for extra cost, and dynamoDB got us a product that failed uniqueness constraints all over because the devs were unfamiliar with NoSQL as well. I guess it helped with adapting the software quickly and adding fields as new requirements popped up though. Nice experiment, but definitely not something you'd want to have to deliver on a schedule to a customer with strict requirements and a competent QA team.
honestly the best solution may be to cultivate other non-programming hobbies so that your time becomes appropriately more precious. unless you're in a high volume or high stakes situation, most of the options give a workable result and to the extent you realize you make mistakes, that learning experience makes the future decisions easier to make. point is, there's probably not a short cut.
This article is a bit older but still relevant[0]. I do more or less this, most of the stack is proven tech I know then I might swap out a few components with something newer or more shiny, evaluate and may or may not take that new thing into the next project.

[0] https://mcfunley.com/choose-boring-technology

This is a very pragmatic approach, I like it.

But I want to share an alternative to this because it helped me greatly in the past:

Sometimes this kind of decision fatigue is actually clouding something more profound and you might be on to something valuable, some kind of truth that is hidden away and still needs to come out.

Your decisions get blocked (from your subconciousness?), because you know this in some way and you cannot quite grasp why that is yet.

The hard part is to decide whether this is the case at all. I don't have a silver bullet for this, but one thing that helps is to try to be optimistically self-critical.

If you determine that this is actually the case: You have found some deeper idea/connection that you don't understand enough yet. Then you want to explore the idea by writing prototypes and text to figure out whether there is some pragmatic core that you can extract.

Note that sometimes these ideas are positives or rather solutions. But often they are problem statements or criticisms. The latter needs more exploration, often with different technologies.

This is an interesting idea, are you suggesting that sometimes what manifests itself as decision fatigue is actually stemming from lack of a deeper understanding of the problem? I will try to apply that.
> This is an interesting idea, are you suggesting that sometimes what manifests itself as decision fatigue is actually stemming from lack of a deeper understanding of the problem?

This can easily stand on its own as a general reason yes. But I meant specifically in combination of having some "rough diamond" (please excuse the pathos) that is nagging you in the back of your mind and blocking decisions because you are not pursuing to find and polish it.

Often the pragmatic or "boring" approach is just right. But sometimes it isn't because of a reason that is hard to articulate and it just doesn't leave you alone. I think this is the nature of the creative process. Being brave and exploring it would be the "right way" in this case to figure out whether the idea is feasible or sound, (which it often isn't, but you can't help it and figuring this out is valuable in of itself).

If I'm comparing options, I try to pick what's most popular. Community support, being able to find things on Stackoverflow, etc. is better than the small technical wins right now. And it will likely have a longer shelf life.

For situations where there is not a clear popular or technical standout, I timebox the research time. After x (days|hours) I need to have a decision spec'd out. That way if I spin my wheels too long, then at some point I hit a deadline and my time is up!

> what's most popular

A clarification here that I think is worthwhile:

Pick things that are "popular" as in widely used, not things that are "popular" as in "trendy" or "in vogue".

Ah, yes, exactly. This is kind of similar to picking "boring tech" that others in here have mentioned.
I like the concept of an "innovation budget". For example, if you're using a compile-to-WASM system for the first time, just use the database you already know.

If the system is all completely new to you, then pick a very small project (or wait until you have a lot of time on your hands and failure is an option).

I wouldn't go into a new project using new tech or with the goal of using new tech. That's setting yourself up for failure. Go with what you know.

You should look a new tech as something to be experimented with and tried out in a casual sense. New JS Framework? I'm going to try and re-create this thing that I know how to do in the Old JS Framework and compare. New database? Make a simple app to explore it and flesh it out.

If you don't know enough about the new product to compare it to what you know, you shouldn't be considering going with something new. New stuff comes out all the time, but that doesn't mean it's good or worth looking into.

Focus more on the business value of what you are delivering and less on the amount of programming time it takes to get there. These things are not linearly related.
It's the exact same as tools in your garage. You will use a hammer, screwdrivers, and pliers often. If you do a lot of work, you'll end up getting a ratchet set and some power tools. If you find yourself with an air compressor and a nail gun trying to hang a picture frame on your wall, you're probably over-engineering. There is a perfect tool for every job, but there is a tool in your toolkit that can probably get any job done too. The important factors end up being other things.
I tend to use 'boring' technology if that serves the purpose, and I try to not experiment with new tech in projects that I need to deliver.

For experimentation and prototyping I tend to check out new things, those might end up in the 'boring' stack once I'm familiar with them.

For me it's a personal stack of tools that work for me, and I try not to be too influenced by what's the next new thing on sites like StackOverflow or Hackernews, I use what works for me and what makes my clients happy.

Whats considered "boring technology"? Typically, I assume it refers mostly to more time test and mature tech, but is it popular mature tech, or just any mature tech in general?
I'd consider it a combination of being time-tested and lacking hype. Ruby on Rails is a good example of something which seems to get next to no hype compared to its heyday(even 7 years ago when I started with it), but still powers thousands of businesses and has lots of job postings.
I think it's mainly about being reliable. For instance, I'd consider Hasura "boring" in the good sense. It's fancy in that it allows you to do realtime queries on top of postgres. That's new and exciting. But it's also boring in that it took about half an hour to set it up. I've zero problems with it since, and the pnly maintenance is that it occasionally propmts me to update to thw latest version. Which takes about 5 minutes and has yet to cause an breakage.
"The stuff they used in the good old days" :)

In seriousness, the phrase "boring technology" is, to me, a reference to the talk "Choose Boring Technology" [0], which has been discussed on HN numerous times [1] (deservedly, because it's great).

The author doesn't explicitly say what boring technology is, but uses examples you'd generally expect: postgres, php, python, memcached, mysql, apache web server.

Basically, products that have been doing relatively complicated things (interpreted code, rdbms, key-value stores) for a very long time.

Explicitly, he says that "boring technology" is technology that's defined by its very low maintenance cost. He claims that maintenance costs are mostly driven by uncertainties around failure conditions and design. These kinds of uncertainties are especially present in newer stacks, where the opportunities for footguns and unspecified failure conditions abound, because people are still working them out.

He implicitly references Redis as a fancy new technology, but a lot of people today would probably consider Redis "boring" (unless you're trying to use it as your RDBMS).

[0]: http://boringtechnology.club/

[1]: recently, here: https://news.ycombinator.com/item?id=20323246

I'm kind of a broken record in this sense, but I'll say again that one can pay too much attention to HN and, if they do, they might come to believe that PHP and Ruby are far too slow for most cases and that only serious developers write their backend in Elixir, Python, or Rust, use NoSQL, integrate Kafka for a data pipeline, build frontends in TypeScript or Elm with Svelte, WebPack or GTFO, and containerize everything and scale out with K8s.

99% of the developers here aren't even close to needing to think in terms of that scale, beyond simply not doing dumb things in your code that can happen no matter what tools you use. Hell, there are whole companies that don't need to do these things. A few companies I've worked for or contracted with were bogged down, IMO, because someone couldn't settle for "adequate", making the company suffer because their architecture is so hard to figure out.

I like using "boring" tech(in particular Ember.js, Node.js, Ruby, CouchDB and PostgresSQL/SQLite) because if something gets the job done in a reasonable amount of time, most of which I think comes down to having a competency with a set of tools, then I really don't care very much for drinking from the firehose of frameworks and libraries.

Letting go of ego is tough but, when you do, you're freed from the need to be "like Twitter" or "like Uber" and instead just build things using tools you are genuinely interested in or work for you. It's one thing if you really have the desire to be the kind of wizard to work at Google(and not be relegated to writing shell scripts all day), but if that isn't for you that's fine because the vast majority of jobs out there don't need an archmage.

What most companies need is someone who is going to KISS and not eff things up. If you can do that, you'll have a hard time getting fired even if you sometimes slack off.

Valid comments but there really is no reason not to use Typescript these days if you are considering JavaScript. Even for small/single-person projects there is no reason not to use it given its benefits and the fact that it takes 10 minutes to learn if you are a JavaScript developer already.
I’ll die on that hill— back when I was interviewing for my next frontend position I told all my prospects I wasn’t interested in working for them if they aren’t using TypeScript or at least open to migrating.

There really is no reason to use plain JS for anything!

> There really is no reason to use plain JS for anything

unless you don't want to compile your code. I can spin up little projects that don't need a build step just fine.

Typescript programming invariably results in time spent figuring out how to properly type otherwise valid JavaScript code, ie debugging code that doesn't wind up in your app. In a large app, the types can be their own special form of spaghetti. The typing system is clunky and inelegant compared to Elm, which is what I would use for a non-JavaScript frontend. I'd never greenfield a project with TS if I could avoid it.
> In a large app, the types can be their own special form of spaghetti.

I have a relatively neutral opinion of Typescript, but oh boy does that quote ring true. TS can be a very nice safety net when refactoring (just fix all the type errors, and the app should mostly work as it did before), but you can also very well paint yourself in a corner with similar-but-slightly-different types all over the place that'd just work if it was in JS.

Yeah, agreed, but it's nice that it gives you the flexibility to be able to throw a `// @ts-ignore` in there and tell the compiler not to worry about it. I've definitely done that when consuming wonky libraries with messed up type definitions.
I agree that TypeScript's type system is clunky compared to Elm, but being able to add a good amount of type safety with such a small learning curve and a large ecosystem at your disposal is a massive win. And Elm has its own problems (breaking changes, awkwardness of ports, lack of libraries).
I think that 'boring' technologies are actually the HN consensus. Few technologies get more praise on HN than Postgres (or even SQLite), and frameworks like Rails, Django, and Laravel also get a lot of positive reviews.

Sometimes newer technologies get hyped, but interestingly the most popular ones like React and Rust are also quite boring in many senses (React introduced a new model of programming web views, but stuck to plain JavaScript concepts, didn't try to reinvent the wheel for every component (e.g. like Angular having it'a own special http library) and has been incredibly reliable with few breaking changes from day 1. Rust introduced the idea of a borrow checker, but otherwise intentional borrows most of it'a ideas from other langauges and doesn't try to invent new ways of doing things, and again is incredobly stable and reliable from an implementation point of view)

What’s not “boring” about developing a backend in Rust? Rust is one of the most boring languages I can think of.
Not to plug too much my writings but I dedicated an article about this topic:

https://www.kabdebon.com/cto/2020/06/20/making-boring-techni...

My two cents, if you want to build a business or a project for a company: go with battle-tested, mature technologies, always. Take away the risk of immature technology getting in the way of the only mission: delivering value to your customer

Now for a personal project... go crazy, have fun and try what's new out there.

I treat big, non-obvious, hard-to-reverse decisions as a task in my to-do list. When I get to them I take some time to write out the options. For larger projects or projects that involve collaboration, this lives in a working design doc. For smaller or personal projects, I keep this in a per-project journal document.

Once the task is checked off, I can mentally free myself from the burden of thinking about the other options. If the decision turns out to cause unforseen problems, I can revisit my notes on why I made the decision and reevaluate with the new information.

A few mantras I try to use for this type of problem:

* There are no solutions, just tradeoffs. Don't think there's a perfect tech stack.

* Done is better than perfect. Velocity matters. This generally means pick something you know if delivery is important.

* Boring tech tends to be reliable. Things like PHP, Rails, Django, etc. These tools have been around a long time and ironed out the kinks. Lots of documentation and tooling to make your life easier. Odds are very low your new fancy idea has any requirements that boring tech can't deliver on. This counts for every layer of the stack (frontend, DB, OS, etc).

I think the most important thing to keep in mind is you'll never have a perfect solution and that's ok! Don't get fooled by all the hype from new technologies that try to make you feel inferior for using other tech.

From a product managers perspective - very wise words! Not many engineers get this (or they do but would still rather work on bleeding edge tech for $/CV kudos).
It's hard for an engineer to focus on getting the job done when employers require knowledge of a certain fad tech stack. For all the hate the "whiteboard interview" gets, it's far better than the alternative which is how familiar you are with the interviewer's tech stack so you code up example projects in a race against the clock.
The boring tech part is especially worth considering what environment you're really working in: if you need to interact with things like enterprise SSO systems or web services, meet regulatory requirements, etc. there can be a lot to be said for being able to install something like a SAML authentication, obscure database or file format library without having to write or significantly contribute to one if that's not your core business goal.
I suppose that could be an argument for microservices; use 'boring' tech in the places that necessitate it.
Yes – although even “microservice” might be slightly skewing that. I generally like to refer to it as “easily replaced” — i.e. if you have a monolith but it's well organized without broad cross-dependencies, you can swap things out pretty quickly without otherwise changing your deployment model. Maybe that's getting somewhere on the microservice spectrum, maybe not but the key part is really just that you have a well-understood contract for what a component provides and what it depends on.
> There are no solutions, just tradeoffs. Don't think there's a perfect tech stack.

Wow I really love this perspective.

I generally prefer boring, mature technologies or things I already know over resume-driven development as well. One potential gotcha though — today’s uncool thing that you know might be tomorrow’s thing that no one else knows

The last project I worked on still used JSF for the UI, because they guy who created the core of it knew and loved JSF. Then he retired a couple years back, and it’s been a real struggle to find anyone able and willing to do JSF development.

> There are no solutions, just tradeoffs. Don't think there's a perfect tech stack

I completely agree with your point, but the absence of a "perfect" solution doesn't mean there isn't a global maximum. I think people already understand that too -- how many "what's the best X?" searches do you think people perform compared to "what's the perfect X?"?

I assumed OP meant that the answer to "what's the best X?" for any nontrivial X, is "it depends"!
It is an assertion that there isn't a unique global maximum for all needs, as slight variations in how important each part of the tradoff is for you will determine whether A or B is better; and the only reasonable answer to "what's the best X" is "it depends".

However, I would also assert that for many somewhat mature technologies the value of determining the global maximum for your particular needs does not outweigh the effort required to do determine what it is - in general, a reasonable local maximum will be almost as good as the global maximum; you want satisficing instead of optimizing.

What I like about boring tech is, that in my experience it results in that these kind of decisions just becoming less important. It makes it harder to shoot yourself in the foot with when trying to predict the future.

Especially in early stages of a company, where I don't yet know what the product that sticks will look like, I'd rather have a Postgres that I can pivot on in pretty much any direction and I'm hardly ever the first one to run into a problem, than a hyper specialized novel database that might have been strictly speaking the famous "better tool for the job" when I started.

I've noticed that managers tend to over-emphasize the benefits of boring (solved problems, consistency, easy to hire for), and devs tend to over-emphasize the downsides (verbosity, cruft, harder to attract top tier talent, harder to keep top tier talent). Few people recognize the need to strike a balance.
The word you're looking for is: exaggerate
Some devs want to try the latest and greatest as resume fodder or out of boredom.
Well, sure. I mean, a valid reason to not use boring technologies is because you're bored with them. Devs need to grow and be challenged, or you're going to lose them. That's where management makes its error; they'll pick technologies based on what is popular ('easy to hire for'), or currently in use, or they used in a former life, and miss that none of those equate to good problem domain fit, dev engagement/challenge/growth, ability to attract talent (i.e., jobs offering Java vs Kotlin vs Scala vs Clojure, will attract different types of people, despite all being JVM languages), etc

Where devs make their error is, if they're junior, likely missing the technical tradeoffs (yes, other tech may be better for X, but it's also worse for Y), and if they're senior, likely missing the organizational ones (i.e., do other teams want to learn it, does devops/QA/etc have to do anything, what's the ramp up time, will the proposed productivity gains offset that, etc)

I think there is value in looking for boring solutions, but I think that's really a secondary type of problem ("how do we do this well?") versus the primary type of problem ("what are we trying to do?").

There are some types of tools (such as React, Rust, or Kubernetes) that are new and fancy, and which may often be unneeded vs a boring tech, but are also actually solving a different problem than their competition might be. Using Rust is genuinely not the same category of work as using C++, for example, and writing React is very different than writing JQuery. That doesn't mean Rust or React is always the right solution, but it's worth considering if a "fancy" tool actually does help you work on the problem you are actually interested in.

Of course, tech that actually makes a big step like that is pretty rare and still has costs. There will almost always be some costs to go with benefits. But matching your solution to your problem well can go a long, long way.

React is the boring tech now.
jQuery is boring. React only a short while ago introduced hooks.
That's when it became boring.
Depends on which part of the world. haha. May be in SF React is boring, but in certain parts of the world, it's still the hottest thing.

Wondering what would be the hottest frontend framework if React is boring?

Rooting for Svelte
To reiterate the point of my comment above: how big is the difference when using Svelte, really? Is it simpler nicer, or does it let you model the problem more closely?

I don’t have enough experience with it to say (though I do like to see it leveraging compiler tech to optimize rendering flows), but I think that is the question to ask. If it’s basically the same model as React, we really don’t lose much by using React, even if Svelte is nicer. If it’s a new model, it may be worth fighting.

> Boring tech tends to be reliable. Things like PHP, Rails, Django, etc.

Django will break backwards compatibility with every new minor version. You'll either spend a lot of time porting your code base, or stick with an old and vulnerable version.

There's a bunch of things you can do to make a choice easier. The most obvious thing you can do is just taking the time you need to make an informed choice. Read the docs, source code, check out known issues, examples, etc. Do you plan to integrate tech X with tech Y? Check if everything you need is supported. Keep notes if it's really overwhelming. You can speed up the process by eliminating choices early if you know your project's hard requirements. If all this doesn't apply to you, e.g. because there are multiple choices that fit your requirements, just pick one and see how it works out for you.

At the end of the day however, you just need to pick something and roll with it. If it turns out not to be the best choice, you'll have at least learned something and the next time you have to choose you'll be better informed.

Don't stress out about it too much. It's a natural part of software development. When you are coding (after selecting all your tools), you are _still making tons of choices_. It's just in a different context; how will you structure your code? What coding paradigm will you apply? What algorithms will you use to solve your problems? You learned to cope with this stress too. It just takes time and experience.

Simple: use what you know best, ignore the rest and concentrate on the business side of your problem. The tech is the least interesting part unless you enjoy looking at blinking lights. It is all virtualized and packaged to the point that you really shouldn't be having any kind of emotional or functional investment in it anyway. Make sure that you have a good grip on your data, that's where the value sits, and that your code is maintainable no matter what stack you use. Ensure it is broken up into chunks small enough that they can be discarded if you feel the need to replace them with something else.
Deciding between a tech that you already know and know will work well for the problem, and a tech you don't know - that's an easy choice.

A harder choice is when you know the tech you known doesn't quite fit. Do you go with what you know, or do you try something new?

Concrete example I'm currently considering: If I want to make a web pages that does some background work, should I use Django and Celery like last time, and spend months tweaking Celery settings I don't understand and still feel like the system's kinda clunky (like last time). Or do I use Elixir where there's little difference between handling a HTTP request and running a background task, and where I can just spin up a few thousand threads to monitor background tasks?

TLDR: What do you do when "what you know best" isn't the right choice?

Webpages that do background work will need something client side, not server side. Javascript + a timer to kick things off periodically should be enough for that.

Unless I'm misunderstanding what you mean by 'background work'.

(comment deleted)
You could research for some altermatives in the same space instead of repoacing the whole stack.

For example, dramatiq and python-rq are simpler to configure and to work with than the helicopter-level-of-complexity that is Celery.

Here are my rules:

* Stick with what you know. I personally know Python best, so if the solution can be achieved in Python, I go with that.

* Avoid fads. I don't use a language until at least two years after I've first heard about it.

* If you've gotten this far in the list, you'll have to learn a new language or brush up on a weak one, so look for one with a strong community and a lot of libraries.

* Old usually means stable. If it's an old language but still in active development, they've probably found most of the worst edge cases by now. Also there is a lot of best practices.

* Everything is a tradeoff. Nothing is the perfect solution, so know where your solution might be deficient (or learn).

* Doing cool tech is cool, but make sure you're solving the business problem (or personal problem) you set out to solve.

I forget where I heard this the first time but it shows up now and then and it's held true for me since the first time I heard it.

If you have a big work/production project, go with what you know, whatever that is. When there's a deadline or someone will lose money with a delay, it's irresponsible to use that project to add another line to your resume or play around with $NEW_TECH.

If you want to learn a new technology, do it on a project where you can afford to throw your hands up at some point and scrap the whole thing, because you very well may end up in that position.

You probably heard that at every successful operation you spoke with. Research and Development are two different activities. Both are lovely. Know which one you are getting paid to do.
> If you want to learn a new technology, do it on a project where you can afford to throw your hands up at some point and scrap the whole thing, because you very well may end up in that position.

Think of it as having two goals for the project: learning $NEW_TECH, and writing a program to do $TASK. Don't use $NEW_TECH unless the goal of learning $NEW_TECH is at least as important (or valuable) as the goal of writing a program to do $TASK.

This implies that you want to experiment with smaller programs. But when you do, recognize that you may not be seeing all the problems and limitations of $NEW_TECH.

Exactly this. I want to play around with kubernetes but I know a big part of it's benefit is for big projects.

I also just haven't gotten around to it yet.

Use frameworks.
Very funny: for me frameworks are like the old saying: you had a problem and you chose X? Now you have two problems. Good framework help, bad frameworks are a disaster..
95% of the time, the best tool for the job is the tool you know best.

If you don't know any tools, pick one and learn it well.

It's quite simple, actually. In most cases, the "inferior choice" comes from decisions other than the stack itself. The stack itself is not as important as long as you select something ubiquitous and mature and has plenty of support i.e. you can find lots of answers when you have to search the internet. Sure, there are cases where you need extreme performance, or a language with good data science libraries. But those requirements just narrow the choices making it easier to decide. Just pick something your team already knows, and/or something you can easily hire people for, and run with it.

The inferior choices you need to worry about are things like poor architectural descisions, or bad coding habits. These are the things that will "bite you later and trigger a rewrite". Not the stack itself.

Do you change a car everytime you see a new one which sounds cooler ? No, you stick with your car as long as it does the job.

This is the exact same in code, start with the language and the tools that you and your team know.

When you start a project, a new feature, a new anything, you should always start with what has worked for you in the past.

Decision fatigue is almost universally the result of executing against an insufficient plan.

A better approach to solve for this problem is to completely ignore, at least for the moment, any idea of decision fatigue and instead focus on developing a solid plan. A good plan will account for risk acceptance, business requirements, a task list, and costs. The most valuable part of a solid plan is not having some magically complete roadmap or blueprint, but that it puts all your challenging decisions up front. It forces you to examine what you are willing to pay in terms of money, time, and effort.

Once you have a well envisioned plan the only consideration of decision fatigue should be limited to maintenance. If a given maintenance effort is too expensive or requires too much investigation or risk then you need to refactor and break things down into more primitive units.

When it comes to running a team there are only two things to consider heading into planning: a defined performance baseline and scope of effort. Those two things are completely in competition and you have to balance them against a budget of available resources. As the team leader be willing to accept input and suggestions from your team, but set the baseline with confidence and don't let the children run the daycare.

1. "Make a plan" is not a solution to decision fatigue, it's how you get to decision fatigue.

2. Calling your team of highly paid professionals children who don't deserve autonomy? Not a winning strategy.

What is the measurable minimum level of autonomy necessary to achieve the greatest result?
> Decision fatigue is almost universally the result of executing against an insufficient plan.

Contrary to the sibling comment, I actually think this explains a lot of my experience. Thanks for pointing it out.

It is all about trade offs, there is no perfect solution.

Here are a few things that I have learned:

# Requirements - List out clear requirements, get an agreement with your co-decision makers, and the necessary people. Make sure you address for at least 2-3 yrs of requirements. It is likely, that new requirements would pop up and your system should be adaptive to this - if you think that your system is not going to address a specific thing, think twice, you may get buy-off & assurance from product, directors. However be prepared mentally that six months down the line, this will change.

# My Dos and Don't (always subject to change :))

- Do keep things simple

- Don't make a career out of a single project.

- Do list tradeoffs in your design

- Do document and perform deep dives.

- Don't ship prototypes.

- Don't be afraid to get critical feedback. If someone gives critical feedback, spend a few days to clearly understand the feedback

- Don't be defensive

- Don't be attached to what you build, it does not represent you.

- Do use new tech in baby steps

- Do experiment - The more you experiment, the more you learn, the more you will fail. Is this something that you have the mindset for? You can also ask how much do you have the time/energy for?

> - Don't be defensive

+1 to this. The very first thing I'd teach computer science students is "You are not your code... ego investment will only cloud your thinking" .

When the compiler says it doesnt work, trust it's not a compiler bug.

When the computer does what it's instructed and it doesnt work, trust it's not a JIT bug or that your code "clearly says to do what you think it does..."

When a coworker suggests an alternate solution, it doesn't mean either of you are a "better" engineer. (These kinds of decisions can only be decided across many variables and many data points).

You don't, you just sort of exist doing what you're doing but always thinking there's a better way of doing things / better tech stack out there. There usually is. But that's just technology for you. You can't be on top of everything all of the time otherwise you'd literally spend all day every day just learning about new technology.

At some point you need to commit. It's like relationships. How do you choose a partner out of billions of options? You browse around, learn what you like and don't like, make judgement calls, play around with some and eventually either make a conscious "this is the one" decision or else make a "we've been together so long, I guess we're a couple now" decision. At some point it becomes formal and you stop actively looking at other options because you're content with the option you chose.