Ask HN: How do you approach a problem you are not sure has a solution?

364 points by peteradio ↗ HN
How do you battle against (self-inflicted) anxiety/paralysis when you are attempting to tackle a problem you are not sure has a solution? I have a very open mind to solving problems but it can make it difficult to come to conclusions. Anyone know what I'm talking about here? Have any advice?

299 comments

[ 2.7 ms ] story [ 317 ms ] thread
I know exactly what you're talking about I think. My problems are solved by code such that code will have something to do with the approach. With that in mind I tend to write lots of little one off programs to test a particular idea or see if a particular phenomenon exists in a set for example. In building these I'll version them in the filename ( XXX_Test_V1.sh ) such that I can compare runs and later maybe chain some runs together.

The point here is just to get moving in some direction, get familiar with your data and start testing some assumptions. I learned a lot about my problem from doing this and eventually came up with some testable theory.

Forget architecture, "elegant code", time complexity, "does it scale" etc - just write things that give you answers or allow you to gain some insight and do so with the minimum of effort spent on design. If you ever find yourself onto something you can refactor then. For me the main thing is to get the learning process started.

Divide and conquer.

Break the problem up into pieces and solve the pieces.

And if you think it's atomized enough, yet you still have problems then it's not atomized enough. You might have to get deep into first premises and axiom-land.
Wow, I can’t believe this is at the bottom of the comments. This is exactly the approach regardless of whether the problem is at work or at home.

Problems: Analyze, break down, examine from all angles and add details. Then try solving.

I spent my career trying to teach this exact concept to my engineering teams. I agree with you 100%.

I focus more on the outcome I would be okay with and my progression towards it over the problem. As I learn more, I can get a better sense of what the outcome should be.

If I'm approaching the problem first and not the solution, I try to classify if the problem is technical or organizational. If it's technical, I try to identify each of the barriers, and search endlessly for something that looks like it would get me a little further along in getting insight into how to solve the problem. It its organizational, I look at how I would restructure how I am approaching the problem or work or communicate with others in solving the problem.

Sometimes, I need to redefine the problem, scope of the problem, or what a successful outcome looks like. For example, I wanted to find a way to verify that the reports I was entering in PDF forms were being filled out properly. I spent forever trying to find a tool or program the PDF form to be verified. After a while (several months), I realized that verifying a spreadsheet would be a lot easier, and that I could generate the same report from the spreadsheet. Once that perception changed, I was able to tackle the problem I had: not being able to ensure that a procedure was filled out properly.

I focus on the process.

Same as for problems I am certain have solutions.

For me, it's all about the work, not the fruit.

But the caveat, I focus on projects that are going to bear fruit because most problems that might bear fruit probably won't and I'd rather be productive than important.

YMMV and that's aOK.

i feel like this is just the research process. My solution is to just try something that seems relevant. Soon you will realise it may not work because X. but maybe Y will work. Then you keep going, learning more about the area, the data, whatever. Stop when it works, or you have convinced yourself it wont. This is one of the reasons I think research code is always so trash, rarely did the researchers know where it was going to go at the start. And thats ok. Refactoring for production only happens well into the future.

my advice is to do something without worrying that it might not be the right thing.

Change the way you perceive the problem, see the solution as the opposite of the problem.
(comment deleted)
It would help quite a bit if you were able to give a good example.

Lots of good tactics here, but ultimately I think everything boils down to understand the problem better.

Your solution will only come from superior understanding of the problem, if there is one. It probably won't come from testing different solutions.

Almost all software starts with "what is the intput and what is the output" and then understanding how the input leads to the output. If you don't know the input and the output to your system, then you don't have understanding.

Even in your text, you have a "solution" based frame to your statement. Subordinating the problem to the solution rather than the solution to the problem puts so much focus on the solution that the problem itself gets defined in terms of the solution. I have seen feature developers play this out time and time and time again. When the problem gets redefined in terms of the solution, often the original problem remains resulting in increased complexity at little additional value.

So I would start by understanding that not being sure a problem has a solution means you don't understand the problem and its context enough to even be asking if it has a solution which means you should be asking "how do you better understand problems?" or "when do you stop investing in understanding problems?" or "what is a good time trade off between 'understanding problems' and 'directly handling business concerns'"?

When you understand the problem, you'll probably come to the realization that you were asking the wrong question altogether. There are so many times someone came to me with a problem with a system I understood that they did not and it was clear they were asking the wrong question. Frequently, I could tell them what question they were trying to ask because I knew things they didn't know they didn't know.

You may find Bloom's taxonomy interesting as a frame for thinking about how to achieve better understanding: https://en.wikipedia.org/wiki/Bloom%27s_taxonomy

Flip it around: the only really interesting problems to work on are the ones where you don't know if there is a solution.

Minimise work on problems with an obvious solution and identify working on the ones that are more mysterious as the most valuable work there is to do. Make a habit of extracting the most from the process, even if it didn't end up in a solution. For example: writing down (and sharing with others) what was learned.

Psychologically, you need enough repeated positive reinforcement, where you work on a problem, end up not solving it, extract the most learning, get recognition from yourself and from others that it was worth the effort. After enough itterations it starts feeling better.

