There is always a room for improvement regarding the service that we deliver to our clients.
In this post I describe 3 habits that I consider really helpful in order to work effectively with clients.
Estimates... As long as this might be a nightmare for many developers, this is still a crucial part that we need to take care of. The fear usually comes from the fact that while we are trying to do our best to etsmiate a task, the estimations often end up being not as accurate as we predict them to be and we might still be expected to deliver the work till the certain date. We need to be aware of the two sides of the coin. On the one hand, a developer wants to deliver a high quality work while taking care of unexpected tasks that come up during the development, but on the other hand, our clients need to plan their next business steps and they need these estimates. You cannot simply say "It will be ready when I'm done" as it does not bring that much value to the client. Achieving 100% accuracy in estimating complex tasks is
not that easy an impossible activity, but how can we make this better?
Our early estimates may be much different from the reality, however, we should expect our estimates to improve as we continue working on the project. If we want our estimates to be more accurate, we need to practice this activity. It would be a good approach to estimate your tasks even if you're not asked to. This way you can check yourself how long it takes you to implement certain things. It's really hard to estimate things right, but that should not stop us from working on improving them.
Breaking tasks into smaller assignments will not only make it easier to estimate, but it also might show you the details that are not visible at the first glance. This will allow you to warn your clients about possible problems much earlier.
We must be prepared that the reality will diverge from our original estimates - in the end, this is why they are called estimates, not commitments.
With this approach it will be much more natural to inform your clients about possible delays. Keep in mind that if you have an estimate for 2 weeks of work and after 5 days you notice that you will not make it - do not wait until the last moment to inform about that. The time that you notice the issue should be the time that you update your clients so that they can adjust their plans accordingly. You should not treat the act of updating estimations as a sign of failure - in the end these are... well... estimations!
If you're close to the deadline and see that there's a risk of not having the feature ready, consider finding a subset of this feature that will allow you to solve the most critical parts of the problem. Usually having a partly implemented feature is better than having nothing at all.
Our role as developers should not be limited just to the implementation of a task. Instead I'd encourage you to dig deeper into the actual problem. It's worth asking yourself a few questions before you start working on the new feature:
- What is the problem that we are going to solve by implementing this feature?
- Is it really a problem?
- Is there another solution to this problem?
"We don't have the login system in the app." - Does this app require a logged user to use its content? No? Then maybe there are more critical things to work on?
"This design of custom control for a date selection would look great in the app!" - Maybe a standard component will be a much better choice in this case and will take a few days less to implement?
Investing more work into a feature
A means that you will not be able to invest this time into a feature
B - in the end, maybe there are more important tasks to be done? Keep in mind that it's not only about finding faster/cheaper solutions for the problems. Sometimes it’s just the opposite - adding more work will allow us to provide a better solution that will benefit us in the long run. It's all about making your clients aware of the implementation cost and pros and cons of each solution. It may turn out that the alternative solution is a much better choice for them compared to what they initially wanted.
If you work with clients (especially remotely), it is really important to make them aware of what happens with the time that goes into the development of their product. That's why a frequent synchronization is a key to good cooperation with your clients. If you have a CI system, make your test builds available so that your client always knows about latest changes. You don't have one? Make builds yourself, but please remember to keep your clients up to date with the progress.
You can also schedule a quick meeting with your clients and update them about your progress. As a result your clients may find out that they would like to update the initial requirements. Keep in mind that it's usually much better to do it before all work is finished - all in all it's our role to provide our clients with the software that fits their needs.
Putting it all together, I believe that in order to work successfully with clients, you need to go a bit further than just writing a code. Constantly update your estimations and improve them, find alternative solutions to problems, provide your clients with frequent updates and treat them as a part of your team.
If you would like to read more about planning your work and working together with clients, then I really encourage you to grab Planning Extreme Programming by Kent Beck and Martin Fowler. You do not need to practice extreme programming in order to find this book useful 😉 .