<?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-132016627730443140</id><updated>2011-07-28T06:46:02.955-07:00</updated><category term='Work'/><category term='Home'/><category term='Design Smell'/><category term='refactoring'/><category term='Lugaru'/><category term='Christmas'/><category term='Big Design'/><category term='Code Smell'/><category term='random'/><title type='text'>Dave's Place</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://davidkfaulk.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://davidkfaulk.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12551970868049421727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>26</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-132016627730443140.post-2984121582388001778</id><published>2010-05-23T18:55:00.000-07:00</published><updated>2010-05-27T21:49:41.379-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lugaru'/><category scheme='http://www.blogger.com/atom/ns#' term='refactoring'/><title type='text'>Lugaru - Part 5</title><content type='html'>In my previous post (Lugaru - Part 4) the first problem I identified was the role and responsibility of the &lt;span style="font-family:courier new;"&gt;Weapons&lt;/span&gt; class.  Namely, a single instance of &lt;span style="font-family:courier new;"&gt;Weapons&lt;/span&gt; represented 30 weapons when it should only represent one.  The refactoring exercise to correct this started off as a philosophical one, but ended up being VERY beneficial.  I'm very happy I did this before tackling the implementation details of &lt;span style="font-family:courier new;"&gt;Weapons&lt;/span&gt;.  Here are the major steps I took.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Renamed &lt;span style="font-family:courier new;"&gt;Weapons &lt;/span&gt;to &lt;span style="font-family:courier new;"&gt;Weapon&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;Globals.cpp holds the global instantion of Weapons.  It went from this:&lt;/li&gt;&lt;/ol&gt;&lt;pre&gt;&lt;blockquote&gt;&lt;blockquote&gt;Weapons weapons;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;/pre&gt;  &lt;blockquote&gt;to this:&lt;pre&gt;&lt;blockquote&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;const unsigned int&lt;/span&gt; max_weaponinstances = 20;&lt;br /&gt;Weapon weapons[max_weaponinstances];&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;unsigned int&lt;/span&gt; numweapons;&lt;/blockquote&gt;&lt;/pre&gt;The max_weaponinstances constant comes from Weapons.h.&lt;/blockquote&gt;&lt;ol&gt;&lt;li value="3"&gt;With max_weaponinstances moved out of Weapons.h, all of the Weapons' attributes that were arrays become single instances.  This is because the class is no longer maintaining the state of multiple weapons, just one.  There were 44 places this had to be done.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The Weapons class has four class operations - a constructor, destructor, and two others.  One called "doStuff" that updates the game state of all the weapons.  The other is called "draw" which pushes the weapon illustration down the graphics rendering pipeline.  At the top of these two operations are for-loops that iterate over all the weapons in use (stored in numweapons).  Those are gone.  Instead, they now appear in &lt;span style="font-family:courier new;"&gt;GameDraw.cpp.&lt;br /&gt;&lt;/span&gt;  There were 823 instances of referencing the loop counters in Weapon.cpp&lt;/li&gt;&lt;li&gt;Classes that are dependent on weapons have a slightly different syntax.  As an example, in Person.cpp it used to read:&lt;/li&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;blockquote&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;if&lt;/span&gt;(weapons.type[weaponids[weaponactive]]==knife) ...&lt;/blockquote&gt;&lt;/pre&gt;but now reads:&lt;pre&gt;&lt;blockquote&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;if&lt;/span&gt;(weapons[weaponids[weaponactive]].type==knife) ...&lt;/blockquote&gt;&lt;/pre&gt;I find the new way much more readable since it puts the weapon attribute closed to the thing its being compared to.&lt;/blockquote&gt;&lt;li value="6"&gt;Weapons used to contain texture information.  In the original design, these would only be registered with OpenGL once.  In the new design I didn't want 50 weapons registering the same textures 50 times.  To get around this, I made the texture id's global, (*GASP*).  I rationalized that refactoring is about going from bad to better, and this let me move on quickly.  I have no intention of leaving it this way long term.&lt;/li&gt;&lt;/ol&gt;Overall, I think this left the code MUCH more readable and improved some design aspects of Lugaru weapons.  Next up will be getting some unstanding on the Weapons implementation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/132016627730443140-2984121582388001778?l=davidkfaulk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkfaulk.blogspot.com/feeds/2984121582388001778/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=132016627730443140&amp;postID=2984121582388001778' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/2984121582388001778'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/2984121582388001778'/><link rel='alternate' type='text/html' href='http://davidkfaulk.blogspot.com/2010/05/lugaru-part-5.html' title='Lugaru - Part 5'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12551970868049421727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-132016627730443140.post-462546557830442538</id><published>2010-05-18T07:12:00.001-07:00</published><updated>2010-05-18T08:55:04.394-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lugaru'/><category scheme='http://www.blogger.com/atom/ns#' term='refactoring'/><title type='text'>Lugaru - Part 4.1</title><content type='html'>As a quick addendum to Part 4, I realize that enumerations can't be used for &lt;em&gt;every&lt;/em&gt; constant since enum values can only be integer types. The gravity constant example I used in the previous post would need to be represented as a &lt;span style="font-family:courier new;"&gt;const float&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Also, for further reading on this, I'd point you to Scott Meyer's "&lt;a href="http://www.amazon.com/Effective-Specific-Improve-Programs-Designs/dp/0321334876/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1274198013&amp;amp;sr=8-1"&gt;Effective C++ Third Edition&lt;/a&gt;" Item 2, "Prefer &lt;span style="font-family:courier new;"&gt;consts&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;enums&lt;/span&gt;, and &lt;span style="font-family:courier new;"&gt;inlines&lt;/span&gt; to &lt;span style="font-family:courier new;"&gt;#defines&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;And for you eager beavers that want to start reading on the polymorphic weapon heirarchy, check out "&lt;a href="http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1274198065&amp;amp;sr=1-1-spell"&gt;Refactoring - Improving the Design of Existing Code&lt;/a&gt;" by Martin Fowler. Specifically, the section on Switch Statements in chapter 3 "Bad Smells in Code" and "Replace Type Code with Subclasses" in Chapter 8.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/132016627730443140-462546557830442538?l=davidkfaulk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkfaulk.blogspot.com/feeds/462546557830442538/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=132016627730443140&amp;postID=462546557830442538' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/462546557830442538'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/462546557830442538'/><link rel='alternate' type='text/html' href='http://davidkfaulk.blogspot.com/2010/05/lugaru-part-41.html' title='Lugaru - Part 4.1'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12551970868049421727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-132016627730443140.post-7403248218565591834</id><published>2010-05-17T19:51:00.000-07:00</published><updated>2010-05-18T04:55:58.943-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Code Smell'/><category scheme='http://www.blogger.com/atom/ns#' term='Lugaru'/><category scheme='http://www.blogger.com/atom/ns#' term='refactoring'/><category scheme='http://www.blogger.com/atom/ns#' term='Design Smell'/><title type='text'>Lugaru - Part 4</title><content type='html'>I'm excited to announce that by my fourth post on Lugaru, I have doubled my subscribers!  Now in addition to my sister, I have the creator of Lugaru following.  Hopefully my mother will subscribe and triple my readership in a single month...&lt;br /&gt;&lt;br /&gt;Well, after spending a weekend tinkering with the code, I finally have a running version of Lugaru for Windows.  Having a running application will allow me to do two things:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Experience Lugaru as a player with the benefit of stopping the game any any point I choose to look at the game's state in code.&lt;/li&gt;&lt;li&gt;Verify any changes I make don't cause unintended consequences in the game.  Remember, refactoring is about improving the design of software without changing its outward functionality.&lt;/li&gt;&lt;/ol&gt;After poking around, I've fallen in love with the file containing the game's logic of weapons.  In the CodeCity, the yellow building below is the "Weapons" class.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Xg7R-ohPD90/S_ICtoColmI/AAAAAAAAAU8/jQwJ-fWXQqg/s1600/lugaru.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 180px;" src="http://3.bp.blogspot.com/_Xg7R-ohPD90/S_ICtoColmI/AAAAAAAAAU8/jQwJ-fWXQqg/s320/lugaru.PNG" alt="" id="BLOGGER_PHOTO_ID_5472439480074409570" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Why start with weapons?  Well, think about how you can take a human being and decompose it into mind, body, and soul.  You can then decompose the body into systems (nervous, digestive, circulatory, etc).  Decompose circulatory to heart, arteries, veins... all the way down to the point of cells and molecules and atoms.  Object Oriented programming does the same thing - takes a complex problem and breaks into into manageable pieces while also defining the interactions between those pieces.  If you were going to redo the human body (lawl) you'd either want to start by identifying problems at the macro- or micro- level.  "Weapons" to me is the micro of Lugaru.&lt;br /&gt;&lt;br /&gt;Okay, so enough intro to programming.  Let's dive in to Weapons...&lt;br /&gt;&lt;br /&gt;Unfortunately, we break our necks because we hit the shallows!  Let's talk about the file name "Weapons."  It's named that because it contains the class "Weapons."&lt;br /&gt;&lt;blockquote&gt;Design Smell #1: Class name is plural&lt;/blockquote&gt;&lt;br /&gt;A golden rule of OO programming is that classes represent a single representation of something.  If you need multiples of that something, you instantiate multiple objects of that class.  As it stands, a single instance of "Weapons" handles 30 weapon objects.  When we get further into the code, we'll see the issues that creates.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Code Smell #1: Favoring #defines for constants&lt;/blockquote&gt;&lt;br /&gt;Some quantities in a game never change, for example the downward pull of gravity as 9.81.  That quantity could be reproduced all over the game's files.  If you want to change that to a more precise number or change it from metric to imperial units, however, you'd have to go hunting for every single place you typed "9.81".  Heaven help you if you over-look a place!  That's why you use a constant.  A constant says, "I am defining this word to represent this quantity."  You can then use that word all over your game, and if you need to change the quantity down the road, you only have to change it in one place, the word doesn't change!&lt;br /&gt;&lt;br /&gt;In C++ there are multiple ways to create a constant.  The Wolfire team chose to use #defines.&lt;br /&gt;&lt;pre&gt;&lt;blockquote&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;#define&lt;/span&gt; max_weapons 30&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;#define&lt;/span&gt; max_weaponinstances 20&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;#define&lt;/span&gt; knife 1&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;#define&lt;/span&gt; sword 2&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;#define&lt;/span&gt; staff 3&lt;/blockquote&gt;&lt;/pre&gt;Using #defines for constants are not good for several reasons.  First, a #define is a pre-processor directive.  It's a very low-level command that literally replaces every instance of the token with the quantity before processing the file.  If something about the quantity causing a compile error, there's no way for the compiler to acknowledge the #define macro.  Let's pretend a clumsy programmer fat-fingered some extra characters into the knife macro:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;#define&lt;/span&gt; knife 1dkf&lt;/pre&gt;&lt;/blockquote&gt;The next time the program was compiled, he'd get a slew of errors (I got 145 when I tried it.)  The first three errors I got were against the following line of code:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;if&lt;/span&gt;(type==knife)&lt;/pre&gt;&lt;/blockquote&gt;and the errors were:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;syntax error: 'bad suffix on number' &lt;span style="font-size:85%;"&gt;[ed. I see no number here]&lt;/span&gt;&lt;/li&gt;&lt;li&gt;syntax error: missing ')' before identifier 'dkf' &lt;span style="font-size:85%;"&gt;[ed. I see no dkf here]&lt;/span&gt;&lt;/li&gt;&lt;li&gt;syntax error: ')' &lt;span style="font-size:85%;"&gt;[ed. I don't even know what this means!]&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;Yes, I realize the IDE you're developing in might give you some tips, but there are other problems with this approach.  Second, #defines do not offer compile-time type checking - a big feature of C++.  Since #defines are token replacements, the compiler has no problem with the following:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;int &lt;/span&gt;weapon_type = max_weaponinstances;&lt;br /&gt;weapon_type = rabbittype;&lt;br /&gt;weapon_type = tracheotomy;&lt;/pre&gt;&lt;/blockquote&gt;All of which are macros in Lugaru that are associated with integers, none of which are associated with weapon types.  This, coincidentally is why using&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;static const int&lt;/span&gt; knife = 1;&lt;/pre&gt;&lt;/blockquote&gt;Is better than a #define but still has problems.  That's why I like enumerations.  They allow you to group constants and get compile-time type checking.  The weapon constants we saw above are re-written as:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;enum &lt;/span&gt;Weapon_type&lt;br /&gt;{&lt;br /&gt; knife = 1,&lt;br /&gt; sword = 2,&lt;br /&gt; staff = 3&lt;br /&gt;};&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;And that means the 'type' attribute in the Weapons class can go from an integer to a Weapon_type.  That gives a reader a much clearer idea about what the valid values of 'type' are.&lt;br /&gt;&lt;br /&gt;Of course, the penultimate solution is to replace these type codes with polymorphic classes, but refactoring is about going from 'bad' to 'better' one step at a time (as opposed to 'bad' to 'perfect' in one giant leap.)  Are there better ways to define constants?  What advantages do the alternatives have over my proposal?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/132016627730443140-7403248218565591834?l=davidkfaulk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkfaulk.blogspot.com/feeds/7403248218565591834/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=132016627730443140&amp;postID=7403248218565591834' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/7403248218565591834'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/7403248218565591834'/><link rel='alternate' type='text/html' href='http://davidkfaulk.blogspot.com/2010/05/lugaru-part-4.html' title='Lugaru - Part 4'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12551970868049421727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Xg7R-ohPD90/S_ICtoColmI/AAAAAAAAAU8/jQwJ-fWXQqg/s72-c/lugaru.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-132016627730443140.post-9138584102680241958</id><published>2010-05-13T21:24:00.000-07:00</published><updated>2010-05-14T06:40:15.346-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lugaru'/><category scheme='http://www.blogger.com/atom/ns#' term='refactoring'/><title type='text'>Lugaru - Part 3</title><content type='html'>Several months ago I was introduced to &lt;a href="http://www.inf.usi.ch/phd/wettel/codecity.html"&gt;CodeCity &lt;/a&gt;by Richard Wettel.  In his words:&lt;br /&gt;&lt;blockquote&gt;CodeCity is an integrated environment for software analysis, in which  software systems are visualized as interactive, navigable 3D cities.              The classes are represented as buildings in the city, while  the packages are depicted as the districts in which the buildings  reside.              The visible properties of the city artifacts depict a set of  chosen software metrics, as in the polymetric views              of CodeCrawler.&lt;br /&gt;&lt;/blockquote&gt;It's been a fun little program for visualizing applications.  Here is the code city for Lugaru, (I added the class names to the two largest classes!)&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Xg7R-ohPD90/S-zWj_PBBNI/AAAAAAAAAU0/Kxil5usUw3g/s1600/lugaru.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 180px;" src="http://3.bp.blogspot.com/_Xg7R-ohPD90/S-zWj_PBBNI/AAAAAAAAAU0/Kxil5usUw3g/s320/lugaru.PNG" alt="" id="BLOGGER_PHOTO_ID_5470983561106490578" border="0" /&gt;&lt;/a&gt;The length and width of the buildings are scaled according to the number of attributes in the class.  The height is scaled according to the number of operations.  I don't have the application available to me as of this writing, but I seem to recall the Person class having ~250 attributes to give you a sense of scale.&lt;br /&gt;&lt;br /&gt;So the question is where to start.  Some would say start at the highest level class, some would say start with the 800-pound gorilla in the application (i.e. "Person").&lt;br /&gt;&lt;br /&gt;According to the paper in my previous post, before any code changes start, I should have test cases in place to ensure that the behavior before the refactoring is the same afterward.  How am I going to test this thing?!  And before testing, I've got to get the thing running.  I'm curious if it's working out of the box for anyone else.  Wolfire IRC says no.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/132016627730443140-9138584102680241958?l=davidkfaulk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkfaulk.blogspot.com/feeds/9138584102680241958/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=132016627730443140&amp;postID=9138584102680241958' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/9138584102680241958'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/9138584102680241958'/><link rel='alternate' type='text/html' href='http://davidkfaulk.blogspot.com/2010/05/lugaru-part-3_13.html' title='Lugaru - Part 3'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12551970868049421727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Xg7R-ohPD90/S-zWj_PBBNI/AAAAAAAAAU0/Kxil5usUw3g/s72-c/lugaru.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-132016627730443140.post-1087826698579673130</id><published>2010-05-13T20:19:00.000-07:00</published><updated>2010-05-13T21:22:02.284-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lugaru'/><category scheme='http://www.blogger.com/atom/ns#' term='refactoring'/><title type='text'>Lugaru - Part 2</title><content type='html'>&lt;span style="font-size:100%;"&gt;So before I jump into Lugaru code, I feel like I need to make sure the foundation is laid for what I'm doing.  I intend to refactor portions of Lugaru in order to increase the ease of extending it.  For those unfamiliar with refactoring, here is a paper I wrote with Mark Ward for a class we took in the spring on OO Analysis and Design.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;A Framework for Effective Refactoring&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Abstract&lt;/span&gt;&lt;br /&gt;Refactoring is a method of applying a series of small transformations to existing code—without affecting its external behavior—in order to make the code as a&lt;br /&gt;whole more understandable and thus more maintainable and less error-prone.  The decision to refactor can be controversial—especially to management—given that resources are being expended for reasons other than adding revenue-generating functionality. Our position is that periodic refactoring is an effective means to improve the long-term viability of a software system by ensuring that the code remains fresh and readily adaptable and extensible to changes in requirements or the addition of new functionality.  As such, refactoring makes sense from both a technical and a managerial perspective.  We briefly introduce the topic of refactoring and discuss opposing viewpoints, and we then propose a five-step framework defining the high-level process that we believe is essential to ensure successful refactoring.  We conclude with two case studies to illustrate the application of the five-step framework.&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;1. Introduction&lt;/span&gt;&lt;br /&gt;Software systems evolve over time as requirements change and new features are added.  During this period of evolution, the quality of the code can degrade as changes are made that the original design may not have foreseen and thus may not accommodate cleanly.  Other times changes are made under schedule pressure without time to consider design impacts on maintainability, extensibility, testability, and other quality considerations.  Such code can become difficult to understand, increasing the likelihood of injecting defects during future updates.  Even the most carefully-conceived initial system designs are susceptible to these problems as the system evolves in unforeseen ways.  Just as the highest-quality cars require tune-ups, so too do the best software systems.  The process for “software tune-ups” is known as “refactoring.”&lt;br /&gt;Refactoring is a method of applying a series of small transformations to existing code—without affecting its external behavior—in order to improve the qualitative characteristics of the design.  In doing so the code as a whole becomes more understandable and thus more maintainable and less error-prone.&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;2. Why Refactor?&lt;/span&gt;&lt;br /&gt;Refactoring asserts that the design of a software system is not a single event [1].  An engineer that regularly refactors his code is continuously reassessing the design of the system and asking if it is still has acceptable characteristics of quality software (e.g. “Can I easily extend the system to include next month’s feature list?”).  When software no longer has those levels of quality, it is wise to revisit the design of the software.&lt;br /&gt;When software is not refactored, those classes with design issues become more change-prone [4].  As a result, they can create bottlenecks in development (since multiple developers will need to modify the same class) and the risk of error injection increases.&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;3. When to Refactor&lt;/span&gt;&lt;br /&gt;Fowler [1] does not recommend scheduling time to refactor.  It’s something you do “all the time in little bursts.” He also argues that “not having enough time” is usually a sign that you need to refactor; the reason you don’t have enough time is likely because the code is not as maintainable or extensible as it should be, causing your current effort to take longer than it should.&lt;br /&gt;In addition to code smells, other indicators have been proposed to help drive the decision to refactor.  One such indicator is change smells [3].  Change smells are not visible in the code, but are detected by analyzing change dependencies mined from the software’s change history to predict areas that would benefit from refactoring.&lt;br /&gt;Another proposed indicator is architectural smells [6].  This technique is intended to complement existing techniques identified for addressing code smells by looking for “high-impact” (i.e., high benefit) architecture-related refactoring opportunities based on “architectural violations.”&lt;br /&gt;The authors of Code Complete remind us that, “The number of refactorings that would be beneficial to any specific program is essentially infinite” [7]. Consider the following guidelines when deciding which refactorings are most important:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Modules that are difficult to read&lt;/li&gt;&lt;li&gt;Modules with complex conditional logic&lt;/li&gt;&lt;li&gt;Modules that are error-prone&lt;/li&gt;&lt;li&gt;High-complexity modules&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:130%;"&gt;4. When Not to Refactor&lt;br /&gt;&lt;/span&gt;There are times, however, when refactoring is not a prudent course of action.  One instance is when the software becomes so bug-ridden that it should be rewritten rather than reorganized.  Fowler suggests working through this by encapsulating the components of the system and then examining each one to see if it needs to be rewritten.&lt;br /&gt;Another inopportune moment for refactoring is near an impending deadline.  Recall that the motivation for refactoring is to increase quality characteristics without changing functionality.  It serves no purpose to do this right before the system is shipped.  This isn’t to be confused with “not having time to refactor” which could be an indication that a lot of time and energy is being exerted to further a bad design.&lt;br /&gt;Other situations that would prevent you from refactoring would be if the software is tied to components outside the engineer’s control.  If the external interfaces are solidified with a sub-contractor or company data-base, the extent to which a refactoring can occur can be limited [8].&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;br /&gt;5. Opposing Viewpoints&lt;/span&gt;&lt;br /&gt;Many references are made to refactoring being a controversial topic, yet there is surprisingly little formally-published literature offering a defense of opposing viewpoints – perhaps because most of the published work tends to be academic in nature, focusing on the technical merits rather than management considerations, where much of the controversy lies.  Discussion of dissenting opinions can more readily be found in web-published articles and online discussion forums, however.&lt;br /&gt;While not practical to address every criticism of refactoring that we found, we will briefly acknowledge several and present our viewpoint on the discussion.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Managers believe developers should be adding features, not reworking old code [10].&lt;/span&gt;  It is easy to understand how refactoring can be a hard sell to management.  A manager is concerned with trying to get their product delivered within schedule and budgetary constraints.  Most projects overrun one or both of these constraints.  Especially on a project that is projected to be late or over budget, refactoring can seem like a non-value-added task since time is being spent but no new revenue-generating features are being added to show for it.  We have already discussed that there are times when refactoring may not be not appropriate, such as when a deadline is looming.  However, for managers who frown on refactoring at any time in the project’s lifecycle, perhaps Martin Fowler offered the best suggestion: don’t even tell your manager that you are refactoring [1].  While certainly a controversial suggestion, his argument is that software developers are professionals who want to build effective software as rapidly as they can.  Refactoring helps you develop faster, therefore it can just be integrated as part of the development process and not viewed as a separate activity for which you need to request specific approval from your management. &lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Refactoring is nothing more than an act of “beautification” [9].&lt;/span&gt;  While in a sense this is partially true, the chosen term clearly implies a disdain toward refactoring.  Similar – and harsher – criticisms suggest that refactoring is a “waste of resources and a get out of jail free card for incompetent developers” [11], and “basically a programmer’s ego trip and nothing else” [5].  Ouch.  These criticisms seem to be based on the premise that “there is not much point doing afterwards what can be done from the start” [9]. We would argue that no one has suggested that code should initially be written poorly and later “beautified.”  However, management pressures often force developers to release code as soon as it works rather than allowing time to optimize it “from the start” for understandability and maintainability [11].  Furthermore, ongoing updates to the code after the initial release are likely to have a deleterious effect over time—regardless of how well the code was initially written—that at some point must be dealt with through refactoring in order to keep the code understandable and maintainable.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Any code change is an opportunity for error injection [9].&lt;/span&gt; This is absolutely correct.  However, the purpose of having a complete set of test cases that you run pre- and post-refactoring, and to refactor in small steps with testing between each step, is to mitigate the potential for undetected error injection to the point that it is almost negligible.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Refactoring leads to considerable extra effort in adapting the unit test suite [9].&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Refactoring is nothing new – all the techniques have been around for years [8] [3].&lt;/span&gt; This is largely true, but it is still immensely useful to give this set of best practices and techniques a name and catalogue them with examples and guidelines for when they are and are not applicable in order to efficiently disseminate this collective body of knowledge to developers.&lt;/li&gt;&lt;/ol&gt;  While some refactoring techniques (e.g., moving a method from one class to another) will require at least some unit test rework, most do not.  If you have a complete suite of unit tests already in place, which should be the case even if you are not planning to refactor, then the impact due to most refactorings is likely to be minimal.  In some cases, however, this criticism is justified (see case study 2, section 7.2); however, we do not believe this is a valid across-the-board criticism.&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;br /&gt;6. Five-step Framework for Refactoring&lt;/span&gt;&lt;br /&gt;To ensure refactoring has a methodical and intended outcome, the authors have created a five-step process for carrying out a refactoring exercise.  It is very important to note that during a refactoring exercise, several design issues may need resolution.  Follow these steps for each issue in series rather than trying to redo it all at once, that way if a step in the process changes the system’s behavior, the injected error will be easier to locate.&lt;br /&gt;6.1. Identify the Need for Refactoring&lt;br /&gt;No journey can begin without a charter and no refactoring can begin without a cause.  As software engineers, we have all come across code that met the requirements and wasn’t “wrong”, but it certainly isn’t “right.”  Kent Beck introduced the concept of code smells – any symptom in the source of a program that possibly indicates a problem.  These code smells are often the first indication that a refactoring is in order.  Martin Fowler [1] popularized the term and catalogued several code smells.&lt;br /&gt;6.2. Establish Test Cases&lt;br /&gt;If the goal of refactoring is to correct issues in software without altering its external behavior, test cases must be in place to ensure that the behavior of the system before the refactoring is the same afterwards.&lt;br /&gt;Having self-verifying tests (i.e. tests that check the software’s output against expected or “truth” values) ensure that the engineer can execute the test suite rapidly and repeatedly.&lt;br /&gt;6.3. Develop a Plan for Design Changes&lt;br /&gt;Just as an engineer would never launch into coding without a design, an engineer engaged in refactoring should never begin without a plan.  The plan should be a concrete list of steps to implement a desired change in the software.  This plan is especially important when the engineer is attempting to increase the encapsulation of a class since the class’s data will be tightly coupled to the rest of the system.&lt;br /&gt;6.4. Implement the Plan&lt;br /&gt;With a plan in place, begin executing it in the order it was laid out.  If an unforeseen problem arises, consider retreating back to Step 3 and see if the overall plan needs to be revised.&lt;br /&gt;6.5. Re-run the Test Cases&lt;br /&gt;Now that the refactoring is complete, the test cases that were established in Step 2 must be rerun.  If the test cases still pass, the refactoring exercise is complete.  If however they fail, the software must be reexamined.&lt;br /&gt;Note that some forms of refactoring such as moving methods from one class to another will break the test environment.  Van Deursen [2] observes that this ideal scenario cannot always be carried out without having to update the tests.&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;7. Case Studies&lt;/span&gt;&lt;br /&gt;In this section, two case studies regarding refactoring are discussed.  The first is a story of a theoretical software application that encounters a dead-end when its developers attempt to extended it.  Refactoring allows the application to become easily extendable.  The second case study involves a software application for an aircraft subsystem and discuses how the designers used refactoring to solve several issues they saw with the software.&lt;br /&gt;7.1. Case Study 1: Burgertime!&lt;br /&gt;A small fast-food store once had a software package that was designed by the store owner’s son.  The software was responsible for tracking all the ingredients used by the store and their various information– purchase date, expiration date, quantity, price, etc.  Given that the store only sold one thing – hamburgers – the number of ingredients was very small.  The owner’s son, not knowing better and having no appreciation for the future, implemented all these as enumerations in a list, as shown:&lt;br /&gt;enum Ingredients&lt;br /&gt;{&lt;br /&gt;buns = 0;&lt;br /&gt;ground_beef = 1;&lt;br /&gt;cheese = 2;&lt;br /&gt;lettuce = 3;&lt;br /&gt;pickles = 4;&lt;br /&gt;mustard = 5;&lt;br /&gt;onions = 6;&lt;br /&gt;};&lt;br /&gt;Referencing information on the ingredients was done in switch-statements where each ingredient was a case.  In all, there were perhaps a dozen switch-statements in a dozen files throughout the application.&lt;br /&gt;The software worked, and the business prospered to the point where the wanted to expand their menu – whole wheat buns, five kinds of cheese, and a complete dessert menu.  Assuming this did well, there was even talk of breaking out and doing more than just hamburgers!&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;7.1.1. Step 1: Identify the Need for Refactoring. &lt;/span&gt;&lt;br /&gt;The owner’s son was commissioned to update the software.  Right away he knew there were problems.  To add a single new item to the application, he had to reopen and modify each switch-statement.  Even if he wanted to hire an additional programmer to help add ingredients to the software package, he couldn’t because they’d be constantly asking each other for file control.  The son also realized that his manageable switch-statements were getting rather long.  While they compiled just fine, he became increasingly uncomfortable looking at a two-page switch-statement and dreaded the day when another programmer would see them.&lt;br /&gt;This unease with the direction of his software was the son’s growing awareness of a code smell.  At a high level, the son failed to encapsulate what would be changing.  As a result, he’s faced with the task of repeatedly modifying the same files with the addition of every new ingredient.  Assuming that he did this in an object-oriented language, he also failed to leverage polymorphism and instead opted for switch-statements.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;7.1.2. Step 2: Establish Test Cases.  &lt;/span&gt;&lt;br /&gt;Resolved to set things right, the son quickly wrote some test scripts that queried the ingredient’s information and compared them to values that he new to be right.  When he’d run the test script, a debug window would simply display a “Tests Pass” message assuming everything was correct.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;7.1.3. Step 3: Develop a Plan for Design Changes.  &lt;/span&gt;&lt;br /&gt;With his test suite in place, the son sat and thought about how he would correct his design.  The simplest approach he came up with would be to have a class called Ingredient.  All the data about an ingredient would now be attributes of the class rather than scattered throughout the software in switch statements.  The array that held an enumeration of ingredients in stock became an array of Ingredient objects.  The blocks of switch-statements became single line calls to the Ingredient’s attribute’s accessor.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;7.1.4. Step 4: Implement the Plan.&lt;/span&gt;&lt;br /&gt;With a plan in place, he implemented it in only a few hours.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;7.1.5. Step 5: Re-run the Test Cases.  &lt;/span&gt;&lt;br /&gt;When he was done, he reran his test scripts to verify that the external behavior of the software had not changed.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;7.1.6. Benefits Achieved.  &lt;/span&gt;&lt;br /&gt;The new software design allowed him to encapsulate what would be changing in future updates.  Adding a new ingredient was as easy as instantiating a new Ingredient object with its unique details completely contained within the object.&lt;br /&gt;&lt;span style="font-size:130%;"&gt;7.2. Case Study 2: Aircraft Subsystem Software&lt;/span&gt;&lt;br /&gt;A software application controlling an aircraft subsystem is the subject of our second case study. This software system is written in C++ and is composed of approximately 650 .cpp (implementation) files and 50 .h (header) files. An extensive number of attributes are required to be initialized upon application startup.  These attributes are scattered among dozens of classes.  The original implementation involved initializing each object’s attributes in the class’ constructor.  Many constructors also required references to utility objects.  Additionally, the software design is such that only one object of each concrete class is required, yet no safeguards were in place to ensure that additional objects were not inadvertently created.  We will discuss how this application was refactored according to our five-step framework.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;7.2.1. Step 1: Identify the Need for Refactoring. &lt;/span&gt;&lt;br /&gt;The design described above had a few inherent problems that the software design lead desired to address:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Each of the approximately 650 .cpp files has its own unit test, each of which requires the creation of a dummy object of the associated class to use for testing.  Any change that affects the signature of the constructor or any of the attributes initialized therein has the potential to cause all unit tests associated with that class to fail.  This leads to the potential for excessive rework of multiple unit tests for trivial code changes where only one unit test should have to be updated.&lt;/li&gt;&lt;li&gt;While the original design never instantiated more than one object of each class, there was no safeguard in place to prevent instantiation of multiple objects against the design intent.&lt;/li&gt;&lt;li&gt;The software design lead felt that refactoring the code to address the issues described above would increase its understandability and more clearly convey the design intent.  According to Fowler [1], this on its own is a perfectly legitimate reason to refactor.&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;7.2.2. Step 2: Establish Test Cases.  &lt;/span&gt;&lt;br /&gt;Per the established software development process, a complete suite of unit tests was already in place for the application.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;7.2.3. Step 3: Develop a Plan for Design Changes.  &lt;/span&gt;&lt;br /&gt;The software design lead analyzed the problems outlined in Step 1 and settled on the following set of refactorings:&lt;br /&gt;1. Instantiate objects through an instantiate() method that calls the default constructor for the class.  The visibility of the constructor will be made private to prevent instantiation of objects except through the public instantiate() method.&lt;br /&gt;2. Implement the Singleton design pattern to avoid instantiation of multiple objects of any class.  This is enabled by the addition of the instantiate() methods.  Within each instantiate() method, a check will be made to determine whether an object has already been created.  If not, an object will be created and a pointer to the object returned.  If an object does exist, a pointer to the existing object will simply be returned without creating a new object.&lt;br /&gt;3. Move initialization of attributes out of constructors and into an init() method for each class.  As a result, each class’ constructor will now be an empty default constructor by design.  Updates that would formerly have affected the constructor and potentially all unit tests associated with the class will now affect only the init() method and its single unit test.  References to utility objects formerly required as parameters to the constructors will now be implemented as calls to the utility class’ instantiate() methods within the init() method of the object being initialized.  In the refactored code, objects will now be instantiated and initialized in a single statement of the form Class::instantiate()-&gt;init();.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;7.2.4. Step 4: Implement the Plan.&lt;/span&gt;&lt;br /&gt;With the plan in place, the software design lead implemented the changes in the code.  The required updates were straightforward and did not take a substantial amount of time to implement.  In an attempt to minimize the impact to ongoing updates for planned releases, the code changes were initially made in parallel with formal changes targeted to the next planned release.  Because the modules affected by the refactorings were not affected by any upcoming formal changes, the refactoring updates could be held out of the formal release baselines until a convenient implementation point could be determined.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;7.2.5. Step 5: Re-run the Test Cases.  &lt;/span&gt;&lt;br /&gt;As mentioned previously, unit test rework is unavoidable after certain refactorings due to the nature of the code changes involved.  In this case, due to the fact that the object instantiation technique was changed, each individual unit test will require superficial—although not necessarily trivial—updates before it can be re-run.  This makes it impossible to follow the ideal process of running the exact same suite of unit tests without modification before and after refactoring to ensure that no functionality was affected.  Fortunately, however, only the “framework” surrounding the overall sequence of test cases for each unit test is affected; the individual test cases themselves are not affected, thus preserving the integrity of the unit test suite as a means of validating that the refactorings have not altered the externally-visible behavior of the code.&lt;br /&gt;Another deviation from the ideal refactoring process is that due to the need to rework all unit tests (approximately 650), it was impractical to re-run the unit test suite after each individual refactoring technique was applied.  Instead, all code changes were incorporated at once and the unit tests subsequently updated and run against the complete set of code changes.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;7.2.6. Benefits Achieved.  &lt;/span&gt;&lt;br /&gt;Several benefits are expected to result from the refactoring effort:&lt;br /&gt;1. The code will be more understandable and more clearly convey the intent of the design.&lt;br /&gt;2. The code will be more maintainable as a result.&lt;br /&gt;3. Unit test maintenance will be simplified as changes to attribute initialization will no longer have a ripple effect through multiple unit tests.&lt;br /&gt;4. Implementation of the Singleton pattern will add robustness by insuring against inadvertent creation of multiple objects of a given class.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;7.2.7. Drawbacks.  &lt;/span&gt;&lt;br /&gt;While the benefits are expected to be tangible, several drawbacks call into question whether proceeding with these refactorings was the right decision at the right time.&lt;br /&gt;1. At the time of this writing, the process of updating individual unit tests has been ongoing for over two months, with a significant number of tests still remaining to be updated.  Developers have been borrowed from other teams to help with the unit test updates.  It is anticipated that all unit test rework will be completed by the certification deadline, but the amount of effort that will have been expended is substantial.  It is late in the development cycle of this application with relatively few significant changes expected in the future, so it remains to be seen whether a net time savings will be achieved over the product’s remaining lifetime due to the improved unit test and code maintainability.&lt;br /&gt;2. The time required to rework the entire unit test suite took away significantly from time that could have been used to implement requirements changes desired by the systems engineering team in the release in which the refactorings were incorporated.  This delays the deployment of fixes to the aircraft and ultimately to the customer.&lt;br /&gt;3. Due to the relocation of attributes from the constructors to init() methods, integration test cases (separate from unit tests) were also significantly impacted since they reference each variable through a fully-qualified identifier.  In an attempt to minimize the impact to the integration test team, the software design lead worked with the test lead to help update the suite of integration tests.  However, until the integration test suite is successfully run against the updated code, there remains a risk that additional test case rework could be required to make the test suite compatible.&lt;br /&gt;4. Current policy does not require ALL unit tests to be re-run for each release; only unit tests associated with units that have changed in a given release must be re-run (this policy does not apply to integration tests).  As long as this policy is in place, the payoff will be diminished because the “ripple effect” eliminated through refactoring would not have been realized since the additional unit tests that would have been affected are not required to be re-run.  The only benefit would be slightly reduced effort to update the unit tests for units that were updated in a given release.&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;8. Summary&lt;/span&gt;&lt;br /&gt;In this paper we introduced the subject of refactoring and presented our viewpoint that periodic refactoring, done wisely, is an effective strategy to keep one’s code understandable and maintainable, allowing future updates to be made more quickly and with less effort, for a net time savings benefit over the product’s lifecycle.  We summarized several criticisms of refactoring and offered our rebuttals.  We then proposed a high-level, five-step framework for planning and performing refactoring projects.  We illustrated the application of our framework through two case studies, the first of which we consider an example of when refactoring was clearly appropriate, and the second of which we deem more questionable given the timing of when the refactoring was performed.&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;9. References&lt;/span&gt;&lt;br /&gt;[1] Martin Fowler, Refactoring: improving the design of existing code, Addison Wesley, Boston, 1999.&lt;br /&gt;[2] A. Van Deursen and L. Moonen, “The Video Store Revisited - Thoughts on Refactoring and Testing”, Proc of the third International Conference on eXtreme Programming and Flexible Processes in Software&lt;br /&gt;Engineering XP 2002, Sardinia, Italy.&lt;br /&gt;[3] Danijel Arsenovski. “Debunking Common Refactoring Misconceptions.” 7/16/2008. InfoQ.com. Viewed 2/27/2010.&lt;http: com="" articles="" refactoringmyths=""&gt;&lt;br /&gt;[4] F. Khomh, M. Di Penta and Y. Gueheneuc, “An Exploratory Study of the Impact of Code Smells on Software Change-proneness”, Reverse Engineering, 2009. WCRE '09. 16th Working Conference on, IEEE, 2009, pp. 75-84.&lt;br /&gt;[5] Robert X. Cringely. “May the Source Be With You: Maybe One Key to Strengthening Open Source is Just Differentiating Between Work and Play.” I, Cringely. 5/1/2003. PBS.org. Viewed 2/27/2010. &lt;http: org="" cringely="" pulpit="" 2003="" html=""&gt;.&lt;br /&gt;[6] F. Bourquin and R.K. Keller, “High-impact Refactoring Based on Architecture Violations”, Software Maintenance and Reengineering, 2007. CSMR '07. 11th European Conference on, IEEE, 2007, pp. 149-158.&lt;br /&gt;[7] S. McConnell, Code Complete (2nd edition), Microsoft Press, Redmond, WA, 2004.&lt;br /&gt;[8] J. Viljamaa, “Refactoring I — Basics and Motivation”, Paper, Seminar on Programming Paradigms, University of Helsinki, October 2000.&lt;br /&gt;[9] G. Keefer, “Extreme Programming Considered Harmful for Reliable Software Development”, Proceedings of the 6th Conference on Quality Engineering in Software Technology, Germany, Dec. 2002, pp. 129–141.&lt;br /&gt;[10] JB Rainsberger. “Refactoring: Where do I Start?” StickyMinds.com. Viewed 2/27/2010. &lt;http: sticky="" com="" function="edetail&amp;amp;ObjectType=CP&amp;amp;ObjectId=14661&amp;amp;tth=DYN&amp;amp;tt=siteemail&amp;amp;iDyn=37"&gt;.&lt;br /&gt;[11] Tony Hopkinson. “Developers and managers. What does refactoring mean to you?” Tech Republic. 5/31/2009. Viewed 2/27/2010. &lt;http: com="" forumid="102&amp;amp;threadID=310249"&gt;.&lt;br /&gt;&lt;/http:&gt;&lt;/http:&gt;&lt;/http:&gt;&lt;/http:&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/132016627730443140-1087826698579673130?l=davidkfaulk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkfaulk.blogspot.com/feeds/1087826698579673130/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=132016627730443140&amp;postID=1087826698579673130' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/1087826698579673130'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/1087826698579673130'/><link rel='alternate' type='text/html' href='http://davidkfaulk.blogspot.com/2010/05/lugaru-part-3.html' title='Lugaru - Part 2'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12551970868049421727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-132016627730443140.post-158686499846589303</id><published>2010-05-12T20:21:00.000-07:00</published><updated>2010-05-12T22:34:22.205-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lugaru'/><title type='text'>Lugaru - Part 1</title><content type='html'>For the last several months, I've been following the progress of Wolfire Games - an independent game developer who is taking a different approach to game design.  They maintain an active blog, detailing their progress with their newest game as well as articles on game design and theory.  Yesterday they released their first game Lugaru as an open source project.  For those reading this that don't comprehend what that means, (I'm looking at my sister - my only subscriber) it means that the foundational code that was used to create the game has been posted on the web with the intention that it be read, changed, improved, and used!!  Normally, that is a closely guarded company secret, but some will release it for various reasons.  The motivation for Wolfire releasing the source of Lugaru is a commitment to continue being awesome!!&lt;br /&gt;&lt;br /&gt;I spent some time today reviewing their code.  It was the first time I had looked at the source for a decently sized application.  Opening a few files, I began to pick up on their coding style and design.  Over the last year, I've privately studied the concept of refactoring, the process for improving the design of existing code.  My hope is that I can use those concepts to improve the design of Lugaru and use this blog to document my thoughts and progress.  Here we go...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/132016627730443140-158686499846589303?l=davidkfaulk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkfaulk.blogspot.com/feeds/158686499846589303/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=132016627730443140&amp;postID=158686499846589303' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/158686499846589303'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/158686499846589303'/><link rel='alternate' type='text/html' href='http://davidkfaulk.blogspot.com/2010/05/lugaru-part-1.html' title='Lugaru - Part 1'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12551970868049421727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-132016627730443140.post-1548572973703321925</id><published>2009-06-13T21:17:00.000-07:00</published><updated>2009-07-10T22:00:42.991-07:00</updated><title type='text'>SOAP vs. REST</title><content type='html'>A quick apology to all the family members that are signed up to this blog.  I promise to resume personal musings soon!&lt;br /&gt;&lt;br /&gt;My class on Service Oriented Computing is discussing two paradigms of web architecture - SOAP (&lt;i&gt;Simple Object Access Protocol&lt;/i&gt;) and REST (&lt;span style="font-style: italic;"&gt;Representational state transfer&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;REST is an architecture is a style that is used heavily throughout the web.  Once we spent a lecture learning further about this and looking at examples, I was blown away at how often it's used.  It would be like listening to a lecture on bricks and the types of bricks and the intricacy of brick laying and then stepping outside and look at a building.  You're blown away at the new perspective you have for something that you took for granted your whole life.&lt;br /&gt;&lt;br /&gt;REST is very simple.  It's principles, (blatantly lifted from wikipedia) are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Application state and functionality are abstracted into resources&lt;/li&gt;&lt;li&gt;Every resource is uniquely addressable using Uniform Resource Identifiers&lt;/li&gt;&lt;li&gt;All resources share a uniform interface for the transfer of state between client and resource, consisting of &lt;ul&gt;&lt;li&gt;A constrained set of well-defined operations (&lt;span class="mw-redirect"&gt;HTTP&lt;/span&gt; GET, POST etc)&lt;/li&gt;&lt;li&gt;A constrained set of &lt;span class="mw-redirect"&gt;content types&lt;/span&gt;, optionally supporting code on demand&lt;/li&gt;&lt;/ul&gt; &lt;/li&gt;&lt;li&gt;A protocol which is: &lt;ul&gt;&lt;li&gt;Client-server&lt;/li&gt;&lt;li&gt;Stateless&lt;/li&gt;&lt;li&gt;Cacheable&lt;/li&gt;&lt;li&gt;Layered&lt;/li&gt;&lt;/ul&gt; &lt;/li&gt;&lt;/ul&gt;Examples of RESTful web services include Flickr and Twitter.&lt;br /&gt;&lt;br /&gt;At the time I read about SOAP in Chapter 4 of "XML, Web Services, and the Data Revolution," I thought to myself, "this seems very straight forward."  SOAP uses the http transfer protocol with an XML payload.  The payload, in turn, has a similar structure of an optional header plus a body -  Easy (at least in theory.) &lt;br /&gt;&lt;br /&gt;SOAP services require this structure for requests which isn't as easy to do as REST.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/132016627730443140-1548572973703321925?l=davidkfaulk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkfaulk.blogspot.com/feeds/1548572973703321925/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=132016627730443140&amp;postID=1548572973703321925' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/1548572973703321925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/1548572973703321925'/><link rel='alternate' type='text/html' href='http://davidkfaulk.blogspot.com/2009/06/soap-vs-rest.html' title='SOAP vs. REST'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12551970868049421727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-132016627730443140.post-4322513836313462059</id><published>2009-06-13T18:20:00.000-07:00</published><updated>2009-07-10T21:13:06.660-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Big Design'/><title type='text'>Big Design Lecture #6</title><content type='html'>I had intended to attend Ryan Plesko's lecture on "Designing for People and Machines" which might have led to some Web 2.0 discussion.  Unfortunately, there was a mix-up in communicating the time or date to the lecturer and he wasn't there.  Instead I went to Thor Muller's lecture on "Work Like the Network." &lt;br /&gt;&lt;br /&gt;Everything about this lecture has already been said on my post about lunch.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/132016627730443140-4322513836313462059?l=davidkfaulk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkfaulk.blogspot.com/feeds/4322513836313462059/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=132016627730443140&amp;postID=4322513836313462059' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/4322513836313462059'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/4322513836313462059'/><link rel='alternate' type='text/html' href='http://davidkfaulk.blogspot.com/2009/06/big-design-lecture-6.html' title='Big Design Lecture #6'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12551970868049421727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-132016627730443140.post-6197505480278866747</id><published>2009-06-13T06:18:00.000-07:00</published><updated>2009-07-10T21:05:26.579-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Big Design'/><title type='text'>Big Design Lecture #5</title><content type='html'>Lecture #5 was "Presenting Your Ideas in Highly Charged Political Situations" by Adam Polansky.  He made it evident that the title of lecture was chosen by a third-party AFTER he put his presentation together.  Whereas the title might lead you to think he'd be teaching you methods for making your boss think he came up with your ideas, this was nothing more than how to organize your presentations.&lt;br /&gt;&lt;br /&gt;Although this was a flagrant abuse of false advertising, it was one of the most applicable tracks I attended.  The most important thing I took from the lecture was minimizing the amount of information you put on a slide.  I think all too often, people pack a slide with so much text that they just read the slide to the audience or could sit down and let the slide do all the talking for them.  Either way, they miss the important detail that a slide show assists you the presenter.  People came to hear YOU, not your slide show!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/132016627730443140-6197505480278866747?l=davidkfaulk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkfaulk.blogspot.com/feeds/6197505480278866747/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=132016627730443140&amp;postID=6197505480278866747' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/6197505480278866747'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/6197505480278866747'/><link rel='alternate' type='text/html' href='http://davidkfaulk.blogspot.com/2009/06/big-design-lecture-5.html' title='Big Design Lecture #5'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12551970868049421727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-132016627730443140.post-4631400511987727846</id><published>2009-06-13T05:50:00.000-07:00</published><updated>2009-06-13T06:17:29.104-07:00</updated><title type='text'>Big Design Lecture #4</title><content type='html'>I took a break during the fourth lecture to collect my thoughts and recover from the UX excitement.  I used the time to create my Twitter account and then read the wikipedia entry on "Twitter" to try and understand what I got myself into.  I still don't understand the hype (which coincidentally is my 6 word summary of Big D).&lt;br /&gt;&lt;br /&gt;I caught the last few minutes of "Future Prood Designs + Presentations for THIS Generation" with Robert Wiseman.  The only points I took from there was the idea of allowing your customers to decide your design.  He used the  image of employees walking across a grass field to work (what kind of business are we talking about?!) and then paving the rabbit trails that emerge.  He didn't have an example of an application doing this, though.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/132016627730443140-4631400511987727846?l=davidkfaulk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkfaulk.blogspot.com/feeds/4631400511987727846/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=132016627730443140&amp;postID=4631400511987727846' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/4631400511987727846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/4631400511987727846'/><link rel='alternate' type='text/html' href='http://davidkfaulk.blogspot.com/2009/06/big-design-lecture-4.html' title='Big Design Lecture #4'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12551970868049421727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-132016627730443140.post-8297010249045822422</id><published>2009-06-13T05:24:00.000-07:00</published><updated>2009-06-13T05:42:00.744-07:00</updated><title type='text'>Big Design Lecture #3</title><content type='html'>It's interesting how otherwise innocent words can have profound meaning in professions.  "Code Pink" for example comes across as almost a playful alternative to it's more serious big brother "Code Red."  You don't see many medical dramas declaring Code Pink - imagining it is kind of silly.  Yet if you walked into a hospital and ran up and down the halls yelling "CODE PINK!" you'd scramble the entire building.  Code Pink in medical jargon means an infant has been stolen.  Pretty serious...&lt;br /&gt;&lt;br /&gt;Likewise in embedded programming "Design Patterns" holds a very reverent meaning due to the book of the same name written by the Gang of Four.  Noone casually sits down to read it - they meditate on it!&lt;br /&gt;&lt;br /&gt;Therefore when I saw the third lecture at Big Design would be on "Latest Design Patterns That You Should Know" by Bill Scott I penciled it in as a must-see.  It wasn't as profound as those words would have it seem.  These patterns were not as hard to understand and visualize as say the Visitor Pattern.  Bill had lots of them that you would think would be common sense, yet he had lots of real-life examples of websites implementing just the opposite resulting in 'anti-patterns.'  This form of presentation ("Here's what NOT to do") really connected with me.  I enjoyed the talk, though I don't know if it's directly applicable to work.&lt;br /&gt;&lt;br /&gt;Some examples of his design patterns:&lt;br /&gt;&lt;br /&gt;1.  Make it Direct&lt;br /&gt;2.  Keep it Lightweight&lt;br /&gt;3.  Stay on the page&lt;br /&gt;4.  Offer an Invitation&lt;br /&gt;5.  Show transitions&lt;br /&gt;&lt;br /&gt;I would have taken more detailed notes, but the lady sitting in front of me turned around and scolded me for, "Doing work during the presentation."  When I explained I was taking notes, she said the typing was very distracted and that I was a VERY rude person, despite my repeated apologies.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/132016627730443140-8297010249045822422?l=davidkfaulk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkfaulk.blogspot.com/feeds/8297010249045822422/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=132016627730443140&amp;postID=8297010249045822422' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/8297010249045822422'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/8297010249045822422'/><link rel='alternate' type='text/html' href='http://davidkfaulk.blogspot.com/2009/06/big-design-lecture-3.html' title='Big Design Lecture #3'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12551970868049421727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-132016627730443140.post-6229515459844432515</id><published>2009-06-13T01:17:00.001-07:00</published><updated>2009-06-13T01:40:21.531-07:00</updated><title type='text'>Big Design Lunch</title><content type='html'>By this time I was ready for a break.  As an embedded engineer I'm in the business of writing black boxes where numbers go in and numbers go out.  There's no "user experience" and no customer I'm trying to pull in.  I got to be honest, the first two lectures left me physically shaking after hearing how bad people are trying to suck me in to their product.&lt;br /&gt;&lt;br /&gt;Needless to say, I needed a break.  The Big Design conference catered boxed lunches.  I grabbed one and set off to find a conversation to be a part of while I ate.  The topic among my classmates was either how we finished up the last class or how Frailey's death-march of a project was wrapping up - neither one of which I had the stomach to sit and listen to.  Feeling particularly brave I walked up to a table with two guys my age and asked if I could join them.  They eagerly agreed and I sat down.  Turns out these two guys were Garrett Dimon and Thor Muller - two speakers at Big D.  If I was hoping for a light conversation that helped bring all this into perspective and let me digest the last three hours of lecture, it wasn't going to happen.  At one point it occurred to me that these two (particularly Thor) talked really fast and non-stop.  The conversation was all over the place.  At one point I gathered Thor was a carear business starter - building a small company and selling it... starting another.  He must be terribly important and very rich, but not much of a listener.&lt;br /&gt;&lt;br /&gt;At one point he asked me what I thought of 'all this', (I assume he meant the last hour of hyper-babble) and I got the impression he was only using this as a launch pad to change the subject.  I said I was an imbedded engineer who was on assignment at the convention.  The look on his face made it look like something foul had briefly crossed his nose.  Then realizing his face was showing his thoughts, he made a pleasant comment about me being the smartest person at the table and then resumed hyper-babble.&lt;br /&gt;&lt;br /&gt;With the next track starting, I excused myself...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/132016627730443140-6229515459844432515?l=davidkfaulk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkfaulk.blogspot.com/feeds/6229515459844432515/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=132016627730443140&amp;postID=6229515459844432515' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/6229515459844432515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/6229515459844432515'/><link rel='alternate' type='text/html' href='http://davidkfaulk.blogspot.com/2009/06/big-design-lunch.html' title='Big Design Lunch'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12551970868049421727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-132016627730443140.post-1549851265886927780</id><published>2009-06-13T01:06:00.000-07:00</published><updated>2009-06-13T01:17:08.778-07:00</updated><title type='text'>Big Design Lecture #2</title><content type='html'>The second lecture I attended was "The Art and Science of Seductive Interactions" by Stephen Anderson.  This lecture really went hand in hand with the previous lecture even though they were in separate tracks.  In fact, the lecturer user the first speaker several times as an example.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Stephen did, however, use lots of examples with his points.  I was amazed at all these hot web-site everyone in the audience had heard of that I haven't.  Examples: iLike, Sabre, Doppler&lt;br /&gt;&lt;br /&gt;Again, this was a demonstration in how sausages are made.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/132016627730443140-1549851265886927780?l=davidkfaulk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkfaulk.blogspot.com/feeds/1549851265886927780/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=132016627730443140&amp;postID=1549851265886927780' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/1549851265886927780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/1549851265886927780'/><link rel='alternate' type='text/html' href='http://davidkfaulk.blogspot.com/2009/06/big-design-lecture-2.html' title='Big Design Lecture #2'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12551970868049421727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-132016627730443140.post-9098559964807947743</id><published>2009-06-13T00:38:00.000-07:00</published><updated>2009-06-13T01:05:52.896-07:00</updated><title type='text'>Big Design Lecture #1</title><content type='html'>The first lecture I sat in on at Big Design '09 was "What Makes The Click" with Dr. Susan Weinchenk.  She was a psychology expert that walked the audience through understanding several quirks of the human brain and how to take advantage of that in design web applications.  A few points she made:&lt;br /&gt;&lt;br /&gt;1.  Fear of Loss - The most primitive parts of our brain are more concerned about losing something we have than gaining something we don't have.  This can be exploited by offering a product with all the features and letting the buyer remove them rather than giving them a base model and letting them add features.  In the latter example, they'd be reluctant to lose the money for the upgrade.&lt;br /&gt;2.  The Bystander Effect - When placed in an uncertain situation ("which item should I buy?!") people tend to become followers.  This is leveraged with user testimonials and buyer reviews.&lt;br /&gt;&lt;br /&gt;At the end of the talk, I felt (as a customer) like I was let in on a secret I wasn't supposed to know about.  Like walking in on a butcher while he's making sausages.  Knowing your being manipulated and pulled in is such a turn-off, even when it's the subject of a lecture.&lt;br /&gt;&lt;br /&gt;I chuckled thinking about what it would look like if we used these principles in the UI for the F-35.  "An unknown entity has been detected.  Click here if you want to learn more..."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/132016627730443140-9098559964807947743?l=davidkfaulk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkfaulk.blogspot.com/feeds/9098559964807947743/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=132016627730443140&amp;postID=9098559964807947743' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/9098559964807947743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/9098559964807947743'/><link rel='alternate' type='text/html' href='http://davidkfaulk.blogspot.com/2009/06/big-design-lecture-1.html' title='Big Design Lecture #1'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12551970868049421727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-132016627730443140.post-8252743370837824940</id><published>2009-06-13T00:29:00.000-07:00</published><updated>2009-06-13T00:53:18.414-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Big Design'/><title type='text'>Big Design Intro</title><content type='html'>This summer I'm taking a course in Service Oriented Computing.  As a cold opener to the course, my class attended "Big Design '09" at SMU.  This was an all-day conference that had multiple tracks talking about UX as it relates to software.  What UX was they never said, but 10 hours of context clues makes me think it stood for "User Experience"&lt;br /&gt;&lt;br /&gt;I'll save my over-all impressions for the end.  What follows will be my summaries and impressions of each seminar I attended.&lt;br /&gt;&lt;br /&gt;The Keynote Plenary was given by Norm Cox on "The UX Landscape" (again, never said what UX was :P)  Norm gave a very interesting autobiography on his work with early computers using bitmap displays with the operating system.  His work involved creating what could be thought of as the first desktop with icons.  One of his most profound comments was that IBM recognized early on that the user interface is the most valuable touch-point between a user (customer) and the product.&lt;br /&gt;&lt;br /&gt;At one point he talked about contracting with PizzaHut to overhaul their back-office system that instructed employees on how to build a pizza.  This was extended to ensuring that when an order is taken, it's taken correctly.  Although he didn't touch on it, this new UI was so simple that PizzaHut used it when they developed a web-service for ordering a pizza on-line.  I know because I did that very thing not 3 days before the show.  I remember thinking at the time, "This is a great setup they have here!"&lt;br /&gt;&lt;br /&gt;Take-away points from his speech:&lt;br /&gt;    1.  Beware the limitations of titles.&lt;br /&gt;    2.  Be a 'jack of many (ui) titles, master of some"&lt;br /&gt;    3.  Elevate and think strategically&lt;br /&gt;    4.  Take advantage of opportunities.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/132016627730443140-8252743370837824940?l=davidkfaulk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkfaulk.blogspot.com/feeds/8252743370837824940/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=132016627730443140&amp;postID=8252743370837824940' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/8252743370837824940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/8252743370837824940'/><link rel='alternate' type='text/html' href='http://davidkfaulk.blogspot.com/2009/06/big-design-intro.html' title='Big Design Intro'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12551970868049421727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-132016627730443140.post-3543436305010633672</id><published>2008-12-22T11:03:00.000-08:00</published><updated>2008-12-24T21:54:27.565-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Christmas'/><title type='text'>Striving for a Charlie Brown Christmas</title><content type='html'>One of the top five descriptions I'd use to describe my paternal grandfather is that he loved Charles Shultz's &lt;a href="http://en.wikipedia.org/wiki/Peanuts"&gt;Peanuts comic strip&lt;/a&gt;. As such, I remember watching a &lt;a href="http://en.wikipedia.org/wiki/Charlie_Brown_Christmas"&gt;"Charlie Brown Christmas"&lt;/a&gt; at an early age. As a child, there's always that initial excitement of watching a cartoon, (especially at the grandparents ;)) but I distintively remember being disappointed. The plot didn't make sense, the animation was horrible, and the humor was over my head. And that was probably the last time I watched it in its entirety until this week. It is quite possibly the best seasonal movie I've ever seen. If my mere recommendation of it now has your interest peaked, I found it all on YouTube.&lt;br /&gt;&lt;br /&gt;For the last three or four years Christmas has been a really hard time of year for me. I feel wound up and anxious and trying to think of twenty things twenty people can get me is frustrating and feels somehow wrong. The cartoon addresses this in its opening line - &lt;blockquote&gt;"I think there must be something wrong with me, Linus. Christmas is coming, but I'm not happy. I don't feel the way I'm supposed to feel. I just don't understand Christmas, I guess. I like getting presents and receiving Christmas cards, and decorating trees and all that, but I'm still not happy. I always end up feeling depressed."&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Charlie Brown tries to busy himself with holiday activities in the form of directing a Christmas play. I wish they would have developed the story on this Christmas play since it included an inn keeper, a Christmas Queen, and easy jazz music... Charlie Brown takes his job very seriously and becomes a bit of a task masker - the rest of the kids just want to dance to the jazz. Charlie Brown then tries to make it better with the infamous "Charlie Brown Christmas Tree" to which he is richly chastized. At his wits end, he cries out for someone, ANYONE, to explain the meaning of Christmas to which Linus gives his epic monologue:&lt;br /&gt;&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/DKk9rv2hUfA&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/DKk9rv2hUfA&amp;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;I hope if you find yourself striving for things or activities this time of year, you slow down and remember the reason for the season. ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/132016627730443140-3543436305010633672?l=davidkfaulk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkfaulk.blogspot.com/feeds/3543436305010633672/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=132016627730443140&amp;postID=3543436305010633672' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/3543436305010633672'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/3543436305010633672'/><link rel='alternate' type='text/html' href='http://davidkfaulk.blogspot.com/2008/12/striving-for-charlie-brown-christmas.html' title='Striving for a Charlie Brown Christmas'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12551970868049421727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-132016627730443140.post-8945655611412782320</id><published>2008-10-27T19:38:00.000-07:00</published><updated>2008-10-27T20:28:15.227-07:00</updated><title type='text'>The New Love of My Life!</title><content type='html'>&lt;div&gt;I'd like you all to meet Jonathan Reagan &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Faulk&lt;/span&gt;! He's due a full month earlier than thought! March 11. The technician says he looks very healthy - perfect brain, perfect spine, perfect stomach, perfect liver, and perfect kidneys. He's got a perfect.... err.... something else too! ;)&lt;br /&gt;&lt;br /&gt;In the shots below &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Jonny&lt;/span&gt; is laying on his back with his head on the right side.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_Xg7R-ohPD90/SQaEdd0nVXI/AAAAAAAAAOg/JNLfTSjrGfM/s1600-h/img021.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5262038856385385842" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 320px; CURSOR: hand; HEIGHT: 239px; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_Xg7R-ohPD90/SQaEdd0nVXI/AAAAAAAAAOg/JNLfTSjrGfM/s320/img021.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_Xg7R-ohPD90/SQaFEXvc0YI/AAAAAAAAAOo/AnyDzMrKRGU/s1600-h/img022.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5262039524768010626" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 320px; CURSOR: hand; HEIGHT: 239px; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_Xg7R-ohPD90/SQaFEXvc0YI/AAAAAAAAAOo/AnyDzMrKRGU/s320/img022.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In this picture he raised his hand to his mouth...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_Xg7R-ohPD90/SQaEJcX2YpI/AAAAAAAAAOY/t-Qz7TiqJBE/s1600-h/img020.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5262038512398918290" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 320px; CURSOR: hand; HEIGHT: 239px; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_Xg7R-ohPD90/SQaEJcX2YpI/AAAAAAAAAOY/t-Qz7TiqJBE/s320/img020.jpg" border="0" /&gt;&lt;/a&gt; &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;This final shot is looking up between his legs...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_Xg7R-ohPD90/SQaFQxp3MGI/AAAAAAAAAOw/ReebM6Rryvc/s1600-h/img023.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5262039737882325090" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 320px; CURSOR: hand; HEIGHT: 274px; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_Xg7R-ohPD90/SQaFQxp3MGI/AAAAAAAAAOw/ReebM6Rryvc/s320/img023.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I'm going to have a son!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/132016627730443140-8945655611412782320?l=davidkfaulk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkfaulk.blogspot.com/feeds/8945655611412782320/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=132016627730443140&amp;postID=8945655611412782320' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/8945655611412782320'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/8945655611412782320'/><link rel='alternate' type='text/html' href='http://davidkfaulk.blogspot.com/2008/10/new-love-of-my-life.html' title='The New Love of My Life!'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12551970868049421727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Xg7R-ohPD90/SQaEdd0nVXI/AAAAAAAAAOg/JNLfTSjrGfM/s72-c/img021.jpg' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-132016627730443140.post-4379298328769671553</id><published>2007-10-09T05:59:00.001-07:00</published><updated>2007-10-09T06:10:39.583-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='random'/><title type='text'>Got Change For a Million?</title><content type='html'>If you've been to downtown Fort Worth on the weekends, chances are you've encountered a Christian organization handing out leaflets with a million-dollar bill on the front. If I recall correctly, they tie the question of where you go when you die with 'the million dollar question.' In the half-dozen times I've been to &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Sun Dance&lt;/span&gt; Square, I think I've seen them 3 or 4 times.&lt;br /&gt;&lt;br /&gt;Turns out someone in Pennsylvania tried to make change with one of their leaflets at a grocery store. Here's the &lt;a href="http://news.yahoo.com/s/ap/20071009/ap_on_fe_st/odd_million_dollar_bill"&gt;link&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Any idiot knows you have to go to the Federal Reserve to make change with your &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Clevelands&lt;/span&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/132016627730443140-4379298328769671553?l=davidkfaulk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkfaulk.blogspot.com/feeds/4379298328769671553/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=132016627730443140&amp;postID=4379298328769671553' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/4379298328769671553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/4379298328769671553'/><link rel='alternate' type='text/html' href='http://davidkfaulk.blogspot.com/2007/10/got-change-for-million.html' title='Got Change For a Million?'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12551970868049421727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-132016627730443140.post-5628051406336374363</id><published>2007-10-02T05:04:00.000-07:00</published><updated>2008-12-11T23:38:40.309-08:00</updated><title type='text'>Honeycomb Chifon Pie</title><content type='html'>Recently I made a pie for our Bible study.  Here are pics of it...&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5116709920927119282" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_Xg7R-ohPD90/RwI0kEeT97I/AAAAAAAAAB8/WWVv5fU_NG0/s400/Pie+1.jpg" border="0" /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_Xg7R-ohPD90/RwI0kUeT98I/AAAAAAAAACE/yVXd-OqxjZs/s1600-h/Pie+2.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5116709925222086594" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_Xg7R-ohPD90/RwI0kUeT98I/AAAAAAAAACE/yVXd-OqxjZs/s400/Pie+2.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_Xg7R-ohPD90/RwI0k0eT99I/AAAAAAAAACM/N-JoWe-3qpE/s1600-h/Pie+3.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5116709933812021202" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_Xg7R-ohPD90/RwI0k0eT99I/AAAAAAAAACM/N-JoWe-3qpE/s400/Pie+3.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_Xg7R-ohPD90/RwI0lUeT9-I/AAAAAAAAACU/Lc_Kfy1mShs/s1600-h/Pie+4.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5116709942401955810" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_Xg7R-ohPD90/RwI0lUeT9-I/AAAAAAAAACU/Lc_Kfy1mShs/s400/Pie+4.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&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/132016627730443140-5628051406336374363?l=davidkfaulk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkfaulk.blogspot.com/feeds/5628051406336374363/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=132016627730443140&amp;postID=5628051406336374363' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/5628051406336374363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/5628051406336374363'/><link rel='alternate' type='text/html' href='http://davidkfaulk.blogspot.com/2007/10/honeycomb-chifon-pie.html' title='Honeycomb Chifon Pie'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12551970868049421727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Xg7R-ohPD90/RwI0kEeT97I/AAAAAAAAAB8/WWVv5fU_NG0/s72-c/Pie+1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-132016627730443140.post-6061145731371095369</id><published>2007-09-05T08:59:00.000-07:00</published><updated>2007-09-25T07:52:27.500-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Work'/><title type='text'>The Intersection of School and Work</title><content type='html'>This week I've become very aware of how much my college classes had an impact in my professional life. Not my lecture classes mind you. Everything I needed from lectures I learned in the first year-and-a-half. No, it's the five project labs I had in the final years that made the deepest professional impact.&lt;br /&gt;&lt;br /&gt;For those not in the know, Project Lab began with the instructor organizing us into groups and assigning semester-long projects, (though in later years we got to choose our teams and projects.) Each project involved designing and building some electrical device such as an electronic blood-pressure reading gadget. The projects also had an attached professor that served as the customer/advisor. We would develop a semester-long schedule and budget and then execute it with the professor signing off on our weekly progress. The majority of our time, though, was spent making power-point presentations (how accurate is that to professional life?!) and present them to the course instructor and our peers, one after another for three hour stints which can only be described as the death-march of academia.&lt;br /&gt;&lt;br /&gt;The toughest part by far, was the firing line that came at the end. Each presenter would end with the obligatory, "are there any questions" and then the real learning would begin. The instructor would typically ask the presenter to go back to the first slide and we'd work through the presentation nit-picking every fault in the presentation. Although in retrospect this taught me the most, at the time it was sheer torture.&lt;br /&gt;&lt;br /&gt;"Blue text on a black background means only the first row of your audience can read that, Mr. Wetz."&lt;br /&gt;&lt;br /&gt;"There's too much information on this slide"&lt;br /&gt;&lt;br /&gt;"There's not enough information on this slide"&lt;br /&gt;&lt;br /&gt;"You call that a voltage divider? What have you been doing for the last three years of your life that would make you think that?"&lt;br /&gt;&lt;br /&gt;“So you’re going to use an unsigned integer to store an angle between -pi/6 and +pi/6?”&lt;br /&gt;&lt;br /&gt;One time a person had a picture of red and green wires he had twisted together to reduce the impedance of some network device. During the 'question time' the professor released both barrels on him for using "two of the same colored wire". "By doing so, every time you pull this out to work on it you've got to ohm out both ends to make sure you've got the right ones. You should have used two different colors!" Like good sheep the presenter and the entire class of about thirty sat there quietly taking this. Finally the presenter, at his whit’s end, did the unspeakable and said, "but sir, these are two different colors - they're red and green!" to which the instructor replied, "Oh... I guess I should inform you I'm color-blind."&lt;br /&gt;&lt;br /&gt;In the final two project labs, the instructor raised the ante by announcing part of our grade would be determined by our active participation during the question time. Rather than the presenter being thrown to a great white shark at the end of their presentation, he would now be thrown to a great white shark and a school of piranhas.&lt;br /&gt;&lt;br /&gt;Again, I did the most learning here, but it turned you into a person that you didn’t want to look at in the mirror!&lt;br /&gt;&lt;br /&gt;I bring all this up because this week groups at work have been presenting their results of a month-long development. During the times I was presenting, I found that I was calm during the moments I would speak, but the anxiety wouldn’t build until I’d get closer to the “Any Questions” slide. In addition, I find that anytime a manager asks a question, I find myself wrapping it in a ‘bail-out clause” in case I’m wrong – “Well, last time I checked…” or “I was under the impression…” Thanks to project lab, I think I’ve been conditioned to believe that any question from an authority figure is just to test me and bring me down a notch. I need to either become a resident expert (not a bad thing) on whatever it is I’m talking about, or at least have the gumption to assert myself with confidence.&lt;br /&gt;&lt;br /&gt;In addition, yesterday a person posted an object model diagram that was riddled, I MEAN RIDDLED, with errors! After confirming that I hadn’t fallen into some twilight zone or I wasn’t the center of a prank of conspiratorial proportions, everything from project lab was screaming, “Be the first to say something! You’ve got this!” And yet the other, wiser half of me was saying, “You’ve got a half-dozen managers and another half-dozen senior developers in here, surely they’ll point it out.” Yet NOONE did. We sat there in complete silence looking at the biggest travesty to software engineering and didn’t correct this error!&lt;br /&gt;&lt;br /&gt;I don’t think I like the idea of “a time and a place” to correct programming errors. Or things that are Worse Than Failure - things that technically compile and run, but do so in such a wrong manner that it self-induces a face-five.&lt;br /&gt;&lt;br /&gt;Software Engineers and co-workers, what do you think?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/132016627730443140-6061145731371095369?l=davidkfaulk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkfaulk.blogspot.com/feeds/6061145731371095369/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=132016627730443140&amp;postID=6061145731371095369' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/6061145731371095369'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/6061145731371095369'/><link rel='alternate' type='text/html' href='http://davidkfaulk.blogspot.com/2007/09/this-week-ive-become-very-aware-of-how.html' title='The Intersection of School and Work'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12551970868049421727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-132016627730443140.post-2791472716791514981</id><published>2007-07-28T20:38:00.001-07:00</published><updated>2008-12-11T23:38:41.358-08:00</updated><title type='text'>Home Pics</title><content type='html'>Several friends and family members have been asking for some pics of our new home. The ones I've posted below don't show all the rooms - some of them are still serving as a catch-all for boxes and the kitchen wasn't presentable enough to be posted to the world. You can click on any of them for a super-big view...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;This is the front of our house after I spent the morning working in the yard.&lt;/div&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;a href="http://4.bp.blogspot.com/_Xg7R-ohPD90/RqwOG_liRiI/AAAAAAAAAA8/FVW74-C_-Dw/s1600-h/Home+006.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5092460791960061474" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_Xg7R-ohPD90/RqwOG_liRiI/AAAAAAAAAA8/FVW74-C_-Dw/s400/Home+006.jpg" border="0" /&gt;&lt;/a&gt; Our front 'formal' living room&lt;img id="BLOGGER_PHOTO_ID_5092460182074705426" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_Xg7R-ohPD90/RqwNjfliRhI/AAAAAAAAAA0/tnaSs5wbJ7g/s400/Home+001.jpg" border="0" /&gt;The formal dining room&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_Xg7R-ohPD90/RqwOHPliRjI/AAAAAAAAABE/DRqIqAYM5x4/s1600-h/Home+005.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5092460796255028786" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_Xg7R-ohPD90/RqwOHPliRjI/AAAAAAAAABE/DRqIqAYM5x4/s400/Home+005.jpg" border="0" /&gt;&lt;/a&gt; The family room&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_Xg7R-ohPD90/RqwOHfliRkI/AAAAAAAAABM/oeK22L9w4w8/s1600-h/Home+014.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5092460800549996098" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_Xg7R-ohPD90/RqwOHfliRkI/AAAAAAAAABM/oeK22L9w4w8/s400/Home+014.jpg" border="0" /&gt;&lt;/a&gt;Master bedroom.&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_Xg7R-ohPD90/RqwOHvliRlI/AAAAAAAAABU/VSc3STAOJ54/s1600-h/Home+015.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5092460804844963410" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_Xg7R-ohPD90/RqwOHvliRlI/AAAAAAAAABU/VSc3STAOJ54/s400/Home+015.jpg" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/132016627730443140-2791472716791514981?l=davidkfaulk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkfaulk.blogspot.com/feeds/2791472716791514981/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=132016627730443140&amp;postID=2791472716791514981' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/2791472716791514981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/2791472716791514981'/><link rel='alternate' type='text/html' href='http://davidkfaulk.blogspot.com/2007/07/home-pics.html' title='Home Pics'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12551970868049421727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Xg7R-ohPD90/RqwOG_liRiI/AAAAAAAAAA8/FVW74-C_-Dw/s72-c/Home+006.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-132016627730443140.post-7870052539652724032</id><published>2007-07-17T15:45:00.000-07:00</published><updated>2008-12-11T23:38:41.557-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Home'/><title type='text'>Sprinkler Woes</title><content type='html'>This week I mowed the yard for the first time since buying our wonderful house. After I was done I laid down fertilizer and proceeded to water it in. I took the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;oportunity&lt;/span&gt; to watch the watering since normally it comes on in the early morning hours. As it worked its way to the side of the house, I noticed a nook that wasn't getting watered. I heard sprinklers working but nothing was getting wet. I peered over the neighbors fence and this is what I found.&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5088302196791469106" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_Xg7R-ohPD90/Rp1H45WYZDI/AAAAAAAAAAU/EsCQl9yzbGA/s320/fence.JPG" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;Apparently the neighbors fence (presumably built sometime after our fence and sprinkler system were installed) is blocking the last two sprinklers in the line along the stone wall (indicated by the grey bar).  Four times a week for 5 minutes I'm soaking the bottom of 6 feet of fencing.&lt;br /&gt;&lt;br /&gt;The inspector never caught it because the sprinkler system was never tested.  This was because the control box is located on the outside of the house and was locked, (the reason it was locked and on the outside the garage was because it served as a model home and people needed to adjust the settings without getting into the house.)&lt;br /&gt;&lt;br /&gt;I haven't dug up the survey yet, but I'm pretty sure the fence is treading into my property.&lt;br /&gt;&lt;br /&gt;A few co-workers pointed out that since it's my property, I have the right to tear it down.  While true, I don't think that would be very neighborly.  I suspect the easiest thing to do would be to moved the sprinkler line to my side of the fence.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/132016627730443140-7870052539652724032?l=davidkfaulk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkfaulk.blogspot.com/feeds/7870052539652724032/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=132016627730443140&amp;postID=7870052539652724032' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/7870052539652724032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/7870052539652724032'/><link rel='alternate' type='text/html' href='http://davidkfaulk.blogspot.com/2007/07/sprinkler-woes.html' title='Sprinkler Woes'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12551970868049421727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Xg7R-ohPD90/Rp1H45WYZDI/AAAAAAAAAAU/EsCQl9yzbGA/s72-c/fence.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-132016627730443140.post-6979725952218790525</id><published>2007-07-06T10:36:00.000-07:00</published><updated>2008-12-11T23:38:41.663-08:00</updated><title type='text'>Airport Adventures</title><content type='html'>&lt;p&gt;Here is the promised post I made about the Apple Airport Express and the adventure I had getting it set up. The device itself is really impressive - follow the link and you'll see all the amazing stuff it can do. Unfortunately, Apple's documentation has always been severely lacking. I supose they write with Mac owners in mind - in which case it's a trivial matter - everything is truely plug and play. If you have a PC and third-party routers/modems, you're on your own. Fortunately, once you understand what's going on, it's really easy.&lt;br /&gt;&lt;br /&gt;So here's the current setup: We have a cable modem that plugs into a Linksys Wireless-G router. The PC then plugs (note: plugs) into the router. This created a little hurdle because the PC itself isn't wireless and isn't configured in any way, shape, or form. We wanted to use the Airport in its "Airtunes" configuration to pipe music from the computer, across the house to a hall closet that holds the wires for our recessed speakers. Below is the closest picture I could find of the desired setup sans Apple products, of course. &lt;/p&gt;&lt;p&gt;&lt;img id="BLOGGER_PHOTO_ID_5084142063135161010" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_Xg7R-ohPD90/Ro6ARPzK-rI/AAAAAAAAAAM/sHtRQUpSvHM/s320/setup.JPG" border="0" /&gt;&lt;br /&gt;I'll save you all the issues, websites, and hair-pulling I went through with the exception of saying that no documentation Apple provided helped. Here's what I ended up doing...&lt;br /&gt;&lt;br /&gt;1. Install the software package that came with your Airport Express.&lt;br /&gt;2. Plug the airport into a power outlet and then hard wire it to your router. If you find yourself short a network cable, you can do what I did and use the cable connecting the modem and router. Make sure you move the cable from the "Internet" (i.e. input) port to the number 2 slot on the router.&lt;br /&gt;3. Run the "Airport Admin Utility." By default, it's at Start --&gt; All Programs --&gt; Airport --&gt; Airport Admin Utility&lt;br /&gt;4. You should now see the factory default name of your Airport Express under the "name" column. Select it and click the "Configure" button at the bottom right of the screen.&lt;br /&gt;5. It may or may not ask for a password. I can't remember the first time.&lt;br /&gt;6. You should now be looking at a series of tabs of properties you can set for the Airport. The first thing to do is click on the "Airport" tab and next to the "Wireless mode" select "Join an Existing Wireless Network (Wireless Client)&lt;br /&gt;7. Click on the "Wireless Security" button to set up the encryption and password for your netowk. THis reminds that in trying to get all this figured out, I disabled encryption for our network! I need to fix that... I seem to recall there being an issue with WEP or WPA encryption. Once I get that solved, I'll make another post...&lt;br /&gt;8. Enter the name of your network name in the field provided.&lt;br /&gt;9. All the other proerties are moot for the setup we're trying to do except the last tab - Music. On there, you need to click on the boxes to "Enable AirTunes on this base station" and "Enable AirTunes over Ethernet." Be sure to give the "iTunes Speaker Name" something meaningful - this is what will be displayed in iTunes.&lt;br /&gt;10. Once all this is done, you can click on the 'Update' button at the bottom of the window to save all your changes. When you do, the Airport will reset itself (indicated by the solid amber display light). Once done booting, the Airport will begin flashing an amber light indicating its searching for your network. After about ten blinks, it should turn a solid green. Congratulations! You can remove the wire connecting the router and Airport to verify that the signal is being sent wirelessly. Furhtermore, try opening iTunes and look for an additional display at the bottom of the window for output. By default, it should be set to 'My Computer.' Selecting your Airport name should take a second or two to synch up but then it should work great. When I tested it, I had headphones plugged into the Airport and directed iTunes to output to both the PC speakers and Airport. There was no desernable delay between the two.&lt;br /&gt;&lt;br /&gt;Anyway, that's what it took to get my Airport working. I hope this helps someone!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/132016627730443140-6979725952218790525?l=davidkfaulk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkfaulk.blogspot.com/feeds/6979725952218790525/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=132016627730443140&amp;postID=6979725952218790525' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/6979725952218790525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/6979725952218790525'/><link rel='alternate' type='text/html' href='http://davidkfaulk.blogspot.com/2007/07/airport-adeventures.html' title='Airport Adventures'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12551970868049421727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Xg7R-ohPD90/Ro6ARPzK-rI/AAAAAAAAAAM/sHtRQUpSvHM/s72-c/setup.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-132016627730443140.post-8192636849796378323</id><published>2007-07-05T17:50:00.000-07:00</published><updated>2007-07-08T18:16:03.321-07:00</updated><title type='text'>Have home - will travel</title><content type='html'>For those that miss the reference, there is an OLD TV western called "&lt;a href="http://www.hgwt.com/hgwt0.htm"&gt;Have Gun - Will Travel&lt;/a&gt;"&lt;br /&gt;&lt;br /&gt;Today we closed on our first house! We signed the docs at 9, but couldn't pick up the keys until the seller signed (he wasn't showing up until 11:30) and the check cleared. To kill time, Casi and I went over to &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Southlake&lt;/span&gt; Town Square. I bought a &lt;a href="http://www.apple.com/airportexpress/"&gt;Apple Airport Express&lt;/a&gt;, (I'll make a &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_1"&gt;separate&lt;/span&gt; post about it &lt;a href="http://davidkfaulk.blogspot.com/2007/07/airport-adeventures.html"&gt;here&lt;/a&gt;...) and then saw Evan Almighty. It was humorous but certainly not the funniest movie I've ever seen. I'd rate it as a renter. When we came out, it was raining (big &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_2"&gt;surprise&lt;/span&gt;, right?) and after calling the realtor found out the seller STILL hadn't signed. It's like he didn't want our money or something... To kill more time, we saw Transformers. I wanted to be a movie hopper, but &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;Cas&lt;/span&gt; played good girl. It was a better movie, but I'm afraid &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_4"&gt;Hollywood&lt;/span&gt; has gotten to Transformers. They tried to make some funny moments in the movie with some really inappropriate material that had nothing to do with robotic aliens.&lt;br /&gt;&lt;br /&gt;With the movie over, the rain gone, and it in mid-afternoon, we drove over to the Title Company, met Lorri (our realtor) and got the keys!&lt;br /&gt;&lt;br /&gt;On the way home, we stopped by Best Buy and Radio Shack looking for an amplifier or receiver. I didn't find one I really liked. They had plenty, but they were just a lot more than what I was willing to pay.&lt;br /&gt;&lt;br /&gt;I worked at getting the airport set up, (again... it's own post...) and now I'm ready to pack!&lt;br /&gt;&lt;br /&gt;Hope everything is going well at work...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/132016627730443140-8192636849796378323?l=davidkfaulk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkfaulk.blogspot.com/feeds/8192636849796378323/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=132016627730443140&amp;postID=8192636849796378323' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/8192636849796378323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/8192636849796378323'/><link rel='alternate' type='text/html' href='http://davidkfaulk.blogspot.com/2007/07/have-home-will-travel.html' title='Have home - will travel'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12551970868049421727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-132016627730443140.post-9061068256355064979</id><published>2007-06-25T17:15:00.000-07:00</published><updated>2008-10-27T20:31:41.051-07:00</updated><title type='text'>Thoughts on Cheese</title><content type='html'>First off, Casi has pointed out that 'cheese' is the new drug on the streets (see &lt;a href="http://en.wikipedia.org/wiki/Cheese_%28recreational_drug%29"&gt;here&lt;/a&gt;).  I'm not talking about that...&lt;br /&gt;&lt;br /&gt;A small group of friends at work and I went to the company library today with the intent of finding a book that we could read and discuss.  We ended up walking out with "Who Moved My Cheese" by Spencer Johnson.  It's a very short read (30 to 45 minutes) told as a parable.  The story centers around 4 creatures whose every waking moment is spent in the pursuit of cheese.  They learn of a room within the maze where the cheese always seems to appear and begin to build their lives around it so much so that they are blind to the fact that there is less and less cheese appearing each day until eventually it stops appearing all together.  The rest of the story is spent talking about how the creatures deal with this change.  Some immediately pick up and move on.  Some have a long internal debates.  Some just sit, stuck on memories of the past, and presumably starve to death.&lt;br /&gt;&lt;br /&gt;The explanation of the parable is obvious enough.  Cheese is, "a metaphor for what we want to have in life, whether a job, a relationship, money, a big house, freedom, health, recognition, spiritual peace, or even an activity like jogging or golf."  The maze is the place that we spend looking for it, although I would argue it is our lives since the creatures could not escape the maze.  The creatures themselves represent us and how we adapt to change.  Easy enough.&lt;br /&gt;&lt;br /&gt;Despite its affirmation that we're in charge of our own happiness, and if we aren't getting our cheese we just need to gather enough self-will to pick up and move on, I didn't find any comfort in it.&lt;br /&gt;&lt;br /&gt;As a Christian, I realized several things.  To continue the metaphor the book began, there is Someone who has a top-down perspective of the maze.  Someone who knows every turn and dead-end and knows every creature living in the maze by name.  He placed each of them in the maze with purpose and intent and is the ultimate source of their cheese, even though they don't know it.  His sole desire is to have a relationship (a friendship) with the creatures, for them to simply look up and see the smiling face looking back at them.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ffff66;"&gt;The creatures were not placed in the maze to spend their lives looking for cheese.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We as people spend our whole lives thinking that if we aren't happy, something is terribly wrong.  If a relationship or a job or any situation is no longer fulfilling, we need to put our running shoes on and move on.  How near-sighted and selfish is that!  There are good things in life that don't immediately feel good.  If we seek to be led, we need to stop looking at the path ahead and start looking up at The One looking back at you.&lt;br /&gt;&lt;br /&gt;Maybe you're in a situation that you're not happy with.  Maybe you've got a spouse you're not connecting with or a  job that isn't fulfilling and you're longing for a change.  Why not look at where you are and ask why have you've been brought here to this place.  There might be blessings all around that you aren't seeing (and will never see) unless you look up.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/132016627730443140-9061068256355064979?l=davidkfaulk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkfaulk.blogspot.com/feeds/9061068256355064979/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=132016627730443140&amp;postID=9061068256355064979' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/9061068256355064979'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/9061068256355064979'/><link rel='alternate' type='text/html' href='http://davidkfaulk.blogspot.com/2007/06/thoughts-on-cheese.html' title='Thoughts on Cheese'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12551970868049421727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-132016627730443140.post-8064651227640079037</id><published>2007-06-06T20:31:00.000-07:00</published><updated>2007-06-06T20:37:39.569-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='random'/><title type='text'>Beginnings</title><content type='html'>Welcome to my blog! For three years I've learned about friends and family and gotten all my news from blogs. I figured it was time I join the fray.&lt;br /&gt;&lt;br /&gt;I hope this site will become a place that I discuss all spheres of my life - paying special attention to record my observances on their intersections and unions.&lt;br /&gt;&lt;br /&gt;For tonight, though, I'm off to bed. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Cas&lt;/span&gt; and I have had a long week and we're very sleep deprived.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/132016627730443140-8064651227640079037?l=davidkfaulk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkfaulk.blogspot.com/feeds/8064651227640079037/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=132016627730443140&amp;postID=8064651227640079037' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/8064651227640079037'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/132016627730443140/posts/default/8064651227640079037'/><link rel='alternate' type='text/html' href='http://davidkfaulk.blogspot.com/2007/06/beginnings.html' title='Beginnings'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12551970868049421727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
