10 Papers Every Programmer Should Read (At Least Twice) 85

Posted by Michael Feathers Fri, 27 Feb 2009 02:49:00 GMT

I spent most of yesterday afternoon working on a paper I’m co-writing. It was one of those days when the writing came easy. I was moving from topic to topic, but then I realized that I was reaching too far backward – I was explaining things which I shouldn’t have had to explain to the audience I was trying to reach.

When I first started writing, one of the pieces of advice that I heard was that you should always imagine that you are writing to a particular person. It gets your juices going – you’re automatically in an explanatory state of mind and you know what you can expect from your audience. I was doing that, but I noticed that I was drifting. I was losing my sense of audience. I started to explain one thing, and then I realized that I would have to explain something else to help it make sense. I couldn’t imagine that person any more. How could I know what they know and what they don’t?

The problem I was experiencing is only getting worse. People come into programming from many different directions. Some started in other fields, and others started programming as teens. Some started with BASIC, others started with Ruby or C. The industry is filled with knowledge, but it isn’t common knowledge. It isn’t knowledge that we all share. We have to dig for it because of a peculiar fact about our industry: we reinvent our languages and notations every ten years. It’s hard to find deeply technical books and articles which stand the test of time in software: they are all Latin within 20 years.

So, I was thinking about this and trying to not to get too glum. I realized that instead of complaining, I could help by pointing to some papers which are easily available online and which (to me at least) point to some of the most interesting ideas about software. To me, these are classic papers which contain deep “things you oughta know” about code – the material you work with.

We’ve taken an interesting turn in the industry over the past ten years. We’ve come to value experiential learning much more, and we’ve regained a strong pragmatic focus, but I think it would be a shame if we lost sight of some of the deeper things which people have learned over the past 50 years. Rediscovering them would be painful, and (to me) not knowing them would be a shame.

Here’s the original list. It’s a rather personal list of foundational papers and papers with deep ideas. I wrote it “off the cuff” and threw it into a tumblr blog the other day and I got responses from people who suggested others. I’ll add those in a later blog.

Most are easy to read but some are rough going – they drop off into math after the first few pages. Take the math to tolerance and then move on. The ideas are the important thing.

  1. On the criteria to be used in decomposing systems into modules – David Parnas
  2. A Note On Distributed Computing – Jim Waldo, Geoff Wyant, Ann Wollrath, Sam Kendall
  3. The Next 700 Programming Languages – P. J. Landin
  4. Can Programming Be Liberated from the von Neumann Style? – John Backus
  5. Reflections on Trusting Trust – Ken Thompson
  6. Lisp: Good News, Bad News, How to Win Big – Richard Gabriel
  7. An experimental evaluation of the assumption of independence in multiversion programming – John Knight and Nancy Leveson
  8. Arguments and Results – James Noble
  9. A Laboratory For Teaching Object-Oriented Thinking – Kent Beck, Ward Cunningham
  10. Programming as an Experience: the inspiration for Self – David Ungar, Randall B. Smith

(edit: Added a brief synopsis of each of them and why I think they are special):

On the criteria to be used in decomposing systems into modules – Parnas

This is a very old paper, but it is more than a classic. In in it, Parnas introduces a forerunner to the Single Responsibility Principle. He introduces the idea that we should use modularity to hide design decisions – things which could change. People still don’t consider this as often as they should.

Another thing I really like in the paper is his comment on the KWIC system which he used as an example. He mentioned that it would take a good programmer a week or two to code. Today, it would take practically no time at all. Thumbs up for improved skills and better tools. We have made progress.

A Note On Distributed Computing – Waldo, Wyant, Wollrath, Kendall

Abstraction is great but it can only go so far. In this paper, the authors lay to rest what was once a pervasive myth – that we could design a distributed system and make distribution transparent. Ever wonder why you had to implement specific interfaces to do remoting in Java? This is why.

In the aftermath it might seem hard to believe that people thought this was possible. I think we can we partially thank this paper for that.

The Next 700 Programming Languages – Landin

Most of us have spent a lot of time working in traditional programming languages, but functional programming languages are slowly seeing an uptick and many OO languages are gaining functional features. This paper (which reads like a tutorial) makes an argument for an expression-oriented style of programming. It also lays the foundation for lazy evaluation.

One of the other neat things about this paper, from a historical point of view, is that there is a discussion section at the end in which there a number of questions and comments about whether making indentation significant in a language is a good idea. I was thrown to see people asking whether or not this would be a problem for functions which span over several pages(!).

