Git Product home page Git Product logo

software-papers's Introduction

Papers for Software Engineers workflow

A curated list of papers that may be of interest to Software Engineering students or professionals.


  1. Computing Machinery and Intelligence. Turing (1950).
    • Some Moral and Technical Consequences of Automation. Wiener (1960).
    • ELIZAā€”a computer program for the study of natural language communication between man and machine. Weizenbaum (1966).
  2. The Education of a Computer. Hopper (1952).
  3. A Method for the Construction of Minimum-Redundancy Codes. Huffman (1952).
  4. On the Shortest Spanning Subtree of a Graph and the Traveling Salesman Problem. Kruskal (1956).
  5. A Relational Model of Data for Large Shared Data Banks. Codd (1970).
  6. On the Criteria To Be Used in Decomposing Systems into Modules. Parnas (1971).
  7. The UNIX Time- Sharing System. Ritchie, Thompson (1974).
  8. A Protocol for Packet Network Intercommunication. Cerf, Kahn (1974).
    • Ethernet: Distributed packet switching for local computer networks. Metcalfe, Boggs (1978).
    • An algorithm for distributed computation of a Spanning Tree in an Extended LAN. Perlman (1985).
  9. Programming with Abstract Data Types. Liskov, Zilles (1974).
  10. Computer Programming as an Art. Knuth (1974).
  11. The Mythical Man Month. Brooks (1975).
  12. New Directions in Cryptography. Diffie, Hellman (1976).
  13. Communicating sequential processes. Hoare (1976).
  14. Time, Clocks, and the Ordering of Events in a Distributed System. Lamport (1978).
  15. The Ubiquitous B-Tree. Comer (1979).
  16. End-To-End Arguments in System Design. Saltzer, Reed, Clark (1984).
  17. No Silver Bullet: Essence and Accidents of Software Engineering. Brooks (1987).
  18. Why Functional Programming Matters. Hughes (1990).
  19. The anatomy of a large-scale hypertextual Web search engine. Brin, Page (1998).
  20. Harvest, Yield, and Scalable Tolerant Systems. Fox, Brewer (1999).
  21. Dynamo, Amazonā€™s Highly Available Key-value store. DeCandia et al (2007).
  22. On Designing and Deploying Internet Scale Services. Hamilton (2007).
  23. Bitcoin, A peer-to-peer electronic cash system. Nakomoto (2008).
    • Ethereum: A Next-Generation Smart Contract and Decentralized Application Platform. Buterin (2014).
  24. Thinking Methodically about Performance. Gregg (2012).

