Images in this post missing? We recently lost them in a site migration. We're working to restore these as you read this. Should you need an image in an emergency, please contact us at
Standing on the Shoulders of Giants

Needless to say, computer science is still in its infancy but has made incredible strides in just over half a century.  During this time, it's striven to get the respect it deserves as a disciplined subject.  Even just 14 years ago, when I started my undergrad in this subject, I recall reading articles debating whether it should be called a science at all.  Gladly, I do not see this argument thrown around much anymore.  From Knuth's classic work in The Art of Computer Programming to the wide-spread use of pure mathematics in describing algorithmic approaches, computer science has the proper foundations to join other respected sciences such as physics, concrete mathematics, and engineering.  Like other sciences, computer science demands of its participants a high level of respect and pursuit of knowledge.  But, unlike other sciences, it is difficult to enforce that its participants give it the level of respect it deserves nor pursue it with the same level of discipline that other sciences require.  Consequently, the science behind software development is often neglected or not taken into consideration whatsoever.  This becomes reflected in the widespread impressions that software is fragile, that accurate estimating is impossible, and that managing software development is largely undisciplined.

To improve impressions of mainstream software development - which, presumably, should be based upon the foundations of computer science - it comes upon the shoulders of each developer to educate him or herself with the knowledge necessary to give this discipline proper attention.  Developers cannot push off this responsibility to management or "the priority setters."  It is up to each of us to give software development the respect it deserves and educate those around us, accordingly.  Helping to assist this cause does not require a masters degree in computer science, or even an undergrad degree (although I recommend it), but it does require a commitment to learn from the mistakes of experts that have come before us so as not to repeat those mistakes again.  A former professor of mine, wiser than I, said that you will not be an expert in computer science until you have made every mistake possible.  Fortunately, we need not make all of these mistakes ourselves as many have come before us to pave the way and leave behind the lessons they have learned.

Although there is no single best practice, practices do exist which embody the lessons learned from years of painful experiences and hard won insight.  This is not to say that all the practices described are not subject to critique and improvement, but they do serve as a confident starting point for engaging in our own daily practice.  Ignoring them outright, which is almost a norm within the world of software development, is an injustice to the science in which we say we engage ourselves.  Structural engineers do not start designing a building's structure without first investing a large amount of time understanding engineering best practices garnered from centuries of engineering practices that have come before.  Unfortunately for them, if they do not do this, lives may be at stake.  Unfortunately for us, we do not usually have such pressures to commit the same level of care and attention to our own work.  Furthermore, it is frequent that management does not support the time required for learning and executing ideal software development practices.  Both of these disadvantages to software development can almost always be overcome by empowering software developers with the adequate education for implementing proper practices and methodologies.  Fortunately for us as developers, this empowerment is in our own hands.

In a sense, this message is a call to arms for software developers to give our science the respect it deserves as expressed in our day to day work.  We are engaged in a practice which the world is becoming more and more dependent upon; in all seriousness, there are few other sciences which will have as big an impact on the world in the coming century as computer science.  The first step that each of us can take to better the integrity of our science and assist with its advancement is to pick up a book.  Although not all are equal, key texts infuse in us the wisdom of many years of development and the expert knowledge garnered from many mistakes.  What follows is a minimal course of reading for infusing such knowledge, becoming a better software developer, and giving computer science proper respect in your daily practice.  I suggest that they be read, believed, and implemented in your daily practice.  Works by authors such as Martin Fowler are not just books full of ideas that he invented, they are tried and true practices built upon the shoulders of giants which can serve as a platform for standing on the giants' shoulders, ourselves.

Foundational Texts

What follows are key texts that every OOP developer should read, without exception, regardless of experience or platform.  The order of the list is the order that I suggest reading them.  These texts focus mainly on writing better, maintainable code with a transition to solid object oriented design.

Apprenticeship Texts

These texts help one move from focusing on the code to seeing the implementation from a higher viewpoint and improving the integrity of the project as a whole.

Journeyman Texts

These texts move towards more "putting it all together," wrangling the software development process, and getting into the "science" behind computer science.

The Beginnings of Mastery

These texts help hone your skills along with improving the efficiency and effectiveness of your team.

Mastery Texts

Although not to be seen as compulsory as the above texts, what follows will assist in taking you into the realm of pure computer science.  At the very least, they serve to demonstrate that our work has solid foundations in quantitative science.


