4 Steps to Better Non-Fiction Reading

I love to read. I’ve read over 40 non-fiction books in the past year (and all five Game of Thrones books). One of the problems I ran into is that when you read a lot, it becomes hard to recall what’s in specific books. Reading is a waste of time if you can’t recall what you’ve read.

To solve the retention problem, I use a four step process to remember more of what I’ve read. I base this process on what I’ve learned from a speed reading class I took in college and reading about the psychology of learning. I find that following this process allows me to read more books and remember what’s in them.

This method works best on non-fiction books. Recent examples that I’ve read include Drive, So Good They Can’t Ignore You, and The Art of Learning. Most non-fiction books range from 200-500 pages and usually focus around a single primary thesis. Generally, there’s about 50-100 pages of valuable content mixed in with a few hundred pages of filler supporting material.

Core Principles

This process is based on two core principles from psychology.

1. Repetition

Repetition increases retention. Everyone who’s been through school knows this. Often, you get more out of reading something fast several times than one slow reading. Additionally, processing an idea in different ways will help you retain more knowledge. To increase retention, process knowledge in at least two different ways. It’s also important to actively process information. It forces you to recall the information and exposes gaps in your knowledge. For example, read something and talk about it with your friends or listen to a podcast and write a one page summary.

2. Schema

When we learn things, we organize the knowledge in our heads into an organizational pattern called a schema. I like to think of schema as a tree of knowledge. The basic facts are the trunk, the major functional areas are the branches, and details are the leaves. When learning a new topic, it’s important to get a high level view to create a structure on which you can attach details to. Here’s an example from: Psychology – Wikipedia. Notice how the whole field of psychology is structured into branches of increasingly grandular detail.


This process focuses on building up a schema while exposing yourself to the ideas of the book several times. While it seems counter intuitive, this process doesn’t take any more time than reading books from cover to cover.

1. Gather Background Information

Begin by looking at the title, author, summaries, and reviews. I start with Amazon for reviews and Wikipedia for summaries. Google/Bing is your friend. The reason we do this is to get an idea of what the thesis of the book is and to find any useful criticisms of that thesis. This gives you a foundation to hang other facts off of and additionally gives you an idea of the other side of the argument.

For example, I recently began reading the book Grain Brain. Before I began reading, I wanted to get some background information on the book.

I started off with the Amazon page.

Decent summary and reviews:
Grain Brain (Amazon)

Most of the reviews of the book are positive, so lets find some different viewpoints. I did some Googling and found some decent resources:

A news article on the book:

A low quality criticism of the book (lots of straw men and cherry picking):

A much better critisism of the book:

Based on those resources, the book has useful information. There are some issues surrounding the extremeness of the authors recommendations. Now that I understand the basic premise of the book, I can focus on the details.

Another way to get a book summary is to listen to a podcast about the book. Many authors like to go on podcasts to market their books and talk about their ideas. I’ve learned about several books by listening to podcasts about them.

2. Get a feel for the book’s structure

Next, open up the book and look at the table of contents. This will give you an idea of how the book is structured and may point you to useful resources. For example, I recently finished reading Drive. When I opened the table of contents, I noticed that the author includes a short summary in the back of the book. I read that part first to get a feel for the book. After examining the table of contents, read the introduction and conclusion of the book. At this point, you should have a good idea of what the book is about and what information the author is going to use to support their thesis.

3. Read the actual book

By the time you get to this point, you should already have a good idea of what the author is going to say and how the book is structured. The advantage of pre-reading is that you can now focus on the details.

This gives you two options. First, you can read the book quickly, grabbing details that jump out at you. Most non-fiction books contain a lot of filler. It’s nice to know you can skip over it without missing anything important. I use this tactic for general business books, like Good to Great. Most of the time, there’s about 50 pages of useful information sandwiched between 300 pages of fluff. Second, you can carefully read the book. Because you’ve already learned the basics, it’s a lot easier to pick up the details. Which path you take is dependent on your interests and the quality of the book.

