
1. Diagrams that help visualize what's happening. I prefer a hybrid of sequence, timeline and activity diagrams. I don't have a ready example at hand, but [1] comes close to what I use. YMMV though - I know some team members in my past jobs preferred state transitions to these, because they found them clearer to think through.
2. A technique we used during team reviews was borrowed from the book "Debugging Applications" by John Robbins [2]. Although the book was about debugging Windows applications, it had good tips on general software engineering and debugging, and I still recommend it now. One technique in it was the multithread simulation review - an excerpt:
The trick is to assign one person to each thread in your code and one person to each synchronization object. When you review the code, pretend that each thread is running at realtime priority on its own dedicated CPU. Each "thread person" walks through the code paying attention only to the particular code that his thread is supposed to be executing. When the "thread person" is ready to acquire a synchronization object, the "object person" literally moves behind the "thread person." When the "thread person" releases a synchronization object, the "object person" goes to a neutral corner of the room. In addition to the thread and object representatives, you should have some developers who are monitoring the overall thread activity so that they can assess the program's flow and help determine the points at which different threads deadlock.
Obviously, you need a number of like-minded and enthusiastic team members to carry it off.
[1]: http://community.qnx.com/sf/wiki/do/viewAttachment/projects....
[2]: https://www.amazon.com/Debugging-Applications-DV-MPS-Program...
However, he didn't qualify his "top 10" books which one could interpret as the 10 most important for any audience. If that's the interpretation, I propose a much different list which I think is more universal and applicable for a top-10:
Effective C# (Covers C# 4.0): 50 Specific Ways to Improve Your C#, 2nd Edition, By Bill Wagner
http://www.informit.com/title/0321658701
More Effective C#: 50 Specific Ways to Improve Your C#, By Bill Wagner
http://www.informit.com/title/0321485890
Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2e, By Krzysztof Cwalina, Brad Abrams
http://www.informit.com/title/0321545613
C# 5.0 in a Nutshell, 5e, The Definitive Reference, By Joseph Albahari, Ben Albahari
http://shop.oreilly.com/product/0636920023951.do
Debugging Applications for Microsoft® .NET and Microsoft Windows®, John Robbins (This book is old but one can get more up-to-date info from the free .NET debugging tutorials on channel9.msdn.com)
http://www.microsoft.com/mspress/books/5822.aspx
http://channel9.msdn.com/Series/-NET-Debugging-Stater-Kit-fo...
Improving .NET Application Performance and Scalability
http://www.microsoft.com/en-us/download/details.aspx?id=1171...
CLR via C#, 4e, By Jeffrey Richter (If a person on the team is writing low-level foundation components, the knowledge in this book is a must. Otherwise, most C# developers writing line-of-business code can skip it.)
https://www.microsoftpressstore.com/store/clr-via-c-sharp-97...
[In other words, I would substitute 7 of the article's suggested top-10 books with the ones above. If education time is limited, I'd rather a developer read the 2 Bill Wagner "Effective C#" books as priority over the Martin Fowler "Patterns" books.]
Stroustrup's _The C++ Programming Language_, twice in a row, because I didn't want to be left out for not having taken Computer Science.
Butelhof's _Programming with Posix Threads_, because another book referenced its explanation of why Win32 threading had a bug because it could not, at the time, signal and wait on a mutex in an atomic way. There was something deep to find in those rowboats and bucket stories.
GoF's _Design Patterns: Elements of Reusable Object-Oriented Software_, because when I complained to a mentor that I was struggling to organize a dozen scientist programmers, he handed it to me, laughing.
John Robbins, _Debugging Applications_, first edition, because it was the first time for me that code didn't have the disclaimer, "of course you should insert error-handling code here." Basic x86 assembly in one chapter!