After my first large project, I've understood there are lots of things that can make programming more pleasant at such projects. I know some already but what else I could yet do when preparing for large projects?
What I've learned this far:
- Minimize your requirements list for the project.
- Set up a repository. (*)
- Version your code. (*)
- Provide something early as possible.
- Automate your testing routines.
- Make deployment easy as possible.
- Research and take your time, do not hurry.
- Set up a bug tracking website.
Find out and search ways to make programming more pleasant.
(*) forgot to add.
I've written these out as bullet points, but I'd like to see the reasoning and experience behind the new ones you provide. As an exchange I can try explain my own reasoning and experience behind these points one-by-one.
Minimize your requirements list for the project
It is inevitable that your application has requirements it must fulfill. I burned myself with them because I took the requirements directly from my client, without refining or reducing them in any way. On top of that, I added couple more.
There's a straight relationship between requirements and how long it will take. It will take longer more you have requirements. So I went way out from the schedule I had for the project.
Only after I finished my project I realized that it would have been much easier if I had reduced the client's requirements into minimum, and not providing any more requirements for the software.
Perhaps it is already half-designed when it's requirements are minimized and re-structured properly. Anyway, before you do that you may not even have clear requirements specified by your client.
Set up a repository and version your code
It is nice to work with code if you don't need to store dead code in comments and if you can just send the patches to the server you are working to. It also makes it much easier to work with a team if you happen to have one. When you version your code, you can make sure that people can tell the version where the bug appears. It does not matter if you only have one customer though.
Repositories and versions are so easy to configure and use, that it doesn't hurt if they are there always.
Provide something early as possible
While lacking remote repositories. I couldn't provide anything for a month, therefore the client couldn't try out the software until late and only at certain moments. If you can provide something early as possible and then update it gradually, you'll have couple of eyes more at trying it out and seeing how it works most of the time. This also helps the customer realize what do they want and make their move accordingly, while giving the feeling of progress.
Automate your testing routines
It may not look so big deal at small projects, anyway you just need to test whether they do few things correctly. It's also so hard sometimes that there's no interest on doing it. But you end up having much to try out any non-trivial application. Therefore it's your interest to make most of the testing automatic.
Unfortunately I didn't do this. When I write a fix I don't know whether it broke anything obviously unless I test it by trying it out. Bugs coming from bugfixes are ending up to the end-user. It further also takes my time onto things I could have otherwise used to thinking out a better design.
Make deployment easy as possible
Making deployment easy is as important as actually producing the product in the end. Program should solve it's dependencies, download or contain them. If it doesn't, you or the end-user will end up looking and solving for them. Unfortunately, most programming environments do not help in it as much as they should. You have things to do, no time for solving out the dependencies in whatever mess you end up touching to or moving around.
Research and take your time, do not hurry
I program regardless of whether I'm employed or not. During the project I realized that I don't behave same when employed. I tended to try get it all fast done, to get back to my own projects. That must been one factor why it failed so badly, because after I got it released and stopped having any pressures, I found out many places from my code where I could have done really much better without any tradeoffs I had to take before. I believe this has something to do with the importance of analysis in the programming.
Set up a bug tracking website
This is not always so high priority in projects where there's only one or two end-users. But it gets more important on large projects where your customer base can clutter your email box full.
I don't perhaps need to explain the last point. It's self-explaining thing.