Good practices often revolve around making things simpler, making them less convoluted and complicated, putting everything in its own place instead of letting stuff spread around.
Simple does not mean easy though.
Making something simpler is hard work. Untangling a big complicated mess takes significant cognitive effort. It is often easier to leave the complicated mess in place, adding to it, even if we know it may come back to haunt us.
There is no expedient to which a man will not resort to avoid the real labor of thinking.
– Sir Joshua Reynolds
Research shows that our brains and psychology actively predispose us to avoid the hard work of thinking clearly and to rely heavily on automatic behavior tapes to reduce the burden of having to make decisions based on clear thinking.
So, we tend to stick with what we know and have.
2. Short term rewards
The rewards of good practices, such as simplifying things all the time, often are not immediately apparent. Usually they manifest themselves only when returning to something.
And when we reap their benefits, the reduced effort required on the revisit is not attributed to the effort expended to make things as simple as possible, but rather is taken for granted.
So, we all too readily fall prey to the allure of short term rewards and avoid the hard work of ensuring a slightly slower but much more sustainable pace in the long term.
3. Inconvenient truths
Sometimes it is not the effort of hard cognitive work that makes us shirk thoughtful activity, but the harsh consequences of that activity. Sometimes it is the cursedly clear and unwelcome set of answers provided by straight thinking that makes us mental slackers. There are certain disturbing things we simply would rather not realize.
– Robert B. Cialdini
We would rather look the other way and continue as we did before rather than acknowledging that we may have made a bad decision and taking steps to correct that. We even construct reasons why our bad decisions were “actually” good ones.
It’s human nature
Just like good judgement is the result of experience and experience is the result of bad judgement, good practices are the result of experience and experience is the result of bad practices.
Good judgement and the willingness to expend the effort required to practice good habits usually only comes after having had many, many, many first hand experience with the troubles caused by bad practices.
That is why it is so hard to convince people to adopt good practices. If you haven’t felt the pain, it is hard to justify the effort for an (as yet) unfelt gain.
It’s not that we are lazy, foolish or pigheaded. It’s just our human nature working against us.
Or is it?
Are we doomed?
Of course not. Quite the contrary. Human nature is an interesting beast. You can put it to work to your advantage just as well.
If people are hard-wired to default to turning off their energy sucking thought processes, reduce the number of things they need to think about. Interestingly, you do that by making things simpler, and thus reducing what you have to worry about when implementing your shiny new feature one aspect at a time.
If people like short term rewards more than long term gains, focus on the short term gains. The red-green-refactor cycle is addictive whether you TDD or not. It makes you feel in control despite the frustrations of getting legacy code under test. And feeling in control makes you more confident in what you are doing. Who wouldn’t want that?
If people don’t like realizing they may have made a bad decision in the past, ignore that and focus on making things a little better now. I was foolish enough to think everybody would simply love to improve. But improving implies you did something less well than you could have. For some, that realization hurts more than the joy of continually getting better. I wish for you not to have to overcome the resistance that evokes. So don’t talk about improving, just do it. Focus on what you can do to make bad things not happen again and good things happen more often. Haven’t quite gotten the hang of this myself yet. It’s something I am improving 🙂 If you have any tips, I’m all ears.
Blindingly obvious? Yes.
Easy? Not so much.
- Show, don’t tell.
- Start small. Work with one person at a time. Show, don’t tell is much easier when you can do it one-on-one with a very concrete bit of code that you are working on, now.
- Start small. It’s much less daunting to figure out how to improve one function or how to bring one method of a class under test.
- Keep taking small steps. Keep in mind that you can always improve something again. And again, and again. There is no need to get it perfect the first time around, or the second, or the third. Heck, if you got it perfect at any time you would have to forego the pleasure of getting better. Where is the fun in that?
- Celebrate every step in the right direction.
- Enjoy the journey.
More thoughts on how to move towards better practices in some future post.
Have any war stories?
How have people exasperated you by stubbornly continuing not-so-good practices in spite of overwhelming arguments to adopt better ones?
How did you get someone enthusiastic about a new approach?
I’d love hearing from you by email or in the comments.