LinuxAsmTools - Is Codding hard?





For 50 years we have worked at improving the software development process and little has changed. Why is software development so hard?

This is the question posed by the book "Dreaming in Code"(published in 2007). The book states over 66% of all projects are either canaled or miss their targets by a wide margin. At the same time optimistic programmers are touting new techniques,languages, and tools that will solve development problems.Why do these new tools and techniques have little impact?

The book "Dreaming in Code" did not have any answers. They ended by saying : "coding is hard". I, on the other hand, am one of those optimistic programmers who thinks the answer is obvious. The rest of this essay presents my case.

First, my credentials. I've worked on about a 100 projects since 1967.  This has included large projects, small projects, many  failures, and a lot of successes.  The fact that the success have some things in common and the failures also share traits gives us the clues to begin our quest. We can assume if some projects are successful then there are answers to be found.

Postmortems of failed projects have one thing in common. Lots of problems and over optimism. The problems range from budget constraints,  design errors, poor skills, shifting requirements, and just about anything that could possibly go wrong. The conclusion is obvious; software projects can be complex. Thus, the answer must involve reduction and management of complexity. Seems obvious, but tell that to all the language and tool developers who felt they were solving the problem. Also, tell the methodology folks and those who pushed good programming practices.

Have we focused on the wrong problems for the last 50 years? I think we have. The answer is right in front of us and it is being ignored.

We know that the coding process is sometimes a small part of big projects. Successful projects almost universally recognize this fact. This gives us another good clue.

We also have lots of facts showing great diversity in programmer skill levels, and adding more programmers often kills a project. We know about open development projects and ego-less programming. We also know about modular programming and splitting a project into definable tasks.

Even with all this knowledge, our problems have persisted. So, what is the answer?

Where we failed is in process. The old idea of breaking a project into phases (designi, code,  test, integration) is part of our problem. If we look at the problems we see design problems and integration problems throughout the life of some projects. In some cases prototype code is done before design. We are sometimes forced to do bottom-up design and sometimes we use top-down design.

What we need is a continuous and ongoing design effort that eventually verifies and tests itself against the coding effort. This is the major component of our new mind set.

The design team are the only group that can access the impact of changing requirements, design changes, problems, testing, and performance issues. This is an area that has not been given adequate attention on most projects.

For small projects by one individual, the same conclusion applies. Any project or module that can be handled by one coder,requires they wear two hats. Those hats are system engineer(design) and coder. Both hats must be worn concurrently.

OK, all this has been said before and used on projects, what's different?

What if we actually did system engineering and veiwed it as a major skill set.  That would be different.  We could also stop trying to simplify the job of system engineer and simplify the project instead.  Obviously we have done a poor job of managing complex software projects.  That can only mean we need better management skills and possibly a new model for software projects.  I think both are needed.

Once again the answer is mostly process. Our design (system engineering) effort needs to build a project model and review it continuously. For a single person project, this may a simple list of tasks and measurements. For big projects it might be simulations and test stubs. It would include schedules, and anything used to evaluate progress.

The size of the design effort would be based upon the number of unknowns. The unknowns include things like hiring programmers, new tools, and possibly changes in the weather.

Small projects may spend less than 20% of the effort on design. As the project size grows, so does the design (system engineering). A large project may be over 80% system engineering.

Another big change in mind-set would be the merging of system engineering, integration, and evaluation. Often these are separate efforts. What folly, asking non designers to integrate and evaluate a design is usually a disaster. At best it is a costly and slow process. Many projects ask the programmers to do evaluation once the coding is done. This approach sometimes works, but would be better as a parallel process handled by the people who designed the project.

There is one hole in our conclusions so far. A poor design team can add complexity and unknowns to a project and make it fail.The answer is to develop standards for system-engineers similar to what can be found in many areas of engineering. We need a job classification called "software system engineer" and it needs to have basic standards.

In summary, we need to stop asking coders to do system design. A few have the skills for system design, but most do not. We also need to develop the process and knowledge base for system designers. Some questions we may want to give our prospective designers are:

When does a project need to use a design language?
How do determine the benefit of developing a prototype?
How do we measure project complexity?
How can we develop schedules if dates can not be determined?
How do we split projects into pieces and manage each task?
What are the project goals and how will they be acheived?

These are very common questions asked by projects and essential to success.  It is also the area where we are currently failing.




Fork me on GitHub