When you go to accept a contract and the client has already estimated the time that the feature addition will take, and expects you to sign off on it, do not sign.
It is very important that you are involved in the estimation of the project. You need to sit down with the client for a day and break the features down into small, manageable chunks. Only then can you provide an estimate - being careful to stress it is an estimate only.
Why? Because clients do not know how impenetrable their code is. They don't understand that their proprietary storage engine will set you back three weeks trying to learn it. They don't understand that their codebase doesn't contain enough documentation to set up their product in your environment. They don't understand that their spec sheets do not contain information that is easily interpreted by a programmer with no domain knowledge of their business.
I have unfortunately made this mistake once before and I will never make it again. Realise that it could be difficult to recognise this issue if you are under financial pressure and want to sign something quickly, but it is so important to avoid getting involved with clients in this way. Explain to them the correct way of doing things and when you're sorted out with proper estimates and spec sheets only then should you sign the contract.
Modern Software Development is an article I wrote with a concise list of technical points for a software house to implement. It has a basis in Agile methodologies but doesn't preach a certain one. It is aimed at the small software house or the beginner.
Modern is being proactive and efficient. It is being prepared, having backups, examining information, deploying with minimal mistakes and being able to recover and review when mistakes are made. Modern is being well-tested and writing maintainable code. Modern is being able to release regularly and easily.
Django Python 960.gs Git Vim NetBSD Nginx
This is the blog of Brad Willis, a software engineer living in Brisbane.
Help
Latest entries
*BSD Agile Apache Apple apt Athletics Best-Practice Censorship Chrome Comedy Cool Crosswords Deployment Django English Exim Firefox Git Hardcore Health irssi Javascript Jira Languages Linux Makefile Mathematics Mobile Broadband Mutt MySQL NetBSD nginx Nokia OpenVZ OSX Perl Postfix Privacy Python Rant Requirements rsync Ruby Shell Slackware SQL SQLite SSH Standards Subversion Television Testing ThisBlog Vim VMWare (Fusion) VPN X zsh
gvim - Always open new files as new tabs
crontab - escape % (percentage)
OSX Google Chrome - start in incognito mode
SQLite date arithmetic
Postfix - delete message in mailq
Checking for exceptions in doctests
Homer's Curling Speech
retry in Python
Vim Makefile tabs
Centos (or RH) IPTables
Converting ssh2 public keys to openssh
Vim comment hints
Context managers in Perl
Dish rotation
Git - fixing commit user
apt stuff
Using shell variables in AWK
Linux - Too many open files
Tell gvim to save and quit... remotely
Vim - automatically remove whitespace at EOL
Python - relative paths from within modules
TV Aspect Ratios
Git - Which commits are in your branch only?
Subversion setup cheat sheet
Force detach a screen session
Modify sudo's use of environment variables
Install all Perl modules
Mutt - delete old messages
OpenVZ VPS and swap space
fail2ban on NetBSD for ssh
NetBSD - Using sup
Python - testing for a sys.exit
Python Best Practice Link Dump
Python script names
Perl - Using an expensive module
Speed of git clone
Perl Modules with Custom Prefix
Perl: tr vs. s
Brilliant sysadmin Reference
Why is GRUB better than LILO?