Software Carpentry logo

Bibliography

April 24, 2010: We are pleased to announce that Version 4 of this course is now under development. For updates and an early peek at the content, please check out the Software Carpentry blog at http://www.software-carpentry.org/blog/.

David J. Agans: Debugging: The Nine Indispensable Rules for Finding Even the Most Elusive Software and Hardware Problems. American Management Association, 2002, 0814471684.
Its first sentence says, "This book tells you how to find out what's wrong with stuff, quick," and that's exactly what it does. In fifteen (very) short chapters, the author presents nine simple rules to help you track down and fix problems in software, hardware, or anything else. His war stories are entertaining (although I think one or two are urban myths), and his advice is eminently practical.
Mike Andrews and James A. Whittaker: How to Break Web Software. Addison-Wesley, 2006, 0321369440.
This practical companion to [Whittaker 2003] catalogs things you can do to break web-based applications.
Ant: http://ant.apache.org, viewed 2006-02-20.
A Java-oriented build tool that uses XML files instead of Makefiles.
Apache Web Server: http://httpd.apache.org, viewed 2005-07-26.
The main site for the most widely-used web server in the world.
Jorge Aranda and Steve Easterbrook and Greg Wilson: "Requirements in the wild: How small companies do it". Proceedings of Requirements Engineering '07, 2007.
FIXME
V. R. Basili and B. T. Perricone: "Software Errors and Complexity: An Empirical Investigation". Communications of the ACM 27(1), 1984.
FIXME
V. R. Basili and L. C. Briand and W. L. Melo: "How Reuse Influences Productivity of Object-Oriented Systems". Communications of the ACM, 39(10), 1996.
FIXME
Kent Beck and Ward Cunningham: "A Laboratory for Teaching Object-Oriented Thinking". SIGPLAN Notices, 24(10), 1989.
The first description of CRC cards.
Bitten: http://bitten.cmlenz.net, viewed 2005-09-01.
A tool for running builds continuously in the background across multiple machines.
Barry Boehm: "The High Cost of Software". Practical Strategies for Developing Large Software Systems, Ellis Horowitz, 1975.
FIXME
Barry Boehm: "A Spiral Model of Software Development and Enhancement". IEEE Computer, 21(5), 1988.
Boehm's landmark description of spiral software development.
Barry Boehm and Victor R. Basili: "Software Defect Reduction Top 10 List". IEEE Computer, 34(1), 2001.
FIXME
Boost.Python: http://www.boost.org/libs/python/doc/, viewed 2006-04-28},
A C++ library that enables interoperability with Python.
Stewart Brand: How Buildings Learn: What Happens After They're Built. Penguin USA, 1995, 0140139966.
This beautiful, thought-provoking book starts with the observation that most architects spend their time re-working or extending existing buildings, rather than creating new ones from scratch. Of course, if Brand had written "program" instead of "building", and "programmer" where he'd written "architect", everything he said would have been true of computing as well. A lot of software engineering books try to convey the same message about allowing for change, but few do it so successfully. By presenting examples ranging from the MIT Media Lab to a one-room extension to a house, Brand encourages us to see patterns in the way buildings change (or, to adopt Brand's metaphor, the way buildings learn from their environment and from use). Concurrently, he uses those insights to argue that since buildings are always going to be modified, they should be designed to accommodate unanticipated change.
Frederick P. Brooks: The Mythical Man Month: Essays on Software Engineering. Addison-Wesley, 1995, 0201835959.
The classic text in software engineering, most famous for its discussion of how adding people to a project that's late will only make it later.
Bugzilla: http://www.bugzilla.org, viewed 2006-03-01.
An industrial-strength issue tracking system that is widely used in open source projects.
Elizabeth Castro: HTML for the World Wide Web: With XHTML and CSS. Peachpit Press, 2000, 0321130073.
A clean, clear, comprehensive guide to creating HTML for the web, with good coverage of Cascading Style Sheets (CSS).
Elizabeth Castro: XML for the World Wide Web. Peachpit Press, 2000, 0201710986.
Like other books in Peachpit's Visual Quickstart series, this one is beautifully designed, and easy to read without ever being condescending. Its 16 chapters and 4 appendices are organized into 1- and 2-page explanations of particular topics, from writing non-empty elements to namespaces, schemas, and XML transformation. Throughout, Castro strikes a perfect balance between "what", "why", and "how", and provides a surprising amount of detail without ever overwhelming the reader.
W.G. Chase and H.A. Simon: "Perception in chess". Cognitive Psychology, 4, 1973.
The original paper comparing the performance of novice and master chess players when confronted with actual and random positions.
S. R. Chidamber and C. F. Kemerer: "A Metrics Suite for Object Oriented Design". IEEE Transactions on Software Engineering, 20(6), 1994.
Introduced a widely-cited suite of object-oriented software metrics.
Jason Cohen: Best Kept Secrets of Code Review. Smart Bear Software, 2006, 1599160676.
FIXME
CollabNet: http://www.collab.net, viewed 2006-03-01.
A software project management portal used in both commercial and open source projects.
Andy Cole: "Runaway Projects---Causes and Effects". Software World (UK), 26(3), 1995.
FIXME
CruiseControl: http://cruisecontrol.sourceforge.net, viewed 2005-07-26.
A framework for managing continuous builds. Each time you update something in your version control repository, CruiseControl recompiles your code, re-runs your tests, and lets you (and your teammates) know if you've broken anything.
B. Curtis and H. Krasner and N. Iscoe: "A Field Study of the Software Design Process for Large Systems". Communications of the ACM, 31(11), 1988.
FIXME
CVS: http://www.cvshome.org, viewed 2006-02-17.
A version control system that has been the backbone of the open source movement almost since its inception. [Subversion] is slowly replacing it.
Cygwin: http://www.cygwin.com, viewed 2005-07-26.
A Linux-like environment for Windows, which brings with it a lot of other tools (like SSH and GNU Make).
DB2: http://www-306.ibm.com/software/data/db2, viewed 2005-02-24.
A high-end commercial databse management system from IBM.
Sasa M. Dekleva: "The Influence of the Information System Development Approach on Maintenance". Management Information Systems Quarterly, 16(3), 1992.
FIXME
Django: http://www.djangproject.com, viewed 2006-04-30.
A [Python] web application development framework with some of the same capabilities as [Ruby on Rails] (but not as many users, or as much documentation).
Matt Doar: Practical Development Environments. O'Reilly, 2005, 0596007965.
Matt Doar has produced a practical guide to what should be in every team's toolbox, how competing entries stack up, and how they ought to be used. This book covers everything from configuration management tools like CVS and [Subversion], to build tools (make, GNU's Autotools, Ant, Jam, and SCons), various testing aids, bug tracking systems, documentation generators, and we're still only at the halfway mark. He names names, provides links, and treats free and commercial offerings on equal terms. My copy currently has 28 folded-down corners, which is 28 more than most books get.
Docutils: http://docutils.sourceforge.net, viewed 2006-04-28.
Python's documentation utilities, which are designed to convert plain text documentation (such as docstrings) into HTML and other formats.
DrProject: http://www.third-bit.com/drproject, viewed 2006-03-01.
An entry-level software project management portal derived from Trac that has been tailored for classroom and small-team use.
Eclipse: http://www.eclipse.org, viewed 2005-08-10.
Originally developed by IBM for Java development, Eclipse is the biggest open source development environment around these days. There are literally hundreds of plugins for it, and hundreds of thousands of users. It's not for the faint of heart (and it definitely won't be happy on a four-year-old hand-me-down machine), but it's one of the real power tools of modern programming.
Stephen G. Eick, Todd L. Graves, Alan F. Karr, J.S. Marron, and Audris Mockus: "Does Code Decay? Assessing the Evidence from Change Management Data". IEEE Transactions on Software Engineering 27(1), 2001.
Analyzes the evolution of several million lines of telephone switching software over fifteen years to show that code quality, comprehensibility, and maintainability decline over time.
ElementTree: http://effbot.org/zone/element-index.htm, viewed 2006-04-28.
An alternative XML manipulation library for Python that pays more attention to the philosophy of the language than to standards like DOM.
Joanna Eley and Alexi Marmot: Understanding Offices. Penguin UK, 1999, 978-0140169126.
FIXME
Albert Endres and Dieter Rombach: A Handbook of Software and Systems Engineering. Pearson, 2003, 0321154207.
FIXME
F2PY: http://cens.ioc.ee/projects/f2py2e/, viewed 2006-04-28.
An open source tool to connect Python and Fortran code.
Michael E. Fagan: "Advances in Software Inspections". IEEE Transactions on Software Engineering, 12(7), 1986.
Empirical data showing that code reviews are the most effective way known to find bugs.
Chris Fehily: Python: Visual QuickStart Guide. Peachpit Press, 2006, 0321423135.
A gentle introduction to Python, beautifully typeset, with lots of helpful examples.
Chris Fehily: SQL: Visual QuickStart Guide. Peachpit Press, 2003, 0321118030.
This very readable book describes the subset of SQL that covers most real-world needs. While the book moves a little slowly in some places, the examples are exceptionally clear.
Stuart I. Feldman: "Make---A Program for Maintaining Computer Programs". Software: Practice and Experience, 9(4), 1979.
The original description of Make. Last time I checked, Stu Feldman was a vice president at IBM, which shows you just how far a good tool can take you...
Michael C. Feathers: Working Effectively with Legacy Code. Prentice-Hall PTR, 2005, 0131177052.
Most programmers spend most of their time fixing bugs, porting to new platforms, adding new features---in short, changing existing code. If that code is exercised by unit tests, then changes can be made quickly and safely; if it isn't, they can't, so your first job when you inherit legacy code should be to write some. That's where this book comes in. What to know three different ways to inject a test into a C++ class without changing the code? They're here. Want to know which classes or methods to focus testing on? Read his discussion of pinch points. Need to break inter-class dependencies in Java so that you can test one module without having to configure the entire application? That's in here too, along with dozens of other useful bits of information. Everything is illustrated with small examples, all of them clearly explained and to the point. There are lots of simple diagrams, and a short glossary; all that's missing is hype.
Firefox: http://www.mozilla.org/products/firefox, viewed 2005-07-26.
The best web browser around, where "best" means "nicest interface", "most extensible", and "least insecure".
Karl Fogel: Producing Open Source Software. O'Reilly, 2005, 0596007590.
A community is more than just a bunch of people. It's a shared set of values, and rules for how to behave. By this standard, the open source community isn't just what some programmers choose to do with their time, and why; it's also how they do it. This book is an excellent guide to that "how". Every page offers practical advice; every point is made clearly and concisely, and clearly draws upon the author's extensive personal experience. Want to know how to earn commit privileges on a project? It's here. Do you and other project members have irreconcilable differences? Fogel explains when and how to fork, and what the pros and cons are. Want to get your project more attention? Want to take something closed, and open it up? It's all here, and much more.
Martin Fowler: Refactoring: Improving the Design of Existing Code. Addison-Wesley Professional, 1999, 0201485672.
Like architects, most programmers spend most of their time renovating, rather than creating something completely new on a blank sheet of paper. This book presents and analyzes patterns that come up again and again when programs are being reorganized. Some of these are well-known, such as placing common code in a utility method. Others, such as replacing temporary objects with queries, or replacing constructors with factory methods, are subtler, but no less important. Each entry includes a section on motivation, the mechanics of actually carrying out the transformation, and an example in Java.
Jeffrey E. F. Friedl: Mastering Regular Expressions. O'Reilly, 2002, 0596002890.
The definitive programmer's guide to regular expressions.
Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides: Design Patterns. Addison-Wesley, 1995, 0201633612.
The book that started the software design patterns movement. Much of the discussion has been superseded by more recent books, and the use of C++ and Smalltalk for examples feels a little dated, but it is still a landmark in programming.
GDB: http://www.gnu.org/software/gdb, viewed 2006-04-23.
The GNU Project debugger is a program that watches and manipulates other programs. It works with many languages, on many platforms; when combined with DDD, it's actually not that hard to use.
Robert L. Glass: Building Quality Software. Prentice-Hall, 1992.
FIXME
Robert L. Glass: "The Realities of Software Technology Payoffs". Communications of the ACM, 42(2), 1999.
FIXME
Robert L. Glass: Facts and Fallacies of Software Engineering. Addison-Wesley Professional, 2002, 0321117425.
I really wish someone had given me something like this book when I took my first programming job. If nothing else, it would have been a better way to start thinking about the profession I had stumbled into than the "everybody knows" factoids that I soaked up at coffee time. Some of what he says is well-known: good programmers are up to N times better than bad ones (his value for N is 28), reusable components are three times harder to build than non-reusable ones, and so on. Other facts aren't part of the zeitgeist, though they should be. For example, most of us know that maintenance consumes 40-80% of software costs, but did you know that roughly 60% of that is enhancements, rather than bug fixes? Or that if more than 20-25% of a component has to be modified, it is more efficient to re-write it from scratch? Best of all, Glass backs up every statement he makes with copious references to the primary literature; if you still disagree with him, you'd better be sure you have as much evidence for your point of view as he has for his.
Gnumeric: http://www.gnome.org/projects/gnumeric/, viewed 2006-04-08.
A cross-platform open source spreadsheet.
John Goerzen: Foundations of Python Network Programming. APress, 2004, 1590593715.
This book looks at how to handle several common protocols, including HTTP, SMTP, and FTP. Goerzen also doesn't delve as deeply into their internals, but instead on how to build clients that use them. His approach is to build solutions to complex problems one step at a time, explaining each addition or modification along the way. He occasionally assumes more background knowledge than most readers of this book are likely to have, but only occasionally, and makes up for it by providing both clear code, and clear explanations of why this particular function has to do things in a particular order, or why that one really ought to be multithreaded.
Nathan A. Good: Regular Expression Recipes. APress, 2005, 159059441X.
A great how-to for regular expressions, with examples in many different languages.
Mike Gunderloy: Coder to Developer: Tools and Strategies for Delivering Your Software. Sybex, 2004, 078214327X.
This practical, readable book is subtitled "Tools and Strategies for Delivering Your Software", and that's exactly what it's about. Project planning, source code control, unit testing, logging, and build management are all there. Importantly, so are newer topics, like building plugins for your IDE, code generation, and things you can do to protect your intellectual property. Everything is clearly explained, and illustrated with well-chosen examples. While the focus is definitely on .NET, Gunderloy covers a wide range of other technologies, both proprietary and open source. I'm already using two new tools based on references from this book, and plan to make the chapter on "Working with Small Teams" required reading for my students.
R. G. Hamlet and R. Taylor: "Partition Testing Does Not Inspire Confidence". IEEE Transactions on Software Engineering, 16(12), 1990.
FIXME
Nick Hammond: "Software Carpentry --- A Tool-Based Approach to Monte Carlo Radiation Transport". Proc. 8th Int'l Conference on Radiation Shielding, 1994.
A prior use of the phrase "software carpentry".
Elliotte Rusty Harold: Effective XML. Addison-Wesley, 2004, 0321150406.
This book explains which of XML's many features should be used when: Item 12 tells you to store metadata in attributes, and then spends six pages explaining why, while Item 24 analyzes the strengths and weaknesses of various schema languages, and Item 38 covers character set encodings. It's more than most developers will ever want to know, but when you need it, you really need it.
J. D. Herbsleb and R. E. Grinter: "Splitting the Organization and Integrating of Code: Conway's Law Revisited". Proc. ICSE'99, 1999.
FIXME
Roger R. Hock: Forty Studies that Changed Psychology. Prentice Hall, 2004, 0131147293.
In forty short chapters, Hock describes the turning points in our understanding of how our minds work. The book isn't just about psychology; you'll also learn a lot about how science gets done, and about the scientists who do it.
H. F. Hofmann and F. Lehner: "Requirements Engineering as a Sucess Factor in Software Projects". IEEE Software, 18(4), 2001.
FIXME
Watts S. Humphrey: Introduction to the Personal Software Process. Addison-Wesley, 1996, 0201548097.
A methodology for improving programmers' productivity by having them record and track just about everything they do. The idea has a lot of merit, but in practice, the cost of record keeping can outweigh the benefits.
Andrew Hunt and David Thomas: The Pragmatic Programmer: From Journeyman to Master. Addison-Wesley, 1999, 020161622X.
This book is about those things that make up the difference between typing in code that compiles, and writing software that reliably does what it's supposed to. Topics range from gathering requirements through design, to the mechanics of coding, testing, and delivering a finished product. The second section, for example, covers "The Evils of Duplication", "Orthogonality", "Reversibility", "Tracer Bullets", "Prototypes and Post-It Notes", and "Domain Languages", and illuminates each with plenty of examples and short exercises.
Jeff Johnson: GUI Bloopers: Don'ts and Do's for Software Developers and Web Designers. Morgan Kaufmann, 2000, 1558605827.
Most books on GUI design are long on well-meaning aesthetic principles, but short on examples of what it means to put those principles into practice. In contrast, GUI Bloopers presents case study after case study: what's wrong with this dialog? What should its creators have done instead. And, most importantly, why? The net effect is to teach all of the same principles that other books try to, but in a grounded, understandable way.
JUnit: http://www.junit.org/, viewed 2006-02-22.
A unit testing framework for Java that has inspired many workalikes and extensions.
Brian W. Kernighan and Rob Pike: The Unix Programming Environment. Prentice Hall, 1984, 013937681X.
I have long believed that this book is the real secret to Unix's success. It doesn't just show readers how to use Unix---it explains why the operating system is built that way, and how its "lots of little tools" philosophy keeps simple tasks simple, while making hard ones doable.
Brian W. Kernighan and Dennis Ritchie: The C Programming Language. Prentice Hall PTR, 1998, 0131103628.
The classic description of the one programming language every serious programmer absolutely, positively has to learn.
Kid: http://kid.lesscode.org, viewed 2006-03-06.
An HTML templating system for Python.
Hans P. Langtangen: Python Scripting for Computational Science. Springer-Verlag, 2004, 3540435085.
The book's aim is to show scientists and engineers with little formal training in programming how Python can make their lives better. Regular expressions, numerical arrays, persistence, the basics of GUI and web programming, interfacing to C, C++, and Fortran: it's all here, along with hundreds of short example programs. Some readers may be intimidated by the book's weight, and the dense page layout, but what really made me blink was that I didn't find a single typo or error. It's a great achievement, and a great resource for anyone doing scientific programming.
Mark Lutz and David Ascher: Learning Python. O'Reilly, 2003, 0596002815.
This is not only the best introduction to Python on the market, it is one of the best introductions to any programming language that I have ever read. Lutz and Ascher cover the entire core of the language, and enough of its advanced features and libraries to give readers a feeling for just how powerful Python is. In keeping with the spirit of the language itself, their writing is clear, their explanations lucid, and their examples well chosen.
Make: http://www.gnu.org/software/make, viewed 2006-03-01.
The standard build tool for Unix. Users describe dependencies in a Makefile, along with the actions that must be executed to update a file if it is older than any of its dependencies. Make then determines which actions need to be executed, and an order in which they may safely be run.
Jane Margolis and Allan Fisher: Unlocking the Clubhouse: Women in Computing. MIT Press, 2002, 0262133989.
This book describes a project at Carnegie-Mellon University that tried to figure out why so few women become programmers, and what can be done to correct the imbalance. Its first six chapters describe the many small ways in which we are all, male and female, are conditioned to believe that computers are "boy's things". Sometimes it's as simple as putting the computer in the boy's room, because "he's the one who uses it most". Later on, the "who needs a social life?" atmosphere of undergraduate computer labs drives many women away (and many men, too). The last two chapters describe what the authors have done to remedy the situation at high schools and university. This work proves that by being conscious of the many things that turn women off computing, and by viewing computer science from different angles, we can attract a broader cross-section of society, which can only make our discipline a better place to be. The results are impressive: female undergraduate enrolment at CMU rose by more than a factor of four during their work, while the proportion of women dropping out decreased significantly.
Alex Martelli, Anna Ravenscroft, and David Ascher (eds.): Python Cookbook. O'Reilly, 2005, 0596007973.
A useful reference for every serious Python programmer, this book is a collection of tips and tricks, some very simple, others so complex that they require careful line-by-line reading. The book's companion web site [Python Cookbook] is updated regularly.
Thomas J. McCabe: "A Complexity Measure". IEEE Transactions on Software Engineering, 2(4), 1976.
First description of cyclomatic complexity.
Steve McConnell: Code Complete. Microsoft Press, 2004, 0735619670.
This classic is a handbook of do's and don'ts for working programmers. It covers everything from how to avoid common mistakes in C to how to set up a testing framework, how to organize multi-platform builds, and how to coordinate the members of a team. In short, it is everything I wished someone had told me before I started my first full-time programming job.
Microsoft Visual Studio: http://msdn.microsoft.com/vstudio/, viewed 2006-02-20.
A full-featured IDE for Microsoft Windows development.
G. J. Myers: "A Controlled Experiment in Program Testing and Code Walkthroughs/Inspections". Communications of the ACM, 21(9), 1978.
FIXME
MySQL: http://www.mysql.com, viewed 2005-07-29.
The most popular open source database around (though many discerning users prefer [PostgreSQL]).
Donald A. Norman: Things That Make Us Smart. Perseus, 1993, 978-0201626957.
FIXME
Oracle: http://www.oracle.com, viewed 2006-02-24.
A high-end commercial database system produced by a company of the same name.
George Orwell: "Politics and the English Language". http://www.george-orwell.org/Politics_and_the_English_Language/0.html, viewed 2006-04-28.
A brilliant description of how turgid language is often used as a substitute for thought. The particular examples may be a little dated, but Orwell's writing never is.
Perforce: http://www.perforce.com, viewed 2005-11-25.
An excellent commercial version control system.
Mark Pilgrim: Dive Into Python. APress, 2004, 1590593561.
A good introduction to Python, which is also available on-line.
A. A. Porter and L. G. Votta: "What Makes Inspections Work?". IEEE Software, 14(6), 1997.
FIXME
PostgreSQL: http://www.postgresql.org, viewed 2005-07-26.
The main site for an advanced open source relational database. It may not be as popular as its main competitor, MySQL, but most people who have used both have found PostgreSQL easier to work with.
Lutz Prechelt: "An Empirical Comparison of Seven Programming Languages". IEEE Computer, 33(10), 2000.
Some hard data on the relative effectiveness of C, C++, Java, Perl, Python, Rexx, and Tcl.
PyAmazon: http://www.josephson.org/projects/pyamazon/, viewed 2006-04-23.
A simple Python library for fetching data from Amazon.com.
PyChecker: http://pychecker.sourceforge.net, viewed 2005-09-06.
A code checking tool for [Python] that complements [PyLint].
Pyfort: http://pyfortran.sourceforge.net/, viewed 2006-04-28.
An open source tool to connect Python and Fortran code.
PyLint: http://www.logilab.org/projects/pylint, viewed 2005-09-06.
A code checking tool for [Python] that complements [PyChecker].
Python: http://www.python.org, viewed 2005-07-26.
The main site for all things Python.
Python Cookbook: http://aspn.activestate.com/ASPN/Python/Cookbook, viewed 2005-07-29.
An ever-growing collection of [Python], tips and tricks; see [Martelli 2005] for the print edition.
Python Software Foundation: http://www.python.org/psf, viewed 2005-07-26.
A non-profit organization devoted to advancing open source technology related to [Python], and the main financial sponsor of this course.},
PEP-008: Python Style Guide: http://www.python.org/peps/pep-0008.html, viewed 2005-07-26.
A semi-official guide to [Python] coding conventions.
RapidSVN: http://rapidsvn.tigris.org, viewed 2005-09-13.
A cross-platform GUI for [Subversion].
Deborah S. Ray and Eric J. Ray: Unix: Visual QuickStart Guide. Peachpit Press, 2003, 0321170105.
A gentle introduction to Unix, with many examples.
Evan Robinson: "Why Crunch Mode Doesn't Work: 6 Lessons". http://www.igda.org/articles/erobinson_crunch.php, viewed 2006-02-26.
An incisive summary of the effect of fatigue on human productivity, the conclusion of which is that crunch mode winds up making projects later.
Lawrence Rosen: Open Source Licensing: Software Freedom and Intellectual Property Law. Prentice Hall PTR, 2005, 0131487876.
If you're involved in open source software in any way, shape, or form, then this book is a useful read. Its author is intimately familiar with the field; here, he lays out a general background for discussion of intellectual property, and the history of free/open source software, then discusses what various popular licenses actually mean. The book closes with chapters on topics such as how to choose a license, litigation, and standards. The writing is clear---exceptionally so by legal standards---and he takes time to explain terms and assumptions that most software developers won't have encountered before. What's more, he doesn't seem to have any particular axes to grind: the book is US-centric, but his treatment of the various options open to today's developers is very even-handed.
Roundup: http://roundup.sourceforge.net, viewed 2006-04-28.
A bug-tracking system in which each ticket automatically becomes a self-maintaining mailing list.
W. W. Royce: "Managing the Development of Large Software Systems". Proc. IEEE WESCON, 1970.
The original description of the waterfall model of software development.
Ruby: http://www.ruby-lang.org, viewed 2006-04-30.
A scripting language with many of the same capabilities as [Python].
Ruby on Rails: http://www.rubyonrails.org, viewed 2006-04-30.
A third-generation web application framework that simplifies programmers' lives by emphasizing convention over configuration.
H. Sackman, W. I. Erikson, and E. E. Grant: "Exploratory Experimental Studies Comparing Online and Offline Programming Performances". Communications of the ACM, 11(1), 1968.
FIXME
Bruce Schneier: Beyond Fear. Springer, 2003, 0387026207.
A thought-provoking look at how we are encouraged to think about security, and how much security is actually desirable. For example, he explains why security systems must not just work well, but fail well, and why secrecy often undermines security instead of enhancing it.
Bruce Schneier: Secrets and Lies: Digital Security in a Networked World. Wiley, 2005, 0471453803.
Having written the standard book on cryptography, Schneier now argues that technology alone can't solve most real security problems. The book covers systems and threats, the technologies used to protect and intercept data, and strategies for proper implementation of security systems. Rather than blind faith in prevention, Schneier advocates swift detection and response to an attack, while maintaining firewalls and other gateways to keep out the amateurs.
SCons: http://www.scons.org, viewed 2005-07-28.
A powerful [Python]-based build management tool.
Seamonkey Code Reviewer's Guide: http://www.mozilla.org/projects/seamonkey/rules/code_review.html, viewed 2006-03-01.
A simple set of guidelines for code reviews from the Mozilla Foundation.
Mary Shaw: "Prospects for a Discipline of Software Engineering". IEEE Software, 7(6), 1990.
FIXME
Ed Skoudis: Malware: Fighting Malicious Code. Prentice-Hall, 2004, 0131014056.
This 647-page tome is a survey of harmful software, from viruses and worms through Trojan horses, root kits, and even malicious microcode. Each threat is described and analyzed in detail, and the author gives plenty of examples to show exactly how the attack works, and how to block (or at least detect) it. The writing is straightforward, and the case studies in Chapter 10 are funny without being too cute.
SmartSVN: http://www.syntevo.com/smartsvn/index.html, viewed 2009-07-06.
A cross-platform GUI for [Subversion].
SourceForge: http://www.sf.net, viewed 2006-02-19.
A software project management portal whose main installation is a clearing house for thousands of open source projects.
Diomidis Spinellis: Code Quality: The Open Source Perspective. Addison-Wesley, 2006, 0321166078.
A companion to the same author's earlier [Spinellis 2003], this book concentrates on what distinguishes good code from bad. The first one was great; this one is even better.
Diomidis Spinellis: Code Reading: The Open Source Perspective. Addison-Wesley, 2003, 0201799405.
The book's preface says it best: "The reading of code is likely to be one of the most common activities of a computing professional, yet it is seldom taught as a subject or formally used as a method for learning how to design and program." Spinellis isn't the first person to make this point, but he is the first person I know of to do something about it. In this book, he walks through hundreds of examples of C, C++, Java, and Perl, drawn from dozens of Open Source projects such as Apache, NetBSD, and Cocoon. Each example illustrates a point about how programs are actually built. How do people represent multi-dimensional tables in C? How do people avoid nonreentrant code in signal handlers? How do they create packages in Java? How can you recognize that a data structure is a graph? A hashtable? That it might contain a race condition? And on, and on, real-world issue after real-world issue, each one analyzed and cross-referenced. There's also a section on additional documentation sources, and a chapter on tools that can help you make sense of whatever you've just inherited.
Joel Spolsky: "The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)". http://www.joelonsoftware.com/articles/Unicode.html, viewed 2005-07-26.
Joel Spolsky's 15-minute guide to character set encodings, and what you have to do to deal with the fact that most of the world doesn't use the standard American alphabet.
SQLite: http://www.sqlite.org, viewed 2005-07-26.
A small, simple, and very fast relational database that can be run on its own, or integrated into other applications.
SQLObject: http://www.sqlobject.org, viewed 2006-03-01.
An object-relational mapping package for Python.
Guy L. Steele Jr.: "Growing a Language". Journal of Higher-Order and Symbolic Computation, 12(3), 1999.
The best (and wittiest) discussion ever published of how programming languages ought to evolve.
Subversion: http://subversion.tigris.org, viewed 2005-07-26.
The main site for Subversion is aimed more at Subversion's developers than at its users.
Software Carpentry: http://www.swc.scipy.org, viewed 2006-08-22.
The permanent home for these notes.
SWIG: http://www.swig.org, viewed 2006-04-03.
A tool for generating Perl, Python, and other bindings for C programs.
William Thomas, Alex Delis, and Victor R. Basili: "An Analysis of Errors in a Reuse-Oriented Development Environment". Journal of Systems and Software, 38(3), 1997.
FIXME
Herbert H. Thompson and Scott G. Chase: The Software Vulnerability Guide. Charles River Media, 2005, 1584503580.
My current favorite guide to computer security for programmers, this books walks through each major family of security holes in turn: faulty permission models, bad passwords, macros, dynamic linking and loading, buffer overflow, format strings and various injection attacks, temporary files, spoofing, and more.
TortoiseSVN: http://tortoisesvn.tigris.org/, viewed 2005-09-13.
A cross-platform GUI for [Subversion].
TurboGears: http://www.turbogears.com, viewed 2006-04-30.
A [Python] web application development framework with some of the same capabilities as [Ruby on Rails] (but not as many users, or as much documentation).
Jon Udell: "Internet Groupware for Scientific Collaboration". http://udell.roninhouse.com/GroupwareReport.html, viewed 2005-07-26.
While it is now several years old, Udell's examination of what the web could be, and how it could help scientists collaborate more effectively, is still as thought-provoking as it was when it first appeared.
Larry Ullman and Marc Liyanage: C Programming: Visual QuickStart Guide. Peachpit Press, 2004, 0321287630.
A gentle introduction to C, with many examples.
University of Toronto: http://www.utoronto.ca, viewed 2005-07-26.
Canada's biggest university, and the host institution for much of this work.
Michiel Van Genuchten: "Why Is Software Late?". IEEE Software, 17(6), 1991.
FIXME
Visual Complexity: http://www.visualcomplexity.com/vc/project.cfm?id=392, viewed 2009-03-30.
Compares call graphs for Windows and Linux web servers.
James A. Whittaker: How to Break Software: A Practical Guide to Testing. Addison-Wesley, 2003, 0201796198.
A slim catalog of things testers can do to break software.
James A. Whittaker and Herbert H. Thompson: How to Break Software Security. Addison-Wesley, 2004, 0321194330.
This practical companion to [Whittaker 2003] catalogs things you can do to test (and break) security measures in programs.
Laurie Williams and Rober Kessler: Pair Programming Illuminated. Addison-Wesley, 2003, 0201745763.
A combination of an instruction manual, a summary of the authors' empirical studies of pair programming's effectiveness, and advocacy, this book is the reference guide for anyone who wants to introduce pair programming into their development team.
Greg Wilson: Data Crunching. Pragmatic Bookshelf, 2005, 0974514071.
Every day, all around the world, programmers have to recycle legacy data, translate from one vendor's proprietary format into another's, check that configuration files are internally consistent, and search through web logs to see how many people have downloaded the latest release of their product. It may not be glamorous, but knowing how to do it efficiently is essential to being a good programmer. This book describes the most useful data crunching techniques, explains when you should use them, and shows how they will make your life easier.
WingIDE: http://wingware.com, viewed 2005-07-29.
A commercial IDE targeted solely at [Python] developers.
Scott N. Woodfield: "An Experiment on Unit Increase in Problem Complexity". IEEE Transactions on Software Engineering, 5(2), 1979.
FIXME
YesLogic: http://www.princexml.com, viewed 2005-10-05.
Makers of Prince, the document formatter and generator used to produce the PDF version of these notes.
Andreas Zeller: Why Programs Fail: A Guide to Systematic Debugging. Morgan Kaufmann, 2006, 1558608664.
This well-written, copiously-illustrated book from the creator of DDD (a graphical front end for the GNU debugger) is a survey of current and next-generation debugging tools. Some are old friends, like bug trackers and symbolic debuggers. Others are new: there's a detailed look at the pros and cons of replay debugging, an automatic divide-and-conquer tool that can strip test cases down to their essentials, and a whole chapter on how dependency analysis and program slicing can be used to isolate faults. If, ten years from now, debuggers have taken a much-needed leap forward, much of the credit will go to this book.