How to do hard things
drmaciver.com
drmaciver.com
The advice to break a hard problem down into simpler pieces good, but I feel like that is often difficult without proper domain knowledge. In many cases, knowing how to break apart a problem like that is how you become an expert in the first place. If you want to learn a musical instrument, there are plenty of good simple excercises to start with, but only an expert can tell you what they are, you can’t easily intuit them from scratch. An experienced programmer will know how to break down a difficult project into small and simpler pieces, that ability is part of what makes them an expert. “Find a good teacher” and “put in the work” seem like rather banal pieces of advice, but it’s a system that has consistently worked throughout the ages. If you are truly breaking new ground then you should already have a framework and significant experience to guide your exploration.
Put simply, one group put all of its energy into producing just one, and the other group just turned out pot after pot after pot.
At the end, so the story goes, the group that cranked out pots like crazy ended up producing pots of higher quality.
In my own life, I can often find out the thing that I'm afraid of learning because I've set it up like that first cohort: making the one perfect thing, instead of putting it out there and iterating on it or making another based on what I learned. Goes with learning languages (I'd do way better if I simply tried speaking every day, but I wait for perfect opportunities).
That anecdote gives me lots of hope. I hope it's accurate! :)
If you just write a huge amount of code rather than examining what's good or bad about code you wrote, you'd probably end up writing the same bad code over and over again. Seeing where improvements can be made is sometimes really not obvious and can feel like you're going backwards. For example, learning where functional programming applies instead of writing a class for everything. You need to be able to understand why something is better for simple repetition to work.
Don’t worry about the details; it was just a made-up story in the book Art & Fear; I have never seen any evidence such a pottery class ever existed. https://kk.org/cooltools/art-fear/
> The ceramics teacher announced on opening day that he was dividing the class into two groups. All those on the left side of the studio, he said, would be graded solely on the quantity of work they produced, all those on the right solely on its quality. His procedure was simple: on the final day of class he would bring in his bathroom scales and weigh the work of the "quantity" group: fifty pound of pots rated an "A", forty pounds a "B", and so on. Those being graded on "quality", however, needed to produce only one pot -albeit a perfect one - to get an "A". Well, came grading time and a curious fact emerged: the works of highest quality were all produced by the group being graded for quantity. It seems that while the "quantity" group was busily churning out piles of work - and learning from their mistakes - the "quality" group had sat theorizing about perfection, and in the end had little more to show for their efforts than grandiose theories and a pile of dead clay.
Part of what stuck out to me, though, was that the anecdote aligned with my personal experiences of things that were once difficult until I ended up having to do them everyday for one reason or another.
But you're right, that's still a far way off from there being some actual study or otherwise repeatable exercise to show this in a clinical setting for learning new skills.
[1] https://www.ted.com/talks/tom_wujec_build_a_tower?language=e...
And anyway the pottery principle is not really sound either - I can suppose that the group tasked with producing a pot a day produces a better pot at the end than the group that was given a long time, but let us assume pot-makers both extremely skilled - one is tasked with making a pot a day for 30 days, the other making a pot in 30 days - which pot under those conditions will be better? The pottery principle is only interesting in explaining how to build a skill, but does not have anything to say about what to expect from those who have already mastered a skill.
You can make the same very bad $creative_product every day indefinitely without improving at all.
Which is why there has to be at least some assessment and feedback. That's the big benefit of having a teacher, mentor, and/or the feedback of peers, customers, or an audience.
If you have a mediocre talent they'll steer you towards making the most of it. If you have exceptional talent their feedback may be wrong or misleading, but it should at least make you think more deeply about your relationship with what you're doing.
You can't assess your own work realistically unless you have something to compare it with, and the critical skills to understand which features matter.
There have of course been studies on goal setting and achievement (one of which is mentioned in the above pdf) but while they show an effect, they don't show the spectacular results of the made up study.
James Clear reached out to the authors of Art& Fear and this is his footnote: (Link:https://jamesclear.com/repetitions)
This story comes from page 29 of Art & Fear by David Bayles and Ted Orland. In an email conversation with Orland on October 18, 2016, he explained the origins of the story. “Yes, the ‘ceramics story’ in ‘Art & Fear’ is indeed true, allowing for some literary license in the retelling. Its real-world origin was as a gambit employed by photographer Jerry Uelsmann to motivate his Beginning Photography students at the University of Florida. As retold in ‘Art & Fear’ it faithfully captures the scene as Jerry told it to me—except I replaced photography with ceramics as the medium being explored. Admittedly, it would’ve been easier to retain photography as the art medium being discussed, but David Bayles (co-author) & I are both photographers ourselves, and at the time we were consciously trying to broaden the range of media being referenced in the text. The intriguing thing to me is that it hardly matters what art form was invoked—the moral of the story appears to hold equally true straight across the whole art spectrum (and even outside the arts, for that matter).” Later in that same email, Orland said, “You have our permission to reprint the any or all of the ‘ceramics’ passage in your forthcoming book.” In the end, I settled on publishing an adapted version, which combines their telling of the ceramics story with facts from the original source of Uelsmann’s photography students. David Bayles and Ted Orland, Art & Fear: Observations on the Perils (and Rewards) of Artmaking (Santa Cruz, CA: Image Continuum Press, 1993), 29.
I've found that using digital to gather new skills is terrific, but yet I find some of the work I am most satisfied with is analog; I believe it is mostly down to my own lack of self discipline - when shooting digital, exposures are free and hence I shoot lots and lots.
When out with my Texas Leica (A Fuji G690BL, a 6*9 rangefinder), getting eight exposures to the roll, I take those extra couple of moments to ensure I get it all right.
There might be situations where’d you want to continually churn out pots. In other situations, pressure is really high, and you have one shot to get it right.
Both strategies depend on the context. If anything, the best approach is to figure out which strategy is needed for the given situation. I would imagine, strategy of churning out pots is the most common one.
But safety critical systems certainly need that pot to be right the first time otherwise people die.
Depending on your time constraints, the tips given here seem to apply particularly well: find proxy problems that allows you to learn without as much hardship would be a good idea, as well as the other strategies of breaking it down, etc.
Sometimes time is not on your side though, and you have to get it right without time to practice on proxy problems (at least I believe this can occur).
Then you can use what I call it the 'Kitchen sink' approach: grab a bunch of tools, a bunch of approaches and start digesting your problem through as many viewpoints as possible. If your problem has safety implications and you can verify it, then well enough. Otherwise you make an attempt if you are sufficiently confident in your solution; and take some kind of NOP otherwise (if a guaranteed 0-return NOP even exists).
Also, if you're solving something while time constrained, you may need to reflect afterwards if you could have either prevented the time constraint or prepared better somehow.
In general though, there's hope in the sense that if something is verifiable or approximately-verifiable you can approach good solutions with time. At least I have high hopes of always finding a solution given enough time (i.e. "You're not good enough" does not exist).
That's only not applicable if your time is finite or in the same vein you need to improve a skill to apply a series of finite-time decisions. Eh who cares about finite time anyway? :P
(Yes, in reality everything is limited but there are plenty of tasks you can take your time with...)
Breaking down problems is obvious and known advice, but very helpful, especially when you are lost in the weeds, can't see the forest for the trees, etc. Having it as "a system" helps self-management. Disagree about the importance of touch-typing.
Grammar snark (for an article about writing): "Sometimes it will be obvious what you need to improve, sometimes it won’t. When it doesn’t, ..."
when it doesn't obvious to you
No, you don't always have that choice.
What you do is you break it up, best you can, then try to build each part. If that doesn't work, you break it up differently.
Funny, I had this notion that experts are most of the time better at avoiding deadends. Subtlety and patience. Noobs are impatient and depth first and lose hope.
In high school, smart students can often get away with not studying. In university, your attitude and mindset towards failure and learning becomes much more important.
In high school I rarely opened the textbook and did fine. I ended up on academic probation my first semester in college because I had no idea how to study (or even that I had to study). While it was a rough first year, it was definitely needed.
Professors were also good at teaching, which reduced the need to study at home even further.
It hurt me in the long run - i am really bad at putting in effort unless something catches my attention(thankfully programming can totally absorb me), and i quite frequently 'wait for the spark'(walking helps with that a lot).
Nature plays the same game, I believe.
In addition to mastering the field of study that interests us, mastering our own minds may help us get better results.
* Ignore whole craze toward being cool, participating in random competitions, chasing opposite sex
* Keep detailed notes of your days, who did you meet, what did you learned?
* Don't worry too much about acquiring every possible new skills that you come across
* The most important part of the textbook is exercises and that's not because there would be tests. If you really want to learn something, you need to do exercises!
* Write down import concepts you learned, new insights you developed. The process of writing down to explain to someone or yourself improves learning by an order of magnitude.
* Avoid depth-first search. Not every chapter, every book, every subject must be learned in all its gory details.
* Most textbooks are written by people who have little passion for that subject and they just want to show off their expertise. If you think you are wasting time, dump that textbook sooner than later.
Part of this entitlement stemmed from a (now eroded by bitter experience) belief that I'm somehow a faster learner than normal, that _I_ don't have to do the work.
For example, about seven years ago I wanted to learn Calc I-III on my own. I went down the usual, lazy, intellectually-entitled route of watching lectures and YouTube videos online without doing a single exercise.
A year later, guess what? I couldn't remember jack-shit. Moreover, I couldn't solve problems, which is basically the reason I was learning math anyway. Any bystander could have predicted this outcome, but I was blinded by my own entitlement.
Now, after being humbled (here and elsewhere, e.g. in learning to play music by ear), I realize that there's honor, even long-term efficiencies in following every step the great teachers of the past have laid out, in moving slowly albeit with rigor and confidence.
I resumed my math study with Geometry 101, the absolute basics, using a book of 5000 (short) exercises. It probably took me three times as long as Calc I-III lectures combined. But I realized something — I found more joy in doing the exercises, in doing things the _right_ way, than I ever had in watching lectures.
Preview: https://books.google.de/books/about/Geometry.html?id=u5o6DwA...
You can purchase a complete solution manual separately, which is very handy.
I think it's also important to remember it is rarely effortless to others. You just don't see the effort. I was fortunate enough to hang out with some people in college who were valedictorians at their high schools, and would generally be considered smart. They ended up graduating college with 4.0s. Since I hung out with them all the time, I got to see just how much they worked at it. They took amazing notes, and studied all the time. We didn't have a name for it then, but they essentially did the Pomodoro technique to pull all nighters studying for big exams.
Seeing them definitely helped me realize that getting through hard problems is work, and requires time. Thinking time, studying time, and practicing time. Do some things come easier to some people? Sure, but almost everyone has to put in the work at some point.
As an aside, not understanding how much work goes into something is common in sports. People see Michael Jordan hit the final shot or Tiger Woods hit an amazing shot out of a bunker, but do not realize they have probably practiced that shot hundreds if not thousands of times.
My favorite part of skate videos growing up was at the end when they showed all the wipeouts and crashes. They hurt to watch, so much, but they always drove home the fact that it took a lot of painful and frustrating failures before the guy landed that really smooth 35 stair grind.
The point it, things often seem effortless to others but that's just cause you're not really seeing the effort being put in.
I always return to this [0] diagram when thinking about learning. Am I taking shortcuts that'll actually stunt my ability to progress further in my development. The "Expert Beginner" is a dead-end development wise - it might be a perfectly reasonable place to end up, but not the right way to expertise.
The movie Goodwill Hunting has a scene that describes this [0].
I'm a third year university student; I did all the exercises set last year to do well in the exam and over the course of the whole year. And now, only one year later, I can't remember how to do some of the most fundamental problems. I can remember the derivative and integral of trig functions, but the method of doing even moderately challenging exercises with them I don't remember well and I'd need to look it up. I don't know what that signifies, but I have the impression that even just doing the exercises doesn't last long unless you use what you have learned semi-regularly at the least.
For me personally, there does seem to be a tipping point where what I learned really sticks in my brain and degrades much slower. However, I can't seem to pinpoint where that point happens or if it is even consistent. There are some coding concepts I never forget, and some that seem to leave me within a month.
https://en.wikipedia.org/wiki/Spaced_repetition
https://eric.ed.gov/?id=ED427772
https://www.theguardian.com/education/2016/jan/23/spaced-rep...
* When creating great work as an expert, you will be working down the ladder of abstraction (e.g. for writing–coming up with a concise high-level vision and then progressively expanding it down to the level of characters on a page)–this is the most efficient way to make anything, since you can sanity check your work at higher levels to avoid expensive rewrites at lower levels. However, when learning, you should learn subskills in the exact inverse order (start from the lowest level–how to type keys–then work upwards). Mastering subskills in this order maximizes the feedback signal you get while learning–if you can't write a paragraph coherently, it is very difficult to determine how well you're doing at developing your authorial voice (or whatever).
* Time spent practicing a skill only makes you faster / more robust at the method you already know; it doesn't lead you to improve your methods. So spend half your time actually performing the skill, and half the time analyzing your work / comparing to known good examples / planning how to improve (and, really, half of that time should be for improving your tools for analysis and comparison...). If you fail to do this kind of meta-work, 10000 hours of practice or whatever will just get you a fast, robust system for producing garbage.
* Assuming you're following an intelligent process for learning the skill (see previous points), the most likely way in which you will fail to learn it is by getting disinterested or discouraged and giving up. It's essential that you try and structure your learning process in a way that yields intermediate feedback and some satisfaction for improvement, and pay attention to both 1) reducing the parts of the process you dislike and 2) figuring out ways to make it enjoyable (including figuring out how successful other people have managed to derive enjoyment from the activity).
What seemed to work great is I tape-recorded myself playing and singing the initial version of the song. Then I played it and sang on top of it, even doing multi-tracking sometimes.
I found it was easy to come up with new words and new adjustments to the melody while singing on top of an existing version. Why? Perhaps because I didn't need to spend energy trying to remember both the old version and the new version. The tape-recorder remembered the old version, so I was not afraid of losing it.
1) Research what skills I'll need to develop. At my current stage of learning I don't know what I don't know.
2) Figure out a path to start developing skills. This might be writing a small story every single day while also reading books/guides on how to develop as a writer. I'm still writing daily.
3) As I'm becoming mor comfortable writing anything I now need to develop skills on writing specific things. How do I flesh out a character, how do I describe settings, etc. I'm still writing daily.
4) Once I've figured out individual building blocks I'd then teach myself how to construct them together. What elements do stories contain? How do I flow between small sections to weave a larger tale? I'm still writing daily.
I'm sure as I become a more knowledgeable and skilled writer I'd identify other areas I need to work on, skills to develop, etc. It all comes down to identify small blocks and build from there.
You might be able to bootstrap off of wikipedia content.
The thought that provoked this in my own head was the observation that Wikipedia is virtually useless for learning anything mathematical because so many of the links on any given article head "up", rather than "down", and a casual user can't figure out which is which.
Is it because we are confident? Or because we lack sedulity? Or because our analysis was incomplete?
Is the surprise time consuming because we want/expect it to be easy? Or because we are focused on a different problem really. Or because our focus was interrupted.
good word!
(2) The second ·was· to divide each of the difficulties I examined into as many parts as possible and as might be required in order to resolve them better. (3) The third ·was· to direct my thoughts in an orderly manner, by •starting with the simplest and most easily known objects in order to move up gradually to knowledge of the most complex, and •by stipulating some order even among objects that have no natural order of precedence. (4) And the last ·was· to make all my enumerations so complete, and my reviews so comprehensive, that I could be sure that I hadn’t overlooked anything.
http://www.earlymoderntexts.com/assets/pdfs/descartes1637.pd...
It forces you to learn recursion since for most of the book it only uses pure functional programming with no mutation, so the only way to do loops is with recursion. Overall I would say it gave me a strong base to understand not just recursion but functional programming which has helped me pick up new languages more easily during my career.
Also I used Clojure instead of scheme to do the exercises. It's a wonderful modern lisp that works on JVM and can land you a job. The examples usually work with minor modifications and I would say it's worth it to learn.
I had two A-level maths teachers at school. One always started by getting the class to do a simple as possible example like the above before launching into more complicated stuff, the other started off explaining complex stuff. The first approach worked far better, with the second our minds just kind of glazed over.
There's something a little counter intuitive about it like your neurones have to wire up on the simple example before getting the more complex. Doing the simple stuff then sleeping on it and doing the complex the next day works better still I think.
If you imagine your code as a sequence of instructions, recursion is basically a `JMP` to the start of the stack again, normally with different values.
Once a condition is met, instead of jumping back to the start, it returns something. That condition then repeats itself inside all the repetitions eventually returning the value to the original caller.
# imagine we're recursing to subtract to zero
1. call function subtract with 10 (set x = 10)
2. subtract x by 1
3. if zero, return 0
4. else return the result of calling the function with x-1 (jump to 2)
Once I realized deep down at the CPU level it's all a sequence of instructions, recursion is nothing but moving the pointer. With higher level languages there's a bit more involved, but the gist is the same.1) There is always an exit condition ( or it would run forever , we never want that)
2) There is always a value that changes and it is passed to the next execution, or otherwise it wouldn't make sense it would be always the same execution and the exit condition would never trigger.
3) Think like frames of a movie, in paper o whiteboard, write a table with a column for every variable and a row for every step, my first programming teacher taught me this, and 19 years later it save me in a white board interview, it helps to calm down and just go step by step seeing how values evolve.
So these 3 together, allow you to think in how the values change in every step, and how to get to the point that the exit condition is meet.
Hope it helps! good luck!
I didn’t realize that it was a threshold moment, and I didn’t even know if it was syntactically legal or allowed for a function to call itself (I had no formal CS training) but I remember struggling with the “how much should these child elements be indented” problem and eventually trying it and it worked; it was quite a rush for 14-year-old me.
Maybe try implementing something simple and straightforward that uses it, like a web front end that displays a directed graph of nested comments/message replies?
Notice there are 2 types of parts:
- A leaf, which is the end (has no children)
- A branch, which may have leaves or more branches (has children)... and because a branch can have more branches, this is recursion, so we abstract to a 3rd type of part:
- A node, which could be a branch or a leaf...
Imagine if you were blind and had to feel your hand up the stem, and when you reach a node, you'd move your hand up the node to check 'is this a leaf, or a branch'
If it's a leaf, you mark it; but if it's a branch, you move your hand along the branch and do the same check for the next nodes 'is this a leaf, or a branch'... function int getNumLeaves(Node node):
foreach childNode in node:
if childNode.IsLeaf(): leafCount++
else: return getNumLeaves(childNode) // NOT a leaf -> check this branch's children
print getNumLeaves(tree.stem); // (start with the outermost 'node')
The pseudocode above could have errors, but it's simple enough to get started for understanding;)The 'reality' is the top level context.
You dive down to level 2 context by falling asleep; that would be the recursive function call.
In that dream, fall asleep and enter level 3 context. You are now recusrsively falling asleep.
In the movie, the characters wait for a signal to wake up and going one level up. This is the 'stopping condition' of a recursive call.
You can also see that as Matryoshka dolls.
Regarding the 'Inception' movie that's funny, because it popularized the '-ception' suffix to describe a recursive phenomenon [1]
[0] https://www.imdb.com/title/tt1375666/ [1] https://en.wikipedia.org/wiki/Inception#In_popular_culture
Also, if the algorithm is not tail recursive, you may be missing that there is an implicit call stack where intermediary results are pushed to.
In recursion, you have 3 main components: -A function that performs the same action a repeated number of times, except for when you meet a base case (end of the recursion) -A value that must be tracked and modified in order to perform the said action n times, and know when to stop doing it -A base case that stops the repeating action, and usually performs another 1 time action.
In our example, our components are: - Function <undress to take a shower> that performs the repeated action of taking a piece of cloth off. - Value tracked, which is the <number of pieces of cloth you have left to get naked>, and on each iteration or call of the function will be reduced by 1 (asuming you're taking 1 piece at a time). - Base case, which would be <when you have no pieces of cloth left to remove = you're naked> and you can perform the last 1 time executed action which is <take the bath>.}
Notice the importance of the base case, otherwise your program will keep iterating and the program will get stucked.
Hope that this helps.
To make sure your function will stop calling itself you need an exit-condition. So whenever you want to write a recursive function, simply start with a template like this:
function myFunc(list) {
// exit condition
if (list.length == 0) {
// What should the function do if the exit condition is true
return
} else {
// before recursion
console.log(list[0])
// recursion
myFunc(list.slice(1))
// after recursion
}
}
So basically you have to think about when your function aborts the recursion, what it does before the recursion (e.g. extract an element from a list), how the recursive call is different from the original call (e.g. the list got reduced by one element) and after what it does after the recursive call (e.g. push a modified element to a stack). By answering those questions you should be able to solve a whole bunch of recursive problems.Before I learned this pattern, my recursive functions were a mess. Now, they all adhere to that very template and I find it actually fun to write recursive functions as there are some problems which are a lot easier to solve with them.
function RecFunc(n, max) {
let result; // intialize the return variable
if (n < max) {
result = RecFunc(n + 1, max) // the recursion
} else {
result = n; // the exit condition
}
return result;
}
RecFunc(0, 3);
When you call the function, we descend down the stack until it hits the exit condition. Notice that `result` is undefined in the upper levels of the stack; when `n` is equal to `max`, the function is finally able to assign a value to `result` and exit: | RecFunc
v n: 0, max: 3, result: undefined
| RecFunc
v n: 1, max: 3, result: undefined
| RecFunc
v n: 2, max: 3, result: undefined
| RecFunc
v n: 3, max: 3, result: 3
Now that the exit condition has been met, we go back up the stack, returning the result at each step: ^ RecFunc
| n: 0, max: 3, result: 3
^ RecFunc
| n: 1, max: 3, result: 3
^ RecFunc
| n: 2, max: 3, result: 3
^ RecFunc
| n: 3, max: 3, result: 3
Notice how the call stack resembles stepping through a for-loop: var result = 0;
for (var i=0; i++; i<=3) {
result += 1;
}
If you really want to see a mind-blowing example of recursion, step through an implementation of the `compose`[0] function some time. :)[0] https://github.com/reduxjs/redux/blob/master/src/compose.js
https://www.cs.princeton.edu/courses/archive/spr09/cos333/be...
So, each step needs to get you closer to the goal, working on a smaller problem, until you reach a base case, a really small problem that you don't solve in terms of recursion. You check for the base case, a really small problem you actually solve directly instead of handing it off to another recursive call, and you actually return your solution to the caller.
1. Write down the problem.
2. Think real hard.
3. Write down the solution.
Although personally, I use a somewhat modified version:
1. Find the closest person who knows more about what you are doing than you do. Then, for everything you can say about the problem, do so, out loud. (It is very important that you say it out loud and not just in your head.)
There is a very good chance that you are the person who knows the most about the problem, at least in the way you are presently thinking about it. This implies that you need to speak out loud about the problem, to yourself, and nobody else if necessary. Therefore, in order to make yourself take this step seriously, record your dictated thoughts (even if you never plan to play them back). This is a very important 'hack', because it simultaneously tricks your brain into thinking somebody is listening, causing you to take what you say with utmost seriousness (even though it might start out as non-sense), while at the same time giving you the freedom to say whatever you want (which is almost never the case when somebody is actually listening, since mutual intelligibility is a prerequisite for all conversation).
2a. Draw what you see in your "mind's eye" when inspiration strikes (when with a colleague, at the board; alone, on a blank, unruled sheet of paper). Do this for months, until you become fluent in a private 'diagram language' for describing your thoughts.
Similarly, utilize a private 'jargon language' to name things that don't exist yet.
2b. Start typing it all into org-mode, until...
3. ...you realize what the actual solution is. Then go do that.
N.b.: If you squint, everything I just said is nothing more than a generalization of what professional mathematicians do at the blackboard. I learned to think this way in undergrad in the math program, but it's equally applicable to any field IMO.
Disclaimer: This technique risks making you hopeless impractical and obsessive until it starts to pay off. And I have to admit, this is not really an algorithm for solving problems, so much as coming up with creative insights about problems. I think that most problems don't need some massive insight so much as dogged persistence and organization (in which case you should completely disregard this post).
Does this strategy apply to programming? Consider the xkcd cartoon[0] that Bonooru posted upthread. One possible realization of what the the "?" step in that cartoon could be: utilize my "conceptual" strategy to shrink the amount of time spent doing actual coding to a minimum. Doing this with abandon is surely dangerous and risks getting stuck in the first, trivial loop, but if you can find a way to iterate on paper...
Mathematics is the part of physics where experiments are cheap. -Vladimir Arnold
...then perhaps, by analogy: the kind of conceptual work I'm promoting here is the part of programming where the "inner loops" (that is, actual coding, like in the xkcd cartoon) are empty. Take this too seriously, though, and you may one day wake up in academia[1]... :-)
[1] For example, AFAIK, Edsger Dijkstra prided himself on writing programs only with paper and pencil rather than at a computer.
Couldn't recommend this more
Also thought people may find this article from andrew ng interesting: https://www.linkedin.com/pulse/20140320175655-176238488-lear...
Single loop when I know the domain fairly well. And double loop in a complete new domain.
So, the question is: Are there other methods to approach problem-solving which gives positive success?
a) Acknowledge that I might have already assumptions that need be questioned
b) Forces me to re-visit what I think I know
c) Realising that accessing the right model is "just" a matter of finding what building blocks are misunderstood or missing in my model.
I think the article suggestion fits this philosophy and it is a valid angle to attack a problem, in "model" terms "Find something that is like the hard thing but is easy" for me easy means, that is familiar to you meaning that is a model that you understand, meaning it is a model that you play and gives you the expected results.
It helps a lot if you have an employer that gives you the time. There is no substitute for getting paid 8hrs a day to learn new difficult tasks.
It's actually the reason why some of my self-employed friends got a regular job again.
This is insightful but claims are rather over-inflated. More formally thinking, if this system works then my first instinct would be to apply on np-hard problems or build machine with human level intelligence. The issue is that hard things are often hard because solution search space is extremely vast and achieving any level of predictability is difficult because there is almost always new information lurking in space you haven't explored yet.
Doing hard things is time consuming and/or expensive.
As a side note, I find it interesting how non-engineers describe the reverse engineering process. I thought this was hard to understand.