Agile Zone is brought to you in partnership with:

Burk is a long-time programmer and software architect, currently focused on the Java platform with an eye toward mobile platforms. In 2010, he was voted a JavaOne Rock Star for his talk on User Experience Anti-Patterns, and is a co-author of the books "97 Things Every Software Architect Should Know" and "97 Things Every Programmer Should Know". Burk is also a Sun Certified Programmer, Developer, and Enterprise Architect for JEE 5. Burk has posted 25 posts at DZone. View Full User Profile

Win Your Copy: Pragmatic Thinking & Learning: Refactor Your Wetware

  • submit to reddit
Published by: Pragmatic Bookshelf
ISBN: 1934356050

Reviewer Ratings




Buy it now

One Minute Bottom Line

If you design and/or develop software then you should buy this book and read it right away.
You know that new technology is continually replacing the current favorites and that you must constantly learn about the new stuff so you don’t fall behind. It’s not unlike the Red Queen’s statement about running as fast as you can just to stay where you are.
The good news is that “Pragmatic Thinking and Learning” can help you become a better, faster, learner so you can actually move ahead. It’s full of information and insight into how your brain works and how to work with it, instead of trying to force yourself to learn and remember things through endless repetition.


1 Introduction
This is chapter does a nice job of introducing you to the book and giving you an idea of what to expect in the chapters that follow. While this book isn’t specifically for programmers, Andy assumes that most of the readers are either programmers or “frustrated users” and takes the opportunity to talk about his view on why software development is difficult to do properly and what this book can do to correct the problem.

2 Journey from Novice to Expert
This chapter introduces you to the Dreyfus model of skill acquisition and uses it to explain the five levels of skill mastery you’ll go through on the way from being a novice to an expert. It also discusses some of the problems that arise when the people designing processes do not understand the difference between levels, and why giving a novice a tool won’t make them as good as an expert.

3 This Is Your Brain
You get your first peek at the brain and an introduction to the model of how it works that is used throughout the rest of the book. Andy also introduces to the two styles of thinking the brain uses; the Linear and Rich modes. Andy prefers using these descriptions instead of the more traditional “Left brain” and “Right brain” because it is “more correct.” (If you want to know why, find a copy of the book and read the sidebar on page 58.) For now think of Linear mode as being like a computer (logically a following instructions step by step), and Rich mode as using intuition to go beyond your “programming” and begin “thinking outside the box.”

In any case, Andy provides some ideas on what each mode excels at and a way to begin refactoring your wetware.

4 Get in Your Right Mind
This is one of the longer chapters in the book and focuses on Rich mode thinking; what it is, how to encourage it, and how to integrate it with our more often used Linear mode of thought. It also includes several interesting exercises to help you experience R-mode thinking.

5 Debug Your Mind
Chapter five offers the opportunity to look at many of the known bugs in the human brain. These include the following:

  • Cognitive biases - things that unconsciously sway your decision making.
  • Generational affinity - biases formed as you grew up. This bug is called “generational” because people in the same generation share many of the same biases.
  • Personality tendencies - the quirky things that make perfect sense to you but seem odd or confusing to others.
  • Hardware bugs - things in the “legacy brain” (as Kathy Sierra refers to it) that operate at a very low level; for example fight or flight behavior, and the need to know where we fit in the social hierarchy.
These biases are very powerful but once you’re aware of them, it is possible to take steps to counteract them or at least notice when they’re operating and try to take them into account and minimize they’re effect on you.

6 Learn Deliberately
Here’s where you start to learn about learning; what it is, the difference between effective and ineffective learning methods, and some techniques (like having SMART goals, creating a Pragmatic Investment Plan for your “knowledge portfolio”, “learn by teaching”, and using a mind map) that you can use to make your learning sessions more efficient and effective.

7 Gain Experience
Experiential learning, aka learn by doing, is one of the most effective ways to learn something. It’s how you learn most things (like riding a bike or programming a computer) and there are things you can do to make your learning environment more efficient. You’ll also learn about the importance of failing and the need for good feedback.

8 Manage Focus
You may find this may be hard to believe, but it’s harder for you to learn new things when you’re constantly being interrupted. This chapter points out some of the most common interruptions and ways of minimizing or eliminating them so you can focus your attention on what you are trying to learn. Andy also shows you how to use a Wiki as an Exo-Cortex so you can capture and manage information instead of losing it.

9 Beyond Expertise

