Software engineering is, um, engineering. It takes a logical mind, with an eye toward the intermediate picture as well as an eye for details, to be able to do any good software engineering. When we break down a programming problem domain with a specific application product as our goal, we’re doing the dry work of engineering. Of course, there’s some enjoyment to be had of engineering, for those that have a taste for it. The challenge and competence of the work is a rightful source of pride. The best software engineers, those truly consummate masters of the craft, whose work makes people sit up and take notice, exclaiming their astonishment and appreciation of its elegance, are the most proud of their work, of their craft, and the most prideful of all in that they must before they even begin know — truly know in their hearts — that they can do it better than it has ever been done before. They have a quality, a virtue, that sets them apart from their inferiors in the realm of software engineering: hubris.
. . . and yet, though their skills are necessary to the advancement of the coder’s art, their discipline is but a derivative of a higher calling.
Computer science is, well, hard science. The essence of true computer science — not that business process oriented, Java-centric claptrap that dominates a Computer Science course of study in most universities — is the laws of design and implementation. Computer scientists design compilers based on theoretical programmatic systems demonstrating concepts new and old that are sublime in their purity and fundamental salience to all things programmatic. These are the system builders at the most foundational level, who lay out the necessities of software systems in clear, deterministic terms that others may build upon them to create all the software we see in the world around us. The best among them are driven to these works by their personal need for further understanding, their hunger for the next new discovery, their thirst for knowledge, and their ache and love for the process of discovery. What they have now is never enough, and they rush headlong to the next great discovery. They have a quality, a virtue, that sets them apart from their inferiors in the realm of computer science: impatience.
. . . and yet, though their passions are necessary to the advancement of the coder’s art, their discipline is but a derivative of a more consuming pursuit.
Hacking is philosophy. Just as philosophy led to science, and science to engineering, so too has hacking led to computer science, and computer science to software engineering. Philosophy is the practice of truth, and art as a manifestation of truth is its consequence via the principles of science and the application of engineering. Hacking, in the older, MIT sense of the term, is the practice of elegance in the coder’s art, and that art is defined by computer science, just as it is implemented by software engineering. The hacker’s pursuit is that of living the art, not of understanding or dissecting, nor of implementing or applying. Every act of the hacker’s pursuit is toward the elegant resolution of the problem of work — so long as there is work to be done, the hacker’s work is unfinished, for that work can still be automated away. Computers are here for the sole purpose of doing the grunt work, leaving the hacker to play, though his play is always to refine and expand the ability of the computer to do further work. When work must be done by the hacker, it is done at a level of abstraction that does not require him to get his hands dirty in the actual problem domain, for he can merely do the work of defining the means of solving problems and let the problems solve themselves thereby. Never expect hackers to solve a problem when they can make a computer solve it for them, for theirs is the talent for abstraction and delegation. They have a quality, a virtue, that sets them apart from all others: laziness.
. . . and yet, without a little bit of the computer scientist’s passion and the software engineer’s skill, a hacker achieves nothing.