The Code Whisperer

Practical, on the ground advice for efficient software development

36 Common Software Development Mistakes
8. Unrealistic Expectations

One of the most blatant examples of unrealistic expectations I have experienced was at a motor manufacturer whose UK subsidiary was rewriting their dealer system. The system controlled just about every part of their business from sales, through parts and servicing to accounting. The then current system was DOS based and although worked fine was looking dated and reaching the end of its usable life. The replacement was a n-tier, VB5, MTS (now COM+) system with Oracle as the database. The specification was the old system, a pile of enhancements and knowledge held in 3 dealer consultants heads. Already this isn’t looking good. Then the bombshell, planning. The conversation went along these lines:

“The accounts system will take 3 months to complete”
“How have you calculated that, these plans aren’t detailed enough to work out how much time is required”
“Accounts represents 25% of the complexity of the old system, and we want the new dealer system developed in a year, hence 3 months”
“And how many developers?”
“3″

So that’s 3 man months to:

  • Understand the old system
  • Find and understand the enhancements
  • Pick up further changes from the dealer consultants
  • Technical design
  • Approval for GUI
  • Development using technologies that then were very new
  • Unit and system test
  • Integrate with the main shell and with other parts of the system, e.g. sales

Clearly this was unrealistic expectations on a grand scale, but it took 9 months to realise that this was the case.

Unrealistic expectations is not restricted to only planning and timescales. Over the years I’ve seen a number of other cases:

  • Sales made on the back of features that don’t exist in the application, then a scramble to implement them
  • Inappropriate software selected and expected to be configured or changed to fit business practises
  • Old, slower development environments, but development speeds of newer development environments
  • Development and/or implementation using old, slow, small hardware

In my experience people working with projects that have unrealistic expectations tend to have one of two mindsets: 1. Heroics - let’s get it done and 2. We’re not going to make it so do what you can, but only 9 to 5.

Neither of these mindsets is good for the project. Heroics we have discussed, but there is the other side of the coin in which everything is viewed negatively. Getting either of these entrenched in a project is deadly, which is why effective planning and being in control of the expectations is vital. Going back to my example, the project manager should never have agreed to initial timescales as they were clearly too short. The particular project had 3 different project manager over 2.5 years before the project was cancelled, to be replaced by a third party application.

If you've enjoyed this post, please share with others:
About Social Bookmarks

36 Common Software Development Mistakes
7. Relationship Between Developers and Customers

In Rapid Development, Steve McConnell talks about friction between these two parties rather than relationships in general. Friction implies some degree of animosity and detrimental effects on a software development caused by developers and customers communication aren’t always as a result of disagreement. To be honest, and with one exception I’ll come on to in a minute, I think generally developers and customers should be kept as far away as possible, unless there is a chaperone. With massive generalisations, so there will be exceptions, here are my reasons:

  • Developers speak another language, so do customers. Neither can accept why the other doesn’t understand so you need an intermediary that can speak, or is willing to lean, both languages and translate. I’ve just had a very good example of this where I’ve spent nearly an hour on the phone over the last week helping a customer buy and download our restoration software. He uses the computer as a tool and the vagaries surrounding accessing a hyperlink in an email is of no interest and outside his area of knowledge. Repeatedly stating “click on the link” isn’t going to get anywhere
  • Developers like creating new, exciting applications. Having to make changes is viewed as mundane and bound to be met with derision and much tutting
  • A 3 month development is short for developers but a lifetime for customers, particularly if they have seen a perfect prototype. Software people know that an application is like an iceberg with the GUI above the water and most of the code below, but customers focus on the bit they can see
  • If a customer desires certain amendments to an application that is being developed that is time consuming to include, if the developer makes the decision to include it, this may be made without considering the scheduling or financial implications of doing so
  • Ideally developers should not be the first line of support as this causes interruptions and also different categorisation of problem severity. The customer may class a problem as high severity as it’s reducing their efficiency, but if the developer sees it as a tricky or dull change the severity may be reduced. Conversely customers often see all problems as top priority and want them fixed immediately

