The Grand Old Duke of York

  • Also Known As: Everyone Charges Up the Hill, Lack of Architecture Instinct, Abstractionists versus Implementationists
  • Anecdotal Evidence:

    Experts report that only 1 in 5 software developers is able to define good abstractions On hearing this, a practicing software architect retorted, "It's more like 1 out of 50."


The term abstractionist originates from the fine arts community, where an abstractionist is an expressionist artist, who depicts his or her emotions and attitudes through nonrepresentational art. In our connotation, an abstractionist is an architect or software developer who has the architecture instinct.

AntiPattern Problem

Programming skill does not equate to skill in defining abstractions. There appear to be two distinct groups involved in software development: abstractionists and their counterparts (whom we call implementationists) Abstractionists are comfortable discussing software design concepts without delving into implementation details.

As stated, they possess the architecture instinct, the ability to define and explain good software abstractions. Implementationists, on the other hand, often require source code examples before they can grasp abstract concepts; they are not particularly adept at defining new abstractions that can be readily understood by other developers.

Many object-oriented processes are egalitarian; design decisions made in meeting processes are approved by consensus (see the Design by Committee AntiPattern). According to experts, implementationists outnumber abstractionists approximately 4 to 1 Thus, unfortunately, abstractionists are often outvoted.

Abstractionists know instinctively that management of complexity is a key design force. Good abstractions are often compromised because so few developers appreciate their significance.

The primary consequence is software designs with excessive complexity, which make the system difficult to develop, modify, extend, document, and test. Software usability and system maintenance are impacted by a failure to use effective abstraction principles.

The egalitarian approach to object-oriented development has been rather ineffective in practice; it is reminiscent of a group of people charging up a hill simultaneously.

Everyone must understand and concur on numerous decisions, and even though there may be sophisticated members, the overall sophistication of the group is diminished to the lowest common denominator and inhibited by the communication process.

Refactored Solution

A more effective approach involves several distinct roles in a software development organization. Architects are abstractionists with significant experience in the majority of key technologies.

They facilitate communication between end users and developers; they are responsible for managing the complexity and ensuring the adaptability of systems. To do this, architects need to manage the computational architecture or system-level programming interfaces.

Component developers are highly skilled programmers. They work with systems programming languages such as C, C ++ , and Java; they create the software infrastructure and reusable software components.

Application developers are other programmers who integrate these components to create working systems. They primarily use scripting languages such as Visual Basic, JavaScript, Python, Tcl, and Perl. The higher-level nature of the scripting languages enables a wider range of programming skills to be productive.


The specialization of software development roles indicates that there are multiple disciplines required to build safe and effective software systems. Certification is a potential mechanism for establishing and validating professional capabilities. Certification is required for many professionals, for example, cosmetologists, chauffeurs, lawyers, and certified public accountants. Why not for software architects?