With the above listing, I've attempted to de-emphasize emerging techniques, such as Software Factories or Product Lines, in favor of established better practices for improving the design, development, and management of software development for yourself and organization.  Obviously, taking on these texts cannot be done in a weekend and requires years of trial and error in implementing the techniques implied.  But I assure you that embracing the ideas discussed will dramatically improve you as a software developer and help move your practices closer to the realm of disciplined computer science.

Billy McCafferty

Posted 11-12-2007 9:03 AM by Billy McCafferty



Rob Eisenberg wrote re: Standing on the Shoulders of Giants
on 11-12-2007 4:24 PM

Billy.  This is a great contribution.  Thanks!

pete w wrote re: Standing on the Shoulders of Giants
on 11-12-2007 5:04 PM

This reminds me I have some potholes that I have been meaning to fill in my library. This is a good reference.

Possibly a tangent, but one book that really helped me understand languages was the "Compilers" book (commonly referred to as the dragon book) by Aho, Sethi and Ullman.

Another helpful book in terms of estimating the time/cost of a project was the "Mythical Man Month" By Frederick Brooks

I suppose these would fall under the journeyman category.

Billy McCafferty wrote re: Standing on the Shoulders of Giants
on 11-12-2007 5:19 PM

Ah yes, the mythical man-month...that was a must add which is now reflected in the above list, appropriately enough.  Great call Pete! wrote Standing on the Shoulders of Giants
on 11-12-2007 5:21 PM

You've been kicked (a good thing) - Trackback from

Derik Whittaker wrote re: Standing on the Shoulders of Giants
on 11-12-2007 6:17 PM


Great list.  If you are going to include the first book from the Poppendiecks about lean, you should include their latest one.  Implementing Lean Software Development.


Santi wrote re: Standing on the Shoulders of Giants
on 11-13-2007 8:40 AM

Very useful list. Thanks

I only miss another classic, "Peopleware" by Tom DeMarco and Timothy Lister.

windywinter wrote re: Standing on the Shoulders of Giants
on 11-13-2007 10:25 AM

Nice text. I'm wondering why you have such strong skewness in to agile/xDD development? Those two approaches/metods of software development (SD) right now aren't proven as best way to do SD. In my opinion they are not even widely adopted - they are not fasion as well. I'm even wondering if ANY ONE methodology should be part of mastering - it's like learning ONLY using VS xxxx.

Chris R. Chapman wrote re: Standing on the Shoulders of Giants
on 11-13-2007 10:39 AM

Excellent post Billy - I'm glad to see more and more developers get on this wavelength.

The broad themes you discuss (ie. best practices) are what I looked at when I reviewed Canadian CompSci schools for their level of instruction at the undergrad level (see,category,computer%2Bscience.aspx )

To cut to the chase, very few schools support the notion of placing their students on the "shoulders of giants" - texts like the ones you've listed are extremely rare to find in required reading lists and grads are coming out ill-prepared for the realities of the career they're entering.  And there's fewer of them every year!

More interesting, however, is the turf war that seems to exist here between CompSci and Software Engineering students/grads/depts. with each believing it's the other's responsibility to learn "best practices" - I've even been "reprimanded" on more than one occasion for confusing "computer science" with practical knowledge! [1]

In my opinion, when it comes to best practices, the largely artificial divide between CS and SE needs to disappear if we're to move the ball forward and improve the integrity of the discipline - and this means tossing out a lot of God-awful baggage from the last 30 or so years.


Billy McCafferty wrote re: Standing on the Shoulders of Giants
on 11-13-2007 1:05 PM


As you implied, time is the only judge as to whether or not the current agile practices will stick.  But, as is the nature of our business, no practice is permanent.  Even OOP, which has reined supreme for quite some time, may see the day come in which another paradigm takes precedence.  For now, agile practices are a very good practice for software development and have proven their value.  (VersionOne has some survey results at .)  So, as you implied, there may come a day that we look back and shake our head in disbelief at the current practices, but I'd put money on it having longevity greater than any VS xxxx.


Arguably, my reading focuses much to heavy on "practical" development with large gaps in "theory," but my greater concern is how few developers take the time to read any books at all concerning development, computer science, managing requirements, etc.  Development theory and practices have come so far in 50 years and each of us needs to take the body of knowledge that has emerged more seriously than is currently being done.

I got a kick out of the post against your assertion that computer science and software development are linked; inextricably linked is very much the case and cannot be ignored.  In addition to "practical" books, it's important that every software developer get exposed to formal algorithm training and other foundations of computer science.  Software development is an empty shell without the computer science behind it.

