<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" version="2.0">

<channel>
	<title>Bridge Builder's Journal</title>
	
	<link>http://bluebridgedev.com/blog</link>
	<description>A freelance developer's thoughts.</description>
	<lastBuildDate>Wed, 27 Jan 2010 16:40:39 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/TheBridgeBuilder" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="thebridgebuilder" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">TheBridgeBuilder</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>Walking the Path</title>
		<link>http://bluebridgedev.com/blog/general-development/walking-the-path/</link>
		<comments>http://bluebridgedev.com/blog/general-development/walking-the-path/#comments</comments>
		<pubDate>Wed, 27 Jan 2010 16:40:39 +0000</pubDate>
		<dc:creator>John</dc:creator>
				<category><![CDATA[General Development]]></category>
		<category><![CDATA[Professional Development]]></category>

		<guid isPermaLink="false">http://bluebridgedev.com/blog/?p=70</guid>
		<description><![CDATA[This morning I made some simple changes to a website.  It felt good.
Effortless.  I instinctively knew where to look and what to change to
keep things as pain free as possible.
Yesterday afternoon I met and talked with a partner of mine about an
up-coming web project.  Similar to the changes I made this morning, [...]]]></description>
			<content:encoded><![CDATA[<p>This morning I made some simple changes to a website.  It felt good.<br />
Effortless.  I instinctively knew where to look and what to change to<br />
keep things as pain free as possible.</p>
<p>Yesterday afternoon I met and talked with a partner of mine about an<br />
up-coming web project.  Similar to the changes I made this morning, I<br />
noticed that I knew what questions to ask and what details to watch<br />
for.</p>
<p>I remember that when I first started I was constantly learning by<br />
trial and pain.  I remember scowering forum threads and looking<br />
material up in books and wondering if I was somehow the first person<br />
to ever have the questions I did.  I remember making silent promises<br />
that if I could have my answer, I would ensure that others would find<br />
my solution by posting it.</p>
<p>It feels great to be beyond that.</p>
<p><span id="more-70"></span></p>
<p>Outside of the office, I also boulder regularly.  Last week, I<br />
overheard the owner telling one of the climbers that, &#8220;it wasn&#8217;t about<br />
the numbers.&#8221;  As a grappler I heard people saying, &#8220;it&#8217;s not about<br />
the belt.&#8221;  Numbers and belts both being skill level indicators.</p>
<p>These people are right, but in a sense, it is about the numbers and it<br />
is about the belts.  At their core they are just symbols, but they<br />
make the activities more fun.  For example, Pac Man is fun in itself,<br />
but when you start trying to beat a high score, it gets much more<br />
compelling.</p>
<p>You have to exercise caution however, mastering a skill is fun, but<br />
it&#8217;s easy to turn that fun into work.  You make plans, regimens,<br />
drills, and etc. to deaden the fun and focus on what you percieve is<br />
the quickest way to that high score which you have been enjoying<br />
working towards.  One day you wake up and there is no enjoying, just<br />
working towards.</p>
<p>In addition, it&#8217;s no fun to reach too far beyond your skill level.<br />
Nothing makes any sense and you utilize massive amounts of energy to<br />
achieve only small parts of your goals.  It&#8217;s not natural and<br />
frusteration is ubiquitious.  Similarly it&#8217;s no fun to wallow beneath<br />
your skill level&#8211; boredom ensues.</p>
<p>There is a happy medium where you are regularly challenged and you<br />
are up to the challenge.  That&#8217;s where it&#8217;s really fun.  For me, for<br />
work, lately it has been writing extensions for other applications.<br />
It&#8217;s an enormous step beyond coding websites.</p>
<p>It feels good to be at this stage of development and occasionally do<br />
these easy jobs.  If I had to do it all the time, I&#8217;d go nuts, but for<br />
now it makes me smile and think, &#8220;I remember when this was difficult.&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>http://bluebridgedev.com/blog/general-development/walking-the-path/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>So Long 2009</title>
		<link>http://bluebridgedev.com/blog/freelancing/so-long-2009/</link>
		<comments>http://bluebridgedev.com/blog/freelancing/so-long-2009/#comments</comments>
		<pubDate>Thu, 31 Dec 2009 22:44:07 +0000</pubDate>
		<dc:creator>John</dc:creator>
				<category><![CDATA[Business Strategy]]></category>

		<guid isPermaLink="false">http://bluebridgedev.com/blog/?p=65</guid>
		<description><![CDATA[This year hasn&#8217;t been easy for me.
From January until August I was working 60-70 hour weeks, getting up every morning and working into the evening seven days a week.  Things leveled off a bit in September and then were depressingly slow into the end of the year.  I started the year off poor [...]]]></description>
			<content:encoded><![CDATA[<p>This year hasn&#8217;t been easy for me.</p>
<p>From January until August I was working 60-70 hour weeks, getting up every morning and working into the evening seven days a week.  Things leveled off a bit in September and then were depressingly slow into the end of the year.  I started the year off poor and managed to end it poor.</p>
<p>This year wasn&#8217;t easy, but it&#8217;s been great.</p>
<p><span id="more-65"></span></p>
<p>I started 2009 with my general business strategy being that of marketing complete solutions to small businesses: design, development, and basic SEO.  I planned to use content management as my niche, enabling businesses to exercise more control of their site than what other web professionals could offer.  In support of this approach, I regularly attended a B2B group.</p>
<p>I no longer attend that group.  Not only that, but I don&#8217;t market to small businesses, I don&#8217;t offer a complete solution, and I don&#8217;t sell content management (though I still specialize in it).  In short, things are very different today than a year ago, and I&#8217;m in a much better position today to pursue my goals with Blue Bridge than then.</p>
<p>I&#8217;ve developed a strategy that I&#8217;ve found to work and work well.  I now have a network of peers that I can collaborate with, receive work from, and give work to.  I&#8217;ve angled my approach to provide me with the tasks that I most enjoy.  And in the past 365 days, I&#8217;ve built my portfolio, my skills, and my business and technical knowledge.</p>
<p>Some of the things I&#8217;ve accomplished:</p>
<ul>
<li>I got certified as a Zend Engineer for PHP5</li>
<li>I automated and improved my invoicing and client information systems.</li>
<li>I did a challenging and portfolio worthy Wordpress site.</li>
<li>I finally contributed to Joomla by writing and publishing a portfolio component.</li>
<li>I increased my websites rank over 4,00,000 other sites.</li>
<li>I developed a stand alone GTD application that is smart and useful.</li>
<li>I did most of the work for a Wordpress tool that will be useful to many other developers.</li>
<li>I arranged and implemented a site/brand re-design for BlueBridge that is far superior to my competitors&#8217; sites.</li>
<li>I documented my businesses systems and solved some of the core challenges of my approach.</li>
<li>I managed to move BlueBridge&#8217;s niche from competing with small business web designers to providing <em>professional development solutions</em>.</li>
</ul>
<p>I&#8217;m thankful for this year and what it&#8217;s provided me.  I&#8217;m grateful to my partners and to my family, friends, dog, and last, but not least, my wonderful girlfriend for being here with me.  It&#8217;s been wonderful: <em>thank-you</em>.</p>
]]></content:encoded>
			<wfw:commentRss>http://bluebridgedev.com/blog/freelancing/so-long-2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Go-Giver</title>
		<link>http://bluebridgedev.com/blog/freelancing/the-go-giver/</link>
		<comments>http://bluebridgedev.com/blog/freelancing/the-go-giver/#comments</comments>
		<pubDate>Sat, 26 Dec 2009 19:41:26 +0000</pubDate>
		<dc:creator>John</dc:creator>
				<category><![CDATA[Business Strategy]]></category>

		<guid isPermaLink="false">http://bluebridgedev.com/blog/?p=62</guid>
		<description><![CDATA[The week before Christmas a friend of mine(Tshombe Brown) held a
teleconference with Bob Burg, co-author of, The Go-Giver.  I
found the conversation to be interesting enough that I got the book
and read it.
The Go-Giver is an allegory about a salesman named Joe who is trying to land a major contract in order to meet his [...]]]></description>
			<content:encoded><![CDATA[<p>The week before Christmas a friend of mine(Tshombe Brown) held a<br />
teleconference with Bob Burg, co-author of, <u>The Go-Giver</u>.  I<br />
found the conversation to be interesting enough that I got the book<br />
and read it.</p>
<p>The Go-Giver is an allegory about a salesman named Joe who is trying to land a major contract in order to meet his quota for that quarter. He hatches a plan to try and convince a well known business figure, the Chairman, to help him pull the big contract.  However, when he speaks with the Chairman, he finds himself going through a week long lesson on the subject of getting ahead.</p>
<p><span id="more-62"></span></p>
<p>Each day of the week is a theme about a law of Burg and John Mann&#8217;s approach.  The five laws are:</p>
<ol>
<li>The Law of Value</li>
<li>The Law of Compensation</li>
<li>The Law of Influence</li>
<li>The Law of Authenticity</li>
<li>The Law of Receptivity</li>
</ol>
<h2> My Take Away</h2>
<p>I found the most important part of the giver were the first two laws:</p>
<h3> The Law of Value</h3>
<p>&#8220;Your true worth is determined by how much more you give in value than<br />
take in payment.&#8221; </p>
<h3> The Law of Compensation</h3>
<p>&#8220;Your income is determined by how many people you serve and how well<br />
you serve them.&#8221;</p>
<h3> Why These Two</h3>
<p>These two are the golden nuggets in the book because they most directly<br />
reflect economic phenomena.  I belive Burg would argue that these<br />
aren&#8217;t intended to be viewed as tied solely bottom line, but rather<br />
that they are meant to be life philosophies.  However, I think they<br />
pack the punch they do, <em>because</em> they are linked to economics.</p>
<h3> Value and Price</h3>
<p>Value isn&#8217;t fixed.  When two parties engage in an exchange they both<br />
percieve that they are trading something they value for something else<br />
of greater value.  I value a new 21&#8243; flat screen display more than I value<br />
$240.  At the same time, I value $300 more than having a 23&#8243; display.</p>
<h4> There are a few implied corollaries with the first law:</h4>
<ul>
<li>Know your target market and what they </li>
<li>Know the difference between what they value and what you value.</li>
</ul>
<p>I think that if you could get an accurate read on these two, you could<br />
lower the value you provide to where it&#8217;s just above what they&#8217;re<br />
willing to offer.  I doubt Burg would endorse this approach and<br />
neither do I.  This has something to do with Burg and Mann&#8217;s second<br />
law.</p>
<h3> The Good of the Many</h3>
<p>Like all businesses, I want to have happy clients.  However, what<br />
would make me very wealthy would be to have Apple&#8217;s clients.  They<br />
don&#8217;t have customers in the normal sense of the word, they have<br />
missionaries that live the Apple lifestyle and continually seek to<br />
convert those who don&#8217;t.</p>
<p>Apple doesn&#8217;t just try to provide an edge in value for what the<br />
customer is willing to pay, they aim to provide an impressive user<br />
experience that is more than worth the cost.  They have seen their<br />
influence and market explode because of this and in turn their income<br />
has boomed.</p>
<h3> What About the Other Laws</h3>
<p>I don&#8217;t think the other laws are fluff, but to me, they seem to<br />
represent sound personal values more than laws that will have have a<br />
significant impact on a business.  I would say that the attitude of<br />
the allegory is karmic related and the final three laws act as a base<br />
for good karma.</p>
<h3> In Summary</h3>
<p>I&#8217;m excited to work the Go-Giver ideas into my business&#8217;s systems.  I<br />
enjoy serving people and the story has ignited many ideas about how I<br />
could improve my business&#8217;s services.</p>
]]></content:encoded>
			<wfw:commentRss>http://bluebridgedev.com/blog/freelancing/the-go-giver/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Grateful</title>
		<link>http://bluebridgedev.com/blog/on-freelancing/gratitude/</link>
		<comments>http://bluebridgedev.com/blog/on-freelancing/gratitude/#comments</comments>
		<pubDate>Fri, 18 Dec 2009 16:11:34 +0000</pubDate>
		<dc:creator>John</dc:creator>
				<category><![CDATA[On Freelancing]]></category>

		<guid isPermaLink="false">http://bluebridgedev.com/blog/?p=58</guid>
		<description><![CDATA[It&#8217;s almost 8:00 AM in Portland.  I&#8217;m sipping coffee and typing up a bid for a small project that someone in Las Vegas requested.  I happened to look out the window a few minutes ago and the sky is clear and light blue and pink.  I feel acutely grateful to be sitting [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s almost 8:00 AM in Portland.  I&#8217;m sipping coffee and typing up a bid for a small project that someone in Las Vegas requested.  I happened to look out the window a few minutes ago and the sky is clear and light blue and pink.  I feel acutely grateful to be sitting here in my bathrobe working.</p>
<p><span id="more-58"></span></p>
<p>When I left the Marines, I had to attend a class on re-entering the civilian work force.  Many of the speakers warned us that we may find that civilian life wasn&#8217;t all it was cracked up to be.  I knew then that some people couldn&#8217;t stand the lack of structure and direction that exists in the civilian world, much like prisoners who have grown used to the walls that confine them.</p>
<p>A few years later, I was getting up every morning and having to go to work at an entry level position for a design firm in Vancouver.  Going to work was easy, but I didn&#8217;t like the direction the firm was going and the direction I would be going within the organization.</p>
<p>Now I work for myself and I make my own structure and direction.  I measure the environment, forecast changes, set goals, make plans, and execute them.  It&#8217;s an opportunity and a blessing and I am grateful to be in this position.</p>
]]></content:encoded>
			<wfw:commentRss>http://bluebridgedev.com/blog/on-freelancing/gratitude/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Three Letters and A Semi-colon</title>
		<link>http://bluebridgedev.com/blog/general-development/three-letters-and-a-semi-colon/</link>
		<comments>http://bluebridgedev.com/blog/general-development/three-letters-and-a-semi-colon/#comments</comments>
		<pubDate>Sat, 12 Dec 2009 16:38:32 +0000</pubDate>
		<dc:creator>John</dc:creator>
				<category><![CDATA[General Development]]></category>

		<guid isPermaLink="false">http://bluebridgedev.com/blog/?p=52</guid>
		<description><![CDATA[Larry Wall wrote the three virtues of a programmer are laziness, impatience, and hubris.  I think I could pass for any of these.
The quote for virtues is a little tongue in cheek though, because it turns out that being lazy, impatient, and proud require copious amounts of diligence, patience, and care.
I&#8217;ve often seen a [...]]]></description>
			<content:encoded><![CDATA[<p>Larry Wall wrote the three virtues of a programmer are laziness, impatience, and hubris.  I think I could pass for any of these.</p>
<p>The quote for virtues is a little tongue in cheek though, because it turns out that being lazy, impatient, and proud require copious amounts of diligence, patience, and care.</p>
<p>I&#8217;ve often seen a much more serious quality sought in programmers: attention to detail.  Employers want this quality in the programmers they hire and most programmers probably find it to be an easy requirement.  It requires a certain kind of myopic perception.</p>
<p>When I was in the Marines, attention to detail was also prized.  During my four years I suffered several large errors that were caused by inattention to detail.  They were whoppers for an infantry man, the kind that most grunts only made once.  I made the errors from E1 all the way to E5.  What they were was that I kept losing track of gear: bayonets, helmets, flak jackets, night vision goggles, and radios.  I would be doing something and then realize, &#8220;Wait a sec, where the hell is my X?!!!&#8221;</p>
<p><span id="more-52"></span></p>
<p>These situations always caused me intense panic and were a major emotional drain.   They had zero impact on my ability to track details.</p>
<p>In the past two weeks I&#8217;ve probably sunk 14 hours into problem solving.  I&#8217;d come to a point where I&#8217;d say, &#8220;I don&#8217;t understand this language as well as I thought I did&#8211; this phenomena doesn&#8217;t make any sense.&#8221;  Then I&#8217;d find my detail.</p>
<p>The first six hours or so, I neglected to properly initialize a javascript variable with, &#8220;var.&#8221;  It was causing semi-random behavior that makes perfect sense in retrospect.  Yesterday and the day before I put eight hours into troubleshooting another seemingly random situation.</p>
<p>I was processing a WordPress database as text and whenever I tried to re-import it programatically, it would build the structure, but fail to populate the tables.  If I took the *exact* same code and fed it to PHPMyAdmin, it would successfully re-import the database.</p>
<p>First, I was convinced that I was somehow using the wrong PDO function (query, exec, or statement execute).  Then I decided that the str_ireplace function I was using could only handle a certain size of variable(other string functions had the same problem though).  Then I figured maybe it was all the white space I had injected into the database export for readibilty, but this had no impact.  Then I thought that maybe there was some encoding issue, and that by saving it to file, or at least &#8220;washing&#8221; it through an output buffer would solve the problem.  None of this mumbo jumbo worked and finally I started using a diff tool to comb through the differences between the before<br />
processing and after processing database imports.  I found nothing that would cause a problem.</p>
<p>As my eyes glazed over after staring at two files side by side for an hour, I scrolled through them from top to bottom.  I was considering taking a whole different tact to processing the database when my eye came to rest on my problem: <strong>an extra semi-colon among 753,043 other characters</strong>.  One of the tables I was processing was empty and my code terminated each table import statement with a semi-colon.  The statement before it got two semi-colons then, instead of one, which caused the rest of the imports to fail.  PHPMyAdmin&#8217;s sql parser probably was smart enough to remove the extra semi-colon (good programming&#8211; hard to break).</p>
<p>I realized in the Marines that I couldn&#8217;t just be detail oriented. Faced with daily challenges though, I couldn&#8217;t afford to not be detail oriented  either.  What I learned was systems and principles.  For my gear, it was something called, &#8220;Dummy Cord.&#8221;  You tie everything to you, then no  matter what happens, you don&#8217;t leave anything behind. New Marines are forced to dummy cord everything&#8211; I religiously dummy corded gear to me until the day I left the service, because every time I didn&#8217;t I lost something.</p>
<p>The system was dummy cord and the principle was, &#8220;<em>If you don&#8217;t tie it to you, you&#8217;re going to lose it.</em>&#8221;</p>
<p>For Javascript I have a new principle, &#8220;If the behavior of composite components is weird higher up the DOM, check for uninitialized variables in the lower components.&#8221;</p>
<p>For debugging in general, I have a new system/principle, &#8220;List your assumptions.&#8221;  In this case, I assumed that the export data was correct, because I assumed that every table had data to dump.  Also, &#8220;Go from more likely to more wild.&#8221;  As in, it&#8217;s more likely that my import statement is messed up than there being a significant difference between executing a query with execute() or with exec().</p>
]]></content:encoded>
			<wfw:commentRss>http://bluebridgedev.com/blog/general-development/three-letters-and-a-semi-colon/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Validation Interface – Part II</title>
		<link>http://bluebridgedev.com/blog/uncategorized/the-validation-interface-part-ii/</link>
		<comments>http://bluebridgedev.com/blog/uncategorized/the-validation-interface-part-ii/#comments</comments>
		<pubDate>Wed, 09 Dec 2009 01:11:32 +0000</pubDate>
		<dc:creator>John</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://bluebridgedev.com/blog/?p=38</guid>
		<description><![CDATA[This is coming about a week later than I had originally planned.  I got my new website design in and had to focus on that to make sure I was getting my marketing message correct and out there.
So this afternoon I sat down and used a UML Modeling program to model up the validation interface. [...]]]></description>
			<content:encoded><![CDATA[<p>This is coming about a week later than I had originally planned.  I got my new website design in and had to focus on that to make sure I was getting my marketing message correct and out there.</p>
<p>So this afternoon I sat down and used a UML Modeling program to model up the validation interface.  It took me about an hour, and everything was done, but just for clarity, I decided to mark down the multiplicity of some of the relationships.  The second relationship I marked the program crashed; <em>I hadn&#8217;t saved my diagram</em>.  A rookie mistake!</p>
<p><span id="more-38"></span></p>
<p>I&#8217;m not going to rebuild the diagram.  Instead, I&#8217;m just going to describe the structure of the Validation package:</p>
<ul>
<li>The Validation Interface works like this:<br />
<code><br />
...<br />
$validator = new ValidationFacade;<br />
$validator-&gt;addValidator(new GruntValidator(new emailSpec("email"), "That's not an email, please double check it.")));<br />
$validator-&gt;addValidator(new GruntValidator(new alNumSpec("username"), "Your username can only be letters and numbers.")));<br />
$validator-&gt;addValidator(new GruntValidator(new urlSpec("url"), "Please check your home page, that's not a valid url.")));<br />
$validator-&gt;validate();<br />
$clean =&amp; $validator-&gt;getCleanRequest();<br />
if(!$clean){<br />
$this-&gt;_processErrors($validator-&gt;getErrors());<br />
}<br />
...<br />
</code></li>
<li>The ValidationFacade class acts as a  facade to make the subset of interfaces and classes simple to use.  It&#8217;s composed of a ValidationCoordinator object and an array of GruntValidators.  It also depends on two classes that represent the HTTP Request: RawRequest and CleanRequest.</li>
<li> In the code snippet above, you can see how the validators are added to the facade.  Behind the scenes, the facade creates a ValidationCoordinator with a RawRequest object and a CleanRequest object when you call the validate() method.</li>
<li>The GruntValidator object is just a dumb worker.  You give it a tool, it performs a task with the tool, and it returns the result.  To make this possible, it depends upon an interface used to define how it can interact with it&#8217;s tool.  In this case, the tool is a test or rule. (emailSpec, alNumSpec, urlSpec)</li>
<li>The rule follows a pattern called specification.  Specification tests whether something meets a given criteria(hence why I called it a rule a moment ago).   In the code files I&#8217;m going to attach, the interface is implied, but each specification object uses the same methods to apply different tests.  In the code above, those tests are an email test, an alpha-numeric test, and a url test.</li>
<li>On validator-&gt;validate(), the ValidationFacade calls each GruntValidator and it passes them the same ValidationCoordinator object.  Each GruntValidator, calls the test method from the specification object it was given when created on the <em>ValidationCoordinator. </em>In this case, the intent isn&#8217;t to test the coordinator, just give it to its specification object.</li>
<li>This is where the magic happens.  The specification object, asks the coordinator for the fieldname it needs.  The coordinator grabs the fieldname from the RawRequest object and gives it to the spec object.  The spec object tests the field and reports whether it passed the test or not to the GruntValidator.  If it passed, the GruntValidator tells the coordinator to add it to it&#8217;s CleanRequest object.  If it failed, the GruntValidator gives the coordinator its error message and tells it to add it to its errors list.</li>
<li>When all of the validators have been validated, the facade checks the coordinator for errors.  If there are errors, it can&#8217;t get a CleanRequest object, if there aren&#8217;t errors it can.</li>
</ul>
<p>This definitely isn&#8217;t the simplest way to validate a $_POST or $_GET array.  However, it does have it&#8217;s benefits.  It cleanly separates the processing from the view logic, it ensures that all values are validated and nothing can slip through (the RawRequest object destroys the globals when it is initialized), it&#8217;s easy to use and extend (OCP, SRP, and DIP), and it&#8217;s mobile and so I can benefit from it&#8217;s OOP nature instead of writing and re-writing validation when needed.</p>
<p>The authors of PHP in Action, leave a couple interesting ending points, that I may explore.  They suggest turning it into a fluid interface and also discuss possible methods to remove duplication between client and server side code (this would involve coming up with a set process, which is a-okay for me).</p>
<p>The classes:  <a href="/files/Validation.tar.bz2">Validation.tar.bz2</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bluebridgedev.com/blog/uncategorized/the-validation-interface-part-ii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Support Business Model Challenge</title>
		<link>http://bluebridgedev.com/blog/freelancing/problems-with-support/</link>
		<comments>http://bluebridgedev.com/blog/freelancing/problems-with-support/#comments</comments>
		<pubDate>Thu, 26 Nov 2009 01:55:36 +0000</pubDate>
		<dc:creator>John</dc:creator>
				<category><![CDATA[Business Strategy]]></category>

		<guid isPermaLink="false">http://bluebridgedev.com/blog/?p=15</guid>
		<description><![CDATA[George Bernard Shaw, &#8220;Few people think more than two or three times a year; I have made an international reputation for myself by thinking once or twice a week.&#8221;
I&#8217;m going through an interesting phase with my business.  I did some navel gazing back in August and realized that client interaction takes up most of my [...]]]></description>
			<content:encoded><![CDATA[<p><em>George Bernard Shaw, &#8220;Few people think more than two or three times a year; I have made an international reputation for myself by thinking once or twice a week.&#8221;</em></p>
<p>I&#8217;m going through an interesting phase with my business.  I did some navel gazing back in August and realized that client interaction takes up most of my time and doesn&#8217;t contribute nearly as much to my earnings.  I&#8217;m good at relationships, however just because you&#8217;re good at something doesn&#8217;t mean that you should devote more time to it than other activities (like billable work).</p>
<p>I figured out that to decrease my time working and increase my earnings I had to either try to focus on a few clients with larger budgets or get out of the client service business altogether and start writing software.  I decided to do both.<span id="more-15"></span></p>
<p>My first step was towards limiting support.  I stopped providing any type of services resembling it to my current clients&#8211; this was the bulk of my client interaction and generated lots of small transactions over the course of a month, but took up most of my time because each request generated communication overhead that was nearly equal to the work itself.</p>
<p>Here is what it looked like:</p>
<p><strong>Small transactions</strong></p>
<p>1 hour communicating/planning + 1 hour work = 1:1 ratio.</p>
<p>Communication <em>is </em>being billed, but three to four support requests at irregular times throughout the week slowed down and broke my focus on other projects.  In addition, these small support projects always occured as emergencies.  I considered charging an overnight rate, but realized that by adding another layer to my pricing I would incur upkeep in managing it, thereby adding to my time invested every time it occurred.</p>
<p>I decided what I wanted was the following:</p>
<p><strong> Larger transactions</strong></p>
<p>5 hours communicating/planning + 30 hours  = 1:6 ratio.</p>
<p>Under this system, I only need a project a week and my work flow is greatly improved.  These types of projects don&#8217;t occur as emergencies (like <em>*all*</em> small support tasks) and contribute greater hours to my bottom line.  In addition,  they&#8217;re easier to anticipate and don&#8217;t interrupt other projects, which increases efficiency and the quality of my work by allowing me to maintain  focus.</p>
<p>I think it&#8217;s clear that dropping support and trying to focus on larger projects is a benefit to me and the direction I would like to go with my business.  I think it also offers clear benefits to potential clients who want programming done or a complex site created.</p>
<p>However, I&#8217;m having to re-think this strategy.</p>
<p><em>The challenge I&#8217;m seeing is that some of the clients who are interested in the larger projects also want support.  They don&#8217;t just want someone to build it, they also want someone to take care of them once the project is done. </em> I want a long term relationship also, just one that is project &#8212; not support &#8212; based.  What I&#8217;m trying to achieve is a lasting series of one night stands and what many clients are looking for is a marriage and babies.</p>
<p>Web agencies do that.  They have their veterans building and their apprentices supporting.  Generally speaking, support doesn&#8217;t require the smarts that building does and it&#8217;s a great way for growing developers to learn.  The vets earn their higher pay by taking on the more challenging jobs and everything occurs hidden under the agency&#8217;s banner.</p>
<p>Growing into an agency is not a part of my business plan and not an option.  An alternative that has come up frequently, is that it would behoove me and the people I partner with to form some sort of collective that could offer agency-like solutions.  That way, I could say, &#8220;I&#8217;ll build it and this partner will support it.&#8221;  The benefits to my clients of such an association would be best weighed in another post, but I know that several of the other web professionals I work with have brought up the same idea for differing reasons.</p>
<p>Another additional idea I have is to re-offer support, but on a package basis; it would be something semi-expensive like $400 per month, whether or not they use the hours their reserving for support.  The benefit of this would be that it would demonstrate the value of my time and change the perception to that I do offer support&#8211; just that it&#8217;s expensive.  As a bonus, this probably is comparable to many agency support packages.</p>
]]></content:encoded>
			<wfw:commentRss>http://bluebridgedev.com/blog/freelancing/problems-with-support/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Validation Interface — Part 1</title>
		<link>http://bluebridgedev.com/blog/php/validating-input/</link>
		<comments>http://bluebridgedev.com/blog/php/validating-input/#comments</comments>
		<pubDate>Wed, 25 Nov 2009 02:05:10 +0000</pubDate>
		<dc:creator>John</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://bluebridgedev.com/blog/?p=12</guid>
		<description><![CDATA[I&#8217;ve been reading PHP in Action since June.  I started reading it on Safari Online, and eventually bought it because I&#8217;ve found it to be exactly what I was looking for&#8211; namely a guide to stepping up my PHP development to the next level.  The authors cover good design principles, patterns, test-driven development, and common [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been reading PHP in Action since June.  I started reading it on Safari Online, and eventually bought it because I&#8217;ve found it to be exactly what I was looking for&#8211; namely a guide to stepping up my PHP development to the next level.  The authors cover good design principles, patterns, test-driven development, and common problems and solutions.</p>
<p>A challenge that I&#8217;m currently interested in is input validation.  To date, I&#8217;ve been writing input validation as methods of classes that needed it.  Doing it that way doesn&#8217;t help me in the long term, because I can&#8217;t gain from code reuse.  It also doesn&#8217;t conform to good design practices because validation is, &#8220;the concept that varies.&#8221;  Fortunately, PHP in Action has an entire chapter dedicated to developing a logical framework for input validation.  As a bonus, it covers the Specification and Facade patterns.  Unfortunately, the authors don&#8217;t make any recommendations for the actual validation rules.  I will have to fill those in on my own.</p>
<p>My plan is to create the classes tomorrow and Thursday(Turkey Day) and post them here along with an explanation of how they interact this weekend.</p>
]]></content:encoded>
			<wfw:commentRss>http://bluebridgedev.com/blog/php/validating-input/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A Beginning</title>
		<link>http://bluebridgedev.com/blog/professional-development/beginning/</link>
		<comments>http://bluebridgedev.com/blog/professional-development/beginning/#comments</comments>
		<pubDate>Mon, 23 Nov 2009 23:49:31 +0000</pubDate>
		<dc:creator>John</dc:creator>
				<category><![CDATA[Professional Development]]></category>

		<guid isPermaLink="false">http://bluebridgedev.com/blog/?p=1</guid>
		<description><![CDATA[I&#8217;m blogging once more.
This is my third time around the blogging bush.  The first time I was
blogging about Linux and the second I was writing about small
businesses and web related technologies.  I enjoy writing, so blogging
is a natural fit, but both times I was typing to an external pressure
(trying to tap into a [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m blogging once more.</p>
<p>This is my third time around the blogging bush.  The first time I was<br />
blogging about Linux and the second I was writing about small<br />
businesses and web related technologies.  I enjoy writing, so blogging<br />
is a natural fit, but both times I was typing to an external pressure<br />
(trying to tap into a growing user group and developing my &#8220;expert<br />
status&#8221; for business reasons).</p>
<p>Fortunately, I&#8217;m putting all that behind me.  I&#8217;ve read advice to the<br />
effect that a developer should develop software to solve their own<br />
problems.  In a similar vein, I&#8217;ve decided to engage in purely<br />
ego-centric writing.  That doesn&#8217;t mean that I plan on writing about<br />
whatever happens to interest me at the moment, just that I will write<br />
more in the vein of journaling my experiences rather than trying to<br />
create value for potential readers.</p>
<p>So if I&#8217;m not writing about the fuzz in my navel and what I had for<br />
lunch today, what do I plan on journaling?<strong> This blog will serve to<br />
chronicle my experiences and thoughts as a freelance web developer</strong>.<span id="more-1"></span></p>
<p>What has inspired me to do this has been a series of synchronicities<br />
on blogging for personal development and the lack of information I&#8217;ve<br />
found on freelancing as a web developer.  The latter is a problem that<br />
has vexed me for some time.</p>
<p>There are two sides to what I do professionally: craftsmanship and<br />
business management.  I formed Blue Bridge a year and a half ago and<br />
since then I haven&#8217;t encountered any other individual who is doing the<br />
same thing.  I&#8217;ve met loads of freelance web designers (and a few of<br />
them even dabbled some in development), but only two coders.  Both of<br />
the coders were semi-employed and made most of their income off of one<br />
client.  One of the developers actually works on site for his client<br />
and still does some work on the side.  So in a sense, neither<br />
developer counts.</p>
<p>Most of the content I&#8217;ve found online caters to this skew of<br />
demographics.  It&#8217;s fairly straightforward to find information on<br />
freelancing as a web designer and if you&#8217;re in another web related<br />
trade, like a virtual assistant, much of the advice and information<br />
will carry over.</p>
<p>Web development is different.  It covers a broader range of<br />
possibilities and skills.  For example, with web design you focus on<br />
developing your graphic design skills and your HTML and CSS.  If you<br />
have somewhat of a technological bent, you might invest in learning a<br />
little Javascript or JQuery or figuring out how to theme designs for<br />
Wordpress.</p>
<p>As a freelance developer you have to choose a set of languages to work<br />
in that will directly impact what projects you can take on.  They have<br />
to be cohesive with each other, relevant to a market, and have a<br />
future on the web.  Finding that set is no easy task.  When I started<br />
out I almost chose Coldfusion over PHP as my server side focus.  If I<br />
had followed that path, freelancing as a developer probably wouldn&#8217;t<br />
be an option because Coldfusion doesn&#8217;t have close to the ubiquity<br />
that PHP does.</p>
<p>In addition to programming languages, you have to have a good<br />
understanding of popular web platforms and how to work on and with<br />
them (Wordpress, Joomla, Drupal, Magento, Zencart, and etc. and etc.)<br />
You also have to have to know web servers, relational databases, and<br />
security threats.  Being that the web is so text-centric it doesn&#8217;t<br />
hurt to have working knowledge of regular expressions either(a small<br />
language in its own right).</p>
<p>Rapid application development through the use of a framework is<br />
quickly getting to be an essential element of the developer toolbox:<br />
which means a developer needs competence in CakePHP, CodeIgniter, the<br />
Zend Framework or one of the others.  They might as well match their<br />
server side framework with a client side one: JQuery, Prototype,<br />
Mootools, Dojo, and etc; because their clients are going to want Ajax<br />
or animation at some point.</p>
<p>Finally, you also need to have competence in the tools you use to get<br />
work done.  That means an IDE or an editor, a version control system,<br />
unit and web testing tools, and whatever else a project may demand<br />
(automating builds, etc).  These all come down to additional choices:<br />
Eclipse, Net Beans, Notepad++, Aptana Studio, Subversion, Git, CVS,<br />
Phing, and more.</p>
<p>As you can see, web development is complex in itself.  If you&#8217;re lucky<br />
you spend time in some sort of incubation where you develop a<br />
specialized set of skills, a reputation, and a network to feed you<br />
work.  You find yourself moonlighting and then think, &#8220;Why don&#8217;t I<br />
just quit and work for myself?&#8221;</p>
<p><em>That&#8217;s not how I did it&#8211; I did the opposite.</em> I thought, &#8220;Why work<br />
for someone else when I could be driving this thing?&#8221;</p>
<p>I think that the reason there are so few freelance developers to their<br />
design counterparts is because of the common personality traits in<br />
developers.  I&#8217;ve no hard evidence to back this assertion up, but I<br />
would generalize that developers commonly need organizations to<br />
support them (and their development interests) and don&#8217;t like the risk<br />
and uncertainty of freelancing.  They may strike out on their own, but<br />
they soon return to the fold of the same or another organization.</p>
<p><em>The lack of freelance developers out there leads to a lack of<br />
information for and about those developers</em> which leads us to my<br />
predicament:  I&#8217;m making this up as I go along.</p>
<p>Because I choose to continue as a freelancer and have no desire to<br />
integrate into an organization, I have to make my own calls.  I have<br />
to balance my business&#8217;s needs along with the needs of the business<br />
for me to grow as a developer.  I&#8217;m continually faced with strategic<br />
decisions and have no basis on which to make decisions expect my<br />
limited previous experiences.  I&#8217;m sure that there are others out<br />
there in similar situations, just I&#8217;ve yet to encounter them or<br />
benefit from their experience.</p>
<p>The information available on web design freelancing is of limited<br />
help, because it doesn&#8217;t cover the complexity of development work.<br />
For example, one of the questions I&#8217;m focusing on right now is how I<br />
should structure my pricing.</p>
<p>To date, I&#8217;ve had a very designer-like approach.  I submit bids based<br />
upon an hourly projection.  This has worked okay because much of the<br />
work I&#8217;ve taken on has been neatly confined to a website package.<br />
That is to say that the projects have revolved around a website&#8217;s<br />
development from a designer or project manager&#8217;s concept to a live<br />
site.  However, where I want my business to go is primarily to<br />
programming.  For that type of work it is much less likely that a<br />
project will be neatly wrapped in a familiar site-like package.  Due<br />
to this, it may not be appropriate to work based on a bid.  The means<br />
to program solutions may actually work against a bid based approach<br />
and I might be limiting my profits and the benefit of my work to my<br />
clients by working according to a price model that doesn&#8217;t fit.</p>
<p>Whether that&#8217;s the case or not, I have no idea.  However, I plan on<br />
exploring and answering this type of question through blogging.  I<br />
already drive my professional advancement through reading and<br />
experimentation and now I will document take the time to document what<br />
I&#8217;m learning.</p>
]]></content:encoded>
			<wfw:commentRss>http://bluebridgedev.com/blog/professional-development/beginning/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