There is one exception. I strongly believe software is better when the people designing and building it have some knowledge of the business or industry it supports. I worked for British Telecom just after privatisation and the day I spent looking at different sorts of exchanges was one of the most useful days I have had. All of a sudden the huge billing system I was working on made more sense. Just knowing some of the language the engineers used on a day to day basis improved the quality of my work. Arrange days out of the office for your team and immerse them in the business they are producing software for. They will understand the customer requirements better and will benefit from a day away from the office.

If you've enjoyed this post, please share with others:
About Social Bookmarks

36 Common Software Development Mistakes
6. Poor Office Environment Part 2

There are a couple of things left out of yesterday’s post I wanted to follow up on today.

The most productive environment for thought based work is adequately sized, quiet, individual offices. However there is a negative aspect to this, the reduction in the feeling of being part of a team. With open plan offices and, to an extent, the cubical layout, teams tend to be clumped together, which gives them a sense of group identity. The identical nature of open plan working spaces means that it is relatively easy to move people around as projects finish and a new team is assembled for a new project.

With individual offices comes ownership and personality. The incumbent of a new office will move things around to their liking and have personal items such as photographs and the ubiquitous pot plant that identifies the workspace as their own. This is good and should be encouraged as the more comfortable the team member is the more productive they will be and likely to stay with the company longer.

If teams change, moving individual offices is not straightforward and you could end up with a team spread over several floors or even buildings. From a team bonding angle this isn’t ideal. In my opinion team bonding isn’t the project being worked on or the company, it’s the personal interaction between the team members, formed by agreement and disagreement on subjects aside from the project and office. It may be an Apple v Windows discussion, last night’s football results or who should be evicted from the Bug Brother house next Friday. It’s trivia, it doesn’t really matter but it bonds people together, or not, but then you have a more serious problem that would need addressing in any case.

With individual offices you lose the team bonding that happens by virtual of being in the same working space, so it’s important that it is recreated in other ways. I worked at IBM’s Hursley locations for a while in 1993. The office environment there was mostly small offices, but contained more than one person and some had almost no natural light so can’t be considered ideal. To overcome the segregation the team generally had lunch together and morning and afternoon tea and coffee breaks at set times, something I haven’t seen since. Now 30 minutes coffee drinking time a day may seem unproductive, but this wasn’t the case at IBM and if you add up the time taken with ad-hoc coffee grabbing and having to spend time getting back the train of thought, 30 minutes a day is a bargain.

So if individual offices are the best environment why isn’t every company doing it? It’s easy to carry out a cost benefit analysis on the additional floor space and furniture against increased productivity, but it’s deriving the amount of increased productivity that becomes the issue. Values exist in books and from studies, but until a company makes the change it won’t know whether it will be beneficial for their project and team member mix. In addition there is a “out of sight, out of mind” worry for managers. If you have passionate, motivated team members, enjoying their work they will continue to work in an individual office. The team members that use the privacy of an office to play games and surf the Internet all day will be as unproductive in an open plan office or cubicle, it’s just that it won’t be as obvious the passing management.

If you've enjoyed this post, please share with others:
About Social Bookmarks

36 Common Software Development Mistakes
6. Poor Office Environment

Software development at most stages is thought intensive. Generally people take around 15 minutes to get into the flow of what needs to be done, and then can remain in that state for several hours. However in crowded and noisy open plan offices the average interruption is estimated to be every 11 minutes. It’s hard to see how anything gets done, which is why often there is a band of early morning workers and a band of late night workers, achieving productivity when the office is quiet.

In the first 10 years of my IT career I only had an ideal environment to work in once, in my first job as a trainee COBOL programmer. I had an office to myself, could shut the door, plenty of desk and storage space, a window to let in natural light and could switch off the phone. No email back in 1981, so interruptions could be easily minimised. Since then it’s been either a shared office or large open plan offices, neither of which are conducive to thought driven work.

