<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6889884053798500413</id><updated>2012-01-22T08:50:54.682-08:00</updated><category term='TDD'/><category term='Unit Testing'/><category term='Agile2012'/><title type='text'>The way things work in Llewellyn's world</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://llewellynfalco.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://llewellynfalco.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>&lt;a href="http://www.twitter.com/llewellynfalco"&gt;@Llewellyn Falco&lt;/a&gt;</name><uri>http://www.blogger.com/profile/11668997629228826023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_s2oZS5jFv1g/SPTCNxT1pyI/AAAAAAAAABI/bW8VaJ-Hlwk/S220/Llew.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>25</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6889884053798500413.post-463133565542607249</id><published>2012-01-22T08:50:00.001-08:00</published><updated>2012-01-22T08:50:54.805-08:00</updated><title type='text'>This (new) developers life</title><content type='html'>&lt;p&gt;Today I discovered the podcast “&lt;a href="http://thisdeveloperslife.com/"&gt;This Developer’s Life&lt;/a&gt;”. It’s a very differently crafted podcast. Very true to the style of&amp;nbsp; &lt;a href="http://www.thisamericanlife.org/"&gt;"This American Life”&lt;/a&gt; that it’s name is borrowed from. It is more in a story telling venue, better production quality, not about API’s or even craftsmanship, but rather “common” themes to lives programmers.&lt;/p&gt; &lt;p&gt;I listened to Episode’s “&lt;a href="http://thisdeveloperslife.com/post/2-0-6-play"&gt;Play&lt;/a&gt;” &amp;amp; “&lt;a href="http://thisdeveloperslife.com/post/1-0-3-problems"&gt;Problems&lt;/a&gt;”. They are nice, but it stirred in me an issue that first surfaced last year at Tech Ed South Africa, when I attended a presentation that presented &lt;a href="http://www.youtube.com/watch?v=4c0lk-LtLI0"&gt;this clip from the Movie “The social network”&lt;/a&gt; about being “wired in” and then stated this is the best way to be productive. I remembered nights or days with my headphones on, programming in the zone, but I could NOT remember the last time I actually programmed with headphones. I don’t work that way anymore. &lt;/p&gt; &lt;p&gt;“Play” also described this state, but mentioned that it was hard to get into with programming. They argued that racecars could instantly move you into it, but code was more haphazard about when you’d get into the zone. &lt;/p&gt; &lt;p&gt;“Problems” talked about what I consider to be the opposite effect;Bugs and the frustration and confusion they bring about. They also talked about the lack of satisfaction when the bug is finally found. Techniques to build up success, when to quit or undo.&lt;/p&gt; &lt;h3&gt;The Old Me&lt;/h3&gt; &lt;p&gt;I remember a time when this felt &lt;strong&gt;very &lt;/strong&gt;familiar. In fact most of my younger years identified heavily with these anecdotes. I use to say “you have to &lt;em&gt;love&lt;/em&gt; programming to be able to survive because bugs are so frustrating.” However, this whole thing was more of a nostalgic experience for me. In fact, I found myself shaking my head often, wanting to correct the process. For example, In the “Problems” episode, when they are talking about the bug introduced while programming in Sinatra, all I could think was “use &lt;a href="http://www.youtube.com/watch?v=mbbIKXopkWI"&gt;Git Bisect&lt;/a&gt;”.&lt;/p&gt; &lt;p&gt;I’m not sure exactly when the changes started and I became proficient enough in my new skills and attained enough discipline that I stopped having these experiences. And I should note that they haven’t stopped completely, I still have relapses sometimes, but they are much much fewer and father apart. &lt;/p&gt; &lt;p&gt;But I do know why I have changed.&lt;/p&gt; &lt;h3&gt;The New Me&lt;/h3&gt; &lt;p&gt;Nowadays, I am almost constantly in the zone when I’m programming. I rarely fight with a bug for hours, and almost never if it’s an regression bug, in fact 10 minutes is a long time for a regression bug.&lt;/p&gt; &lt;p&gt;I am more disciplined than ever in my code, and part of that is focus, and part of that is small steps building up success.&lt;/p&gt; &lt;p&gt;I also am frequently in a state I would describe as “brain on fire” a state of hyper creativity that makes the old “in the zone” feel a bit stale.&lt;/p&gt; &lt;p&gt;The changes have come from from &lt;a href="http://en.wikipedia.org/wiki/Extreme_programming"&gt;eXtreme programming&lt;/a&gt;. I started on this road almost a decade ago in 2002, and I have to search back to around that time to identify with the concepts and stories in the podcast. &lt;/p&gt; &lt;p&gt;There are many practices in eXtreme programming that contribute to the overall effect, and the combine upon each other to get the full result, but I want to highlight the most useful ones. I’ll do it in order of value for me personally.&lt;/p&gt; &lt;h4&gt;&lt;/h4&gt; &lt;h4&gt;Pair Programming&lt;/h4&gt; &lt;p&gt;When they talk about the zone, pairing brings that almost instantly. I am amazed at how focused I can be when pairing with someone. Email, twitter, other people… it all fades into the background, and the code pops in front of you. Even if a interruption occurs it is quick &amp;amp; easy to regain that focus.&lt;/p&gt; &lt;p&gt;Learn more about pair programming, &lt;a href="http://llewellynfalco.blogspot.com/2011/04/value-of-pair-programming.html"&gt;here&lt;/a&gt; &amp;amp; &lt;a href="http://www.amazon.com/Pair-Programming-Illuminated-Laurie-Williams/dp/0201745763/ref=sr_1_1?s=books&amp;amp;ie=UTF8&amp;amp;qid=1327249061&amp;amp;sr=1-1"&gt;here&lt;/a&gt;.&lt;/p&gt; &lt;h4&gt;Test Driven Development (TDD)&lt;/h4&gt; &lt;p&gt;A clearly stated problem, constant feedback, and regression about twice every minute! TDD has removed the &lt;a href="http://i.imgur.com/VBsyN.png"&gt;massive hell that bugs&lt;/a&gt; by breaking things into nice little steps, and catching you if you slip. Nowadays when something goes wrong I know about it 30 seconds later, and Ctrl+Z is usually the answer.&lt;/p&gt; &lt;p align="center"&gt;&lt;em&gt;“The journey of a Million lines starts with a single Unit Test.”&lt;/em&gt;&lt;/p&gt; &lt;p align="left"&gt;Learn more about TDD &lt;a href="http://approvaltests.sourceforge.net/"&gt;here&lt;/a&gt;, &lt;a href="http://www.amazon.com/gp/product/0321146530/ref=s9_simh_gw_p14_d0_g14_i2?pf_rd_m=ATVPDKIKX0DER&amp;amp;pf_rd_s=center-2&amp;amp;pf_rd_r=01RMDPRJE4FQY6F1KVT0&amp;amp;pf_rd_t=101&amp;amp;pf_rd_p=470938631&amp;amp;pf_rd_i=507846"&gt;here&lt;/a&gt; &amp;amp; &lt;a href="http://www.youtube.com/watch?v=igywEzPJRsM"&gt;watch a video demo here&lt;/a&gt;.&lt;/p&gt; &lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt; &lt;h4 align="left"&gt;Incremental &amp;amp; Iterative Development&lt;/h4&gt; &lt;p align="left"&gt;TDD sort of forces you to do small steps in a iterative fashion with constant feedback, but eXtreme programming doesn’t stop there. It uses this technique with user stories, refactoring, continuous integration, source control, retrospectives and many other practices. It’s extremely powerful. Do something small. No smaller. Now add some more.&lt;/p&gt; &lt;p align="left"&gt;How powerful is smaller? Let me show you an example from my own history &lt;/p&gt; &lt;p align="left"&gt;Books written – 0&lt;br&gt;Blog Posts – 25&lt;br&gt;Tweets - &lt;strong&gt;2,621&lt;/strong&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6889884053798500413-463133565542607249?l=llewellynfalco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://llewellynfalco.blogspot.com/feeds/463133565542607249/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6889884053798500413&amp;postID=463133565542607249' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/463133565542607249'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/463133565542607249'/><link rel='alternate' type='text/html' href='http://llewellynfalco.blogspot.com/2012/01/this-new-developers-life.html' title='This (new) developers life'/><author><name>&lt;a href="http://www.twitter.com/llewellynfalco"&gt;@Llewellyn Falco&lt;/a&gt;</name><uri>http://www.blogger.com/profile/11668997629228826023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_s2oZS5jFv1g/SPTCNxT1pyI/AAAAAAAAABI/bW8VaJ-Hlwk/S220/Llew.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6889884053798500413.post-6667892655520784915</id><published>2011-12-19T10:17:00.000-08:00</published><updated>2011-12-19T10:28:04.356-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Agile2012'/><title type='text'>Agile 2012 Development Practices &amp; Craftsmanship stage</title><content type='html'>&lt;span style="font-family: arial, sans-serif;"&gt;This is the&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: arial, sans-serif;"&gt;original&lt;/span&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&amp;nbsp;description we made as the producers for the Agile 2012 Development Practices Stage.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;It didn't fit the needed format, so we couldn't use it, but it is what we have in our mind, and I thought it would be useful for speakers who are thinking of submitting to read.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: arial, sans-serif;"&gt;You can submit here:&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;a href="http://submit2012.agilealliance.org/"&gt;http://submit2012.agilealliance.org/&amp;nbsp;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;span style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;span style="font-size: large;"&gt;Development Practices &amp;amp; Craftsmanship stage&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: arial, sans-serif;"&gt;"We have come to&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: arial, sans-serif;"&gt;valueWorking Software"&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;span style="font-family: arial, sans-serif;"&gt;This stage is about the code, and our goal is&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: arial, sans-serif;"&gt;to have each attendee go away from each session having taken their game&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: arial, sans-serif;"&gt;to a higher level.That's what real craftsmanship is all about - the&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: arial, sans-serif;"&gt;desire to constantly improve.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: arial, sans-serif;"&gt;We will accomplish this in 3 ways:&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;b style="font-family: arial, sans-serif;"&gt;Core Practices&lt;/b&gt;&lt;span style="font-family: arial, sans-serif;"&gt;: By having an explicit minimum set of "must&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: arial, sans-serif;"&gt;have" topics &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;b style="font-family: arial, sans-serif;"&gt;Practice&lt;/b&gt;&lt;span style="font-family: arial, sans-serif;"&gt;: we intend for Wednesday to be a code&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: arial, sans-serif;"&gt;retreat day within the conference! &amp;nbsp;(more details to follow)&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;b&gt;Advanced&lt;/b&gt;: Agile2012 is also the premier place to share what we've&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: arial, sans-serif;"&gt;learned as we've continued to improve over the last year&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: arial, sans-serif;"&gt;It should be stated that as our track is about code, we are looking for&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: arial, sans-serif;"&gt;sessions with lots of code in them. Demo heavy rather than slide heavy.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;span style="font-size: large;"&gt;Must-have&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: arial, sans-serif;"&gt;"You can't possibly have a stage for dev practices and&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: arial, sans-serif;"&gt;craftsmanship and not cover ________ !"&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&amp;nbsp;That's what goes in this list&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: arial, sans-serif;"&gt;for us.This stage must have an introductory session to these areas,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial, sans-serif;"&gt;which we consider fundamental:&lt;/span&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&amp;nbsp;TDD&amp;nbsp; - Refactoring&amp;nbsp; - Pairing&amp;nbsp; - CI&amp;nbsp; - BDD&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;span style="font-size: large;"&gt;Guidelines&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;b&gt;Language&lt;/b&gt;: As these sessions are about code, one factor&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: arial, sans-serif;"&gt;is which language will the demo's be given in. Please clearly state&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: arial, sans-serif;"&gt;that in your submission.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;b&gt;No first-run sessions&lt;/b&gt;: Your session should be one that you've&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: arial, sans-serif;"&gt;given at least once before. Even if that was just at an in-house event&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: arial, sans-serif;"&gt;or for a small local group - that is ok.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;b&gt;Speaking skills&lt;/b&gt;: Help us to know what you are like as a&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: arial, sans-serif;"&gt;speaker.Please include a link to a online video (preferably youtube)&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: arial, sans-serif;"&gt;of you speaking at a user group or conference. This is extra helpful if&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: arial, sans-serif;"&gt;you are linking to the talk you will be presenting at Agile2012, but&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: arial, sans-serif;"&gt;any presentation will be helpful to us.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;b&gt;Training&lt;/b&gt;: The core goal for this stage is to transfer&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: arial, sans-serif;"&gt;skill.Sessions should help people to improve their skills rather than&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: arial, sans-serif;"&gt;just delivering a lecture.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6889884053798500413-6667892655520784915?l=llewellynfalco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://llewellynfalco.blogspot.com/feeds/6667892655520784915/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6889884053798500413&amp;postID=6667892655520784915' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/6667892655520784915'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/6667892655520784915'/><link rel='alternate' type='text/html' href='http://llewellynfalco.blogspot.com/2011/12/agile-2012-development-practices.html' title='Agile 2012 Development Practices &amp; Craftsmanship stage'/><author><name>&lt;a href="http://www.twitter.com/llewellynfalco"&gt;@Llewellyn Falco&lt;/a&gt;</name><uri>http://www.blogger.com/profile/11668997629228826023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_s2oZS5jFv1g/SPTCNxT1pyI/AAAAAAAAABI/bW8VaJ-Hlwk/S220/Llew.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6889884053798500413.post-2175301008768811797</id><published>2011-09-15T14:31:00.000-07:00</published><updated>2011-09-15T14:31:10.833-07:00</updated><title type='text'>Agile Open Northern California</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://edgibbs.com/images/agile-open-logo.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://edgibbs.com/images/agile-open-logo.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;What is&amp;nbsp;Agile Open Northern California?&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;[&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;a href="http://www.agileopencalifornia.com/sc_register.html"&gt;Register Here&lt;/a&gt;]&lt;/span&gt;&lt;br /&gt;Agile Open NorCal is an annual, 2-day event hosted by the local agile community. Here managers, developers &amp;amp; students meet and discuss topics that they are interested in.&lt;br /&gt;Past topics included&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Team self improvement&lt;/li&gt;&lt;li&gt;Coding skills practice&lt;/li&gt;&lt;li&gt;Kanban&lt;/li&gt;&lt;li&gt;How to test&lt;/li&gt;&lt;li&gt;Communication through drawings&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Open spaces are optimized to help you learn what YOU need to, not what someone else wants you to hear.&lt;br /&gt;&lt;br /&gt;Find out more about &lt;a href="http://en.wikipedia.org/wiki/Open_Space_Technology"&gt;open spaces at here.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Who attends&amp;nbsp;&lt;/b&gt;&lt;b&gt;Agile Open Northern California&lt;/b&gt;&lt;b&gt;?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Managers:&lt;/b&gt;&lt;br /&gt;&amp;nbsp;There are many sessions about managing technical professionals. Agile helps to improve communication, prioritize work streams, and&amp;nbsp;visibility&amp;nbsp;into the team and unstick teams. Managers share their successes. Many times puzzles and games are used to help understand underlying behavioral issues.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Developers:&lt;/b&gt;&lt;br /&gt;&amp;nbsp;There are usually hands on coding sessions to help developers practice and hone their craft. Agile development is strong on continual learning of best development practices. While Agile Open space is not language or API specific, many times the hands-on discussions are very specific to the problems you are having (For example: many times a dev will open up their legacy code challenge to solicit advice.)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Students:&lt;/b&gt;&lt;br /&gt;&amp;nbsp;This is an excellent opportunity for students to find about ‘working in the real world.’ &amp;nbsp;Also they can talk and code side-by-side with both technical managers and developers. &amp;nbsp;Agile Open is a great place to ‘try out’ ideas students have been learning in their classrooms. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Details:&lt;/b&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;Agile Open NorCal is hosted at&lt;/span&gt;&lt;span class="Apple-style-span" style="background-color: white;"&gt;&amp;nbsp;Fort Mason Conference Center in San Francisco&amp;nbsp;&lt;/span&gt;on&lt;br /&gt;&lt;br class="Apple-interchange-newline" /&gt;Monday, Oct. 3rd&lt;br /&gt;Tuesday, Oct. 4rd&lt;br /&gt;&lt;br /&gt;8:30 am to 5 pm.&lt;br /&gt;It costs $250 to attend. &amp;nbsp;We hope to see you there.&lt;br /&gt;&lt;a href="http://www.agileopencalifornia.com/nc_register.html"&gt;Register Here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6889884053798500413-2175301008768811797?l=llewellynfalco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://llewellynfalco.blogspot.com/feeds/2175301008768811797/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6889884053798500413&amp;postID=2175301008768811797' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/2175301008768811797'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/2175301008768811797'/><link rel='alternate' type='text/html' href='http://llewellynfalco.blogspot.com/2011/09/agile-open-northern-california.html' title='Agile Open Northern California'/><author><name>&lt;a href="http://www.twitter.com/llewellynfalco"&gt;@Llewellyn Falco&lt;/a&gt;</name><uri>http://www.blogger.com/profile/11668997629228826023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_s2oZS5jFv1g/SPTCNxT1pyI/AAAAAAAAABI/bW8VaJ-Hlwk/S220/Llew.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6889884053798500413.post-8024811837210597619</id><published>2011-09-09T19:28:00.000-07:00</published><updated>2011-09-09T19:28:41.185-07:00</updated><title type='text'>Open Agile SoCal 2011</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://edgibbs.com/images/agile-open-logo.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://edgibbs.com/images/agile-open-logo.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;What is&amp;nbsp;Open Agile SoCal?&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;[&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;a href="http://www.agileopencalifornia.com/sc_register.html"&gt;Register Here&lt;/a&gt;]&lt;/span&gt;&lt;br /&gt;Open Agile SoCal is an annual, 2-day event hosted by the local agile community. Here managers, developers &amp;amp; students meet and discuss topics that they are interested in.&lt;br /&gt;Past topics included&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Team self improvement&lt;/li&gt;&lt;li&gt;Coding skills practice&lt;/li&gt;&lt;li&gt;Kanban&lt;/li&gt;&lt;li&gt;How to test&lt;/li&gt;&lt;li&gt;Communication through drawings&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Open spaces are optimized to help you learn what YOU need to, not what someone else wants you to hear.&lt;br /&gt;&lt;br /&gt;Find out more about &lt;a href="http://en.wikipedia.org/wiki/Open_Space_Technology"&gt;open spaces at here.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Who attends Open Agile SoCal?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Managers:&lt;/b&gt;&lt;br /&gt;&amp;nbsp;There are many sessions about managing technical professionals. Agile helps to improve communication, prioritize work streams, and&amp;nbsp;visibility&amp;nbsp;into the team and unstick teams. Managers share their successes. Many times puzzles and games are used to help understand underlying behavioral issues.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Developers:&lt;/b&gt;&lt;br /&gt;&amp;nbsp;There are usually hands on coding sessions to help developers practice and hone their craft. Agile development is strong on continual learning of best development practices. While Agile Open space is not language or API specific, many times the hands-on discussions are very specific to the problems you are having (For example: many times a dev will open up their legacy code challenge to solicit advice.)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Students:&lt;/b&gt;&lt;br /&gt;&amp;nbsp;This is an excellent opportunity for students to find about ‘working in the real world.’ &amp;nbsp;Also they can talk and code side-by-side with both technical managers and developers. &amp;nbsp;OpenAgile is a great place to ‘try out’ ideas students have been learning in their classrooms. &lt;br /&gt;For &lt;b&gt;students&lt;/b&gt; OpenAgile costs just&lt;b&gt; $50&lt;/b&gt; for the entire event.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Details:&lt;/b&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;OpenAgile SoCal is hosted at&lt;/span&gt;&lt;span class="Apple-style-span" style="background-color: white;"&gt; UCI at  Donald Bren Hall (DBH)&lt;span class="Apple-style-span" style="color: #444444; font-family: 'Trebuchet MS', Verdana, Arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 21px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;on&lt;br /&gt;&lt;br /&gt;Thursday, Sept. 15th&lt;br /&gt;Friday, Sept. 16th&lt;br /&gt;&lt;br /&gt;8:30 am to 6 pm.&lt;br /&gt;It costs $250 to attend. &amp;nbsp;We hope to see you there.&lt;br /&gt;&lt;a href="http://www.agileopencalifornia.com/sc_register.html"&gt;Register Here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6889884053798500413-8024811837210597619?l=llewellynfalco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://llewellynfalco.blogspot.com/feeds/8024811837210597619/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6889884053798500413&amp;postID=8024811837210597619' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/8024811837210597619'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/8024811837210597619'/><link rel='alternate' type='text/html' href='http://llewellynfalco.blogspot.com/2011/09/open-agile-socal.html' title='Open Agile SoCal 2011'/><author><name>&lt;a href="http://www.twitter.com/llewellynfalco"&gt;@Llewellyn Falco&lt;/a&gt;</name><uri>http://www.blogger.com/profile/11668997629228826023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_s2oZS5jFv1g/SPTCNxT1pyI/AAAAAAAAABI/bW8VaJ-Hlwk/S220/Llew.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6889884053798500413.post-335482421464673929</id><published>2011-09-07T22:29:00.000-07:00</published><updated>2011-09-11T15:53:50.496-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Unit Testing'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>Test-Driven Cameras</title><content type='html'>I am getting old.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-9lKog6gwAws/TmhSnB4zdhI/AAAAAAAAAg8/XQJwBCcHPRw/s1600/kodak_camera.jpeg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="150" src="http://2.bp.blogspot.com/-9lKog6gwAws/TmhSnB4zdhI/AAAAAAAAAg8/XQJwBCcHPRw/s200/kodak_camera.jpeg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;The other day I was hanging around with my friend, &lt;a href="http://www.ellisteam.net/"&gt;Ike Ellis&lt;/a&gt;. &amp;nbsp;He told me a story about his kids. &amp;nbsp;His 3 young sons had been given disposable cameras as a gift. &amp;nbsp;These kids were actually confused by the idea of a camera that used film. &amp;nbsp;The first question they asked was&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;“Where is the picture?” &lt;/span&gt;&lt;br /&gt;Ike explained that they had to look through the camera lens to see what the picture would look like. &amp;nbsp;They seemed ok with that, but the next question they asked was&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;“How do you know if you have taken a bad picture?” &lt;/span&gt;&lt;br /&gt;Ike said “You won’t be able to know until after we get the film developed.” To which they replied,&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;“When will that be?” &lt;/span&gt;Still confused, they continued asking&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;“How do you delete the bad pictures?”&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;Ike said, “You can’t.” &amp;nbsp;At this point, the kids lost interest in the cameras.&lt;br /&gt;&lt;br /&gt;However, because these cameras were gifts, the oldest decided to actually try out using the camera anyway.&lt;br /&gt;The first thing he did was to take &lt;span class="Apple-style-span" style="color: blue;"&gt;6 pictures&lt;/span&gt; of the same thing. &lt;br /&gt;Ike tried to explain that he shouldn’t do that, because the camera only had the ability to take a total of 32 (film) pictures. &amp;nbsp;After realizing that he could not experiment and would probably end up with a bad picture anyway, he set his camera next too the other two and walked away.&lt;br /&gt;&lt;br /&gt;I wish people had this same reaction to the idea of writing code without first writing tests (TDD).&lt;br /&gt;&lt;br /&gt;Tests give you the chance:&lt;br /&gt;&lt;br /&gt;To see what you are going to write, BEFORE you write it.&lt;br /&gt;To see if what you wrote actually worked. &lt;br /&gt;To immediately get feedback. &lt;br /&gt;To play (or experiment) with possible solutions. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If you haven’t already, here’s a great place to start learning to &lt;a href="http://www.amazon.com/exec/obidos/ISBN=0321146530/portlandpatternrA/"&gt;Test-Driven Development&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;If you are already writing tests, here’s a &lt;a href="http://www.approvaltests.com/"&gt;free library&lt;/a&gt; to make test even easier to write &lt;br /&gt;&lt;br /&gt;Llewellyn Falco &amp;amp; &lt;a href="http://lynnlangit.wordpress.com/"&gt;Lynn Langit&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6889884053798500413-335482421464673929?l=llewellynfalco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://llewellynfalco.blogspot.com/feeds/335482421464673929/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6889884053798500413&amp;postID=335482421464673929' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/335482421464673929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/335482421464673929'/><link rel='alternate' type='text/html' href='http://llewellynfalco.blogspot.com/2011/09/test-driven-cameras.html' title='Test-Driven Cameras'/><author><name>&lt;a href="http://www.twitter.com/llewellynfalco"&gt;@Llewellyn Falco&lt;/a&gt;</name><uri>http://www.blogger.com/profile/11668997629228826023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_s2oZS5jFv1g/SPTCNxT1pyI/AAAAAAAAABI/bW8VaJ-Hlwk/S220/Llew.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-9lKog6gwAws/TmhSnB4zdhI/AAAAAAAAAg8/XQJwBCcHPRw/s72-c/kodak_camera.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6889884053798500413.post-1891503577727204618</id><published>2011-05-07T21:58:00.000-07:00</published><updated>2011-06-11T01:28:43.722-07:00</updated><title type='text'>Fire Programmers not using Source Control</title><content type='html'>&amp;nbsp;In our community development work we come across hundreds of good developers. Those developers rarely agree on anything. They ceaselessly debate the merits of Test Driven Development. They argue about why C# is better than Java, or Ruby, or VB. They relentlessly pontificate about the future of Cloud computing.&lt;br /&gt;&lt;div style="text-align: center;"&gt;They all agree on 1 thing: “&lt;b&gt;Use Source Control&lt;/b&gt;”&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;… Of course which source control is still up for debate.&lt;br /&gt;&lt;br /&gt;What continues to confuse us is the &lt;b&gt;lack of source control&lt;/b&gt; adoption in the wider development community. If everyone at every conference is pro-source control, why are there shops without it? It seems to us the reason these shops exist is because their &lt;b&gt;developers are never interacting&lt;/b&gt; with the greater development community. &amp;nbsp;They are living in a bubble. &amp;nbsp;Does this mean they can’t be good developers? &amp;nbsp;YES!&lt;br /&gt;&lt;br /&gt;Our industry moves incredibly fast. &amp;nbsp;To be a professional, you need to be constantly learning and collaborating with others.&lt;br /&gt;&lt;br /&gt;The reason why source control is a universally accepted best practice is because it enables us to &lt;b&gt;change code&lt;/b&gt; without fear, to &lt;b&gt;experiment&lt;/b&gt;, and allows &lt;b&gt;multiple developers&lt;/b&gt; to work on the same code base.&lt;br /&gt;&lt;br /&gt;I&lt;b&gt;f your developers are not using source control; Fire Them! &lt;/b&gt;&amp;nbsp;If this most basic of practices is not being followed, you have hundreds more problems in your code base that are much harder to detect and fix. You have hired a programmer that is not a professional, and does not intend to become one.&lt;br /&gt;&lt;br /&gt;Llewellyn &amp;amp; &lt;a href="http://www.ellisteam.net/"&gt;Ike Ellis&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6889884053798500413-1891503577727204618?l=llewellynfalco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://llewellynfalco.blogspot.com/feeds/1891503577727204618/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6889884053798500413&amp;postID=1891503577727204618' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/1891503577727204618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/1891503577727204618'/><link rel='alternate' type='text/html' href='http://llewellynfalco.blogspot.com/2011/05/fire-programmers-not-using-source.html' title='Fire Programmers not using Source Control'/><author><name>&lt;a href="http://www.twitter.com/llewellynfalco"&gt;@Llewellyn Falco&lt;/a&gt;</name><uri>http://www.blogger.com/profile/11668997629228826023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_s2oZS5jFv1g/SPTCNxT1pyI/AAAAAAAAABI/bW8VaJ-Hlwk/S220/Llew.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6889884053798500413.post-1859642427308012807</id><published>2011-04-30T07:13:00.000-07:00</published><updated>2011-04-30T07:13:34.876-07:00</updated><title type='text'>The value of Pair Programming</title><content type='html'>Gary Filer made an interesting comment to me the other day;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;“I use to think that the value of pair programming was the shared brain”&lt;/i&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-FnJLf-47JHc/TbwVxIRSw6I/AAAAAAAAAdQ/NI6WWi8GLVg/s1600/Pair-Programming-Value---Misconception.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="207" src="http://1.bp.blogspot.com/-FnJLf-47JHc/TbwVxIRSw6I/AAAAAAAAAdQ/NI6WWi8GLVg/s320/Pair-Programming-Value---Misconception.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;“But after seeing you pair for the last week, I realized that the shared part is actually the waste. The value is in the differences”&lt;/i&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-ptBlo_RzNTY/TbwV7f1AfEI/AAAAAAAAAdU/kjBq_K4oJxo/s1600/Pair-Programming-Value.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="191" src="http://3.bp.blogspot.com/-ptBlo_RzNTY/TbwV7f1AfEI/AAAAAAAAAdU/kjBq_K4oJxo/s320/Pair-Programming-Value.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;The Cost of Mistakes&lt;/span&gt;&lt;br /&gt;In my talk &lt;i&gt;&lt;a href="http://slidesha.re/hvfa2J"&gt;‘Introduction to Agile’&lt;/a&gt;&lt;/i&gt; I assert that the core principle of agile development is accepting that we will make mistakes, and doing things to&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;core agile value:&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;b&gt;Reduce the cost of mistakes&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Being an introduction talk, I only talk about pair programming from a “Knowledge Backup” point of view:&lt;br /&gt;&lt;div style="text-align: center;"&gt;“If one of your employee’s leaves, what happens to your project?”&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;But pairing reduces the cost of mistakes &lt;b&gt;constantly&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;What Gary was seeing was the countless times Jason or I would say “Let’s do ...” only to have the other one say, “No, your forgetting about...” or “No, there's a better way...”. Each of those times would have resulted in a much more costly mistake that was headed off at the pass.&lt;br /&gt;&lt;br /&gt;Of course, another value of the pairing overlap comes from just looking at the mistakes.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-UIKmI_axscQ/TbwXqSuXQaI/AAAAAAAAAdY/iEkxKmnhRE0/s1600/Pair-Programming-Mistakes.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="189" src="http://4.bp.blogspot.com/-UIKmI_axscQ/TbwXqSuXQaI/AAAAAAAAAdY/iEkxKmnhRE0/s320/Pair-Programming-Mistakes.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;For Example: We were doing some cleanup just the other day. Finding dead code and deleting it. Removed about 10,000 lines of useless clutter from the project, which is good. However, I probably had 5-6 times where I went to delete something that was NOT clutter, and Jason stopped me. Likewise Jason had 4-5 times where he went to delete the wrong thing and I stopped him. &lt;b&gt;Together&lt;/b&gt;, we didn’t push any of those mistakes back to the main branch when we checked in. This is like a raided disk drive. You don’t double, you square. If I’m right &lt;span class="Apple-style-span" style="color: blue;"&gt;&lt;b&gt;95%&lt;/b&gt;&lt;/span&gt; of the time, and Jason is right &lt;span class="Apple-style-span" style="color: blue;"&gt;&lt;b&gt;95%&lt;/b&gt;&lt;/span&gt; of the time. Then individually we are wrong &lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;5%&lt;/b&gt;&lt;/span&gt; of the time. But paired, we are only wrong &lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;0.25%&lt;/b&gt;&lt;/span&gt; of the Time (5% of 5%)&lt;br /&gt;&lt;br /&gt;In today’s world of Ctrl+Z it is sometimes easy to forget that an undo even qualifies as a mistake, the cost is so low. Agile methods endeavor to make all mistakes that cheap.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6889884053798500413-1859642427308012807?l=llewellynfalco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://llewellynfalco.blogspot.com/feeds/1859642427308012807/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6889884053798500413&amp;postID=1859642427308012807' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/1859642427308012807'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/1859642427308012807'/><link rel='alternate' type='text/html' href='http://llewellynfalco.blogspot.com/2011/04/value-of-pair-programming.html' title='The value of Pair Programming'/><author><name>&lt;a href="http://www.twitter.com/llewellynfalco"&gt;@Llewellyn Falco&lt;/a&gt;</name><uri>http://www.blogger.com/profile/11668997629228826023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_s2oZS5jFv1g/SPTCNxT1pyI/AAAAAAAAABI/bW8VaJ-Hlwk/S220/Llew.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-FnJLf-47JHc/TbwVxIRSw6I/AAAAAAAAAdQ/NI6WWi8GLVg/s72-c/Pair-Programming-Value---Misconception.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6889884053798500413.post-750412274902953090</id><published>2011-04-22T11:54:00.000-07:00</published><updated>2011-04-22T11:54:31.554-07:00</updated><title type='text'>Illusions of Grandeur and Agreement</title><content type='html'>&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;I just finished watching&amp;nbsp;&lt;a href="http://fora.tv/2010/05/22/Adam_Savage_Presents_Problem_Solving_How_I_Do_It"&gt;Adam Savage presenting at maker faire&lt;/a&gt;. &amp;nbsp;It’s a pretty great talk. Kinda.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="s1" style="font-family: inherit;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="s1" style="font-family: inherit;"&gt;Here’s what I’m taking away:&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="s1" style="font-family: inherit;"&gt;&lt;b&gt;&lt;i&gt;“Set deadlines for personal projects”&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="s1" style="font-family: inherit;"&gt;&lt;b&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="s1" style="font-family: inherit;"&gt;&lt;b&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="s1" style="font-family: inherit;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="s1" style="font-family: inherit;"&gt;But about 22 minutes in I become pretty dissatisfied, and I want to talk about why:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="p1" style="text-align: center;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="s1" style="font-family: inherit;"&gt;&amp;nbsp;&lt;b&gt;I am agreeing with Adam about everything.&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="s1" style="font-family: inherit;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="s1" style="font-family: inherit;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="s1" style="font-family: inherit;"&gt;Everything? Yep, It&amp;nbsp;&lt;b&gt;ALL&lt;/b&gt;&amp;nbsp;makes sense. I know it&amp;nbsp;&lt;b&gt;ALL&lt;/b&gt;&amp;nbsp;already... Now do I believe that if I was to sit down and actually&amp;nbsp;&lt;b&gt;do&lt;/b&gt;&amp;nbsp;something with Adam that everything would be great? No disagreement? Nothing to learn?&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="s1" style="font-family: inherit;"&gt;Of course not. That’s a stupid idea. There would be tons to learn probably in the first 22 minutes. So why am I “sitting down with him now” and not disagreeing? I think my girlfriend,&amp;nbsp;&lt;a href="http://blogs.msdn.com/b/socaldevgal/"&gt;Lynn Langit&lt;/a&gt;&amp;nbsp;&amp;nbsp;who happens to be a&amp;nbsp;Microsoft Evanglist, said it best today:&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="s1" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="s1" style="font-family: inherit;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="p1" style="text-align: center;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="s1" style="font-family: inherit;"&gt;“&lt;b&gt;&lt;i&gt;Evangelist&lt;/i&gt;&lt;/b&gt;&amp;nbsp;seek to make everyone in the room&lt;b&gt;&lt;i&gt;&amp;nbsp;feel smart&lt;/i&gt;&lt;/b&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="p1" style="text-align: center;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="s1" style="font-family: inherit;"&gt;&amp;nbsp;&lt;b&gt;&lt;i&gt;Trainers&lt;/i&gt;&lt;/b&gt;&amp;nbsp;try to make everyone in the room&amp;nbsp;&lt;b&gt;&lt;i&gt;be smarter”&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="s1" style="font-family: inherit;"&gt;&lt;b&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="s1" style="font-family: inherit;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="s1" style="font-family: inherit;"&gt;This illusion of agreement is starting to bug me more and more. I don’t want to spend and hour feeling smart. I want to be smarter, but I think I’m a bit odd in this. Odd not just in the desire to learn, but in my reaction when I am, or am not, learning.&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="s1" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="s1" style="font-family: inherit;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="s1" style="font-family: inherit;"&gt;There is an interesting video from Veritasium about this.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="s1" style="font-family: inherit;"&gt;&amp;nbsp;&lt;a href="http://www.veritasium.com/2011/03/khan-academy-and-effectiveness-of.html"&gt;http://www.veritasium.com/2011/03/khan-academy-and-effectiveness-of.html&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="s1" style="font-family: inherit;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="s1" style="font-family: inherit;"&gt;Learning involves some disagreement. So next time you are watching someone talk, ask yourself&lt;i&gt;&lt;b&gt;&amp;nbsp;“Am I agreeing with everything?”&lt;/b&gt;&lt;/i&gt;&amp;nbsp; If you are there is probably a miscommunication going on.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="s1" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="s1" style="font-family: inherit;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="s1" style="font-family: inherit;"&gt;I am constantly reminded of the training scene from ‘&lt;a href="http://www.imdb.com/title/tt0133093/"&gt;The Matrix&lt;/a&gt;’:&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="s1" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="s1" style="font-family: inherit;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="s1" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;Morpheus&lt;/span&gt;: How did I beat you?&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="s1" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;Neo&lt;/span&gt;: (breathing hard) You... you're too fast.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="s1" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;Morpheus&lt;/span&gt;: Do you believe that my being stronger or faster has anything to do with my muscles in this place?&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="s1" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;Neo&lt;/span&gt;: (Shakes Head No)&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="s1" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;Morpheus&lt;/span&gt;: Do you think that's air you're breathing now?&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="s1" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;Neo&lt;/span&gt;: (Stops breathing hard)&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6889884053798500413-750412274902953090?l=llewellynfalco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://llewellynfalco.blogspot.com/feeds/750412274902953090/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6889884053798500413&amp;postID=750412274902953090' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/750412274902953090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/750412274902953090'/><link rel='alternate' type='text/html' href='http://llewellynfalco.blogspot.com/2011/04/illusions-of-grandeur-and-agreement.html' title='Illusions of Grandeur and Agreement'/><author><name>&lt;a href="http://www.twitter.com/llewellynfalco"&gt;@Llewellyn Falco&lt;/a&gt;</name><uri>http://www.blogger.com/profile/11668997629228826023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_s2oZS5jFv1g/SPTCNxT1pyI/AAAAAAAAABI/bW8VaJ-Hlwk/S220/Llew.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6889884053798500413.post-6201252415439646060</id><published>2011-01-03T11:14:00.000-08:00</published><updated>2011-01-03T11:14:03.152-08:00</updated><title type='text'>Guide to opening Christmas presents with 10+ people</title><content type='html'>&lt;style type="text/css"&gt;p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica}p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px}span.s1 {letter-spacing: 0.0px}table.t1 {background-color: #ffffff; border-collapse: collapse}td.td1 {width: 40.8px; height: 14.0px; border-style: solid; border-width: 1.0px 1.0px 1.0px 1.0px; border-color: #000000 #000000 #000000 #000000; padding: 5.0px 5.0px 5.0px 5.0px}td.td2 {width: 45.2px; height: 14.0px; border-style: solid; border-width: 1.0px 1.0px 1.0px 1.0px; border-color: #000000 #000000 #000000 #000000; padding: 5.0px 5.0px 5.0px 5.0px}&lt;/style&gt;   &lt;br /&gt;&lt;div class="p1"&gt;&lt;a href="http://3.bp.blogspot.com/_s2oZS5jFv1g/TRqFdz-MuQI/AAAAAAAAAa4/AqAOzeepJDc/s1600/DSCN5829.JPG" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="150" src="http://3.bp.blogspot.com/_s2oZS5jFv1g/TRqFdz-MuQI/AAAAAAAAAa4/AqAOzeepJDc/s200/DSCN5829.JPG" width="200" /&gt;&lt;/a&gt;Christmas is a big and wonderful event at my family. This year we had 10 people joining us for Christmas morning. This means a bunch of presents. If you try to just hand them out without a system you will end up with people feeling left out.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;If nothing else, &lt;b&gt;you need to sort&lt;/b&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="s1"&gt;But that’s getting ahead of ourselves. First, Let’s do some math:&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="s1"&gt;If 10 people buy 1 present for each of the other 9 people&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Then&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;10 * 1* 9 = 90 presents&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="s1"&gt;Which means, that you will have a minimum of 90 presents for a 10 person group.&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;For us, a big part of Christmas is enjoying seeing each other’s faces as they open their present. Which means that opening a present might take 3-4 minutes. So&lt;/span&gt;&lt;br /&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;90 presents *&amp;nbsp; 4 minutes / present&amp;nbsp; = 360 minutes = 6 hours... minimum.&lt;/span&gt;&lt;br /&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;a href="http://3.bp.blogspot.com/_s2oZS5jFv1g/TRqGJPBF0ZI/AAAAAAAAAbA/pF1Kj9JKcuA/s1600/photo.jpeg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/_s2oZS5jFv1g/TRqGJPBF0ZI/AAAAAAAAAbA/pF1Kj9JKcuA/s320/photo.jpeg" width="320" /&gt;&lt;/a&gt;&lt;span class="s1"&gt;Which is a fair bit of time. However, just to complicate things not everyone is “equal” in the present receiving world. Some people might get 4-5 gifts from a loved one, which means you might have a few people with 30 presents instead of 9. This isn’t even a simple matter of “popularity”. You might get your father in law 4 small presents, while getting your sweetie only 1 Diamond bracelet. &amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;If you don’t time things right, you can have people sitting around for 4-5 hours without receiving a single gift.&lt;/span&gt;&lt;br /&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;So the question falls to how do you manage opening the gifts. I have been in the “Santa” position quite a few times, and finally feel happy enough with my methodology to share it with you.&lt;/span&gt;&lt;br /&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;But first,&lt;/span&gt;&lt;br /&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;The Axioms:&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="s1"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;b&gt;Include everybody&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;The goal here is to distribute gifts so that everyone feels included, and no one feels left-out or feeling like “why am I still here”.&lt;/span&gt;&lt;br /&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;b&gt;Memory is not accounting&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;How people remember the gift giving is not simple numbers. If it was, it wouldn’t matter in which order you handed out the gifts.&lt;/span&gt;&lt;br /&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;b&gt;Equal Distribution&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Ideally, if you had 4 people you would distribute to person 1, person 2, person 3, person 4. You can’t do that of course, because not everyone has the same number of presents. But this is the idea.&lt;/span&gt;&lt;br /&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;b&gt;Not all boxes are equal&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;While the size of the box does not correlate to the goodness of the gift. It is generally assumed that bigger presents are more exciting. These should also be distributed to avoid clustering. For example if you 4 small presents &amp;amp; 3 large presents, you wouldn’t want to open 3 large presents followed by 4 small ones.&lt;/span&gt;&lt;br /&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;a href="http://2.bp.blogspot.com/_s2oZS5jFv1g/TRqGgsIJEjI/AAAAAAAAAbE/Q0GLXhM_Ff0/s1600/grouptherapy.jpeg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_s2oZS5jFv1g/TRqGgsIJEjI/AAAAAAAAAbE/Q0GLXhM_Ff0/s1600/grouptherapy.jpeg" /&gt;&lt;/a&gt;&lt;span class="s1"&gt;&lt;b&gt;Related Presents&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Presents can group both by a single person, or by multiple people. You might have given someone a Wii &amp;amp; Wii Fit. The Wii Fit should not be opened 1st, as it would give away the Wii.&amp;nbsp; Likewise, you might have gotten the same “group therapy”&amp;nbsp; T-Shirts for 3 different people, they should be opened together.&lt;/span&gt;&lt;br /&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;b&gt;Continual Opening&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;No one wants to wait around for santa to figure out what gift should be opened next.&lt;/span&gt;&lt;br /&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Now lets look at&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;The Methodology&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="s1"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;b&gt;Start Strong &amp;amp; End Strong&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;The most import parts are the start and the finish. You should try to give 1 present to everyone there both at the beginning and at the end of the gift giving. This should be done in a circular order so that it is a easy pattern that will stick in the memories everyone there and make them feel like everyone is included. Keep in mind that some people (last minute guests) might only have 2-3 presents. So be careful not to use up all of their presents in the first few rounds.&lt;/span&gt;&lt;br /&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;b&gt;Sort into Piles&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;You need to have some idea of how many presents per person you are dealing with, otherwise all hope is lost. Also you need to be able to easily answer the question “Where is a gift for Mary?”.&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;To do this, start to create piles of gifts for each person there. Creating these will take some time (90 * 30 seconds = 45 minutes of sorting), so you’ll need to do it as you go. Create the piles of presents while people are open the gifts. I usually start by giving 1 gift to every person (only acceptable at the 1st and last round), and having them go 1 at a time after each other. Make sure to put some space between the piles, or they will quickly get confused.&lt;/span&gt;&lt;br /&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;b&gt;Prepare Next Gift&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;If you give out 4 present at then you will end up with 2 being opened at the same time, or one being set down and forgotten. If you don’t hand out 1 while one is being opened, you’ll have a 1/2 minute pause in between. It doesn’t seem like much, but it will add an extra hour to the gift opening process.&lt;/span&gt;&lt;br /&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;b&gt;Ask for Help&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;You will not be able to know which presents are related. Sometimes you can guess “group” presents by package shape. But simply asking if “these should be opened together”, or “is this a good one to open now?” is useful. Having sorted piles will make it easy to swap out the present if you need to.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;b&gt;Sub Group&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Once you’ve finally gotten the presents into piles, start making&amp;nbsp; “finishing” piles. The Idea here is to make it easy to finish strong. Take this scenario:&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;br /&gt;&lt;/div&gt;&lt;table cellpadding="0" cellspacing="0" class="t1"&gt;&lt;tbody&gt;&lt;tr&gt; &lt;td class="td1" valign="top"&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Bob&lt;/span&gt;&lt;/div&gt;&lt;/td&gt; &lt;td class="td1" valign="top"&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;8 gifts&lt;/span&gt;&lt;/div&gt;&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td class="td1" valign="top"&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Colette&lt;/span&gt;&lt;/div&gt;&lt;/td&gt; &lt;td class="td1" valign="top"&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;14 gifts&lt;/span&gt;&lt;/div&gt;&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td class="td1" valign="top"&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Marsha&lt;/span&gt;&lt;/div&gt;&lt;/td&gt; &lt;td class="td1" valign="top"&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;10 gifts&lt;/span&gt;&lt;/div&gt;&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td class="td1" valign="top"&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Jan&lt;/span&gt;&lt;/div&gt;&lt;/td&gt; &lt;td class="td1" valign="top"&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;5 gifts&lt;/span&gt;&lt;/div&gt;&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td class="td1" valign="top"&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Brie&lt;/span&gt;&lt;/div&gt;&lt;/td&gt; &lt;td class="td1" valign="top"&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;6 gifts&lt;/span&gt;&lt;/div&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt; &lt;/table&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;How do you distribute? Hard to do right?&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Now, look at the same scenario, with a 4 present sub-pile finish. This allows for the differences in gifts to be easier to see. You want the finishing pile to be as big of a number as possible.&amp;nbsp; Now you have&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;br /&gt;&lt;/div&gt;&lt;table cellpadding="0" cellspacing="0" class="t1"&gt;&lt;tbody&gt;&lt;tr&gt; &lt;td class="td2" valign="top"&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Bob&lt;/span&gt;&lt;/div&gt;&lt;/td&gt; &lt;td class="td2" valign="top"&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;4 gifts +&lt;/span&gt;&lt;/div&gt;&lt;/td&gt; &lt;td class="td2" valign="top"&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;4&lt;/span&gt;&lt;/div&gt;&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td class="td2" valign="top"&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Colette&lt;/span&gt;&lt;/div&gt;&lt;/td&gt; &lt;td class="td2" valign="top"&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;4 gifts +&lt;/span&gt;&lt;/div&gt;&lt;/td&gt; &lt;td class="td2" valign="top"&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;10&lt;/span&gt;&lt;/div&gt;&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td class="td2" valign="top"&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Marsha&lt;/span&gt;&lt;/div&gt;&lt;/td&gt; &lt;td class="td2" valign="top"&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;4 gifts +&lt;/span&gt;&lt;/div&gt;&lt;/td&gt; &lt;td class="td2" valign="top"&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;6&lt;/span&gt;&lt;/div&gt;&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td class="td2" valign="top"&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Jan&lt;/span&gt;&lt;/div&gt;&lt;/td&gt; &lt;td class="td2" valign="top"&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;4 gifts +&lt;/span&gt;&lt;/div&gt;&lt;/td&gt; &lt;td class="td2" valign="top"&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td class="td2" valign="top"&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Brie&lt;/span&gt;&lt;/div&gt;&lt;/td&gt; &lt;td class="td2" valign="top"&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;4 gifts +&lt;/span&gt;&lt;/div&gt;&lt;/td&gt; &lt;td class="td2" valign="top"&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;2&lt;/span&gt;&lt;/div&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt; &lt;/table&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Better start increasing the gifts to Colette &amp;amp; Marsha!&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;To make thing worse, you aren’t going to be able to easily get a “count” it’s just a pile of presents. The finishing pile helps you to not have to constantly re-count.&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_s2oZS5jFv1g/TRqGERU_k1I/AAAAAAAAAa8/XHnxvpZ23sI/s1600/DSCN5851.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="http://1.bp.blogspot.com/_s2oZS5jFv1g/TRqGERU_k1I/AAAAAAAAAa8/XHnxvpZ23sI/s320/DSCN5851.JPG" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Piles of presents (notice it's still hard to count)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="p2"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;b&gt;Confuse the middle&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;While you want the start and end to be nice and ordered a bit of confusion will go a long way in the middle. Try to give presents so it doesn’t just go around in a circle. Lot’s of back and forth. Give presents to people sitting far away. The less of a “pattern” the harder it will be to realize that someone is opening more presents than someone else.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;But be careful to not forget people. In the above scenario, it’s important to make sure Jan gets a present now and then, even if means adjusting your “finishing pile” to 3 or 2 presents.&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Hopefully this will help you to have a even merrier Christmas!&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6889884053798500413-6201252415439646060?l=llewellynfalco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://llewellynfalco.blogspot.com/feeds/6201252415439646060/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6889884053798500413&amp;postID=6201252415439646060' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/6201252415439646060'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/6201252415439646060'/><link rel='alternate' type='text/html' href='http://llewellynfalco.blogspot.com/2011/01/guide-to-opening-christmas-presents.html' title='Guide to opening Christmas presents with 10+ people'/><author><name>&lt;a href="http://www.twitter.com/llewellynfalco"&gt;@Llewellyn Falco&lt;/a&gt;</name><uri>http://www.blogger.com/profile/11668997629228826023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_s2oZS5jFv1g/SPTCNxT1pyI/AAAAAAAAABI/bW8VaJ-Hlwk/S220/Llew.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_s2oZS5jFv1g/TRqFdz-MuQI/AAAAAAAAAa4/AqAOzeepJDc/s72-c/DSCN5829.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6889884053798500413.post-2671716893749485101</id><published>2010-11-16T11:23:00.000-08:00</published><updated>2010-11-16T11:24:43.910-08:00</updated><title type='text'>My Treadmill Desk</title><content type='html'>&lt;style type="text/css"&gt;p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica}p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px}p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; color: #000099}span.s1 {letter-spacing: 0.0px}span.s2 {letter-spacing: 0.0px color: #000000}span.s3 {text-decoration: underline ; letter-spacing: 0.0px}&lt;/style&gt;   &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://desmond.yfrog.com/Himg143/scaled.php?tn=0&amp;amp;server=143&amp;amp;filename=knin.jpg&amp;amp;xsize=640&amp;amp;ysize=640" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://desmond.yfrog.com/Himg143/scaled.php?tn=0&amp;amp;server=143&amp;amp;filename=knin.jpg&amp;amp;xsize=640&amp;amp;ysize=640" width="240" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;Overview&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;At July’s Ignite San Diego, I saw &lt;a href="http://twitter.com/e_ramirez"&gt;Ernesto&lt;/a&gt; give a talk where he showed his treadmill desk. Yesterday, I made one for myself.&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Am I able to work while using it? I’m writing this blog right now while walking at 1.5 mph.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;Verdict&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;I’m happy with the desk. I’m walking at 1.5 mph which is about right for me, sometimes I need to slow it down to 1 mph depending on the detail of work I am doing or if I am worried about sweating. You don’t sweat a lot but even so 2 hours of small sweat isn’t great if you are going to a meeting. I have not yet gotten to try it out pair programming (except remotely, which doesn’t count). I’m not sure whether or not you need 2 treadmills for that.&lt;/span&gt;&lt;br /&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;Cost&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;$1250 total. &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Let’s break that down.&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Treadmill - $1,000&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Desk - $250&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;I’m happy with my choices, but I believe a treadmill bought off of &lt;a href="http://www.craigslist.org/"&gt;craigslist&lt;/a&gt; can dramatically improve the bottom line here.&lt;/span&gt;&lt;br /&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;F.A.Q&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;Q. Do the controls on the floor matter?&lt;/div&gt;&lt;div class="p2"&gt;A. No, you aren't changing the speed often or at all, and it's moving slow.&lt;/div&gt;&lt;div class="p2"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p2"&gt;Q. Do you like it?&lt;/div&gt;&lt;div class="p2"&gt;A. Yes&lt;/div&gt;&lt;div class="p2"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p2"&gt;Q. Do you sweat?&lt;/div&gt;&lt;div class="p2"&gt;A. Not at 1 mph, a little at 1.5 mph&lt;/div&gt;&lt;div class="p2"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;The Parts&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;The Tread Mill&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_s2oZS5jFv1g/TOLIxsm2GGI/AAAAAAAAAZk/oaj65wRkUIg/s1600/AFG+3.0+AT+Treadmill.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_s2oZS5jFv1g/TOLIxsm2GGI/AAAAAAAAAZk/oaj65wRkUIg/s1600/AFG+3.0+AT+Treadmill.jpeg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;I got a AFG 3.0 AT treadmill. It cost $800 on sale at sports chalet. I also got the extended 5 year warranty which was an additional $200. I don’t usually get the warranty, but thought I might be using this a bit more than the average person.&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;It’s worth noting this thing is HEAVY (350 lbs) so get some help moving it.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;The Desk&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://t2.gstatic.com/images?q=tbn:ANd9GcTkWmXm0we6igjqwNjwuLFYf7F6MWFL4l7CFV3281BTkTbvEfw7" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://t2.gstatic.com/images?q=tbn:ANd9GcTkWmXm0we6igjqwNjwuLFYf7F6MWFL4l7CFV3281BTkTbvEfw7" width="146" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Ikea came thru nicely with the Fredrik 50 inch long desk($200). I modified the setup to put the top self at the bottom (which you need to do 1st) but otherwise it works perfectly.&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Extras. I also got a 48 inch power strip ($25 at Fry’s) which I love and would recommend for any desk. A Belkin usb hub ($25), which makes it easier to hook up the laptop to the keyboard and mouse.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;The Build&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;The assembly of the treadmill looks quite complicated, but I wouldn’t know because it turns out you don’t have to do it. You don’t want the hand rails anyways. and the console is just sitting at the side of the base.&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;The desk is likewise easy to assemble. I placed the main desk layer so that when walking on the treadmill my arms naturally bent to that height. I am also liking having the&amp;nbsp; screen at the higher height, so i don’t have to bend over, which is a bit hard while walking.&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="s1"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;Links&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p3"&gt;&lt;span class="s2"&gt;AFG 3.0 AT treadmill &lt;a href="http://www.advancedfitnessgroup.com/products/treadmills/30AT.aspx"&gt;&lt;span class="s3"&gt;http://www.advancedfitnessgroup.com/products/treadmills/30AT.aspx&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p3"&gt;&lt;span class="s2"&gt;Ikea Fredrik Desk &lt;a href="http://www.ikea.com/us/en/catalog/products/60111123"&gt;&lt;span class="s3"&gt;http://www.ikea.com/us/en/catalog/products/60111123&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p3"&gt;&lt;span class="s2"&gt;Ernesto Ramiez &lt;a href="http://www.ernestoramirez.org/home/projects-2/#Other"&gt;&lt;span class="s3"&gt;http://www.ernestoramirez.org/home/projects-2/#Other&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p3"&gt;&lt;span class="s2"&gt;Active WorkOffice &lt;a href="http://www.theactiveoffice.org/"&gt;&lt;span class="s3"&gt;http://www.theactiveoffice.org/&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6889884053798500413-2671716893749485101?l=llewellynfalco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://llewellynfalco.blogspot.com/feeds/2671716893749485101/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6889884053798500413&amp;postID=2671716893749485101' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/2671716893749485101'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/2671716893749485101'/><link rel='alternate' type='text/html' href='http://llewellynfalco.blogspot.com/2010/11/my-treadmill-desk.html' title='My Treadmill Desk'/><author><name>&lt;a href="http://www.twitter.com/llewellynfalco"&gt;@Llewellyn Falco&lt;/a&gt;</name><uri>http://www.blogger.com/profile/11668997629228826023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_s2oZS5jFv1g/SPTCNxT1pyI/AAAAAAAAABI/bW8VaJ-Hlwk/S220/Llew.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_s2oZS5jFv1g/TOLIxsm2GGI/AAAAAAAAAZk/oaj65wRkUIg/s72-c/AFG+3.0+AT+Treadmill.jpeg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6889884053798500413.post-5295073563307146334</id><published>2010-09-25T20:39:00.000-07:00</published><updated>2010-09-25T22:29:22.297-07:00</updated><title type='text'>Extension Methods</title><content type='html'>Extension Methods allow for the&amp;nbsp;readability&amp;nbsp;you expect in code you don't own. C# and Ruby have had them for a while, and I created a jar to so you can use them in java as well. (&lt;a href="http://llewellynfalco.blogspot.com/2009/03/extensions-methods-in-java.html"&gt;you can read the original post here&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;I vBlogged my thoughts here:&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/2BDtaFpOEig&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/2BDtaFpOEig&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Here's the simple reason you want a fluent interface for your code.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_s2oZS5jFv1g/TJ6_XCPg9EI/AAAAAAAAAYw/Yg1dvxO3V4w/s1600/Reverse+Polish+Notation.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="151" src="http://3.bp.blogspot.com/_s2oZS5jFv1g/TJ6_XCPg9EI/AAAAAAAAAYw/Yg1dvxO3V4w/s320/Reverse+Polish+Notation.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Download &lt;a href="http://sourceforge.net/projects/approvaltests/files/"&gt;Extension Methods for Java&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6889884053798500413-5295073563307146334?l=llewellynfalco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://llewellynfalco.blogspot.com/feeds/5295073563307146334/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6889884053798500413&amp;postID=5295073563307146334' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/5295073563307146334'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/5295073563307146334'/><link rel='alternate' type='text/html' href='http://llewellynfalco.blogspot.com/2010/09/extension-methods.html' title='Extension Methods'/><author><name>&lt;a href="http://www.twitter.com/llewellynfalco"&gt;@Llewellyn Falco&lt;/a&gt;</name><uri>http://www.blogger.com/profile/11668997629228826023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_s2oZS5jFv1g/SPTCNxT1pyI/AAAAAAAAABI/bW8VaJ-Hlwk/S220/Llew.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_s2oZS5jFv1g/TJ6_XCPg9EI/AAAAAAAAAYw/Yg1dvxO3V4w/s72-c/Reverse+Polish+Notation.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6889884053798500413.post-2636903737922925874</id><published>2010-09-23T02:02:00.000-07:00</published><updated>2010-10-12T09:33:18.339-07:00</updated><title type='text'>Lamdbas in Java 1.6</title><content type='html'>If you've ever heard that java is a poor language because it doesn't have lambdas, that ends today!&lt;br /&gt;&lt;br /&gt;I created a way to do lambda's in java 1.6 without changing: the JDK, the compiler, the ByteCode or the Syntax.&lt;br /&gt;&lt;br /&gt;I vBlogged my thoughts here:&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/3OZxhhBiHzE?hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/3OZxhhBiHzE?hl=en&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;It's only a jar file, no special requirements or changes.&lt;br /&gt;&lt;br /&gt;You can down load it here at &lt;a href="http://sourceforge.net/projects/approvaltests/files/"&gt;www.approvaltests.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You might also be interested in my&amp;nbsp;similar&amp;nbsp;addition of &lt;a href="http://llewellynfalco.blogspot.com/2009/03/extensions-methods-in-java.html"&gt;extension method in java&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here's the diagram of the syntax :&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_s2oZS5jFv1g/TKr8S7Bs4eI/AAAAAAAAAZQ/QArjjPJnO7g/s1600/Java+Lambda+Syntax.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="166" src="http://3.bp.blogspot.com/_s2oZS5jFv1g/TKr8S7Bs4eI/AAAAAAAAAZQ/QArjjPJnO7g/s320/Java+Lambda+Syntax.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;I also made a small tutorial here :&amp;nbsp;&lt;a href="http://blog.approvaltests.com/2010/10/java-lambdas.html"&gt;http://blog.approvaltests.com/2010/10/java-lambdas.html&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6889884053798500413-2636903737922925874?l=llewellynfalco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://llewellynfalco.blogspot.com/feeds/2636903737922925874/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6889884053798500413&amp;postID=2636903737922925874' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/2636903737922925874'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/2636903737922925874'/><link rel='alternate' type='text/html' href='http://llewellynfalco.blogspot.com/2010/09/lamdbas-in-java-16.html' title='Lamdbas in Java 1.6'/><author><name>&lt;a href="http://www.twitter.com/llewellynfalco"&gt;@Llewellyn Falco&lt;/a&gt;</name><uri>http://www.blogger.com/profile/11668997629228826023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_s2oZS5jFv1g/SPTCNxT1pyI/AAAAAAAAABI/bW8VaJ-Hlwk/S220/Llew.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_s2oZS5jFv1g/TKr8S7Bs4eI/AAAAAAAAAZQ/QArjjPJnO7g/s72-c/Java+Lambda+Syntax.png' height='72' width='72'/><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6889884053798500413.post-8775432811176974533</id><published>2010-09-14T22:12:00.000-07:00</published><updated>2010-09-14T22:12:55.010-07:00</updated><title type='text'>Theory Based Testing</title><content type='html'>Most of us are&amp;nbsp;familiar&amp;nbsp;with classic unit testing. Today, I wanted to talk a about a different form of unit testing, that is much more powerful when it is possible.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Theory based test&lt;/b&gt; take the normal form of&lt;br /&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;Given A &amp;amp; B expect C&lt;/span&gt;&lt;br /&gt;and change it to&lt;br /&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;Given A &amp;amp; B expect &lt;/span&gt;&lt;s&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;C &lt;/span&gt;&lt;/s&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;theory&lt;/span&gt;&lt;br /&gt;This removal of the expected C, allows you to test MANY more cases, because you don't need to pre-plan the results for a given A &amp;amp; B&lt;br /&gt;&lt;br /&gt;I vBlogged my thoughts here:&lt;br /&gt;&lt;object height="385" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/-ZGv8X7NxNY?fs=1&amp;amp;hl=en_US"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/-ZGv8X7NxNY?fs=1&amp;amp;hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;btw: if you are interested in attending an open spaces, check out&amp;nbsp;&lt;a href="http://agileopencalifornia.com/index.php"&gt;Open Agile So Cal&lt;/a&gt;. There's one coming up in San Francisco Oct. 11, 2010&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6889884053798500413-8775432811176974533?l=llewellynfalco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://llewellynfalco.blogspot.com/feeds/8775432811176974533/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6889884053798500413&amp;postID=8775432811176974533' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/8775432811176974533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/8775432811176974533'/><link rel='alternate' type='text/html' href='http://llewellynfalco.blogspot.com/2010/09/theory-based-testing.html' title='Theory Based Testing'/><author><name>&lt;a href="http://www.twitter.com/llewellynfalco"&gt;@Llewellyn Falco&lt;/a&gt;</name><uri>http://www.blogger.com/profile/11668997629228826023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_s2oZS5jFv1g/SPTCNxT1pyI/AAAAAAAAABI/bW8VaJ-Hlwk/S220/Llew.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6889884053798500413.post-6758753463506402942</id><published>2010-09-04T23:34:00.000-07:00</published><updated>2010-09-04T23:34:00.805-07:00</updated><title type='text'>Rewriting Vs Refactoring</title><content type='html'>Once again, I found myself having a discussion about the dangers of doing a legacy code rewrite. Durning this client meeting, I came up with an illustration I wanted to share.&lt;br /&gt;&lt;br /&gt;I vBlogged my thoughts here:&lt;br /&gt;&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/-O7NCmixC5E&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/-O7NCmixC5E&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;These 3 graphs sum up the Massive Risk at the end.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The Rewrite Scenario&lt;/b&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_s2oZS5jFv1g/TIM4fjQfdVI/AAAAAAAAAX8/4lxZIGrBnhU/s1600/Rewrites+1.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_s2oZS5jFv1g/TIM4fjQfdVI/AAAAAAAAAX8/4lxZIGrBnhU/s320/Rewrites+1.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br clear="all"&gt;&lt;br /&gt;&lt;b&gt;The Hidden Question at the End&lt;/b&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_s2oZS5jFv1g/TIM4wrnk5uI/AAAAAAAAAYE/4WjCMU62ZSI/s1600/Rewrites+2.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_s2oZS5jFv1g/TIM4wrnk5uI/AAAAAAAAAYE/4WjCMU62ZSI/s320/Rewrites+2.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br clear="all" /&gt;&lt;br /&gt;&lt;b&gt;The Refactor Scenario&lt;/b&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_s2oZS5jFv1g/TIM45EiW6xI/AAAAAAAAAYM/mw91Ke_8e80/s1600/Rewrites+3.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_s2oZS5jFv1g/TIM45EiW6xI/AAAAAAAAAYM/mw91Ke_8e80/s320/Rewrites+3.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6889884053798500413-6758753463506402942?l=llewellynfalco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://llewellynfalco.blogspot.com/feeds/6758753463506402942/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6889884053798500413&amp;postID=6758753463506402942' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/6758753463506402942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/6758753463506402942'/><link rel='alternate' type='text/html' href='http://llewellynfalco.blogspot.com/2010/09/rewriting-vs-refactoring.html' title='Rewriting Vs Refactoring'/><author><name>&lt;a href="http://www.twitter.com/llewellynfalco"&gt;@Llewellyn Falco&lt;/a&gt;</name><uri>http://www.blogger.com/profile/11668997629228826023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_s2oZS5jFv1g/SPTCNxT1pyI/AAAAAAAAABI/bW8VaJ-Hlwk/S220/Llew.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_s2oZS5jFv1g/TIM4fjQfdVI/AAAAAAAAAX8/4lxZIGrBnhU/s72-c/Rewrites+1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6889884053798500413.post-951920188991379489</id><published>2010-08-31T15:28:00.000-07:00</published><updated>2010-08-31T15:29:43.166-07:00</updated><title type='text'>The importance of your Compile Time</title><content type='html'>Lot's of time i find myself working to shorten compile and build times. While most people agree with shorter is better for compile times, the questions of what is short? and how important is it? seem to remain vague and seemly open to judgement.&lt;br /&gt;&lt;br /&gt;It's not. So I wanted to take a moment to clarify it.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;I vBlogged my thoughts here&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/wPTZOFHJ96E&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/wPTZOFHJ96E&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;You can see the &lt;a href="https://docs.google.com/leaf?id=0B5pFqRaidolKNzQ5ZGI1NDUtYzE5Yi00NTdiLWJlMTUtNmY0NTBjZGI5MzNi&amp;amp;hl=en"&gt;excel sheet here&lt;/a&gt;&lt;br /&gt;and read the &lt;a href="http://discuss.joelonsoftware.com/default.asp?joel.3.760263.16"&gt;Joel on Software Thread here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6889884053798500413-951920188991379489?l=llewellynfalco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://llewellynfalco.blogspot.com/feeds/951920188991379489/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6889884053798500413&amp;postID=951920188991379489' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/951920188991379489'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/951920188991379489'/><link rel='alternate' type='text/html' href='http://llewellynfalco.blogspot.com/2010/08/importance-of-your-compile-time.html' title='The importance of your Compile Time'/><author><name>&lt;a href="http://www.twitter.com/llewellynfalco"&gt;@Llewellyn Falco&lt;/a&gt;</name><uri>http://www.blogger.com/profile/11668997629228826023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_s2oZS5jFv1g/SPTCNxT1pyI/AAAAAAAAABI/bW8VaJ-Hlwk/S220/Llew.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6889884053798500413.post-8516724973485849460</id><published>2010-01-18T08:00:00.003-08:00</published><updated>2010-01-18T08:00:15.088-08:00</updated><title type='text'>Recipes in Java</title><content type='html'>&lt;div&gt;&lt;div&gt;&lt;h1&gt;&amp;nbsp;Learning to Program Java with Recipes&lt;/h1&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp;14 amazing kids showed up yesterday for a session at &lt;a title="Wintriss Techinical school" href="http://www.wintrisstech.org/" id="awz0"&gt;Wintriss Techinical school&lt;/a&gt; on learning to program Java! We tackled 2 recipes durning these 2 hours, and wanted to show how to setup your own computer so you can continue at home.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&amp;nbsp;&lt;br /&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Here's What you need to do to get started with the Recipes. First the quick-links, then detailed instructions below.&lt;br&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;&lt;br /&gt;&lt;div&gt;&lt;a title="Download Java SDK" href="http://java.sun.com/javase/downloads/widget/jdk6.jsp" id="b8ev"&gt;Download Java SDK&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;br /&gt;&lt;div&gt;&lt;a title="Download Eclipse" href="http://www.eclipse.org/downloads/" id="oye5"&gt;Download Eclipse&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;br /&gt;&lt;div&gt;&lt;a title="Download Workspace" href="http://learntoprogram.codeplex.com/" id="vo2q"&gt;Download Workspace&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;Import Workspace&lt;br&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br&gt;&lt;h2&gt;&lt;b&gt;Download Java SDK&lt;br&gt;&lt;/b&gt;&lt;/h2&gt;&lt;br&gt;&amp;nbsp;If you don't already have java on your machine you'll have to download it. How can you tell if you do have java? open an terminal window.&lt;br&gt;Mac : command+space then type terminal and hit enter&lt;br&gt;Windows : windowskey+r then type CMD and hit enter&lt;br&gt;In the terminal/command window type&lt;br&gt;java -version&lt;br&gt;if you see something like &lt;br&gt;java version "1.6.0_15"&lt;br&gt;you've got it, otherwise download it from Sun at &lt;a title="http://java.sun.com/javase/downloads/widget/jdk6.jsp" href="http://java.sun.com/javase/downloads/widget/jdk6.jsp" id="h5w9"&gt;http://java.sun.com/javase/downloads/widget/jdk6.jsp&lt;/a&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;h2&gt;Download Eclipse&lt;/h2&gt;&lt;br&gt;You want to download the "&lt;b&gt;&lt;i&gt;Eclipse IDE for Java Developers (92MB)&lt;/i&gt;&lt;/b&gt;" &lt;br&gt;it's here&lt;br&gt;&lt;a title="http://www.eclipse.org/downloads/" href="http://www.eclipse.org/downloads/" id="btjd"&gt;http://www.eclipse.org/downloads/&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;h2&gt;Download the Workspace&lt;/h2&gt;&lt;br&gt;Download the "Learn To Program - In Java" workspace from CodePlex. &lt;a title="http://learntoprogram.codeplex.com/" href="http://learntoprogram.codeplex.com/" id="gby3"&gt;http://learntoprogram.codeplex.com/&lt;/a&gt;&lt;br&gt;Unzip it to the directory of your choice. But remember the location, you will need in the next step.&lt;br&gt;&lt;h2&gt;Import the Workspace&lt;/h2&gt;In Eclipse, right click in the Navigator Window and select "Import Workspace". &lt;br&gt;A Window will appear asking for an import source, select "Existing Projects into Workspace", if you can't find it start typing existing and it will appear.&lt;br&gt;Click next.&lt;br&gt;The root directory is the location where you unzipped the workspace.&amp;nbsp; then simply hit finish.&lt;br&gt;&lt;br&gt;If you are successful you should see the IntroToProgramming folder in the navigator window.&lt;br&gt;&lt;br&gt;That's it, Happy Programming!&lt;br&gt;If you have any questions, please feel free to email me.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6889884053798500413-8516724973485849460?l=llewellynfalco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://llewellynfalco.blogspot.com/feeds/8516724973485849460/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6889884053798500413&amp;postID=8516724973485849460' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/8516724973485849460'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/8516724973485849460'/><link rel='alternate' type='text/html' href='http://llewellynfalco.blogspot.com/2010/01/recipes-in-java_18.html' title='Recipes in Java'/><author><name>&lt;a href="http://www.twitter.com/llewellynfalco"&gt;@Llewellyn Falco&lt;/a&gt;</name><uri>http://www.blogger.com/profile/11668997629228826023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_s2oZS5jFv1g/SPTCNxT1pyI/AAAAAAAAABI/bW8VaJ-Hlwk/S220/Llew.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6889884053798500413.post-6502470874658638008</id><published>2010-01-18T08:00:00.001-08:00</published><updated>2010-01-18T08:00:13.184-08:00</updated><title type='text'>Recipes in Java</title><content type='html'>&lt;div&gt;&lt;div&gt;&lt;h1&gt;&amp;nbsp;Learning to Program Java with Recipes&lt;/h1&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp;14 amazing kids showed up yesterday for a session at &lt;a title="Wintriss Techinical school" href="http://www.wintrisstech.org/" id="awz0"&gt;Wintriss Techinical school&lt;/a&gt; on learning to program Java! We tackled 2 recipes durning these 2 hours, and wanted to show how to setup your own computer so you can continue at home.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&amp;nbsp;&lt;br /&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Here's What you need to do to get started with the Recipes. First the quick-links, then detailed instructions below.&lt;br&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;&lt;br /&gt;&lt;div&gt;&lt;a title="Download Java SDK" href="http://java.sun.com/javase/downloads/widget/jdk6.jsp" id="b8ev"&gt;Download Java SDK&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;br /&gt;&lt;div&gt;&lt;a title="Download Eclipse" href="http://www.eclipse.org/downloads/" id="oye5"&gt;Download Eclipse&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;br /&gt;&lt;div&gt;&lt;a title="Download Workspace" href="http://learntoprogram.codeplex.com/" id="vo2q"&gt;Download Workspace&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;Import Workspace&lt;br&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br&gt;&lt;h2&gt;&lt;b&gt;Download Java SDK&lt;br&gt;&lt;/b&gt;&lt;/h2&gt;&lt;br&gt;&amp;nbsp;If you don't already have java on your machine you'll have to download it. How can you tell if you do have java? open an terminal window.&lt;br&gt;Mac : command+space then type terminal and hit enter&lt;br&gt;Windows : windowskey+r then type CMD and hit enter&lt;br&gt;In the terminal/command window type&lt;br&gt;java -version&lt;br&gt;if you see something like &lt;br&gt;java version "1.6.0_15"&lt;br&gt;you've got it, otherwise download it from Sun at &lt;a title="http://java.sun.com/javase/downloads/widget/jdk6.jsp" href="http://java.sun.com/javase/downloads/widget/jdk6.jsp" id="h5w9"&gt;http://java.sun.com/javase/downloads/widget/jdk6.jsp&lt;/a&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;h2&gt;Download Eclipse&lt;/h2&gt;&lt;br&gt;You want to download the "&lt;b&gt;&lt;i&gt;Eclipse IDE for Java Developers (92MB)&lt;/i&gt;&lt;/b&gt;" &lt;br&gt;it's here&lt;br&gt;&lt;a title="http://www.eclipse.org/downloads/" href="http://www.eclipse.org/downloads/" id="btjd"&gt;http://www.eclipse.org/downloads/&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;h2&gt;Download the Workspace&lt;/h2&gt;&lt;br&gt;Download the "Learn To Program - In Java" workspace from CodePlex. &lt;a title="http://learntoprogram.codeplex.com/" href="http://learntoprogram.codeplex.com/" id="gby3"&gt;http://learntoprogram.codeplex.com/&lt;/a&gt;&lt;br&gt;Unzip it to the directory of your choice. But remember the location, you will need in the next step.&lt;br&gt;&lt;h2&gt;Import the Workspace&lt;/h2&gt;In Eclipse, right click in the Navigator Window and select "Import Workspace". &lt;br&gt;A Window will appear asking for an import source, select "Existing Projects into Workspace", if you can't find it start typing existing and it will appear.&lt;br&gt;Click next.&lt;br&gt;The root directory is the location where you unzipped the workspace.&amp;nbsp; then simply hit finish.&lt;br&gt;&lt;br&gt;If you are successful you should see the IntroToProgramming folder in the navigator window.&lt;br&gt;&lt;br&gt;That's it, Happy Programming!&lt;br&gt;If you have any questions, please feel free to email me.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6889884053798500413-6502470874658638008?l=llewellynfalco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://llewellynfalco.blogspot.com/feeds/6502470874658638008/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6889884053798500413&amp;postID=6502470874658638008' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/6502470874658638008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/6502470874658638008'/><link rel='alternate' type='text/html' href='http://llewellynfalco.blogspot.com/2010/01/recipes-in-java.html' title='Recipes in Java'/><author><name>&lt;a href="http://www.twitter.com/llewellynfalco"&gt;@Llewellyn Falco&lt;/a&gt;</name><uri>http://www.blogger.com/profile/11668997629228826023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_s2oZS5jFv1g/SPTCNxT1pyI/AAAAAAAAABI/bW8VaJ-Hlwk/S220/Llew.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6889884053798500413.post-2428800376417057892</id><published>2010-01-16T07:39:00.001-08:00</published><updated>2010-01-16T07:39:56.910-08:00</updated><title type='text'>Mock Smells</title><content type='html'>&lt;div&gt;&lt;br&gt;&lt;p style="margin: 0pt;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt;Today, Bob Martin &lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt;tweeted :&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;table style="margin-left: 0pt;" class="zeroBorder" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="vertical-align: top; width: 478.8pt;"&gt;&lt;p style="margin: 0pt 0pt 0pt 40px;"&gt;&lt;a href="http://twitter.com/unclebobmartin"&gt;&lt;span style="color: rgb(0, 0, 255); font-family: 'Times New Roman';"&gt;&lt;b&gt;&lt;u&gt;&lt;font size="3"&gt;unclebobmartin&lt;/font&gt;&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;&lt;/a&gt; &lt;/p&gt;&lt;p style="margin: 0pt 0pt 0pt 40px;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt;I use mocking frameworks as little as possible. I think heavy reliance on a mocking framework is a smell. I usually write my own mocks.&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0pt;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p style="margin: 0pt;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0pt;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt;I agree with this. Of course the 140 characters allowed in a tweet don’t really give much space to explain what that smell is. So let’s refine our nose.&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0pt;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;b&gt;&lt;font size="3"&gt;Mocks let you test implementation&lt;/font&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;b&gt;&lt;font size="3"&gt;. &lt;/font&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt;Anyone who ever gets uppity about the use of stubs, fakes &amp;amp; mocks is paying a lot of attention to this. With a mock you can verify that something has been called. While this can be useful, it is rarely part of the Behavior of a system, and often &lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt;part of the implementation. Since there are literally 1,000’s of way to program the exact same behavior, Unit tests that lock a particular implementation will actually in up “protecting” your code from being &lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt;refactored&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt;.&amp;nbsp; This smell tends to come up in newly written code, and is usually accompanied by the phrase&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0pt; text-align: center;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;b&gt;&lt;i&gt;&lt;font size="3"&gt;“&lt;/font&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;b&gt;&lt;i&gt;&lt;font size="3"&gt;anytime&lt;/font&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;b&gt;&lt;i&gt;&lt;font size="3"&gt; I want to change anything a bunch of tests break and I have to go and fix them”.&lt;/font&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0pt;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0pt;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;b&gt;&lt;font size="3"&gt;Mocks let you fake very hard to fake calls&lt;/font&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;b&gt;&lt;font size="3"&gt;. &lt;/font&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt;Ever need to mock out a call to &lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt;Http&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt;Servlet&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt;Request&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt;?&amp;nbsp; There are over 40 methods on that interface. Even with the help of your IDE, that’s a pain. A good mocking framework (I prefer &lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt;EasyMock&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt;) will let you do it in 2&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt;-3&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt; lines. This is great, especially in legacy code, or &lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt;API&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt;’s you don’t control.&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt; But it’s a cover for a much more insidious smell that exists in &lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt;HttpServletRequest&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt;. Simply put, an interface should not have 40 methods. Now you might argue that was how many were needed to handle something as complex as a web call. And you would be wrong. Take a look at Rack (or our Port of it - &lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt;JRack&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt;) it handles &lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt;everything&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt; with 1 simple abstraction.&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0pt;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt;When mocks are the easiest way to gain &lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt;an&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt; handle into your code, you have coupled you code too tightly, and not left enough inserts points.&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0pt;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;b&gt;&lt;font size="3"&gt;&amp;nbsp;&lt;/font&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0pt;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;b&gt;&lt;font size="3"&gt;Mocks let you fake calls&lt;/font&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;b&gt;&lt;font size="3"&gt;. &lt;/font&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt;Lastly, mocks let you fake easy calls too. One example I use a lot is Loaders. My Loader interface looks like this:&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0pt;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt;&lt;br&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;table style="margin-left: 40px;" class="zeroBorder" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="vertical-align: top; width: 478.8pt;"&gt;&lt;p style="margin: 0pt;"&gt;&lt;span style="color: rgb(127, 0, 85); font-family: 'Courier New';"&gt;&lt;b&gt;&lt;font size="3"&gt;public&lt;/font&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); font-family: 'Courier New';"&gt;&lt;font size="3"&gt;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85); font-family: 'Courier New';"&gt;&lt;b&gt;&lt;font size="3"&gt;interface&lt;/font&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); font-family: 'Courier New';"&gt;&lt;font size="3"&gt; Loader&amp;lt;T&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0pt;"&gt;&lt;span style="color: rgb(0, 0, 0); font-family: 'Courier New';"&gt;&lt;font size="3"&gt;{&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0pt;"&gt;&lt;span style="color: rgb(0, 0, 0); font-family: 'Courier New';"&gt;&lt;font size="3"&gt;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85); font-family: 'Courier New';"&gt;&lt;b&gt;&lt;font size="3"&gt;public&lt;/font&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); font-family: 'Courier New';"&gt;&lt;font size="3"&gt; T load() &lt;/font&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85); font-family: 'Courier New';"&gt;&lt;b&gt;&lt;font size="3"&gt;throws&lt;/font&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); font-family: 'Courier New';"&gt;&lt;font size="3"&gt; Exception;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0pt;"&gt;&lt;span style="color: rgb(0, 0, 0); font-family: 'Courier New';"&gt;&lt;font size="3"&gt;}&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p style="margin: 0pt;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0pt;"&gt;&lt;span style="color: rgb(0, 0, 0); font-family: 'Courier New';"&gt;&lt;font size="3"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0pt;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt;I will constantly be making calls like &lt;br&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0pt;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt;&lt;br&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;table style="margin-left: 40px;" class="zeroBorder" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="vertical-align: top; width: 478.8pt;"&gt;&lt;p style="margin: 0pt;"&gt;&lt;span style="color: rgb(0, 0, 0); font-family: 'Courier New';"&gt;&lt;font size="3"&gt;request.init2Edit(&lt;/font&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85); font-family: 'Courier New';"&gt;&lt;b&gt;&lt;font size="3"&gt;new&lt;/font&gt;&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0); font-family: 'Courier New';"&gt;&lt;b&gt;&lt;font size="3"&gt;MockLoader&lt;/font&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); font-family: 'Courier New';"&gt;&lt;font size="3"&gt;&amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); font-family: 'Courier New';"&gt;&lt;b&gt;&lt;font size="3"&gt;Member&lt;/font&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); font-family: 'Courier New';"&gt;&lt;font size="3"&gt;&amp;gt;(member));&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0pt;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p style="margin: 0pt;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0pt;"&gt;&lt;span style="color: rgb(0, 0, 0); font-family: 'Courier New';"&gt;&lt;font size="3"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0pt;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt;But here a mocking framework is overkill. It’s so easy to write the above line, than&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0pt;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt;&lt;br&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;table style="margin-left: 40px;" class="zeroBorder" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="vertical-align: top; width: 478.8pt;"&gt;&lt;p style="margin: 0pt;"&gt;&lt;span style="color: rgb(0, 0, 0); font-family: 'Courier New';"&gt;&lt;font size="3"&gt;Loader&amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); font-family: 'Courier New';"&gt;&lt;b&gt;&lt;font size="3"&gt;Member&lt;/font&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); font-family: 'Courier New';"&gt;&lt;font size="3"&gt;&amp;gt; loader = &lt;/font&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); font-family: 'Courier New';"&gt;&lt;b&gt;&lt;font size="3"&gt;EasyMock&lt;/font&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); font-family: 'Courier New';"&gt;&lt;font size="3"&gt;.&lt;/font&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); font-family: 'Courier New';"&gt;&lt;i&gt;&lt;font size="3"&gt;createMock&lt;/font&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); font-family: 'Courier New';"&gt;&lt;font size="3"&gt;(&lt;/font&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); font-family: 'Courier New';"&gt;&lt;font size="3"&gt;Loader.&lt;/font&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85); font-family: 'Courier New';"&gt;&lt;b&gt;&lt;font size="3"&gt;class&lt;/font&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); font-family: 'Courier New';"&gt;&lt;font size="3"&gt;);&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0pt;"&gt;&lt;span style="color: rgb(0, 0, 0); font-family: 'Courier New';"&gt;&lt;b&gt;&lt;font size="3"&gt;EasyMock&lt;/font&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); font-family: 'Courier New';"&gt;&lt;font size="3"&gt;.&lt;/font&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); font-family: 'Courier New';"&gt;&lt;i&gt;&lt;font size="3"&gt;expect&lt;/font&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); font-family: 'Courier New';"&gt;&lt;font size="3"&gt;(&lt;/font&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); font-family: 'Courier New';"&gt;&lt;font size="3"&gt;loader.load&lt;/font&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); font-family: 'Courier New';"&gt;&lt;font size="3"&gt;()).&lt;/font&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); font-family: 'Courier New';"&gt;&lt;font size="3"&gt;andReturn&lt;/font&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); font-family: 'Courier New';"&gt;&lt;font size="3"&gt;(member);&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0pt;"&gt;&lt;span style="color: rgb(0, 0, 0); font-family: 'Courier New';"&gt;&lt;font size="3"&gt;request.init2Edit(loader);&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0pt;"&gt;&lt;span style="color: rgb(0, 0, 0); font-family: 'Courier New';"&gt;&lt;font size="3"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p style="margin: 0pt;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0pt;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt;If&amp;nbsp; I’ve&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt; kept my code clean, mocking frameworks just aren’t that useful. &lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0pt;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0pt;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt;So hopefully you will start to sense the same things in your code. Of course if your nose is prickling over some hard to test piece of code, grab your mocking framework. It’s your first line of attack.&amp;nbsp; Like grabbing some cologne when you are a bit smelly and guest are coming over, just realize that eventually you have to take a bath.&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0pt;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0pt;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0pt;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6889884053798500413-2428800376417057892?l=llewellynfalco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://llewellynfalco.blogspot.com/feeds/2428800376417057892/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6889884053798500413&amp;postID=2428800376417057892' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/2428800376417057892'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/2428800376417057892'/><link rel='alternate' type='text/html' href='http://llewellynfalco.blogspot.com/2010/01/mock-smells.html' title='Mock Smells'/><author><name>&lt;a href="http://www.twitter.com/llewellynfalco"&gt;@Llewellyn Falco&lt;/a&gt;</name><uri>http://www.blogger.com/profile/11668997629228826023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_s2oZS5jFv1g/SPTCNxT1pyI/AAAAAAAAABI/bW8VaJ-Hlwk/S220/Llew.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6889884053798500413.post-8325784624326985689</id><published>2009-03-25T21:55:00.000-07:00</published><updated>2009-03-25T23:23:15.321-07:00</updated><title type='text'>Extensions Methods In Java!</title><content type='html'>W00T!&lt;br /&gt;&lt;br /&gt;I just added extension methods to java. It's a bit of a hack, but a small bit. (you need to replace the java.lang.Object class)&lt;br /&gt;&lt;br /&gt;First, the hack, download and follow the instructions in the readme file of &lt;a href="http://spunlabs.com/resources/Java_Extensions.zip"&gt;Java_Extensions.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now you can run this test successfully...&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;package com.spun.util.extensions.tests;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;import junit.framework.TestCase;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;public class ExtensionsTest extends TestCase&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  public static class MyStringUtils extends ExtendableBase&amp;lt;String&gt;&lt;string&gt;&lt;/string&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    public String removeVowels()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      StringBuffer b = new StringBuffer();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      for (Character c : caller.toCharArray())&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        switch (c)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;          case 'a' :&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;          case 'e' :&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;          case 'i' :&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;       case 'o' :&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;          case 'u' :&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;            break;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;          default :&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;            b.append(c);&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;      }&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;      return b.toString();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  public void testname() throws Exception&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    String name = &lt;span style="color: rgb(255, 0, 0);"&gt;"Hello World"&lt;/span&gt;.use(MyStringUtils.class).removeVowels();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    assertEquals(&lt;span style="color: rgb(255, 0, 0);"&gt;"Hll Wrld"&lt;/span&gt;, name);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Pay extra attention to this line:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(255, 0, 0);"&gt;"Hello World"&lt;/span&gt;.use(MyStringUtils.class).removeVowels();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;What's more: this use of extensions doesn't have name spacing issues, nor does it pollute all of your objects. It's IDE friendly supporting both code completion and quick fixes!&lt;br /&gt;&lt;br /&gt;As a side note, if generics were done better, I would like it to be:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;"Hello World"&lt;/span&gt;.use&amp;lt;MyStringUtils&gt;&lt;mystringutils&gt;().removeVowels();&lt;/mystringutils&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;But this is available now! I'll blog more on it tomorrow, but I am very excited about it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6889884053798500413-8325784624326985689?l=llewellynfalco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://llewellynfalco.blogspot.com/feeds/8325784624326985689/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6889884053798500413&amp;postID=8325784624326985689' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/8325784624326985689'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/8325784624326985689'/><link rel='alternate' type='text/html' href='http://llewellynfalco.blogspot.com/2009/03/extensions-methods-in-java.html' title='Extensions Methods In Java!'/><author><name>&lt;a href="http://www.twitter.com/llewellynfalco"&gt;@Llewellyn Falco&lt;/a&gt;</name><uri>http://www.blogger.com/profile/11668997629228826023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_s2oZS5jFv1g/SPTCNxT1pyI/AAAAAAAAABI/bW8VaJ-Hlwk/S220/Llew.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6889884053798500413.post-813516831405077889</id><published>2009-01-10T18:18:00.000-08:00</published><updated>2009-01-10T18:33:28.681-08:00</updated><title type='text'>That which is measured gets done.</title><content type='html'>&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:verdana;"&gt;The other day at my &lt;a href="http://www.wealthinnetworking.org/"&gt;Letip meeting&lt;/a&gt; one of our members, &lt;a href="http://www.webflexor.com/"&gt;Mikel Bruce&lt;/a&gt;, gave a great talk on goal setting.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;One of the things he mentioned, which I particularly liked, was a tool called an awareness sheet.  The idea is simple, write down all the things you want to do each day: exercise, eat diner as family, limit tv watching, floss etc… then at the end of each day, you check off what you’ve done&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:verdana;"&gt;. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;The important part here though isn’t in checking off what you’ve done. This is why you don’t check it off as you do it. The important part is the awareness of what you haven’t done.  The benefit here is that it isn’t penalizing you for not doing it. It’s not like you have to do everything every day. It’s just making you aware of what you want to do, and if you’re doing it. However, this awareness will help you to actually do it.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Think of it as a small commercial, every night, reminding you what you want.&lt;/span&gt; &lt;span style="font-family:verdana;"&gt;Here’s a small picture of a sample month.&lt;/span&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_s2oZS5jFv1g/SWlaTaCWciI/AAAAAAAAADU/hQ04gfuEkMc/s1600-h/awareness-chart.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 185px;" src="http://3.bp.blogspot.com/_s2oZS5jFv1g/SWlaTaCWciI/AAAAAAAAADU/hQ04gfuEkMc/s320/awareness-chart.png" alt="" id="BLOGGER_PHOTO_ID_5289858526776554018" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;In the end, it's just measuring the habits you want. I'm also finding this useful for events. For example, an presentation awareness sheet. Just to keep me aware of all the details I want to improve when speaking.&lt;/span&gt; &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6889884053798500413-813516831405077889?l=llewellynfalco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://llewellynfalco.blogspot.com/feeds/813516831405077889/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6889884053798500413&amp;postID=813516831405077889' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/813516831405077889'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/813516831405077889'/><link rel='alternate' type='text/html' href='http://llewellynfalco.blogspot.com/2009/01/that-which-is-measured-gets-done.html' title='That which is measured gets done.'/><author><name>&lt;a href="http://www.twitter.com/llewellynfalco"&gt;@Llewellyn Falco&lt;/a&gt;</name><uri>http://www.blogger.com/profile/11668997629228826023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_s2oZS5jFv1g/SPTCNxT1pyI/AAAAAAAAABI/bW8VaJ-Hlwk/S220/Llew.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_s2oZS5jFv1g/SWlaTaCWciI/AAAAAAAAADU/hQ04gfuEkMc/s72-c/awareness-chart.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6889884053798500413.post-3092203529886928355</id><published>2008-10-15T10:56:00.000-07:00</published><updated>2008-10-15T11:06:19.378-07:00</updated><title type='text'>Java Packing</title><content type='html'>&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:verdana;"&gt;Recently I have  started to have a large appreciation for java’s class loader and jar packages. The combination allowing for many great things that becomes troublesome and cumbersome in other languages. But, I wanted to talk about a few things I believe could be much better.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(153, 0, 0); font-weight: bold;font-size:130%;" &gt;&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;Embedded jars.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Jar files can have class files in them, even resources in them, but not other jar files. Why not? If I have a project that needs a.jar, b.jar, myproject.jar, it would be simpler and easier to jar up the a &amp;amp; b jars into my jar. I’m not saying this is always the best way to go, but it should be an option.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(153, 0, 0);font-size:130%;" &gt;&lt;span style="font-family:verdana;"&gt;Monkey Patching.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Monkey Patching is the ability to hack out a solution over someone else nice code. Interpreted languages like ruby or php always get this, since you get the source, not a binary. Now there are lots of bad things about Monkey Patching, but it’s really useful when you need it. Now I understand that if you don’t have source, Monkey Patching is not so practical.&lt;br /&gt;&lt;br /&gt;However 100% of the jar files I am currently using are Open Source. As such, there should be a standard way of constructing a Jar file so the source is included. Additionally, there should also be easy ways to recompile the jar.&lt;br /&gt;Like:  &lt;span style="color: rgb(51, 51, 255);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;javac recompile a.jar &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Again, the jars I’m using are open source, but the ability to easily modify that source is very complex in java. Also, debugging into those classes usually loses source. We need a simpler way to work with the source the jar was made from.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(153, 0, 0);font-size:130%;" &gt;Distilling Minimum class files.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;This would also be nice if you could use the jar file the same as regular source path.&lt;br /&gt;For example, let’s say I have a class my1 which uses a1, and a1 uses b1.&lt;br /&gt;(short hand: my1-&gt; a1 -&gt; b1 ) but my source tree has&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="color: rgb(51, 51, 255);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;my1.java &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;my2.java  &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;a1.java  &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;a2.java  &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;b1.java &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;b2.java&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;if I compile my1.java and let javac know my source path,&lt;br /&gt;it’s will follow the links and only give me&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;my1.class&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;a1.class&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;b1.class&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;Nice right, the minimum needed to run my class. Now think how nice it would be if you had jar files with source attached,&lt;br /&gt;a1 &amp;amp; a2 are in a.jar&lt;br /&gt;b1 &amp;amp; b2 are in b.jar&lt;br /&gt;&lt;br /&gt;but still you could get the same results, a jar file with just the minimum needed to run your app.&lt;br /&gt;&lt;br /&gt;Right now, there might be a class that i'd like to use, but i'll rewrite it, because i don't want to include the whole jar that it's packaged in. I can't just remove the class file, because it depends on other class files. So I rewrite rather that bloat.&lt;br /&gt;Why should I ever have to make that choice?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6889884053798500413-3092203529886928355?l=llewellynfalco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://llewellynfalco.blogspot.com/feeds/3092203529886928355/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6889884053798500413&amp;postID=3092203529886928355' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/3092203529886928355'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/3092203529886928355'/><link rel='alternate' type='text/html' href='http://llewellynfalco.blogspot.com/2008/10/java-packing.html' title='Java Packing'/><author><name>&lt;a href="http://www.twitter.com/llewellynfalco"&gt;@Llewellyn Falco&lt;/a&gt;</name><uri>http://www.blogger.com/profile/11668997629228826023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_s2oZS5jFv1g/SPTCNxT1pyI/AAAAAAAAABI/bW8VaJ-Hlwk/S220/Llew.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6889884053798500413.post-4069516158027861635</id><published>2008-10-13T00:45:00.001-07:00</published><updated>2008-10-13T09:28:19.591-07:00</updated><title type='text'>Approval Tests (a pictures worth a 1000 tests)</title><content type='html'>&lt;span style="font-size:180%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;link style="color: rgb(153, 51, 153); font-weight: bold;" rel="File-List" href="file:///C:%5CDOCUME%7E1%5CLLEWEL%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml"&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;o:officedocumentsettings&gt;   &lt;o:pixelsperinch&gt;72&lt;/o:PixelsPerInch&gt;   &lt;o:targetscreensize&gt;544x376&lt;/o:TargetScreenSize&gt;  &lt;/o:OfficeDocumentSettings&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;link style="color: rgb(153, 51, 153); font-weight: bold;" rel="themeData" href="file:///C:%5CDOCUME%7E1%5CLLEWEL%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx"&gt;&lt;link style="color: rgb(153, 51, 153); font-weight: bold;" rel="colorSchemeMapping" href="file:///C:%5CDOCUME%7E1%5CLLEWEL%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml"&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:worddocument&gt;   &lt;w:view&gt;Normal&lt;/w:View&gt;   &lt;w:zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:trackmoves/&gt;   &lt;w:trackformatting/&gt;   &lt;w:punctuationkerning/&gt;   &lt;w:validateagainstschemas/&gt;   &lt;w:saveifxmlinvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:ignoremixedcontent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:alwaysshowplaceholdertext&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:donotpromoteqf/&gt;   &lt;w:lidthemeother&gt;EN-US&lt;/w:LidThemeOther&gt;   &lt;w:lidthemeasian&gt;X-NONE&lt;/w:LidThemeAsian&gt;   &lt;w:lidthemecomplexscript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt;   &lt;w:compatibility&gt;    &lt;w:breakwrappedtables/&gt;    &lt;w:snaptogridincell/&gt;    &lt;w:wraptextwithpunct/&gt;    &lt;w:useasianbreakrules/&gt;    &lt;w:dontgrowautofit/&gt;    &lt;w:splitpgbreakandparamark/&gt;    &lt;w:dontvertaligncellwithsp/&gt;    &lt;w:dontbreakconstrainedforcedtables/&gt;    &lt;w:dontvertalignintxbx/&gt;    &lt;w:word11kerningpairs/&gt;    &lt;w:cachedcolbalance/&gt;   &lt;/w:Compatibility&gt;   &lt;w:donotoptimizeforbrowser/&gt;   &lt;m:mathpr&gt;    &lt;m:mathfont val="Cambria Math"&gt;    &lt;m:brkbin val="before"&gt;    &lt;m:brkbinsub val="&amp;#45;-"&gt;    &lt;m:smallfrac val="off"&gt;    &lt;m:dispdef/&gt;    &lt;m:lmargin val="0"&gt;    &lt;m:rmargin val="0"&gt;    &lt;m:defjc val="centerGroup"&gt;    &lt;m:wrapindent val="1440"&gt;    &lt;m:intlim val="subSup"&gt;    &lt;m:narylim val="undOvr"&gt;   &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:latentstyles deflockedstate="false" defunhidewhenused="true" defsemihidden="true" defqformat="false" defpriority="99" latentstylecount="267"&gt;   &lt;w:lsdexception locked="false" priority="0" semihidden="false" unhidewhenused="false" qformat="true" name="Normal"&gt;   &lt;w:lsdexception locked="false" priority="9" semihidden="false" unhidewhenused="false" qformat="true" name="heading 1"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 2"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 3"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 4"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 5"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 6"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 7"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 8"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 9"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 1"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 2"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 3"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 4"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 5"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 6"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 7"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 8"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 9"&gt;   &lt;w:lsdexception locked="false" priority="35" qformat="true" name="caption"&gt;   &lt;w:lsdexception locked="false" priority="10" semihidden="false" unhidewhenused="false" qformat="true" name="Title"&gt;   &lt;w:lsdexception locked="false" priority="1" name="Default Paragraph Font"&gt;   &lt;w:lsdexception locked="false" priority="11" semihidden="false" unhidewhenused="false" qformat="true" name="Subtitle"&gt;   &lt;w:lsdexception locked="false" priority="22" semihidden="false" unhidewhenused="false" qformat="true" name="Strong"&gt;   &lt;w:lsdexception locked="false" priority="20" semihidden="false" unhidewhenused="false" qformat="true" name="Emphasis"&gt;   &lt;w:lsdexception locked="false" priority="59" semihidden="false" unhidewhenused="false" name="Table Grid"&gt;   &lt;w:lsdexception locked="false" unhidewhenused="false" name="Placeholder Text"&gt;   &lt;w:lsdexception locked="false" priority="1" semihidden="false" unhidewhenused="false" qformat="true" name="No Spacing"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 1"&gt;   &lt;w:lsdexception locked="false" unhidewhenused="false" name="Revision"&gt;   &lt;w:lsdexception locked="false" priority="34" semihidden="false" unhidewhenused="false" qformat="true" name="List Paragraph"&gt;   &lt;w:lsdexception locked="false" priority="29" semihidden="false" unhidewhenused="false" qformat="true" name="Quote"&gt;   &lt;w:lsdexception locked="false" priority="30" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Quote"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="19" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Emphasis"&gt;   &lt;w:lsdexception locked="false" priority="21" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Emphasis"&gt;   &lt;w:lsdexception locked="false" priority="31" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Reference"&gt;   &lt;w:lsdexception locked="false" priority="32" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Reference"&gt;   &lt;w:lsdexception locked="false" priority="33" semihidden="false" unhidewhenused="false" qformat="true" name="Book Title"&gt;   &lt;w:lsdexception locked="false" priority="37" name="Bibliography"&gt;   &lt;w:lsdexception locked="false" priority="39" qformat="true" name="TOC Heading"&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;style&gt; &lt;!--  /* Font Definitions */  @font-face 	{font-family:Helvetica; 	panose-1:2 11 6 4 2 2 2 2 2 4; 	mso-font-charset:0; 	mso-generic-font-family:swiss; 	mso-font-pitch:variable; 	mso-font-signature:536881799 -2147483648 8 0 511 0;} @font-face 	{font-family:"Cambria Math"; 	panose-1:2 4 5 3 5 4 6 3 2 4; 	mso-font-charset:1; 	mso-generic-font-family:roman; 	mso-font-format:other; 	mso-font-pitch:variable; 	mso-font-signature:0 0 0 0 0 0;} @font-face 	{font-family:"ヒラギノ角ゴ Pro W3"; 	mso-font-charset:0; 	mso-generic-font-family:roman; 	mso-font-pitch:auto; 	mso-font-signature:0 0 0 0 0 0;}  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{mso-style-unhide:no; 	mso-style-qformat:yes; 	mso-style-parent:""; 	margin:0in; 	margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:12.0pt; 	font-family:"Times New Roman","serif"; 	mso-fareast-font-family:"Times New Roman";} p.HeaderFooter, li.HeaderFooter, div.HeaderFooter 	{mso-style-name:"Header &amp; Footer"; 	mso-style-unhide:no; 	mso-style-parent:""; 	margin:0in; 	margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	tab-stops:right 6.5in; 	font-size:10.0pt; 	font-family:"Helvetica","sans-serif"; 	mso-fareast-font-family:"ヒラギノ角ゴ Pro W3"; 	mso-bidi-font-family:"Times New Roman"; 	color:black;} p.Body, li.Body, div.Body 	{mso-style-name:Body; 	mso-style-unhide:no; 	mso-style-parent:""; 	margin:0in; 	margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:12.0pt; 	mso-bidi-font-size:10.0pt; 	font-family:"Helvetica","sans-serif"; 	mso-fareast-font-family:"ヒラギノ角ゴ Pro W3"; 	mso-bidi-font-family:"Times New Roman"; 	color:black;} .MsoChpDefault 	{mso-style-type:export-only; 	mso-default-props:yes; 	font-size:10.0pt; 	mso-ansi-font-size:10.0pt; 	mso-bidi-font-size:10.0pt;} @page Section1 	{size:8.5in 11.0in; 	margin:1.0in 1.0in 1.0in 1.0in; 	mso-header-margin:.5in; 	mso-footer-margin:.6in; 	mso-paper-source:0;} div.Section1 	{page:Section1;} --&gt; &lt;/style&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt;  /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:"Table Normal"; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-qformat:yes; 	mso-style-parent:""; 	mso-padding-alt:0in 5.4pt 0in 5.4pt; 	mso-para-margin:0in; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.0pt; 	font-family:"Times New Roman","serif";} &lt;/style&gt; &lt;![endif]--&gt;    &lt;p  style="color: rgb(153, 51, 153); font-weight: bold;font-family:arial;" class="Body"&gt;&lt;span style="font-size:180%;"&gt;Scenario 1 [Testing a User Interface]&lt;/span&gt;&lt;/p&gt;  &lt;p class="Body"&gt;&lt;b style=""&gt;Core Concept :&lt;/b&gt;&lt;/p&gt;  &lt;p class="Body"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p  style="color: rgb(51, 51, 255);font-family:courier new;" class="Body"&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  style="color: rgb(51, 51, 255);font-family:courier new;" class="Body"&gt;&lt;span style="font-size:85%;"&gt;Component gui = createGui();&lt;/span&gt;&lt;/p&gt;  &lt;p  style="color: rgb(51, 51, 255);font-family:courier new;" class="Body"&gt;&lt;span style="font-size:85%;"&gt;Approvals.approve(gui);&lt;/span&gt;&lt;/p&gt;&lt;p  style="color: rgb(51, 51, 255);font-family:courier new;" class="Body"&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Body"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="Body"&gt;This creates a snap shot of the gui:&lt;span style=""&gt;  &lt;/span&gt;gui.received.png&lt;/p&gt;  &lt;p class="Body"&gt;This passes if gui.received.png == gui.approved.png&lt;/p&gt;  &lt;p class="Body"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="Body"&gt;If you like the result, simply rename&lt;span style=""&gt;  &lt;/span&gt;gui.received.png -&gt; gui.approved.png and the test will pass.&lt;/p&gt;  &lt;p class="Body"&gt;&lt;b style=""&gt;Could you explain that in a diagram?&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="Body"&gt;&lt;span style=""&gt; &lt;/span&gt;yes.&lt;/p&gt;  &lt;p class="Body"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_s2oZS5jFv1g/SPN27KCzUDI/AAAAAAAAAA8/W3_Rm7Nnlw8/s1600-h/Approval-Diagram.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_s2oZS5jFv1g/SPN27KCzUDI/AAAAAAAAAA8/W3_Rm7Nnlw8/s320/Approval-Diagram.png" alt="" id="BLOGGER_PHOTO_ID_5256675948751966258" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;b style=""&gt;&lt;br /&gt;&lt;/b&gt;&lt;p class="Body"&gt;&lt;b style=""&gt;Why is this awesome?&lt;/b&gt;&lt;/p&gt;  &lt;p class="Body"&gt;&lt;b style=""&gt;&lt;span style=""&gt; &lt;/span&gt;&lt;/b&gt;&lt;span style=""&gt; &lt;/span&gt;“a picture is worth a 1000 tests”.&lt;span style=""&gt;  &lt;/span&gt;Ever find that your unit tests aren’t giving you enough security? Have you started making lots &amp;amp; lots of asserts? Ever find your tests test too many things and the maintenance required to change anything is actually reducing your agility?&lt;/p&gt;  &lt;p class="Body"&gt;&lt;span style=""&gt; &lt;/span&gt;Approval Testing gives you 100% lock down on your gui, yet changes simply require a click of a button.&lt;/p&gt;  &lt;p class="Body"&gt;&lt;b style=""&gt;Where are the approved images stored?&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="Body"&gt;&lt;b style=""&gt;&lt;span style=""&gt; &lt;/span&gt;&lt;/b&gt;Approved images are stored in your testing folder and in your source control. This makes the test repeatable on different systems &amp;amp; you can actually browse a visual of how your gui’s have changed over time!&lt;/p&gt;  &lt;p class="Body"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="Body"&gt;&lt;b style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="Body"&gt;&lt;b style=""&gt;How does it work for a web app?&lt;/b&gt;&lt;/p&gt;  &lt;p class="Body"&gt;&lt;b style=""&gt;&lt;span style=""&gt; &lt;/span&gt;&lt;/b&gt;String html = createWebPage();&lt;/p&gt;  &lt;p class="Body"&gt;&lt;span style=""&gt; &lt;/span&gt;Approvals.approve(html);&lt;/p&gt;  &lt;p class="Body"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="Body"&gt;Instead of an image, now a text file (page.received.html) is created.&lt;/p&gt;&lt;p class="Body"&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p class="Body"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;span style=";font-family:&amp;quot;;font-size:12;color:black;"   &gt;  &lt;/span&gt;  &lt;p style="font-weight: bold; color: rgb(153, 51, 153);" class="Body"&gt;&lt;span style="font-size:180%;"&gt;Scenario 2 [Behavior Driven Development]&lt;/span&gt;&lt;/p&gt;  &lt;p class="Body"&gt;&lt;b style=""&gt;Core Concept :&lt;/b&gt;&lt;/p&gt;  &lt;p class="Body"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p  style="color: rgb(51, 51, 255);font-family:courier new;" class="Body"&gt;&lt;span style="font-size:85%;"&gt;Object myObject = createObject();&lt;/span&gt;&lt;/p&gt;  &lt;p  style="color: rgb(51, 51, 255);font-family:courier new;" class="Body"&gt;&lt;span style="font-size:85%;"&gt;/*temp*/ Approvals.approve(myObject.toString());&lt;/span&gt;&lt;/p&gt;  &lt;p  style="color: rgb(51, 51, 255);font-family:courier new;" class="Body"&gt;&lt;span style="font-size:85%;"&gt;doSomething1();&lt;/span&gt;&lt;/p&gt;  &lt;p  style="color: rgb(51, 51, 255);font-family:courier new;" class="Body"&gt;&lt;span style="font-size:85%;"&gt;/*temp*/ Approvals.approve(myObject.toString());&lt;/span&gt;&lt;/p&gt;  &lt;p  style="color: rgb(51, 51, 255);font-family:courier new;" class="Body"&gt;&lt;span style="font-size:85%;"&gt;doSomething2();&lt;/span&gt;&lt;/p&gt;  &lt;p  style="color: rgb(51, 51, 255);font-family:courier new;" class="Body"&gt;&lt;span style="font-size:85%;"&gt;/*temp*/ Approvals.approve(myObject.toString());&lt;/span&gt;&lt;/p&gt;  &lt;p  style="color: rgb(51, 51, 255);font-family:courier new;" class="Body"&gt;&lt;span style="font-size:85%;"&gt;doSomething3();&lt;/span&gt;&lt;/p&gt;  &lt;p  style="color: rgb(51, 51, 255);font-family:courier new;" class="Body"&gt;&lt;span style="font-size:85%;"&gt;/*temp*/ Approvals.approve(myObject.toString());&lt;/span&gt;&lt;/p&gt;  &lt;p  style="color: rgb(51, 51, 255);font-family:courier new;" class="Body"&gt;&lt;span style="font-size:85%;"&gt;doSomething4();&lt;/span&gt;&lt;/p&gt;  &lt;p  style="color: rgb(51, 51, 255);font-family:courier new;" class="Body"&gt;&lt;span style="font-size:85%;"&gt;/*temp*/ Approvals.approve(myObject.toString());&lt;/span&gt;&lt;/p&gt;  &lt;p  style="color: rgb(51, 51, 255);font-family:courier new;" class="Body"&gt;&lt;span style="font-size:85%;"&gt;doSomething5();&lt;/span&gt;&lt;/p&gt;  &lt;p  style="color: rgb(51, 51, 255);font-family:courier new;" class="Body"&gt;&lt;span style="font-size:85%;"&gt;Approvals.approve(myObject.toString());&lt;/span&gt;&lt;/p&gt;&lt;p class="Body"&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p class="Body"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="Body"&gt;&lt;b style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="Body"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="Body"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="Body"&gt;As the code is created, the approval will move down, so That the final code is&lt;/p&gt;&lt;p class="Body"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="Body"&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p class="Body"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p  style="color: rgb(51, 51, 255);font-family:courier new;" class="Body"&gt;&lt;span style="font-size:85%;"&gt;Object myObject = createObject();&lt;/span&gt;&lt;/p&gt;  &lt;p  style="color: rgb(51, 51, 255);font-family:courier new;" class="Body"&gt;&lt;span style="font-size:85%;"&gt;doSomething1();&lt;/span&gt;&lt;/p&gt;  &lt;p  style="color: rgb(51, 51, 255);font-family:courier new;" class="Body"&gt;&lt;span style="font-size:85%;"&gt;doSomething2();&lt;/span&gt;&lt;/p&gt;  &lt;p  style="color: rgb(51, 51, 255);font-family:courier new;" class="Body"&gt;&lt;span style="font-size:85%;"&gt;doSomething3();&lt;/span&gt;&lt;/p&gt;  &lt;p  style="color: rgb(51, 51, 255);font-family:courier new;" class="Body"&gt;&lt;span style="font-size:85%;"&gt;doSomething4();&lt;/span&gt;&lt;/p&gt;  &lt;p  style="color: rgb(51, 51, 255);font-family:courier new;" class="Body"&gt;&lt;span style="font-size:85%;"&gt;doSomething5();&lt;/span&gt;&lt;/p&gt;  &lt;p  style="color: rgb(51, 51, 255);font-family:courier new;" class="Body"&gt;&lt;span style="font-size:85%;"&gt;Approvals.approve(myObject.toString());&lt;/span&gt;&lt;/p&gt;&lt;p class="Body" face="courier new"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="Body" style="font-family: courier new;"&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Body"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="Body"&gt;&lt;b style=""&gt;Why is this awesome?&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="Body"&gt;&lt;b style=""&gt;&lt;span style=""&gt;            &lt;/span&gt;&lt;/b&gt;Many times a unit test is scattered with spot testing to assure things are done correctly. This creates a barrier to readability, and can lead to unneeded code. &lt;/p&gt;  &lt;p class="Body"&gt;&lt;span style=""&gt;            &lt;/span&gt;Approval tests reduce the need to spot check, making the test cleaner and simpler.&lt;/p&gt;  &lt;p class="Body"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="Body"&gt;&lt;b style=""&gt;What if I don’t want to change my toString?&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="Body"&gt;&lt;span style=""&gt;            &lt;/span&gt;No problem, create a toOtherString(), or a ObjectWritter, or Inspect the object. Sometimes we even create a ObjectVisualizer when an image is a better way to show the state.&lt;/p&gt;  &lt;p class="Body"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="Body"&gt;&lt;b style=""&gt;What if there’s a bug in my code?&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="Body"&gt;&lt;span style=""&gt;            &lt;/span&gt;The first thing to do is to try to walk through your code and get an idea of the state of the object, so you can see where it went wrong... if only you had a nice way of visualizing the state of your object.... oh wait! that’s the first thing you created! I guess it will be pretty easy to debug.&lt;/p&gt;&lt;p class="Body"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="Body"&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p class="Body"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;span style=";font-family:&amp;quot;;font-size:12;color:black;"   &gt;  &lt;/span&gt;  &lt;p class="Body"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p style="font-weight: bold; color: rgb(153, 51, 153);" class="Body"&gt;&lt;span style="font-size:180%;"&gt;Scenario 3 [The lock down]&lt;/span&gt;&lt;/p&gt;  &lt;p class="Body"&gt;&lt;b style=""&gt;Core Concept :&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="Body"&gt;&lt;span style=""&gt; &lt;/span&gt;Say I have a web page that displays a user profile. I want to refactor it, but I have no tests. However, I do have 300 users in my current database.&lt;/p&gt;&lt;p class="Body"&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p class="Body"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p  style="color: rgb(51, 51, 255);font-family:courier new;" class="Body"&gt;&lt;span style="font-size:85%;"&gt;String allPages = getAllUserProfilePages();&lt;/span&gt;&lt;/p&gt;  &lt;p  style="color: rgb(51, 51, 255);font-family:courier new;" class="Body"&gt;&lt;span style="font-size:85%;"&gt;Approvals.approve(allPages);&lt;/span&gt;&lt;/p&gt;&lt;p class="Body"&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p class="Body"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="Body"&gt;&lt;b style=""&gt;Why is this awesome?&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="Body"&gt;&lt;b style=""&gt;&lt;span style=""&gt;            &lt;/span&gt;&lt;/b&gt;2 lines of code to completely lock down a legacy process. That is the definition of awesome!&lt;/p&gt;  &lt;p class="Body"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="Body"&gt;&lt;b style=""&gt;Won’t this test be kinda slow?&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="Body"&gt;&lt;span style=""&gt;            &lt;/span&gt;Yes. But after you are done safely refactoring, you can/should remove the tests.&lt;/p&gt;  &lt;p class="Body"&gt;&lt;b style=""&gt;Is this test data independent? Will it be repeatable tomorrow?&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="Body"&gt;&lt;span style=""&gt;            &lt;/span&gt;No. But after you are done safely refactoring, you can/should remove the tests.&lt;/p&gt;  &lt;p class="Body"&gt;&lt;b style=""&gt;Should I keep this test after the refactoring?&lt;/b&gt;&lt;/p&gt;  &lt;p class="Body"&gt;&lt;span style=""&gt;            &lt;/span&gt;No!&lt;/p&gt;  &lt;p class="Body"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="Body"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;color:#000000;"   &gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6889884053798500413-4069516158027861635?l=llewellynfalco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://llewellynfalco.blogspot.com/feeds/4069516158027861635/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6889884053798500413&amp;postID=4069516158027861635' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/4069516158027861635'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/4069516158027861635'/><link rel='alternate' type='text/html' href='http://llewellynfalco.blogspot.com/2008/10/approval-tests.html' title='Approval Tests (a pictures worth a 1000 tests)'/><author><name>&lt;a href="http://www.twitter.com/llewellynfalco"&gt;@Llewellyn Falco&lt;/a&gt;</name><uri>http://www.blogger.com/profile/11668997629228826023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_s2oZS5jFv1g/SPTCNxT1pyI/AAAAAAAAABI/bW8VaJ-Hlwk/S220/Llew.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_s2oZS5jFv1g/SPN27KCzUDI/AAAAAAAAAA8/W3_Rm7Nnlw8/s72-c/Approval-Diagram.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6889884053798500413.post-9188926135537528238</id><published>2008-09-24T01:06:00.000-07:00</published><updated>2008-09-24T01:17:37.016-07:00</updated><title type='text'>Locking down legacy code.</title><content type='html'>So let’s look at the situation where we have a block of code that’s run, but not unit tested. There are many great examples that look like &lt;br /&gt;&lt;br /&gt;someBlock()&lt;br /&gt;{&lt;br /&gt;...&lt;br /&gt;o = calculateSomething(a,b);&lt;br /&gt;....&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;now let’s say we wanted to refactor calculateSomething, but it’s dangerous to do that, since we aren’t sure the tests will assert against the changes we might make. Even if the code coverage is 100%, that doesn’t guarantee that the asserts are 100%. For example the test&lt;br /&gt;&lt;br /&gt;testSomeBlock()&lt;br /&gt;{&lt;br /&gt;new SomeObject().someBlock();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;would yield 100% coverage, and not provide any asserts against change.&lt;br /&gt;&lt;br /&gt;So let’s look at a locking technique for this code.&lt;br /&gt;1) ‘peel’ the function. Make calculateSomething(){ return calculateSomething1();}&lt;br /&gt;2)  Clone the function make calculateSomething2(); &lt;br /&gt;3)  Add an in production code assert&lt;br /&gt;&lt;br /&gt;calculateSomething(a,b)&lt;br /&gt;{&lt;br /&gt;result1 = calculateSomething1(a,b);&lt;br /&gt;result2 = calculateSomething2(a,b);&lt;br /&gt;assertEquals(result1, result2);&lt;br /&gt;return result2;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;4)  now you can refactor calculateSomething2 with safety, even if the above execute only test above was your only test.&lt;br /&gt;5)  clean up, once you feel safe with the refactor, remove the calculateSomething1, and inline calculateSomething2.&lt;br /&gt;&lt;br /&gt;Of course there need to be a few properties of calculateSomething(a,b), like it has a return value &amp; it doesn’t cause problems by being run twice, etc...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Now this bring some added bonuses:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Case 1.&lt;/span&gt; image you have a big block of code you can do an automatic refactoring, like ‘extract method’ and then apply this technique to it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Case 2.&lt;/span&gt; Theory based testing. the interesting thing about the calculateSomething2(a,b) == calculateSomething1(a,b) is you don’t care what a and b are, nor do you need pre-knowledge of their return value. This means you can write a random generator of a,b and blast calculateSomething with thousands of cases.&lt;br /&gt;&lt;br /&gt;For example, i have a triangle class that calculates the angles given 3 points. then if i have a generator of point(x,y) i can write&lt;br /&gt;for(int i = 0; i &lt; 10000; i++)&lt;br /&gt;{&lt;br /&gt;   Triangle t = new Triangle(generatePoint(),generatePoint(), generatePoint());&lt;br /&gt;    assertEquals(t.getAngles1(), t.getAngles2);&lt;br /&gt;}&lt;br /&gt;and WOW, i have massively locked down code in a matter of seconds.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Case 3&lt;/span&gt;. Code in production. So lets say I have a total mess of legacy code, in production. I can use this technique, but with a ‘soft’ logging fail. refactor, wait a week, and if nothing went wrong, remove old methoda. It’s not ideal, but ‘total mess of legacy code’ took us away form ideal in the beginning.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6889884053798500413-9188926135537528238?l=llewellynfalco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://llewellynfalco.blogspot.com/feeds/9188926135537528238/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6889884053798500413&amp;postID=9188926135537528238' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/9188926135537528238'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/9188926135537528238'/><link rel='alternate' type='text/html' href='http://llewellynfalco.blogspot.com/2008/09/locking-down-legacy-code.html' title='Locking down legacy code.'/><author><name>&lt;a href="http://www.twitter.com/llewellynfalco"&gt;@Llewellyn Falco&lt;/a&gt;</name><uri>http://www.blogger.com/profile/11668997629228826023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_s2oZS5jFv1g/SPTCNxT1pyI/AAAAAAAAABI/bW8VaJ-Hlwk/S220/Llew.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6889884053798500413.post-5238423490440204361</id><published>2008-07-24T09:28:00.000-07:00</published><updated>2008-12-10T17:03:15.091-08:00</updated><title type='text'>What the Inca’s taught me about Sustainable Pace.</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_s2oZS5jFv1g/SIiuJ7v5NnI/AAAAAAAAAAM/AYR9cirMdaQ/s1600-h/Inca-Trail.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://3.bp.blogspot.com/_s2oZS5jFv1g/SIiuJ7v5NnI/AAAAAAAAAAM/AYR9cirMdaQ/s320/Inca-Trail.png" alt="" id="BLOGGER_PHOTO_ID_5226618853244089970" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p class="MsoNormal"&gt;I spent the last 2 weeks in Peru, during which I hiked the Inca trail to Machu Picchu. 26 miles of very steep up and down hiking between 10,000 and 14,000 feet: where the air has much less oxygen.&lt;span style=""&gt;  &lt;/span&gt;Many of you who know me, might have guessed that I’m not quite ready for such activity…&lt;/p&gt;  &lt;p class="MsoNormal"&gt;The 2nd day we went straight up 4,000 feet, and by mid-day I was exhausted and found it very hard to breath. I wanted to continue, of course, so slept though lunch, drank a lot of electrolytes (not Gatorade, this stuff tasted awful) , took carbo-gel, everything they recommended. Still when we took off for the afternoon, I could barely go 40 feet without having to sit-down. Finally, the porters tried to lift me, but even that was too much. I asked for oxygen, but was told that every time they gave it people did better, then got worse. Finally my girlfriend and I decided to have me evacuated out.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;However, as we looked around to tell the guides, they were 50 feet ahead, in their own conversation. Christina, my girlfriend, then had this suggestion, “try taking 4 steps, then stopping and catching your breath.” I tried it, four (small) steps then two breaths. &lt;span style=""&gt; &lt;/span&gt;It came to about a meter at a time, but I didn’t have to sit-down. &lt;span style=""&gt; &lt;/span&gt;When we reached our guides, they had the oxygen out, but we refused it, saying “this is working, let’s try it out”. I continued, without sitting down, like this for about 3 miles. Later, as it got steeper steps, I reduced my rate to 2 steps, then 2 breaths. Then remainder of the trip I used this method as we continued up and down between the mountain passes. Constantly monitoring my breathing, and varying my steps from as little as 2 steps, to as many as 20. My metrics became clear, If I had enough breath to talk, I was going too slow. If I couldn’t breathe through my nose (in other words, if I needed to breathe through my mouth) I was going too fast. &lt;/p&gt;  &lt;p class="MsoNormal"&gt;And in the end of the 4 days, I arrived at Machu Picchu, and the end of the line, but with the whole group.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Now, hiking 26 miles, 4 steps at a time gives you a lot of time to think, and I got to wondering about sustainable pace and agile programming. We give some lip service to sustainable pace, but mainly we define it as a 40 hour work week. Normal development methods end up in such trouble that they don’t normally come close to sustainable pace. &lt;span style=""&gt; &lt;/span&gt;&lt;span style=""&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Also, on the trail, I knew exactly how much progress I was making. I knew if I was going forward. I could say, “look, I’m 3 feet closer to Machu Picchu than I was 30 seconds ago.” But most projects don’t have sufficient tests to realize if they are moving forward, backwards or in circles.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;So I wanted to start a discussion about refining sustainable pace for agile programming. There are (I think) 3 areas of this discussion&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpFirst" style="text-indent: -0.25in;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style=""&gt;&lt;span style=""&gt;1)&lt;span style=";font-family:&amp;quot;;font-size:7;"  &gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;Metrics of sustainable pace for the team and for individuals &lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent: -0.25in;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style=""&gt;&lt;span style=""&gt;2)&lt;span style=";font-family:&amp;quot;;font-size:7;"  &gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;Techniques for going faster, yet staying sustainable (like my hiking sticks)&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpLast" style="text-indent: -0.25in;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style=""&gt;&lt;span style=""&gt;3)&lt;span style=";font-family:&amp;quot;;font-size:7;"  &gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;Metrics for judging progress and speed of the pace&lt;/p&gt;  &lt;p class="MsoNormal"&gt;For now, I’d like to focus only on the 1st question, what metrics do you use to tell if you are going too slow, or going too fast?&lt;/p&gt;&lt;meta name="Generator" content="Microsoft Word 12"&gt;&lt;meta name="Originator" content="Microsoft Word 12"&gt;&lt;link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CLLEWEL%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml"&gt;&lt;link rel="themeData" href="file:///C:%5CDOCUME%7E1%5CLLEWEL%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx"&gt;&lt;link rel="colorSchemeMapping" href="file:///C:%5CDOCUME%7E1%5CLLEWEL%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml"&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:worddocument&gt;   &lt;w:view&gt;Normal&lt;/w:View&gt;   &lt;w:zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:trackmoves/&gt;   &lt;w:trackformatting/&gt;   &lt;w:punctuationkerning/&gt;   &lt;w:validateagainstschemas/&gt;   &lt;w:saveifxmlinvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:ignoremixedcontent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:alwaysshowplaceholdertext&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:donotpromoteqf/&gt;   &lt;w:lidthemeother&gt;EN-US&lt;/w:LidThemeOther&gt;   &lt;w:lidthemeasian&gt;X-NONE&lt;/w:LidThemeAsian&gt;   &lt;w:lidthemecomplexscript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt;   &lt;w:compatibility&gt;    &lt;w:breakwrappedtables/&gt;    &lt;w:snaptogridincell/&gt;    &lt;w:wraptextwithpunct/&gt;    &lt;w:useasianbreakrules/&gt;    &lt;w:dontgrowautofit/&gt;    &lt;w:splitpgbreakandparamark/&gt;    &lt;w:dontvertaligncellwithsp/&gt;    &lt;w:dontbreakconstrainedforcedtables/&gt;    &lt;w:dontvertalignintxbx/&gt;    &lt;w:word11kerningpairs/&gt;    &lt;w:cachedcolbalance/&gt;   &lt;/w:Compatibility&gt;   &lt;w:browserlevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;   &lt;m:mathpr&gt;    &lt;m:mathfont val="Cambria Math"&gt;    &lt;m:brkbin val="before"&gt;    &lt;m:brkbinsub val="&amp;#45;-"&gt;    &lt;m:smallfrac val="off"&gt;    &lt;m:dispdef/&gt;    &lt;m:lmargin val="0"&gt;    &lt;m:rmargin val="0"&gt;    &lt;m:defjc val="centerGroup"&gt;    &lt;m:wrapindent val="1440"&gt;    &lt;m:intlim val="subSup"&gt;    &lt;m:narylim val="undOvr"&gt;   &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:latentstyles deflockedstate="false" defunhidewhenused="true" defsemihidden="true" defqformat="false" defpriority="99" latentstylecount="267"&gt;   &lt;w:lsdexception locked="false" priority="0" semihidden="false" unhidewhenused="false" qformat="true" name="Normal"&gt;   &lt;w:lsdexception locked="false" priority="9" semihidden="false" unhidewhenused="false" qformat="true" name="heading 1"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 2"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 3"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 4"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 5"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 6"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 7"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 8"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 9"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 1"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 2"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 3"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 4"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 5"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 6"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 7"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 8"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 9"&gt;   &lt;w:lsdexception locked="false" priority="35" qformat="true" name="caption"&gt;   &lt;w:lsdexception locked="false" priority="10" semihidden="false" unhidewhenused="false" qformat="true" name="Title"&gt;   &lt;w:lsdexception locked="false" priority="1" name="Default Paragraph Font"&gt;   &lt;w:lsdexception locked="false" priority="11" semihidden="false" unhidewhenused="false" qformat="true" name="Subtitle"&gt;   &lt;w:lsdexception locked="false" priority="22" semihidden="false" unhidewhenused="false" qformat="true" name="Strong"&gt;   &lt;w:lsdexception locked="false" priority="20" semihidden="false" unhidewhenused="false" qformat="true" name="Emphasis"&gt;   &lt;w:lsdexception locked="false" priority="59" semihidden="false" unhidewhenused="false" name="Table Grid"&gt;   &lt;w:lsdexception locked="false" unhidewhenused="false" name="Placeholder Text"&gt;   &lt;w:lsdexception locked="false" priority="1" semihidden="false" unhidewhenused="false" qformat="true" name="No Spacing"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 1"&gt;   &lt;w:lsdexception locked="false" unhidewhenused="false" name="Revision"&gt;   &lt;w:lsdexception locked="false" priority="34" semihidden="false" unhidewhenused="false" qformat="true" name="List Paragraph"&gt;   &lt;w:lsdexception locked="false" priority="29" semihidden="false" unhidewhenused="false" qformat="true" name="Quote"&gt;   &lt;w:lsdexception locked="false" priority="30" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Quote"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="19" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Emphasis"&gt;   &lt;w:lsdexception locked="false" priority="21" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Emphasis"&gt;   &lt;w:lsdexception locked="false" priority="31" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Reference"&gt;   &lt;w:lsdexception locked="false" priority="32" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Reference"&gt;   &lt;w:lsdexception locked="false" priority="33" semihidden="false" unhidewhenused="false" qformat="true" name="Book Title"&gt;   &lt;w:lsdexception locked="false" priority="37" name="Bibliography"&gt;   &lt;w:lsdexception locked="false" priority="39" qformat="true" name="TOC Heading"&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;style&gt; &lt;!--  /* Font Definitions */  @font-face 	{font-family:"Cambria Math"; 	panose-1:2 4 5 3 5 4 6 3 2 4; 	mso-font-charset:0; 	mso-generic-font-family:roman; 	mso-font-pitch:variable; 	mso-font-signature:-1610611985 1107304683 0 0 159 0;} @font-face 	{font-family:Calibri; 	panose-1:2 15 5 2 2 2 4 3 2 4; 	mso-font-charset:0; 	mso-generic-font-family:swiss; 	mso-font-pitch:variable; 	mso-font-signature:-1610611985 1073750139 0 0 159 0;}  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{mso-style-unhide:no; 	mso-style-qformat:yes; 	mso-style-parent:""; 	margin-top:0in; 	margin-right:0in; 	margin-bottom:10.0pt; 	margin-left:0in; 	line-height:115%; 	mso-pagination:widow-orphan; 	font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:Calibri; 	mso-fareast-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi;} p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph 	{mso-style-priority:34; 	mso-style-unhide:no; 	mso-style-qformat:yes; 	margin-top:0in; 	margin-right:0in; 	margin-bottom:10.0pt; 	margin-left:.5in; 	mso-add-space:auto; 	line-height:115%; 	mso-pagination:widow-orphan; 	font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:Calibri; 	mso-fareast-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi;} p.MsoListParagraphCxSpFirst, li.MsoListParagraphCxSpFirst, div.MsoListParagraphCxSpFirst 	{mso-style-priority:34; 	mso-style-unhide:no; 	mso-style-qformat:yes; 	mso-style-type:export-only; 	margin-top:0in; 	margin-right:0in; 	margin-bottom:0in; 	margin-left:.5in; 	margin-bottom:.0001pt; 	mso-add-space:auto; 	line-height:115%; 	mso-pagination:widow-orphan; 	font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:Calibri; 	mso-fareast-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi;} p.MsoListParagraphCxSpMiddle, li.MsoListParagraphCxSpMiddle, div.MsoListParagraphCxSpMiddle 	{mso-style-priority:34; 	mso-style-unhide:no; 	mso-style-qformat:yes; 	mso-style-type:export-only; 	margin-top:0in; 	margin-right:0in; 	margin-bottom:0in; 	margin-left:.5in; 	margin-bottom:.0001pt; 	mso-add-space:auto; 	line-height:115%; 	mso-pagination:widow-orphan; 	font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:Calibri; 	mso-fareast-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi;} p.MsoListParagraphCxSpLast, li.MsoListParagraphCxSpLast, div.MsoListParagraphCxSpLast 	{mso-style-priority:34; 	mso-style-unhide:no; 	mso-style-qformat:yes; 	mso-style-type:export-only; 	margin-top:0in; 	margin-right:0in; 	margin-bottom:10.0pt; 	margin-left:.5in; 	mso-add-space:auto; 	line-height:115%; 	mso-pagination:widow-orphan; 	font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:Calibri; 	mso-fareast-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi;} .MsoChpDefault 	{mso-style-type:export-only; 	mso-default-props:yes; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:Calibri; 	mso-fareast-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi;} .MsoPapDefault 	{mso-style-type:export-only; 	margin-bottom:10.0pt; 	line-height:115%;} @page Section1 	{size:8.5in 11.0in; 	margin:1.0in 1.0in 1.0in 1.0in; 	mso-header-margin:.5in; 	mso-footer-margin:.5in; 	mso-paper-source:0;} div.Section1 	{page:Section1;}  /* List Definitions */  @list l0 	{mso-list-id:1484081217; 	mso-list-type:hybrid; 	mso-list-template-ids:879819036 67698705 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;} @list l0:level1 	{mso-level-text:"%1\)"; 	mso-level-tab-stop:none; 	mso-level-number-position:left; 	text-indent:-.25in;} ol 	{margin-bottom:0in;} ul 	{margin-bottom:0in;} --&gt; &lt;/style&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt;  /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:"Table Normal"; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-qformat:yes; 	mso-style-parent:""; 	mso-padding-alt:0in 5.4pt 0in 5.4pt; 	mso-para-margin-top:0in; 	mso-para-margin-right:0in; 	mso-para-margin-bottom:10.0pt; 	mso-para-margin-left:0in; 	line-height:115%; 	mso-pagination:widow-orphan; 	font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin;} &lt;/style&gt; &lt;![endif]--&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6889884053798500413-5238423490440204361?l=llewellynfalco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://llewellynfalco.blogspot.com/feeds/5238423490440204361/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6889884053798500413&amp;postID=5238423490440204361' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/5238423490440204361'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/5238423490440204361'/><link rel='alternate' type='text/html' href='http://llewellynfalco.blogspot.com/2008/07/what-incas-taught-me-about-sustainable.html' title='What the Inca’s taught me about Sustainable Pace.'/><author><name>&lt;a href="http://www.twitter.com/llewellynfalco"&gt;@Llewellyn Falco&lt;/a&gt;</name><uri>http://www.blogger.com/profile/11668997629228826023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_s2oZS5jFv1g/SPTCNxT1pyI/AAAAAAAAABI/bW8VaJ-Hlwk/S220/Llew.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_s2oZS5jFv1g/SIiuJ7v5NnI/AAAAAAAAAAM/AYR9cirMdaQ/s72-c/Inca-Trail.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6889884053798500413.post-2354627985886412897</id><published>2008-07-06T08:11:00.001-07:00</published><updated>2008-07-06T08:50:36.640-07:00</updated><title type='text'>How to rip audio books</title><content type='html'>So i listen to  a lot of audio books, and here's how i create the mp3 of them.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Overview&lt;/span&gt;&lt;br /&gt;we are going to create bite size files about 30 minutes each. then label them, and create the id tags. finally we'll attach a picture.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Make sure the book is &lt;span style="font-weight: bold;"&gt;UNABRIDGED&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;1) get a ipod - i prefer the nano. http://www.apple.com/ipodnano/&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ripping&lt;/span&gt;&lt;br /&gt;2) download audiograbber &amp;amp; install. http://www.audiograbber.com-us.net/&lt;br /&gt;3) download lame encoder  &amp;amp; install.  http://jthz.com/~lame/&lt;br /&gt;4) set your encoding bitrate to 64k &amp;amp; stereo, this is a &lt;span style="font-weight: bold;"&gt;very&lt;/span&gt; high quality audio book.&lt;br /&gt;5) select the last track and copy the end location, paste this into the end location for the 2nd track. To do this double click a track. select the Sectors&gt;Last. copy.&lt;br /&gt;6) select and copy the end location for a middle track (usually around 150,000)&lt;br /&gt;7) paste the middle as the end of track 1 and beginning of track 2&lt;br /&gt;8) rip&lt;br /&gt;tips) i like setting the auto query of FreeDB, setting the disk to eject when finished, and not auto selecting all the tracks by default&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Naming &amp;amp; Labeling.&lt;/span&gt;&lt;br /&gt;the file should look like:&lt;br /&gt;Keith Ferrazzi - Never eat alone [02x20] Don't Keep Score.mp3&lt;br /&gt;&lt;br /&gt;usually i don't know the chapter names so they are blank.&lt;br /&gt;9) The total number of tracks is #cds X 2 (so this book is 10 cd's)&lt;br /&gt;10) The labeling schema looks like this - *author - *title [*trackx*totaltracks]*chapter.mp3&lt;br /&gt;11) after the files are named, you need to set the idtags, so download jj mp3 renamer http://software.jensjj.dk/uk/welcome.html&lt;br /&gt;12) add files&lt;br /&gt;13) select files&lt;br /&gt;14) first i convert from filename to ID3 Tag (both) using the format&lt;br /&gt;*Artist - *Album [*Trackx*Comment].mp3&lt;br /&gt;15) then i convert from filename to ID3 Tag again, but using the format&lt;br /&gt;*Artist - *Title.mp3&lt;br /&gt;16) Last, to add the photo add these files to itunes (drag and drop), select them, right click and pick info, then drag a photo from your web browser, i usually do a image lookup on google to find it.&lt;br /&gt;&lt;br /&gt;And there you go...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6889884053798500413-2354627985886412897?l=llewellynfalco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://llewellynfalco.blogspot.com/feeds/2354627985886412897/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6889884053798500413&amp;postID=2354627985886412897' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/2354627985886412897'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6889884053798500413/posts/default/2354627985886412897'/><link rel='alternate' type='text/html' href='http://llewellynfalco.blogspot.com/2008/07/how-to-rip-audio-books.html' title='How to rip audio books'/><author><name>&lt;a href="http://www.twitter.com/llewellynfalco"&gt;@Llewellyn Falco&lt;/a&gt;</name><uri>http://www.blogger.com/profile/11668997629228826023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_s2oZS5jFv1g/SPTCNxT1pyI/AAAAAAAAABI/bW8VaJ-Hlwk/S220/Llew.jpg'/></author><thr:total>1</thr:total></entry></feed>
