I originally posted this as a comment on Keith Casey's post
about Software Development
Failures.
I've tried to expand my thoughts a bit here.
Indicators of failure often stem from the practice of not properly
maintaining a large codebase. In most organizations, the focus is on
deploying code within a narrow time frame. That is, "ship it now!" The
first items to be cut from the budget/schedule, if they were ever in
there to begin with, are testing, documentation, and any perceived
"slack". The temptation to get something done right now often wins out
over getting it done right. A company may, intentionally or not, reward
developers who show quick progress, regardless of whether they are doing
things right or working efficiently.
I think, and granted this is based on my own experience, that successful
software projects are ones that pay attention to building the codebase
right and maintaining it as well, doing things like:
- Proper testing, unit- or otherwise, but likely automated so that
you can prevent regressions when you change your codebase.
- Documenting Code, phpdoc and at least API generated docs. I know
when I'm looking at yet-another-framework, that good documentation
and howtos/tutorials are the first thing I evaluate. Its why I hated
my first exposure to CakePHP, but liked Solar and CodeIgniter. Even
Drupal does a decent job of this, which is why so many can
overcome/live with how its designed. Documenting a codebase is also
instructional for finding/flagging deprecated functions, repeated code
blocks, and planning what needs re-factoring, making it easier to
bring new developers up to speed.
- Maintaining the codebase, doing the little things that only
programmers might notice but can have an impact on how extensible,
understandable your codebase is. Encapsulating code in
classes/functions, laying out files in an understandable manner,
separating View from Logic, going back and fixing the corners cut to
release the project, etc.
- Using Versioning - I can't imagine working without it now. The
challenge, particularly on a web site project, is getting
non-technical users like designers to learn it and use it.
I don't think this is an exhaustive list, just observations from my own
experience in inheriting 2 product code bases.