I’m not going to go into detail about the ideal working environment for development staff, in which I include analysts and QA/testers, as there is plenty of information in books and on the Internet, but I do have a few ideas and grumbles picked up over the years.

  • Some organisations have an open door policy. I understand the reasons behind this idea, but it should be completely unnecessary if the members of that organisation have respect for one another. I’m not advocating office doors should be shut all of the time, but there are periods where the door needs to be shut to indicate a period of intense thought and fend off unimportant interruptions
  • Email is a blessing and a curse. It’s great as a way of dealing with messages when you want, but few people work this way, responding to email instantly and using up huge amounts of time in the process - remember every time you stop what you are doing to read an email it takes 15 minutes to get back in the flow. I highly recommend looking and responding to email only two or three set times a day and shut down your email client for the remainder of the day. Make sure you have an effective spam filter for all incoming email. There are plenty of services to choose from, with a variety of prices, plus you can route domain email via Google Mail and strip our spam for free
  • I’ve never been a fan of instant messaging, maybe it’s an age thing, but I find the constant interruptions frankly irritating. However I can see it has a use for conferencing, but I much prefer the telephone and there are a number of companies that offer conferencing at just the cost of the telephone call, with no additional equipment required
  • Some years ago a UK supermarket with an open plan office gave staff a red hat that they wore to signal that the did not wish to be interrupted. If I remember correctly there were time limits on wearing the hat, which I think defeats the object to a degree. I appreciate having a maximum time per week stops people from constantly appearing uninterruptible, but having the hat on did make you look silly so would discourage some people from wearing it constantly
  • Storage space is a constant problem in offices. We’ve recently invested in quite cheap cupboards from Ikea that utilise the otherwise wasted wall space in our small office. This has made a huge difference - we can find things quickly and the work surfaces are free from clutter. Clear desk policies make a lot of sense, but make sure that the pile of papers is being stored properly not just hidden in a cupboard
  • I’m 6 foot 4 and find most desks too low. A low desk means I also have my chair low and my legs end up being wrapped around the base or stretched out in front causing all sorts of aches and pains. I custom built the desk in my office, which sounds fancy but really isn’t, being simply made from varnished MDF, legs from Ikea and a number of blocks to get the height of the desk right in relation to the chair at the right height. If people work effectively for long periods at a time at a desk they must be comfortable, so the height of the desk needs to be adjustable, even by placing props under the desk legs. Poorly adjusted desks and chairs can cause back pain, which means time off work, which leads to delayed projects
If you've enjoyed this post, please share with others:
About Social Bookmarks

36 Common Software Development Mistakes
5. Adding People to a Late Project

In his 1975 classic book The Mythical Man-Month, Fred Brooks states “adding manpower to a late software project makes it later”, which has become known as Brooks’ Law.

Generally this is correct but few rules are true without clarification and this is no exception.

The basis of Brooks’ Law is that adding people to a project increases the communication required and, assuming they have no knowledge of the development, will require training, usually by those struggling to finish the development. How long it takes before new team members are productive and how much of the existing team member’s time is taken varies massively from one project to another. Another factor is whether the remaining work can be cleanly split up or “partitionable”. I have seen panic project management where three developers are working on the same code module, inevitably slowing the whole process down.

Before rejecting the idea of adding more resource to a project, late or otherwise, consider the following:

Is the project actually late? - if the estimates and plan are wildly optimistic and unattainable, you aren’t as late in the project as your plan suggests. For example, you estimate a project to take 3 man months and have one person working on it, but in reality it will take 6 man months. After 2 man months you realise the project won’t deliver on time and reject adding another team member as there is only 1 man month left and this could add another 2 weeks to the project. However in reality you have 4 man months of work left. This is an important point because a crucial part of Brooks’ Law is adding manpower to a late project and this refers to a project that is late in terms of the amount of work and people and not by an over optimistic plan

