I was recently asked whether I could recommend a text to complement TM354 Software Engineering.
What follows is a post that shares some thoughts about a number of textbooks that relate to software engineering. What is presented within the opening two sections do not share firm recommendation. Instead, consider them to be comments about some significant texts that I have become aware of. The set of all available texts is, of course, huge; there are loads of other texts (and other editions) that could have been written about. This post also contains a short summary of texts that are used in TM354. The ‘and finally…’ section shares a list of software engineering (related) books that I’ve found interesting.
Software engineering texts
Ravi, S. (2023) Software Engineering: Basic Principles and Best Practices. Cambridge University Press.
I’m mentioning this text since I’ve been asked to review it for a module team.
It covers a lot of ground, and also covers many of the concepts that are studied in TM354. I particularly like the set of exercises that are shared at the end of every chapter. There is also a really useful appendix which describes a software engineering team project (which is especially useful for software engineering educators). I remember having to do a variation of one of these when I was an undergraduate. Ravi suggests the application of SCRUM, which is both an interesting and a practical choice.
The text opens with a definition of software engineering and the origins of the subject. It also introduces the challenge of requirements, the concept of software architecture, and then goes onto testing. It has a chapter on use cases which has a direct parallel with what is covered in TM354, and a chapter on testing, which offers a helpful summary of the topic.
There are some differences. There are a couple of chapters that address the topic of architecture. There is one chapter named ‘design and architecture’, and another named ‘architectural patterns’. These topics are treated differently in TM354 (I always struggle with book and document headings that contain the word ‘and’), as is the subject of software metrics, which is featured under the chapter of ‘quality metrics’. Significantly and importantly, Ravi emphases the importance of social responsibility in software engineering.
Whilst useful, it doesn’t directly complement TM354. It does, however, offer an alternative, more formal perspective. I do feel as if the people aspects in software engineering could have been given greater prominence. It also lacks a more thorough topics such as security and continual integration.
Pressman, R. & Maxm, B. R. (2019) Software Engineering: A Practitioner's Approach. McGraw Hill.
This review is going to exceptionally limited, since I don’t have access to the text! All I have access to is the table of contents. I did, however, once had a copy of an earlier issue, the European Edition which had been edited by Darrel Ince, who used to work at the OU some years ago. I do remember really liking it. I remember finding it more readable and understandable than the more familiar Sommerville text.
What immediate strikes me about the table of contents is that it is divided into significant parts. It’s useful to share the part titles: the software process, modeling, quality and security, managing software projects, and advanced topics. There is also an appendix about UML, and another about ‘data science for software engineers’. Architecture and design comes under the modeling part. Testing comes under the quality and security part (which makes sense), along with a chapter called ‘software security engineering’ and a chapter on software metrics. The important ‘people’ bit is also addressed in chapter 4: human aspects of software engineering.
Something slightly different
The something slightly different is an open source Software Engineering textbook by Marco Tulio Valente. This is an entire book that you can download for free. I had a quick look at three sections: the process chapter, the architecture chapter and the testing chapter.
The process chapter discusses the agile manifesto and the waterfall approach. In terms of agile, it digs into XP, Scrum, and Kanban before highlighting the spiral model and then mentioning the Rational Unified Process. Much of what is covered in the first block of TM354 is also covered in this chapter.
The architecture chapter begins in an interesting way by immediately turning to a debate about operating system design, and the question of what is best: a monolithic operating system, or an operating system that adopts a microkernel architecture. This is linked to a later discussion about the distinctions between monolithic and microservice architectures. It also discusses layered architecture, tiers, and model-view controllers (there is a corresponding chapter about design patterns). In terms of TM354, there is a link to some of the architectural themes that are covered in block 3 of the module materials.
The testing chapter begins with the familiar and important test pyramid, explaining the different between the different levels. Unit testing is dealt with in a helpful way, and this is complemented with the idea of code coverage. Terms that will be familiar to testers, such as mocks and stub are also addressed. Other themes include test driven development and acceptance testing. Testing is, perhaps, a bit of a weak point in TM354. The cross over with TM354 lies with the discussion of open-box (white-box) vs closed-box (black-box) testing, and testing testing techniques such as equivalence partitioning and boundary-value analysis. Testing is followed by chapters about Refactoring and DevOps.
Looking at TM354
There are a number of texts that are mentioned in TM354:
Robertson, J., Robertson, S. and Reed, A. (2025) Mastering the requirements process. Fourth edition. Addison-Wesley.
This text has been going for quite a while. Now in its fourth edition, it introduces what I understand to be some of the most important concepts that software engineering really need to understand. It is split into eight parts. Rather than going through each of these in turn, I’m going to enumerate some of the important topics that feature in its table of contents (which are, of course, linked to TM354): the importance of understanding the problem and the problem domain, the significance of stakeholders, the importance and usefulness of prototyping, using use cases and user stories, and using workshops to understand business use cases (BUCs) and their description using activity diagrams.
The text is, of course, linked to the Volere framework, which is described as ‘a framework for discovering, communicating, and managing requirements at all levels and in all environments’ (footnote 1, chapter 1). Within this framework there is the Volere shell, and a fit criterion which ‘means that your customer can tell you whether it is exactly what is needed’. This is, of course, linked to the software engineering concept of acceptance testing.
What I like about this text is its readability. It is informal without being too chatty. As an aside, an interview by Robertson and Robertson, SE Radio 188: Requirements in Agile Projects is featured in an early part of the module. It’s a useful interview. It’s worth a listen.
Fowler, M. (2018) UML Distilled: A Brief Guide to the Standard Object Modeling Language. 3rd ed. Pearson Education.
This text offers a practical and concise summary of the Unified Modelling Language (UML). This latest edition reflects understandings of which of the diagram forms have become more popular. It deemphasises the communication diagram, for example, reflecting that the sequence diagram is more popular (and, arguably, more understandable too).
It isn’t the most exciting of books. It is more useful as a reference which offers some clearly presented explanations.
Gamma, E. et al.(1995) Design patterns : elements of reusable object-oriented software. Addison-Wesley.
This text is considered to be a classic, and it is interesting to reflect that there haven’t been any updates, which is a testament to the thoroughness of this original catalogue of patterns. Since its publication, there have been the publication of further texts that draw on the idea of patterns. A text that complements this one is the Head First: Design Patterns text, which offers a lighter introduction to the subject.
A really good aspect of this book is that it contains simple code and useful diagrams that both express ideas that are quite complex. Other writers have taken the Design Patterns catalogue and have created implementation in certain languages, such as Java: Design Patterns: The Catalog of Java Examples.
This is one of those rare technical books that I can sit down and enjoy puzzling over. By assimilating and internalising the patterns, software engineers develop their skills of thinking about code, and how code can be used to solve problems.
Bass, L., Clements, P. and Kazman, R. (2022) Software Architecture in Practice, 4th Edition. Addison-Wesley Professional.
I really like this one since it offers some useful practical guidance. As the title suggests, it is less about software engineering, but more about a topic that is found within software engineering: software architecture. The TM354 module has been updated to use the latest issue. Some of the advice has been refined. Importantly and significantly, it does offer some pointers about sustainability.
It is worth mentioning that it has four parts: an introductory part, quality attributes, architectural solutions (where cloud computing solutions are discussed), scalable architecture practices, concluding with architecture and the organization (sic). Arguably, this text goes beyond what is covered in the others, but also expects readers to know about software engineering fundamentals, such as process models, requirements, and testing.
As mentioned in another blog, I’ve found a podcast which features Bass, which is quite good fun and worth a listen: Stories of Computer Science Past and Present (2014) (Hanselminutes.com). Bass talks about booting up a mainframe, punched card dust, and why it is useful to have two offices.
All of these texts are available through the O’Reilly Safari bookshelf, which you can find either by searching in the OU library.
And finally…
Here are some other textbooks that are pretty important if you’re interested in software engineering or software development.
Beck, K. and Andres, C. (2005) Extreme programming explained : embrace change. 2nd ed. Addison-Wesley.
The first edition of this book opens with the words “the basic problem of software development is risk”. It then enumerates a big long list of reasons why software projects can go wrong. It later highlights four values of XP: communication, simplicity, feedback and courage. Essentially, these points all relate back to the first: communication.
When I was working in industry, what I took from this book was the use of pair programming, which could be found within the development strategy chapter. Doing pair programming relates directly to the principles of communication and courage. Working with a fellow software engineer on one screen at the same time was one of the best professional educational experiences I have ever had.
I bought this book at roughly the same time as another of Beck’s books: Test Driven Development. There is, of course, a link between agile development and effective unit testing.
Brooks, F.P. (1995) The mythical man-month : essays on software engineering. Anniversary Edition. Addison-Wesley.
There are not (yet) very many classic texts on software engineering, but this is certainly one of them. Brooks worked on the IBM System/360 mainframe operating system. His observation was simple, yet significant. Brooks’s Law is simply: “adding manpower to a late software project makes it later” (p.25). The reason being is that people have to talk with each other. Modern agile practices have teams that are of a limited size for a reason. The mythical man-month is quite a short book and is certainly worth spending a few hours reading.
Fowler, M. et al. (2012) Refactoring: improving the design of existing code. Addison-Wesley.
Like Design Patterns that I’ve mentioned earlier, this text was one that caused me to say the words ‘why didn’t I think of this and write this book?’ Refactoring shares a set of obvious tips and small changes that help to change the structure of your code. Connecting with other text, it helps to refine your craft of software development.
Raymond, E.S. (2001) The cathedral and the bazaar : musings on Linux and open source by an accidental revolutionary. 1st edition. O’Reilly.
You could argue that software always intersects with politics since people are involved with its use and creation. This text is a collection of related essays which discusses computing history, hacker culture, and open source software. In my edition of the text, there is the suggestion that the essay The Cathedral and the Bazaar ‘effectively overturns Brooks’s Law’, which is an interesting take, and one that I don’t entirely agree with. Raymond is, of course, deliberatively provocative.
Provocation aside, he does emphasise the importance of software engineering and craft, which is something that is unambiguously highlighted in The Pragmatic Programmer. He also shares a point that has always stuck with me, which is this: “Learn to write your native language well. Though it’s a common stereotype that programmers can’t write, a surprising number of hackers (including all the best ones I know of) are able writers”. He later encourages you to “develop your appreciation of puns and worldplay” (p.207).
McConnell, S. (2004) Code Complete, 2nd Edition. Cisco Press.
I first discovered the first edition of Code Complete whilst browsing through the computing section of a bookshop towards the very end of the last century (I am no starting to feel quite old!) What struck me was that I recognised some of the paper that the text was referencing. What I was interested in was the practices of programming, and whether there was any empirical (experimental) evidence that related to good practice, such as naming, indentation, and so on. This text seemed to bring together a range of different articles together.
The second edition was published in 2004. I did once write a review of it for something called the Psychology of Programming Interest group, but I would rather not share a direct link to it, since my writing has really come on since 2005. This alternative resource https://en.wikipedia.org/wiki/Code_Complete (Wikipedia) offers a useful summary.
Thomas, D. and Hunt, A. (2020) The Pragmatic Programmer: Your Journey to Mastery. Second edition. Addison-Wesley.
I ordered this text when I was working in industry. Returning to it again, I see that the edition I have on my bookshelves contains 70 useful hints and tips. Looking after these again, I remember that I must have taken many of these tips to heart.
Three notable ones are:
- invest Regularly in Your Knowledge Portfolio. I was regularly learning new things, and had a curiosity about different tools and languages. The evolution and change of software has never stopped.
- Use the Power of Command Shells. I understood the point that was being made. Continually clicking on buttons to get things done can be annoying, and when you carry out a series of actions regularly, knowing how to automate some tasks and operations can save you time and aggravation.
- Learn a Text Manipulation Language. When I was working as a developer, I had to work with a lot of web-based content, and that content had metadata, and sometimes that metadata would change. To make my life earlier, I learnt a language called Perl (which many would agree is a terrible language). If you don’t want to learn Perl (and I wouldn’t blame you), there are text manipulation libraries that are likely to work with your favourite language.
There are loads of other tips that resonate.
All these texts are also available through the Safari bookshelf available from the OU library.
Books on my ‘to read’ pile
My reading about computing has moved from the practices of programming, to the history of computing, touched on aspects of hacker culture, and have skirted onto studies of gaming culture. Through a novel about DevOps and car spares, I feel as if I’m returning to software engineering texts. There are always more books to read. Along with the Pressman text (if I can get hold of a copy), here are two other texts that are on my ‘to be read’ pile:
DeMarco, T. and Lister, T.R. (2013) Peopleware: productive projects and teams. 3rd edition. Addison-Wesley.
Software is, of course, made by people, for people. Agile practices are all about helping to get people to work together in a way that makes the work that needs to be done more visible to others. I was left a copy of DeMarco os Lister’s Peopleware by a colleague.
Hermans, F. and Skeet, J. (2021) The programmer’s brain : what every programmer needs to know about cognition. Manning Publications.
I came across this text after discovering an episode of software engineering radio: SE Radio 462: Felienne on the Programmers Brain. It ticks all ‘academic interests in programming boxes’.
Although many of these books are available in the Safari bookshelf, I do like to read ‘proper’ books (or eBooks) rather than reading through the Safari portal. Rather than going to a large online book retailer, I tend to go to a second hand reseller, or even a popular online auction site to pick up second hand bargains.
Reflections
The original question I was asked what: ‘what textbook would I recommend to complement the OU’s existing software engineering module’. The general software engineering texts cover common topics, such as process models, the importance of requirements, design, architecture, and testing. They differ in what they emphasise.
TM354 is designed to be self-contained. Students studying this module shouldn’t need to go outside the module materials, but I hold the view that students studying software engineering should do so since knowing how to find access to resources and explanations is an important and necessary graduate skill.
Although some colleagues might disagree, I did quite like the clarity of writing in the open source text. It is quick and easy to access, and many of the topics featured in this text can also be found in TM354 – but do always refer to the module material.
A final note is to highlight the importance of something called the SWEBOK v4, the Software Engineering Body of Knowledge (IEEE). This useful resource also offers a wealth of recommendations.