Carel Lotz wrote re: Standing on the Shoulders of Giants
on 11-13-2007 2:04 PM


Great list.  One or two books that I would add include:

xUnit Test Patterns: Refactoring Test Code by Gerard Meszaros and The Art of Agile Software Development by James Shore.  Both were released quite recently.


{ null != Steve } » Blog Archive » Learning from the best wrote { null != Steve } » Blog Archive » Learning from the best
on 11-13-2007 11:11 PM

Pingback from  { null != Steve }  » Blog Archive   » Learning from the best

windywinter wrote re: Standing on the Shoulders of Giants
on 11-14-2007 4:03 AM

Thanks for link to this survey summary. There are very interesting results (in plus and in minus). Then we  agree that future shows how it will evolve. I only doubt that if even agile methods will be broadly adopted then it will be in current inmature state.

PhilloPuntoIt wrote Links of the (Yester)day, 6
on 11-14-2007 12:46 PM

Links of the (Yester)day, 6

Scott Stonehouse wrote re: Standing on the Shoulders of Giants
on 11-14-2007 1:43 PM


I can't argue with your statement "inextricably linked is very much the case".  So are physics and engineering.  Math and stats.  Etc.

I'm just saying that Computer Science and Software Development are two different things.  One is theoretical, the other is practical.  

The widespread belief that folks graduating from a computer science program know how to develop software is something that we as an industry need to correct.  It's not about changing the computer science programs into software development training.  It's about establishing professional standards bodies like engineers, lawyers and accountants have.

Billy McCafferty wrote re: Standing on the Shoulders of Giants
on 11-14-2007 1:54 PM

I would agree that Software Development naturally leans more towards practical development vs. computer science implies further theory.  My only complaint concerning my undergrad time getting my CS degree was that almost no time was spent on basic software development such as class layout, naming conventions, architecture, etc.  Theory is necessary and the key element behind academic computer science, but I feel it would have greatly benefited the students if we were better prepared, even if only limited, for the realties of software development.  Regardless, your point is well taken that Computer Science and Software Development are not the same thing; but I believe that educating software developmers concerning the basics of computer science theory is just as important as teaching software development basics to computer science students.

Scott Stonehouse wrote re: Standing on the Shoulders of Giants
on 11-14-2007 2:22 PM

No doubt.  Actually, I think a lot of different fields could benefit from some cross-pollination.

Chris R. Chapman wrote re: Standing on the Shoulders of Giants
on 11-14-2007 8:21 PM

While cross-pollenation is all fine & well, it does little to address the real, hard issues that our industry is racing toward:  The boomers are going to be retiring in droves, and there's fewer of us to go 'round and fewer still grads to replace us in the entry-level ranks.

Even more pressing is the disastrous state a lot of production code is in, and the abundant failures that have become the hallmark of our profession.  30+ years of theorizing has done *zero* to halt the trend, and we're getting into desperate times.

Ergo, we need to arm grads with real, practical knowledge that /pragmatic/ computer scientists and developers have worked very hard to refine over the years - often in the face of inscrutable elitist arguments to the contrary.

Sorry to sound so harsh, but I really do see a pressing need to stop chasing the weasel 'round the mulberry bush and get to brass tacks.

Alac Matthew wrote re: Standing on the Shoulders of Giants
on 11-15-2007 12:00 AM

We are a truly global product development firm that partners with software product companies ranging from start-ups to established ISVs to provide software product life cycle solutions. We have worked with more than 50 software product companies in various domains like Education, Healthcare, Retail and Finance. Our wide-ranging experience has enabled us to build a strong product environment within the company that remains unmatched in the industry. If you are looking for any software development services, let us know, click link and just fill up the form. Our experts will get back to you within 1 business day.

onlinehg » Blog Archiv » Standing on the Shoulders of Giants wrote onlinehg » Blog Archiv » Standing on the Shoulders of Giants
on 11-15-2007 4:07 AM

Pingback from  onlinehg  » Blog Archiv   » Standing on the Shoulders of Giants

Armiamoci ….di libri e leggiamo! « Technology’s passion reborn wrote Armiamoci ….di libri e leggiamo! « Technology’s passion reborn
on 11-15-2007 8:44 AM

Pingback from  Armiamoci ….di libri e leggiamo! « Technology’s passion reborn

Ole Kværnø wrote re: Standing on the Shoulders of Giants
on 11-15-2007 4:11 PM

Great list!

One "Apprenticeship Text" is missing though - Donald A. Norman "The Design of Everyday Things" (1990)

