The U.S. faces a critical shortage of skilled software developers. Employers cannot find enough talented practitioners despite offering high salaries and generous benefits. I believe this is due to the outmoded, off-putting way we expose students to computer programming techniques, and I propose that Baltimore become the world leader for a new educational approach. Baltimore could become the place to go if you wish to study software as a craft and a fine art, and a place that prepares people already living here with the skills to compete globally.
The term “programming” connotes an analytical discipline, something derived from mathematics or engineering, and that’s how most schools teach it: as the domain of computer science. But computer science is only a part of what software makers do. Advances in computer power have made computer science less applicable in the day-to-day work of programmers because there’s less need to keep track of “ones and zeroes.” Making software has simply become a lot more fun than you might remember if you were ever forced to study it.
These advances open the door for many different kinds of people to get involved in the software industry. Newcomers have launched a software craftsmanship movement addressing issues such as: how do we make something truly useful? How do we make it a joy to use? What can we learn from the worlds of art, design, psychology, typography, and architecture? Where you once had programmers thinking of themselves as scientists or engineers, you now have programmers who think of themselves as artisans.
Poet and computer scientist Richard P. Gabriel describes a vision of how we might train programmers as craftspeople in his essay “Master of Fine Arts in Software,” in which he suggests we emphasize the creation of software as a performance instead of as a body of knowledge to master. Students should concentrate on making useful things instead of just figuring out how to implement algorithms. According to Gabriel, this kind of teaching “operates by providing a context in which students are constantly designing, writing, and working with software under supervision, with critique, and with explicit thought being given by the student to what the student is doing. One way to look at it is that the student is writing, designing, and working with software while paying attention.”
Baltimore is a great place to start implementing Gabriel’s ideas. The city is filled with mostly self-taught creative people who already work this way, who would love to help smooth the path for future generations. We could begin by creating an interdisciplinary academic center at a local college or university. The center would assemble a wonderful cadre of designers, information architects, and programmers already living here to teach alongside academic faculty from existing computer science departments.
We could then transfer the lessons learned from the college setting to primary education: think of the untapped potential of all the students in our region’s middle and high schools, who could grow up to be software makers, but who may never consider the field for the reasons I’ve described. Exposing those kids to the raw creativity and fun of making software (instead of merely “programming computers”) could make a real difference in their lives. Projects like HacketyHack show what this might look like.
I’m excited about the potential of this idea, because if the city were filled with people capable of making useful, valuable new technologies, many other positive developments would obviously take root. Maryland is known for its game software industry: how much bigger could that grow if we were graduating thousands of smart, creative programmer-craftspeople every year?
I dream of a city that becomes passionate about making software the way Detroit was passionate about making cars or Napa Valley is passionate about making wine. I dream of a place that attracts investors and innovators because of the world-class talent being cultivated and supported here. I think it could all start with one smart college or school administrator around town dreaming this same dream: that’s my audacious idea.

I’m up for it!
Boy, have we got a great project idea for you! We were just talking about this yesterday – a programming project for youth. How can we get in touch with you?
Thanks Michael and Donna. Donna, please email me at mike@subelsky.com. Very intrigued!
One addendum: here’s a great Wall St Journal op-ed about how software is eating the world:
http://online.wsj.com/article/SB10001424053111903480904576512250915629460.html
all the more reason for us to get moving!
Awesome (and yes, audacious!) idea, Mike! This is exactly the kind of thing I’m working to create at the University of Baltimore. There’s an amazing amount of creativity and talent in the region and I also believe that it’s high time that we figured out how to make it come together in the region. Count me in to do anything I can in my power to help move this effort along!
You make a very important point, Mike!
One additional aspect that I’ve noticed is that not only are schools taking a scientific/engineering approach towards what should be a programming craft, they’re doing a sucktastic job of it! The result is that not only is software not crafted well, it’s not engineered well either!
What you suggest would benefit the crafting of the final product and would also force a separation (let alone an awareness) between the product crafting and its original, technical engineering. Focusing on the craftsmanship will separate it from the engineering thereby raising awareness that there is a difference, thereby improving both!
This doesn’t mean that the programming can’t be done by the people doing the engineering, or vice versa, it means that knowing these are two distinct disciplines will improve what is taught and what is done in both of them. Too often, the lack of craftsmanship is an extension of a lack of technical engineering (architecture, design, flow, performance). Absent engineering, there is hardly any reason to be crafting the product. There is no basis for it.
Just as in the tradesman’s path, those that rise to master their craft will have much of what they need to become the engineers of the new product. There will still be a need for engineering. Engineering is its own discipline. Programmers are frequently set upon the planet not knowing enough about the crafting of code or the engineering development of it either.
Nearly 30 years ago a landmark study identified the top reasons software projects fail. They’ve repeated the study about every 10 years or so and have found that we’ve collectively done nothing about it. Imposing standards didn’t work. Imposing improvement models didn’t work. Imposing project life cycles didn’t work. Imposing quality management systems didn’t work. None of these are working because these deal with the problem using the same inadequate concepts we’re applying in the first place. Instead of seeing the problems systemically and fixing them at the source, the industry (starting in higher education) continues to release too many ill-equipped people into the global market faster than we can back-fill their inadequacies.
A tradesman’s approach would change this equation. Giving jobs, career paths and skills where we need them most: people doing the building. Maybe then, software engineering can mature in its own right without the construction aspect getting in the way.
I’ve come to the conclusion that teaching CS as an art and as a sceince are both needed. And I think making Baltimore a destination for the study of programming as an art is a great idea!
There are some programmers that really author elegant code, and it is a work of art. Artistic developers push new ideas, and frontiers, and generally do things to expand knowledge, the way art does in so much of life.
In an enterprise the goal is usually to complete a definate task and many times the most elegant or artistic expression isn’t needed. Generally a developer that views a task as a research project (as a professor of mine in college said) to find code that someone else has written is a cheaper, more functional alternative to creating code from scratch. It can also be difficult to get elegant coders to “done”, they always have additional refinements, that are great refinements, they just don’t provide an additional ROI.
It would be great to articulate the distinction and let individuals self select their desired route and utility!
I currently teach (Instructional) Software Development (EDUC682) at UMBC for the graduate Instructional Systems Development program. You can take it as part of a certificate at UMBC or might be able to take it as a one -off. Email me if you are interested in more information.
http://www.umbc.edu/isd/programs/coursedescriptions.html
Perhaps we shouldn’t be thinking of programming and other “scientific” disciplines as either a science or an art but as both. At the foundation of any area of study there are rules that you have to know: color theory, grammar, logic, and so on. But once you know those rules, you are able to learn when to break those rules, or develop new rules, for how to put your creations together.
At the same time, you don’t need to know everything about color theory in advance in order to paint a picture. Perhaps programmers don’t need to know everything about why a program works before they start experimenting with existing code either. – K