How far into the project are you? - it’s obvious the closer to the beginning of the project you are the greater the impact of adding extra team members is. But to go back to the previous point, you must know exactly how much work remains on the project. In our example we are 2 man months into a 6 man month development. Adding more team members is unlikely to bring the project back to 3 months of elapsed time as originally estimated (1 person on a 3 man month project), but provided the work can be partitioned the delivery time can be reduced from 6 elapsed months. Let’s say that training up a new team member takes 2 weeks, although this will differ with project complexity and team member knowledge, so both team members are un productive for the 2 weeks. We’re now 2.5 elapsed months in with 4 man months of work left. Assuming the work can be split 50/50, the remaining work will be finished in 2 elapsed months, giving a total elapsed time of 4.5 months rather than 6 if we had kept only one person on the project

The project in my example is later than initially expected, by 1.5 months, but this is due to poor estimating rather than Brooks’ Law and in fact was delivered 1.5 months early by adding an additional team member at a point in the project that according to the original plan would have been classified as a late project.

An additional benefit of increasing the size of a team is that the knowledge of that project is spread amongst more people, which, depending on what happens to that project in the future, may be a valuable asset worth sacrificing a period of productivity.

By not clarifying Brooks’ Law with these 2 points and not taking the opportunity of adding resources to a project that will benefit from them, not only do you delay the project you also run the risk of inviting heroic action in an attempt to bring the delivery date back. Not revising the plan instils a culture of having deadlines that are known to be impossible to attain, but viewed as a challenge not something to be refined.

In summary:

If your project is late check the estimates and if wrong revise and re-plan. Use planning tools to model the effect of a period of unproductiveness followed by increased resource. By doing this you can make a considered decision about whether to add people or not. Before adding team members be absolutely sure that the remaining work is partitionable and that the new team member(s) will fit in well with the team.

Further reading:
www.stevemcconnell.com/ieeesoftware/eic08.htm
en.wikipedia.org/wiki/Brooks’s_law

If you've enjoyed this post, please share with others:
About Social Bookmarks

36 Common Software Development Mistakes
4. Heroics Part 2

Following on from the previous posting, heroics aren’t unique to the computer industry. Before we had children my wife was the production manager for a holiday company responsible for their holiday brochures. These were delivered to the travel agents in the autumn just after most people had returned from holiday.

Broadly speaking her team’s role was to collect copy from the various marketing departments, add library photographs and lay out the pages. The pages would then be approved by the department responsible for that area of the world and would then go on to print.

Every year it was the same. Copy was late, and many changes would be made once the page had been initially laid out. The reason for this was simple. The brochures were always delivered on time and the team worked as much as necessary, late every night and most weekends. Every year. This is wrong, wrong, wrong. As this culture was ingrained in the organisation long before Mrs West took over, the marketing departments took it as their right to ignore deadline and deliver poor quality copy late. To change this would require direction from management above all of the departments, which in this case was sadly lacking.

A friend contacted me regarding the last Heroics post and we discussed another detrimental aspect of heroics - the monetary cost. Both he and I have worked in organisations where planning has effectively been thrown out of the window and there is a huge coding mountain to climb. Paid overtime is unlimited and unchecked, which allows people to regularly clock up high number of hours, which will add to your costs if it’s paid overtime. Overtime is fine for short periods and useful to bring a schedule back on track, but if overtime goes on for too long (and this really depends on the individual), tiredness creeps in so productivity and quality of work reduces.

So in periods of intense or extended overtime make sure you are getting sufficient productivity (look at it as a return on investment, if a team member is working 10 hours a day instead of 7.5 and producing 8.5 hours of work, 1.5 hours is being wasted), whether overtime is paid for or not and if productivity has fallen, stop or reduce the overtime until energy levels return to normal and overtime can be effective again, or you have replanned.