4. Commonplace and discuss the book

To further increase retention, you need to process the book in different ways. Preferably active ways that require you to recall the information you’ve learned. I like to talk about interesting books that I’ve read with the people around me.

Another way to increase retention is to keep a commonplace book. A commonplace is a set of notes and quotations from books that you’ve read. Many famous historical figures kept these, sometimes copying large swaths of texts into notebooks for future reference. For each book I read, I create a one page summary and file it in OneNote. Forcing yourself to recall and process your book helps to lock in the knowledge.


Follow these four steps to increase your retention and get more value out of the non-fiction books you read. This tactic is a great way to learn new skills and improve your life.

Telling Stories With Data: Building Interactive Data Visualizations With D3.JS

This is a text version of a talk I’ve performed. The best way to use this post is to grab the demo code and follow along.

Demo Code:

If you’re interested in integrating D3.js, Web API, and ASP.NET MVC, I have a repo for that too:


Ever increasing mountains of data surround us. Finding insights in that data is one of the great challenges of the 21st century. One way to make your data work for you is to visualize it. In this post, I will show you how to create interactive data visualizations using D3.js, a popular JavaScript data visualization library.

Why should I care about data visualization?

Data visualization is important because it gives us powerful tools to make sense of all the data humanity is creating. We have more data available to us then at any time in human history and we need sophisticated tools to store, manage, parse, and learn from it. Data visualization earns a place in our data toolbox because it gives us three advantages.


One of the major advantages of data visualization is that it adds meaning to incomprehensible numbers. For example, I can tell you that the Earth has a radius of 3,959 miles and that Jupiter has a radius of 43,441 miles. It’s clear that the Earth is much smaller than Jupiter, but those numbers are too large for humans to comprehend.

I could instead show you this image:
Kepler Planets

It’s clear that Earth is tiny compared to Jupiter. The visual image shows the relationship more clearly than any set of numbers could.

Here’s another example from the creator of XKCD:

Money: A Chart of Almost All of It

Another way to increase undersanding is by telling stories with your data. Humans are hardwired to create and relate to stories. Using data visualization to tell stories can create a powerful understanding, even of complex information.

The best example of telling stories with data I’ve seen is the Health and Wealth of Nations (D3.js Version) by Hans Rosling and Gapminder.

Here’s a video of him describing it:
Hans Rosling’s 200 Countries, 200 Years, 4 Minutes – The Joy of Stats – BBC Four

This visualization tells us a complex and uplifting story of the last 200 years of human civilization. Here are a few of the things that can be learned from Health and Wealth of Nations:

  • 200 years ago: Everyone was poor and most people lived short lives.
  • 1800 – 1900: Major industrial powers like US, UK, Germany and France started gaining wealth, but most of the world was still poor and everyone still lived short lives.
  • 1900-1950: Industrial nations like Japan, the United States, and Western Europe had massive increases in both wealth and life expectancy
  • 1950-1980: Even though many countries were still poor, they had massive gains in life expectancy. The industrialized nations developed in the opposite order.
  • 1980-Present: India, China, and the rest of the developing world begin gaining wealth.


Having the facts is great, but good stories are more persuasive than statistics. Stories are an integral part of the human experience. We naturally tell them from childhood. Stories are so integral that all human cultures tell the same story. Look at any successful marketing campaign and you will see that stories. Data visualization is a great way to tell stories. Notice how effectively the Health and Wealth of Nations visualization combats the constant “if it bleeds it leads” mentality of the news media. The visualization tells us a story about the world while making a persuasive argument that the world is becoming a much better place to live.

Additional Reading:


Several public figures have tried to communicate, inaccurately, how much data is being produced. While solid numbers are hard to come by, it’s clear that we have more data available that in any time in human history. There is a pressing need to process that data efficiently. Humans are visual creatures. We can process an image much faster than a table of data points. Data visualization gives us a powerful tool to manage the data we’ve created. There’s a reason Excel comes with a “chart” function.