Show full list in chronological order
  1. As We May Think. Bush (1945)
  2. Computing Machinery and Intelligence. Turing (1950)
  3. The Education of a Computer. Hopper (1952)
  4. A Method for the Construction of Minimum-Redundancy Codes. Huffman (1952)
  5. On the Shortest Spanning Subtree of a Graph and the Traveling Salesman Problem. Kruskal (1956)
  6. A Note on Two Problems in Connexion with Graphs. Dijkstra (1959)
  7. Some Moral and Technical Consequences of Automation. Wiener (1960)
  8. Recursive Programming. Dijkstra (1960)
  9. Recursive Functions of Symbolic Expressions and Their Computation by Machine. McCarthy (1960)
  10. Quicksort. Hoare (1962)
  11. An Experimental Time-Sharing System. CorbatĆ³, Merwin Daggett, Daley (1962)
  12. Solution Of a Problem in Concurrent Program Control. Dijkstra (1965)
  13. ELIZAā€”a computer program for the study of natural language communication between man and machine. Weizenbaum (1966)
  14. The Next 700 Programming Languages. Landin (1966)
  15. Goto Statement Considered Harmful. Dijkstra (1968)
  16. The Structure of the "THE"-Multiprogramming System. Dijkstra (1968)
  17. How do committees invent?. Conway (1968)
  18. Scatter storage techniques. Morris (1968)
  19. An Axiomatic Basis for Computer Programming. Hoare (1969)
  20. A Relational Model of Data for Large Shared Data Banks. Codd (1970)
  21. Managing the Development of Large Software Systems. Royce (1970)
  22. Space/Time Trade-offs in Hash Coding with Allowable Errors. Bloom (1970)
  23. On the Criteria To Be Used in Decomposing Systems into Modules. Parnas (1971)
  24. Program development by stepwise refinement. Wirth (1971)
  25. Reducibility among Combinatorial Problems. Karp (1972)
  26. Information Distribution Aspects of Design Methodology. Parnas (1972)
  27. A Design Methodology for Reliable Software Systems. Liskov (1972)
  28. The Humble Programmer. Dijkstra (1972)
  29. The UNIX Time- Sharing System. Ritchie, Thompson (1974)
  30. A Protocol for Packet Network Intercommunication. Cerf, Kahn (1974)
  31. Programming with Abstract Data Types. Liskov, Zilles (1974)
  32. Computer Programming as an Art. Knuth (1974)
  33. Monitors: An operating system structuring concept. Hoare (1974)
  34. Self-stabilizing systems in spite of distributed control. Dijkstra (1974)
  35. Ordered hash tables. Amble, Knuth (1974)
  36. The Mythical Man Month. Brooks (1975)
  37. Granularity of Locks and Degrees of Consistency in a Shared Data Base. Gray et al (1975)
  38. New Directions in Cryptography. Diffie, Hellman (1976)
  39. Communicating sequential processes. Hoare (1976)
  40. Big Omicron and big Omega and big Theta. Knuth (1976)
  41. System R: Relational Approach to Database Management. Astrahan et al. (1976)
  42. A Universal Algorithm for Sequential Data Compression. Ziv, Lempel (1977)
  43. Time, Clocks, and the Ordering of Events in a Distributed System. Lamport (1978)
  44. Ethernet: Distributed packet switching for local computer networks. Metcalfe, Boggs (1978)
  45. A Method for Obtaining Digital Signatures and Public-Key Cryptosystems. Rivest, Shamir, Adleman (1978)
  46. On the Duality of Operating System Structures. Lauer, Needham (1978)
  47. Can Programming Be Liberated from the von Neumann Style?. Backus (1978)
  48. The Art of the Interpreter. Steele, Sussman (1978)
  49. The Ubiquitous B-Tree. Comer (1979)
  50. Access Path Selection in a Relational Database Management System. Selinger et al (1979)
  51. Designing Software for Ease of Extension and Contraction. Parnas (1979)
  52. The paradigms of programming. Floyd (1979)
  53. How To Share A Secret. Shamir (1979)
  54. A Certified Digital Signature. Merkle (1979)
  55. The Transaction Concept: Virtues and Limitations. Gray (1981)
  56. The Emperorā€™s Old Clothes. Hoare (1981)
  57. The Semantic Elegance of Applicative Languages. Turner (1981)
  58. The Byzantine Generals Problem. Lamport, Shostak, Pease (1982)
  59. Hints for Computer System Design. Lampson (1983)
  60. Ironies of automation. Bainbridge (1983)
  61. End-To-End Arguments in System Design. Saltzer, Reed, Clark (1984)
  62. The Modular Structure of Complex Systems. Parnas, Clements, Weiss (1984)
  63. Reflections on Trusting Trust. Thompson (1984)
  64. Literate Programming. Knuth (1984)
  65. Amortized Computational Complexity. Tarjan (1985)
  66. An algorithm for distributed computation of a Spanning Tree in an Extended LAN. Perlman (1985)
  67. On understanding types, data abstraction, and polymorphism. Cardelli, Wegner (1985)
  68. Programming as Theory Building. Naur (1985)
  69. Impossibility of Distributed Consensus With One Faulty Process. Fisher, Lynch, Patterson (1985)
  70. The design of POSTGRES. Stonebraker, Rowe (1986)
  71. Making data structures persistent. Driscoll et al (1986)
  72. No Silver Bullet: Essence and Accidents of Software Engineering. Brooks (1987)
  73. Why Functional Programming Matters. Hughes (1990)
  74. Toward higher-level abstractions for software systems. Shaw (1990)
  75. The Design and Implementation of a Log-Structured File System. Rosenblum, Ousterhout (1991)
  76. SELF: The Power of Simplicity. Ungar, Smith (1991)
  77. Lisp: Good news, bad news, how to win big. Gabriel (1991)
  78. Foundations for the Study of Software Architecture. Perry, Wolf (1992)
  79. Software Aging. Parnas (1994)
  80. A Note on Distributed Computing. Waldo et al (1994)
  81. How to Build a Highly Available System Using Consensus. Lampson (1996)
  82. Software Engineering: An Unconsummated Marriage. Parnas (1997)
  83. Software Transactional Memory. Shavit, Touitou (1997)
  84. The anatomy of a large-scale hypertextual Web search engine. Brin, Page (1998)
  85. The Cathedral and the Bazaar. Raymond (1998)
  86. The Part-Time Parliament. Lamport (1998)
  87. Harvest, Yield, and Scalable Tolerant Systems. Fox, Brewer (1999)
  88. The PageRank Citation Ranking: Bringing Order to the Web. Page, Brin, Motwani (1999)
  89. QuickCheck: A Lightweight Tool for Random Testing of Haskell Programs. Claessen, Hughes (2000)
  90. How Complex Systems Fail. Cook (2000)
  91. Paxos made simple. Lamport (2001)
  92. K-Anonymity: A Model For Protecting Privacy. Sweeney (2002)
  93. Recovery Oriented Computing (ROC): Motivation, Definition, Techniques, and Case Studies. Patterson et al (2002)
  94. The Google File System. Ghemawat, Gobioff, Leung (2003)
  95. Crash-Only Software. Candea, Fox (2003)
  96. MapReduce: Simplified Data Processing on Large Clusters. Dean, Ghemawat (2004)
  97. Out of the Tar Pit. Moseley, Marks (2006)
  98. Bigtable: A Distributed Storage System for Structured Data. Chang et al (2006)
  99. Performance Anti-Patterns. Smaalders (2006)
  100. Dynamo, Amazonā€™s Highly Available Key-value store. DeCandia et al (2007)
  101. On Designing and Deploying Internet Scale Services. Hamilton (2007)
  102. Bitcoin, A peer-to-peer electronic cash system. Nakomoto (2008)
  103. ZooKeeper: wait-free coordination for internet scale systems. Hunt et al (2010)
  104. Thinking Clearly about Performance. Millsap (2010)
  105. Kafka: a Distributed Messaging System for Log Processing. Kreps, Narkhede, Rao (2011)
  106. Thinking Methodically about Performance. Gregg (2012)
  107. CAP Twelve Years Later: How the "Rules" Have Changed. Brewer (2012)
  108. In Search of an Understandable Consensus Algorithm. Ongaro, Ousterhout (2014)
  109. The Network is Reliable. Bailis, Kingsbury (2014)
  110. Ethereum: A Next-Generation Smart Contract and Decentralized Application Platform. Buterin (2014)
  111. A Critique of the CAP Theorem. Martin Kleppmann (2015)
  112. Amazon Aurora: Design Considerations for High Throughput Cloud-Native Relational Databases. Verbitski et al (2017)
  113. Nines are Not Enough: Meaningful Metrics for Clouds. Mogul, Wilkes (2019)

