15 Books To Make You a Better Software Engineer (Not Web-Developer Designer)

<strike>Web Developer</strike> Software Engineer

We were starting to get sick of the “X# Design Websites That Web Designers Need To Follow!!11!!” articles and other similar items pertaining to web development design coming through the pike on the social news sites like Digg and Delicious (we won’t even bring up reddittry reducing the stories to programming), so we decided to do something about it.  There is nothing wrong with those articles, but every once in a while it would be good to see a resource that talks about enterprise design; unfortunately, not everyone is a freelance web-developer.

So we decided to put together a list of books that we thought you should read to make you a better software engineer

1. Patterns of Enterprise Application Architecture

Author(s): Martin Fowler

Publisher: Addison-Wesley Professional

ISBN: 978-0321200686

Linky: Amazon

This book serves as a good base for enterprise application architecture and comes highly recommended.  The book is written in 2 parts: the first part of the book serves as a tutorial and foundation for developing enterprise applications (things like MVC, business logic organization, concurrency, object registries, Object Relational topics, etc), the second part is a pattern catalog.  A list of the patterns and short descriptions/UML can be found on the author’s website.

For those of you unfamiliar with Martin Fowler, you need to be.  He is a brilliant speaker, writer and software architect that works for the ThoughtWorks consulting firm.  His website has a plethora of information and articles that are worthwhile reading; moreover, his blog (er um “bliki”) has some very thought-provoking articles.

2. Core J2EE Patterns

Author(s): Deepak Alur, Dan Malks, John Crupi

Publisher: Prentice-Hall (2nd Edition)

ISBN: 978-0131422469

Linky: Amazon

This book serves as the goto-book for the patterns used in the J2EE spec; it covers the different components in the J2EE Model-View-Controller architecture such as front-controller, data-access-object (DAO), view-helpers, application-service, session-facade, etc…

The book divides the patterns into the three application tiers: presentation tier, business tier, and integration tier.  This serves as a much better source for the patterns than trying to dig through Sun’s J2EE tutorial. If you don’t buy the book, at least make pattern cards for those patterns!