Can Programming Be Liberated from the von Neumann Style? – Backus

John Backus is known for a number of achievements in computer science. He received the ACM Turing Award for his work on Fortran. This paper, which he presented at the award ceremony was rather shocking at the time because it said, in essence, “we got it wrong.” Backus took the opportunity to make a plea for pure functional programming. His arguments were convincing and they helped to set a research agenda which is just now starting to make some waves in the mainstream.

Reflections on Trusting Trust – Thompson

I once heard that when this paper was presented, people in attendance rushed back to de-compile their C compilers and look for, er, problems. This paper unveiled a hard problem at the heart of computer security. If you’ve spent any time at all thinking about security, you need to read it.

Lisp: Good News, Bad News, How to Win Big – Gabriel

This paper is a bit atypical in this list. It’s aimed at the Lisp community and it comes off as a bit of a lament. But, hidden deep within it is the Gabriel’s description of the ‘Worse is Better’ philosophy – an idea with profound implications for the acceptance and spread of technology.

An experimental evaluation of the assumption of independence in multiversion programming – John Knight and Nancy Leveson

Behind this dry title lies something very interesting. I first heard about this paper from Ralph Johnson in a newsgroup discussion about program correctness. It turns out that one of the avenues that engineers in other disciplines take to make their products stronger – redundancy – doesn’t really work in software. Multi-version programming was the idea that you could decrease faults in critical systems by handing the spec to several teams, having them develop the software independently, and then having the systems run in parallel. A monitoring process verifies their results and if there is any discrepancy it picks the most common result. Sounds like it should work, right? Well..

Arguments and Results – Noble

I think that all of the other papers in this list are rather well known in some circles. This one isn’t, or if it is, I just haven’t found that circle yet. What I like about this paper is that it takes something which we deal with every day – the set of arguments and results of functions – and it works them through a series of variations which just don’t occur to many people. The fact is, every function that you work with has a number of possible directions if could evolve in. Not all of them are appropriate, but if you know the possible directions, you’re richer for it.

A Laboratory For Teaching Object-Oriented Thinking – Beck, Cunningham

There are an incredible number of papers about there about object orientation. The thing which makes this one great is its directness. OO went through a number of stages. It was once fresh and novel, then it was ornate, and then it became matter-of-fact. This paper hits upon key ideas which many people don’t talk about much any more: anthropomorphism and dropping the top/down perspective. It also shows you how you can design with index cards. It may not sound cool but it is incredibly effective.

Programming as an Experience: the inspiration for Self – Ungar, Smith

How many people know about the Self Project? Not enough in my opinion. Self was an attempt to take two ideas in computing and push them as far as humanly possible. The first was minimalism: the Self programming language was thoroughly in the Lisp and Smalltalk vein – everything was defined in terms of the smallest number of primitives possible. The other idea was direct manipulation – the idea that the object metaphor could be pushed all the way in the user interface – the programmer and user sit with a mouse in a sea of directly clickable objects and use them for everything. If they could’ve gotten away with dropping the keyboard, I think they would’ve.

The amount of technology which the Self project threw off is terrifying also. Self broke ground in dynamic language optimization and VM design. Chances are, your VM uses technology it pioneered. It’s also one of the more perverse ironies that the most widely distributed programming language today (JavaScript) is a prototype-based programming language which borrowed ideas from the hyper-research-y Self.

What would you add to the list?

Comments

