This is one of my favorite topic. So I’ll freely express my thoughts here:
When I was doing my little “Avatars of TDD” experiment, I found TDD practitioners could take the same problem and approach it using either the Outside-In or the Inside-Out approach quite nicely. Obviously each person had their preferences. Also the tool used, the choice of programming language and paradigm influenced their technique quite a bit. I could see trade-offs in both scenarios. So I don’t believe in ONE best way.
Personally I don’t choose just one style. Depending on various criteria (listed below) I choose which approach I’m going to start with. I & most programmers I know go back and forth between Outside-In and Inside-out.
I tend to make the decision based on the following criteria (just a list of things that comes to my mind right now, I’m sure there are many more criteria):
- Familiarity with the problem – How clear the problem & its solution is.
- Stage of the feature/Project
- Prior Knowledge/Experience with the technology stack and implementation details
- If its completely unknown, one might spike it out or build a throw-away prototype. Having the prototype in front of you, can influence which way you start.
- Whether your goal is to go breath first or depth first.
- Whether your goal is to get low hanging fruits first (easy first) or core first (highest risky items first)
- Whether you are driving the design or validating the design (test driven or test first).
Inside-Out and Outside-In also applies at a product level. Which massively influences our development style. For Ex: if the original idea about a feature/product is about a core feature that needs to be built. We could start building just the core idea, getting feedback and then slowly flush out the rest of the system as we build inside out.
It appears to me that, this topics needs a lot of context. Any discussion outside that context might dumb down the importance of this topic.