Falsely skilled developers
Big Bill Ryan noted this post:
http://www.notestips.com/80256B3A007F2692/1/TAIO-5WJFRN
about Falsely Skilled Developers who specialize in copying (and at times stealing) code without taking responsibility for its correctness...indeed and in many cases, the unfixed bugs are a good excuse: "me no write dat code".
Technical reusability (copying code) is cannibalistic upon true reusability (implementing solid algorithms from the responsible computer science literature). It has its place but one of the most primitive ways of "software reuse" is to copy "code snippets" and hope.
Unfortunately, the management culture of "today is more important than correct" and "never reinvent the wheel" is complicit in this phenomenon.
I err when I err (for we all err, don't we) in the opposite direction as a member of the Build Your Own school. There are plenty of solid objects and solutions out there that CAN be successfully reused. I need to do more due diligence in finding these.
But, there's also a lot of dreck. Indeed, Gresham's Law (99 percent of everything is crap) would tell us to do Due Diligence before reusing code.
Furthermore, the discourse of "don't reinvent no wheels" is a Planck's Constant with that curious timeless quality of so many MIS and computing memes (in a field where you can go to high level management-oriented bun fights and hear the SAME clarion calls for "reusability", and praise of the User and condemnation of the programmer, you heard in 1979).
My supervisor at Motorola told me, in 1979, that all possible compilers existed at that time.
The discourse is Panglossian (where Dr. Pangloss was the prof who proved to young Candide that we live in the best of all possible worlds shortly before young Candide gets whacked by the great earthquake of 1755 in Lisbon). Looking at it in slantendicular Frog style, it has a simultaneous technical purpose and a social and disciplinary function.
For in a sense, the world needed Turbo Pascal in 1981, authored by a fat but penniless French (French?) immigrant named Phillipe Kahn in 1981, two years after my boss (der Kaiserin) told me I was a foolish varlet.
It protects existing investment, for a good reason, a bad reason, or no reason at all.
Having said this, however, I concur with big Larry Ellison, the CEO of Oracle that today, conditions are very different from 1981. We probably don't need many more commercial compilers.
But the skills deficit that the poster points out needs to be addressed by emphasizing the ongoing need, at times, to allow micro reinvention of wheels in order AT A MINIMUM to preserve skills ... that are known to be atrophying in America, where computer science enrollments are declining and where jobs are offshoring to places like China...perhaps because in China the education system encourages the reproduction of tradition and not the idea of getting rich by creating something which (as did Turbo Pascal) manages to startle investors...who did not know that Pascal was implemented in 1974.
Furthermore (and this is my view, not that of Big Bill Ryan), the skills deficit is associated with a morals deficit.
It starts with copying "open source" solutions into a closed source solution where the open author has said this is not allowed.
And, most alarmingly, it seems to have ended with a variety of hacks and "mathematical errors" in Florida and Ohio during the recent election...which, contrary to a merely statistical explanation, favored the re-election of a President...when early exit polls indicated a Kerry victory.
For let us not speak falsely now the hour is much too late.
The problem with a "craftsman
The problem with a "craftsman's" imperative is real.
It is that consistently throughout industry, "cost-effectiveness" is self-reflexive and must be internalized by the craftsman, and "cost-effectiveness" destroys craft.
It would not do so in a (mythical: Utopian) world not run on investment capital; but the reality in a competitive marketplace is that the craftsman's imperative is in real contradiction to the fact that without exception, the businessman needs the artisan to seek the cheapest not the best alternative.
Programmers are permitted, to be brutal, to imagine that they form a craft or a guild.
But one never reads even of the existence of this entity in the MIS or business press except insofar as it is The Problem, a gang of scruffy malcontents at odds with the purity and the clarity of the intentions of an abstract and singular User.
Except in Scandinavian countries, the idea of a partnership between this guild and management is a non-starter because in fact the guild claims a right of management control.
When I lay bricks or pull cable for a man, I can do the best job of bricklaying or cable pulling without my work ever ascending to the state of craft. All the boss wants is for the bricks to be laid neat and true, as Tom Hanks lays 'em in his recent film The Terminal, where as a penniless immigrant, trapped in JFK, Hanks takes over a job site to do the best job he can.
But by definition, code can never reach this point in a stable manner, although many programmers, in referring to "solid" code, would like it to, and return to a simple, honest relation with their employers like that of their grandfathers.
This is because code is writing and worse it is law (cf. Lessig).
To get to simple workmanship it has to overshoot and essentially upset the applecart.
This is because the User never has that clarity, indeed purity, of intent which would be represented, one for one, by solid code.
There is in any "enterprise" system in our society an element of double-dealing, of impurity of intent, and of struggle amongst different user cabals which is NECESSARILY reflected in the code.
As such, a guild of programmers which insisted on workmanship would be a revolutionary guild merely by insisting on clarity and bug freedom.
But as it is, programmers who construct robotics cannot, it seems, even enforce Constitutionally anything like Asimov's law (no robot can kill a human being): for one of the major applications of robotics is military, where Asimov CANNOT be a "law".
As to your point about code-in-books: I agree. I got flamed on Amazon for not delivering full code generation to the .Net CLR. Having sweat bullets at the YMCA delivering a full front end as 26K lines of code, I was amused at this charge, especially because the code was written consistently using Option Strict (the VB.Net construct enforcing C# type discipline) and a set of documented standards...including my own invention of a way to implement stateful objects consistently.
But, I decided on a rather superficial treatment of code generation because of the existence of good books by Katy Dollard and Serge Lidon on this matter. Which was seized upon, as a flaw.
Because programming is writing, the fabricator, who would like to be thought of as an honest, gruff craftsman in the Heideggerian Nordic mode, is instead an untrustworthy scribe whose very proximity to old Pharoah makes him simultaneously invisible and a danger.
Programmers in other words need to realize how others view them from the outside. I know from vast experience that programming "feels like" craft since before learning to program, I taught myself art forms including egg tempera.
But in fact (cf Lawrence Lessig, CODE and the Laws of Cyberspace) programming is a form of law which forces people to do things they don't want to do.


Laziness, Apathy, and the Morals Deficit
I agree with your assessment, Edward, that blind re-use of code is indication of a "morals deficit." Here we come back to what I call the "craftsman's imperitive," which is, put simply, to give a damn about doing a good job. Part of doing a good job as a programmer is to understand exactly what it is you are doing. If we blindly re-use something without understanding how it works (at least at a high level) and verifying that it is soundly constructed, then we are demonstrating laziness and apathy. There is no room for laziness or apathy in programming. Even if you hate your job and desire to perform poor work to spite your employer, there is a higher responsibility to not introduce more bad code in the world.
Edward points out two re-use scenarios: re-using code snippets and re-using packaged artifacts like components and frameworks. In the case of snippets, I would not be able to sleep at night if I just grabbed a snippet from somewhere, pasted it in, and went on my merry way. At the very least, I need to rewrite it so as to convert it to whatever naming and error handling standards I'm following. More importantly, though, rewriting it ensures that I understand it. It would be irresponsible of me to just paste it in blindly.
In the case of components, though, re-use is the whole point. However, because a component is largely a black box, there is an element of trust involved. I have to ask myself, "Do I trust the person or company who created this component?" Even if the answer is "Yes," if it is a publicly available component I will first search usenet and the web to make sure there is not a preponderance of negative opinion about the component.
A separate, yet related, rant: crappy sample code included in books, and also crappy sample code shipped with products (especially Microsoft products), drives me crazy. The vast majority of code that I've looked at from books and purchased products (like components and frameworks) is just bad. Even in the case of some otherwise really great products and books (whose names I will omit), the sample code is just crap. It's not just that it doesn't work (because it usually does, since somebody at least tested it), it's that it looks and reads like crap: bad variable names, poor cohesion and coupling, bad or no exception handling, etc. Not only does this bad sample code set a poor example for the developers who are learning by reading the code, it ends up getting copied and pasted and propogated even further.