Ignore details early on
37signals.com
37signals.com
So, 37s turned a bunch of blog posts[1] into a book[2], which they are now turning back into blog posts[3].
[1] http://37signals.com/svn/archives2/getting_real_ignore_detai...
[2] http://gettingreal.37signals.com/ch04_Ignore_Details_Early_O...
[3] http://37signals.com/svn/posts/3387-ignore-details-early-on
Detail: What font should we use on the payment page?
Issue: Should the customer's credit limit be for our division or for the entire company?
Ignore the former and make faster progress.
Ignore the latter and be prepared to redesign your database and rewrite your app if you made the wrong choice.
Personally I find it very hard to do software design on initial stages of a project. It is similar to deciding on the laws of chemistry when building a tree, if you chose wisely it will grow naturally, if you make a mistake project completion may become impossible.
The more I try to write fiction, which I think follows the same creative process, the more I find each piece of work needs its own method for development.
Sometimes the shape of an idea comes first and the task is to trace its outline, but at other times an idea will accrete in the process of writing, and the important thing is to edit it into being.
Maybe some web designers really do need to figure out the font in order to work out what they are trying to say.
As usual, Neil Gaiman describes it best:
http://neil-gaiman.tumblr.com/post/39857822411/what-do-you-t...
If you optimize too soon in programming, you could run into all kinds of pitfalls. You might make the wrong thing efficient; you might spend a ton of time making the right thing efficient and then not use it; you might make something too complex by accident and it could screw you later on. So you wait to optimize.
You make the simplest solution that will work first, then optimize later, if needed. Often it's not needed.
The same should go for design, as it's an excellent fundamental principle of creation in general. Don't prematurely optimize: in other words, don't make things too complicated, too soon. Don't build something up before you have all the information. And don't build things you might not use until you know you need them. All good general rules of thumb, and they apply to all your work.
Though my experience is mainly in C and C++, I guess it can be different in dynamic languages.
As a developer when I notice myself re-tweaking about what shade of green to use, what perfect image to put in place, or what pixel size of font to use, it means I need to walk away for a bit. I've burned out for the moment on the big issues that need to be done and am just fooling myself with inconsequential work in order to maintain the feeling of progress.
Anyone who pays attention would notice that things that work well are always built by people who pay attention to details.
However, I've never encountered a person who pays attention to details and can switch this on or off, depending at which stage the project is in. You either care about details (and you can't help yourself), or you don't.
When you are good but don't pay attention to details you end up with things like ... the Facebook website. You make a million bucks by some random chance and then you start writing crap articles like this one. And then all the cool under-30 kids start worshipping you.
Either they fail by not producing a working product, they learn to prioritize, they burn themselves out and get it done to their standard, or they quit because they can't accept that sometimes deadlines matter more than details.
The advantage of high-level, low-detail [outlines, prototypes, sketches] is that you can find a lot of flaws without doing all the work, and iterate faster. It sucks when you have to scrap 3 weeks of code because there's a fundamental flaw in your architecture. It sucks even more when you have to scrap 5 years of work because you built something nobody wanted.
Novelist Rachel Aaron started writing 5 times faster and with higher quality (at least according to Amazon) through extensive use of outlines[0].
Now, the high-level outline will never be 100% accurate. As you dive into details, you'll realize that there are flaws and you need to change your design. That's okay. The point is to go with the approach that helps you improve faster than anything else. If you're writing a new feature for your app findthenearesthotdog.com, the right iteration loop might be idea -> 15 minutes on a whiteboard -> code. If you're creating software that has interface with 17 different legacy systems from hospitals with administrators who think web apps are made by spiders, you might want to go idea -> talk to customers -> talk to lawyers -> draw up diagrams, get approval -> write up 500 page spec, get approval -> code
With the product you're building, figure out which source of feedback (yourself, customers, friends) and which level of detail (code, specs, whiteboards) will help you improve fastest, and start there.
[0]: http://thisblogisaploy.blogspot.com/2011/06/how-i-went-from-...
This is opposed to Google, which tends to throw something out there that's pretty good to begin with, but once it's released it doesn't get much support and dies. Also, Google's (hosting) services tend to get more expensive, AWS always gets cheaper. I think it says a lot about how each company works.
Creator(s) -> Product -> Creator's feedback -> Consumer's feedback
Google seems to have heavy focus on the "Creator's feedback" portion, while Amazon has heavy focus on the "Consumer's feedback." That's why Amazon will release crappy v1's. This is basically the same as the agile development philosophy: orient your process to get external feedback as soon as possible.
It's much better to ship an early product with not much customization in a prototype/alpha/beta phase and get immediate feedback on what's truly important before arbitrarily deciding for yourself what's needed.
Building this way lets you fill in those bits when you need them, but you don't spend a bunch of time being tied to a particular framework or database infrastructure until you need them.
What is cool is once you start decoupled, it is easy to stay decoupled and the details can stay that way.
If you ignore details altogether, though, you're probably going to miss something important.