It's easy: Expect failure. That doesn't mean you stop. It means you stop worrying about success and just play around with the problem. Poke at it from as many different directions as you can, and keep note of what does not work. Eventually you'll either stumble onto a solution or prove that it is in fact impossible, and your experiments were a success.
This. Keep probing until you’re able to form hypotheses, and keep testing those. Worst case you learn; best case, with each experiment you change something for the better.

One thing I would add is the perspectives and ideally the participation of other people. Absolutely essential if the challenge has any kind of social dimension.

"Expect failure" sounds very motto-y. In Latin, so you can use it for your coat of arms, would be: expecto defectum. I suppose one could even operationalize it further: deploy failure, displicare defectum.
Don't aim for the perfect/absolute solution. Sometimes a solution that solves a chunk of the problem (big or small) is just enough. Try to break the problem down, see where you can start, where you are going to need help and what will be for later.
When the solution is blocked by the diagnosis of the problem, and there is no methodology or algorithm for the diagnosis, I usually resort to a sort of "grid-search", i.e. brute force through the problem space. I once had a weird off-by-one pointer problem in circular buffer in a C++ multi-threaded environment (it was almost 20 years ago), and I had to systematically eliminate code block by code block as possible origin, until I got to a block small enough for me to throw my entire intellect at. I solved it.

I once explained this to an audience using a riddle: "How far can you walk into a forest?" That type of riddle has no method or algorithm for solution. The answer usually "comes to you" or doesn't. But knowing that riddles depend on a play on words or different meanings of words in different contexts, I suggested that one can analyse each word at a time: e.g. "you vs. someone else?", "walk vs. some other way of moving?", "into vs. out of?", "why specifically a forest?" etc. The answer, of course, comes from "into vs. out of" -- you can only walk into a forest till the mid point. After that you're walking out. Not an ideal example, but I always remember it when I'm faced with an intractable problem.

The method also helps stay motivated because there's a sense of progress: you're racking up a count of things that are definitely not the cause of the problem.

Great explanation of divide and conquer for any situation. Thanks!
Every problem has a solution, otherwise it would not be a problem. If you get stuck, reframe the problem. Ask yourself why, what, where, whom.. in other words, figure out the true nature of the problem and why it exists. Is it really a problem or did your expectations for the result changed? There is no single answer here but keep asking questions and you will figure it out eventually.
Many problems provably don't have a solution. OP didn't specify a problem domain but in both maths and computing the possibility that what you are trying to achieve is mathematically impossible is a real one, and distinguishing the absence of a solution from your own lack of ability to find the solution that does exist is a real challenge with no easy answer.
Real-life problems always have a solution, but sometimes it isn't a technical one. Or a technical solutions exist, but is too expensive. To take your math example, e(x) = 0 have no solution, but in real life, taking x = -100 could be close enough for your purpose.
We lost the secret key for this bitcoin in the incinerator, can we get the key back?

That problem has neither a theoretical nor a practical solution.

There is a human one though: accept the loss and add processes to not repeat the mistake.

That what I was talking about in my first sentence, but my post wasn't clear, I admit. Thank you, it helped me clarify.

In real life problems often have multiple solutions and we don't like some of them, possibly the simplest ones. This is much like exceedingly expensive solutions to technical problems. In my experience customers faced with a costly solution reframe their problem and accept to do their business a different way. Their customers won't notice.
It's not clear that _every_ problem has a solution.

NP=P? There are many other famous math problems. No one found solutions yet and it is also unclear whether one is able to find a solution. And it's unclear if there is even a solution.

I stare at the problem for hours until it's suddenly dark outside, then if necessary I repeat the following day and the next until I see a solution. I mean this in a quite literal way, and it's in no way not meant as a joke answer.

Surprisingly often this method works.

When I have an open-ended problem without an obvious solution, I often start by systematically questioning all of my assumptions. Why do I believe something is true? We often smuggle in beliefs about the problem that are of questionable provenance or are not actually true on careful inspection.

I find that this kind of first principles approach gives me a much better understanding of the nature of the problem. I may still not know how to solve it but it usually gives me insight into how to attack it most effectively.

I reference the 'Cutting the Gordian Knot' section in the Pragmatic Programmer[0] when dealing with tough problems.

Cutting the Gordian Knot [1] When solving impossible problems, ask yourself:

* Is there an easier way?

* Am I solving the right problem?

* Why is this a problem?

* What makes it hard?

* Do I have to do it this way?

* Does it have to be done at all?

[0] - https://en.wikipedia.org/wiki/The_Pragmatic_Programmer

[1] - https://github.com/HugoMatilla/The-Pragmatic-Programmer#cutt...

I just let it roll around in the back of my mind for a few days or even weeks. Eventually some new perspective will present it's self. Something will unlock it.
That doesn’t work very well when you’re an employee and the project manager asks: “when it will be finished?”
This might sound like an easy out but I consider that there is a choice of doing nothing. Sunsetting a problem can be as simple as forgetting it exists in the first place. This is not merely "giving up" but rather deciding the best action take at the moment is do actively do nothing about the problem.

