<?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; side project</title>
	<atom:link href="http://ihumanable.com/blog/category/side-project/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>kids writing code</title>
		<link>http://ihumanable.com/blog/2010/03/18/kids-writing-code/</link>
		<comments>http://ihumanable.com/blog/2010/03/18/kids-writing-code/#comments</comments>
		<pubDate>Thu, 18 Mar 2010 14:13:19 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[side project]]></category>
		<category><![CDATA[kids writing code]]></category>

		<guid isPermaLink="false">http://ihumanable.com/blog/?p=809</guid>
		<description><![CDATA[Last night I went out to get some dinner and as I sat in the drive-through waiting for the unbridled joy that is Cain&#8217;s chicken I listened to the radio. WOSU&#8217;s All Sides had a piece about child poverty and mentoring. It was interesting and thought provoking, one of the guests said something that rang [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_810" class="wp-caption alignright" style="width: 321px"><img src="http://ihumanable.com/blog/wp-content/uploads/2010/03/children-computer.jpg" alt="3 children at a computer" title="children-computer" width="311" height="258" class="size-full wp-image-810" /><p class="wp-caption-text">you doody head you forgot to clean up your EventStruct!</p></div>
<p>Last night I went out to get some dinner and as I sat in the drive-through waiting for the unbridled joy that is Cain&#8217;s chicken I listened to the radio.  WOSU&#8217;s <a href="http://www.wosu.org/allsides/">All Sides</a> had a <a href="http://streaming.osu.edu/wosu/allsides/031710aOL.mp3">piece about child poverty and mentoring</a>.  It was interesting and thought provoking, one of the guests said something that rang true and made me think.  (Paraphrasing because the audio is currently unavailable) He started to realize that the kids were excited to have him come talk to the class every week, not because they were interested in his stories about the Post Office, but because they wanted to know that someone cared about them.  It was a powerful thing to remember, that children <em>need</em> to know that someone cares for them, and that not all children are that lucky.</p>
<p>In writing this blog one of my favorite memories is doing the research to write the <a href="http://ihumanable.com/blog/2009/11/teaching/">teaching</a> post.  It reminded me of the heady days of my youth spending hours inside of the amazingly good QBasic help file trying to get something to work, stumbling and bumbling, put beaming with pride and a giddy happiness when I finally got the program to work.  These days the amount of programming languages geared towards teaching have only expanded, and systems like <a href="http://www.alice.org/">Alice</a> put LOGO&#8217;s turtle graphics to shame (although I still love that LISP-laden turtle).</p>
<p>This started the old gears turning in my head, and although this thought is pre-pre-alpha, I thought I would get some feedback and just jot down what I&#8217;m thinking.  What if there were an after school program for elementary school aged children where IT professionals donated their time and talent to helping kids learn how to program. Children need mentoring, the IT community has a wealth of talented and caring people, let&#8217;s put these two things together and see if we can do some good.  The logistics of this are a little daunting, but I want to lay out the reasons why now is the right time for just such a program.</p>
<p>Programming is the new literacy.  Don&#8217;t believe me, here is an article entitled <a href="http://www.edutopia.org/literacy-computer-programming">Programming is the new literacy</a>.  As we move forward into an increasingly wired future, programming, scripting, mark-up, are going to become skills that are normal to have.  Children are already more &#8220;plugged-in&#8221; then ever before, the benefits of understanding the machine they&#8217;ve been using since they were in diapers is apparent.  As the information economy continues its march into the 21<sup>st</sup> century, people will <em>need</em> these skills.  From a simple formula in an Excel Spreadsheet to whipping up a ruby script to do batch processing, these will become the differentiators of tomorrow, helping people achieve.</p>
<p>Hardware has never been more accessible.  Moore&#8217;s Law is a thing of beauty, I just bought a more than capable HP refurb for $150 to act as a media server.  OLPC has shown that putting affordable computers into children&#8217;s hands is possible, and it looks more and more likely that school districts in the Industrialized Nations will be following suit in the next decade or so.  Companies routinely <a href="http://www.epa.gov/osw/conserve/materials/ecycling/donate.htm">donate their old computers</a> which means that if $150 is too much (which it is for a lot of low income families) then you can <a href="http://www.ehow.com/how_5047081_donated-computer.html">get a donated computer free</a>.  Children can also access computers at libraries and schools for free.</p>
<p>Software has never been more accessible.  The number of languages specifically targeting teaching has only been growing.  If you haven&#8217;t already, go read the <a href="http://ihumanable.com/blog/2009/11/teaching/">teaching</a> post, it is a round-up of just a handful of the neat and nifty software meant to help kids learn to program.  The learning curve has never been gentler, you can go from a learning language like Hackity Hack (which is based off of Ruby) to the full Ruby language fairly easily, and from there you can explore the whole world of Ruby development from Rails to Unicorn and back again.</p>
<p>Programming is about more than computers.  Although the immediate goal of learning to program is to instruct a computer in how to perform a given task, the side benefits are immense.  Programming teaches children a structured way to solve problems, learning about control structures teaches the ideas of Boolean Logic, writing formulae increases and reinforces the understanding of mathematics.  Programming is also empowering, being able to sit down at a keyboard with nothing more than your wits and a good idea and turn it into something real is an amazing feeling for a child.  Programs let children learn and explore, make mistakes and figure out how to solve them, with gentle encouragement and careful guidance a child can turn their ideas into reality, and that&#8217;s a powerful lesson.</p>
<p>Where to go from here?  I&#8217;m not exactly sure, the logistics of setting something like this up are a little out of my league.  For right now this is just a good idea, I&#8217;m at <a href="http://ihumanable.com/blog/2010/03/ideas/">step 3</a> of the idea ladder.  Leave a comment, let me know what you think, if you are a parent, would this kind of program interest you?  If you are an IT professional, would you volunteer at such an organization?  If you are a business owner, would you support such an organization?  If you are a child, would you like to learn to program?</p>
<p>I&#8217;m not sure where this idea will go from here, but I&#8217;m excited to find out.</p>
]]></content:encoded>
			<wfw:commentRss>http://ihumanable.com/blog/2010/03/18/kids-writing-code/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>ideas</title>
		<link>http://ihumanable.com/blog/2010/03/16/ideas/</link>
		<comments>http://ihumanable.com/blog/2010/03/16/ideas/#comments</comments>
		<pubDate>Tue, 16 Mar 2010 17:55:51 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[side project]]></category>
		<category><![CDATA[gtd]]></category>
		<category><![CDATA[motivation]]></category>
		<category><![CDATA[side projects]]></category>

		<guid isPermaLink="false">http://ihumanable.com/blog/?p=799</guid>
		<description><![CDATA[Ideas are interesting things, we have them all the time, we dismiss them frequently, and we value them heartily. Some people don&#8217;t like to talk about their ideas, don&#8217;t want people to steal their million dollar brain baby, and I can respect that, but a million dollar idea with zero execution is worth nothing. Ideas, [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_800" class="wp-caption alignright" style="width: 244px"><a href="http://ihumanable.com/blog/wp-content/uploads/2010/03/chimpanzee-thinking.jpg"><img src="http://ihumanable.com/blog/wp-content/uploads/2010/03/chimpanzee-thinking-234x300.jpg" alt="chimpanzee in classic thinker pose" title="chimpanzee-thinking" width="234" height="300" class="size-medium wp-image-800" /></a><p class="wp-caption-text">In the future, we will rule this world!</p></div>
<p>Ideas are interesting things, we have them all the time, we dismiss them frequently, and we value them heartily.  Some people don&#8217;t like to talk about their ideas, don&#8217;t want people to steal their million dollar brain baby, and I can respect that, but a million dollar idea with zero execution is worth nothing.</p>
<p>Ideas, like misery, love company, if I tell you an idea your brain will immediately start thinking about it, having its own ideas and interpretations.  Then you tell me your ideas that my ideas caused and I get more ideas and so on and so forth, this is the basis of a conversation.  That our ideas can grow and change organically, that we can piggy back off of each other, this is the basis of our society.  But let&#8217;s get out of the woods of the abstract and into the city of concrete.</p>
<p>What I want to talk about today are those entrepreneurial ideas that we all have from time to time.  Those things that you are certain will make you rich and famous, or the ideas that leap back into our minds when we see some new thing, a worldwide pornography distribution network, <a href="http://www.w3.org/People/Berners-Lee/">Tim Berners-Lee</a> stole my idea!  What should you do with these ideas, how should you handle them, and why and what and huh.</p>
<p>Every person will have their own way of handling the little lightning bolts that leap into their head but I want to take you through the path that I&#8217;ve found helpful for me.</p>
<ol>
<li><strong>Write it down</strong> &#8211; I write down almost every business thought I have, no matter how far fetched, and no matter how overloaded with tasks I am.  This seems a little silly, if you are actively working at one thing it can even feel disloyal to start thinking about something else, what am I a squirrel easily distracted by a shiny piece of tinfoil?  No, in my opinion you can never have enough ideas in reserve.  It doesn&#8217;t take too much time to jot down enough information to be able to recall it later, and it doesn&#8217;t mean you aren&#8217;t serious about your current set of priorities.  We would all like to think that everything we are working on will always work out, but you will never be sad that you have more ideas to fall back on.</li>
<li><strong>Percolate</strong> &#8211; Go do something else, even if you aren&#8217;t actively thinking about something, after writing it down it will be floating around in your brain someplace.  Great ideas refuse to fall to the wayside, if you find yourself coming back to something in your head more than a few times, move onto step 3.</li>
<li><strong>Talk it out</strong> &#8211; Share your idea with other people, sanity check it, see if they laugh at you.  Don&#8217;t get discouraged too easily though, great ideas can sound crazy and still be great ideas.  After discussing it with a few people you can get a handle on how realistic it is and how excited you should be about your new idea.</li>
<li><strong>Prototype or Shelf</strong> &#8211; If you&#8217;ve made it to step 4 you have to look around and prioritize, it&#8217;s easy to be swept up in the novelty of a new idea, but strive to objectively adjudicate whether or not you have the free time to move forward.  If you do, grab some technology you are comfortable with and make a prototype, don&#8217;t invest too much time or money.  If not shelf the idea, keep a short list of things ready made to work on and add this idea to it.</li>
<li><strong>Focus Group <em>Lite</em></strong> &#8211; If you made a prototype put it in front of some people, or float a pilot program.  See how people react, sometimes an idea can sound great until you see it, then you realize some fundamental flaw.  If this stage is good then move onto step 6.</li>
<li><strong>Jump in with both feet</strong> &#8211; Get cracking.  If you have the time, passion, and indication that people could use your idea, go for it.  It will be difficult and you will probably fail, but you will be better for it.</li>
</ol>
<p>Ideas are nothing without execution, but they are still valuable.  Make sure you save your ideas, bounce them off of other people, and if your gut and other people tell you to go for it, take the chance.  You may not always succeed, but you will rarely be disappointed that you tried.</p>
]]></content:encoded>
			<wfw:commentRss>http://ihumanable.com/blog/2010/03/16/ideas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>blackbox revisited</title>
		<link>http://ihumanable.com/blog/2010/02/24/blackbox-revisited/</link>
		<comments>http://ihumanable.com/blog/2010/02/24/blackbox-revisited/#comments</comments>
		<pubDate>Wed, 24 Feb 2010 19:11:01 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[side project]]></category>
		<category><![CDATA[blackbox]]></category>
		<category><![CDATA[gtd]]></category>

		<guid isPermaLink="false">http://ihumanable.com/blog/?p=766</guid>
		<description><![CDATA[The other day I wrote about the concept of the blackbox. I focused specifically on the idea of a blackbox as us programmers think about it. I&#8217;ve been thinking about it more and more though and realized that there are blackboxes all around us. There are processes that our often complicated, confusing, manual messes that [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_767" class="wp-caption alignright" style="width: 285px"><img src="http://ihumanable.com/blog/wp-content/uploads/2010/02/gear4-blackbox.jpg" alt="blackbox" title="gear4-blackbox" width="275" height="292" class="size-full wp-image-767" /><p class="wp-caption-text">Oh shit they've miniaturized HAL </p></div>
<p>The other day <a href="http://ihumanable.com/blog/2010/02/blackbox/">I wrote about the concept of the blackbox</a>.  I focused specifically on the idea of a blackbox as us programmers think about it.  I&#8217;ve been thinking about it more and more though and realized that there are blackboxes all around us.  There are processes that our often complicated, confusing, manual messes that our non-programming friends and family have to suffer through.  If they knew a little bit of ruby or maybe some batch programming they would be able to save mountains of time and effort, but they don&#8217;t, so that&#8217;s where programmers can shine.  The problem is that to help our friends and family we have to shine some light into their blackbox tasks and figure out what they do, that&#8217;s not the easiest task for a programmer to take on.</p>
<p>Recently at work they announced a change to the timecard system that we use, all timecards <strong>MUST</strong> be submitted by 10:00am Monday morning.  The old system was, they should be in sometime on Monday and if not then our very nice receptionist will send out a sternly worded email shaming you into submitting you timecard.  Being curious (and being that the explanation was just a few more lines down in the email) I wondered what change had occurred to the system to require this 10:00am deadline.  Ends up that our receptionist used to enter this data by hand from the system we enter it in into the accounting software.  This was a tedious and error-prone task, once someone bothered to look at it they realized that with a little bit of code they could automate this all and get these programs chatting back and forth like old bridge partners.  A couple hours of programmer effort later and now our receptionist is able to answer calls and do all the other receptionisty things that she is great at instead of spending time copying numbers from one program to another.</p>
<p>The blackbox, timecards turning into accounting information, was illuminated and the process was horrible, a little bit of code applied and BAM new productivity abounds.  It gets me to wondering, how many other blackboxes are all around me, waiting for someone to shine some light in, see the inefficiencies, and offer up some soothing code.  I&#8217;ve given myself a new little game to play when talking to my friends and loved ones, when they start complaining about something that they have to do in their day to day, instead of just offering a sympathetic, &#8220;Sucks to be you loser&#8221; I start digging deeper.  &#8220;These reticulated splines are giving you a lot of trouble, how exactly do you make them?&#8221;  Normally they will reply with a bit of hesitation, maybe even a polite, &#8220;Oh, its boring, you don&#8217;t need to know about that.&#8221;  But if you keep on gently nudging, you can find out enough of the process to help.</p>
<p>It doesn&#8217;t always have to be by providing code, sometimes just the general nerdy computer knowledge that we have can be incredibly beneficial.  It&#8217;s easy to forget that not everyone knows the little tricks to make the computer easier and more fun to use.  I was able to save my mother hours a day by explaining to her that despite what her boss told her, she does not have to shut down Photoshop between opening every file.  Until then she had been instructed and believed that she had to wait a good minute for Photoshop to boot up in between every file, opening hundreds of files a day, you do the math.  By asking my girlfriend some questions about something she does at work I was able to throw together an Excel spreadsheet to save her a ton of time.  The magic of VLOOKUP and some well placed formulas was all that was needed to take a boring repetitive task and make it much simpler and less error-prone.</p>
<p>For those in the computer-know it&#8217;s easy to look at the computer as a simple tool, something to be mastered and leveraged to make our lives easier.  For many people though, computers <em>are</em> blackboxes, confusing little machines that spit out weird error messages and are constantly fighting them to get things done.  And there is the other edge of this sword, by shining light into a process blackbox and making life easier you do the double duty of helping illuminate the blackbox for a computer novice.  You help show by example that the computer is not mean or frustrating (well sometimes they are frustrating) but just a tool that with careful skill, some essential knowledge, and most importantly a lack of fear, you can make bend to your will.</p>
<p>Go find the blackboxes around you, help someone save 15-20 minutes a day, show someone that computers are not just useful in general but can be made personally useful.  You will be a technology hero to them, you will find an interesting puzzle to play with for yourself, and at the end of the day everyone will be better off.  Find the blackboxes and start pouring in light, you will be pleasantly surprised at what you find.</p>
]]></content:encoded>
			<wfw:commentRss>http://ihumanable.com/blog/2010/02/24/blackbox-revisited/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>simplify</title>
		<link>http://ihumanable.com/blog/2010/01/04/simplify/</link>
		<comments>http://ihumanable.com/blog/2010/01/04/simplify/#comments</comments>
		<pubDate>Mon, 04 Jan 2010 18:34:47 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[philosophy]]></category>
		<category><![CDATA[side project]]></category>
		<category><![CDATA[advice]]></category>
		<category><![CDATA[side projects]]></category>

		<guid isPermaLink="false">http://ihumanable.com/blog/?p=514</guid>
		<description><![CDATA[I love abstractions, most people do, they allow us to take complex things and wrap them in simple things and everyone is happy. The thing to realize is that there are degrees of complexity and different goals of abstractions. Programming is one of those things where more often than not our abstractions are really helpful. [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_515" class="wp-caption alignright" style="width: 303px"><a href="http://ihumanable.com/blog/wp-content/uploads/2010/01/simple.jpg"><img src="http://ihumanable.com/blog/wp-content/uploads/2010/01/simple-293x300.jpg" alt="it&#039;s so simple" title="simple" width="293" height="300" class="size-medium wp-image-515" /></a><p class="wp-caption-text">simplicity is sometimes surprisingly complex</p></div>
<p>I love abstractions, most people do, they allow us to take complex things and wrap them in simple things and everyone is happy.  The thing to realize is that there are degrees of complexity and different goals of abstractions.</p>
<p>Programming is one of those things where more often than not our abstractions are really helpful.  The problem becomes one of perceived complexity vs. actual complexity.  A good example is network protocols.</p>
<p>Network protocols are these complex beasts that let us talk across networks with some degree of certainty.  Its really quite the marvel of engineering prowess, man has taken the various blinkenlights and cables and a big ole&#8217; pile of Cisco and now you can watch a video of a cat playing keyboard whenever you like.  Network protocols were designed to simplify the process of two programs on physically distant machines sharing information.</p>
<p>When you first try to learn a complex abstraction it can seem daunting, UDP, TCP/IP, sockets and fifos and netcats oh my!  Sometimes it can seem overwhelming, but take a step back and realize that no matter how complicated a piece of software is, its just moving around bytes.</p>
<p>Perl has a philosophy that at the end of the day, everything is strings.  That&#8217;s why its the glue that holds together the interwebs, because it&#8217;s just a really good string manipulation language.  At the end of the day that&#8217;s all the internet is, strings floating around, normally between angled brackets.</p>
<p>Like most of the things I write I&#8217;m almost certain I had a point&#8230; oh there it is.  When I started writing <a href="http://ihumanable.com/blog/prosper">prosper</a> it seemed like an impossible mountain to climb.  I wanted to write a library that would bridge the gaps between all supported database backends, to have it be a sort of universal data access object.</p>
<div id="attachment_516" class="wp-caption alignleft" style="width: 364px"><a href="http://ihumanable.com/blog/wp-content/uploads/2010/01/prosper-simplified.png"><img src="http://ihumanable.com/blog/wp-content/uploads/2010/01/prosper-simplified.png" alt="prosper simplified" title="prosper-simplified" width="354" height="115" class="size-full wp-image-516" /></a><p class="wp-caption-text">This was much easier to think about than the actual problem</p></div>
<p>I had a few false starts on my project until I took a step back, I simplified my problem domain, and created an architecture that worked.  Instead of focusing on the end result of prosper I thought about it in a more abstract way, prosper was a mapper from function calls to string snippets.  This isn&#8217;t actually what prosper does today, prosper is in fact much more complex now than I would have ever imagined when I first started out.</p>
<p>The obstacle that stood in my way the most when starting out on prosper was being overwhelmed and unsure.  The problem domain I was trying to tackle was too big, even when I tried solving it i ended up painting myself into a corner by focusing too much on how one specific backend acted.  I needed a simpler problem that was more easily solvable, but one that would in the end help me reach my actual goal.</p>
<p>As much as I wish I could take credit for this idea, it&#8217;s not mine, it&#8217;s something called <a href="http://en.wikipedia.org/wiki/Minimum_viable_product">Minimum Viable Product</a>.  I wanted something that at its core would produce cross-platform SQL, so the first iteration was to make something that did exactly that.  If you go on <a href="http://github.com/ihumanable/prosper-lib">GitHub</a> and pull one of the earlier commits you will see that that&#8217;s exactly what I built.  Over time I have added the ability to execute those strings, connection and transaction management, standardized results, prepared statement support, and much more.</p>
<p>I couldn&#8217;t have accomplished any of this though if I hadn&#8217;t taken a step back from the problem domain and looked at the simpler problem at the core of what I was trying to do.  I stumbled in the beginning, I&#8217;ve refactored again and again, over the break my good friend Ian took a look at the library and found a whole slew of problems, and I thank him for it.  Prosper isn&#8217;t perfect yet, but it is moving toward being something really worthwhile, and to begin moving it required that I have something, anything, to start with.</p>
<p>So here is my suggestion for you for the new year.  If you have some project that you&#8217;ve wanted to do but couldn&#8217;t figure out how to start, step back from the problem domain and try to find the core of the problem and solve it with the simplest thing that could possibly work.  Don&#8217;t worry about the first iteration, or the first 20 iterations, you have to just get started.  Once it is started you can iterate and refactor and maybe throw everything away and start again.  No matter what the outcome of the first iteration it will be worth it, the best case scenario is that you can use the first iteration as a core moving forward, the worst case is that you learn a bunch about the problem domain and have to try again.</p>
<p>It&#8217;s the start of a new year, resolve to start your dream project, because that&#8217;s the hardest part.  Once you get rolling momentum has a fantastic way of carrying you through.</p>
]]></content:encoded>
			<wfw:commentRss>http://ihumanable.com/blog/2010/01/04/simplify/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>modeling</title>
		<link>http://ihumanable.com/blog/2009/12/28/modeling/</link>
		<comments>http://ihumanable.com/blog/2009/12/28/modeling/#comments</comments>
		<pubDate>Mon, 28 Dec 2009 20:33:36 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[side project]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[development]]></category>

		<guid isPermaLink="false">http://ihumanable.com/blog/?p=478</guid>
		<description><![CDATA[When solving a problem the most difficult part should almost never be the implementation. Implementing a solution should be fairly straightforward from the solution itself, if it is not, then your solution is incomplete. That doesn&#8217;t mean that you need to sit down with pen and paper and completely solve a problem before coding, this [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_479" class="wp-caption alignright" style="width: 235px"><a href="http://ihumanable.com/blog/wp-content/uploads/2009/12/americas-next-top-model.jpg"><img src="http://ihumanable.com/blog/wp-content/uploads/2009/12/americas-next-top-model-225x300.jpg" alt="america&#039;s next top model" title="americas-next-top-model" width="225" height="300" class="size-medium wp-image-479" /></a><p class="wp-caption-text">Just like this, only less beautiful women and more boring data</p></div>
<p>When solving a problem the most difficult part should almost never be the implementation.  Implementing a solution should be fairly straightforward from the solution itself, if it is not, then your solution is incomplete.  That doesn&#8217;t mean that you need to sit down with pen and paper and completely solve a problem before coding, this is an approach taken by some books attempting to teach software development.  Some go as far to advocate for an even stricter approach, something along these lines.</p>
<ol>
<li>Model the problem domain with UML or some other modeling technique</li>
<li>Translate your modeling into pseudo-code</li>
<li>Translate pseudo-code into actual code</li>
<li>Realize 2 month project took 2 years to complete</li>
<li>Go to step 1 (the problem has radically changed since you took so long)</li>
</ol>
<p>Of course, I&#8217;m poking fun at the books that take such a structured route.  Here is a news flash for everyone <strong>Programmers are lazy</strong>.  Here is another news flash (and this might actually be news to some people) <strong>Being lazy is good</strong>.  Not all laziness is good, if it causes you to cut corners and fail to deliver a high quality product, than you fail at life.  If however your laziness drives you to find an easier way to do things then &#8220;Lazy FTW!&#8221;</p>
<p>I have the &#8220;joy&#8221; of programming Java in my 9 to 5, when you write Java for a living you get used to the absurd amount of verbosity in your code, you also have the joy of Eclipse (notice no quotes around joy) that will write most of your Java code for you.  Then there are things like <a href="http://projectlombok.org">Project Lombok</a> that strive to make Java easier and more fun to write.  C# got the memo, and let their programmers be lazy, let&#8217;s take a look at attributes in a few languages</p>
<p>Here is some C# code to make a class called <tt>Foo</tt> with a string member called <tt>Bar</tt> that can be read and written</p>
<pre class="brush: csharp; title: ;">
public class Foo {
  public string Bar { get; set; }
}
</pre>
<p>They realized people are lazy, let&#8217;s look at the same thing in ruby</p>
<pre class="brush: ruby; title: ;">
class Foo
  attr_accessor :bar
end
</pre>
<p>Again, concise and simple, let&#8217;s look at some Java</p>
<pre class="brush: java; title: ;">
public class Foo {
  private string bar;

  public string getBar() {
    return this.bar;
  }

  public void setBar(string bar) {
    this.bar = bar;
  }
}
</pre>
<p>Can you hear it? I can, it&#8217;s the language architect saying &#8220;Just don&#8217;t be so lazy, write those simple functions, it isn&#8217;t hard.&#8221;  The truth of the matter is that it isn&#8217;t hard, in fact Eclipse will happily write these functions for you, just hit CTRL-SHIFT-G.  I&#8217;m sure there is a point here that I&#8217;m getting to, and here it is.  I don&#8217;t want to disparage Java or start a language war, what I want to point out is that Java has a different conceptual model than C# or ruby.  C# has the concept of properties and ruby has the concept of attributes, Java doesn&#8217;t have anything like this, classes have members and functions, nothing more.</p>
<p>The point is that the conceptual models your solution adopts will have huge ramifications on the implementation of the solution.  There are many examples of unifying philosophies that make things simpler.  Unix&#8217;s concept that everything is a file, C++ concept of streams, Erlang&#8217;s pervasive share-nothing message passing, ruby&#8217;s duck typing.  These are core concepts that have profound and far reaching consequences.</p>
<p>Working on a new side project I recently was struck by a way to simplify a complex data structure by adopting a new conceptual model.  Creating an internally consistent, elegant conceptual model is the most important thing you can do for a project&#8217;s success.</p>
<p>Conceptual modeling is a hard thing to get right, go into too much detail and your model becomes rigid and brittle, go into too little and the model can be impossible to implement correctly.  Making a good conceptual model is like making a good analogy, there are a few hallmarks to a good conceptual model.</p>
<ul>
<li>The conceptual model should <strong>simplify</strong> the problem domain.  Files and folders greatly simplifies the concept of a hierarchical file system by relating it to something commonplace.</li>
<li>The conceptual model should not be overly complex to translate into an implementation</li>
<li>The conceptual model should be uniform and consistent, if you find parts of the problem domain falling outside the conceptual model or feeling &#8220;tacked on&#8221; you should rework the model</li>
</ul>
<p>The next time a project seems stuck or overly complex, instead of refactoring code or attempting to throw another library at it, take a step back, look at the big picture and refactor your conceptual mode.</p>
]]></content:encoded>
			<wfw:commentRss>http://ihumanable.com/blog/2009/12/28/modeling/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>decompress</title>
		<link>http://ihumanable.com/blog/2009/12/23/decompress/</link>
		<comments>http://ihumanable.com/blog/2009/12/23/decompress/#comments</comments>
		<pubDate>Wed, 23 Dec 2009 14:23:04 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[philosophy]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[side project]]></category>
		<category><![CDATA[holidays]]></category>

		<guid isPermaLink="false">http://ihumanable.com/blog/?p=471</guid>
		<description><![CDATA[The holidays are upon us and no matter what holiday your particular sky god has you celebrate (Festivus for the Rest of Us!) there is one thread of humanity that binds us together at this time, days off from work. When you have some time off of work you can spend it doing any number [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_472" class="wp-caption alignnone" style="width: 460px"><a href="http://ihumanable.com/blog/wp-content/uploads/2009/12/festivus.jpg"><img src="http://ihumanable.com/blog/wp-content/uploads/2009/12/festivus.jpg" alt="festivus card" title="festivus" width="450" height="300" class="size-full wp-image-472" /></a><p class="wp-caption-text">Get ready for the feats of strength</p></div>
<p>The holidays are upon us and no matter what holiday your particular sky god has you celebrate (Festivus for the Rest of Us!) there is one thread of humanity that binds us together at this time, days off from work.  When you have some time off of work you can spend it doing any number of worthwhile things</p>
<ul>
<li>Drinking egg nog until you black out</li>
<li>Eating your weight in sugar cookies</li>
<li>Having that same argument with your family that you&#8217;ve been having for the last 10 years</li>
<li>Watching 24 hours of A Christmas Story</li>
<li>Spending quality time with friends and loved ones</li>
<li>Living through the same day over and over and over, &aacute; la Groundhog&#8217;s Day (Best saved for the actual Groundhog&#8217;s Day)</li>
</ul>
<p>If you are reading this blog there is a good chance that you are some sort of programming nerd, its ok, I don&#8217;t care what the <a href="http://bits.blogs.nytimes.com/2009/12/21/nerd-and-geek-should-be-banned-professor-says/?partner=rss&#038;emc=rss">New York Times</a> says.  As a proud nerd you have probably heard of some sort of technology that interests you, maybe clojure has piqued your curiosity, or you finally want to learn that &#8220;rails&#8221; thing all those young whippersnappers keep talking about.  I would argue that this can be a great way to decompress, if you do it right.</p>
<p>First off, find something different than what you are used to, if your 9-5 is .Net don&#8217;t spend your precious free time learning more .Net, that&#8217;s stupid.  Go find something radically different, maybe look at a functional programming language, go find that weird kid in the corner and talk to him, he probably has interesting stories about fire.  This might seem like a waste of time at first, but it&#8217;s not.  It&#8217;s all too easy to get locked into an ecosystem, doing the same thing day in and day out, to get comfortable there and to start thinking that your way is the only way or the best way.  Reading about other technology outside of your realm might not have a direct benefit to your 9-5, but you may gain a perspective or understanding that would be incredibly difficult to get from your standard frame of mind.</p>
<p>Second off, this isn&#8217;t work, this is fun.  You are allowed to make mistakes and change your mind.  If you work through a tutorial or get done with the first chapter of something and find that you really don&#8217;t care, then go find something else, the software world is full of interesting things.  The thing is, only stop if you grok the subject and dislike it, don&#8217;t necessarily stop just because you don&#8217;t get it at first.</p>
<div id="attachment_475" class="wp-caption alignright" style="width: 310px"><a href="http://ihumanable.com/blog/wp-content/uploads/2009/12/erlang-gedit.png"><img src="http://ihumanable.com/blog/wp-content/uploads/2009/12/erlang-gedit-300x230.png" alt="erlang source in gedit" title="erlang-gedit" width="300" height="230" class="size-medium wp-image-475" /></a><p class="wp-caption-text">What? Caroling? No fuck that, I got some erlanging to do!</p></div>
<p>Third off, this is just to whet your whistle.  Don&#8217;t ignore your loved ones, squirreled away with your Beginner&#8217;s Guide to Erlang because you&#8217;ve fallen in love with the idea of massively parallel systems.  Take this time to investigate several things, learning the basics and setting up your love affair for the next few months.  Then make sure you tell the people you care about that you love them and eat too much food and do people things.</p>
<p>For me this break will be about Rails.  I&#8217;ve followed rails for a while, I&#8217;ve always been impressed with it, and I&#8217;ve had a few false starts.  I&#8217;ve gone through the <a href="http://guides.rubyonrails.org/getting_started.html">Getting Started</a> tutorial more than once.  I&#8217;m a php guy at my core, but learning how other people do the web is worthwhile.  I&#8217;ve started the adventure already and think that this time it might stick.  I have a 2 hour car ride up to Cleveland and back that I plan to fill with listening to Rails podcasts.</p>
<hr />
<p>That&#8217;s all for now, go relax and decompress, that&#8217;s what I plan on doing for the next 4 days.  As a side note I will probably not update during the holiday break so if you obsessively check or your rss feed gets lonely don&#8217;t worry I will be back on the 28th.</p>
]]></content:encoded>
			<wfw:commentRss>http://ihumanable.com/blog/2009/12/23/decompress/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>pushing</title>
		<link>http://ihumanable.com/blog/2009/12/09/pushing/</link>
		<comments>http://ihumanable.com/blog/2009/12/09/pushing/#comments</comments>
		<pubDate>Wed, 09 Dec 2009 18:04:44 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[promotion]]></category>
		<category><![CDATA[side project]]></category>
		<category><![CDATA[prosper]]></category>

		<guid isPermaLink="false">http://ihumanable.com/blog/?p=367</guid>
		<description><![CDATA[I have been working on prosper for the last few months, I started thinking about it in early October and according to GitHub my first commit was October 22nd. This project has been great fun so far and I&#8217;m not even close to a 1.0 release yet (right now prosper is at 0.6 well on [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_368" class="wp-caption alignright" style="width: 310px"><img src="http://ihumanable.com/blog/wp-content/uploads/2009/12/push-button.gif" alt="cupcake dispensing button" title="push-button" width="300" height="343" class="size-full wp-image-368" /><p class="wp-caption-text">cupcake dispensing button</p></div>
<p>I have been working on <a href="http://ihumanable.com/blog/prosper">prosper</a> for the last few months, I started thinking about it in early October and according to <a href="http://github.com/ihumanable/prosper-lib">GitHub</a> my first commit was October 22nd.  This project has been great fun so far and I&#8217;m not even close to a 1.0 release yet (right now prosper is at 0.6 well on its way to 0.7).  I have learned a ton on this project that I would have never guessed before I started.</p>
<ul>
<li>The joy of <a href="http://github.com">GitHub</a></li>
<li>The terror of <a href="http://www.phpdoc.org/">phpDoc</a></li>
<li>The <a href="http://twitter.com/pian0/status/6431820026">prodding of friends</a></li>
<li>The camaraderie of other developers (<a href="http://flourishlib.com">Will Bond</a> and <a href="http://facility9.com">Jeremiah Peschka</a>)</li>
<li>The <a href="http://ihumanable.com/blog/2009/11/dogfood-terror-and-tweets/">vulnerability of releasing the project</a></li>
<li>The <a href="http://ihumanable.com/blog/2009/12/prosper-0-6/">drive to keep improving</a></li>
</ul>
<p>I completely underestimated the amount of work prosper would be, and I don&#8217;t mean coding (although coding has eaten up a large chunk of the time I normally fill with playing Borderlands).  I didn&#8217;t realize the amount of work it takes to manage even a small project like this.  <a href="http://github.com">GitHub</a> has been an amazing resource, but at the end of the day it is a tool, and you need to spend time learning how to use it and populating it with data.  Writing up documentation, reading documentation, creating examples, running tests, working with collaborators, discussing technical problems, it has been a mountain of unexpected stuff.  Now I&#8217;m not complaining, this was the challenge I wanted, I&#8217;m learning a ton of new stuff, making great new connections, and pushing myself in ways I never have before.  One of the most important new hats I&#8217;m learning to wear is <strong>promoter</strong></p>
<p>Let&#8217;s say you have a great idea (like a standardized php database abstraction layer), and you decide to invest your time and energy into it.  Great, you start coding like a madman and you have something working, you are working out the kinks, enjoying it, really making something worthwhile.  After a while you have this project to the point where you think others might be able to use it, what do you do?</p>
<ol>
<li>It&#8217;s too much work to do anything, just let the bits sit on your harddrive</li>
<li>I need to share this with people, I&#8217;ll toss it on GitHub / BitBucket / SourceForge / etc</li>
<li>I want to promote it</li>
<li>I&#8217;m going to get others involved</li>
</ol>
<p>Those are the steps that I went through, and I would imagine a lot of people do, really I&#8217;m at step 2.5-ish, I created some pages within WordPress for prosper, but I plan on spinning out a standalone website for prosper at some point.   The list looks easy but the problem is that you have to push yourself, because each step is costly.</p>
<p>To go from step 1 to step 2 you need to push past that voice in your head telling you to apply more polish.  You need to push past any indecision or fear of criticism and get your code out there.  The next step is to promote the crap out of your project.  This step is difficult because how do you even go about it.  Here are some ideas.</p>
<ul>
<li>Create a sample application using your project</li>
<li>Give your project a home and shamelessly link to it</li>
<li>Promote on reddit, Hacker News, etc.</li>
<li>Get friends more famous than you to push it, if you don&#8217;t have famous friends, start sending out emails, the people that I&#8217;ve talked to have been really great</li>
<li>Submit your project for review in any pertinent technical website (like <a href="http://php5.phpmagazine.net/">PHP5 Magazine</a>, which may actually be defunct)</li>
</ul>
<p>For step 3 you have to push others, push friends, and push yourself to get your project on people&#8217;s radar.  Now for the next step, getting others involved.  You should have created some connections and hopefully some users, enlist them to make your project the best it can be.  User&#8217;s can submit bugs, feature requests, and patches.  Other developers can polish up bits they are interested in, as my good friend <a href="http://github.com/ihumanable/prosper-lib/commit/809c6ddecb3ae8cc9ea0c2055934979d5d8bd7ad">Jeremiah did</a>.  Getting more eyes and ears and noses in your project let&#8217;s you refine and build, spreading complexity around.</p>
<p>The point of everything is that <strong>you have to push</strong>.  Even great ideas, great code, great projects can fall to the wayside if no one pushes.  Promoting the work you do is nearly as important as the work itself, if no one ever uses your code, no one will care about the months of effort you put into making it beautiful.  Get out there and be passionate, genuine, and don&#8217;t stop pushing.</p>
<hr />
<p>Tomorrow I will be picking up the gauntlet that Jeremiah Peschka threw down today in <a href="http://facility9.com/2009/12/09/what-is-your-biggest-weakness">What is Your Biggest Weakness?</a>  Tune in tomorrow to see what my biggest weakness is, and see who I challenge next.</p>
]]></content:encoded>
			<wfw:commentRss>http://ihumanable.com/blog/2009/12/09/pushing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>murdering your baby</title>
		<link>http://ihumanable.com/blog/2009/12/08/murdering-your-baby/</link>
		<comments>http://ihumanable.com/blog/2009/12/08/murdering-your-baby/#comments</comments>
		<pubDate>Tue, 08 Dec 2009 18:52:14 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[philosophy]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[side project]]></category>
		<category><![CDATA[development]]></category>

		<guid isPermaLink="false">http://ihumanable.com/blog/?p=355</guid>
		<description><![CDATA[Yesterday my friend Ian sent me a tweet about prosper @ihumanable I&#8217;d be more interested in using Prosper if it provided support for true prepared statements instead of concatenating strings. 6:29 AM Dec 7th &#8211; pian0 With that my baby was born, the baby was a version of prosper that utilized prepared statements where appropriate. [...]]]></description>
			<content:encoded><![CDATA[<div style="padding-left: 55px">
<div id="attachment_356" class="wp-caption alignnone" style="width: 380px"><img src="http://ihumanable.com/blog/wp-content/uploads/2009/12/baby.jpg" alt="don&#039;t worry, no babies were harmed" title="baby" width="370" height="301" class="size-full wp-image-356" /><p class="wp-caption-text">don't worry, no babies were harmed</p></div>
</div>
<p>Yesterday my friend Ian sent me a tweet about <a href="http://ihumanable.com/blog/prosper">prosper</a></p>
<blockquote><p>
<a href="http://twitter.com/ihumanable">@ihumanable</a> I&#8217;d be more interested in using Prosper if it provided support for true prepared statements instead of concatenating strings.<br />
<a href="http://twitter.com/pian0/status/6431820026">6:29 AM Dec 7th</a> &#8211; <a href="http://twitter.com/pian0">pian0</a>
</p></blockquote>
<p>With that my baby was born, the baby was a version of prosper that utilized prepared statements where appropriate.  Prosper&#8217;s main functionality has been coded for a while and the bulk of the work I&#8217;ve been doing as of late has been testing, improving backend support, and adding new functionality.  The nice thing about this kind of work is that you don&#8217;t have to go mucking around in working code, you are just fixing broken stuff and adding new functionality.  The idea of adding prepared statements made me a little queasy, I had briefly looked at it when I was starting prosper but decided that they were so varied that for the first attempt I would just avoid the headache.  What&#8217;s the problem you ask, let&#8217;s take a look at this feature table real quick.</p>
<table>
<tr>
<th>Database</th>
<th>Supported by Prosper</th>
<th>Can Support Prepared Statements</th>
</tr>
<tr>
<td>dBase</td>
<td style="background: #00FF88; color: #00773F">YES</td>
<td style="background: #FF85B6; color: #FF0000">NO</td>
</tr>
<tr>
<td>DB++</td>
<td style="background: #FF85B6; color: #FF0000">NO</td>
<td style="background: #FF85B6; color: #FF0000">NO</td>
</tr>
<tr>
<td>FrontBase</td>
<td style="background: #00FF88; color: #00773F">YES</td>
<td style="background: #FF85B6; color: #FF0000">NO</td>
</tr>
<tr>
<td>filePro</td>
<td style="background: #FF85B6; color: #FF0000">NO</td>
<td style="background: #FF85B6; color: #FF0000">NO</td>
</tr>
<tr>
<td>Firebird / Interbase</td>
<td style="background: #00FF88; color: #00773F">YES</td>
<td style="background: #00FF88; color: #00773F">YES</td>
</tr>
<tr>
<td>Informix</td>
<td style="background: #00FF88; color: #00773F">YES</td>
<td style="background: #00FF88; color: #00773F">YES</td>
</tr>
<tr>
<td>IBM DB2</td>
<td style="background: #00FF88; color: #00773F">YES</td>
<td style="background: #00FF88; color: #00773F">YES</td>
</tr>
<tr>
<td>Ingres</td>
<td style="background: #00FF88; color: #00773F">YES</td>
<td style="background: #00FF88; color: #00773F">YES</td>
</tr>
<tr>
<td>MaxDB</td>
<td style="background: #00FF88; color: #00773F">YES</td>
<td style="background: #00FF88; color: #00773F">YES</td>
</tr>
<tr>
<td>Mongo</td>
<td style="background: #FF85B6; color: #FF0000">NO</td>
<td style="background: #FF85B6; color: #FF0000">NO</td>
</tr>
<tr>
<td>mSQL</td>
<td style="background: #00FF88; color: #00773F">YES</td>
<td style="background: #FF85B6; color: #FF0000">NO</td>
</tr>
<tr>
<td>MS-SQL</td>
<td style="background: #00FF88; color: #00773F">YES</td>
<td style="background: #00FF88; color: #00773F">YES</td>
</tr>
<tr>
<td>MySQL</td>
<td style="background: #00FF88; color: #00773F">YES</td>
<td style="background: #00FF88; color: #00773F">YES</td>
</tr>
<tr>
<td>OCI8 (Oracle)</td>
<td style="background: #00FF88; color: #00773F">YES</td>
<td style="background: #00FF88; color: #00773F">YES</td>
</tr>
<tr>
<td>Ovrimos</td>
<td style="background: #00FF88; color: #00773F">YES</td>
<td style="background: #00FF88; color: #00773F">YES</td>
</tr>
<tr>
<td>Paradox</td>
<td style="background: #00FF88; color: #00773F">YES</td>
<td style="background: #FF85B6; color: #FF0000">NO</td>
</tr>
<tr>
<td>PostgreSQL</td>
<td style="background: #00FF88; color: #00773F">YES</td>
<td style="background: #00FF88; color: #00773F">YES</td>
</tr>
<tr>
<td>SQLite</td>
<td style="background: #00FF88; color: #00773F">YES</td>
<td style="background: #FF85B6; color: #FF0000">NO</td>
</tr>
<tr>
<td>Sybase</td>
<td style="background: #00FF88; color: #00773F">YES</td>
<td style="background: #FF85B6; color: #FF0000">NO</td>
</tr>
<tr>
<td>Tokyo Tyrant</td>
<td style="background: #FF85B6; color: #FF0000">NO</td>
<td style="background: #FF85B6; color: #FF0000">NO</td>
</tr>
</table>
<p>As you can see the support for prepared statements varies in the <a href="http://us2.php.net/manual/en/refs.database.vendors.php">Vendor Specific Database Extensions</a> of php.  There is also the fact that prepared statement support is poorly implemented in several extensions, they can be coded around but it adds a good deal of complexity.  Despite all the reasons not to implement prepared statements, safety, speed, and correctness dictate that I should at least give it a go.</p>
<p>Yesterday and today were my go, and I met with some success.  Prepared statements are not all that difficult to implement for a given backend, throw in some question marks, call the correct bind function, and you&#8217;re off and running.  The real difficulty is the cross-platform nature of prosper.  I wanted prepared statements to be a first class citizen, I didn&#8217;t want to decrease any existing functionality, I wanted to not overly complicate the way prosper works, and because there are 11 adapters that need to be upgraded, I wanted it to be simple to add this functionality to a given adapter.</p>
<p>I worked and toiled and toiled and worked, I tried hacking something up to make the MySQL adapter work, ran into the <tt>bind_results</tt> function and screamed at it for a while.  Then I got out some paper and drew out some diagrams, thought about sample code.  Then I went to sleep.  Then I woke up and in the shower pondered the proper syntax for passing around typing information and the division of labor for transformation.  Then I hacked on it some more and wrote a quick test. Then <strong>and this is the most important part</strong> I realized I had done it absolutely backwards.</p>
<p>I had some clues that stuff wasn&#8217;t working out right, I hit a point where I would either need to embed an if statement in every function of an adapter or have a duplicate function.  I thought that with some clever coding I could shove this down into the base class, it wasn&#8217;t great but it was working.  Then I saw another red flag when I realized that the processing in the where clause was identical to the processing in the values clause, and I applied some refactoring.  This is when I realized that there was a single function that I <strong>could</strong> have modified and had the whole thing work much more elegantly.</p>
<p>That is when I had to come to the decision to murder my baby.  I had painstakingly worked out the kinks for two days, traveling far down this road, touching a bunch of code, and now I realize the best way forward is back.  The best thing I can do right now is to revert my changes to Monday morning and lose 2 days of work, and that is great!</p>
<p>It&#8217;s not the best outcome, in an ideal world I would have seen this solution before and applied it and not wasted 2 days.  The thing is that I&#8217;ve learned a great deal, I&#8217;ve come up with a much better implementation, and I&#8217;ve been reminded of an important lesson, never be afraid to throw away code.  The code I wrote is adequate, it works well enough, but it is far from optimal.  I could keep going, head down, plowing away making as many problems as I solve trying to build a house on an unsound foundation.  The point here is to pay attention to those red flags.</p>
<p>The other important point is that sometimes you have to actually try something to find the thing that <strong>will</strong> work.  You may lose some time, but even after sitting down with pencil and paper, thinking long and hard, the optimal path didn&#8217;t come to me until I walked down the wrong road.  That&#8217;s just life sometimes as a software developer, you have to learn to live with it.</p>
<p>I will continue working on prepared statements for prosper, and I hope that by 0.7 or 0.8 they will be implemented and in there.  I still question the syntax and think that I can clean it up, right now the plan is for prosper to support unnamed parameters (?), named parameters (:name), unnamed typed parameters (%i), and named typed parameters (:name%s), but all this seems like a little much.  Good thing prosper hasn&#8217;t had a 1.0 release yet <img src='http://ihumanable.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://ihumanable.com/blog/2009/12/08/murdering-your-baby/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>spinning wheels</title>
		<link>http://ihumanable.com/blog/2009/11/30/spinning-wheels/</link>
		<comments>http://ihumanable.com/blog/2009/11/30/spinning-wheels/#comments</comments>
		<pubDate>Mon, 30 Nov 2009 19:06:48 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[philosophy]]></category>
		<category><![CDATA[side project]]></category>
		<category><![CDATA[burnout]]></category>
		<category><![CDATA[stress]]></category>

		<guid isPermaLink="false">http://ihumanable.com/blog/?p=294</guid>
		<description><![CDATA[Back from Thanksgiving, nice break, hope everyone had a good holiday. With the long weekend came some time to eat turkey, spend time with my family, and reflect on life. I&#8217;ve been thinking about what I want to ultimately accomplish in life and how to get there. The end goal is to work on complex [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_295" class="wp-caption alignleft" style="width: 261px"><img src="http://ihumanable.com/blog/wp-content/uploads/2009/11/sisyphus-251x300.jpg" alt="keep pushing that boulder" title="sisyphus" width="251" height="300" class="size-medium wp-image-295" /><p class="wp-caption-text">keep pushing that boulder</p></div>
<p>Back from Thanksgiving, nice break, hope everyone had a good holiday.  With the long weekend came some time to eat turkey, spend time with my family, and reflect on life.  I&#8217;ve been thinking about what I want to ultimately accomplish in life and how to get there.  The end goal is to work on complex technical problems and produce something useful for humanity.</p>
<p>I spend a good amount of time on <a href="http://news.ycombinator.com">Hacker News</a> which is a great place to find out about new technology.  It&#8217;s a fantastic community where entrepreneurs and programming geeks get together and talk about technology and startups.  It&#8217;s the kind of place that incubates ideas that become the next <a href="http://www.twitter.com">twitter</a> or <a href="http://www.youtube.com">youtube</a>.  Spending time there has made me think that I can do more, do better, it was part of the drive to make <a href="http://ihumanable.com/blog/prosper">prosper</a>.</p>
<p>The problem is that life doesn&#8217;t happen in a bubble.  You have to buy groceries, pay the rent, and keep the lights on.  So I&#8217;ve found myself at an odd cross road, I&#8217;d rather not continue doing business programming, but I can&#8217;t stop.  What is a person to do?  How does one pursue their dreams while maintaining financial security, is it even possible?</p>
<p>For a long while I&#8217;ve believed that you can work a 9-5 to keep the lights on and then work on a side project in the evening.  The problem that I&#8217;m now finding is that any project that you can hang your hat on and make a living with is going to require more work than what you can give it in the 4 or 5 hours after you get home from work and before you go to sleep to get up for work the next day.  Once you throw in trying to have some semblance of a life, it becomes nearly impossible to give a side project enough love and attention to make it work.</p>
<p>I&#8217;ve still been working full bore on <a href="http://ihumanable.com/blog/prosper">prosper</a> and its sister project that has yet to be released.  The problem that I face now is this ever creeping feeling that I am merely spinning my wheels, and the encroaching danger of <a href="http://www.stressdoc.com/four_stages_burnbout.htm">professional burnout</a>.  Prosper has yet to see any real adoption, which is not surprising its not ready for anything concrete yet, it is unproven, and it is still in a huge state of flux.  The 0.5 release and the current bleeding edge on <a href="http://github.com/ihumanable/prosper-lib">GitHub</a> are fairly different, with the bleeding edge being a fair bit better.</p>
<p>There is no use moping about all this, so I need a plan to move forward with.  Can I quit my day job to focus on the side projects, no.  Should I give up on my dreams, no.  What is the way forward then?  Normally I would double down, work harder and push through. The problem is that I think I slipped from the first stage of professional burnout (Physical, Mental and Emotional Exhaustion) to the second stage (Shame and Doubt), and pushing harder, doubling down, may only accelerate this process.</p>
<p>I still believe that I can change the face of PHP database access, that my library can provide a hugely needed service to hundreds or thousands of PHP developers.  I still believe in my ability to create useful technologies and solve difficult problems.  So I&#8217;m creating a list of things to accomplish in the hopes of defeating my professional burnout.</p>
<ul>
<li><strong>Re-institute a workout and diet regimen</strong> &#8211; Long hours at work and on projects have caused me to spend too many hours sitting around and running to McDonald&#8217;s or Wendy&#8217;s for a quick bite to eat.</li>
<li><strong>Create concrete project goals for prosper</strong> &#8211; So far development on prosper has been haphazard, I&#8217;ll get some idea and then work implementing it.  The problem being that this leads to an almost manic-depressive like development schedule.  When there is a new feature to implement I could spend 6 hours working on it, then have days and days of nothing until a new idea springs up.</li>
<li><strong>Make time to relax</strong> &#8211; I find that I spend most of my off-time working on prosper or its sister project.  The other &#8220;down-time&#8221; that I have is spent reading technical articles and ebooks about programming.  This stems from my deep love of programming, I do enjoy reading about lisp for hours, but I need to rekindle some of my love for other subject matters, too much of anything is a bad thing.</li>
<li><strong>Reflect on the good</strong> &#8211; Too often I spend time thinking about the negative.  There are many great things that I take for granted.</li>
</ul>
<p>Like GI Joe said, knowing is half the battle.  This post is more about coming to terms with the difficulty that I&#8217;m currently facing, but I hope that it can help others in a similar position.  No one is going to hand you your dreams, you have to fight and scrape and kick and scream to make it.  It is difficult grueling often thankless work.  It&#8217;s not easy, but if you want more out of life than a paycheck and a cold grave you must fight for it.  The struggle takes it toll on everyone, but by being cognizant of the dangers, and recognizing that you are not impervious to the grind, you can make it through, and hopefully make something unique and beautiful.</p>
]]></content:encoded>
			<wfw:commentRss>http://ihumanable.com/blog/2009/11/30/spinning-wheels/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>refactor</title>
		<link>http://ihumanable.com/blog/2009/11/25/refactor/</link>
		<comments>http://ihumanable.com/blog/2009/11/25/refactor/#comments</comments>
		<pubDate>Wed, 25 Nov 2009 17:48:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[side project]]></category>

		<guid isPermaLink="false">http://ihumanable.com/blog/?p=291</guid>
		<description><![CDATA[I&#8217;ve been working a lot on prosper lately (this means that if you want to play around with it, get the bleeding edge on GitHub). I recently added a lazy loading feature, mostly to facilitate unit testing, and pretty soon I will be adding some unit testing. I was able to take care of some [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_292" class="wp-caption alignleft" style="width: 235px"><img src="http://ihumanable.com/blog/wp-content/uploads/2009/11/refactor-dog-225x300.jpg" alt="google thinks this means refactor" title="refactor-dog" width="225" height="300" class="size-medium wp-image-292" /><p class="wp-caption-text">google thinks this means refactor</p></div>
<p>I&#8217;ve been working a lot on <a href="http://ihumanable.com/blog/prosper">prosper</a> lately (this means that if you want to play around with it, get the bleeding edge on <a href="http://github.com/ihumanable/prosper-lib">GitHub</a>).  I recently added a lazy loading feature, mostly to facilitate unit testing, and pretty soon I will be adding some unit testing.  I was able to take care of some things recently that have bugged me for a while, and its because of ruthless refactoring.</p>
<p>Refactoring is not black magic, it just means taking some code and reworking it, rename a function here, encapsulate some functionality there, done.  The sticky part is that refactoring is a compounding problem.  Things that should be refactored build up on each other, so if you put off refactoring for too long you will have a real mess on your hands.  Refactoring can be painful but should never be put off, you see a function named poorly but know that it is used in 20 places, get it now, don&#8217;t put it off, because by the time you get around to renaming it, it will be in more places.</p>
<p>A good IDE will help you in your refactoring process, the one that I love is (surprise, surprise) Eclipse.  Eclipse is brilliant at refactoring, probably because it keeps semantic knowledge with symbol names.  Rename the function <tt>foo</tt> to <tt>bar</tt> and you don&#8217;t have to worry about Eclipse destorying all those variables named <tt>foo</tt> (ps. if you have variables named <tt>foo</tt> you have refactoring to do!).  Eclipse (and other IDEs) are great at all kinds of refactoring, renaming, extracting and encapsulating, pull up, push down, etc.  Get to know these tools, get comfortable with using them, and refactor without fear.</p>
<p>Wait, change big chunks of code without fear, how!?  Well you should have tests, be they unit or functional.  I&#8217;m introducing unit tests into prosper, but for the time being I have a local version of <a href="http://ihumanable.com/blog/prosper/case-study-todo-list/">todo list case study</a>.  The todo list application is pretty good because it exercises all the important bits, if I change something and everything in there keeps working, I haven&#8217;t broken anything too badly.</p>
<p>The reason I want to introduce unit tests though is that I&#8217;ve introduced regressions even with the todo list humming along, some dark corner of prosper has started shooting out unicorns, but I haven&#8217;t noticed, until I see some bit of code that I know can&#8217;t be doing the right thing.  Test coverage allows you to refactor without fear, and if you want to have a living project that people might someday use, you need to refactor without fear to keep things current.</p>
<hr />
<p>That&#8217;s it for the technical part of this blog post, I would like to announce a few things though.</p>
<ul>
<li>The move to GitHub has been completed and I&#8217;m starting to get into the workflow of using it now.</li>
<li>The new skunkworks project is nearing a beta release, so keep an eye out.</li>
<li>Development on the new project has spurred improvements in prosper, there will be a point release (0.6) soon</li>
<li>There probably won&#8217;t be a post tomorrow as I&#8217;m traveling with Heather, my beautiful girlfriend, up to see my family in Cleveland.</li>
</ul>
<p>That&#8217;s all for now, I will have something up Black Friday more than likely, until then, Happy Turkey Day everyone, safe travels, see you after I put another couple of pounds on.</p>
]]></content:encoded>
			<wfw:commentRss>http://ihumanable.com/blog/2009/11/25/refactor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

