I like making code that reads a lot like Gerry's concept of Plain English programming. Get the basic concept down then define the functions later. Use functions that don't exist yet. Suppose you're programming blackjack. Start with something like this:
Code:
// start with 2 cards
DrawCard();
DrawCard();
// use GetSum() to calculate the sum
// draw cards until it's 17 or larger
while (GetSum() < 17)
{
DrawCard();
}
Stay();
None of these functions exist yet, but you can look at the big picture and see if the general flow of it makes sense. Everything is nice and close together. It's easy to change something or move the pieces around.
That's exactly how I like code to look like. Now the *way* you program it is up to you. What you described is sometimes called top-down or consume-first development. With modern IDEs, they're smart enough to stub out each method as you go, which is pretty cool.
Most of the time, my way of doing things involves blasting away code in a single method. As soon as I hit a second abstraction level, I use the IDE refactoring tools to extract a method. For example, if I were coding the blackjack game in your example, I would have typed out all the code to draw a card, then I would have hit the while loop. At this point, we're now facing a problem that goes against my coding philosophy: our method is now doing more than one thing (draws two cards, then applies gaming logic). So then what I do is highlight all the "draw a card" code, then use the IDE's refactoring tools to extract a method (name it DrawCard, in this case). The method I started with now only does one thing (applies the game's logic) and it stays clean.
I also use the consume-first pattern; it just depends on what I'm doing. They're both valid options. One case where I'd likely use consume-first is when I'm writing something that's a bit complicated with a few unknowns. For example, let's just pretend that summing the values of a hand of cards was difficult, in my head, I would say "I know this is possible, but I'll figure it out later" and just type out "GetSum()". Let the IDE yell at me because the method doesn't exist, then let the IDE create it. If you set up your keyboard commands and code snippets/templates to facilitate this kind of development, you can seriously code SUPER fast.
When coding like this, I have found almost zero need for comments. I only really comment public API, and that's about it. If you're ever coding a weird algorithm that needs to break these rules, then sure, comment away. But seriously, 95% of the time, you don't need comments if your methods are small, do ONE thing, and read English-like.
Following this philosophy makes unit testing a breeze, by the way. Think about it; if each method does only one thing, how hard is it to write a single test for a single method with 100% coverage? It's so easy that it's even a bit formulaic, and you know what that means: code generation. You can pretty much auto-generate 75% of your unit tests using templates and a mocking framework.
So yea, go ahead and have 20 methods, even if you can do it in one. Optimize code for human consumption; compilers are way smarter than us mere mortals. Don't worry about making code "tight." That's my take, at least. I'd be happy to get some criticism on this.