A Computer Scientist is one who knows the type of everything and the value of nothing.
With the caveat that there’s no reason anybody should care about the opinions of a computer scientist/mathematician like me regarding software development, let me just say that almost everything I’ve ever heard associated with the term "extreme programming" sounds like exactly the wrong way to go...with one exception. The exception is the idea of working in teams and reading each other’s code. That idea is crucial, and it might even mask out all the terrible aspects of extreme programming that alarm me.
– Interview with InformIT magazine, April 25, 2008.
Gang of Four
No discussion of how to use design patterns would be complete without a few words on how not to use them. Design patterns should not be applied indiscriminately. Often they achieve flexibility and variability by introducing additional levels of indirection, and that can complicate a design and/or cost you some performance. A design pattern should only be applied when the flexibility it affords is actually needed.
– Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides, Design patterns: elements of reusable object-oriented software, p. 31. Addison-Wesley, 1995.
Because the word "nondeterministic" has a double meaning, it is perhaps desirable to make clear that nondeterministic algorithms are not probabilistic, random, or Monte Carlo algorithms. Rather, they are convenient representations of systematic search procedures. From one point of view, a nondeterministic algorithm represents a method of thinking of computer programs as being in part governed, not by efficient causes (causes which precede their effects) but by final causes (goals: causes for the sake of which their effects are carried out). Achievement of success and avoidance of failure is the goal of a nondeterministic algorithm, or, more precisely, of its imagined processor. One may say of the nondeterministic algorithm for the four queens problem, for, example, that when col is equal to 1, row will never be chosen equal to 1 in a computation of the algorithm, because there are no solutions having a queen in the corner, and the goal of the processor is to find a solution. We may say that these algorithms are nondeterministic, not in the sense of being random, but in the sense of having free will.
– Robert Floyd, 'Nondeterministic algorithms', JACM 14, 4 (October 1967), pp 636–44.
It certainly has its good points. But by and large I think it’s a bad language. It does a lot of things half well and it’s just a garbage heap of ideas that are mutually exclusive. Everybody I know, whether it’s personal or corporate, selects a subset and these subsets are different. So it’s not a good language to transport an algorithm—to say, “I wrote it; here, take it.” It’s way too big, way too complex. And it’s obviously built by a committee.
Stroustrup campaigned for years and years and years, way beyond any sort of technical contributions he made to the language, to get it adopted and used. And he sort of ran all the standards committees with a whip and a chair. And he said “no” to no one. He put every feature in that language that ever existed. It wasn’t cleanly designed—it was just the union of everything that came along. And I think it suffered drastically from that.
– Ken Thompson, interviewed about C++ for the book Peter Seibel, Coders at work, Apress, 2009.