What is D3.js?

D3.js is a web based data visualization library written in JavaScript. Mike Bostock created D3.js in 2011. “D3” stands for Data Driven Documents. D3.js creates data driven documents by binding data to DOM elements.

Why D3.js?

  • D3.js uses standard web technologies like JavaScript, HTML, CSS, and SVG
  • Free and Open Source (Free as in speech and beer)
  • D3.js includes tools to create almost any standard data visualization
  • No need to install plugins like Flash or Java, which was a limitation of previous web based data visualization libraries.

Why not D3.js?

  • D3.js can be hard to learn, especially if you are not comfortable with JavaScript.
  • D3.js doesn’t include any “pre-canned” visuals, as opposed to tools like Flot
  • D3.js doesn’t support IE8 out of the box. You can jump through some hoops to make D3.js work with IE8, but support doesn’t come out of the box.
  • D3.js doesn’t hide your root data. Any data you use in D3.js is accessible to any savvy web user.

Ideal Use Case

D3.js works best when you want to build complex, web based, interactive data visualizations targeted at modern web browsers.

Getting Started with D3.js

Obtaining D3.js

You can get D3.js from a variety of places including Github, NuGet, NPM, and Bower

I encourage you to follow along with the examples as I explain them. I’ve included links to the relevant project files.

Select – Data – Enter – Append

“Select, Data, Enter, Append” is the core pattern in D3.js. You select an element, bind some data, handle the enter event, and append some DOM elements. This examples shows you how to do that. Consider it “Hello World” for D3.js.

Example Code:

