Very fast development, how to do it?
Note:I'm asking this question with webapps in mind but something that would work with general development I think is also relevant.
Note:I'm asking this question with webapps in mind but something that would work with general development I think is also relevant.
A good VCS and the ability to use it.
Spiral development with strict YAGNI. Do it right but don't over engineer.
Automated Tests. Not because I am all that big a fan of tests but because if you write it to where it is easy to test it is often better designed. Code that is written with everything you need to do to unit test is often written with lower coupling and better cohesion because you are thinking about how to take out this one little part to test.
Problems are easier to fix the earlier you find them. Try to define the problem (get it clear in your head); try to define the solution. A minimal product can help (does it solve the problem? is it the problem real?), or mocking up a pretend solution (e.g. a manual backend, or no backend), even on paper, or with a tool like balsamiq.
Can you solve the problem using an existing tool, perhaps by modifying the problem to fit (constraining it, generalizing it, or transforming it)? This can be embarassingly effective, esp if you have NIH syndrome and just want to code.
Can you make the cause of the problem go away? ie Doctor, my arm hurts when I do this. Don't do that.
Estimate times, by sub-dividing the tasks, then doubling the estimates. Then re-ask what is really essential. It can change the balance of what alternatives are reasonable to consider. [x2 seems to account for one's optimism. But confirm it for yourself: make some estimates and check what happened.]
Reread The Mythical-Man Month. eg He suggests 1/6 of project time be allocated to coding. (p.20, anniversary edition); the rest is planning (1/3) and testing (1/2)
Go minimalist (feature set) and release ASAP - no matter how crappy it is. Having something released will force you to improve it quickly.
While it's useful to spend some time looking for existing solutions, don't be afraid to build things. Your version will often be good enough, and quicker to integrate than a 3rd party solution. Besides, you usually learn something in the process, which will only make you better at coding, and speed up your next project.
To whatever extent you can't abstract away, use code generation. Make your generator insert code directly into your project files, maybe in between comment tags. You want to be able to configure things with minimal code and hit a button to get everything you need.
I'm experimenting with using emacs for this, but generally I've just built c# projects to generate my c# code. On one project this had an unexpected benefit: I realized I could change my generator from a compiler to an interpreter, doing everything at runtime, and I got a very concise and flexible data-driven project, with 1/3 the lines of code as a similar project built by a contractor that had everything hardcoded.
Of course, know your language and libraries well. You don't want to be googling for every little thing. To help learn the libraries, staged memory software like anki or mnemosyne can be a big help.
Finally, get really good at a topnotch text editor. I'm about 8 months into using Vim for everything (mainly via Viemu, a plugin for Visual Studio) and it makes a huge difference. It's not just that I can edit faster, but that it helps keep me in flow.
Also use modern frameworks like RoR, Grails, Django, Spring, etc
If you are tackling a problem space where such a language doesn't already exist, or one where the right idioms and level of abstraction is unknown to you, then choose a language that permits you to easily discover and construct the domain specific language that is required.
once you are sure that you arent breaking something, the speed at which you can code changes an order of magnitude.
the hard part is how to produce tests quickly