Over the past few years when I have had problems that pop up or what really happens is that I go looking for problems, the most often solution has been to literally do nothing.

And having that as an active option when I first start looking at the problem and listing solutions ends up having far more options to me for the problem than if I was like "I MUST SOLVE THIS".

It could also mean "wait" is the best possible action I can take now. And instead of being perturbed by waiting it is an active decision to wait.

I've observed this as well. It's very satisfying to finally realize you don't need to solve it in the first place, because your assumptions created a problem where there was none.

E.g. mulling for weeks over optimizing some code until you realize to measure it as-is and it isn't even slow!

Or maybe there's room in the underlying design to shift the weight off the problem, thus "solving" it laterally (by solving some other, easier, problem instead).

In such cases I've seen (and used) a saying in french that goes:

> Il est urgent d'attendre

which loosely translates to:

> waiting is of utmost urgency

The french quote can be traced to a translation of Asimov's Foundation, but I can't seem to find the original version :/

> The french quote can be traced to a translation of Asimov's Foundation

It's actually much older than that, I read it already in 19th century books; no idea when it first came out.

That's about what I recall as well (18~19th) but could not find a definitive source older than Asimov with my time-limited search
> It could also mean "wait" is the best possible action I can take now. And instead of being perturbed by waiting it is an active decision to wait.

As an example: I worked on a PhD in applying machine learning to certain tasks in programming and mathematics. I ended up burning-out and had to quit.

When I started in 2014, most cutting-edge ML research was on image processing like convolutional neural networks. That's a very bad fit for the sorts of tree-structures and text sequences I wanted to use. The state of the art for the latter were RNNs which are notoriously slow (hard to parallelise), suffer exploding/vanishing gradients (needing e.g. LSTM), etc.

Transformers and LLMs solve the issues I was facing; so in hindsight it would have been better to wait a few years (I believe the Attention Is All You Need paper came out in 2017?)

Talking to others about the problem and or the situation will help both in a rubberducky way and as the saying goes a problem shared is a problem halved.
The simple way to solve the problem, of course, is to not know it's unsolvable. Then work at it, tirelessly, until you come up with the solution.

The story from math is that of a student who fell asleep and was late going to his final. He walks in, sees three problems on the blackboard, and works frantically to solve them in the time he has left. Valiantly, he manages to solve all three, turns it in, and just hopes for a passing grade.

Later he gets a call from the professor who asks "do you know what you did?" The student's heart drops, thinking he's failed miserably. The professor continues: "You were only supposed to do the first two problems," the professor explained. "That last one was an example of an equation that mathematicians since Einstein have been trying to solve without success. I discussed it with the class before starting the test. And you just solved it!"

Note that this story is actually (approximately) true! George Dantzig, a UC Berkeley PhD candidate at the time, solved an unsolved problem in math as homework, and the plot was later used in Good Will Hunting. Dantzig was later awarded National Medal of Science by President Gerald Ford.

https://www.snopes.com/fact-check/the-unsolvable-math-proble...

The best part of that story is this quote from Dantzig himself, IMO:

> A year later, when I began to worry about a thesis topic, Neyman just shrugged and told me to wrap the two problems in a binder and he would accept them as my thesis.

The "two problems" being referenced here are, of course, the two unsolved problems he solved as homework.

This is quite common in scientific research. The typical algorithm I follow is to reframe the problem in the language of different fields and see whether there is a more useful way of tackling it in that framework. There are always some leaks in the abstraction/translation but often by reframing the problem you find a good-enough solution.
A thing I've often fantasized about is some sort of mega-conference where top luminaries from every academic field get together and hammer out a global namespace of jargon, resolving all collisions so that no longer can a term mean eight different things in eight different fields.

Imagine the global boost in productivity and knowledge-sharing...

I fantasize about this sometimes for scientific purposes. Part of the challenge is how to keep the barrier to entry low enough that people stay excited and creative, because the opposite is the world of regulated industries where your way of thinking is heavily influenced by the legal framework. Periodic synchronization helps and the best I have seen in person at the Gordon Research Conferences (GRC) since these tend to be narrow enough to have consensus but still broad enough to get a little bit of perspective
I think you don't provide enough information for anybody to give you good advice.

That being said: Consider that sometimes there are problems where you yourself will be unable to judge the problem you're in, because you are in it. It can be a bit of a bootstrapping problem: If you were the person who could see the solution, you might not have ended up in the situation in the first place. So the logical solution can be to get outside help so advice by a trusted person or actual therapy.

Getting out of a hole can sometimes be done by clawing yourself out, but sometimes having someone throw you a rope is the smarter move.

I continue as if there is a solution, but when I see an avenue suggesting it doesn't have a solution, I try to take that. Generally the info from trying to show the problem is unsolvable will help understand the problem better anyway.
I feel an obvious solution many are missing is simply to ask your colleagues for help. They can either listen to your rambling or they can offer answers when ones you've thought of before or novel strange ones you had dismissed but bear rethinking. If your paralysis is due to you working alone, then your open mindedness should make your amenable to asking for help.
I can attest to this. Fresh inputs are often the only way to get out of a mental feedback loop.