"Planning" is highly overrated. The best performers seesaw between "ideas" and "actions."
tompeters.com
tompeters.com
One of the things that greatly attracts me to startups is the ability to work like this... I loathe rigid schedules and attempts to plan out things in minute detail. What I prefer is an aggressive schedule (you need to set some dates, lest you wander), and a general plan of attack, and quality people that can change tack if needs be.
It's really important that we (the people who believe in prototyping and iterative development) emphasize that this is not a chaotic way to approach a problem. We absolutely do plan - however, we plan by coding and prototyping, rather than writing detailed specs. Specs are good - but they emerge from the code and the prototype. We absolutely do consider design issues - however, we discover and implement these things through refactoring. And in the end, we may very well throw out our first approach and rewrite, if it appears to be necessary.
But I think this is leaving the realm of opinion and entering the realm of reality. The people who try to do the pure waterfall where an architect designs and writes specs, a coder writes code, a tester does testing - they seem to be losing badly in the race to get excellent software to market. From what I've read (successful startups, Google) the free market appears to be rewarding the better approach.
unfortunately, not everyone is suited for that sort of learning. and in fact i would say most people aren't able to "know" using any method. for these people a decent plan can be beneficial, but technical subjects require a minimal degree of playfulness. their capricious details aren't very forgiving to fine plans, and you'll probably find most of these people don't become programmers :)
... or they become java programmers?
Planning to code: good.
Coding in a garage: better
Developing in a living breathing organization: best
No matter how much time I spend on my startup, I always keep an active consulting gig on the side. Routine situations come up every single day that I would have never conjured up in my "ivory tower". The value of fresh ideas and feedback from live users far outweighs the income.
Having said that, it's not a one-size-fits-all kind of deal. I certainly wouldn't want my brain surgeon saying "Hey. Let's just cut this schmuck's head open and see what we get, okay? Where's that can opener?"
A startup looking for user desires and aligning them with economics is a simple system. Act more and plan less to do it right. Brain surgery, creating the space shuttle code, or integrating all of GE's client software is not a simple system. Here's the kicker: some of these are complex because of the underlying nature of the problem (brain surgery) and some are complex because of the underlying nature of the _people_ (GE). Still, the end is the same. No amount of fast prototyping and "users love me" is going to fly in a complex environment. Now you might invent it and sell it to GE, but that's a different story. Simple environments mean you have to plan to answer simple questions, like "am I making something that users want?". Complex environments mean you have to plan to answer all kinds of other questions, like "How do I communicate what we're doing to 30 important stakeholders, some of whom may not like our project?" BTW, I hate complex environments.
So yes, by all means make something quickly and adapt. But know when that strategy works and when it doesn't.
And... brain surgeons probably practice (start doing) on animals or something else before trying it on people. At least I hope they do.
Still though, yes, in some activities you must do your utmost to get it right the first time.
I think it's a mistake to view the spectrum as only having two spots, total planning and completely inductive. Learning how to mix and match is probably a better skill than blindly following either extreme, imo.
Now, the surgeon can't just crack open your head and see what happens, but before he ever does that he's going to have practiced cracking open heads and mucking about with them somewhere (probably on a cadaver). He's probably going to have made some mistakes doing it too, and learned from them the right way to go about cutting up people's brains.
Likewise, you don't just ship the first piece of software you scribble out and see what happens either. Now, certainly with a web 2.0 AJAX calendar-organizer-automated-fish-feeder there's a greater margin for error than brain surgery, but it's a difference in degree, not in kind. If you launch a site that just returns "Internal Server Error" when someone surfs to it, you're going to be about as successful as a brain surgeon who never learned how to handle a scalpel.
So the surgeon cutting up a cadaver seems to me to be the same as a programmer blasting out a broken version 1.0 of his software. They're both trying something out in a situation where they can fix mistakes and reincorporate them to product. The surgeon makes a cut, looks to see if it's in the right place and is the right size, if not he keeps trying until he gets it right. When he can make the right cut every time without thinking about it, his service of cutting people is finished being developed. Likewise, the programmer writes some code, and checks if it produces the right output. If not, he tweaks the code until it does. Same thing. You can't compare a finished version of one product (performing brain surgery) to the development process of another product (writing software).
This is why interviewers like to ask about languages that aren't in the corporate playbook. If someone says "Ruby? Python? Lisp? No, I haven't had the opportunity to use any of those yet," you know you can pass. Not because all good programmers use ruby, python, and lisp, but because all good programmers know that you don't need to "have the opportunity", you just need to install the language and write some code.
It would be unconscionable to learn brain surgery this way, so if someone says "I haven't had the opportunity to operate on a brain yet," that's a reasonable statement.
I actually suspect that writing software is one of the most complicated things a person can do. If we didn't have the advantage of iterative development with cheap compile cycles (or run cycles, if you don't compile), then no system of any real complexity could be built.