If you've enjoyed this post, please share with others:
About Social Bookmarks

36 Common Software Development Mistakes
4. Heroics

Heroics is bringing or attempting to bring a software development in on time by working as many hours as physically possible. It is a very common activity in the IT industry and is a bad practise.

Software developments don’t always run on time and in order to deliver on time sometimes it is necessary to work a bit longer to achieve this. There is bound to happen from time to time, but when a plan expects that substantial overtime is required, the plan is flawed and needs to be reconsidered. The problem with heroic action on one project is that it’s expected on the next so that the same tight deadlines are reapplied. In some organisations heroics are even revered making tight deadlines the standard.

I’ve done the all night coding frenzy in the past. To be honest I even enjoyed it. I like to get things done so impossible scheduling appears as a challenge. But it’s not right and here’s why:

  • Future deadlines are even tighter than before - if you’ve done it once you can do it again
  • Working when tired can cause misjudgment and mistakes to be made
  • A period of intense activity often leads to a period immediately after where little is achieved
  • Planning, design, documentation, code reviews and thorough testing can easily be abandoned during this period, with a knock on effect later on in the software’s life
  • Extended working periods can cause problems for people outside of work. A culture of “long hours” can have a detrimental effect on home life
  • It values a “get it done no matter what” attitude over accurate planning and estimates and also the management task of moving impossible dates

There are times when the “get it done no matter what” attitude is vital, for example if a development is for a specific date. Personally I value a “can do” attitude in team members as it generates a positive vibe. To avoid heroics you need to plan with accurate estimates, monitor progress against the plan and revise the plan when required, not rely on team members to achieve the almost impossible.

If you've enjoyed this post, please share with others:
About Social Bookmarks

36 Common Software Development Mistakes
3. Uncontrolled Problem Employees

I’ve seen a close team ripped apart by an individual who seemed to enjoy rubbing people up the wrong way and misreporting events to senior management in such a way that it appeared the rest of the team had verbally attacked him. Additionally in this case, the little work that was being produced was of poor quality. If the situation had been left any longer team members would have started leaving.

This is an extreme case, and thankfully not all are as intentionaly destructive. Arguably the most important factor is that team members must get on. If there’s friction in their relationships work will suffer. It’s not just verbal communication, however. With development, poor coding and/or design, reluctance to follow coding standards or the team’s procedures should ring alarm bells. In an ideal world, design and code reviews will highlight these issues, but if these aren’t taking place problems can be discovererd very late in the development process.

Problem employees must be removed, whether to a different team or company and before any serious damage is done to the remainder of the team. Be careful, however, that a legacy of poor work isn’t being left for someone else to correct.

I’ve assumed that there are no employment laws to follow, simply because there may be laws in one country that don’t apply in another. You must follow the appropriate procedure before terminating their employment.

If you've enjoyed this post, please share with others:
About Social Bookmarks

36 Common Software Development Mistakes
2. Weak Personnel

This is an emotive subject and is some situations it is an event that occurs rather than a mistake. How you deal with these situations, however, can lead to the mistake.

Broadly speaking there are three scenarios:

  • Problems outside of the work environment that cause the performance of the team member’s work to suffer
  • Square peg in a round hole - good team member, but wrong role
  • Inexperienced team members

When a team member is having problems outside of the workplace, he or she may not be aware their work is suffering. The important thing is, particularly if they are a valuable employee, to be on their side and offer as much help as possible. However, you need to wear two hats, the other one protecting the development. If it’s suffering you must make changes to protect it. You may need to temporarily relieve the team member of his work load and sometimes allowing him or her to concentrate on the problems outside work will bring these to a speedy conclusion. Don’t allow yourself to be exploited though. A friend of mine has a saying “We bend over backwards for our customers and staff, but never forwards”.

I’ve worked with enthusiastic, keen people in the past, but in a job that’s totally unsuitable for them. This creates stress for them and causes resentment in other team members. My advice is to move them to a role they are suited for within the team or company and if that’s not possible help them find a suitable position elsewhere. Again, even when dismissing someone be on their side as much as possible.