miga » Standing on the Shoulders of Giants wrote miga » Standing on the Shoulders of Giants
on 11-25-2007 6:21 PM

Pingback from  miga » Standing on the Shoulders of Giants

Ray Zhang wrote re: Standing on the Shoulders of Giants
on 11-28-2007 12:20 AM

Thanks Billy. Good job!

But it seems like an ad. for amazon books:)

Billy McCafferty wrote re: Standing on the Shoulders of Giants
on 11-28-2007 4:45 PM

Thanks Ray!  You know, I used to seek out all the publishers' links...but that's a lot of work. ;)

子午 wrote 站在巨人的肩膀上 (转)
on 11-30-2007 7:24 AM
jeffery0101 wrote 内功书籍(转)
on 12-04-2007 3:56 AM


Paul W. Homer wrote re: Standing on the Shoulders of Giants
on 12-17-2007 11:36 AM

There are some great books in your list (and a few that I really dislike), but I think we need to start distinguishing between the different levels of programming. If your pounding out something lightweight like HTML, most of the above is not relevant. If you pounding out something heavyweight like a interpreter for a language, you missed a number of critical books and a lot of the very important underlying theory. Programming spans such a wide range that creating the one-list-to-rule-them-all isn't practical. Even for the very common middleweight programming GUI-to-database applications, there are so many different technologies, practices and processes in common use.


Billy McCafferty wrote re: Standing on the Shoulders of Giants
on 12-17-2007 11:58 AM

Good call disagreement here!

Hi, my name is Charlie « solomonology wrote Hi, my name is Charlie « solomonology
on 12-19-2007 5:33 PM

Pingback from  Hi, my name is Charlie « solomonology

Nina wrote re: Standing on the Shoulders of Giants
on 02-25-2008 1:59 AM

Pretty nice info. Thanks for the article.

xhan wrote 好书啊!
on 03-05-2008 7:25 PM

站在巨人的肩膀上 看到博客园在轰轰烈烈地讨论程序员的基础/基本功问题,正好在devlicio.us上看到BillyMcCafferty撰写的《站在巨人的肩膀上》一文,推荐一下:

Stan... wrote
on 03-29-2008 6:26 AM
estetik wrote re: Standing on the Shoulders of Giants
on 05-14-2008 5:04 PM

Good thanks

ASP Net Web Development wrote re: Standing on the Shoulders of Giants
on 09-01-2008 8:08 AM

Nice post...thank you for your efforts...

h-hello wrote 站在巨人的肩膀上
on 09-23-2008 2:05 AM



Technical Related Notes » Blog Archive » links for 2007-11-14 wrote Technical Related Notes » Blog Archive » links for 2007-11-14
on 01-11-2009 7:55 PM

Pingback from  Technical Related Notes  » Blog Archive   » links for 2007-11-14

Hydrocodone no prescription. wrote Buy hydrocodone without a prescription.
on 05-31-2009 8:12 PM

Hydrocodone. Difference between hydrocodone and morphine. Buy hydrocodone without a prescription. Hydrocodone online.

Percocet. wrote Percocet.
on 06-01-2009 9:40 PM

Compare brand name and generic percocet. Percocet. Drug test percocet.

Pharma874 wrote re: Standing on the Shoulders of Giants
on 08-02-2009 8:58 AM

Very nice site!

Pharme998 wrote re: Standing on the Shoulders of Giants
on 08-02-2009 8:59 AM

Very nice site!

Pharmd36 wrote re: Standing on the Shoulders of Giants
on 08-05-2009 1:45 PM

Very nice site!

Pharmb569 wrote re: Standing on the Shoulders of Giants
on 08-05-2009 1:49 PM

Very nice site!

About The CodeBetter.Com Blog Network
CodeBetter.Com FAQ

Our Mission

Advertisers should contact Brendan

Google Reader or Homepage Latest Items
Add to My Yahoo!
Subscribe with Bloglines
Subscribe in NewsGator Online
Subscribe with myFeedster
Add to My AOL
Furl Latest Items
Subscribe in Rojo

Member Projects
DimeCasts.Net - Derik Whittaker

Friends of
Red-Gate Tools For SQL and .NET


SmartInspect .NET Logging
NGEDIT: ViEmu and Codekana
NHibernate Profiler
Balsamiq Mockups
JetBrains - ReSharper
Web Sequence Diagrams
Ducksboard<-- NEW Friend!


Site Copyright © 2007 CodeBetter.Com
Content Copyright Individual Bloggers


Community Server (Commercial Edition)