Devlico.Us
CodeBetter.Com
RSS 2.0 via Feedburner
           Do you Twitter? Follow us @devlicious

Billy McCafferty



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



Comments

Rob Eisenberg said:

Billy.  This is a great contribution.  Thanks!

# November 12, 2007 4:24 PM

pete w said:

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.

# November 12, 2007 5:04 PM

Billy McCafferty said:

Ah yes, the mythical man-month...that was a must add which is now reflected in the above list, appropriately enough.  Great call Pete!

# November 12, 2007 5:19 PM

DotNetKicks.com said:

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

# November 12, 2007 5:21 PM

Derik Whittaker said:

Bill,

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.

Derik

# November 12, 2007 6:17 PM

Santi said:

Very useful list. Thanks

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

# November 13, 2007 8:40 AM

windywinter said:

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.

# November 13, 2007 10:25 AM

Chris R. Chapman said:

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 blog.chapmanconsulting.ca/CategoryView,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.

[1] www.scottstonehouse.ca/.../software-development-is-not-computer.html

# November 13, 2007 10:39 AM

Billy McCafferty said:

@windywinter:

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 www.versionone.com/.../StateOfAgileDevelopmet2_FullDataReport.pdf .)  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.

@Chris:

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.

# November 13, 2007 1:05 PM

Carel Lotz said:

Billy

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.

Carel

# November 13, 2007 2:04 PM

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

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

# November 13, 2007 11:11 PM

windywinter said:

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.

# November 14, 2007 4:03 AM

PhilloPuntoIt said:

Links of the (Yester)day, 6

# November 14, 2007 12:46 PM

Scott Stonehouse said:

@Billy

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.

# November 14, 2007 1:43 PM

Billy McCafferty said:

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.

# November 14, 2007 1:54 PM

Scott Stonehouse said:

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

# November 14, 2007 2:22 PM

Chris R. Chapman said:

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.

# November 14, 2007 8:21 PM

Alac Matthew said:

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.

# November 15, 2007 12:00 AM

onlinehg » Blog Archiv » Standing on the Shoulders of Giants said:

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

# November 15, 2007 4:07 AM

Armiamoci ….di libri e leggiamo! « Technology’s passion reborn said:

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

# November 15, 2007 8:44 AM

Ole Kværnø said:

Great list!

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

# November 15, 2007 4:11 PM

miga » Standing on the Shoulders of Giants said:

Pingback from  miga » Standing on the Shoulders of Giants

# November 25, 2007 6:21 PM

Ray Zhang said:

Thanks Billy. Good job!

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

# November 28, 2007 12:20 AM

Billy McCafferty said:

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

# November 28, 2007 4:45 PM

子午 said:

# November 30, 2007 7:24 AM

jeffery0101 said:

这些书是计算机科学的全部吗?很明显不是。这些是计算机科学的骨架,支撑并关联着计算机科学的其他部分:算法、语言、类库、等等。

# December 4, 2007 3:56 AM

Paul W. Homer said:

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.

Paul.

theprogrammersparadox.blogspot.com

# December 17, 2007 11:36 AM

Billy McCafferty said:

Good call Paul...no disagreement here!

# December 17, 2007 11:58 AM

Hi, my name is Charlie « solomonology said:

Pingback from  Hi, my name is Charlie « solomonology

# December 19, 2007 5:33 PM

Nina said:

Pretty nice info. Thanks for the article.

http://www.actglobalsports.com

# February 25, 2008 1:59 AM

xhan said:

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

Stan...

# March 5, 2008 7:25 PM

estetik said:

Good thanks

# May 14, 2008 5:04 PM

ASP Net Web Development said:

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

# September 1, 2008 8:08 AM

h-hello said:

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

StandingontheSh...

# September 23, 2008 2:05 AM

Leave a Comment

(required)  
(optional)
(required)  

Enter the numbers above:
Add
Check out Devlicio.us!

Our Sponsors

Proudly Partnered With