Ask HN: How to get better at higher level thinking?
It&#x27;s a gamble. It&#x27;s always a gamble. What you have to realize is that you are gambling, and consciously think what&#x27;s the probability of payoff vs cost of finding out if you were on the right path. Not everything is a pure loss, sometimes you figure out what should be done differently to make it work.<p>Debugging and designing new stuff is very different. For the latter the most important thing is to split the problem in ways that can be solved with a compact set of well interacting things. This takes a long time to get good at. If someone else does it quickly, they have either have a lot of experience, or very good intuitions. All you can do is ask how they did it and see if you can see the picture they&#x27;re describing.<p>For debugging, sometimes you have a hunch and you&#x27;re free to test it out--just be aware of how much time&#x2F;effort that will take if it doesn&#x27;t work out. You should always have a way of narrowing the problem so that regardless of the outcome of a step you&#x27;re looking at smaller remaining set of possibilities. Imagine all the different things that could <i>possibly</i> (and almost impossibly) contribute to the bug, and rule them out one by one in order of likelihood or reduction of search space.<p>Another good way to solve certain problems more simply is to go outside the current system of thinking. e.g. Instead of doing a complicated computation at runtime, precompute many things and use those at runtime. You don&#x27;t always have to solve a problem as presented, everything in software is very much up for changing, e.g. a not-so-common way is contributing to the opensource software you use in your stack that&#x27;s part of the problem you&#x27;re facing.<p>I think one thing that I do that maybe not everyone does much is, in the back of my mind keep thinking about other possibilities, that I might be wrong, that there may be a better way of doing it than what I&#x27;m doing now. Those thoughts are not negative and they don&#x27;t take energy or motivation away from what I&#x27;m doing, though sometimes one new idea might seem good enough to pause what I&#x27;m doing, try that first, and come back if still not well solved.<p>Sometimes people get on the track of thinking of complex solutions first because it follows a pattern of other complex solutions that have worked in the past. One of the things I always think is, what is the simplest thing that might mostly work. Often a proof-of-concept or prototype of that thing, then lets you refine it an take care of the parts that it didn&#x27;t with not too much complexity. e.g. caching to amortize cost of computations, if a cache can give the right answer X% of the time, then you only have to do the long&#x2F;hard thing 100 - X% of the time which might be good enough. Or you can have a shared cache with part of the computation and only have to do the remaining parts every time for each case.<p>Talk to people about your approach&#x2F;ideas before &quot;spending a few days&quot; on them. Of course you wouldn&#x27;t know that you would end up spending that much time, so the only good way is to always talk about your approach&#x2F;ideas that way some of them can be adjusted before spending too much time. If you can&#x27;t frequently have realtime or semi-realtime Slack chats, write an issue description of your approach and get feedback. Even the exercise of writing can clarify your own thinking in your mind. Try to write concisely instead of stream-of-consciousness storytelling.<p>Other than practice and experience over time, realize that different people gravitate to different aspects of software development&#x2F;engineering. Use your strengths, work on some of areas where you can improve but don&#x27;t get hung up on any single area that some others seem to do well in that you haven&#x27;t. You&#x27;re not going to be <i>as good or better at everything</i> even with time&#x2F;effort.