Now that you know all this stuff, what are you going to do about it? This chapter acknowledges that sometimes it is difficult to make changes and offers some suggestions on how to get started with debugging and refactoring your wetware.

Published at DZone with permission of its author, Burk Hufnagel.

(Note: Opinions expressed in this article and its replies are the opinions of their respective authors and not those of DZone, Inc.)


Zaheer Paracha replied on Thu, 2009/04/23 - 12:14pm

I guess the things that helped me learn new things are the mistakes I made, requirements of a project and new emerging techonologies. I am downloading the PDF chapters to take a look at this book, it sounds interesting to me. Love to have the hard copy to read this book from cover to cover.

Ch Nu replied on Thu, 2009/04/23 - 12:16pm

Over the years I've found that my brain has migrated to not remembering things so much as remembering pointers to things.  I'll remember the URL for a reference guide but not much specific from the guide itself.  This has the advantage that I have a larger potential pool of memory that's usually more up to date, but one disadvantage is that I find myself floundering a bit for info without a network connection.  :)

Sudhakar Ramasamy replied on Thu, 2009/04/23 - 1:01pm

I've read some of the Head First books that take a different approach to learning than conventional books. Both entertaining and engaging. You could argue they are engaging because they are entertaining. Learning by experience is by far the most effective way. I'd like to learn more about learning and being efficient with my learning given the abundance of stuff one can pick up. This book would be useful towards that.

Jim Bethancourt replied on Thu, 2009/04/23 - 1:48pm

I have found that often the best way to learn is to deliberately set aside some time during the day or week where you avoid all distractions and really put yourself into what you're learning. It's very easy to get distracted with email and interruptions by coworkers, so I've often found the best thing to do is to come into work early (before anyone else gets there) and just focus on what I'd like to learn. This takes some self-discipline, but is well worth it.

Another way to really learn something well that you're interested in is to set a goal to write an article about it, or to volunteer to make a presentation about it (or both). If it's about an open source framework or tool, have the tool author proofread your article, as this benefits both of you greatly -- you learn even more and the information about the tool is sure to be correct.

Craig Dickson replied on Thu, 2009/04/23 - 2:11pm

I have found that collaborative learning can be productive.

 Whenever I am working with a team that is attempting to adopt a new technology, the first thing I do is create a learning schedule based on a book usually and encourage people to commit to present one chapter in each session.

That way each person is at least on the hook to learn one chapter really well. However, I have found that most people put the effort in to read each chapter so that they can participate in the conversations.

Pascal Lalonde replied on Thu, 2009/04/23 - 3:36pm

On my side, I found out that my learning curve is good when I stimulate myself to new content. Since a year or so, I now take time during the day to read and browse about new things, new methods. And this is how I ended up here.

Also, during development, if I get to a point were I'm getting close to a new concept. I take a break and get documentation about it and try to find best practices that will guide me through the process.

Burk Hufnagel replied on Thu, 2009/04/23 - 9:15pm

I'm glad to see so many of you sharing the things that help you to learn.

One of my favorites it to volunterr to teach whatever it is so that I have extra motivation - not only do I have to learn it, but I have to know it well enough that I can describe it to someone else in such a way that it makes sense to them too.


John Lindwall replied on Fri, 2009/04/24 - 1:01am

I started a new job late last year after being at the same place for 8 years. I had stagnated at the old job and had not been pressured to learn a lot of new technology. The new job, in contrast, used a bunch of cool stuff that was new to me - the software architecture, tools, processes, etc.

Maybe I'm getting old or maybe it was the stress of the new job, but I found my retention of new knowledge to be less then it used to be. What helped me was writing down what I learned, almost as though I was writing the manual for the subject I was learning. Some of this information I have since added to the corporate wiki to share with others. It gives me a place to review my knowledge and refine it as I learn more details.

My latest challenge was learning git which was quite frustrating at first. My initial approach was "learn by doing" but that quickly got me in trouble. I realized that I needed to learn the core concepts by reading books and articles before I could apply them. This reduced my frustration and made me successful at "learning by reading and then doing".

Nello Sgambato replied on Fri, 2009/04/24 - 3:11am

when i face a new tecnology, i start searching some tutorial and i tryto reproduce them by myself. then i read some book on the argument.

Gian Franco Casula replied on Fri, 2009/04/24 - 6:34am

...what helps for me is repetition, not in the first sense that comes in mind, but more like repetitive poking a (hard) subject from different perspectives, reading different articles, books etc... 

Another effective way of learning for me is having an audience (of one person is enough) to explain things to...

