<?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>ihumanable &#187; none</title>
	<atom:link href="http://ihumanable.com/blog/category/none/feed/" rel="self" type="application/rss+xml" />
	<link>http://ihumanable.com/blog</link>
	<description>usable in any place a human can be used</description>
	<lastBuildDate>Wed, 11 May 2011 15:10:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<item>
		<title>One Year Later</title>
		<link>http://ihumanable.com/blog/2011/05/11/one-year-later/</link>
		<comments>http://ihumanable.com/blog/2011/05/11/one-year-later/#comments</comments>
		<pubDate>Wed, 11 May 2011 15:08:43 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[none]]></category>

		<guid isPermaLink="false">http://ihumanable.com/blog/?p=929</guid>
		<description><![CDATA[For the last year I&#8217;ve worked as the Director of New Media and Web Development for 614 Media Group. It&#8217;s a lofty title, meant to inspire all who read my email signature that, &#8220;Hey this guy is a bigshot.&#8221; In reality what I did was much more mundane, I wrote LAMP applications. For the last [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_930" class="wp-caption alignright" style="width: 310px"><a href="http://ihumanable.com/blog/wp-content/uploads/2011/05/logo_header.jpg"><img src="http://ihumanable.com/blog/wp-content/uploads/2011/05/logo_header-300x111.jpg" alt="614 Media Group Header" title="logo_header" width="300" height="111" class="size-medium wp-image-930" /></a><p class="wp-caption-text">Where I&#039;ve hung my hat this last year</p></div>
<p>For the last year I&#8217;ve worked as the <em>Director of New Media and Web Development</em> for 614 Media Group.  It&#8217;s a lofty title, meant to inspire all who read my email signature that, &#8220;Hey this guy is a bigshot.&#8221;  In reality what I did was much more mundane, I wrote LAMP applications.  For the last year I&#8217;ve sat down everyday at this Mac, popped into TextMate, and wrote PHP.  I was king of the castle, and being king is good, I got to choose my tools: Mac + TextMate + Git + MAMP + MacGDBp + GitHub + GitHub Issues + Flourish.  I got to work on interesting products, if you had told me a year ago that in a year&#8217;s time I would have written both a Groupon Competitor and a full CMS system, I would have told you that was crazy talk.</p>
<p>Over the last year I have grown as a developer and as a system administrator and as someone trying to get traction for a new product and as a million other hats I got to wear.  For the first time in my career I was able to go from concept to &#8220;functioning-putting-money-in-the-bank&#8221; web application.  This is huge.  Having been a consultant for years before this job, I spent most of my time maintaining other peoples systems, throwing in a feature here or there, coding up a new report, stuff like that.  At 614 I was able to start from nothing, build up a database schema, create the framework and the code, paint it all pretty, launch, iterate, relaunch, iterate, tear my hair out, wake up to fix problems at 3am, curse the server for being slightly different than development, drink more caffeine than any human should drink, but most importantly <strong>learn and grow</strong>.</p>
<p>With learning and growing in mind, I have an announcement to make, at the end of this month I will be leaving my job at 614 Media Group.  I leave on a good note though, the software is stable and quietly humming along bringing in revenue.  I am leaving behind a framework with a proven track record, a stable foundation that can be built upon.  But most importantly I&#8217;m leaving as a friend and supporter of 614, wishing them nothing but the best for the future.  614&#8242;s curse is that they put a lot of responsibility into your hands and if you are good at it, other people will take notice, and those other people may come in and make you an offer you can&#8217;t refuse.</p>
<div id="attachment_935" class="wp-caption alignleft" style="width: 255px"><a href="http://ihumanable.com/blog/wp-content/uploads/2011/05/gangster-movies-the-godfather-brando.jpg"><img src="http://ihumanable.com/blog/wp-content/uploads/2011/05/gangster-movies-the-godfather-brando-245x300.jpg" alt="Marlon Brando as The Godfather" title="gangster-movies-the-godfather-brando" width="245" height="300" class="size-medium wp-image-935" /></a><p class="wp-caption-text">They made me an offer I couldn&#039;t refuse</p></div>
<p>I&#8217;m not sure how much I&#8217;m allowed to say about the new position, but I will be moving out to the West Coast this month to start a new chapter in my career.  For the PHP folks out there, do not worry, I will still be rocking PHP (but also probably rocking some ruby and java as well and anything else they want me to learn).  This is a big, stressful, somewhat scary decision to make, but I believe in the company that I will be joining, and after meeting with their people am nothing but excited to work with and learn from them.</p>
<p>Growth and change are good things, they can be painful and stressful and sad sometimes, but the minute you stop growing as a developer you&#8217;ve given up, and I love programming too much to give up.  This next month is going to be a blur of packing and moving and unpacking and learning a new area and learning a new codebase and new people and new places.  Parts of it will be uncomfortable, parts will be stressful, but overall it will be a learning experience I couldn&#8217;t get anywhere else, and I wouldn&#8217;t have it any other way.</p>
]]></content:encoded>
			<wfw:commentRss>http://ihumanable.com/blog/2011/05/11/one-year-later/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Excel and PHP</title>
		<link>http://ihumanable.com/blog/2011/04/19/excel-and-php/</link>
		<comments>http://ihumanable.com/blog/2011/04/19/excel-and-php/#comments</comments>
		<pubDate>Tue, 19 Apr 2011 18:08:25 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[none]]></category>

		<guid isPermaLink="false">http://ihumanable.com/blog/?p=919</guid>
		<description><![CDATA[Note: I may seem a bit harsh on Excel, but I actually think it&#8217;s an amazing piece of technology, I just don&#8217;t like how people abuse it. Web development for business people follows a fairly predictable path. Here is a generalized form of it. Business person encounters problem Grabs Excel, Excel being the magic fix [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_920" class="wp-caption alignright" style="width: 390px"><img src="http://ihumanable.com/blog/wp-content/uploads/2011/04/image.png" alt="Reese&#039;s Peanut Butter Cups" title="image" width="380" height="150" class="size-full wp-image-920" /><p class="wp-caption-text">You got Spreadsheet in my Web App, you got Web App in my Spreadsheet... and it&#039;s delicious!</p></div>
<p><em>Note: I may seem a bit harsh on Excel, but I actually think it&#8217;s an amazing piece of technology, I just don&#8217;t like how people abuse it.</em></p>
<p>Web development for business people follows a fairly predictable path.  Here is a generalized form of it.</p>
<ol>
<li>Business person encounters problem</li>
<li>Grabs Excel, Excel being the magic fix for everything</li>
<li>Creates abomination of a solution in Excel, it grows too large, concurrency and consistency issues creep in</li>
<li>At this point normally a web developer will be brought in to &#8220;Make this Excel sheet work on the internets&#8221;</li>
<li>Work work work work work&#8230;</li>
<li>Everyone is delighted</li>
<li>Hey is there anyway we can dump these value back into Excel?!</li>
<li>At some point they will use the dump to create some new spreadsheet, go back to step 3.</li>
</ol>
<p>Now of course it&#8217;s not always this bad and normally there are really good reasons to dump things back into Excel, instead of bothering the web developer with a bunch of business analysis, they can dump the data and perform the Excel wizardry they love so much.  I actually think this is a good idea, instead of me baking in calculated values or reinventing Averages and Means and all the other cool stuff Excel can already do, I just drop them off some nice raw data and let them have their business fun.  They get exactly what they need, I get exactly what I want (less fragile code with less crazy business rules) and everyone is happy.</p>
<p>Now in PHP there are various solutions to dumping out Excel.  The first would be the venerable <a href="http://pear.php.net/package/Spreadsheet_Excel_Writer/redirected">Spreadsheet_Excel_Writer</a>.  I&#8217;ve used it before and it works, it&#8217;s a port of a Perl library called Spreadsheet::WriteExcel, but there are a few drawbacks.  The first is that it&#8217;s a PEAR module, you use PEAR to install it and it brings along all kind of PEAR stuff like PEAR_Exception and the like.  The second is that on the homepage for Spreadsheet_Excel_Writer is this very happy message, &#8220;Spreadsheet_Excel_Writer is outdated and needs a complete rewrite. If you want to help with this task please get in touch with us. Otherwise we don&#8217;t recommend this package for new development.&#8221;  So in short, we should avoid Spreadsheet_Excel_Writer.</p>
<p>The next thing you might find in your googling is <a href="http://phpexcel.codeplex.com/">PHPExcel</a> which writes out OpenXML 2007 files.  This is another large and much more well maintained library for working with Excel files.  If you need any advanced features I would highly suggest looking into this one.</p>
<p>But I want something simpler than this, I just want to dump some data out.  I don&#8217;t need to have all these bells and whistles.  Also I hate the fact that to write out a few cells in most of these Excel Libraries requires the following.</p>
<pre class="brush: php; title: ;">
$objPHPExcel = new PHPExcel();
// Add some data
$objPHPExcel-&gt;setActiveSheetIndex(0);
$objPHPExcel-&gt;getActiveSheet()-&gt;SetCellValue('A1', 'Hello');
$objPHPExcel-&gt;getActiveSheet()-&gt;SetCellValue('B2', 'world!');
$objPHPExcel-&gt;getActiveSheet()-&gt;SetCellValue('C1', 'Hello');
$objPHPExcel-&gt;getActiveSheet()-&gt;SetCellValue('D2', 'world!');
</pre>
<p>The way these libraries work are just, ugh.  They are very heavy and when you are just trying to plop some values into a spreadsheet so someone can have at them, they are overkill.  I found myself rewriting the same solution again and again, it&#8217;s a fancy little solution using some <tt>pack()</tt> magic that I found over <a href="http://www.dotvoid.com/2007/07/generating-excel-files-with-php/">here</a>.  Here&#8217;s what a simple little spreadsheet looks like.</p>
<pre class="brush: php; title: ;">
require_once('Excel.php');
$sheet = new Excel('My Awesome Spreadsheet');
$sheet-&gt;label('Hello');   //Write out 'Hello'
$sheet-&gt;left();           //Move the cursor left
$sheet-&gt;label('World');   //Write out 'World'
$sheet-&gt;down();           //Move the cursor down
$sheet-&gt;home();           //Head as far left as possible
$sheet-&gt;number(1337);     //We are so 1337
$sheet-&gt;send();           //Melt the user's face off
</pre>
<p>This has met my needs and you can find it as a Gist right over <a href="https://gist.github.com/929039">here</a>.  I wanted an object oriented way to use those functions and I wanted some help in moving the cursor around and some simple sanity checks on things so that I didn&#8217;t ruin anything.  It&#8217;s got plenty of comments in code and should be pretty simple to pick up.  You can write out labels or numbers and you can move the cursor all around, left, right, up, down, top, and home (top being the first row, home being the first column).</p>
<p>For right now this is meeting all my needs and more, I&#8217;ve recently been playing around with the fact that Excel will happily turn HTML Tables into Spreadsheets, I&#8217;ve got a library cooking for this but have been playing around with some interesting ideas for styling and other advanced features.  Until then hopefully this will help any PHP programmer who just wants to dump out some data without going into dependency hell.</p>
<p>Happy Coding</p>
<h2><a href="https://gist.github.com/929039">Get my handy dandy Excel Writer here</a></h2>
]]></content:encoded>
			<wfw:commentRss>http://ihumanable.com/blog/2011/04/19/excel-and-php/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Form Generator for Flourish</title>
		<link>http://ihumanable.com/blog/2011/01/12/form-generator-for-flourish/</link>
		<comments>http://ihumanable.com/blog/2011/01/12/form-generator-for-flourish/#comments</comments>
		<pubDate>Wed, 12 Jan 2011 03:28:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[none]]></category>

		<guid isPermaLink="false">http://ihumanable.com/blog/?p=891</guid>
		<description><![CDATA[A while back I saw a post in the Flourish discussion boards requesting a Form Generation system, see here. The short discussion that follows basically argues that form generation is too subjective and although it may at some point be added to Flourish it won&#8217;t be anytime soon. I work in Flourish all day, everyday, [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_892" class="wp-caption alignright" style="width: 310px"><img src="http://ihumanable.com/blog/wp-content/uploads/2011/01/gears-300x185.jpg" alt="Interlocking Gears" title="gears" width="300" height="185" class="size-medium wp-image-892" /><p class="wp-caption-text">Machines are complicated, so is software</p></div>
<p>A while back I saw a post in the <a href="http://flourishlib.com">Flourish</a> discussion boards requesting a Form Generation system, <a href="http://flourishlib.com/discussion/2/250">see here</a>.  The short discussion that follows basically argues that form generation is too subjective and although it may at some point be added to Flourish it won&#8217;t be anytime soon.  I work in Flourish all day, everyday, and I love every minute of it.  I&#8217;m probably beating a dead horse at this point, but Flourish really is just a tremendously solid core to build off of.  Working with Flourish so much and finding myself performing the same form mark-up again and again, I&#8217;ve given some serious thought to building a Form Generation system and have been using a prototype system for a week or two.  Having built a working Form Generation system and used it for a while I want to talk about the good, the bad, and the ugly.</p>
<p><strong>The Good</strong></p>
<p>As a programmer there is nothing more frustrating than finding a library or an API you want to use and having it just be an absolute nightmare to integrate with.  I spend a lot of time, ever since <a href="http://prosper-lib.com">Prosper</a>, thinking very hard about how to provide great APIs that make people <em>want</em> to use my software.  After a lot of thought about how to go about building a Form Generator library, I&#8217;ve come to what I think is the right balance.  The ideal API should fit well with the Flourish way of doing things, be flexible, powerful, expressive, and extensible.  So without any further bloviating, here is my proposed syntax, in this example I will use a simple sign-in form.</p>
<pre class="brush: php; title: ;">
echo fForm::post()
          -&gt;add(fForm::text('Username'))
          -&gt;add(fForm::password('Password'))
          -&gt;add(fForm::submit('Sign In'));
</pre>
<p>This would produce the following output</p>
<pre class="brush: xml; title: ;">
&lt;form action=&quot;http://the/current/url/&quot; method=&quot;post&quot;&gt;
  &lt;label for=&quot;username&quot;&gt;Username&lt;/label&gt;
  &lt;input type=&quot;text&quot; id=&quot;username&quot; name=&quot;username&quot; /&gt;
  &lt;br&gt;
  &lt;label for=&quot;password&quot;&gt;Password&lt;/label&gt;
  &lt;input type=&quot;password&quot; id=&quot;password&quot; name=&quot;password&quot; /&gt;
  &lt;br&gt;
  &lt;input type=&quot;submit&quot; id=&quot;sign_in&quot; name=&quot;sign_in&quot; value=&quot;Sign In&quot; /&gt;
&lt;/form&gt;
</pre>
<p>The API is fluid, simple, and concise.  It follows the Flourish style and uses fGrammar::underscorize() to turn labels into ids.  It produces clean simple markup and doesn&#8217;t mangle any ids, allowing for JavaScript to be easily attached.  As far as the API goes, I&#8217;m really quite happy.  The other powerful thing this allows you to do is tightly integrate your Form Generation with value repopulation, for automatically refilling in values when an error occurs.  With this tight integration I&#8217;ve been able to create a prototype system that automatically repopulates across posts when an error occurs, can use an existing fActiveRecord instance as a seed to make editing amazingly easy, and display beautiful inline errors on the form.</p>
<p><strong>The Bad</strong></p>
<p>Having used the prototype for a while I can say it&#8217;s not all great.  Simple CRUD style forms are incredibly easy to mock up, having error values persist automatically is really nice, and having inline error message (especially those from fActiveRecord::validate()) work with little fuss has been a huge speed boost.  I can knock out simple pages in a fraction of the time.  The problem comes when I want to do some edge case, PHP&#8217;s greatest strength is easily outputting whatever markup you want, by introducing this layer of indirection you give up this inherent strength for whiz-bang features.  It&#8217;s still incredibly easy to output whatever markup you like, but the disparity between the automatic features the fForm library gives you and your own simple markup is stark and will bewilder a normal user.  The problem here isn&#8217;t that fForm lacks power, it&#8217;s that it imbues certain elements with too many features and makes creating a one off element prohibitively expensive.</p>
<p><strong>The Ugly</strong></p>
<p>The architecture that worked best for implementing the prototype was a tangled mess of inheritance, and no matter how much I tried to refactor I still haven&#8217;t found an inheritance graph that I find acceptable.  Using my prototype has considerably cut down on development time, but the amount of memory used holding a object graph in memory to represent complex forms is a trade-off.  The API has several inconsistencies that bother me, but don&#8217;t really impact the performance or usability of the library.</p>
<p><strong>The Future</strong></p>
<p>So where to go from here?  That&#8217;s the question I keep coming back to.  I want to introduce a layer between object graph and view, this way a plugin system can be used to change the rendering of elements and the form itself in a fundamental way.  As soon as possible I plan on releasing a clean room open source version of the fForm library for use with Flourish on GitHub.  I believe I&#8217;ve come up with a way to make an easily extensible widget system, now I just need to get something out the door.  I will release it with my alpha framework, <a href="https://github.com/ihumanable/rigby">Rigby</a>, in the coming weeks.  Comments, and of course forks, are welcome.  I will release some screencasts about how to use Rigby once I get it into a stable state.  Stay Tuned!</p>
]]></content:encoded>
			<wfw:commentRss>http://ihumanable.com/blog/2011/01/12/form-generator-for-flourish/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Second System</title>
		<link>http://ihumanable.com/blog/2010/11/02/second-system/</link>
		<comments>http://ihumanable.com/blog/2010/11/02/second-system/#comments</comments>
		<pubDate>Tue, 02 Nov 2010 19:20:39 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[none]]></category>

		<guid isPermaLink="false">http://ihumanable.com/blog/?p=882</guid>
		<description><![CDATA[I&#8217;ve been working, both on the job and as a freelancer, right now my 9-5 is starting to enter that ever so exciting phase where one project enters maintenance mode and another project starts to spin up. The new project starting to spin up is to rewrite the CMS system that powers our various publication [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_883" class="wp-caption alignright" style="width: 310px"><a href="http://ihumanable.com/blog/wp-content/uploads/2010/11/dominos.jpg"><img src="http://ihumanable.com/blog/wp-content/uploads/2010/11/dominos-300x225.jpg" alt="Cargo ship with containers crashing" title="Cargo ship with containers crashing" width="300" height="225" class="size-medium wp-image-883" /></a><p class="wp-caption-text">Just a little more to the left....</p></div>
<p>I&#8217;ve been working, both on the job and as a <a href="http://ihumanable.com/blog/2010/10/22/freelance/">freelancer</a>, right now my 9-5 is starting to enter that ever so exciting phase where one project enters maintenance mode and another project starts to spin up.  The new project starting to spin up is to rewrite the CMS system that powers our various publication websites.  Now for those of you not in the know, a CMS system is crazy complicated.  I&#8217;m writing this current blogpost in a very specialized CMS system called WordPress, just for blogging.  This software probably has had somewhere upwards of eleventy-billion man hours go into it (once you factor in themes and plugins and all that jazz).</p>
<p>Of course whenever you are faced with a complex problem that&#8217;s been <em>solved to death</em> your best bet is to look around and see if anyone has done the heavy lifting for you already.  So I started looking around, WordPress, Joomla, Drupal, all mature PHP CMS systems, none that I&#8217;m familiar with even a little.  I started reading, out of the three I ended up liking Drupal the best, it seems well engineered, flexible, and very stable.  I read and read and read about nodes and the way Drupal thinks about content and I started to think, ok maybe we can use this.  The problem is that management is used to a level a flexibility that I won&#8217;t have with Drupal for months, maybe even years.  They want this flexibility from the beginning and that was making using Drupal seem less and less likely.  Then some requirements filtered in and out and it looks like a custom solution is going to be best&#8230; c&#8217;est la vie.</p>
<p>Now this is in no way a slight against Drupal or Joomla or any other CMS system out there, I&#8217;m sure in the hands of Drupal Ninja or Joomla Gurus this would be easy as pie.  For me though, building a solid system on my time tested and well worn toolbox of PHP, SQL, and <a href="http://flourishlib.com/">Flourish</a> will probably be the best way to deal with the constantly changing features and requirements that we need to support.  Now I&#8217;m going to start building, start sketching out how things will work, how data will be thought of in the system, user models, documents, revisions, all kinds of fun stuff.  It&#8217;s a bit intimidating, but as a Software Developer this is really the stuff I live for, big gnarly problem, blank TextMate buffer, well known tools, get cracking.</p>
<p>The big problem I&#8217;m fighting right now is the dreaded <a href="http://en.wikipedia.org/wiki/Second-system_effect">Second-system effect</a>.  Watch out for this my dear friends, it&#8217;s not a nice trap to get caught in.  It works a little something like this.</p>
<ol>
<li>Build a system, this is the First-system, it works, celebrate and have a shot of Jack.</li>
<li>That stupid &#8220;real world&#8221; comes in and messes up your data model, you add a little hack to compensate.</li>
<li>Oh, it has to be able to do what?  No, you said it didn&#8217;t have to do that!!  Fine, hack hack hack.</li>
<li>Maybe some cleanup, probably some more hacking and bending.</li>
<li>You&#8217;ve tried your best to keep First-system shiny and new, but the shine&#8217;s off the apple.</li>
<li>Crazy requirement, requires rewriting huge parts of the system, oh noes!</li>
<li>Alright, now that we know so much more let&#8217;s build Second-system.</li>
</ol>
<p>Herein lies the danger.  You get the go ahead to build Second-system, and you have all this experience from First-system, you really think you understand the problem domain a lot better, so far so good.  Here&#8217;s where things get hairy though, you start thinking about how you would build the system so that you don&#8217;t run into the same problem First-system had, you start abstracting and abstracting, it gets more and more complicated, but you are now a master in this domain, you can handle it.  Users who have been frustrated for months or years using First-system start throwing in their advice, things that have always bugged them, their nice-to-haves, and hell, you haven&#8217;t built anything yet, chuck that automated-frog-boiler in your system plan.</p>
<p>Before you know it you&#8217;ve got a beautiful masterpiece, it handles everything, all the problems encountered in the First-system, all the nice-to-haves, everything, it is a theoretical thing of beauty.  Now all you need is 6 maybe 7 years to build it&#8230;. oh shit.  But there&#8217;s something even more wrong about the Second-system, it has buried in it a dirty lie, that you understand the problem domain.  You probably have a pretty good understanding of the problem domain, <strong>as it stands right now</strong>.  Having already tackled this problem once does not make you clairvoyant, there will be changes to the system and your system will have to adapt to those new realities.  This compounds the Second-system effect, because your Second-system is almost inevitably <em>more</em> complicated than the First-system and therefore harder to change and bend and make work in that pesky &#8220;real-world.&#8221;</p>
<p>Right now I have to fight the urge to over-engineer, to outwit this problem, because I&#8217;m just not smart enough to solve this problem forever and ever into the future.  So I&#8217;m going to focus on building a solid platform that let&#8217;s me build out modules and snap them off when they aren&#8217;t needed anymore.  Something robust but <strong>simpler</strong> than the current system.  Doing this will mean trading things off, it will mean making hard decisions upfront about architecture to meet our current needs but also look to the future, and this is what a good Software Developer is supposed to do.  And once my current project is safely resting in maintenance mode, quietly humming along making my company money, I will begin building a Second-system and hopefully avoid Second-system effect.</p>
]]></content:encoded>
			<wfw:commentRss>http://ihumanable.com/blog/2010/11/02/second-system/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ipad</title>
		<link>http://ihumanable.com/blog/2010/01/28/ipad/</link>
		<comments>http://ihumanable.com/blog/2010/01/28/ipad/#comments</comments>
		<pubDate>Thu, 28 Jan 2010 17:43:20 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[none]]></category>
		<category><![CDATA[ipad]]></category>

		<guid isPermaLink="false">http://ihumanable.com/blog/?p=648</guid>
		<description><![CDATA[As required by nerd law, here is my mandatory post on the iPad. I&#8217;ve got lots of nerd friend and the general feeling I get from them is a sigh and a &#8220;meh.&#8221; The term &#8220;underwhelmed&#8221; is being thrown around a lot, reinvigorating the debate as to whether or not there is a perfect amount [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_649" class="wp-caption alignright" style="width: 310px"><img src="http://ihumanable.com/blog/wp-content/uploads/2010/01/ipad-star-trek-300x227.jpg" alt="ipad star trek" title="ipad-star-trek" width="300" height="227" class="size-medium wp-image-649" /><p class="wp-caption-text">nerd law also required I use a picture with Spock in it</p></div>
<p>As required by nerd law, here is my mandatory post on the iPad.  I&#8217;ve got lots of nerd friend and the general feeling I get from them is a sigh and a &#8220;meh.&#8221;  The term &#8220;underwhelmed&#8221; is being thrown around a lot, reinvigorating the debate as to whether or not there is a perfect amount of &#8220;whelmed&#8221; one can be so as to be neither under- nor over- whelmed.  Here is my take on the new shiny.</p>
<p><a href="http://suckbusters2.blogspot.com/2007/06/apple-iphone-debut-to-flop-product-to.html">Let&#8217;s</a> <a href="http://www.theregister.co.uk/2006/12/23/iphone_will_fail/">not</a> <a href="http://www.hung-truong.com/blog/2007/01/09/4-reasons-why-the-apple-iphone-will-fail/">forget</a> <a href="http://www.bloomberg.com/apps/news?pid=20601039&#038;sid=aRelVKWbMAv0">our</a> <a href="http://blogs.msdn.com/sprague/archive/2007/01/26/more-on-why-iphone-will-fail.aspx">history</a>.  When the iPhone came out people far and wide declared that it will fail, is failing, already failed.  Yet despite such serious problems as no cut-and-paste and a weird virtual keyboard, somehow it won <a href="http://www.time.com/time/specials/2007/article/0,28804,1677329_1677346,00.html">Time&#8217;s gadget of the year award</a>, and a huge population of happy iPhone users.  People to this day don&#8217;t quite get it, I have an Android phone (one of the first G1s) and I love it, but there is no denying the sexiness and sleekness of an iPhone.  If you don&#8217;t understand the big deal play with one for a week, its just a completely polished user experience.</p>
<p>That is the strength of Apple&#8217;s products, the experience.  Its easy to find plenty of small, reliable mp3 players that store tons of music, people buy iPods because they are seamless and easy.  I was asked recently what made OSX superior to Win7, I didn&#8217;t have an answer, I work with both and I enjoy OSX much more but have no real good bullet point for why.  I was looking for some big reason, oh the dock, oh it&#8217;s pretty, oh the finder, but couldn&#8217;t think of any quantitative reason why they were better.  When it came down to it, there are just a million little reasons that all add up to a great experience.</p>
<p>To each their own though, I don&#8217;t want to start a Windows vs. Mac flamewar, there are plenty out there if you feel the need just type &#8220;I hate Windows&#8221; or &#8220;I hate Mac&#8221; into google if you must.  The point I want to make is that Apple thinks about their products from a full end-to-end experience, and that&#8217;s where something like an iPad could beat the pants off of a netbook.  Make no mistake about this either, that is where they are targeting, Jobs said it in the keynote and the pricepoint confirms it.  iPad is not meant to compete with MacBooks or Dell D830s (the computer I&#8217;m currently typing on) they are meant to compete with <a href="http://www.amazon.com/Dell-Inspiron-mini-Netbook-Accelerator/dp/B002AC26F8">Dell Inspiron Minis</a> and <a href="http://www.asus.com/ProductGroup1.aspx?PG_ID=7dDelmkESu9DXgVB">eee PCs</a></p>
<p>There is a niche market out there and I think Apple has the marketing and business savvy necessary to corner it.  With all the hype it would have been difficult to not be underwhelmed.  It doesn&#8217;t cure cancer <strong>or</strong> come with a free pony, boohoo!</p>
<p>Now I&#8217;m going to take my life into my own hands here and make a prediction (watch out!)  The iPad will succeed, it will have a spreading pattern to certain niches until it picks up a critical mass and people who don&#8217;t really need them start to buy them.  First the early-adopter and mac-fanboys will start buying them up, then there will be some app that endears it to some group of people in a fierce way.  Maybe a text-book app or medical records app, whatever it is there will be some population that is in love with the iPad.  They will start to infect their friends and family with iPad fever and it will become hip and cool, then it will become annoying, and then it will just be fact, 30 jillion people have iPads and you won&#8217;t be able to walk into a Starbucks without someone reading Hipster monthly on one.</p>
<p>I&#8217;m excited about the iPad, it doesn&#8217;t have everything I always wanted, but it will definitely move the ball forward.  I personally think the very slightly modified iPhone OS was a mistake, I think there are lots of mistakes and things that I wished were included (like that pony I <em>really</em> wanted).  But I&#8217;m going to have to reserve judgment until I ca go down to the Best Buy and screw around with one.</p>
]]></content:encoded>
			<wfw:commentRss>http://ihumanable.com/blog/2010/01/28/ipad/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>api</title>
		<link>http://ihumanable.com/blog/2010/01/25/api/</link>
		<comments>http://ihumanable.com/blog/2010/01/25/api/#comments</comments>
		<pubDate>Mon, 25 Jan 2010 18:26:59 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[none]]></category>
		<category><![CDATA[philosophy]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://ihumanable.com/blog/?p=617</guid>
		<description><![CDATA[I remember being a young lad preparing myself for university I was given a gift from my mother, &#8220;C++ for dummies.&#8221; The vote of confidence on my status as a &#8220;dummy&#8221; aside, I read the book with great interest. There was an analogy the author used to explain the idea of classes and what functions [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_618" class="wp-caption alignright" style="width: 152px"><img src="http://ihumanable.com/blog/wp-content/uploads/2010/01/samsung-microwave.jpeg" alt="samsung microwave" title="samsung-microwave" width="142" height="82" class="size-full wp-image-618" /><p class="wp-caption-text">oh creator of hot pockets, we praise thee!</p></div>
<p>I remember being a young lad preparing myself for university I was given a gift from my mother, &#8220;C++ for dummies.&#8221;  The vote of confidence on my status as a &#8220;dummy&#8221; aside, I read the book with great interest.  There was an analogy the author used to explain the idea of classes and what functions they should expose, I&#8217;m going to shamelessly steal it (paraphrasing as I don&#8217;t have the book with me).</p>
<p>Imagine your son comes up to you and says he wants to make some nachos.  You tell him that its fine by you, just go cook them in the microwave, and there is nothing controversial about this statement.  Microwaves are actually boxes full of high energy radiation being produced by <a href="http://en.wikipedia.org/wiki/Microwave_oven#Design>a high voltage power source and a cavity magnetron</a>.  What are you mad?!  Who would let their child use such dangerous devices, what if he gets shocked or irradiated?</p>
<p>Being a sensible person though, you know that there is relatively little danger in letting them use a microwave, because they don&#8217;t need to know any of the gory details about <a href="http://en.wikipedia.org/wiki/Cavity_magnetron">cavity magnetrons</a> or <a href="http://en.wikipedia.org/wiki/Waveguide_%28electromagnetism%29">waveguides</a>, to the end user, the microwave is just a magic warming box.  It exposes a very simple interface, some buttons that allow you to enter the amount of time you want to cook something.</p>
<p>This is the essence of an <a href="http://en.wikipedia.org/wiki/Api">API (Application Programming Interface)</a>, wrapping up something complex and possibly dangerous in something safe and easy to interact with.  When building code that you intend other people to use someday, it is the part that is most important part, and the part that is easiest to overlook.  The problem is that we are often too close to something and too concerned with <strong>our</strong> use case.  If you want to design code for others to use, it requires significant time and effort, and even then you probably still won&#8217;t get it right.</p>
<p><a href="http://prosper-lib.com">Prosper</a> is still undergoing active development, I&#8217;m currently agonizing over how I want to expose various execution modes.  The solution, no matter what I pick, is trivial to implement, but the api is the most important part.  A great api exposes a consistent concept, something that is easily grasped and allows the end user of the api to declare what they want to do without having to worry about how its going to get done.  Since <a href="http://www.codinghorror.com/blog/archives/000152.html">good programmers write good code and great programmers steal great code</a>, I&#8217;ve modeled the api for prosper extensively off of <a href="http://jquery.com">jQuery</a>.  And why not, let&#8217;s take a look at two different APIs, the browser dom api and jquery.</p>
<pre class="brush: jscript; title: ;">
  //Let's barber pole a list by coloring every other element blue
  var list = document.getElementById('the_list');
  var highlight = false;
  for(var i = 0; i &amp;lt; list.children.length; i++) {
    if(highlight) {
      list.children[i].style['backgroundColor'] = '#FF0000';
    }
    highlight = !highlight;
  }
</pre>
<p>Fairly straightforward implementation, but it concerns itself heavily with the &#8220;how&#8221; of what its doing.  Manually traversing to pick the elements it wants, eww.</p>
<pre class="brush: jscript; title: ;">
//Same thing using jquery
$(&amp;quot;ul#the_list li:odd&amp;quot;).css(&amp;quot;background-color&amp;quot;, &amp;quot;#FF0000&amp;quot;);
</pre>
<p>jQuery is definitely magic, but this code is great because it let&#8217;s you focus on the &#8220;what&#8221; of what you are doing.  How does jQuery go about selecting the right elements and all that?  I don&#8217;t care, and the great thing is I don&#8217;t have to care, and if in the next version of jQuery they find a way to do it faster, I win without having to do anything.</p>
<p>Writing a great api is difficult, you have to divorce yourself from the concrete problem you are solving and look at it in the abstract.  Put yourself into the shoes of someone trying to figure out how the api works, and then ask the questions they are going to ask.</p>
<ul>
<li>Why do I need to build up this context thing and pass it in?</li>
<li>How come there isn&#8217;t a sensible default for these arguments?</li>
<li>What dumbass made this thing?</li>
</ul>
<p>Answer those questions, and keep working at it, strive for elegance and consistency, because then it will be easy for people to learn and use.  If your code is easy to learn and use, people are going to want to use it more, and they are going to want to tell their friends about it.  Then you can get some lucrative ad campaigns with Nike because of the boffo library you write in FoxPro.</p>
<p>There is a more subtle lesson in all of this though.  Any code you write is exposing an api to someone else.  &#8220;But only I am ever going to use this code!&#8221; I hear the naysayers warming up their keyboards for the comments section.  This may be true now, but the six-months-from-now-you is going to look back at the you-of-today and wonder what the hell he was thinking.</p>
<p>Get in the habit of making your code easy to use, and expose a nice api.  This will endear you to your fellow programmers and help make maintenance easy.  Strive to be that guy on the team that writes functions and classes people want to use.  Make life easier for your fellow developers and even if they don&#8217;t return the favor, maybe they will take you out for a beer.  People notice over time that your code is the best to work with, they internalize it, and they start to think of you as a <em>great</em> programmer.  That&#8217;s a pretty great api to expose to the world.</p>
]]></content:encoded>
			<wfw:commentRss>http://ihumanable.com/blog/2010/01/25/api/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>shiny new toy</title>
		<link>http://ihumanable.com/blog/2009/12/11/shiny-new-toy/</link>
		<comments>http://ihumanable.com/blog/2009/12/11/shiny-new-toy/#comments</comments>
		<pubDate>Fri, 11 Dec 2009 18:56:10 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[none]]></category>

		<guid isPermaLink="false">http://ihumanable.com/blog/?p=385</guid>
		<description><![CDATA[I took a half-day today, got to sit at home this morning waiting for the Fedex man (who turned out to be a woman). A few weeks ago I got the go ahead from my company to buy an iMac for home (HMB has a program where they will pay for half of your hardware [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_389" class="wp-caption alignright" style="width: 224px"><img src="http://ihumanable.com/blog/wp-content/uploads/2009/12/peanut-butter-crunch-214x300.jpg" alt="it cuts the roof of your mouth so the chemicals can get into your bloodstream faster" title="peanut-butter-crunch" width="214" height="300" class="size-medium wp-image-389" /><p class="wp-caption-text">it cuts the roof of your mouth so the chemicals can get into your bloodstream faster</p></div>
<p>I took a half-day today, got to sit at home this morning waiting for the Fedex man (who turned out to be a woman).  A few weeks ago I got the go ahead from my company to buy an iMac for home (HMB has a program where they will pay for half of your hardware purchase, because they are an amazing company).  I got the news yesterday via fedex that my package had arrived overnight from Shanghai in beautiful Anchorage.  I was told that the delivery would arrive this morning, asked for a half-day off, and this morning leisurely enjoyed a bowl of Peanut Butter Crunch.</p>
<p>Then I heard the thump thump thump of someone climbing the stairs outside of my apartment and a knock on my door.  After subduing my dog Harvey I opened the door, signed the Fedex pad, and took a giant heavy package inside my house.  The size of the box blew me away at first, here are the specs of my new iMac.</p>
<ul>
<li>27in Aluminum iMac</li>
<li>2.8GHz Quad Core Intel Core i7</li>
<li>8GB 1066MHz DDR3 SDRAM</li>
<li>1TB Serial ATA Drive</li>
<li>ATI Radeon HD 4850 512MB Video Card</li>
<li>8x double-layer SuperDrive</li>
<li>Magic Mouse</li>
<li>Wireless Keyboard</li>
</ul>
<p>Now I have played with Macs before, I&#8217;ve spent countless minutes over the last month or two at BestBuy goofing around with the 27in iMac there.  I thought I was prepared for how large this beast is, but I was not.  It&#8217;s a heavy machine and it is ginormous.  The packaging was simple, effective, and beautiful.  I had it up and running in about 10 minutes, and most of that time was moving stuff off my desk to make room.  A little while back I had purchased a cheap opened-item (although very nice) 22in Velocity Micro Monitor (similar to <a href="http://www.retrevo.com/s/Velocity-W220-Monitors-review-manual/id/4540bh043/t/1-2/">this one</a> but not identical).  When I brought it home I thought it was huge, it looks Lilliputian next to this hulking behemoth.</p>
<p>There have <a href="http://gizmodo.com/5411547/some-core-i7-imacs-showing-up-dead">been some reports</a> of the i7 showing up DOA.  I&#8217;m lucky enough to have not had this happen, my iMac is pretty and working.  I turned on the power, answered some questions, and watching &#8220;Welcome&#8221; fly at my face in multiple languages for a few minutes, and it was up and running.</p>
<h2>The Good</h2>
<ul>
<li>This screen is huge and beautiful, plenty of real estate to take on the job of 2 (maybe even 3) physical monitors</li>
<li>The wireless keyboard and mighty mouse were pre-synced with the computer and worked right off the bat</li>
<li>The Apple Remote synced nicely (after I reread the syncing part of the manual and saw the phrase &#8220;menu and right button&#8221; instead of just &#8220;right button&#8221;)</li>
<li>I can now retire my Acer tower to be a HTPC (It&#8217;s a little big but I have a cabinet it will fit nicely in)</li>
<li>The wireless keyboard is a joy to type on</li>
<li>Opened a terminal and typed ruby &#8211;version, it replied with 1.8.7 instead of &#8221; &#8216;ruby&#8217; is not recognized as an internal or external command, operable program or  batch file.&#8221;
</ul>
<h2>The Bad</h2>
<ul>
<li>After syncing my remote I couldn&#8217;t get it to do anything, I tried controlling a DVD with it to no avail.</li>
<li>I only took a half day instead of the whole day off so I can&#8217;t play with its beauty right now</li>
<li>I took some great pictures with my phone, but foolishly left behind my usb cable, a gallery will be posted tonight or sometime over the weekend</li>
<li>I don&#8217;t know what I&#8217;m doing.  This is the first Mac I&#8217;ve owned and so far things seem simple enough, but I&#8217;m not at home yet.</li>
</ul>
<p>There you have it, about 2 years of thinking about buying a new iMac, a few weeks of waiting, and 4 hours off of work later I have my new shiny toy.  It is a work of beauty and really a testament to the skill and care the engineers and designers at Apple put into their products.  I&#8217;m hoping to avoid fanboyism though, I will be running a Vista / Ubuntu powered HTPC and working on an XP Pro laptop everyday for work.</p>
<p>This weekend I will get better introduced to the new member of my tech family, for now though I have to get back to work.  Check in Monday for shiny pictures.  I hope to do a bunch of how-to&#8217;s and screencasts in the future about development on macs and setting things up if you are a developer, so stay tuned.</p>
<hr />
<p>PS.  I have changed the RSS Feed to use FeedBurner, if you experience any problems please let me know at ihumanable [at] gmail [dot] com</p>
]]></content:encoded>
			<wfw:commentRss>http://ihumanable.com/blog/2009/12/11/shiny-new-toy/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>solve it forever</title>
		<link>http://ihumanable.com/blog/2009/11/20/solve-it-forever/</link>
		<comments>http://ihumanable.com/blog/2009/11/20/solve-it-forever/#comments</comments>
		<pubDate>Fri, 20 Nov 2009 19:47:26 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[none]]></category>

		<guid isPermaLink="false">http://ihumanable.com/blog/?p=275</guid>
		<description><![CDATA[This is a very simple rule that I have for solving problems at work, solve them forever. Its not always practical and sometimes you need to bend the rule, but its a great guideline. When I&#8217;m presented with a problem at work, I take it as a personal insult, someone could have solved this before [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_277" class="wp-caption alignright" style="width: 210px"><img src="http://ihumanable.com/blog/wp-content/uploads/2009/11/sherlock-holmes-200x300.jpg" alt="having a bully day" title="sherlock-holmes" width="200" height="300" class="size-medium wp-image-277" /><p class="wp-caption-text">having a bully day</p></div>
<p>This is a very simple rule that I have for solving problems at work, solve them forever.  Its not always practical and sometimes you need to bend the rule, but its a great guideline.  When I&#8217;m presented with a problem at work, I take it as a personal insult, someone could have solved this before and made my life easier but they chose not to and burdened me with it, and I refuse to do that to anyone else.</p>
<p>This has some downsides, you have to put in a lot of effort, and sometimes little things take a lot longer than the &#8220;man&#8221; thinks they should.  There are some upsides though, you avoid technical debt.  A lot of coverage has been given recently to the idea of technical debt, how you define it, how you avoid it, should you avoid it and so on.  It is one of those nebulous concepts that everyone has a different definition for, we all know what it feels like to run up against some technical debt, its that situation where something that should be simple is <strong>needlessly</strong> difficult.</p>
<p>Technical debt is not complexity, sometimes doing seemingly simple things within a complex system can be cumbersome, but that&#8217;s the price you pay for some other benefit (dynamic forms, automatic mapping, etc.)  You know that you&#8217;ve hit some technical debt when something is complicated and difficult, but there is no upside.</p>
<blockquote><p>
Boss: Change the text on that button<br />
Dev: Ok, I&#8217;ll just update the html<br />
&#8230;several hours later&#8230;<br />
Boss: Why&#8217;d that take so long?<br />
Dev: You see that text is pulled from an i18l file, which is populated dynamically by a database table, that table is autorouted by the orm layer, so I had to change a bunch of configuration entries, then I had to run an update across several tables, some tables were using the name as a foreign key relationship, even though they didn&#8217;t declare that formally to the rdbms, so I had to go track down what tables were doing that, and once all that was through I had accidently made a typo and had to go through the whole damn process again.
</p></blockquote>
<p>Debt like this is incurred when you solve a problem for now, not thinking about the future.  Solving a problem forever means that as long as the problem domain remains the same that you don&#8217;t have to do anything.  The issue is that many people misinterpret solving a problem forever as solving all problems forever, and that is not what I wish to promote.</p>
<p>There is an important difference, you should solve the problem domain thoroughly, but your solution should be specific to that domain, don&#8217;t try to do too much.  There are innumerable problems that someone will take the time to solve for themselves, but give no thought to what happens to the next guy.  Coming onto a new project I&#8217;ve come face to face with an age old developer problem, rolling on.</p>
<p>Rolling onto a new project is often an exercise in navigating technology to set up a development environment, navigating the corporation to integrate yourself into it, and navigating the team to find a place.  All this navigation seems to be on the shoulders of the new person, there are people you need to talk to to get mainframe access. Which people? Where are they? When do I talk to them? How? There are often answers locked up inside someone&#8217;s brain, and if you ask the right people you can, like a detective slowly unraveling a mystery, find the answers and get your email and passwords and id badges.</p>
<p>This is a problem that should be solved forever, once the first guy joined the team he should have documented what he did, when, how, why, and that document should be part of team cannon, available as a helpful guide to the next new guy.  This rarely happens though, it is a shame, but understandable, new people are struggling to get up to speed on a project they don&#8217;t have time for the meta-project of documenting their up-to-speed-getting project.</p>
<p>That is just an example, the next time you are guts deep in a problem that you&#8217;ve encountered before think about your fellow developer, and think about how you can solve it forever.  The more problems you permanently put to bed, the smoother development can go and the faster you can get your project done.</p>
]]></content:encoded>
			<wfw:commentRss>http://ihumanable.com/blog/2009/11/20/solve-it-forever/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>baggage</title>
		<link>http://ihumanable.com/blog/2009/11/18/baggage/</link>
		<comments>http://ihumanable.com/blog/2009/11/18/baggage/#comments</comments>
		<pubDate>Wed, 18 Nov 2009 16:37:21 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[none]]></category>

		<guid isPermaLink="false">http://ihumanable.com/blog/?p=260</guid>
		<description><![CDATA[Finally! I am finally about to start working at my new project after all those squishy human beings got done drawing pretty charts and signing dead pieces of trees. I now can put myself into the beautiful cold clutches of the machine again and get back to what I do best, code stuff. I&#8217;ll be [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_265" class="wp-caption alignleft" style="width: 310px"><img src="http://ihumanable.com/blog/wp-content/uploads/2009/11/baggage-300x200.gif" alt="i know how you feel" title="baggage" width="300" height="200" class="size-medium wp-image-265" /><p class="wp-caption-text">i know how you feel</p></div>
<p>Finally!  I am finally about to start working at my new project after all those squishy human beings got done drawing pretty charts and signing dead pieces of trees.  I now can put myself into the beautiful cold clutches of the machine again and get back to what I do best, code stuff.  I&#8217;ll be moving from .Net web development to Java middle ware development, and I&#8217;m excited to get back to programming.</p>
<p>That seemed like quite the dig at .Net, I don&#8217;t intend it to, it&#8217;s just been my personal experience.  The problem with the .Net projects I&#8217;ve worked on is that they&#8217;ve been amalgams of third party libraries, and I&#8217;ve been in charge of gluing them together.  This isn&#8217;t a weakness, some would say its a great strength, drop some cash and boom, big problem solved by a nice clean little dll (or 4).  I will say that it greatly reduces time to market which is a Good Thing&copy; and that it lets you get down to the customizations that clients spend the big bucks on.</p>
<p>The problem is that I&#8217;m a programmer, not a customizer.  I like to write code, not tweak little settings here or there (although as a nerd I&#8217;m a fan of that as well).  The .Net environment always seemed like a bunch of black boxes that I was just trying to lash together in a pretty enough package to call it done.  Any actual code I wrote was always just taking business rules and turning them into something a computer can understand.  That&#8217;s ok, in fact companies make a lot of money doing this type of work, I just don&#8217;t as a programmer feel fulfilled by it.</p>
<p>Now though I&#8217;m heading into a project where there is a problem without a solution, something that actually needs to be designed, implemented, tested, deployed, iterated, and other fun nerd words.  I&#8217;m excited to be back to programming, but I&#8217;m worried about technological baggage.  What is technological baggage you ask, let me find you an example (anonymized, of course).</p>
<pre class="brush: jscript; title: ;">
function Recalculate(...)
{
  if (isNaN(CleanNumber(ctrl.value)) ||
      CleanNumber(ctrl.value) == &amp;quot;&amp;quot;)
  {
    ctrl.value = &amp;quot;0&amp;quot;;
  }

  var newValue = parseFloat(CleanNumber(ctrl.value));
  var oldValue = parseFloat(CleanNumber(prevCtrl.value));
  var diff = newValue - oldValue;

  ctrl.value = newValue;
  prevCtrl.value = parseFloat(CleanNumber(changedPrevControl.value))
                    + diff;

  //Snip some similar code
  FormatMoneyWithCommas(ctrl, 0, 0, 0);
}
</pre>
<p>There is nothing wrong with the above <strong>javascript</strong> it works just fine.  But look at it, that&#8217;s .Net wrapped in script tags if I&#8217;ve ever seen it.  There are many non-javascript things going on in this code, anyone familiar with javascript will see them straight away.  My intent is not to shame the author of the code or to call it out as bad javascript, it is merely to show that when steeped in a technology it can be very hard to pull yourself out.  I picked on .Net but I&#8217;ve see plenty of javascript written like java, in fact I&#8217;ve gotten actual java code thrown between script tags back from offshore &#8220;resources&#8221; before.</p>
<p>There is a lot to keep jumbled up in our heads when we are programming, to lessen this burden we adopt naming conventions, and calling conventions, and all kinds of conventions and that is a good thing.  The bad thing is carrying your languages conventions into other languages, its a kind of linguistic egocentricity that makes the natives upset.</p>
<p>Now I am trying to purge the .Net from my fingers and get them ready for Java again.  I&#8217;m sure I won&#8217;t remember all the little gotchas, but the important part is to be aware.  There are some basic strategies for carrying over as little baggage as possible.</p>
<ul>
<li>Google &#8211; Go and google Language X for Language Y developers, Language X and Langauge Y can be almost any combination of languages and there is a good chance someone wrote an article, feature matrix, common pitfalls type document for it.</li>
<li>When in Rome &#8211; If you are going into an established project, adopt its idioms.</li>
<li>Tutorials &#8211; Even if you know the language you are heading into, go read a few tutorials, brush up on the basics</li>
</ul>
<p>I remember the painful period between Java and .Net, being frustrated trying to figure out what the hell a HashMap was called (Dictionary) or wanting to declare what my functions throw.  I&#8217;m sure I will have the reverse, but the one thing I&#8217;m looking forward to is getting back to Eclipse, I love Eclipse, and I will not miss Visual Studio at all.</p>
]]></content:encoded>
			<wfw:commentRss>http://ihumanable.com/blog/2009/11/18/baggage/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>leaving</title>
		<link>http://ihumanable.com/blog/2009/11/11/leaving/</link>
		<comments>http://ihumanable.com/blog/2009/11/11/leaving/#comments</comments>
		<pubDate>Wed, 11 Nov 2009 19:30:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[none]]></category>

		<guid isPermaLink="false">http://ihumanable.com/blog/?p=91</guid>
		<description><![CDATA[I&#8217;ve been working on a project for the last 5 months, but finished active development about a month ago. I finished in the best possible way, the product shipped, the customer likes it, and there hasn&#8217;t been much to do besides the minor bug or feature here and there. It&#8217;s a good place to be [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_92" class="wp-caption alignright" style="width: 310px"><img src="http://ihumanable.com/blog/wp-content/uploads/2009/11/brain-drain-300x300.png" alt="leaving for somewhere" title="brain-drain" width="300" height="300" class="size-medium wp-image-92" /><p class="wp-caption-text">leaving for somewhere</p></div>
<p>I&#8217;ve been working on a project for the last 5 months, but finished active development about a month ago.  I finished in the best possible way, the product shipped, the customer likes it, and there hasn&#8217;t been much to do besides the minor bug or feature here and there.  It&#8217;s a good place to be in, since I&#8217;m a consultant it&#8217;s also not economically viable.  If I&#8217;m just sitting here writing blog posts and drinking smooth delicious Diet Dr. Pepper all day, I&#8217;m not making money for my company, so they went and found me another project to work on, which <a href="http://ihumanable.com/blog/2009/11/climbing-a-mountain/">I talked about here</a>.</p>
<p>I&#8217;m looking forward to starting my new project, but as <a href="http://www.lyrics007.com/Semisonic%20Lyrics/Closing%20Time%20Lyrics.html">Semisonic</a> taught us, &#8220;every new beginning comes from some other beginning&#8217;s end.&#8221;  (Have to try to pull this post out of the tailspin caused by quoting Semisonic lyrics now).  The problem is that when you start a new project, the glitz and glamor of a new project you haven&#8217;t learned to hate yet can blind you from the responsibilities of being the guy <em>leaving</em>.</p>
<p>Leaving a project comes bundled up with a bunch of responsibilities.  The cliched, &#8220;what if you got hit by a bus tomorrow?&#8221; question that managers love to ask (because they are too afraid to say, &#8220;what if you quit&#8221; or &#8220;what if I fire you&#8221; but oddly enough have no qualms with theoretically knocking you off) actually has some value.  The &#8220;bus&#8221; of leaving this project is barreling down at me, and I have to make sure I dump enough of my brain out that people can still maintain the code I wrote.</p>
<p>If you read my rant / guide to <a href="http://ihumanable.com/blog/2009/10/project-documentation/">project documentation</a>, here&#8217;s a chance for me to prove myself.  Throughout the project I&#8217;ve dutifully created and more or less kept documentation up-to-date about everything from server credentials to step-by-step deployment procedures.  I cannot recommend this approach enough, after reading through some of my wiki pages on these topics it is clear that trying to compile this information after the fact would be difficult if not impossible.  So since, ostensibly, everything is done already, what am I left to do?</p>
<ol>
<li>Read through documentation &#8211; Projects move fast, things that made sense a month into a project probably won&#8217;t make sense 5 months into a project, be sure everything is up to date.  Read the documentation with the mindset that you are trying to <strong>start</strong> working on a project, is it clear, could you set up a development environment, fix a bug, and push out your changes in a day?  If not, figure out why not, and fix it.</li>
<li>Bug your coworkers &#8211; Someone will be around to work on the project, start bugging them to read the documentation, have them go through a dry run of some complex task you normally do, and let them mock your ability to document things properly.  It is much easier to have a minute or two of verbal in-person explanation then trying to remember how things work and having a 20 email long thread of questions and answer a few weeks into your new project.</li>
<li>Clean house &#8211; Those tasks you were putting off doing, get those done, and for fsm&#8217;s sake, do it right!  There is nothing worse than being knee-deep in a new project to have a past project rear its ugly head, forcing you to dredge up long forgotten knowledge to fix some minor issue.</li>
<li>Cut ties &#8211; Clients and other developers get used to coming to you with issues, if you are moving on to a new project, let them know about it.  Inform them that you will no longer be the contact for the garthok narfler and that they can talk to developer x about it from now on.  For an extra touch of class let them know that it was nice working with them.</li>
</ol>
<p>The way you leave a project is almost as important as the work you did on the project.  Rest assured no matter how good a job you think you did, a few weeks after you leave, other developers will be cursing your name.  Your job as you leave is to make sure that those angry expletives are few and far between and that you can rub it in their face when they complain about this problem or that obstacle with the fact that you left them very clear documentation on how to handle such a situation.</p>
]]></content:encoded>
			<wfw:commentRss>http://ihumanable.com/blog/2009/11/11/leaving/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