This list was inspired by (and draws from) the Papers We Love project and the Ideas That Created the Future book by Harry R. Lewis. I also found the morning paper blog to be an extremely useful resource. For distributed systems, I used Distributed systems for fun and profit and for Relational Data Bases, I used the Red Book.

Meta reads

A few interesting resources about reading papers from Papers We Love and elsewhere:

Selection criteria

  1. The list should stay short. Let's say no more than 30 papers.
    • The idea is not to include every interesting paper that I come across but rather to keep a representative list that's possible to read from start to finish with a similar level of effort as reading a technical book from cover to cover.
    • I tried to include one paper per each major topic and author. Since in the process I found a lot of noteworthy alternatives, related or follow-up papers and I wanted to keep track of those as well, I included them as sublist items (some of these sublists are currently longer than they should).
  2. The papers shouldn't be too long. For the same reasons as the previous item, I try to avoid papers longer than 20 or 30 pages.
  3. They should be self-contained and readable enough to be approachable by the casual technical reader.
  4. They should be freely available online.
  5. Although historical relevance was taken into account, I omitted seminal papers in the cases where I found them hard to approach, when the main subject of the paper wasn't the thing that made them influential, etc.
    • That being said, where possible I preferred the original paper on each subject over modern updates or summary papers.
  6. I tended to prefer topics that I can relate to my professional practice, typically papers originated in the industry or about innovations that later saw wide adoption. Similarly, I tended to skip more theoretical papers, those focusing on mathematical foundations for Computer Science, electronic aspects of hardware, etc.

Disclaimer: I'm not a frequent paper reader, so I made this list as a sort of roadmap for myself. I haven't read all of the papers in the list yet; as I do, I may find than some don't meet the described criteria after all and remove them, or decide to add new ones.

And, yes, this repository is a way to procrastinate on the actual reading after I finished making the list.

software-papers's People

Contributors

facundoolano avatar gsuaki avatar marcocampos avatar wenqingl avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    šŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. šŸ“ŠšŸ“ˆšŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ā¤ļø Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.