I read this book from cover-to-cover while traveling home from the Bahamas (about 8 hours for 213pp.) The book is a collection of 13 essays, plus a intro written by a VP @ ThoughtWorks. Published by
Pragmatic Programmers.
Solving the Business Software "Last Mile" -- Roy Singham and Michael RobinsonThe
last mile refers to problems encountered
after functional requirements have been met, but
before software is deployed and providing value. The first thing that comes to mind is
non-functional requirements (NFR): system performance under different loads, capacity, security, etc. These NFRs become more significant and dangerous as systems mature because of the potential problems as new software is introduced into the existing environment. Each new piece of code can potentially alter the NFRs of the production environment. The solution starts with automating the testing of NFRs. This requires communication with people about NFRs up-front and continuously updated, so that tests can be updated. Also, keeping tests independent of
wall clock time, since this changes from environment to environment. Using counter-based tests instead of time-based tests.
One Lair and Twenty Ruby DSLs -- Martin FowlerThis essay iteratively explores multiple approaches to producing an example
internal domain-specific language (DSL). Nice touch of history about DSLs and their roots in functional languages like Lisp. Nothing definitive about how-to write a DSL, but just shows the pros/cons of various approaches. Definitely, a demonstation of building a DSL and a great reference for me if I need to write a DSL.
The Lush Landscape of Languages -- Rebecca J. ParsonsBoils down to a comparison table with some history about the different programming languages compared by: paradigm (imperative, declarative, OO, functional, etc.), typing (dynamic, static, duck), and implementation.
Polyglot Programming -- Neal FordThis is a nice beginner article on the various programming languages that can be run on a common platform like .NET and Java. Neal shows a simple task written in Java, then in other JVM languages like JRuby, Jaskell, Scala, and Groovy. My favorite point that he makes is that even if your production code is written in Java, you can still
test it in another higher level language.
Object Calisthenics -- Jeff Bay9 rules that you should
try to become a better developer.
- Use only 1 level of indentation per method - more than 1 level usually means dealing with more than 1 abstraction.
- Don't use the else keyword - the rule seems weird, but the idea is not to let conditional branching go nuts.
- Wrap all primitives and strings - try to give meaning to numbers like year, month, day instead of just using a scalar integer.
- Use only 1 dot per line - this is an ease of readability thing.
- Don't abbreviate - the naming of things should be concise and meaningful.
- Keep all entities small - guideline: a class ~50 lines and a package ~10 files.
- Don't use any classes with more than 2 instance variables - a class should maintain a single state.
- Use first-class collections - wrapping collections in a class so that behavior for a group of objects in the collection can be defined.
- Don't use any getters/setters/properties - "Tell, don't ask"
What Is an Iteration Manager Anyway? -- Tiffany LentzI've personally never heard of this job title, but it seems to work for ThoughtWorks. An iteration manager is responsible for making the iterations successful and dealing with stakeholders and developers very closely. Managing iterations is very different from managing a project, and those two tasks are sometimes a conflict of interest. A project manager's primary responsibility is to deliver the project on-time and on-budget. But the iteration manager will make sure the developers work at a sustainable pace, producing quality software, and gathering and providing feedback on what can be done by the team.
Project Vital Signs -- Stelios PantazopoulosA further explanation on what an
iteration manager does by an actual iteration manager at ThoughtWorks. Focused on providing visibility and feedback to project stakeholder by using various
information radiators.Consumer-Driven Contracts: A Service Evolution Pattern -- Ian RobinsonThis is my favorite essay on how to build a
reusable service. It compare 3 approaches: provider, consumer, and consumer-driven contracts. Provider contracts are how most people build services: the developers generalize the data they have and provide an interface to that data. Consumer-driven is when the provider works with the clients to make sure they expose the bare minimum interface that the consumer needs. The goal is to produce a lean contract with the consumers to the extent that they meet business goals. The key is not to implement exactly what one consumer wants, but instead letting the consumer's business needs drive the development of services.
Domain Annotations -- Erik DoernenburgGoes over the various advantages of using Annotations (Java) and Attributes (C#). Domain annotations make it easier to separate domain-specific code from infrastructure code.
Refactoring Ant Build Files -- Julian SimpsonA good essay on how to improve your Ant build file. Luckily, I already knew most of these. It did remind me why some target names start with a hypen (-), because those tasks can't be called from the command-line.
Single-Click Software Release -- Dave FarleyThe idea is to extend the automation idea in continuous integration as close to continuous deployment as possible. The ultimate goal would be able to deploy to production with an automated script. Removing human steps as much as possible to reduce human error.
Agile vs. Waterfall Testing for Enterprise Web Apps -- Kristen VingrysBasically, defines how testing works in an Agile project by contrasting with a waterfall way of testing.
Pragmatic Performance Testing -- James Bull
Written by a QA person, he discusses performance expectations, how-to deal with performance during development, and a lot of other questions surrounding performance in software projects.