Apr 16 2010

Best Practice Rejection Sequence (BPRS)

Category: zvolkov @ 11:53

Following the best practices is all fine and dandy. But what happens under pressure, when deadline is approaching, PROD is down, and CIO is breathing down your neck? In most companies, all the practices are simply dropped and people just do whatever "fastest" thing they can. "Fastest" usually means such that feels simpler, i.e. requires less emotional energy. This approach usually leads to adoption of quick-and-dirty solutions commonly known as The Ball Of Mud that start as temporary and end up being permanent .

Instead, I propose to bring some order into this process and establish a sequence in which the best practices should be surrendered. While you can argue what specific items and their relative priorities would work better in your team, it is my strong opinion that the concept of such list is universally applicable.

Here's my first take of such a list, starting with the items I would drop first (documentation), and finishing with the ultimate rejection (not developing anything altogether). I would be really interested to see what your list would look like, please reply in the comments.

  1. Design Documentation
  2. Performance micro-optimizations (at the code level)
  3. Following official company-prescribed coding standards
  4. Ensuring the solution will work with Continuous Integration (unit-tests running on check-in)
  5. Adherence to low-level design standards (S.O.L.I.D. principles of OOD)
  6. Sufficient research of design/implementation approaches (e.g. on the internet) done before coding
  7. Neat code formatting
  8. Adherence to basic coding standards (small classes, small methods, no copy/paste etc.)
  9. Discussing solution with other team members
  10. Ensuring solution will work with Automated Builds process
  11. Adding or updating unit-tests
  12. Ensuring the solution won’t incur extra maintenance overhead
  13. Ensuring the solution will not negatively affect other systems it has no direct relationship to (e.g. overall system performance etc.)
  14. Manual testing done before pushing to PROD
  15. Whether the solution should be developed altogether

This list works at a subtler level than its simple structure would suggest. It changes the holy war attitude, the black and white attitude, of "professionals always do documentation", "agilists could care less about documentation, but they always do unit-tests" etc. to a much more workable prioritized sequence. Also, by contrasting practices well-known in management circles (such as coding standards) with those well-known by junior programmers (performance) and agile programmers (unit-tests) the practices are put into context of relative benefit/harm their adoption/rejection does to the big picture.

I strongly encourage you to create such list, thoroughly discuss it with your team, make sure everybody understands each item and has a chance to argue about its place in the sequence. You may even want to hang the list on the cubicle walls, which is what I plan to do once I finalize it with the team.

Tags:

Comments

1.
pingback topsy.com says:

Pingback from topsy.com

Twitter Trackbacks for
        
        Yesterday's news | Best Practice Rejection Sequence (BPRS)
        [zvolkov.com]
        on Topsy.com

2.
Michael Michael says:

Making an explicit list (best practices for dropping best practices) seems like a very good idea. Are you worried that you're allowing the team to lower the standards from time to time? Have you ever noticed any subtle psychological issues that accompany this decision?

Here is my list (things I'm more likely to sacrifice go first):
- Performance optimizations (if great performance is not a requirement for the task; if it is, can't drop this)
- Design Documentation (if resorting to pictures of the white board do not save you enough time)
- Adding or updating unit-tests (I would push back hard to not drop anything below and including this point)
- Ensuring the solution will work with Continuous Integration (unit-tests running on check-in)
- Ensuring solution will work with Automated Build process
- Sufficient research of design/implementation approaches done before coding
- Adherence to basic coding standards (small classes, small methods, no copy/paste etc.)
- Discussion with other team-members
- Usability tests (email survey involving at least 5 people)*
- Ensuring the solution will not negatively affect other systems
- Manual testing done before pushing to production
- Whether the solution should be developed altogether

The solution will likely incur extra maintenance overhead (if you even get to dropping the docs, which ranks very high in both our lists), so I'm not including this in my version. I also believe that dropping the coding standard will not save any time, only if new team-members are involved, so the stuff seems optional to me. I haven't noticed that formatting code is taking any time at all, so I'm striking it out too. That said, I have a list that closely resembles yours: in terms of items your list is quite comprehnsive.

* -- If the task involves designing public API.

Comments are closed