abstraction, computer programmers, computer programming, software, software design, software development
Software development can be hard to describe or compare because it depends so much on the use of abstraction. One can visualize a continuum of professions based on how much abstraction they tend to require from their workers. Software tends to be on the far end of that spectrum. Not only do programmers deal almost entirely with abstraction, but often with multiple layers of abstraction!
Many professions focus on concrete objects: doctors and workout coaches focus on bodies, chefs and farmers focus on food, jewelers and miners focus on gems. Police, fire, nurse, EMT, social workers of many types see people in need. Factory workers make concrete objects; sales people sell them; marketers advertise them; technicians fix them; maintenance crews clean them and junk them.
Other professions deal with a bit more abstraction. Architects and Mechanical Engineers, for example, deal with drawings and models, which are abstractions of buildings or machines. They start from pure abstraction — the idea and design — and work to build a concrete thing. [In passing, computer models and 3D printers have made the abstractions much more concrete. We’ve come a long way since faded blue prints.]
Lawyers and accountants deal even more with abstraction; “the books” only record the abstractions of justice and cash flow. Even the objects of their professions — clients and businesses — can be abstractions. A corporation is an abstraction, yet recently they have been granted legal “person” status. Still, at some point business and law comes down to people and things; that’s where it becomes completely concrete.
Composers, poets and other artists are also heavily into abstraction. As with law and accounting, the paperwork (the sheet music, the written poem) often just stands for the real product. Artists have in common with architects that they design a product from an idea. The final design is an abstraction represented as lines, notes or words on a page (or bits stored in memory). Architects go on to realize their design by building it; some artists build their design, others perform it (some may record the performance). In some cases, a book for example, the design is copied and others bring the design to life by reading the text.
Mathematicians and theoretical physicists are entirely in the realm of abstraction. In some cases — 11-dimensional objects for example — a concrete object is not even possible in the real world. In other cases, the energies, distances or times involved are far beyond our ability to actually see. They may be concrete objects, but we’re not likely to see one any time soon.
Just as artists and architects share aspects of their professions, you should see that software workers have traits in common with those who work with abstraction.
Software workers are similar to architects and artists; they design from an idea, a pure abstraction. But once completed, that design is the product. Software is like a book; the idea becomes the final product, and that final product almost magically becomes as many copies as desired. The only production cost is the physical cost of making the copies, plus the cost of distributing them.
Also similar to books, software is read (or run). More than just read, the software design is performed every time you run that software. The software design that is your browser (Chrome, FireFox, IE, Safari, Opera, et alii) is performing right now, acting like a browser, which is how you can read this article.
Software workers are like lawyers and accountants; they deal with “the law” (various software standards, protocols and requirements) and “the books” (databases used for all sorts of things, source code management systems, documentation). And an extremely high degree of precision is called for while doing intellectual tasks.
Writing software may be like writing a book, but it requires the precision of an accountant and the iron-clad logic of a lawyer. No typos or grammar errors are allowed, and the story has to make good sense!
Lawyers and doctors require massive educations to even begin to be useful professionally, and they spend a lot of their time staying current with their profession. Software workers are the same; considerable education (and experience) is necessary to be a useful coder, and our profession changes at a fast pace. (Remember when C++ was the hot language? Remember Zip drives?)
And is there anything as abstract as a computer program? The physical computer is a manifestation of all sorts of abstractions: the logical units of the CPU, the memory model, using voltages to represent ones and zeros, the math and logic built on all those. Software designs are built with computer languages, each a huge abstraction based on an abstract virtual model. The data structures used in software are all abstractions.
Ours is a profession that requires education, intelligence, experience, constant learning and the ability to deal with a great deal of abstraction. There is definitely a “right stuff” necessary to be a good coder.