But by far the best way is listening to presentations (when available), and mentally mapping the insights given to the concepts I learn from a book...that's why I love youtube, google techtalks, infoq, etc. etc.

Thamizh Arasu replied on Fri, 2009/04/24 - 7:18am

I hope i can get some idea about how not to program. Apart from technical knowledge this book will help us to get some idea on other areas.

Adam Pohorecki replied on Fri, 2009/04/24 - 7:23am

When I learn a new piece of technology I usually start with watching a video lecture or two briefly summarizing the whole thing (there are suprisingly many videos like that), then I would typically read a book on the topic (I'm a rather quick reader), after that its diving straight into code. A very helpful thing is also subscribing to a feed  aggregating posts on the topic, which gives you a lot of information about the ecosystem (tools, libraries, frameworks) fairly quickly.

Jared Nope replied on Fri, 2009/04/24 - 10:05am

I learn through experience so I generally like to make small project for myself and dive right in with a new technology. Here are a few things I do to help me with this

  • Blog Posts: See what other users have tried and try to avoid any pitfalls they might have found.
  • Documentation: Documentation has come a long way on projects, for example, both jQuery and Spring have great examples and can easily be cut/paste to get you going.
  • Have a clear goal: With larger technologies, setting a clear goal upfront has helped me stay on track with learning a particular piece rather than just wandering around an API
  • Boiler Plate: If I'm going to be playing with various technologies in the same domain, I like to setup a few things ahead of time so I don't have to keep writing the same pieces over and over

Xianghui Dong replied on Fri, 2009/04/24 - 6:01pm

There are different learning situations for me. If I learn by practical needs, I will just find the quickest method to solve my problem, that usually start from some good google search phrases. Depends on the case of the teniques, sometimes I'll spend more times to get a better understanding. For example, I knew regular expressions can be very useful, once I decided to devote some time after many cases in which regular expressions can really help, I can read and understand it better. When the basics are grasped, regular expressions are not difficulties anymore.

If I learn by interest, there are often enough time for me to learn systematically. I'll start from introductionary articles, then maybe some good books. This could be a long time task, so I'll make notes on details I found, and outline what I got, thus I can pick them up quickly later. I also will try to use them as much as I can, such as Groovy, which make regular scripting task a really treat.

dennis sellinger replied on Sat, 2009/04/25 - 2:30am

For me, "learning" typically starts with a real or perceived need. Its one thing to follow blogs and try to understand IT and SD trends, but it is another to have to actually learn technologies. As developers I think we have to read constantly just to know which technologies are emerging, which ones are gaining mind share and which ones we can safely ignore. This is because, when confronted with a read need we have to be able to select a technology and evaluate its appropriateness and then if necessary start to process of adoption, which typically means learning it, getting adoption by the business group and then exploiting it. A good example is the proliferation of multi-core processors is driving a need to parallelize software. There is a real need to exploit these processors but we have to find technologies that will enable us to do this is a easy way (for the entire team) that is integrated with our current platform and development process. Once we have identified promissing technologies we typically need one person to get up to speed with the technology (usually through reading paper books), then for that person to implement a prototype application to test his understanding and finally for that person to evangelize the technology so that it might be learned by others.

Andrew McVeigh replied on Mon, 2009/04/27 - 2:00pm

(this topic/competition is soooo much better than the usual "say how good our book is, and maybe win a copy". kudos)

i find that I don't learn something properly unless I use it "in anger". i have to have a meaty, tough problem to solve and one that lets me see the value of the subject/language/technology being learnt.

p.s. I have a copy of the book, please don't consider me for the copy...

Chuck Bedekovich replied on Mon, 2009/04/27 - 8:14pm

All along, from my early days "learning" to code, through my more experienced years "improving" my skills up through today, I have relied on asking myself one very simple question, then adapting my behavior to whatever happened to be the answer to the question:


"What happens if I do this?"


Whatever "this" turns out to be, whether it is a new piece of code, a change to existing code, trying to code an algorithm in a new language, working with new hardware or software, any and everything - trying and then experiencing the results of that trial has taught me the most - and in so many different ways.


I am now a Certified Scrum Master, working towards Certification as a Scrum Practicioner, and am doing so because Agile and Scrum have embraced *my* philosopy of "What happens if I do this?"  Empirical rather than predictive, "inspect and adapt", ask the team rather than know (or presume to know) all the answers.


What could be more rewarding and more fun?

Sandesh Tattitali replied on Tue, 2009/04/28 - 9:22am

While the techniques are important, I believe that what comes before that is far more important. As such, I approach learning with the following philosophy 1. Learning is not a means to an end, it is an end in itself - My experience has been that while it is helpful to learn something for the sake of solving a problem/arriving at a solution, it is far more rewarding to learn for the sake of learning itself. 2. Remember: "Innovation Happens Elsewhere" - There are a lot smarter people out there and it is helpful to remember that even when you consider yourself an expert in some topic. 3. Nicolas Taleb's advice that the unread books on your bookshelf are far more important than the ones that are read is worth keeping in mind. Realize that even though you know a lot, there is potentially far more that you have to learn. The software field is one arena where the potential for learning is unlimited. It is a privilege to be part of this field. Regards Sandesh

Wei Ling Chen replied on Tue, 2009/04/28 - 9:41am in response to: Andrew McVeigh

Aww thanks. We'll keep that in mind and try to do more like this. :)

Christian Voller replied on Tue, 2009/04/28 - 11:15pm

My experience is: Learning by doing. Try to find some tutorials and start with some examples and play a little bit. Try to add features of your business to find out if is is useable for your needs..

Brad Parks replied on Wed, 2009/04/29 - 9:54am

I agree with some of the other commenters - learning works best by actually trying things out.  I would add that making mistakes helps as well, but that is perhaps something that naturally comes by trying out new things.

Paolo Antinori replied on Thu, 2009/04/30 - 5:32pm

my answer is "wasting time".

i explain that. the way modern comunication works. reading an excerpt, sometimes just a title, other times a little more.

micro-reading. passive reading. feed titles.

they are all convenient ways to stimulate half-passively my brain. it's just like when you learn secret "adult" stuff when you are a pre-teen. you do'nt ask. just listen to a few words. try to figure. start to use the words without a true comprehension. until you find your self knowing these ideas as you had always known them.

 i think that i don't always want to open a new thick book. but if i read useful concepts as i read comic strips while having breakfast, well, i'm learning without even know that.

Marcelo Lopez replied on Sun, 2009/05/03 - 5:20pm

For me, what helps is to take a problem based approach. Tackle a concrete example of something you'd encounter in a "real life" situation. Not just some abstract concept about some technology product or language. Putting the concept that's being conveyed into a meaningful context to the issues and problems that are faced in the day-to-day flow of work, has always made more sense to me.


Burk Hufnagel replied on Fri, 2009/05/15 - 9:20pm

Hi gang,

Sorry for the delay in getting the free copies out to folks, but we're getting back on track.

I've entered the names of everyone who's posted a comment on this review - with the exception of Wei Ling (Community Manager for DZone), Anrew McVeigh (asked not to be included) and me (author)  - and entered them into a program I call the FickleFingerOfFate, whick picked three names using the best random numbers money can buy.

The winners should have all been contacted by now, but I'm posting the names here so you can all marvel at their winningness. Congratulations to sonica, sellingerd, and Jim Bethancourt! If you haven't been contacted by a DZone representative yet, please email me and I'll get things straightened out.

Thanks for all the posts! Even though the contest is over, it's OK to keep posting your thoughts, ideas, and questions.


Sachin Raverkar replied on Mon, 2009/05/25 - 5:26am

Following techniques helped me get better at learning and programming with new technologies:

1. OPEN EYES, EARS, MIND: Keep updated about new technologies by using various means like blobs, RSS feeds, forums, newsletters, popular sites like DZone, peer network, Googleing

2. KNOW IT. TRY IT: Use Google to search about What's New, HOW-TO, Get Started tutorials, technology provider's dedicated website and start reading and experimenting

3. BENCHMARK. OWN EVALUATION: Try new technology in sandbox project. Understand pros and cons. Compare it with old and latest competing technologies and understand which one to use in given scenario. Discuss with peers, netizens. Use questions and polls to know what others think about it.

4.UNBIASED: Don't get obsessed with particular technology category (Java vs. .NET), vendor, OS platforms (windows vs. *nix). See the real strengths and weaknesses of technology. Don't be devotee.

5. UNLEARN: Technologies become better and better. Unlearn older ways to use given technology and learn the latest ones.

6. TEACH WHAT YOU KNOW: I order to teach others, I need to master the technology. Thus I learn a lot. In process of teaching, I also learn from others.

7. ITS MIND GAME: Last but not the list. Keep my mind young ever. Learning happens in mind. Learning is continuous thing. Never quit it.

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.