This is, a manipulated compendium of the most notable quotes, words and ideas of the most brilliant computer scientists we have ever had. Edsger Dijkstra, Ken Thomson, Dennis Ritchie, Alan Turing, Niklaus Wirth, Alan Kay, Bjarne Stroustrup, Richard Stallman, Frederic Brooks, Martin Fowler, Donald Knuth … I have experienced these vivid thoughts as if they were my own flesh and blood many times in my professional career. It is my desire to share with you, written in a sequential and linked order, trying to construct a reasoning related text and not a mere bunch of isolated ideas. I hope you enjoy the reading.
Main idea: All large and medium software projects always tend to fail, be it finishing on time, overbudget or both.
When we talk about the software crisis we are exactly referring to the previous assertion and the fact most software today is very much like an Egyptian pyramid with millions of bricks piled on top of each other, with no structural integrity, but just done by brute force and thousands of slaves. Some, in an humorous mood, think this is due to all programmers tend to be optimists in their estimations, but the reality is that the complexity of software is an essential property, not an accidental one. Hence, descriptions of a software entity that abstract away its complexity often abstracts away its essence.
In the practical world of computing, it is rather uncommon that a program, once it performs correctly and satisfactorily, remains unchanged forever. As a consequence, systems program building is an entropy-decreasing process, hence inherently metastable. Program maintenance is an entropy-increasing process, and even its most skillful execution only delays the subsidence of the system into unfixable obsolescence. And what is worst, contrarily to other engineering disciplines, adding manpower to a late software project, makes it later.
In addition, specifications contribute to software complexity, sometimes extracted from requirements that are ambiguous, conflicting, or incomplete and we must work to resolve, as soon as possible, with a kind of customer that most of the times don’t even really knows what he wants. Be very carefull! even the best planning is not so omniscient as to get it right the first time. The complexity is something inherent to the software building act and it is preferable to convince your customer to work in collaboration over fixed contract negotiation, trying to respond to change instead of a following plan. Obviously the main problem of this desirable approach, it will be the budget deviation and make it understandable to our customers.
Program construction consists of a sequence of refinement steps. One of my most productive days was throwing away 1,000 lines of code. The lurking suspicion that something could be simplified is the world’s richest source of rewarding challenges. The competent programmer is fully aware of the limited size of his own skull. He therefore approaches his task with full humility, and avoids clever tricks like the plague.
If your code its well documented, or better, auto-documented and clean, as a result it will be easy to understand and consequently easy to fix mistakes, verify and maintain. Simplicity is prerequisite for reliability. Remember, any fool can write code that a computer can understand but good programmers write code that humans can understand. It is a common error when programmers sacrifice clarity in favor of execution speed because they often develop software that runs fast, but is error-prone and difficult to change.
Golden rule of software development: Write software for others as you wish they would write for you.
From my experienced point of view the easiest way to debug is to write software without any bugs. Debugging sucks, testing rocks, but remember that program testing can be used to show the presence of bugs, but never to show their absence ! It had to be punishable working in teams not using batteries of unit testing, regressive tests , coverage tests or other similar techniques that serves as an effective premature alert mechanism prompting any important bug coming out from our code.
All inherent problems and complexity related to software engineering and programming always have been there, try to know and identify these problems and avoid trendy and miraculous techniques, methodologies or paradigms without any critical approach. The computer industry is the only industry that is more fashion-driven than women’s fashion. Certainly not every good program is object-oriented, and not every object-oriented program is good. Quality programming is usually taught by design patterns and good examples. We have thousands of free software projects with tons of wisdom hidden among their lines of code. Please take advantage of this, don’t be a fool ! There are lots of different tools and languages. Open your mind ! You must perform like a plumber, for every job, there is required a tool or set of them that best suit to complete successfully the work.
It is important to be good working in a team and learn to write. The ability to communicate your ideas to others will aid you more than anything else you will learn, and make you more valuable to employers.
Study after study shows that the very best designers and programmers are A+ team players. They produce structures that are faster, smaller, simpler, clearer, and produced with less effort. The differences between the great and the average, approach an order of magnitude.
From my point of view as a consequence of all having said before we can state that a good programmer is someone who:
Loves to code in a creative way and it’s ready to get things done rather than only speak. Continuously refactors code in a leveraging way trying to make it faster, smaller, clearer, simpler, more general and produced with less effort. One that don’t reinvent the wheel, reuse code and use design patterns that are the smart experienced solution of many programmers that have had the same problems than you, maybe many years before you were born. A good programmer is a A+ team player and writes tests because its preferably over debugging and wasting lots of time verifying manually the correctness of the software. He is alway prone to reuse good third-party code and to develop, using either as a base or inspiration, good quality free software. From the engineering point of view you must love free software because is the greatest source to learn by example. A good one, should focus on usability and writing maintainable code. Be able to code in any language and choose the right languages and tools that best fits for every different project. We can’t use a hammer for all kind of works! Definitively, a person that should be instructed thoroughly and know more than basic computer science.
We need good programmers (A+), they are the most promising weapon to fight against software intrinsical complexity nature.