by Prof Barry Dwolatzky
In my role as Director of the JCSE at Wits University I have, over recent years, been interacting with a large number of South Africans who earn their living as software developers. In some of these interactions I’ve had the opportunity to formally assess their skills and abilities. I’ve been shocked to find that some – a small but significant minority – of our “professional software developers” find it difficult to write working programs – even simple ones. Some of these developers have degrees and diplomas in IT-related disciplines from local Universities and Universities of Technology.
As an academic responsible for educating software developers, and as a person deeply concerned about the successful future of the South African software sector, this situation has troubled me deeply.
What is a “software developer”?
Before I go any further, let’s be sure that we’re on the same page with respect to terminology. I understand the term “software developer” to refer to the individual at the sharp end of the software industry entrusted with the task of putting hands to keyboard to write software. In the past we called these people “computer programmers” – (I’m not sure when and why they were rebranded as “developers”).
We can debate in some detail the set of generic and specific skills that a “software developer” should have (I will come back to this later). There is however one absolutely critical ability that (in my mind) is never negotiable. A software developer must be able to write a program! In other words he or she must be able to convert a specification or requirement into a set of instructions in a “programming language” (of some sort) which can then be run successfully on a “computing device” (of some sort).
Although this may seem obvious, let me expand on this last sentence.
Suppose, as a very simple example, that the “programming language” is C++ and the “computing device” is a PC. The specification might say “Read a set of numbers from a text file. Add them up and write the total to another text file.” Anyone who calls him/herself a “C++ software developer” must – in the very least – be capable of translating the specification to (something like) the following:
The C++ developer must also be able to get this program to run successfully on the target computing device. This will require compiling, loading, testing and (possibly) debugging the above program.
In modern software development, there are many different languages, environments and devices. Developers need many specialized skills and abilities. However, any developer, must be able – in the very least – to do something conceptually equivalent to the task described above. The target language may be very different from C++. The target device may look very different from a PC. The specification may look very different – it will undoubtedly be much more complex. But every software developer needs to be able to successfully translate a specification into a “program” that can run on a “computer”. I’m sure that no one will dispute this.
Other generic and specific skills
Given that a “software developer” can write a working program, what other skills should they have? This is a topic that I’m sure we could debate for a long time. My suggestion would look something like this:
Generic skills and abilities
- Detailed design: Any software developer should be able to develop a number of alternative detailed designs that would satisfy a given requirement. He or she should then be able to examine these alternatives and select the one that best meets the requirement. In many cases the requirement may correspond to a small piece of functionality and the design options may be relatively simple.
- Unit testing: The developer should be able to test the program that (s)he has developed. Test cases may be given as part of the requirement. They may also have to be devised by the developer. In either case the developer will need to run the tests in a systematic way and record the results.
- Documentation: The software developer is responsible for low level documentation. In many cases these are added to the code being written in the form of comments.
- Estimation: If asked the question “How long will it take you to write a program to do X?” can the developer provide an estimate? (S)he should be able to do so with some degree of accuracy. Furthermore, what is this estimate based on? Is it an “educated guess”, or is it based on data collected by the developer from previous tasks?
Specific skills and abilities
- Different software developers need a vast array of specific skills relevant to their specific technical environment. They also need to have some understanding of the domain (eg. financial services, health care, etc.) in which they are working. Many of these skills are acquired “on the job”. They are not taught at universities and colleges.
The problem we face
As I said in my introductory comments I have a concern that some of our local “professional software developers” do not have the “entry level” generic skill of being able to write a program. If this is true then none of the other generic and specific skills really matter.
My concern, however, is based purely on a perception gained in interaction with a number of developers over recent years – it is not based on any research I’ve done. I may be wrong!
My question to you – the readers of this blog is: Do you share my perception? Can all professional South African software developers write a program? If (in your experience) they can’t, what should we be doing about this? Is it a problem? Am I wrong to assume that “software developers” need to know how to program?
I would welcome any comments on this issue.