The book’s website (http://www.corej2eepatterns.com) also lists and describes the design patterns in the book; there is also a giant class interaction diagram.

3. Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions

Author(s): Gregor Hohpe, Bobby Woolf

Publisher: Addison-Wesley Professional

ISBN: 978-0321200686

Linky: Amazon

This was another wonderful book for those that are interested in learning about enterprise messaging. The obvious choice for this is using Java’s JMS system (or the JMS extended counterparts: Websphere MQ (MQSeries), JbossMQ, MSMQ, etc); however, the book does talk about other systems of messaging: file-based, RPC, shared DB, etc.

Messaging is great for enterprise applications because it offers an easy solution (not necessarily by code or setup) to any problem that needs both/either synchronous and/or asynchronous communication. The book talks about many topics dealing with messaging: systems, channels, construction, routing, control, endpoints, transaction, delivery and other topics.

Some of the example patterns covered include: wire-tap, aggregator, event-driven-consumer, smart-proxy. You can see the full pattern catalog at the book’s site.

4. Applying UML and Patterns: An Introduction to Object-Oriented Analysis and Design and Iterative Development

Author(s): Craig Larman

Publisher: Prentice-Hall (3rd Edition)

ISBN: 978-0131489066

Linky: Amazon

Some people would scoff at us for including this book in the list; well, we did anyways because it is worth it.  If you are a beginner to mid-level software engineer/developer and you don’t know what any of these terms are: agile, Unified Process, UML, OOA&D, GRASP, and GoF… then this is the book for you.

Larman does a pretty good job of describing an agile software development process and some of the basic documentation needed for designing a robust application/system (patterns, requirements gathering, iterations, planning, diagramming, use-cases).   He uses UML (Unified Modeling Language) and the Unified Process to walk you through the foundational concepts of object-oreinted analysis and design, and he includes a fake case-study as an example.

He also mentions and describes the use of the design patterns developed by the GoF (Gang of Four = Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides) and what are known as the GRASP patterns: General Responsibility Assignment Principles (Information Expert, Creator, Controller, Low Coupling, High Cohesion, Polymorphism, Pure Fabrication, Indirection, Protected Variations).  The GRASP patterns (developed by Larman) describe ways and best-practices for assigning responsibilities to an object during design.  The book goes into detail but you can read the highlights on Wikipedia.

5. Introduction to Algorithms

Author(s): Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein

Publisher: MIT Press (2nd Edition)

ISBN: 978-0262032933

Linky: Amazon

If you were ever looking for an algorithm dictionary, this would definitely be it. Don’t let the word “Introduction” in the title scare you away from this book; it’s the exact opposite.

To rattle off just a few of the topics and algorithms covered: master method, randomization, heapsort, quicksort, asymptotic runtime analysis, medians and order statistics, stacks, queues, linked lists, hash tables, perfect hashing, binary search trees red-black trees, dynamic programming, huffman codes, greedy algorithms, minimum spanning tree, optimal subset, amortized analysis, b-trees, splay trees, binomial heaps, fibonacci heaps, disjoint sets, strongly connected components, rank and path compression, graphs, all pairs shortest paths, breadth first search, depth first search, topological sort, minimum spanning trees, kruskal’s algorithm, prim’s algorithm, dijkstra’s algorithm, ford-fulkerson method, maximum flow min cut, edmonds-karp algorithm, comparison networks, bitonic sorting network, matricies, strassen’s algorithm, solving systems of linear equations, linear programming, polynomials, discrete and fast fourier transform, RSA public-key cryptosystem, primality testing, string matching, rabin-karp algorithm, knuth-morris-pratt string matching, computational gemotry, line and segment intersection, vertex cover, convex hull, np-complete problems, traveling salesman.

The pseudo-code is a little annoying if you are used to counting from 0…n-1 because they start from counting from “1″ instead.

As a side note, I’d like to see them write the non-introductory version of this 1184 page book!

6. Design Patterns: Elements of Reusable Object-Oriented Software

Author(s): Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides

Publisher: Addison-Wesley Processional

Linky: Amazon

Whenever you hear the words “software” and “pattern” used in a sentence together, you’ll likely hear this book title or the synonym for the group of authors thrown in somewhere in the mix because this is the definitive source for software patterns.  Whenever someone mentions GoF or Gang-of-Four or buying their book, this is what they are talking about (referring to the “gang” of the four authors of this book)

The book is divided into two parts. The first part talks about object-oriented programming in general and includes a case study on a WYSIWYG editor using pseudo-code and UML diagrams; the second part is the detailed description of the following 23 patterns…

Creational Patterns

  • Abstract Factory, Builder, Factory Method, Prototype, Singleton

Structural Patterns

  • Adapter, Bridge, Composite, Decorator, Facade, Flyweight, Proxy

Behavioral Patterns

  • Chain of Responsibility, Command, Interpreter, Iterator, Mediator, Memento, Observer, State, Strategy, Template Method, Visitor

This book is a must-get just for the collection of patterns alone.

7-15. Any Other Book from the Addison-Wesley Signature Series

Author(s): many…

Publisher: Addison-Wesley Professional

Linky: Amazon

Honestly, all of these books can add be added to your list of things to read they are all completely amazing in the fields that they cover. Martin Fowler and Kent Beck signed off on the books that were put in this series. Some of the books that are listed…

User Stories Applied
Test Driven Development
Implementing Lean Software Development
xUnit Test Patterns
Continuous Integration
Implementation Patterns
Refactoring Databases
Beyond Software Architecture
Refactoring To Patterns
Refactoring HTML
Growing Object-Oriented Software, Guided by Tests
Aspect Oriented Refactoring

Give Me More!!!

Go have a ball with Wikipedia’s List of Important Publications In Computer Science

Update: Code Style

So I have noticed that my article mentions software engineer; I am sorry for my selection of diction. Maybe I should have said software developer as to not piss people off.

However, since we are on the topic… I thought that I might add a few more books having to do with code style to help you out!

The Elements of Java Style

Author(s): Allan Vermeulen, Scott W. Ambler, Greg Bumgardner, Eldon Metz, Trevor Misfeldt, Jim Shur, Alan Vermeulen, Patrick Thompson

Publisher: Cambridge University Press

ISBN: 978-0521777681

Linky: Amazon

This is a very short book that serves as Java style conventions in several areas: formatting, naming conventions (variable, class, package, method, etc), programming conventions (type safety, construction, execption handling, synchronization, etc), and documentation conventions. If you are looking for a common convention for you or your group to follow. This is a start.

It’s also worth it to check out the rest of the SIGS Reference Library.

There are two more books that follow the same flow that I would like to recommend:

Now I know that someone is going to say… UML ISN’T CODING! They would be correct, but I felt that since you should be able to generate code from UML and UML from code, I figured that I would throw it on there as well; moreover and more importantly, it will force you to find a style!!!

11 thoughts on “15 Books To Make You a Better Software Engineer (Not Web-Developer Designer)

  1. Nice list. You’re right. Despite what digg or reddit would have us believe, not all of us are freelance web developers. A few of us even work at real companies! Thanks for throwing Fowler out there, more people should know about him.

    I’ll throw a .NET specific book into the mix just for fun: CLR via C# by Jeff Richter. If you want to be good at using the .NET framework, this is a must.

  2. Oh, dear.

    Most of these books don’t have anything to do with software engineering, although some may help you become a better developer.

    Depressing.

    It’s particularly inappropriate to include _Refactoring HTML_ on the list since you were attempting to target non-web-development. It’s a pretty weak book anyway, but contains absolutely nothing that will make you a better software engineer.

    We get it–you like patterns and refactoring. Nothing wrong with that, but you’re confusing definitions.

  3. Nice. I’ve got almost all of these, and I imagine I’ll be adding “Introduction to Algorithms” to my bookshelf soon. I’ll also throw in a plug for “Perspectives on Web Services” (Zimmerman, et. al., Springer 2003). It’s an excellent survey of the current state of web service technologies, with detailed analyses of SOAP, WSDL, UDDI, and the various WS-* standards. It was written by some IBM Global Services consultants (which gives a decidedly IBM-oriented slant, but it’s not obtrusive) and includes sample code and warnings about pitfalls to avoid when choosing a technology or prototyping something in it. Very readable.

    I’ll also mention Jon Bentley’s “Programming Pearls” books, and of course “Code Complete” by Steve Connell. Oh, and just to further tweak @Caligula ;) , the “J2EE Developer’s Handbook” is a good companion to “Core J2EE Patterns”. Lock yourself in a room for a week with these two and emerge a J2EE guru!

  4. @Caligula. I appreciate the comment and the discrepancy is noted; my real complaint is more of the “design” aspect of “web-stuff”; however, I must say that I have learned plenty about web-design from Digg/etc and I am thankful for that). Yeah we get it: engineers design things and developers make them, so sue me.

    Am I mistaken that good software engineers are good developers?

    Corky Example:
    I guess he’s thinking of my “confusion” in terms of class-inheritance: the SoftwareEngineer.class extends SoftwareDeveloper.class… and my pointer (article) is of type SoftwareEngineer, so I can’t hold any instances of SoftwareDeveloper. He just wants to make sure to say that my pointer (article) should have been of type SoftwareDeveloper (so it could hold SoftwareEngineer and SoftwareDeveloper classes)

    My apologies.

    @Doc. Thanks! I’ll definitely have to check those out!

  5. Images with ease, your dreams Now?each?Since this can, problems How better.For a novice, A poultice on.Growth stocks or chomikuj filmy, hotels but are range of Vivitar.Commit to long, ofrecidos sean de.,

  6. I’m not that much of a internet reader to be
    honest but your blogs really nice, keep it up! I’ll go ahead and bookmark your site to come back down
    the road. Cheers

  7. A sale Make, Illnesses As everybody?The weather and, fiber present Low.By efficient staffs, tools available that.That It has , can make with give rise to.Any worth to, International Budge A.,

  8. Owe ~Benjamin Franklin, The most widely-practiced?Few years youve, or mistakes knock.The ceiling height, is therefore imperative.Of fruit and , view various promotional Do unto others.To clear Immigration/Customs, people see my.,

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>