This is the relevant code:

  var dataSet = [{
              LiteracyRate: 80,
              PercentGuessed: 22
              LiteracyRate: 60,
              PercentGuessed: 52
              LiteracyRate: 40,
              PercentGuessed: 26

    .html(function (dataPoint) {
        var message = "<td>" + dataPoint.LiteracyRate + "</td>";
        message += "<td>" + dataPoint.PercentGuessed + "</td>";
        return message;

Here’s what’s happening:

Selects a place in the DOM to append elements to. For this example, that’s a tbody element selected by it’s id. D3.js uses CSS3 style selectors, so you have several options for selectors, though I use ID and element selectors most of the time.

Selects the items you’re going to bind data to. Don’t worry about the fact that these elements don’t exist yet. In this case, we’re selecting table rows.

Binds the data to the elements.

Handles any new data points. Anything you call after this is attached to the enter event.

Adds a table row for each data point.

Adds the content of the row. The html takes a function that passes in the data point. Most generator functions will accept a function parameter.

A Brief Primer on SVG

SVG stands for scalable vector graphics. It’s an xml based way to define vector images. It’s a commonly used web technology for building graphs and is the preferred way of making charts in d3.js.

Note SVG is not supported in IE8. (SVG Support)

The example code shows you how to build a circle, a group of rectangles, and a text element. If you would like to learn more about SVG, check out Mozilla’s SVG Reference.

Example Code:

Important things about SVG:

  1. SVG elements can be styled with CSS, though SVG elements use different styles than HTML elements. Preface your svg styles with “svg” so they only apply to svg elements.
  2. SVG elements can trigger events, which is useful for triggering interaction.
  3. Many SVG elements can use relative sizes, like percentages and ems, which makes it easier to build responsive charts.
  4. (0,0) is SVG is the top left corner. This is different from the coordinate systems I’m used to where (0,0) is the bottom left corner.

Scales and Axes

When building charts, you are going to need to scale your data to your image size and build relevant axes to label your data. D3.js has several helper functions to assisting in creating scales and building the SVG for your axes. The demo below uses three different scales and renders an axis for each of them.

Example Code:

A D3.js scale is a function that maps a group (domain) of inputs to a range of values. There are three different types of scales in D3.js:

Quantitative Scales scales apply a mathematical function to build a scale.

Ordinal Scales are useful for mapping discrete values (like categories) to a scale.

Time Scales map a time range.

If you want to learn more:
D3.js Scales.

A basic scale:

// Linear Scale
var linearScale = d3.scale
    .range([0, height-10])
    .domain([0, d3.max(data)])

Here’s what’s going on:

Generates a linear scale function.

.range([0, height-10])
Sets the range of outputs. We’re subtracting 10 pixels to give the the scale a little bit of room.

.domain([0, d3.max(data)])
Sets the domain of inputs. d3.max() gets the largest item in the set.

Causes D3.js to round off outputs. This prevents D3.js from creating values like “45.8530260724415” for pixel measurements.

D3.js, an axis is a function the draws an axis with the appropriate labels and tick marks. This function creates an axis for the scale above.

//Linear Axis
var linearAxis = d3.svg.axis()

Declares an axis function.

Sets a scale for the axis to draw.

orient(“left”) and ticks(5)
Set up how the scale is rendered.

Handling Data Changes

As I’ve mentioned before, D3.js binds data to DOM elements. As you add, remove, and change your dataset, D3.js has events that are called. You can handle those events to add, change, and remove elements in your chart.

Example Code:

D3.js Data Events:

Enter occurs when data enters the set. This is the most common event.

         .attr("cx", function (item, i) { return width })
         .attr("cy", function (item, i) { return height - item.Height })
         .attr("r", function (item) { return item.Radius })
         .on("click", function (item) { alert(generateMessage(item));});

In this example, when enter is triggered, we build an SVG circle and add a click handler to it.

Exit occurs when data leaves the set.

         .attr("cx", function (item, i) { return width })
         .attr("cy", function (item, i) { return height })
         .attr("r", function (item) { return 0 })
         .attr("fill", function (item) { return "#000000" })

In this example, we move the SVG element to the bottom right corner, fade it out, and then remove the element. transition() and duration() create a smooth animation as the element leaves the chart.

Update occurs when data changes.

         .attr("cx", function (item, i) { return xScale(i) })
         .attr("cy", function (item, i) { return height - item.Height })
         .attr("r", function (item) { return item.Radius })
         .attr("fill", function (item, i) { return prettyColors[item.Index % (prettyColors.length - 1)] });

To update an element, you just add the code to change the element to your selection. In this case, we’re moving the circle and changing it’s color.

Important Note
In order for the update event to work as expected, you need to set an index function to provide a key to the elements. In this example, we give each item in our data set an index and use that when the data is bound.

var selection = svg.selectAll("circle")
                   .data(dataSet, function (item) { return item.Index });

Advanced Topics


Building a chart in D3.js takes a significant amount of code, which we don’t to have to repeat for every chart we make. To make our charts reusable, we can use the pattern that D3.js uses in it’s generator functions.

Example Code:

Basic Reusable Chart Pattern:

// Add a new object onto the d3 namespace
d3.d3Demos = {};

// Add a generator function
d3.d3Demos.barchart = function(){
  // set default values
  var width = 900;

  // Create a generator function that builds the chart.
  function generator(selection){
    selection.each(function(dataSet) {
        // Chart Building Code            

  // Create setter functions that add the values to the function object.
  generator.width = function(value) {
    if (!arguments.length) return width;
    width = value;
    return generator;

  // return the generator function
  return generator;

To call the generator function:

var data = [{y: 50, x: 11}, {y: 60, x: 36}, {y: 70, x: 53}];
// Creates the generator
var chart1 = d3.d3Demos.barchart();


When we call the generator function, we are using the datum() (not data()) function to add the data to the selection. dataum() adds the data, but doesn’t bind it. The call() function executes a function and passes in the current selection.

If you want to learn more:
Towards Reusable Charts


While our previous demos have focused on making charts with simple SVG elements, D3.js is capable of making complex visualizations. It does this through the use of layouts. A layout is a function that transforms your data into a format that makes it easier to build a complex visualization. There are many layouts in D3.js. In this example, we will focus on the pie chart layout.

Example Code:

// Create the layout function
var pie = d3.layout.pie();

//Create SVG element
var viewBox = "0 0 " + size + " " + size;
var svg = d3.select(this)
            .attr("class", "svg-content")
            .attr("viewBox", viewBox)
            .attr("preserveAspectRatio", "xMinYMin meet");

// This method generates SVG arcs
var arc = d3.svg.arc()

var arcs = svg.selectAll("g.arc")
            .attr("class", "arc")
            .attr("transform", "translate(" + outerRadius + ", " + outerRadius + ")");

arcs.append("path").attr("fill", function(d, i) {
                return colors(i);
            .attr("d", arc);


We are passing our data set to the pie() function we created at the top of the example. The layout calculates the data we need to use the arc() function, which generates the definition of the path elements we’re using for our pie wedges.

Responsive Tactics

Anyone doing modern web development should be concerned with making their websites responsive. Because D3.js uses SVG, which is a vector based format, we have several options for making our charts responsive.

The first option is to use relative sizes like percentages or ems. This approach is useful for simple charts, but can be cumbersome for complex charts.

Another option is to make the SVG element scale to the size of it’s container. This is a flexible method, but this means everything in your chart scales, including your text. This is the method I used in the previous example. To deal with the text size limitation, I moved the legend outside of the SVG element.

If you would like to learn more making SVG responsive:



Interactive Data Visualization for the Web
Free Online Version |

Developing a D3.js Edge

Helpful Sites

Mike Bostock’s website
D3.js website
MDN SVG Reference



Stoic Wisdom for Software Developers: Introduction

How can a bunch of philosophers who lived over 2000 years ago help you become a better software developer? The ancient philosophy of Stoicism has tools that can help you become happier and more productive.

This post is the first part in a series where we’ll explore different techniques from Stoic philosophy and how to use them to become a better software developer.


Zeno of Citium founded Stoicism around 300 B.C. in Greece. The school continued through the Roman emperor Marcus Aurelius in 180 A.D. The Stoic philosophers came from a variety of backgrounds. Some Stoics, like Marcus Aurelius or Seneca, were important and powerful, while others, like Epictetus were slaves.

The modern usage of the word “stoic” would make you believe that Stoicism is about being a melancholy robot. This is not the case. The primary goal of Stoic philosophy is to focus only on the things you control. The Stoics used reason to temper negative emotions. The Stoics worked to achieve a peaceful state of mind, regardless of adversity. They found happiness and peace in a chaotic world.

To achieve this peace of mind, the stoics developed a set of mental tools. These tools can be used to deal with chaotic situations, like those encountered by software developers.

Why Pursue Stoicism?

Stoicism is useful because software development is an emotional and chaotic field.

Examples include:

Most of these situations occur because we get too emotional over things that are not in our control. Studying stocism won’t make these issues go away, but it will make it much easier to deal with them.

More Information:



Building My First Tech Talk

Ever want to give a tech talk to your peers? I recently built and delivered my first tech talk and I’d like to share my experience.


There are several factors that have contributed to my desire to to make a tech talk. The first is that one of my career goals is to become more involved with my local developer community. I am fortunate to live in a city that has a vibrant technical community and I wanted to contribute something to that community.

If you would like to know some of the benefits of becoming involved more in your local tech community, watch this video (It’s currently free):
Get Involved

The second reason is that when I was in college, I participated in forensics (speech and debate) and miss publicly speaking. I’ve thought about joining Toastmasters or a similar organization, but doing a technical presentation is more accessible and congruent with my career goals.

The final reason is that the best way to learn something is teach it. Teaching a subject requires in depth knowledge and the fear of looking like an idiot encourages you to thoroughly learn your subject material.


The first step in build a talk is picking a subject to talk about. For this talk, I decided to demonstrate D3.js, a JavaScript data visualization library. After using it at work and seeing how powerful the library is, I really wanted to dig into it more.

I recommend picking something you are personally interested in, and not worry about whether or not you are currently an expert in your topic. Obviously don’t pick something you know nothing about, but don’t be afraid to branch out. Researching the presentation will help you become an expert.

The second step is to research. For my talk, I read Interactive Data Visualization for the Web by Scott Murray and many online tutorials. I also built lots of small demos.

After some research, start building an outline. This outline will probably change with new information, but it’s good to get an idea of what you want to talk about. Having an outline helps focus your research efforts.

While researching, I also built the demonstrations that I used in my presentation. My goal was to show the power of data visualization on the web, so the focus of my presentation was walking through lots of examples.

Tech demos have a tendency to fail, so it’s important to keep things simple and minimize dependencies. I made it a point to make sure my demos didn’t rely on any outside components. No databases, no web services, just local code. I also put my code on Github, so I could easily setup my project on another computer if I needed to.

After building the demo, and the outline, it’s time to put together your talk. If you have slides that you want to use, build those now. I had a few slides, but most of my presentation was examples and code demos.

After that, practice! Try to run through your presentation at least a couple of times. Rehearse in your head and out-loud. Give your talk to the dog or cat. Make sure your timing is good and your transitions are smooth.

Also, don’t write out your talk and memorize it. This will stifle your delivery and ability to go with the flow of your audience. Rehearse your key points and don’t worry about getting everything word for word. Your audience changes with every performance and it’s important to be able to cater to that audience. Memorizing a written speech will prevent that from happening.

Lessons Learned

So far, I’ve given my presentation twice. Once at the local .NET meetup group and once at my current employer. Both situations were different and provided different learning opportunities.

What didn’t go so well?

The one thing that surprised me was the awkwardness of transitioning in and out of PowerPoint presenter mode. My presentation initially consisted of an alternation between slides and demos of visualizations on the web. Unfortunately, PowerPoint made those transitions really awkward. To fix this, I ended up pulling those slides and just showing the demos. Less PowerPoint is not a bad thing.

I ran into another issue when I gave my presentation to my current employer. I didn’t realize that I was also giving my presentation to the non-technical staff as well as the developers. To adapt, I spent more time talking about general data visualization concepts and less time walking through code. I also told my audience that the second part of the talk was more technical. I can’t stress enough about how important it is to cater to your audience.

What went well?

I was surprised at how well the question and answer portion of the talk went. Studying up for the presentation really paid off.

I also felt like I adapted to changing circumstances well. This is probably because my forensics career in college was spent in limited preparation events, where you need to be able to think on your feet.

I put all of my talk materials on Github, so people could follow along and download the code themselves. I had a number of positive comments about that.


  1. Adapt to your audience and your situation. Don’t regurgitate a canned speech.
  2. Publicly share your demo code and slides.
  3. Beware of potential technical difficulty. Pre-load any web pages and make sure all of your code functions correctly. Make sure all of of the A/V stuff works (like font sizes and slide transitions).


I am glad I made this talk and plan to make more in the future. The whole experience was highly educational and it felt good to make something useful for the community. I can’t recommend it enough.

I’ll be speaking at That Conference in August, so please check out my talk.

Talk Code and Slides

3 Tips To Help You Ace Your Next Technical Interview

I used to be a little nervous about doing technical interviews. Even though I spend much of my free time learning about technology, I’m still afraid that I’ll be perceived as an idiot. To combat this feeling, I have developed several practices to improve my interviewing skills.

1. Review Your Resume

Every interview I’ve been to asks you for examples from your work history. To prepare for these types of questions, review your resume before each interview. For each job on your resume, think about the challenges you faced, what technologies you used, and what you were proud of. Think about stories you can tell from previous jobs to potential employers. Practice telling those stories in your head or in front of a mirror. This exercise primes your brain. When prompted, you will be ready with a story from your work history.

2. Practice Answering Standard Technical Questions

Depending on the technology stack and what job you are interviewing for, most employers ask a list of standard questions. You will get a feel for this list as you do more technical interviews. I’m an ASP.NET Developer, therefore I get questions on the following topics:

  • Basic OOP (Encapsulation, Inheritance, Polymorphism)
  • Abstract Base Classes vs Interfaces
  • The ASP.NET Page Lifecycle
  • String Concatenation using StringBuilders
  • Basic Design Patterns
  • Linq
  • Generics
  • Job Specific C# and ASP.NET Trivia
  • Major features in new releases of ASP.NET (async, await, etc…)

To prepare, you need to research the concept, practice describing the concept, and for more complex questions, come up with relevant examples. For example, when describing OOP concepts, come up with a novel example. Instead of the usual examples of vehicles or animals, try something a little different, like a beer factory or different types of ducks. The key here is to show that you understand the concepts, as opposed to being able to memorize a textbook example.

3. Practice Your Public Speaking Skills

I learned my public speaking skills by competing in college forensics (speech and debate). It was a great experience that has helped me in many ways. I highly recommend competitive speaking if you have the opportunity. If you are no longer in school, you can join Toastmasters or practice with a group of your peers. Meetups are a good way to find groups of people to practice with. You can also give presentations at user groups and conferences. Practicing your public speaking skills on a regular basis will help you eliminate filler words from your vocabulary and help you learn how to handle fears surrounding public speaking. If you can explain a complex technical concept to a group of thirty people, then you should have no problem with three people in a job interview.

Reprogram Your Wetware: Habit Change for the Modern Software Developer

Habits are like cron jobs for the brain. They govern a large portion of our behavior automatically. According to a study by a researcher at Duke University, more than 40 percent of our day to day actions are the result of habits. (1) Fortunately, habits can be reprogrammed.

The Habit Loop

The habit loop is composed of three parts. Once this loop is established, the habit becomes automatic. These components are:


A cue is what triggers a habit. For example, my cue to eat lunch is that the time is around noon. Cues can take many forms, including specific times (dinner at six PM), mental states (emotional eating when sad), visuals (eating candy on the counter), or preceding actions (brushing your teeth after a meal).


A routine is the action that triggers the reward. This is the behavior you are trying to change.


The reward is what you get for completing the routine. Examples include the sugar rush at the end of a candy binge or the runners high you feel after a hard workout. Rewards are not always obvious. For instance, when I was in college, I would work out with my friends on a regular basis. The reward wasn’t the energy boost from the workout, but the time I spent with my friends.

The key to changing a habit is to identify the habit loop. Once you identify the habit loop, you can change the components of the loop and change the behavior. Here are some strategies that you can use to modify your own habits:

Environment Design

The easiest way to change a habit is to modify your environment. Add cues to trigger good habits or remove the cues that trigger bad habits. For example, I like to put my weights in my living room so I’m reminded to workout. The great thing about environment design is that you can take it as far as you want to go. You could even build a Batcave for Habit Change

Swap the Routine

Charles Duhigg, in the book The Power of Habit, advocates changing routines. This is a good strategy when you don’t have control over your environment. It’s easy to hide the M&Ms in your pantry, but hard to get your office to remove a vending machine. To change a routine, learn to identify the cue that triggers the habit and then try different routines until you find one that delivers the same reward. For example, if you want to kick a morning soda habit, try switching to tea or doing 20 squats instead.

Material Decomposition

This technique comes from Stoic philosophy. It works by devaluing the reward for a habit. Take something you desire, like a new gadget, and decompose it. For example, the hot new phone is really just a metal and glass enclosure with some copper and plastic inside. Decomposition shows you that the items you desire are not special.

Keystone Habits

There are certain habits that have the potential to radically alter your life. These are called keystone habits. Keystone habits can start a chain reaction that changes other habits. If you can develop a keystone habit, you can radically alter your life.

Common keystone habits include:

  • Exercise
  • Eating dinner with your family
  • Keeping a Journal

Organizational Habits

Habits don’t just apply to individuals. Organizations also have habits. Some of these habits are documented in policies and others are a result of organizational culture. Most business books highlight organizational habits. The classic business book Good To Great is about habits that are shared by “great” companies. The Joel Test is a list of desirable habits for software development organizations.

Additional Reading

  1. The Power of Habit – Charles Duhigg
  2. See Like a Stoic: An Ancient Technique for Modern Times
  3. Good To Great – Jim Collins


  1. Habits—A Repeat Performance, David Neal

Resources for learning ASP.NET MVC and Preparing for Exam 70-486

ASP.NET MVC is great, but one thing I’ve had trouble with is finding information. I’ve wasted many hours searching for documentation or solutions to specific problems. It’s much easier to find good documentation on ASP.NET Web Forms and JavaScript. This difficulty is compounded by the fact that I’m currently preparing to take Exam 70-486. I have found a number of useful resources to help other get up to speed on ASP.NET MVC.


Developing ASP.NET MVC4 Web Applications Jump Start

This is an eight part course that’s great for learning the basics of ASP.NET MVC. It’s high level, but I found it useful. The class is done by the Microsoft Virtual Academy, which has free videos on a large number of subjects.


Born To Learn: 486 Wiki

This site has a ton of information about MVC and the exam.


When I was primarily working in Web Forms, my first stop for development information was MSDN. For MVC, I find myself getting most of my information from Stack Overflow.


Programming ASP.NET MVC 4: Developing Real-World Web Applications with ASP.NET MVC

This is an excellent book that covers almost all practical aspects of building ASP.NET MVC applications. In addition to the basics, it includes information on architecture, optimization, build automation, and deployment. I reference this book often at work. I highly recommend it.

Exam Ref 70-486: Developing ASP.NET MVC 4 Web Applications

This book has proven to be less useful than the O’Reilly book above. This book covers all of the exam objectives, but some of the chapters are filler and reading this book alone will not give you enough information to pass the exam or build ASP.NET MVC applications. The previous book is a much better source of information.  I wouldn’t recommend it for anything other than prepping for the exam.

How I Passed 70-480: HTML5, JavaScript, CSS3

I recently passed Exam 70-480. Despite the lack of official study material and information regarding what was on the exam, I passed the exam. I am going to share what I did to study for the exam and list some tips so that you may have an easier time studying for this exam.

What’s on 70-480:

This exam primarily deals with web programming in JavaScript, HTML5, and CSS3. Much of the exam is focused on implementing HTML5 API’s such as Geolocation, Local Storage, and the Canvas.

A list of skills measured can be found here:


I found that the exam closely tracks the list of skills measured. I’ve taken a number of non-Microsoft exams and 70-480 is very straightforward. Most of the questions consist of a block of code and you need to select the proper code block to answer the question. You will need to read the question carefully and know the material, but there are no tricks.

Here’s the list of Microsoft Exam Question Types:


Most of the questions I ran into were multiple choice, repeated answer, and case studies.

My Study Guide for Passing the Exam:

I started learning web development in 2001, have been a professional web developer for over six years, and I’ve been tracking the technologies in this exam for several years. These are the things I did to study for the exam:

  1. I watched the 70-480 Jump Start Videos on the Microsoft Virtual Academy:


  2. I read this book:

    Training Guide: Programming in HTML5 with JavaScript and CSS3

  3. I went through each of the skills measured and made a code demo for each feature. I used a combination of local websites and jsfiddle.net This was the most useful of the three exercises. The best way to prep for this exam is to research and practice the exam objectives. You can not pass this test on concepts alone, you have to actually code.

Exam Tips:

  1. Read the questions very carefully. Many of the questions are very specific and the correct solution hinges on the wording of the question.
  2. Practice the exam objectives. All of the questions on the exam involved reasoning around code. You need to know how to actually write the code in order to pass this exam. This is not a purely conceptual exam.
  3. The Mozilla Developer Network is a great reference for HTML, JavaScript, and CSS. I used it constantly while preparing for the exam.