<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>endot &#187; Programming</title>
	<atom:link href="http://endot.org/category/programming/feed/" rel="self" type="application/rss+xml" />
	<link>http://endot.org</link>
	<description>random seepage from the brain of a geek</description>
	<lastBuildDate>Fri, 23 Apr 2010 04:45:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>git_backup.pl &#8211; a simple script to backup with git</title>
		<link>http://endot.org/2009/09/27/git_backup-pl-a-simple-script-to-backup-with-git/</link>
		<comments>http://endot.org/2009/09/27/git_backup-pl-a-simple-script-to-backup-with-git/#comments</comments>
		<pubDate>Sun, 27 Sep 2009 21:24:58 +0000</pubDate>
		<dc:creator>nate</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://endot.org/?p=110</guid>
		<description><![CDATA[For a while now, I&#8217;ve been backing up the few WordPress blogs that I run for various people with a very simple script that followed this algorithm: Copy files to a temporary directory. Dump the MySQL data into a file in that directory. Tarball it up. Scp that file to another server that I run. [...]]]></description>
			<content:encoded><![CDATA[<p>For a while now, I&#8217;ve been backing up the few WordPress blogs that I run for various people with a very simple script that followed this algorithm:</p>
<ol>
<li>Copy files to a temporary directory.</li>
<li>Dump the MySQL data into a file in that directory.</li>
<li>Tarball it up.</li>
<li>Scp that file to another server that I run.</li>
</ol>
<p>At the time, I did this because it was the simplest thing that could possibly work.  It didn&#8217;t depend on any external facility other than mysqldump, tar, and scp.</p>
<p>Well, running that script on a nightly cron filled up my disk allocation on that remote server a couple times, so I got clever with the backup organization so I could quickly remove old backups while keeping sparser (monthly) backups for longer.  This only helped a little, because I was still nervous about deleting backups because I didn&#8217;t know what they contained.</p>
<p>I also have been using <a href="http://git-scm.com/">git</a> more and more recently and I liked the idea of version control that can go in any direction.  So, in the spare bits of time I&#8217;ve had in the past few weeks, I wrote git_backup.pl.  It takes a git repository and does the following:</p>
<ul>
<li>git add &lt;any new or modified files&gt;</li>
<li>git rm &lt;any deleted files&gt;</li>
<li>git commit</li>
<li>git push backup</li>
</ul>
<p>Now, when the backup is run, only the small changes are sent to the remote server and I can look at the differences by examining the git log.</p>
<p>There are options for dumping database tables, changing the commit message and the remote that gets the push.  Running &#8220;git_backup.pl &#8211;man&#8221; will show all the options.</p>
<p>The source is (of course) in a git repo: http://git.endot.org/git_backup.git</p>
<p>The tree and history can be browsed at <a href="http://git.endot.org/">http://git.endot.org/</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://endot.org/2009/09/27/git_backup-pl-a-simple-script-to-backup-with-git/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fixing R.app&#8217;s tendency to forget history</title>
		<link>http://endot.org/2009/08/28/fixing-r-apps-tendency-to-forget-history/</link>
		<comments>http://endot.org/2009/08/28/fixing-r-apps-tendency-to-forget-history/#comments</comments>
		<pubDate>Sat, 29 Aug 2009 01:23:03 +0000</pubDate>
		<dc:creator>nate</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://endot.org/?p=104</guid>
		<description><![CDATA[Being the data and visualization nerd that I am, I&#8217;ve been delving into R on occasion.  For this purpose, I am using R.app on my Mac.  To start it up for a certain working directory (to keep different projects separate), I run &#8220;open -a R &#60;working dir&#62;&#8221;.  This worked great until I noticed that my [...]]]></description>
			<content:encoded><![CDATA[<p>Being the data and visualization nerd that I am, I&#8217;ve been delving into <a href="http://www.r-project.org/">R</a> on occasion.  For this purpose, I am using R.app on my Mac.  To start it up for a certain working directory (to keep different projects separate), I run &#8220;open -a R &lt;working dir&gt;&#8221;.  This worked great until I noticed that my history wasn&#8217;t getting saved to the .Rhistory file in each directory.  When I use the command line R executable it does, but not in the R.app GUI.</p>
<p>So, it took me a little while to figure out that it&#8217;s a bug in the R.app code and you have to use a workaround.  Open R.app&#8217;s preferences and set the &#8220;R history file&#8221; key to something other than &#8220;.Rhistory&#8221;:</p>
<p><img class="alignnone size-full wp-image-105" title="rhistory" src="http://endot.org/wp-content/uploads/2009/08/rhistory.png" alt="rhistory" width="519" height="143" /></p>
<p>Now, after a restart, the .nateRhistory file in the working directory is properly updated.</p>
]]></content:encoded>
			<wfw:commentRss>http://endot.org/2009/08/28/fixing-r-apps-tendency-to-forget-history/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Watch out for technical debt</title>
		<link>http://endot.org/2009/03/05/watch-out-for-technical-debt/</link>
		<comments>http://endot.org/2009/03/05/watch-out-for-technical-debt/#comments</comments>
		<pubDate>Fri, 06 Mar 2009 03:32:56 +0000</pubDate>
		<dc:creator>nate</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://endot.org/?p=73</guid>
		<description><![CDATA[I&#8217;m always looking for ways to improve myself as a programmer.  It usually involves something fun, but after reading this post, I think my new area of improvement is to stop increasing my technical debt. From a related post from Steve McConnell: Other debt accumulates from taking hundreds or thousands of small shortcuts&#8211;generic variable names, [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m always looking for ways to improve myself as a programmer.  It usually involves something fun, but after reading <a href="http://www.codinghorror.com/blog/archives/001230.html">this post</a>, I think my new area of improvement is to stop increasing my technical debt.</p>
<p>From a <a href="http://blogs.construx.com/blogs/stevemcc/archive/2007/11/01/technical-debt-2.aspx">related post from Steve McConnell</a>:</p>
<blockquote><p>Other debt accumulates from taking hundreds or thousands of small shortcuts&#8211;generic variable names, sparse comments, creating one class in a case where you should create two, not following coding conventions, and so on. This kind of debt is like credit card debt.</p></blockquote>
<p>I was doing a review of some relatively mature (3 years) code today with the rest of my team and I found more instances of this kind of technical debt than I would like to admit.</p>
<p>There are other kinds of technical debt, and it&#8217;s easy to hate them and the reasons for incurring them, but this small stuff is totally under my control.  And it has to stop.</p>
]]></content:encoded>
			<wfw:commentRss>http://endot.org/2009/03/05/watch-out-for-technical-debt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>NDWall Milestone 2: Missed</title>
		<link>http://endot.org/2009/01/23/ndwall-milestone-2-missed/</link>
		<comments>http://endot.org/2009/01/23/ndwall-milestone-2-missed/#comments</comments>
		<pubDate>Fri, 23 Jan 2009 18:41:50 +0000</pubDate>
		<dc:creator>nate</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://endot.org/?p=65</guid>
		<description><![CDATA[Well, I didn&#8217;t get much of a chance to blog about the NDWall milestone 2 before it flew past this last Saturday.  Dave and I agreed a few weeks ago that milestone 2 would include the following features: Add a configuration/settings area for the application.  The keys are: Display Name, Username, Password, URL Move the [...]]]></description>
			<content:encoded><![CDATA[<p>Well, I didn&#8217;t get much of a chance to blog about the NDWall milestone 2 before it flew past this last Saturday.  Dave and I agreed a few weeks ago that milestone 2 would include the following features:</p>
<ul>
<li>Add a configuration/settings area for the application.  The keys are: Display Name, Username, Password, URL</li>
<li>Move the downloading of new messages into a thread so that it happens in thebackground.</li>
</ul>
<p>We set the deadline for this milestone to be last Saturday, the 17th of January.  I guess the first few weeks of the year got away from me, because by the time I woke up Saturday morning, I&#8217;d only done the first half of the<br />
assignment.  Add that to the fact that I was out of network range this past weekend (due to a wonderful trip to see Sara&#8217;s Grandma), and it&#8217;s time for me to add a virtual $20 to the jar.</p>
<p>I&#8217;ll post again when I finish up this milestone and we figure out what milestone 3 holds.</p>
]]></content:encoded>
			<wfw:commentRss>http://endot.org/2009/01/23/ndwall-milestone-2-missed/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>NDWall Milestone 1: completed</title>
		<link>http://endot.org/2008/10/18/ndwall-milestone-1-completed/</link>
		<comments>http://endot.org/2008/10/18/ndwall-milestone-1-completed/#comments</comments>
		<pubDate>Sat, 18 Oct 2008 22:53:15 +0000</pubDate>
		<dc:creator>nate</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[ndwall]]></category>
		<category><![CDATA[objectivec]]></category>

		<guid isPermaLink="false">http://endot.org/?p=59</guid>
		<description><![CDATA[Just after 1:30PM today, I finished up my implementation of the first milestone of the NDWall project.  The best part was trying to figure out to construct the request to post new messages.  Here are a few screen shots of the app: It really doesn&#8217;t do much other than the two required features.  I haven&#8217;t [...]]]></description>
			<content:encoded><![CDATA[<p>Just after 1:30PM today, I finished up my implementation of the first milestone of the <a href="http://endot.org/2008/10/06/ndwall-an-attempt-to-learn-iphone-development/">NDWall project</a>.  The best part was trying to figure out to construct the request to post new messages.  Here are a few screen shots of the app:</p>
<p><a href="http://www.flickr.com/photos/19501186@N00/2952978866/"><img src="http://farm4.static.flickr.com/3072/2952978866_115888f6bf_t.jpg" border="0" alt="start" /></a><a href="http://www.flickr.com/photos/19501186@N00/2952128067/"><img src="http://farm4.static.flickr.com/3194/2952128067_ab6469c501_t.jpg" border="0" alt="entering message" /></a><a href="http://www.flickr.com/photos/19501186@N00/2952978970/"><img src="http://farm4.static.flickr.com/3210/2952978970_c776d0b16c_t.jpg" border="0" alt="message posted" /></a></p>
<p>It really doesn&#8217;t do much other than the two required features.  I haven&#8217;t profiled it to make sure there are no memory leaks, but I&#8217;ll do that soon.  The manual memory management of the iPhone is definitely odd for someone like me who&#8217;s done mostly garbage collected languages in his career.</p>
<p>To learn what I had to for this phase, I relied heavily on reading the sample applications from Apple and through several of the detailed guides that come with the SDK.  The Objective C primer was invaluable, as was the documentation on NSMutableURLRequest.  The documentation browser and search functionality in XCode is pretty good.</p>
<p>Anyway, I feel like I&#8217;ve learned a lot in the past few weeks, and I already have several ideas for milestone 2.  I&#8217;ll post again when we start that phase.</p>
]]></content:encoded>
			<wfw:commentRss>http://endot.org/2008/10/18/ndwall-milestone-1-completed/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>NDWall: an attempt to learn iPhone development</title>
		<link>http://endot.org/2008/10/06/ndwall-an-attempt-to-learn-iphone-development/</link>
		<comments>http://endot.org/2008/10/06/ndwall-an-attempt-to-learn-iphone-development/#comments</comments>
		<pubDate>Tue, 07 Oct 2008 05:46:57 +0000</pubDate>
		<dc:creator>nate</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[ndwall]]></category>
		<category><![CDATA[objectivec]]></category>

		<guid isPermaLink="false">http://endot.org/?p=57</guid>
		<description><![CDATA[The best way to learn a new programming language/environment is to make something practical with it. To that end, Dave and I started a little side project called (at this point) NDWall.  It&#8217;s an implementation of a &#8220;wall&#8221; where new messages can be posted and the 10 most recent can be viewed.  The server-side api [...]]]></description>
			<content:encoded><![CDATA[<p>The best way to learn a new programming language/environment is to make something practical with it.</p>
<p>To that end, <a href="http://blog.unleashed.org/">Dave</a> and I started a little side project called (at this point) NDWall.  It&#8217;s an implementation of a &#8220;wall&#8221; where new messages can be posted and the 10 most recent can be viewed.  The <a href="https://svn.goodcleansoftware.org/gcs/ndwall/trunk/web/0.1/api.php">server-side api</a> is very simple.  Just two methods (GET and POST) on the api resource.  The data transport is JSON, the lingua franca of web APIs.</p>
<p>We&#8217;re each making our own version of the client, written in Objective-C using the <a href="http://developer.apple.com/iphone/">iPhone SDK</a>.  To help light the fire, the first version of the client must be written by midnight on Saturday, October 18th.  The first version must do just two things:</p>
<ul>
<li>Allow posting a new message to the server.</li>
<li>Download and display the last 10 messages from the server.</li>
</ul>
<p>We started doing this about a month ago, but kept pushing the deadline off as it approached, so this time, we agreed that whoever didn&#8217;t deliver this time would have to put $20 into a jar*.</p>
<p>I think it&#8217;s working.  This past Saturday, there was much documentation reading and code typing and instant message sending going on.  Tonight, I got my client to pull the data down for the first time.</p>
<p>This is fun.</p>
<p>* jar money purpose not determined at this time.</p>
]]></content:encoded>
			<wfw:commentRss>http://endot.org/2008/10/06/ndwall-an-attempt-to-learn-iphone-development/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>On Abstraction Layers</title>
		<link>http://endot.org/2008/08/14/on-abstraction-layers/</link>
		<comments>http://endot.org/2008/08/14/on-abstraction-layers/#comments</comments>
		<pubDate>Thu, 14 Aug 2008 20:31:25 +0000</pubDate>
		<dc:creator>nate</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://endot.org/?p=52</guid>
		<description><![CDATA[One of the things that&#8217;s been on my mind recently has been optimizing my work life so that I can either spend less time doing the same stuff or accomplish more in the same amount of time. In the back of my head has always been Joel&#8217;s test, and in my feed reader the other [...]]]></description>
			<content:encoded><![CDATA[<p>One of the things that&#8217;s been on my mind recently has been optimizing my work life so that I can either spend less time doing the same stuff or accomplish more in the same amount of time.</p>
<p>In the back of my head has always been <a href="http://www.joelonsoftware.com/articles/fog0000000043.html">Joel&#8217;s test</a>, and in my feed reader the other day, I found a similar list; the humorously titled &#8220;<a href="http://www.postal-code.com/binarycode/2008/07/28/youre-doing-it-wrong-if/">Your Doing it Wrong if&#8230;</a>&#8220;  I had to laugh hard at the fourth entry on that list, as I have written my own database abstraction layer (hereafter DAL).  I have all sorts of excuses for why it was written at the time, but I must say that after using it for almost three years, I think that using another (preferably open source) layer is the best idea.  I&#8217;ve come to realize (and have read in several places) that you shouldn&#8217;t write something that is not your core business.  If you&#8217;re selling stuffed bunnies online, don&#8217;t write your own shopping cart.  Buy one or use something like <a href="http://www.zencart.com/">ZenCart</a> or <a href="http://www.magentocommerce.com/">Magento</a>.  Of course, if your business is the shopping cart (like, oh, Amazon), then go right ahead.</p>
<p>Anyway, I was talking about DALs with a friend today, and he mentioned <a href="http://jeremy.zawodny.com/blog/archives/002194.html">this blog post</a>, which speaks out against these layers.  The post rails against them as a method of keeping software database independent.  I agree with him that that is not a good reason by itself to use a DAL, but it got me to thinking about why I use one.</p>
<p>My answer to that question comes from <a href="http://www.amazon.com/exec/obidos/ASIN/0735619670">Mr. Code Complete</a> himself, <a href="http://www.stevemcconnell.com/">Steve McConnel</a>.  He&#8217;s quoted on a <a href="http://www.codinghorror.com/blog/archives/000051.html">Coding Horror</a> post as saying:</p>
<blockquote><p>Nobody is really smart enough to program computers. Fully understanding an average program requires an almost limitless capacity to absorb details and an equal capacity to comprehend them all at the same time. The way you focus your intelligence is more important than how much intelligence you have.</p>
<p>At the 1972 Turing Award lecture, Edsger Dijkstra delivered a paper titled “The Humble Programmer.” He argued that most of programming is an attempt to compensate for the strictly limited size of our skulls. The people who are best at programming are the people who realize how small their brains are. They are humble. The people who are the worst at programming are the people who refuse to accept the fact that their brains aren’t equal to the task. Their egos keep them from being great programmers. The more you learn to compensate for your small brain, the better a programmer you’ll be. The more humble you are, the faster you’ll improve.</p>
<p>The purpose of many good programming practices is to reduce the load on your gray cells. You might think that the high road would be to develop better mental abilities so you wouldn&#8217;t need these programming crutches. You might think that a programmer who uses mental crutches is taking the low road. Empirically, however, it&#8217;s been shown that humble programmers who compensate for their fallibilities write code that&#8217;s easier for themselves and others to understand and that has fewer errors. The real low road is the road of errors and delayed schedules.</p></blockquote>
<p>The best reason to use a DAL (or any abstraction, for that matter) is outlined above: to encapsulate a set of functionality (data persistence) and then remove it from the front of the programmers mind.  This frees the mind to concentrate on higher level concerns like (hopefully) the core business logic.  Of course, DALs tend to grow and morph until they become bloated and try to accomplish less important tasks (like database independence), but the real benefit of using them is to write less code and when you write less code, you will naturally create fewer bugs.  I don&#8217;t want to avoid SQL because I hate it or can&#8217;t use it, but rather because it is unnecessary to always have it in the front of my mind.</p>
<p>Of course, using or not using DALs should never be a hard and fast rule.  If your application only persists to one table (or a few), or has very tight memory requirements, or uses gypsy midgets, feel free to skip a DAL.</p>
<p>And, as always, these are <a href="http://www.codinghorror.com/blog/archives/001124.html">strong opinions, weakly held</a>.</p>
<p>Good luck.</p>
]]></content:encoded>
			<wfw:commentRss>http://endot.org/2008/08/14/on-abstraction-layers/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Nothing is safe from the almighty Domain Specific Language</title>
		<link>http://endot.org/2008/04/21/nothing-is-safe-from-the-almighty-domain-specific-language/</link>
		<comments>http://endot.org/2008/04/21/nothing-is-safe-from-the-almighty-domain-specific-language/#comments</comments>
		<pubDate>Tue, 22 Apr 2008 02:43:28 +0000</pubDate>
		<dc:creator>nate</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://endot.org/2008/04/21/nothing-is-safe-from-the-almighty-domain-specific-language/</guid>
		<description><![CDATA[What Ruby on Rails is to web programming, and Capistrano is to deployment, now Castanaut is to screencasts: #!/usr/bin/env castanaut plugin &#34;safari&#34; plugin &#34;mousepose&#34; plugin &#34;ishowu&#34; launch &#34;Mousepose&#34; launch &#34;Safari&#34;, at(20, 40, 1024, 768) url &#34;http://gadgets.inventivelabs.com.au&#34; ishowu_set_region at(4, 24, 1056, 800) ishowu_start_recording while_saying &#34; Tabulate is a bookmarklet developed by Inventive Labs. You use it [...]]]></description>
			<content:encoded><![CDATA[<p>What <a href="http://rubyonrails.com/">Ruby on Rails</a> is to web programming,</p>
<p>and <a href="http://www.capify.org/">Capistrano</a> is to deployment,</p>
<p>now <a href="http://gadgets.inventivelabs.com.au/castanaut">Castanaut</a> is to screencasts:</p>
<pre class="brush: ruby;">#!/usr/bin/env castanaut

plugin &quot;safari&quot;
plugin &quot;mousepose&quot;
plugin &quot;ishowu&quot;

launch &quot;Mousepose&quot;

launch &quot;Safari&quot;, at(20, 40, 1024, 768)
url &quot;http://gadgets.inventivelabs.com.au&quot;

ishowu_set_region at(4, 24, 1056, 800)
ishowu_start_recording

while_saying &quot;
  Tabulate is a bookmarklet developed by Inventive Labs.
  You use it to open links on a web page.
  It's meant for iPhones, but we'll demonstrate it in Safari 3.
&quot; do
  move to(240, 72)
  tripleclick
  type &quot;http://gadgets.inventivelabs.com.au/tabulate&quot;
  hit Enter
  pause 2
end</pre>
<p>So cool.</p>
]]></content:encoded>
			<wfw:commentRss>http://endot.org/2008/04/21/nothing-is-safe-from-the-almighty-domain-specific-language/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Remember, thou wast once a noob</title>
		<link>http://endot.org/2008/03/28/remember-thou-wast-once-a-noob/</link>
		<comments>http://endot.org/2008/03/28/remember-thou-wast-once-a-noob/#comments</comments>
		<pubDate>Sat, 29 Mar 2008 00:01:17 +0000</pubDate>
		<dc:creator>nate</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://endot.org/2008/03/28/remember-thou-wast-once-a-noob/</guid>
		<description><![CDATA[I was handling a customer support request today and it read something like this: I changed a setting and now I get an error. What&#8217;s wrong? My knee-jerk reaction was to think, &#8220;Well, then what was the error?!?&#8221; You see, I&#8217;m a problem solver. I love to dismantle things and figure out why something isn&#8217;t [...]]]></description>
			<content:encoded><![CDATA[<p>I was handling a customer support request today and it read something like this:</p>
<blockquote><p>I changed a setting and now I get an error.  What&#8217;s wrong?</p></blockquote>
<p>My knee-jerk reaction was to think, &#8220;Well, then what was the error?!?&#8221;  You see, I&#8217;m a problem solver.  I love to dismantle things and figure out why something isn&#8217;t working properly.  To me, the first step toward the solution is to figure out what the problem is.  So my first attempt at formulating a response went something like this:</p>
<blockquote><p>Here&#8217;s how to figure out what the error was.  Come back when you&#8217;ve done this minimal amount of work.</p></blockquote>
<p>Ooooh, <a href="http://www.urbandictionary.com/define.php?term=snarky">snarky</a>.</p>
<p>Before I hit &#8216;Send Reply&#8217;, I took a bit of time to explain the situation to a co-worker and made the point that figuring out the problem is a vital first step to working toward a solution and that there are common ways of discovering what a particular error is (logging, debug flags, etc.).  I also stated that these problem solving tactics are learned best by experience as opposed to reading or hearing about them.</p>
<p>Then, my mind came up with this question: &#8220;Was I ever not a good problem solver?&#8221;  That question suddenly humbled me and gave me a new perspective on the whole situation.  I changed my response to first validate that the way the customer was changing the setting was correct and that the error was indeed an unexpected result.  I went on to explain how to figure out what the error was and that I&#8217;d help them figure out what was going on.</p>
<p>You see, snarkiness is fun, but it&#8217;s rarely edifying for the snarkee.</p>
<p>I don&#8217;t post this to boast of my humility.  In fact, I&#8217;m quite embarrassed about the way that I initially reacted.  It&#8217;s my hope that this will remind you to always remember that you were once the student.</p>
]]></content:encoded>
			<wfw:commentRss>http://endot.org/2008/03/28/remember-thou-wast-once-a-noob/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Everybody Lies</title>
		<link>http://endot.org/2008/03/10/everybody-lies/</link>
		<comments>http://endot.org/2008/03/10/everybody-lies/#comments</comments>
		<pubDate>Mon, 10 Mar 2008 15:53:09 +0000</pubDate>
		<dc:creator>nate</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://endot.org/2008/03/10/everybody-lies/</guid>
		<description><![CDATA[With insight into why people don&#8217;t read manuals and why features sell products: http://www.codinghorror.com/blog/archives/001048.html Also: http://www.jnd.org/dn.mss/simplicity_is_highly.html http://www.joelonsoftware.com/uibook/chapters/fog0000000062.html From the Norman essay: Logic and reason, I have to keep explaining, are wonderful virtues, but they are irrelevant in describing human behavior. Trying to prove a point through intelligent, reasonable argumentation is what I call the &#8220;engineer’s [...]]]></description>
			<content:encoded><![CDATA[<p>With insight into why people don&#8217;t read manuals and why features sell products:</p>
<p><a href="http://www.codinghorror.com/blog/archives/001048.html">http://www.codinghorror.com/blog/archives/001048.html</a></p>
<p>Also:</p>
<p><a href="http://www.jnd.org/dn.mss/simplicity_is_highly.html">http://www.jnd.org/dn.mss/simplicity_is_highly.html</a><br />
<a href="http://www.joelonsoftware.com/uibook/chapters/fog0000000062.html">http://www.joelonsoftware.com/uibook/chapters/fog0000000062.html</a></p>
<p>From the Norman essay:</p>
<p>Logic and reason, I have to keep explaining, are wonderful virtues, but they are irrelevant in describing human behavior. Trying to prove a point through intelligent, reasonable argumentation is what I call the &#8220;engineer’s fallacy.&#8221; (Also, the &#8220;economist’s fallacy.&#8221;)  We have to design for the way people really <strong>behave</strong>, not as engineers or economists would <strong>prefer</strong> them to behave.</p>
<p>I find myself re-learning this again and again.</p>
]]></content:encoded>
			<wfw:commentRss>http://endot.org/2008/03/10/everybody-lies/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
