books

Agile Principles, Patterns, and Practices in C#

Agile Principles, Patterns, and Practices in C# (Robert Martin)

Agile Principles, Patterns, and Practices in C# by Uncle Bob is the best book about modern Software Development I have ever read.

First section (chapters 1-6) is an Overview of Agile, Extreme Programming (XP), and TDD. Very good introduction to modern software development. Chapter 6. shows all these techniques by example, by creating “The Bowling Game” application.

Section 2. is dedicated to SOLID principles, and UML diagrams. Former is described very succinctly, while latter is non-detailed overview of the most important parts with advises how to treat UML diagrams: not as documentation, but rather as a tool for explaining and expressing our thoughts to others (e.g. during the meetings on white board).

Section 3. and 4. is an overview (with examples and very good explanations) of design patterns, and case study of sample Payroll System application. In the case study, authors shows how to use TDD, UML, SOLID principles, and design patterns in the development process.

I really enjoyed this book. Even I knew most of the topics (UML, SOLID, design patterns), this book helped my to systematize my knowledge, and ensure that TDD is NOT dead.

I think this book should be required book for Software Engineering course at every college.

I strongly recommend this book. It is going to my favorite books list.


The Mythical Man-Month

The Mythical Man-Month cover

The Mythical Man-Month: Essays on Software Engineering is a classic book about software engineering, and project management. It was written 40 years ago, and most part of it is obsolete, but at the same time some parts are still valid.

Very interesting observation made by the author is that Software project management is not much different than project management in other disciplines, because it is all about the people, their skills, communication, scheduling, and time estimation.

Because this book was written 40 years ago (based on the project accomplished 50 year ago!), most chapters describe Software Development based on waterfall methodology (the best way of making software at that time). Additionally, 40 years ago most of software was written in Assembler. Author mentions High-Level languages as possible future of Software Development. Besides that, I recommend this book. It shows that instead of 50 years past, we still have very similar problems (communication, error-prone software, estimation issues etc.), and we still struggle with finding “The Silver Bullet”.

I recommend to read last 4 chapters first:

  • 16 – No Silver Bullet – Essence and Accident
  • 17 – “No Silver Bullet” Refired
  • 18 – Propositions of The Mythical Man-Month: True or False?
  • 19 – The Mythical Man-Month after 20 Years

This will give you an overview of “no longer valid” facts. Then start reading from the beginning, keeping in mind what is no longer true.

Chapters 1 and 2 are good introduction to this book, but (especially chapter 2) currently obsolete. Chapter 4 (Aristocracy, Democracy, and System Design) is still actual. Chapter 7 (Why Did the Tower of Babel Fail?) is about communication in Software Projects, and IMO still worth your attention.

In general I would recommend this book as a history lesson. Not necessary as a must-read book for programmers.


Programming Pearls

Programming Pearls

Just as natural pearls grow from grains of sand that have irritated oysters, these programming pearls have grown from real problems that have irritated real programmers.

I just finished reading Jon Bentley’s book: Programming Pearls. I read this book after Scott Hanselman’s and Jeff Atwood’s recommendations.

The problems analyzed in this book are still actual. However, I think that today programmers face slightly different challenges. Most of the problems described in this book are already solved in the libraries, or not often existing anymore (e.g., pretty printing on the console). I read the 2nd edition published in 1999, and most of problems require update to nowadays environments. For example: variable naming suggest the need to save the memory. E.g., l, u, x.

int binarysearch1(DataType t)
{	int l, u, m;
	l = 0;
	u = n-1;
	for (;;) {
		if (l > u)
			return -1;
		m = (l + u) / 2;
		if (x[m] < t)
			l = m+1;
		else if (x[m] == t)
			return m;
		else /* x[m] > t */
			u = m-1;
	}
}

In the interview (“Epilog to second edition”), the author argues that programming style he used should not be used in large software projects. Let’s take this excuse.

Book overview

Part I is a set of useful, general advises how to tackle programming problems. One caveat: nowadays we use unit testing instead of assertions and “scaffolding” (described in chapter 5). However, it might be useful in some environments with some particular circumstances.

Part II is about performance. Chapter 6 describe different optimization techniques. Although the tips are useful, today we are doing optimization on higher levels. I wonder if at least 1% of today programmers would be able to improve program performance, by rewriting assembly code. Anyway, this chapter shows that performance improvements can be done on different levels: algorithms, data structures, system architecture, underlying software, and even hardware. I like chapter 9, where author presents some very sophisticated tricks.

Part III (Columns 11-15) is about algorithms. Although it shows interesting analysis and fundamental algorithms (for sorting, and searching), I would rather recommend some solid algorithms book (e.g. Introduction to Algorithms by Cormen et al).

Summary

Programming Pearls shows which parts of software development changed, during last 15 years, but some parts of this book still remain valid. Moreover, this book is a good history lesson showing by example the advancement in software and hardware.

This book has many references to Steve McConnell’s Code Complete, and The Mythical Man-Month. These books are on my to-read list for some time, and I will definitely read them in the near future.


Two great books about JavaScript

Recently I read two great books about JavaScript: JavaScript: The Good Parts and Effective JavaScript: 68 Specific Ways to Harness the Power of JavaScript. Both are not for beginners, but rather programmers who know some Object Oriented language (e.g., C#, Java or C++).

JavaScript: The Good Parts

JavaScript: The Good Parts - cover
Written by the “God Father of JavaScript”: Douglas Crockford. This book is an overview of JavaScript language features that are different than in Object Oriented programming languages, such as C# or Java. Additionally, there is an overview of the good, and the bad parts of the language. What to avoid, and how. You can read it in a week (~200 pages).

In addition to JavaScript Good Parts, I recommend you to watch Crockford on JavaScript (mirror). You will learn not only about JavaScript, but also about the history of programming languages. There is also JavaScript the Good Parts course by Douglas Crockford on Pluralsight. This course is focused only on JavaScript though.

Effective JavaScript: 68 Specific Ways to Harness the Power of JavaScript

Effective JavaScript - cover
I like this book even better than “The Good Parts”. It contains very good examples that show specific aspects of the language. These examples combined with associated explanations makes this book clear and very informative for me. What I like especially was the structure: short 68 problems with explanation, analysis, and examples. Also, not very long (~200 pages). If you can choose only one of the books described in this post, read this one.

Other JavaScript books

I would be very happy to hear from you other JavaScript books that are worth (or not) reading. So far, besides mentioned books, I heard good things about:

Can you recommend some of them? Share your opinions in comments.


C# in Nutshell

C# 5.0 in a Nutshell: The Definitive Reference

C# 5.0 in a Nutshell is a great reference book about C#. Furthermore, it is worth to read it from the beginning to the end, to understand how C# works and to get familiar with the language features (can be used in the future as a reference). This book describes many features, which I have never used (after over 4 years programming in C#) like some XML serializers, COM interoperability or advanced threading/tasking techniques. Now, I know about them and where to look if needed.

This book is rather for experienced C# programmers. I do not recommend it as “first C# book”. It has a lot of examples, but the structure is rather encyclopedia style, than discovering the language from the basics. For beginner I would recommend Sams Teach Yourself Visual C# 2010 in 24 Hours.

C# in Nutshell has 1064 pages! Although it takes a while to read, it is worth your time if you think seriously about becoming good C# programmer. There are very detailed overviews and analysis of the language, supported by examples. If you do not want to spend time reading entire book, I recommend to use it as a reference and start learning about concrete feature, which you need at the time, from specific chapter in this book.

Why we read