Inexperienced team members that don’t fall into the above category, and are smart and can get things done simply need training, experience and/or nurturing. Bringing inexperienced people into a team can have a detrimental effect and should only be done when the development schedule allows sufficient time for all involved. Bringing them in at the wrong time demoralises both the “trainee” and the existing team members as they won’t be able to give sufficient time generating a sense of inadequacy in the trainee and resentment or guilt on existing team members. Projects with tight deadlines you need to add only highly experienced people, who can be productive almost immediately. Training people is ultimately good for your team and company; the individual being trained will, generally, return the “favour” with extended loyalty and the existing team members involved will grow with the experience. However, it must be planned and budgeted.

I’ve assumed that there are no employment laws to follow, simply because there may be laws in one country that don’t apply in another. You must follow the appropriate procedure before terminating their employment.

If you've enjoyed this post, please share with others:
About Social Bookmarks

36 Common Software Development Mistakes
1. Undermined Motivation

It’s not just software development that suffers from this morale crushing side effect. Sometimes it’s not a consciously bad decision, but events such as a senior manager taking holiday at a crucial part of a project do adversely effect the moral of a team. I’ve seen some shocking examples of this:

  • An overheard conversation between two senior manager: “We’ll terminate one contract a week until morale improves” (this moral boosting tactic started and lead to the majority of contractors in the development team not renewing their contract)
  • Being assured that a large insurance company was OK financially, despite a poor underwriting technique that didn’t look at the sudden rise in claims, to then find in the Sunday newspapers that the firm was technically insolvent

Whether it’s intentional, accidental or incompetence, reducing the moral of a development team will slow progress and possibly create such a bad atmosphere that it can never be recovered from without significant change of leadership.

So what motivates people? It’s not money, although this plays an important part, it’s:

  • Respect - self respect and the respect of their peers and management
  • Making a difference - having an influence in the progress of the company and more fundamentally being listened to
  • Challenge - developers like the challenge of a new development environment (e.g. .NET from C++ and VB6) so it’s important that there is a roadmap for software development that provides this challenge
  • Advancement - this won’t apply to everyone, so developers want to stay as developers and have no interest in management, but in both cases there needs to be a recognisable career path
  • Money - if your team makes the company do well, shouldn’t they be rewarded?
  • Security - most people need to know the next month’s pay cheque is safe. The events at the insurance company I mention above causes a long queue at the fax machine on Monday morning. Having been lied to and not knowing how secure their job was caused most people to abandon work and look for another job
  • Work environment - we’ll cover this in a later classic mistake, but suffice to say smart calm environments are productive. Dirty and noisy environment aren’t

Style of leadership makes all the difference to morale:

  • Understand individual team members - knowing what motivates different team members is vital in having a productive team, make sure you cater for all the team’s needs
  • Celebrate success and learn from failure - I talked about this a lot on this blog, so, so important
  • Give praise - organisations where senior management only appear when there’s a problem will never have fully motivated staff. A long lunch after a successful software launch does so much to strengthen relationships and build morale
  • Be visible - during good times and bad, but be aware that your reactions and expressions in public have a direct effect
  • Stay positive - leaving a successful meeting with a glum face can send all the wrong messages, an a positive view in a storm gives hope to your team, but never manipulate this to give a false impression
  • Generate enthusiasm - enthusiastic teams are generally productive and resourceful, they will try to find better ways of doing things and much more likely to produce better quality work
  • Lead from the front - in good times and bad show that you have control
  • Set goals and achieve them - this is so important for the advancement and challenge aspects of your team’s motivation. Don’t pay lip service to goals, they are a powerful tool, make sure they are well known in your team and company and that you frequently measure progress towards them and make decisions that assist in their realisation
If you've enjoyed this post, please share with others:
About Social Bookmarks