6 mental models for efficient software development

Some things keep popping back over and over agin.

Reuse whenever you can.

If you first face a problem first google it. Never write a single line of code. Try to understand it deeply. Then google the shit out of it. Look for stackoverflow answers. Look for libraries that already do what you need. Find pieces of code that do what you want. Be an efficient hacker. Use solutions of other people. Only write code when you have no other choice. BUT, always understand what you are adding to the codebase.

Work to shorten the feedback loop.

Often times we need to solve a problem via trial and error. Time between making a change and seeing results cannot be too long. If it takes 10 minutes each time something is wrong. You either have architectural problem or a wrong approach. E.g. you push fixes to CI pipeline. It takes a lot of time to see if your changes are making a difference. Maybe you can reproduce it locally for instant feedback? Shortening the feedback loop here is critical. It means more focused work on solving the actual problem rather than just waiting.

If the problem is too hard, come back the next day.

Consistency is key to solving hard problems. Keep working on it. It will slowly evolve in your head over the weeks and solutions will become more obvious. It's a cliche, but don't give up and it gets easier. Read the same material again and you will find new insight. Come back to the problem after a week. Your understanding will be much more clear now.

Learn the tool to be productive, rarely master it.

You can always google the details. Or read the docs. Those days there are plenty of tools out there. We cannot learn them all. Our energy and time are precious.
It would be fullish to spend them all on a tool that will be irrelevant in few years. And, we have no idea which ones will stay relevant. Learning to the level of being productive and looking up the details is a good strategy.

Learn one tool for one problem.

Don't learn ten technologies that ultimately tackle one problem. Don't learn apache, ngnix, lighttpd and caddy. Pick one webserver technology and stick with it. Don't learn rubby on rails, laravel, nodejs and django. Don't learn ten different libraries to achieve one goal.
Stick to one thing. You will be much more efficient in providing business value and actually delivering solutions. 5% or 10% improvement is rarely worth the switch.

If the problem is complex, research different approaches. It pays off.

Working hard is great. But on a wrong thing, not so much. You won't make much difference. Pick the wrong approach and it will make or break your project. It might mean solving the problem in months vs. just days. It's that critical. I once spent two weeks implementing a solution to a hobby project and ultimately gave up. I came back year later. Turns out it could be solved in few hours using different library. It's THAT critical. Before embarking on a week long or a month long project, research a lot. Be wary when picking your library or framework. Find ALL possible options. Search queries in Google won't show you everything you need to know. Using other phrasing might help a bit. Ask your peers. Or wait a week or two and come back. Look for new approaches to the problem even if it might take more time.

This is part personal philosophy, part self-observation. Feel free to disagree.