Leave a response

  1. Avatar
    Dean Wampler about 2 hours later:

    speaking of such things, I was just re-reading Jack Reeves, What Is Software Design today. http://www.developerdotstar.com/mag/articles/reeves_design.html

  2. Avatar
    Axel Busch about 2 hours later:
    Great post again. Thanks Michael. I would add
  3. Avatar
    Keith Braithwaite about 2 hours later:

    Any (or all) of the Lambda-the-ultimate papers. “Design of a Lisp-based Processor is perhaps the best for outright jaw-dropping though-provocation

    The closely related A Universal Modular Actor Formalism for Artificial Intelligence which has with the recent rise of interest in Erlang become hugely relevant.

    Also, Derivatives of Regular Expressions is a hoot! (and doesn’t have a public URL)

    But most importantly, every professional programmer must read Managing the Development of Large Software Sysetms but unlike the authors of a generation’s worth of software engineering text books they must read the whole thing.

  4. Avatar
    Brian Foote about 3 hours later:

    You simply cannot omit: Fred Brooks, No Silver Bullet: Essence and Accidents of Software Engineering

    http://www.virtualschool.edu/mon/SoftwareEngineering/BrooksNoSilverBullet.html

  5. Avatar
    Brian Di Croce about 4 hours later:

    Great list Michael.

    If I could contribute on that thought, I would add these two as my all-time favourites: The Humble Programmer by Dijkstra, and No Silver Bullet: Essence and Accidents of Software Engineering by Brooks.

  6. Avatar
    Pieter V about 5 hours later:

    I can highly recommend ‘Big Ball of Mud’ by Brian Foote and Joseph Yoder. Quoting: “While much attention has been focused on high-level software architectural patterns, what is, in effect, the de-facto standard software architecture is seldom discussed. This paper examines this most frequently deployed of software architectures: the BIG BALL OF MUD”.

    An excellent read.

  7. Avatar
    Brian about 6 hours later:

    “Notes On Programming In C” by Pike. Short, sweet, and great advice.

  8. Avatar
    anjan bacchu about 7 hours later:

    hi there,

    thanks for the list in one place.

    BR, ~A

  9. Avatar
    Rurik about 7 hours later:

    Reflections on Trusting Trust—Ken Thompson http://cm.bell-labs.com/who/ken/trust.html

  10. Avatar
    Dean about 8 hours later:

    How about WebDev101. Don’t make hover state text colour of your links the same colour as your background.

  11. Avatar
    Chandrashekar about 8 hours later:

    Time, Clocks and the Ordering of Events in a Distributed System

    http://research.microsoft.com/en-us/um/people/lamport/pubs/time-clocks.pdf

    The best paper I’ve ever read.

  12. Avatar
    andyg @ http://geekscape.org about 9 hours later:

    Another great read … “Growing A Language” by Guy L Steele Jr.

    http://www.brics.dk/~hosc/local/HOSC-12-3-pp221-236.pdf

    And, no-one should touch a distributed system before reading “A Note On Distributed Computing” (already in the original top ten list).

  13. Avatar
    jared about 9 hours later:
  14. Avatar
    David about 9 hours later:

    First, you should have actual pdfs of these papers, not links that require you to pay. If these papers were truly important, then you would be able to read them without paying.

    Second, your choice is bad. Trusting Trust is an interesting paper, but it is hardly relevant to mainstream programmers. It is much more relevant to computer science and should probably be included in an upper division compilers course. The other papers have similar problems.

    Third, your tone is arrogant and annoying. Get over yourself.

  15. Avatar
    Alan about 9 hours later:

    Some classics are not big enough to be an essay which is ok when that’s the point

    And it has to be admitted our dear friend lindsey is a clasic too :-)

  16. Avatar
    Alan about 10 hours later:

    Oops, the point was here

    And Murphy – he wrote a classic too.

  17. Avatar
    Saul about 10 hours later:

    David, your opinion would be a little less ridiculous, if you demonstrated the intelligence required to not post the same thing twice.

  18. Avatar
    Thomas Guest about 11 hours later:

    “Teach Yourself Programming in Ten Years”, Peter Norvig.

    Gustavo Duarte’s recent series on computer internals has become an instant classic.

    How about Kevlin Henney’s “Omit Needless Code”?

  19. Avatar
    Michael Schürig about 12 hours later:

    I know several of the papers mentioned so far and mostly agree that they are excellent. However, that’s just a matter of opinion, what’s missing all around, in RCMs original posting and in most comments, are arguments and reasons why particular papers are important today and worthy of reading.

  20. Avatar
    Joe about 13 hours later:

    I’d definitely add
    End-to-End Arguments in system design
    by: Saltzer, Reed, Clark

    This is mainly networking, but an absolute must for anyone doing web programming, or anyone who just wants to get an idea as to reasoning behind the OSI model and the protocols that underpin the web.

  21. Avatar
    Friðrik Már Jónsson about 13 hours later:

    I hate to respond to trolling, but I have to disagree with David. I most certainly don’t find your tone arrogant or annoying (not even sure how he’s concluding that). Your work is valuable for people in this field and I, and certainly many others, appreciate the time invested.

  22. Avatar
    Michael Schürig about 13 hours later:

    I should have looked more closely: “Posted by Michael Feathers”. However, no matter if Michael or Bob’s your uncH^HHauthor, I could still do with some reasons why these papers are important.

  23. Avatar
    MarkTraceur about 13 hours later:

    The Cathedral and the Bazaar by Eric S. Raymond. It changed the way I thought about project management and lots of other things, too. It’s more interesting to open source programmers and business types, but it’s well worth the read even if you only read the Brief History of Hackerdom, which is amazing in its own right.

    http://www.catb.org/~esr/writings/cathedral-bazaar/

  24. Avatar
    Mik about 13 hours later:

    Thanks for the list, but please don’t link to ACM portal, it is a pay site. Always link to a free version if it is available. Yes, these papers are worth spending a minute or two searching for a free version, and yes they are probably worth spending real money to read as well, but if a free version exists, save us all the time and money and link to it.

    One small moment for an author, or one giant waste of time for mankind.

  25. Avatar
    Gaboto about 16 hours later:

    No Silver Bullet: Essence and Accidents of Software Engineering – Frederick P. Brooks, Jr.

    Design Principles Behind Smalltalk – Dan Ingalls

    Programming as Theory Building – Peter Naur

  26. Avatar
    Gaboto about 16 hours later:

    No Silver Bullet: Essence and Accidents of Software Engineering – Frederick P. Brooks, Jr.

    Design Principles Behind Smalltalk – Dan Ingalls

    Programming as Theory Buildinurg – Peter Naur

  27. Avatar
    unclebob about 17 hours later:

    Would you like me to write your code for you too? YOU are responsible for your career. YOU search for the free papers if you don’t want to pay for them. Sheesh.

  28. Avatar
    FPM about 18 hours later:

    I used to read papers back when I was a homeless rodeo clown but not any more. Now I am a world class magician !

  29. Avatar
    hacksoncode about 19 hours later:

    Lest we forget that there exist programming papers that are something other than theoretical pontification: HACKMEM

  30. Avatar
    Alex about 19 hours later:

    don’t read, do. reading these papers as programmer is nearly useless, unless you want to be fricking theoretician – lamer.

  31. Avatar
    Alex about 19 hours later:

    hey why did my comment get erased?

  32. Avatar
    Brett L. Schuchert about 20 hours later:

    David: wrote:

    Third, your tone is arrogant and annoying. Get over yourself.

    First rule of feedback from Seashore & Weinberg is that feedback is seldom about the target and more about the person giving the feedback.

    So how it is you find yourself so arrogant and annoying? What do you think it will take for you to get over yourself?

  33. Avatar
    Robert S. Robbins about 20 hours later:

    I would take off all the papers on your list and add nothing to it. That would make for a list of papers a programmer should read. I assume we’re talking white papers which are not written to be read. If you start reading white papers you’ll eventually read financial reports and then one day you’ll just shoot yourself.

  34. Avatar
    Arvind about 20 hours later:

    “What every computer scientist programmer should know about floating point” and “What every programmer should know about memory”.

  35. Avatar
    Jason about 23 hours later:

    The Next 700 Programming Languages – P. J. Landin

    Free version: http://ttic.uchicago.edu/~blume/classes/aut2008/proglang/papers/Landin-next-700.pdf

  36. Avatar
    Fogus about 23 hours later:

    I would add:

    1. Knuth’s Computer Programming as an Art 2. Backus’ The History of Fortran I, II, and III 3. Wirth’s A Brief History of Software Engineering

    -m

  37. Avatar
    casmrv about 23 hours later:

    For OOP, we need to add Bertrand Meyer’s Object Oriented Software Construction: http://en.wikipedia.org/wiki/Object-Oriented_Software_Construction Probably the clearest book on OO, and one I wish so-called OO specialists had read. Yeah, it’s Eiffel heavy, but the principles should be applied everywhere.

  38. Avatar
    Tom Drummond about 23 hours later:

    This comment is a response to all the comments about “reading these papers as programmer is nearly useless”. I realise I won’t change their mind and will not attempt to, but hopefully there will be some people reading the comments who don’t know why it is a good idea to read papers and I aim to shed some light.

    1. These papers are written by people who are much more skilled than you, at least in the area they are writing about although probably in most other areas of computing as well. I’m not slandering your skills but merely pointing out that these authors know their stuff and you can learn from them.

    2. Despite what you may think, a lot of research done 20, 30, 40, etc. etc. years ago is still hugely important. For example, one of the papers listed above (“Can programming be liberated from the von Neumann style?”) discusses something that is important to the next generation of compilers. Many people think that the von Neumann style is hindering our ability to achieve the parallelism needed to take advantage of the huge number of cores that are going to be placed on computer chips in the near future.

    3. You’ll gain a greater understanding of how the system beneath the level you are working at work. If you’re working at an application level then it’s a pretty good idea to have an understanding of how compilers work; how they optimise code and so forth.

    Of course there are a number of other reasons (general interest, wanting to improve your knowledge) but I feel the three above are sufficient incentive.

    If you’re the kind of developer who is happy just to learn the next big language and write some code, then you are probably not going to be the kind of person who would read these papers. But if you actually take an interest in what your profession is and want to really understand what you are doing and why, then reading papers is one of the best ways to help achieve this aim.

  39. Avatar
    Mallow about 24 hours later:

    Learn to work with the goop and sludge of team programming and unworldly deadlines. Read “The Mythical Man Month” by Fred Brooks.

  40. Avatar
    Mallow about 24 hours later:

    Learn to work with the goop and sludge of team programming and unworldly deadlines. Read “The Mythical Man Month” by Fred Brooks.

  41. Avatar
    Kyle Maxwell 1 day later:
  42. Avatar
    Erik 1 day later:

    Saul, welcome to the Internet. The ridiculous ones are the people who criticize accidental double posting and casual mistakes in spelling.

    I gotta agree with Axel Busch, Joel Spolky’s 12 Steps to Better Code has made my life a LOT easier. It ought to be on every programmer’s to-read list, though I would consider it “basic skills.”

  43. Avatar
    Brett L. Schuchert 1 day later:

    casmrv wrote:

    http://en.wikipedia.org/wiki/Object-Oriented_Software_Construction

    +1. I owned the first and second edition. I read the second edition cover to cover (through page 1080) and though it was excellent. Want to understand covariance, contravariance? Want to understand why multiple inheritance is required for a complete type system (in a class-based, statically typed OO language), this is the book to read. Great book.

  44. Avatar
    Esko Luontola 1 day later:

    Michael, would please you edit your posts so that they have only a short summary visible on the front page of http://blog.objectmentor.com/ ? Now this post and The Orange Model fill it almost completely, so that seeing where there are new replies requires lots of scrolling.

  45. Avatar
    Esko Luontola 1 day later:

    Michael, would please you edit your posts so that they have only a short summary visible on the front page of blog.objectmentor.com? Now this post and The Orange Model fill it almost completely, so that seeing where there are new replies requires lots of scrolling.

  46. Avatar
    Dave Smith 1 day later:

    My initial reaction was also that “No Silver Bullet” deserved a spot on the list, but perhaps that’s for another list. Say, the “Ten Papers Every Project Leader Should Read” list.

  47. Avatar
    Curtis Cooley 1 day later:

    Thanks for the list, Michael. And thanks to all the other commenters for adding there favorites as well.

    I just read “A Laboratory For Teaching Object-Oriented Thinking” for at least the second time, and it made more sense than ever.

    And thanks for posting papers and not books. I already have an insurmountable list of books to read. I can get through a paper here and there.

    Keep up the good work.

  48. Avatar
    TheBSinCSisHere 1 day later:

    Wow. That ten papers would have been on my list of “papers of no CS value” lecture. 80% of them are the reason why CS has fallen in the gutter over the last 25 years. Get back to mathematics. There were programmers that wrote programs 500 years before digital computers were even developed. Only then you will have some foundations for the long run.

  49. Avatar
    Sam 1 day later:

    I would definitely add the following documents into the mix too:

    • Dijkstra, Edsgar. “The Humble Programmer”. Communications of the ACM, 1972
    • Dijkstra, Edsgar. EDW1157

    Both of these papers foretell the importance of highly iterative software development methodologies, and the importance of matching a formal specification (which, now-a-days, means the complete set of tests as produced by following TDD) against an implementation.

    I should also mention that I have been very successful in iterative design-by-contract and other applications of honest-to-goodness formal proofs for my software as well. As EDW states, a test only proves compliance with one requirement, but it does not demonstrate the absence of bugs. I find combining TDD and formal proofs a potent and useful combination.

  50. Avatar
    John 1 day later:
  51. Avatar
    Marc Brooks 1 day later:

    I third the recommendation for What every computer scientist should know about floating point arithmetic.

  52. Avatar
    Tim 1 day later:

    Met you guys at SD West 2004. What I learned there changed my life! You can’t believe how fast I bookmarked those links.

    Very awesome for Michael to do this.

  53. Avatar
    David 1 day later:

    Mmmhh… Would the table of contents of “Facts and Fallacies of Software Engineering” (Robert L. Glass) count as a “paper”?

  54. Avatar
    BillinDetroit 2 days later:

    I can’t program my tail out of a wet paper bag but I appreciate anyone who would at least attempt to put such a list together for public consumption. Maybe his list sucked (maybe not), but just look at all the recommendations that have flowed from it!

    He has just done what Linus Toorvalds did … he put a nugget of an idea out there and got many other good minds to work on the problem. Now THAT is programming!

    He postulated a problem and the problem itself generated an answer. Welcome to distributed / community computing.

  55. Avatar
    Sonny Gill 3 days later:

    I haven’t read a lot of computer science, but one of the most insightful and thought provoking pieces I read was Peter Naur’s Programming as Theory Building.

    Thanks for publishing this list. I am a lonely programmer trying to sharpen my saw when I can, and this list is going to be very useful.

  56. Avatar
    Axel Busch 3 days later:

    Uups, I totally forgot my favorite ‘paper’ on (unit) testing: “The Way of Testivus” – http://www.artima.com/weblogs/viewpost.jsp?thread=203994

    And it’s a lot of fun to read, too :-)

  57. Avatar
    Simon Hawkin 3 days later:

    Thanks for the list. Together with the ones listed in the comments, these papers form a strong trails of thought on a variety of topics relevant today as, indeed, 40 and 50 years ago. (Well, not all of them are that old.)

    Someone asked a question what makes these papers good. I think it could be a start of an interesting meta-discussion which however would belong to the department of philosophy of science more than that of computer science.

    Someone else called you arrogant. I think we can live with that.

    Thanks again.

  58. Avatar
    Philip Schwarz 3 days later:

    @Michael Feathers

    Hi Michael…

    of ‘On the criteria to be used in decomposing systems into modules’ , you said:

    This is a very old paper, but it is more than a classic. In it, Parnas introduces a forerunner to the Single Responsibility Principle. He introduces the idea that we should use modularity to hide design decisions – things which could change. People still don’t consider this as often as they should.

    I have been trying to understand what you mean by ‘a forerunner to the Single Responsibility Principle’.

    In Protected Variation: The Importance of Being Closed, Craig Larman says:

    Information hiding is PV, not data encapsulation ‘On the Criteria To Be Used in Decomposing Systems Into Modules’ is a classic that is often cited but seldom read. In it, Parnas introduces information hiding. Many people have misinterpreted the term as meaning data encapsulation, and some books erroneously define the concepts as synonyms. Parnas intended it to mean hide information about the design from other modules, at the points of difficult or likely change. ...

    That is, Parnas’s information hiding is the same principle expressed in PV or OCP, it is not simply data encapsulation, which is but one of many techniques to hide design information. However, the term has been so widely reinterpreted as a synonym for data encapsulation that it is no longer possible to use it in its original sense without misunderstanding it.

    Here, PV is Alistair Cockburn’s Protected Variation pattern:

    Identify points of predicted variation and create a stable interface around them

    So Larman is saying: INFORMATION HIDING = OCP = PV

    At first I thought that if SRP was closely related to OCP, like DIP (which is a means to achieve OCP) and LSP (which is necessary to achieve OCP), then maybe by some sort of transitivity, you meant that information hiding was a forerunner of SRP. But my understanding is that SRP and OCP are two separate principles.

    So what did you mean?

  59. Avatar
    Philip Schwarz 3 days later:

    @Michael Feathers

    Hi Michael,

    another attempt at understanding what you meant when, regarding ‘On the criteria to be used in decomposing systems into modules’ (OTC), you said:

    This is a very old paper, but it is more than a classic. In it, Parnas introduces a forerunner to the Single Responsibility Principle. He introduces the idea that we should use modularity to hide design decisions – things which could change. People still don’t consider this as often as they should.

    I first read the OTC paper when I was searching for the origins of the term Separation of Concerns. While the term was coined by Edsger Dijkstra in his 1976 paper ‘Notes on Structured Programming’:

    design should start be enumerating the ‘separable concerns’ and by considering each group of concerns independently of the others

    most books and papers attribute the concept to David Parnas, who did not use the words ‘Separation of Concerns’ (SoC), but who expressed the concept in the OTC paper (1972):

    we propose that [to decompose a system into modules] one begins with a list of difficult design decisions, or decisions which are likely to change…each module is then designed to hide such a decision from others

    Based on this (and the rest of the paper), I concluded that at the time of the paper, SoC could be defined as follows:

    The modularisation of s/w, using information hiding, to achieve the benefits of s/w flexibility, shorter s/w development times, and s/w understandability

    Many more modularisation criteria have been used to do Separation of Concerns, e.g. AOP aka advanced separation of concerns.

    Two classic criteria are:

    *low coupling
    *high cohesion

    OO decomposition directly supports the first, and we have often been told to aim for the second one.

    Of the SRP, Uncle Bob said:
    This principle was described in the work of DeMarco and Meilir Page-Jones, They called it cohesion. ...

    SRP is one of the simplest of the principles, and one of the hardest to get right. Conjoining responsibilities is something we do naturally. Finding and separating those responsibilities from one another is much of what software design is really about.

    It seems to me that like ‘high cohesion’, SRP can be considered a (cohesion-related) modularisation criterion. But it is distinct from the modularisation criterion of information hiding.

    So what do you mean when you say that information hiding is a forerunner of SRP?

  60. Avatar
    Philip Schwarz 3 days later:

    @Michael Feathers

    Hi Michael,

    another attempt at understanding what you meant when regarding ‘On the criteria to be used in decomposing systems into modules’ (OTC), you said:

    This is a very old paper, but it is more than a classic. In it, Parnas introduces a forerunner to the Single Responsibility Principle. He introduces the idea that we should use modularity to hide design decisions – things which could change. People still don’t consider this as often as they should.

    I first read the OTC paper when I was searching for the origins of the term Separation of Concerns. While the term was coined by Edsger Dijkstra in his 1976 paper ‘Notes on Structured Programming’:

    design should start be enumerating the ‘separable concerns’ and by considering each group of concerns independently of the others

    most books and papers attribute the concept to David Parnas, who did not use the words ‘Separation of Concerns’ (SoC), but who expressed the concept in the OTC paper (1972):

    we propose that [to decompose a system into modules] one begins with a list of difficult design decisions, or decisions which are likely to change…each module is then designed to hide such a decision from others

    Based on this (and the rest of the paper), I concluded that at the time of the paper, SoC could be defined as follows:

    The modularisation of s/w, using information hiding, to achieve the benefits of, s/w flexibility, shorter s/w development times, and s/w understandability

    Many more modularisation criteria have been used to do Separation of Concerns, e.g. AOP aka advanced separation of concerns.

    Two classic criteria are:

    * low coupling
    * high cohesion

    OO decomposition directly supports the first, and we have often been told to aim for the second one.

    Of the SRP, Uncle Bob said:
    This principle was described in the work of DeMarco and Meilir Page-Jones, They called it cohesion. ...

    SRP is one of the simplest of the principles, and one of the hardest to get right. Conjoining responsibilities is something we do naturally. Finding and separating those responsibilities from one another is much of what software design is really about.

    Like ‘high cohesion’, SRP can be considered a (cohesion-related) modularisation criterion. But it is distinct from the modularisation criterion of information hiding.

    So what do you mean when you say that information hiding is a forerunner of SRP?

  61. Avatar
    Michael Feathers 3 days later:

    Philip: It’s a funny thing about the design principles. I think that often if you take one, you get many of the others by implication. If you concentrate on SRP, you can end up with OCP without even thinking about it. I think the same is true of OCP.. If you really push it, you will end up with modules with single responsibilities. That’s the sense that I meant.

    I don’t know this for sure, but I have a feeling that OCP came before SRP historically. But, somehow I think that SRP (or some generalization of it) is primary. Consider duplication. If we have duplication in a code base, a piece of code may have a single responsibility seen by itself, but from the perspective of the entire code base, it has some fraction of a particular responsibility if it is duplicated in a couple of different places.

  62. Avatar
    drozzy 4 days later:

    Thanks for the list!

  63. Avatar
    David Stamm 4 days later:

    Thanks so much for putting together this list. Lists, like academic papers, tend to foment passioante discussion and can occasionally lead to great things.

    I was astonished at the rudeness of many of the commenters here. This was not a provocative or controversial post. And yet the hostility of a number of the comments was pretty shocking.

    (FPM’s comment about being a homeless rodeo clown did sort of make my day – thanks for leaving that one up.)

  64. Avatar
    www.EdmundKirwan.com 6 days later:

    My two favourite papers: the Parnas’s, “On the criteria …” which you rightly have in first place and the paper that brought us coupling and cohesion, “Structured design,” by Stevens, Myers and Constantine: www.research.ibm.com/journal/sj/132/ibmsj1302C.pdf

    I’ve always been mildly surprised that coupling and cohesion are the only things that made it big from this paper; the concepts of scope of control and scope of effect are astonishing to me.

    Ed.

  65. Avatar
    Patrick Logan 6 days later:

    A great list. There are many more to be considered, but a couple that happen to be related to some already on the list…

    Parnas and Clements, “A Rational Design Process: How and Why to Fake It” http://www.win.tue.nl/~mchaudro/sa2007/ParnasRationalDesign.pdf

    Cunningham, “Everything I Really Need to Know About Object-Oriented Design I Could Learn on a Black-Diamond Run” http://c2.com/doc/everything.html

  66. Avatar
    hoggarth@gmail.com 7 days later:

    Thank you! It’s nice to understand what you expect of your audience.

  67. Avatar
    Trencher93 7 days later:

    Sad that so many important documents in computer science history are owned, locked behind a pay wall, and denied to the public by the ACM.

  68. Avatar
    Trencher93 7 days later:

    Sad that so many important documents in computer science history are owned, locked behind a pay wall, and denied to the public by the ACM.

  69. Avatar
    Th3Du 9 days later:

    As much as I’d like to read these I dont have money to buy these. Why cant we have open papers like open source. That would be cool

  70. Avatar
    sxiom 11 days later:
    Hi, only parnas is worth reading. the other papers are b….. or only mathusulem. He received the ACM Turing Award for his work on Fortran!! UPPS Hi mr. Bakus!!!! hi Mr. bakus: are you for citibank programming in cobol? or you mr. Feathers ?
  71. Avatar
    skarnis 15 days later:

    It is up to the individual to read or not read the papers. I am not going to provide links, but I was successful in finding every paper discussed in free pdf files. I did not check for the books.

    Thank you for the list. I have some reading to catch up on as many of these papers are before my time. I may not read them all, but I will at least start them. If somebody I respect in the field recommends them, and other people I respect in the field backs them up, then they are worth the time to at least investigate.

  72. Avatar
    sir jorge 15 days later:

    It’s true, I agree wholeheartedly.

  73. Avatar
    Kjellski about 1 month later:

    Nice article. I would love to read six, seven, eight and ten too, but they´re dead.

    Thanks for this article.

    Greetings, Kjellski

  74. Avatar
    Kjellski about 1 month later:

    Nice article. I would love to read six, seven, eight and ten too, but they´re dead.

    Thanks for this article.

    Greetings, Kjellski

  75. Avatar
    Chuck vdL about 1 month later:

    Nice article. I would love to read six, seven, eight and ten too, but they´re dead.

    Really? I am able to locate copies that are very much alive for me, perhaps you should become a tool user

  76. Avatar
    sanjeevakumar@gmail.com 3 months later:

    11th Paper suggestion – E.W. Dijkstra – Cruelty of Really Teaching Computer Science – www.cs.utexas.edu/~EWD/ewd10xx/EWD1036.PDF

  77. Avatar
    Philippe Back 3 months later:

    Speaking of Parnas, I like Parnas and Clemens:

    A RATIONAL DESIGN PROCESS: HOW AND WHY TO FAKE IT

    http://web.cs.wpi.edu/~gpollice/cs3733-b05/Readings/FAKE-IT.pdf

    Super nice!

  78. Avatar
    Baseball Bats For Sale 4 months later:

    Fantastic resource. Thanks

  79. Avatar
    MANDY 6 months later:

    THANKS FOR ADDING SUCH GOOD BOOKS

  80. Avatar
    MANDY 6 months later:

    EVEN THANKS EVERY ONE WHO HAS RECOMMENDED THIER VIEWS IN THIS BLOG AND Michael Feathers TOO

  81. Avatar
    dc0de 7 months later:

    How about Networking for dummies?

    Too many programmers don’t understand the absolute basics, and therefore are repeating failures of 15 to 20 years ago.

    Time to get over yourselves, you’re just code monkeys… and I’m reading your copy of Shakespeare; it blows.

  82. Avatar
    AlexanderZZ 7 months later:

    UncleBob wrote:

    | Would you like me to write your code for you too?

    Yes! That’s why I use frameworks, samples, libraries, so that I don’t have to re-invent the wheel.

    | YOU search for the free papers if you don’t want to pay for them.

    Why have everyone do it? Surely it would benefit everyone if it was done once and the information shared?

    Has Uncle Bob forgotten re-use? :-)

  83. Avatar
    Ricky Martin 9 months later:

    Good Reading !

  84. Avatar
    Soup recipes 9 months later:

    Great article, i have already read the one by Richard Gabriel on lisp and it was just great, very good food for though, so i’ll sure take a look at your suggestions! Always hungry for great books.

  85. Avatar
    PhilGo20 10 months later:

    Thanks for the list !

    I’ve really enjoyed reading : On the criteria to be used in decomposing systems into modules – David Parnas

    and

    Arguments and Results – James Noble

    I should get back to read classic papers !

Comments