Journal Articles
Browse in : |
All
> Journals
> CVu
> 123
(22)
All > Journal Columns > Professionalism (40) Any of these categories - All of these categories |
Note: when you create a new publication type, the articles module will automatically use the templates user-display-[publicationtype].xt and user-summary-[publicationtype].xt. If those templates do not exist when you try to preview or display a new article, you'll get this warning :-) Please place your own templates in themes/yourtheme/modules/articles . The templates will get the extension .xt there.
Title: Professionalism in programming
Author: Administrator
Date: 05 May 2000 13:15:36 +01:00 or Fri, 05 May 2000 13:15:36 +01:00
Summary:
Body:
It's Saturday night and you are settling down with a tub of popcorn and a couple of drinks to watch a video. Maybe you've managed to persuade some unsuspecting non-computer nerd to watch it with you (you didn't tell them it was Star Wars, did you?)
The production that you're watching is undoubtedly the result of an enormous amount of effort by more than one dedicated team of people, all working together to create the final movie. Although you cannot necessarily see it, there have been many, many man-hours (man-days, and 'mythical' man-months) put into the product.
Although when you see some films do you wonder if they should have bothered.
Compare that vast coordination of effort to how we write software. We may like to think that given enough time we could create an entire 'professional' software package. But if you were to try to create a movie on your own the result would be somewhat poor (to be polite). The 'Blair Witch Project's of this world are few and far between; and even though that film involved very few people to create, to get the final product to your video machine took marketing, distribution, and more.
In most professions, good products are almost always the result of good teamwork.
In this column we will examine teamwork as it applies to us, as programmers. What makes for good teamwork? How can we be more effective in our teams?
Over the years there have been many different types of software teams working together to produce software products. They range from the highly formal teams (suits in offices) with a rigid structure and process to the 'new frontier' work of the open source movement, as characterised by the Linux kernel effort where anyone can contribute to the software.
Both methods of working have had great successes. Both have had great failures. The Linux kernel and the IBM OS/360 are notable successes for each camp. The Ariane 5 is a legendary flop and Mozilla is an interesting 'open source' flop - when Netscape open sourced its code it was expected to result in rapid development and improvement. It is fair to say that the Mozilla development has been somewhat disappointing compared to other open source projects.
Being a good software engineer is more than just being a good programmer. It is not enough to be able to write code that computes 'pi' to some ridiculous accuracy in less than ten lines of C. There are many other skills required. And one of them is teamworking.
There are a number of different metaphors that can be used to describe our teamwork. The problem with metaphors is that they are only useful up to a point. Software engineering has its own problems and challenges. Chemical engineering is different to civil engineering, which is different to making a movie, which is different to writing software.
One metaphor that we often employ in this context is that of building. In as far as it goes it is a useful metaphor. After all, we 'construct' the software, according to a plan, from different components (some of which we build ourselves, others which we buy/bring in).
So let us have a look at the building metaphor in a bit more depth and see what it can tell us about our own profession.
Maybe you could build a small outhouse (and plumb a toilet in there if you are particularly good) on your own initiative, but you will be working for a very long time before you build an out-of-town shopping centre.
It is not hard to write a specific command line utility, or a simple software package (say a drawing package or some such) and many people have done so. However to construct something of the nature of today's enterprise-level highly complex software super structures takes more than an individual has to give.
The team is working together to finish the construction work. Not only do they have the target in sight, they must reach it within certain time constraints. It is part of the building work specification that it will take a certain amount of time to create.
There is a frighteningly strong parallel with 'building' software here. How many large constructions take longer than expected to complete? How many programs are delivered on time?
Someone (or rather, some company) will have contracted the builders for the work. They do this because the builders are skilled at building where they are not. The construction company specialises in construction. Their reputation is based on the quality of their building work.
Once the building is complete there are users who will occupy it and use its facilities. The building has been created to serve a specific need.
All software is written for users for a purpose. In many cases the 'customer' for our software may be another part of the same company (many commercial banks have huge software teams working on their electronic infrastructure). However, a particular development team is commissioned to do a set piece of work for a set purpose.
There are many people involved in the building's construction, and each one's work is important. The building would not be completed if they did not do their particular piece of work.
There are different roles within the team. This is a natural thing and boosts productivity (as first observed by the Scottish economist Adam Smith). Each member of the team is skilled in a particular field. They each play a different part in the creation of the final product. They have each been trained to do their task, and their skills improve with experience.
There are the architects who envision, design and specify the building being constructed. They need to write detailed plans to convey their vision to those who are going to implement it.
There are the builders, the plumbers, the electricians who do the building work. There may be many people working in these roles (depending on the size of the construction) organised by a manager.
In software we too have architects, whose blueprints are the software specifications. Programmers implement these specifications - paralleling the builders, plumbers and so on.
If a builder has architectural skills, it is not appropriate for him to ignore the plans and rearchitect his allotted piece of work. That is more than incorrect practice, it is downright dangerous. His work will not fit in to the overall building plan. When someone comes back to maintain the building, it does not match the architect's plans. The rearchitected work is unlikely to fit properly with adjoining bits of work - this may lead to structural weakness. The building will lack the overall consistency of the single architect's vision.
The foreman is the people manager. He looks after each person's role, and ensures that the work is progressing to schedule. He, along with other managers take responsibility for the work being undertaken - both in terms of quality and timely delivery.
Building work cannot proceed without the necessary raw materials. This is in addition to the requisite amount of time and labour. Without the building supplies, the building simply will not be possible - it's hard to build a wall without bricks.
Without the electricity, computers, test-equipment, bought-in components and so on, our work would not be possible.
The hods and JCBs of our trade are our compilers, our IDEs and our software libraries.
If each team member works harder and tries to produce their work to a higher standard, exactly to specification, then the overall building will be of a higher quality. Each team member needs to contribute to the best of their ability for a truly successful outcome. Good software depends on good software engineers skilled at their tasks. A programmer who writes non-future proof code will diminish the overall quality of the end product, even if he is only working on a small part of it.
But, of course buildings are different from programs. (And you do not see many programmers revealing their 'bum cleavage', do you? If you know otherwise I do not want to know about it.)
Buildings cannot really be developed in an iterative and incremental manner. Any change to a building's specification will result in costly demolition prior to rebuilding. In our world of 'pure thought stuff' we can tear down and rebuild with very little material cost (but with the costs of time and labour). In software we are better able to build abstract interfaces between certain software blocks. The engineering discipline is different, but that does not mean we cannot learn from the parallels with other professions.
So what are the kind of teams that we work in? For a typical software engineer there will be participation in a number of levels of teams, each with different dynamics and requiring different levels of contribution.
Say you are working on a component of a larger project. The component may be written by just yourself, or a team of a few people: team one. The component will fit into a wider product. All the people involved with this product (maybe some hardware, some software, and other non-engineering roles such as marketing) form team two. You are also part of a company that may be working on many different products simultaneously. Team three.
Although the company is a team it is really not unusual for it to be layered with a 'them and us' mentality between departments and groups. Is this good? Is it conductive to good product created on time and within budget?
A company's management team 'dictate' the strategy which affects which products the engineering teams produce. If this vision is not shared and justified to the company members it will not feel like the company's vision, just something management are enforcing. This kind of atmosphere can lead to a build up of resentment between parts of an organisation - therefore a drop in effectiveness in working as a cohesive team.
So what skills do we need to be effective team workers? What does it mean to be a good team worker?
Teamwork is a skill acquired over time, no one is born with what it takes to be successful in a winning team. However, it is clear that there are some people who are more adept at it than others.
Different skills are required from each different role in the team. However, presented below are a list of skills that each member really should have.
Teamwork is dead without communication. The parts cannot move as a whole without communication. How can the goal and vision be shared without communication.
Projects really do fail because of a lack of communication.
Inter-team communication occurs in several ways: conversations between individual engineers, phone calls, meetings, written specifications, email correspondence. Each has a particular dynamic and use.
Communication should involve (or at the very least be visible to) all relevant parties. It should be sufficiently detailed, but not consume too much time. It should be performed in a suitable medium - for example the recording of design decisions should be in a specification, not by word of mouth.
In addition to inter-team communication there is also the important aspect of communication between teams. The classic exemplary scenario of bad communication in practice is between a company's marketing department and its engineers. If marketing do not ask the engineers what is possible they will sell products that the company cannot make. This kind of problem is cyclical: once it has occurred once, the two teams are less likely to talk to each other (due to resentment) and it will just happen again and again.
This is an essential characteristic, and often the most lacking in our profession.
You cannot want to hoard all the work for yourself - it is just not possible for one person to do everything. You have to be willing to let another team member contribute - even if it is something you want to do.
Humility also implies actually wanting to make your contribution to serve the team, not slacking off to let others do all the work. You should not only listen to the opinions of others, but also value them. Yours is not the only solution. You do not necessarily know the only, or the best way to solve a problem.
We have to be realistic: some people cannot help grating against each other. In this kind of situation, we have to be mature and responsible in our attitudes, and learn to resolve potential conflict situations. Conflict and animosity severely degrade the performance of a team.
This does not just mean learning new technical skills, but learning to work as a team. It is not always a God-given gift.
Ask yourself what can you gain from your peers? Learn from what they know, learn from what they are like, how they react. Learn to communicate with them. Seek criticism from them at all levels, from the formal code review to their passing opinion on something your thinking about.
Good teamwork builds the project and also builds the team. Part of building up the team is for each member to be learning as they work. For this to happen each member should seek to share their skills, where appropriate.
This is tied closely with learning.
If the team has a need no one can currently fill and doesn't have the ability to bring in an outside resource a solution needs to be found. Adaptable people can learn the new skills quickly to be able to fill the need and serve the team. It can also be beneficial for them to learn the new skill.
If you commit yourself to perform a bit of work that you know you cannot do, or later find out that you do not have the skills to complete (and you cannot realistically learn them in the given time scales) then you should make your manager aware of this as soon as possible. Otherwise, you will fail to deliver your piece of the project and the whole team will suffer as a consequence.
Many people see admitting that they cannot do something as a weakness, but it is not. It is better to admit your limitations than to be a point of weakness in the team. A good manager should provide some extra resource to help you do the work, and along the way you will learn the new skills that you previously lacked.
We have investigated what skills are required to be a good team player. But what overall factors make for good teamwork? There are a number of other influences that will radically affect the effectiveness of the team at working together, and the quality of the work produced by the team as a whole.
These include:
-
The correct spread of people with the correct range of appropriate skills.
-
Team members with a range of experience, some able to learn from others (a whole team of newbies will clearly be doomed from the start).
-
A clear and realistic goal (even better if it is an 'exciting' project that the team members really want to see completed).
-
Motivation (whether financial or emotional).
-
Suitable specifications available as soon as possible for each member to work to that will ensure individual pieces of work fit together.
-
A good manager.
-
A small a team as realistically possible, but no smaller
-
A clear software engineering process for the team to follow.
-
Complimentary team member personality types - to success the team needs encouragers not people who will drag morale down.
-
Backing from the company, not hindrance.
-
Luck.
The whole is greater than the sum of it's parts, or so the saying goes. This is, of course, only true if the parts are each working well. If each part is failing then the whole will fail.
Good teamwork comes from more than just a well defined process or a fixed structure. Good work stems from good individuals. A professional programmer has to be able to work in a team. As well as being technically skilled they must be able to create a component that will fit as a piece into the larger jigsaw. This means being able to communicate and work with others. This means understanding your role, and carrying it out appropriately, working to the best of your ability. It means looking out for other team members, being team-focused, not self-focused.
Maybe you would like to consider your past experiences of team work. Which do you think went well? Which did not? Can you characterise the reasons why or why not? Maybe you would like to share them with the C Vu readership.
Notes:
More fields may be available via dynamicdata ..