1 Critique of "No Silver Bullet" Olinga K. Abbott Introduction "No Silver Bullet" expounds Brooks' ideas about the causes of and solutions to software complexity. The article consists of four principal parts, each with their own subheading (paraphrased): essential difficulties of software engineering (SE), past breakthroughs in SE, ideas fallaciously believed to be solutions to software complexity, and best hopes for the future. "No Silver Bullet" consists of mostly opinion. Brooks speaks from experience. No formal research appears to have been undertaken to write the article, and citations are few. The article was written in 1987. Fourteen years in computer time is virtually equivalent to eternity. Even so, the article holds up rather well. Most of the problems Brooks describes with software complexity remain today. Brooks was perhaps a bit overly pessimistic; he considered the state of software engineering at the time to be in crisis. Using Brooks' analysis, modern, even more complex software should be at a developmental standstill. Yet the cycle of software development continues apace. Due to the Internet's tendency to quicken everything it touches, software development cycles even show a shortening tendency. The format of this critique is too short for a point-by-point examination of the source article. The author extracted a few points Brooks makes and examined those more closely. 2 "Essential Difficulties" The software profession widely recognizes the four difficulties Brooks mentions - complexity, conformity, changeability, and invisibility - and little can really be said about them. Complexity seems to be the most important difficulty, and underlies most of Brooks' later commentary. "Past Breakthroughs Solved Accidental Difficulties" Again, the software profession widely recognizes the three breakthroughs Brooks describes: high-level languages, time-sharing, and unified programming environments. Identifying these breakthroughs is relatively easy because the observations are made in retrospect. "Hopes for the Silver" Brooks displays a healthy skepticism in this section. Discussion of the subheadings of this section follows. Ada and object oriented programming (OOP) These two sections are really too dated to be useful. ADA is quickly losing popularity, Simula-67 is virtually dead, and C++, the OOP language with the largest following (perhaps now being eclipsed by Java) receives no mention. The distinction between abstract data types and hierarchical types dumbfounds this author. C++ templates and Java possessing root classes address the problem of "type-specification underbrush" Brooks addresses, so OOP may be more beneficial than Brooks thought. Artificial intelligence (AI) and expert systems Brooks dismisses AI because, he says, AI work in one field does not carry over to another. Brook's conclusion evokes skepticism because pattern recognition appears to underlie a great amount of human intelligence. If researchers solve 3 the problem of pattern recognition, which will require massive parallel computing, and if researchers establish that pattern recognition really is the key to intelligence, AI will have potential in almost every field of computer software. Abstract thinking, perhaps the other piece of the foundation of human intelligence, will still be a problem, but effective pattern recognition may provide at least give an order of magnitude betterment in computer AI. Automatic programming and graphical programming Brooks did well to express his skepticism of these gimmicky ideas. Brooks leaves out one important point: many developers dislike "sloppy" graphical programming using mice because keyboards are viewed as both more precise and more elegant. Program verification Verifying programs mathematically presents a new concept to this author and so will not be commented on. Environment, tools, and workstations Brooks basically states the greatest benefit has already been extracted from these concepts. No real argument there, especially because common availability of GUIs present the only real innovation in environments since the article was written. The concept of developers preferring keyboards over mice, as discussed earlier, leads to many developers preferring command line interfaces (CLIs) over graphical user interfaces (GUIs). Buying instead of building Brooks only mentions the benefits of buying but not most of the problems. While buying software usually provides cost savings over building software, buying software also leaves one at the mercy of the vendor. Not only is the security system of the purchased software fundamentally unreliable (no way exists to 4 check for back doors, for example), the vendor may eventually charge exorbitant fees for upgrades, or hold the buyer's data at their mercy in a proprietary format, thanks to the Digital Millennium Copyright Act that prohibits reverse engineering in many cases. The issue of buying vs. building may date the article a bit because open source now provides an increasingly attractive alternative to buying and building. Incremental development Brooks' comments about "growing" vs. "building" software are excellent. The author uses the growth development model himself, but never knew the growth model by name. Brooks fails to mention but alludes to an important point: the need to identify the "core functionality" of the software to be built. When Brooks states "efforts redouble when the first picture from a new graphics system appears on the screen", he is really discussing the core functionality. This core functionality forms the "trunk" of the tree that eventually becomes the software system. Building the core functionality first is essential in a growth development model because the core functionality likely will not change much. Contrast building the core functionality first with building the interface first: interfaces evolve, and the data the interface presents relies upon the core functionality. Building an interface before the core functionality may result in completely rewriting the interface when developers complete the core functionality. Problems arise with Brooks' suggestion about using "empty stubs" in an object oriented programming environment. Well-designed objects should be simple, small, and easy to test, eliminating the need for the empty stub method. In a procedural environment the empty stub method may be beneficial, but the author possesses insufficient procedural programming experience to comment about such a domain. Problems may arise with using stubs in procedural programs because 5 sometimes knowing what functions the software requires will not be known until some functions are already in place. Function A calling function B provides an example. The need for function B cannot always be predicted before writing function A. Great designers Brooks' arguments here appear to be sound, but relying too much on heroes make businesses leery. The price of heroes can escalate quickly, and dependency on key employees may leave a business vulnerable when such employees leave especially if they go to work for competitors. Conclusion Brooks exhibits great wisdom in "The Silver Bullet". The article required highlevel thinking to write, and the result is a must-read for the software professional. While perhaps lacking from an academic standpoint due to lack of empirical evidence, the article possesses great practical value.