<?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:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>Fixed In The Next Release</title>
    <link>http://www.fitnr.com/</link>
    <description>Thoughts on software development, software teams, and
      entrepreneurship.</description>
    <language>en-us</language>
    <copyright>Copyright 2008 Louis R. Marascio. Some Rights Reserved.
      This work is licensed under a Creative Commons Attribution-Share
      Alike 3.0 United States License.</copyright>
    <lastBuildDate>Sun, 15 Mar 2009 10:37:14 -0500</lastBuildDate> 
    <docs>http://cyber.law.harvard.edu/rss/rss.html</docs>
    <webMaster>webmaster@fitnr.com (Louis R. Marascio)</webMaster>
    <ttl>5</ttl>

    
    <geo:lat>30.287739</geo:lat><geo:long>-97.802203</geo:long><creativeCommons:license>http://creativecommons.org/licenses/by-sa/3.0/</creativeCommons:license><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/FixedInTheNextRelease" type="application/rss+xml" /><feedburner:emailServiceId>FixedInTheNextRelease</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
      <title>Teacher Retirement System of Texas Takes it on the Chin</title>
      <pubDate>Sun, 15 Mar 2009 10:37:14 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/FixedInTheNextRelease/~3/xyDeOBNMC5c/trs-trust-fund-implosion.html</link>
      <guid isPermaLink="false">http://www.fitnr.com/archives/2009/03/trs-trust-fund-implosion.html</guid>
      <author>louis@fitnr.com (Louis Marascio)</author>
      <description>&lt;p&gt;According to the &lt;a href="http://www.statesman.com/news/content/news/stories/local/03/14/0314trs.html"&gt;Austin American
          Statesman&lt;/a&gt;,
             in the past six months the Teacher Retirement System of Texas has lost
             $34 billion representing a decline in value of about one third.  From
             the article:
          &lt;/p&gt;
          &lt;blockquote&gt;&lt;p&gt;The Teacher Retirement System of Texas trust fund lost more than $34
             billion in the past six months - a drop in market value of about
             one-third, according to an actuarial report released Friday.
          &lt;/p&gt;
          &lt;p&gt;The system, one of the largest public pension funds in the world, now
             has only 68 cents for every dollar that it needs to cover promised
             benefits to its 1.2 million members over the long term; in August, that
             number was 90.5 cents.
          &lt;/p&gt;
          &lt;p&gt;The financial markets fell 40 percent overall during that same time
             period. 
          &lt;/p&gt;
          &lt;/blockquote&gt;&lt;p&gt;Sure they like everyone else lost money, big surprise. What sort of
             perplexes me is that in search of a nominal 8% return (as indicated by
             the article), they were actually taking on enormous risk. Heck, I
             wouldn&amp;#8217;t even be surprised if the TRS investment committee members were
             proud of themselves for beating the market&amp;#8212;after all, they only lost
             33% while the overall market dropped 40%.This isn&amp;#8217;t unique to TRS, it&amp;#8217;s
             more of a broad misunderstanding of the risks involved when making what
             are, essentially, &amp;#8220;long the economy&amp;#8221; investments. 
          &lt;/p&gt;
          &lt;p&gt;I first heard that term while listening to a very successful investor,
             Salem Abraham, talk about his &lt;a href="http://www.abrahamtrading.com/"&gt;fund&lt;/a&gt;.
             Many really great investors have long been overlooked because they took
             a different approach than blind faith in the ever increasing equity
             markets. Usually the argument against investors like Abraham would have
             been based on the fact that they traded futures.  Simply because the
             futures markets allow one to more easily shoot themselves doesn&amp;#8217;t mean
             that talented folks like Abraham should be dismissed. After all, if you
             now look at their risk adjusted return compared to the S&amp;amp;P, it&amp;#8217;s
             actually &lt;em&gt;better&lt;/em&gt;.
          &lt;/p&gt;
          &lt;p&gt;If there is one good thing that I would love to see come out of the
             recent market turmoil, it would be that the equity markets are just as
             risky, over the long term, as other &amp;#8220;alternative&amp;#8221; investments like
             managed futures. Knowing this, investors should seek out diversification
             between asset classes.  And this means more than just an equity/bond
             portfolio.
          &lt;/p&gt;
          &lt;p&gt;As a final note, you should go watch Elizabeth Cheval&amp;#8217;s &lt;a href="http://www.emccta.com/correlation/"&gt;presentation on
          correlation&lt;/a&gt; and why you should be
             looking for negative correlation in your diversification. If you watch
             it, it&amp;#8217;ll open your eyes. Or, you might simply dismiss it, and wait for
             the next market implosion.
          &lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/FixedInTheNextRelease?a=xyDeOBNMC5c:dX4-lfHeows:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FixedInTheNextRelease?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FixedInTheNextRelease?a=xyDeOBNMC5c:dX4-lfHeows:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FixedInTheNextRelease?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FixedInTheNextRelease/~4/xyDeOBNMC5c" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://www.fitnr.com/archives/2009/03/trs-trust-fund-implosion.html</feedburner:origLink></item>
    
    <item>
      <title>Onwards and Upwards: Goodbye Cisco, Hello TBD</title>
      <pubDate>Thu, 01 Jan 2009 10:56:58 -0600</pubDate>
      <link>http://feedproxy.google.com/~r/FixedInTheNextRelease/~3/aLaSyHJpXm4/onwards-and-upwards.html</link>
      <guid isPermaLink="false">http://www.fitnr.com/archives/2009/01/onwards-and-upwards.html</guid>
      <author>louis@fitnr.com (Louis Marascio)</author>
      <description>&lt;p&gt;The time has come: yesterday, December 31 2008, was my last day at
             Cisco. In my mind, my tenure at Cisco was about completing what we
             started eight years ago with Metreos. Cisco purchased Metreos after we
             had been operating for 5 &amp;frac12; years as an independent company and
             for 2 &amp;frac12; years I worked to help Cisco execute on the vision that
             building enterprise telephony applications and integrating them with
             business processes shouldn&amp;#8217;t be painful. I&amp;#8217;d like to think that we were
             successful in that venture.
          &lt;/p&gt;
          &lt;p&gt;Now that I have closed the final chapter of the Metreos (epic) novel
             it&amp;#8217;s time to write a new one. I&amp;#8217;m an entrepreneur and I&amp;#8217;m certain a new
             idea, product, and company are what&amp;#8217;s next for me. Stay tuned to see
             what happens.
          &lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/FixedInTheNextRelease?a=aLaSyHJpXm4:Gt0WsjnHHnE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FixedInTheNextRelease?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FixedInTheNextRelease?a=aLaSyHJpXm4:Gt0WsjnHHnE:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FixedInTheNextRelease?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FixedInTheNextRelease/~4/aLaSyHJpXm4" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://www.fitnr.com/archives/2009/01/onwards-and-upwards.html</feedburner:origLink></item>
    
    <item>
      <title>That's a Dilly of a Pickle</title>
      <pubDate>Fri, 26 Sep 2008 14:18:39 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/FixedInTheNextRelease/~3/n0PViVhEGEE/thats-a-dilly-of-a-pickle.html</link>
      <guid isPermaLink="false">http://www.fitnr.com/archives/2008/09/thats-a-dilly-of-a-pickle.html</guid>
      <author>louis@fitnr.com (Louis Marascio)</author>
      <description>&lt;p&gt;We&amp;#8217;ve all had that moment. You know the feeling, your stomach falls out
             from under you, your legs go a bit wobbly, or your gut climbs into your
             throat. It&amp;#8217;s an &amp;#8220;Oh Shit&amp;#8221; moment.
          &lt;/p&gt;
          &lt;p&gt;Lot&amp;#8217;s of times this happens under relatively benign circumstances. Maybe
             during a test cycle you realize you forgot some fundamental feature or
             missed a major requirement. No big deal: just adapt and overcome.
             However, there are times when those moments are particularly scary.
          &lt;/p&gt;
          &lt;p&gt;Building software, especially software that has to integrate with other
             systems, should always breed a healthy dose of skepticism when
             diagnosing root cause. What I mean is, there is always a feeling that
             the problem might not be your own, but in reality, you must always
             assume that your software is creating the problem, even if it isn&amp;#8217;t
             convenient. Doing otherwise is trying to operate outside of your own
             sphere of influence: you have no control over the software you integrate
             with, therefore it is typically a &lt;a href="http://en.wikipedia.org/wiki/Sisyphus"&gt;sisyphean
          task&lt;/a&gt; to start there in trying to
             resolve a problem.
          &lt;/p&gt;
          &lt;p&gt;In the many years that I have been building the Metreos/Cisco product
             that I work on today I have found bugs in other people&amp;#8217;s software a mere
             fraction of the time when compared to my own. It is almost always my
             fault. I&amp;#8217;ve also seen, over and over again, other engineers (some young,
             some old, I don&amp;#8217;t think it is related to your experience level) jump to
             the immediate conclusion that &amp;#8220;it must be xyz in abc&amp;#8217;s product&amp;#8221; thinking
             to themselves &amp;#8220;there&amp;#8217;s no way it could be us&amp;#8221;. This is a horrible way to
             approach problem resolution and root cause identification.
          &lt;/p&gt;
          &lt;p&gt;Those really nasty problems almost always happen under the umbrella of a
             customer found problem. So, coupled with the fact that you&amp;#8217;re already
             facing an &amp;#8220;Oh Shit&amp;#8221; moment you also have the added stress of knowing
             that the customer is expecting updates, information, and a fix as soon
             as possible. An engineer who worked for Metreos&amp;#8217; first customer, and now
             a good friend, always had something funny to say in these situations:
          &lt;/p&gt;
          &lt;blockquote&gt;&lt;p&gt;That&amp;#8217;s a dilly of a pickle you&amp;#8217;ve got there.
          &lt;/p&gt;
          &lt;/blockquote&gt;&lt;p&gt;That always made me laugh, but I think the thing that I appreciated
             about the relationship we had was that he always afforded us the space
             to work the issue in a logical, diligent, and direct manner. Getting
             yourself out of hairy spots is much easier when the customer is not
             being difficult.
          &lt;/p&gt;
          &lt;p&gt;So, needless to say, I&amp;#8217;ve faced my fair share of pickles over the years.
             I&amp;#8217;ve built up a pretty standard method of analyzing and diagnosing the
             root cause of the problem. What surprises me is how people try to debug
             these complicated systems without such an approach. Much of the time you
             see engineers tossing darts in the dark, hoping to find a solution. The
             funny thing is, and I&amp;#8217;ve seen this first hand as well, is that they
             might toss one of those darts and see the problem fixed. Unfortunately,
             without understanding the root cause they never really know whether the
             &lt;em&gt;real&lt;/em&gt; problem is fixed or whether they&amp;#8217;ve simply treated the symptom.
          &lt;/p&gt;
          &lt;p&gt;Here&amp;#8217;s how I typically approach things:
          &lt;/p&gt;
          &lt;ol&gt;
           &lt;li&gt;&lt;p&gt;Ensure the problem has been reported properly and is being tracked
                according to your process. &lt;em&gt;If the problem isn&amp;#8217;t being tracked you&amp;#8217;re
             doing the customer a disservice. Make sure it&amp;#8217;s logged, has a
             tracking number, and is visible on whatever process dashboard you
             might have.&lt;/em&gt;
          &lt;/p&gt;
          
           &lt;/li&gt;
          
           &lt;li&gt;&lt;p&gt;Confirm your understanding of the problem and formulate a set of
                plausible causes, if possible. &lt;em&gt;It&amp;#8217;s sort of amazing how many times
             you&amp;#8217;re initial understanding of the problem is adjacent to the
             actual experience the customer is having. Take the time to reconfirm,
             in painful detail, what&amp;#8217;s happening and what&amp;#8217;s expected to happen.&lt;/em&gt;
          &lt;/p&gt;
          
           &lt;/li&gt;
          
           &lt;li&gt;&lt;p&gt;Analyze available data. If no data is available, ask for data that
                might already be available by the customer. For example, your
                standard set of logs that might be turned on in production. &lt;em&gt;Data is
             critical. Without the data it&amp;#8217;s impossible to create a sound
             hypothesis or confirm environmental events. Many times, people don&amp;#8217;t
             get the data needed because they have some aversion to asking the
             customer to do work in helping diagnose the situation. If you need
             the customer to gather network traces from a specific port on a
             specific switch, tell them so they can do it and get you what you
             need.&lt;/em&gt;
          &lt;/p&gt;
          
           &lt;/li&gt;
          
           &lt;li&gt;&lt;p&gt;Define a decision tree to isolate root cause. You may choose a
                positive (rule in) or negative (rule out) approach. Typically the
                approach you choose is based on your confidence level in plausible
                root causes you&amp;#8217;ve identified. &lt;em&gt;Much of the time, this is less formal
             than it sounds and is driven from gut feel. If X happens then there
             is no way the problem is A, but if we see Y then it might be B, etc.
             The set of possible scenarios and ways those scenarios might be
             confirmed or refuted is critical because it will push you in a
             specific direction and tell you where you need to instrument your
             system or what data you might need to gather.&lt;/em&gt;
          &lt;/p&gt;
          
           &lt;/li&gt;
          
           &lt;li&gt;&lt;p&gt;Gather additional data required to walk your decision tree. &lt;em&gt;Again,
             don&amp;#8217;t be afraid of asking your customer to do work here. They will
             respect you for taking a disciplined approach to solving their
             problem.&lt;/em&gt;
          &lt;/p&gt;
          
           &lt;/li&gt;
          
           &lt;li&gt;&lt;p&gt;If you have reached a conclusion based on the decision tree and
                gathered data, then you have isolated a plausible root cause.
                Otherwise, go to step 3 and repeat. If you believe you have
                misunderstood the problem or are no longer able to formulate a
                decision matrix, go to step 2 and ensure you are not in the weeds.
                &lt;em&gt;You should end up in a situation that the data has shown you where
             the problem is, and you are able to confirm the fix works by turning
             it on or turning it off. Not all problems are as cut and dry, but
             many are.&lt;/em&gt;
          &lt;/p&gt;
          
           &lt;/li&gt;
          &lt;/ol&gt;
          &lt;p&gt;Customers respect this approach. In fact, you can make customers love
             you for following a disciplined, data driven problem solving approach
             like the one above. A couple of words of wisdom (yes, I said wisdom,
             does that make me full of myself?):
          &lt;/p&gt;
          &lt;ol&gt;
           &lt;li&gt;&lt;p&gt;Make sure they know that you&amp;#8217;re in control and are on top of the
                problem. 
          &lt;/p&gt;
          
           &lt;/li&gt;
          
           &lt;li&gt;&lt;p&gt;Make sure they know what the next steps are.
          &lt;/p&gt;
          
           &lt;/li&gt;
          
           &lt;li&gt;&lt;p&gt;Don&amp;#8217;t be afraid of telling them bad news. 
          &lt;/p&gt;
          
           &lt;/li&gt;
          
           &lt;li&gt;&lt;p&gt;Be honest, clear, and direct with the customer. 
          &lt;/p&gt;
          
           &lt;/li&gt;
          &lt;/ol&gt;
          &lt;p&gt;There is nothing worse than a waffling, weak engineer on the other end
             of the line when a major customer problem is in progress.
          &lt;/p&gt;
          &lt;p&gt;We had no choice but to follow an approach like this at Metreos, and now
             at Cisco. The system that we have to diagnose is huge, and problems can
             be caused by everything from a faulty network element to bad software.
          &lt;/p&gt;
          &lt;p&gt;Perhaps the nastiest issue that we had at Metreos was one that was
             caused by a firewall that would behave differently depending on the
             order in which specific UDP packets were received. We solved this by
             having the customer take network traces from various points in the
             network, making sure we had clear good and bad case examples, and doing
             some good old fashioned detective work. It was stressful, but quite fun
             and fulfilling once we were able to show root cause. And best of all, in
             this specific scenario it wasn&amp;#8217;t our bug.
          &lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/FixedInTheNextRelease?a=n0PViVhEGEE:b89g4mMMiVc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FixedInTheNextRelease?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FixedInTheNextRelease?a=n0PViVhEGEE:b89g4mMMiVc:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FixedInTheNextRelease?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FixedInTheNextRelease/~4/n0PViVhEGEE" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://www.fitnr.com/archives/2008/09/thats-a-dilly-of-a-pickle.html</feedburner:origLink></item>
    
    <item>
      <title>The Root of All Meeting Pain: The Battle for Authority Points</title>
      <pubDate>Thu, 25 Sep 2008 09:40:22 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/FixedInTheNextRelease/~3/ruLDv8aqxdQ/authority-points.html</link>
      <guid isPermaLink="false">http://www.fitnr.com/archives/2008/09/authority-points.html</guid>
      <author>louis@fitnr.com (Louis Marascio)</author>
      <description>&lt;p&gt;The most perplexing thing to me about working in a large company is this
             concept of Authority Points. I think it might be the root cause of why
             people always grumble about big companies, especially when they come
             from a small company background.
          &lt;/p&gt;
          
          &lt;h2&gt;Authority Points&lt;/h2&gt;
          &lt;p&gt;You see, when meetings happen in companies of non-trivial size more
             people seem to be invited because there are a widely diverse set of
             interests and motivations within the organization. Meeting organizers
             tend to error on the side of inviting someone rather than not because
             they fear not including a stakeholder, even if that stakeholder is only
             mildly connected to the meeting&amp;#8217;s topic or goal.
          &lt;/p&gt;
          &lt;p&gt;Now, once in the meeting, all of these folks have an urge. Most of the
             people invited are climbing the corporate ladder. Most folks motivation
             is to increase their dominion, grow their influence, and be seen as an
             important decision maker within the organization. To do this, they must
             earn Authority Points.
          &lt;/p&gt;
          &lt;p&gt;People earn Authority Points in numerous ways: they can do a good job,
             write a good email, execute well on a good project. But the absolute
             easiest way to earn Authority Points is to talk during a meeting. I&amp;#8217;ll
             call this &amp;#8220;harvesting Authority Points&amp;#8221; because I see it as being
             similar to what most MMORPG players do when they are levelling up: they
             go around killing all of the easy creatures to get gold and experience
             points.
          &lt;/p&gt;
          
          &lt;h2&gt;Why This Sucks&lt;/h2&gt;
          &lt;p&gt;This is bad because it is one of the primary reasons why meetings go
             long. It is, in my opinion, the primary reason why most meetings don&amp;#8217;t
             accomplish anything. The people who are there to earn their Authority
             Points create churn by saying things that have little fundamental value
             to the goal of the meeting. Much of the time, they create work that is,
             at best, adjacent to the problem at hand:
          &lt;/p&gt;
          &lt;pre&gt;&lt;code&gt;Authority Points Harvester: I think we should really talk to
          some-guy-over-in-another-group because they might have some insight.
          
          Other People in the Meeting: (silently) Groan.
          &lt;/code&gt;&lt;/pre&gt;&lt;p&gt;It&amp;#8217;s unfortunate, really, but inevitable. The only thing you can do is
             be aware of these people and what they&amp;#8217;re really doing when they talk.
             You can identify them in any number of ways, but one of the best methods
             is to try to recognize when someone is saying something that is a mere
             regurgitation of what has already been said in the meeting. They&amp;#8217;re
             doing this because they have nothing of value to add, but they must be
             heard because they want to be sure to convert the last hour and a half
             of meeting time into at least one more Authority Point. Sigh.
          &lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/FixedInTheNextRelease?a=ruLDv8aqxdQ:yt_yRSatGK8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FixedInTheNextRelease?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FixedInTheNextRelease?a=ruLDv8aqxdQ:yt_yRSatGK8:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FixedInTheNextRelease?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FixedInTheNextRelease/~4/ruLDv8aqxdQ" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://www.fitnr.com/archives/2008/09/authority-points.html</feedburner:origLink></item>
    
    <item>
      <title>How Tall is Your Ladder? Premature Optimization or Prudent Foundation?</title>
      <pubDate>Mon, 14 Jul 2008 20:55:31 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/FixedInTheNextRelease/~3/LpC8TdvssbU/how-big-is-your-ladder.html</link>
      <guid isPermaLink="false">http://www.fitnr.com/archives/2008/07/how-big-is-your-ladder.html</guid>
      <author>louis@fitnr.com (Louis Marascio)</author>
      <description>&lt;p&gt;Premature optimization: it&amp;#8217;s the hater-programmer&amp;#8217;s&lt;sup id="fnr1-531240136"&gt;&lt;a href="#fn1-531240136"&gt;1&lt;/a&gt;&lt;/sup&gt;
             trump card. These days it seems everywhere I look I see these folks
             yelling, &amp;#8220;Stop, you&amp;#8217;re optimizing prematurely! Thou shalt perish in
             programmer hell!&amp;#8221; To this I always want to respond, &amp;#8220;What exactly is
             premature optimization, and why do you think I&amp;#8217;m doing it?&amp;#8221;
          &lt;/p&gt;
          &lt;p&gt;It&amp;#8217;s funny, really. In the past six months I&amp;#8217;ve heard premature
             optimization thrown about as a reason not to do something at least seven
             times. So often has it been used, in such dubious circumstances, that
             I&amp;#8217;ve come to realize that the original intent behind this nugget of
             wisdom has been warped and skewed by hater-programmers with dubious
             intentions.
          &lt;/p&gt;
          &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Optimization_(computer_science)"&gt;According&lt;/a&gt; to the ever growing awareness, Wikipedia, Donald
             Knuth stated the following in the article &amp;#8220;Structured Programming with
             go to Statements&amp;#8221; in the ACM Journal Computing Surveys:
          &lt;/p&gt;
          &lt;blockquote&gt;&lt;p&gt;We should forget about small efficiencies, say about 97% of the time:
             premature optimization is the root of all evil.
          &lt;/p&gt;
          &lt;/blockquote&gt;&lt;p&gt;The article on Wikipedia goes on to say:
          &lt;/p&gt;
          &lt;blockquote&gt;&lt;p&gt;&amp;#8220;Premature optimization&amp;#8221; is a phrase used to describe a situation where
             a programmer lets performance considerations affect the design of a
             piece of code. This can result in a design that is not as clean as it
             could have been or code that is incorrect, because the code is
             complicated by the optimization and the programmer is distracted by
             optimizing.
          &lt;/p&gt;
          &lt;/blockquote&gt;&lt;p&gt;This I completely agree with. Premature optimization is, essentially, a
             way to say that programmers would rather fiddle bits than confront the
             design of their software critically. I&amp;#8217;d even provide an alternate,
             perhaps more accurate description: premature optimization is
             optimization without profiling. In other words, you&amp;#8217;re optimizing
             without pinpointing the problem and without the ability to measure the
             results; however, this doesn&amp;#8217;t mean you have to make simplistic choices
             when faced with a lack of data.
          &lt;/p&gt;
          &lt;p&gt;In my opinion&lt;sup id="fnr2-531240136"&gt;&lt;a href="#fn2-531240136"&gt;2&lt;/a&gt;&lt;/sup&gt; this is one of the most commonly misused
             tenants of computer science today. So often is &amp;#8220;premature optimization&amp;#8221;
             used as an argument against proposed solutions, that I have begun to
             seriously question the rationale and motives behind most people who
             propose it as a counter-argument in technical debates. I simply think it
             is grossly mis-applied. Even more annoying is when people actually
             suggest that &lt;em&gt;language choice&lt;/em&gt; is a premature optimization.
          &lt;/p&gt;
          &lt;p&gt;Let me provide a metaphor. Suppose you were asked to fetch a ladder for
             your friend. Now, you&amp;#8217;re into ladders. Ladders are &lt;em&gt;definitely&lt;/em&gt; your
             thing. You have three &lt;a href="http://en.wikipedia.org/wiki/Ladder"&gt;ladders&lt;/a&gt;,
             each a different size: a step ladder, a &lt;a href="http://en.wikipedia.org/wiki/Fixed_ladder"&gt;fixed
          ladder&lt;/a&gt;, and an extension
             ladder. Each one has its intended uses, and each one has explicit
             weaknesses. Which one do you take? You can only pick one.
          &lt;/p&gt;
          &lt;p&gt;If you&amp;#8217;re a premature-optimization-acolyte you pick the step ladder.
             Why? Well anything else would simply be overcomplicating the situation
             without sufficient reason not to. The step ladder is small, easy to
             transport, and most importantly, sort of cute. 
          &lt;/p&gt;
          &lt;p&gt;Me? Well, I&amp;#8217;m no acolyte. Here is how I see it.
          &lt;/p&gt;
          &lt;p&gt;The step ladder is basically useless. It fills a very specific need, but
             is not adaptable beyond that need. It&amp;#8217;s useful in that you can reach
             items slightly above your head, but its primary utility comes from the
             fact that the step ladder itself can neatly be tucked away, forgotten,
             behind some counter or under a bed somewhere.  Height, my friend, is
             &lt;em&gt;not&lt;/em&gt; its strength.
          &lt;/p&gt;
          &lt;p&gt;So, is it the fixed ladder or the extension ladder? Well, that&amp;#8217;s easy
             depending on the answer to the following question: is the fixed ladder
             of the over-the-top, uber-&lt;a href="http://www.ladders.com"&gt;Little Giant&lt;/a&gt;
             variety? If yes, then pick the fixed ladder and move on. If no, then the
             extension ladder is my choice.
          &lt;/p&gt;
          &lt;p&gt;Did you hear that? That was several thousand hater-programmers around
             the world gasping all at once. This is what they&amp;#8217;re saying and thinking:
             &amp;#8220;You&amp;#8217;ve just prematurely optimized the solution. There was no data to
             prove that you needed a ladder that could extend to 42 feet.&amp;#8221; Bah!
          &lt;/p&gt;
          &lt;p&gt;Humans, especially programmers, like to latch on to things we believe we
             understand. This precept of truth from Dr. Knuth is one of those things.
             Premature optimization &lt;em&gt;is&lt;/em&gt; bad, but inappropriate application of the
             precept of premature optimization is, IMO, much worse. Why? It
             suppresses good ideas and creative thinking. 
          &lt;/p&gt;
          &lt;p&gt;The ladder example provided above is straightforward. A ladder is about
             height. When asked to choose a ladder without sufficient data as to the
             height of the area to be reached pick a ladder that provides, in this
             order, the most flexibility and the most height. If the ladder is a
             Little Giant then pick it, that thing is amazing, 24 ladders in one!
             Otherwise, pick the ladder that provides the most height, they can
             almost always be positioned to reach a lower point, but can very, very
             rarely (at least safely) be positioned to reach a point above the
             maximum height of the ladder plus the height of the individual.
          &lt;/p&gt;
          &lt;p&gt;How does this apply to software? Well, more often than not, technology,
             tool, or design choices are changed because the argument against
             premature optimization is used to argue against what was simply a
             decision to favor flexibility, or as I call it, a Prudent Foundation.
          &lt;/p&gt;
          &lt;p&gt;Prudent foundations are simple. Given everything you know about a
             problem, pick something that your gut says is flexible and good enough,
             but nothing more. Be concious of sacrificing flexibility, that&amp;#8217;s how we
             get out of binds later on. The biggest risk we face as engineers is the
             risk of the unknown. Picking a prudent foundation, or a solution that
             minimizes the risk of the unknown, is the best we can do given the
             circumstances we are faced with.
          &lt;/p&gt;
          &lt;p&gt;Let&amp;#8217;s examine the most egregious misapplication of premature
             optimization. As I stated earlier I believe this to be language choice.
             Choosing a programming language is almost never a premature
             optimization. Language choice is about many other things, but mostly
             it&amp;#8217;s about picking the right tool for the job given the problem&amp;#8217;s
             business context.  Optimization, premature or otherwise, plays very
             little role here. The problem and business context define the criteria
             under which you should consider your decision.
          &lt;/p&gt;
          &lt;p&gt;Picking a prudent foundation is not premature optimization, even if
             10,000 hater-programmers believe it be at first glance. Usually, the
             premature optimization crowd are speaking from a position of comfort. It
             is premature optimization if it uses anything they aren&amp;#8217;t: (a) familiar
             with, or (b) comfortable with (no, these are not the same thing).
          &lt;/p&gt;
          &lt;p&gt;As engineers, one of the most important things we should be doing is
             discovering and promoting the prudent foundation for the problems we are
             faced with by making sound technology decisions.
          &lt;/p&gt;
          
          &lt;div class="footnote"&gt;&lt;hr/&gt;&lt;ol&gt;
           &lt;li id="fn1-531240136"&gt;&lt;p&gt;We all know them. These are the people who argue viewpoints based on
             religion. They are usually arguing against pragmatic solutions and
             are most commonly found aligned with the forces of evil.&lt;a href="#fnr1-531240136" class="footnoteBackLink" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;
          &lt;/p&gt;
          
           &lt;/li&gt;
          
           &lt;li id="fn2-531240136"&gt;&lt;p&gt;That&amp;#8217;s right, I get to provide my own, personal, humble, opinions on
             my very own website. Go figure.&lt;a href="#fnr2-531240136" class="footnoteBackLink" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;
          &lt;/p&gt;
          
           &lt;/li&gt;
          &lt;/ol&gt;
          &lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/FixedInTheNextRelease?a=LpC8TdvssbU:_yMv19b2yQU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FixedInTheNextRelease?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FixedInTheNextRelease?a=LpC8TdvssbU:_yMv19b2yQU:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FixedInTheNextRelease?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FixedInTheNextRelease/~4/LpC8TdvssbU" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://www.fitnr.com/archives/2008/07/how-big-is-your-ladder.html</feedburner:origLink></item>
    
    <item>
      <title>Hello C, My Old Friend!</title>
      <pubDate>Wed, 09 Jul 2008 14:18:43 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/FixedInTheNextRelease/~3/54Pd076vzQY/hello-c-my-old-friend.html</link>
      <guid isPermaLink="false">http://www.fitnr.com//archives/2008/07/hello-c-my-old-friend.html</guid>
      <author>louis@fitnr.com (Louis Marascio)</author>
      <description>&lt;p&gt;Recently I needed to parse a large &lt;a href="http://en.wikipedia.org/wiki/Flat_file"&gt;ASCII flat
          file&lt;/a&gt;. The files are generally
             about 230 MB large with about 1.1 million records each, but there are
             some that are as large as 1 GB. To do the heavy lifting I decided to use
             C, something I&amp;#8217;ve not done in a very, very long time.  Before I go on,
             let me share with you a little bit of history.
          &lt;/p&gt;
          &lt;p&gt;In my recent professional life (say, the past seven years or so) I have
             mostly been writing C# code. At Metreos and now at Cisco the product
             that I build is actually constructed of components written in C#, Java,
             and C++, but the majority is C#. C# is a nice language; it&amp;#8217;s very
             productive and has a very clean syntax, and I enjoy using it to build
             software. Unfortunately, deep down inside my nerdy heart there is
             something missing. You see, I started programming by writing C code and
             it&amp;#8217;s always been something I enjoyed doing.
          &lt;/p&gt;
          &lt;p&gt;Many moons ago, when I got my first computer and wanted to program, I
             convinced my Dad to buy me a C book and compiler. Unlike many other
             people I didn&amp;#8217;t start with BASIC or other &amp;#8220;beginner&amp;#8221; languages. Instead,
             I went straight into the dark woods of C-land, and I had a blast. Of
             course, being a first class dork, one of the first things I programmed
             was a terribly lame adventure game:
          &lt;/p&gt;
          &lt;pre&gt;&lt;code&gt;&amp;gt; n
          You go north.
          You're standing in a musty, underlit room with only one exit.
          The only thing you see are other nerds.
          &lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I eventually migrated to C++, then Java, and finally C#. &lt;a href="http://www.fitnr.com/archives/2008/07/holy-q-batman.html"&gt;As I&amp;#8217;ve said
          before&lt;/a&gt;, I like just about every programming language as
             long as my limited brain can grok what&amp;#8217;s required to use it. Thus, I
             have very, very little religion when it comes to programming languages.
             Some people deride anything that isn&amp;#8217;t their favorite. C, C#, Java, C++,
             Ruby, and Python all have their fair share of bigots. I have better
             things to do with my energy than to hate other perfectly good languages.
             Yes, I&amp;#8217;m of the &amp;#8220;can&amp;#8217;t the nerds of the world just get along&amp;#8221; camp. Of
             course, there is only &lt;a href="http://www.vim.org"&gt;one true editor&lt;/a&gt;, &lt;a href="http://www.gnu.org/software/emacs/"&gt;all
          others&lt;/a&gt; are simply inferior.
          &lt;/p&gt;
          &lt;p&gt;Anyway, I think our progression through programming languages is
             interesting. Most of the folks that I work with have progressed
             similarly through languages. Many of them stopped at Java, some went to
             C#, and others have found nirvana with Ruby or Python. Something that I
             think is amazing is how many refuse to go back. It&amp;#8217;s so common these
             days to talk to programmers who have found their last resting spot with
             C# or Ruby, and when asked, simply refuse to consider using a language
             they&amp;#8217;ve already &amp;#8220;moved on&amp;#8221; from, or at the very least, would only
             begrudgingly do so.
          &lt;/p&gt;
          &lt;p&gt;As software developers, and ultimately, engineers, why do we get
             religion so fast when we find a solution to a specific problem. All
             problems are different, and thus should be subjectively evaluated based
             on their attributes within a specific business context. &amp;#8220;Huh?&amp;#8221;, you say?
             Here&amp;#8217;s what I mean, please follow along:
          &lt;/p&gt;
          &lt;ol&gt;
           &lt;li&gt;&lt;p&gt;All problems are unique across multiple facets. A typical set of
                facets might be: time to solve, required performance, resources
                available, and solution criticality. A collection of these attributes
                make up the problem and it&amp;#8217;s container, the business context.&lt;br /&gt;
          
          &lt;/p&gt;
          
           &lt;/li&gt;
          
           &lt;li&gt;&lt;p&gt;The tools (read: programming language and related tool chain) that we
                choose to solve given problems should be chosen within a decision
                making framework constructed from the problem&amp;#8217;s facets.
          &lt;/p&gt;
          
           &lt;/li&gt;
          &lt;/ol&gt;
          &lt;p&gt;Ultimately you, the engineer and, potentially, your team, are asked to
             make technical decisions based on a critical review of the problem. Your
             business leaders and teammates trust you to make these value judgements
             in an agnostic way. Unfortunately, more times than not, engineers choose
             the tools they are most comfortable with to solve the problem, without
             critical examination of the others available to them. Of course,
             comfort, or more specifically, familiarity, is a valid criteria to
             consider when making tool chain decisions, but it should be weighed
             appropriately within the business context at hand.
          &lt;/p&gt;
          &lt;p&gt;For example, consider the following two scenarios where you are asked to
             build a parser for an ASCII flat file:
          &lt;/p&gt;
          &lt;ol&gt;
           &lt;li&gt;&lt;p&gt;You must do it by the end of the day. The file needs to be parsed and
                its records placed into a database where they will be retrieved at
                will. The program will only be rarely used, and the difference
                between a 1 hour run time and a 10 minute run time has little impact
                on the business.
          &lt;/p&gt;
          
           &lt;/li&gt;
          
           &lt;li&gt;&lt;p&gt;You must do it as fast as you can, without sacrificing quality. The
                file needs to be parsed and its records placed into a database where
                they will be retrieved at will. The program will be used daily, and
                the difference between a 1 hour run time and a 10 minute run time has
                a measurable business impact.
          &lt;/p&gt;
          
           &lt;/li&gt;
          &lt;/ol&gt;
          &lt;p&gt;Ask yourself, what language would you use? Why did you pick that
             language? Did you even consider programming languages you haven&amp;#8217;t used
             in recent work? I&amp;#8217;ve worked with people in the past who will immediately
             say Java, or Python, or SomeOtherProgrammingLanguage without any
             discussion as to the alternatives. Heck, I don&amp;#8217;t know about you, but I
             have to force myself to not provide implicit weighting to my personal
             biases.
          &lt;/p&gt;
          &lt;p&gt;So, anyway, like I said, recently I needed to parse an ASCII flat file.
             The files are about 230 MB large with 1.1 million records each, but
             there are some that are as large as 1 GB and 5 million records. To do
             the heavy lifting I chose C. This is why:
          &lt;/p&gt;
          &lt;ul&gt;
           &lt;li&gt;&lt;p&gt;This is a hobby, so the business context was simple: learning and fun.
          &lt;/p&gt;
          
           &lt;/li&gt;
          
           &lt;li&gt;&lt;p&gt;I wanted the program to be as fast and efficient as possible. Ideally,
               it should take no longer than 15 seconds to completely parse the
               largest of the available files.
          &lt;/p&gt;
          
           &lt;/li&gt;
          
           &lt;li&gt;&lt;p&gt;I may have several thousand of these files, so the different in run
               time between one minute and 15 seconds has a direct impact on my
               personal hobby productivity.
          &lt;/p&gt;
          
           &lt;/li&gt;
          
           &lt;li&gt;&lt;p&gt;The entire data set for a single file needs to be stored in memory.
               This means I need to be careful about how I read the file. My program
               uses &lt;a href="http://en.wikipedia.org/wiki/Memory-mapped_file"&gt;memory mapped
            files&lt;/a&gt;.
          &lt;/p&gt;
          
           &lt;/li&gt;
          &lt;/ul&gt;
          &lt;p&gt;I haven&amp;#8217;t done a benchmark to know how fast I could have parsed these
             files using Java or C#, but I do know that I&amp;#8217;m generally going as fast
             as I can reasonably expect to go with my current implementation. My
             business context didn&amp;#8217;t provide time for micro-benchmarking. Had it, I
             might have written a few benchmarks prior to picking my language.
          &lt;/p&gt;
          &lt;p&gt;The examples I provided here are simplistic. The decisions we&amp;#8217;re asked
             to make as software developers in our professional lives are inherently
             more complex with significantly more ambiguity. It&amp;#8217;s our duty as
             professional programmers to make these decisions with no technology
             religion to ensure our value judgements satisfy the needs of the
             business and not simply our desire as programmers to avoid the unknown.
          &lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/FixedInTheNextRelease?a=54Pd076vzQY:cmyKyBzk_5w:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FixedInTheNextRelease?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FixedInTheNextRelease?a=54Pd076vzQY:cmyKyBzk_5w:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FixedInTheNextRelease?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FixedInTheNextRelease/~4/54Pd076vzQY" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://www.fitnr.com//archives/2008/07/hello-c-my-old-friend.html</feedburner:origLink></item>
    
    <item>
      <title>Holy Q Batman!</title>
      <pubDate>Tue, 01 Jul 2008 17:04:25 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/FixedInTheNextRelease/~3/qGVeEeSJyVI/holy-q-batman.html</link>
      <guid isPermaLink="false">http://www.fitnr.com//archives/2008/07/holy-q-batman.html</guid>
      <author>louis@fitnr.com (Louis Marascio)</author>
      <description>&lt;p&gt;One of my hobbies is looking at financial markets. &lt;a href="http://en.wikipedia.org/wiki/Market_microstructure"&gt;Market
          microstructure&lt;/a&gt;&lt;sup id="fnr1-989423838"&gt;&lt;a href="#fn1-989423838"&gt;1&lt;/a&gt;&lt;/sup&gt;
             is fascinating, especially when you take a deep look at not only how the
             markets function (price discovery, information propagation, etc.), but
             also the various types of market participants and their motivations and
             expectations. Needless to say, investigating markets and the associated
             reams of time series data produced by them allows me to exercise
             particular muscle groups in my brain that don&amp;#8217;t get used every day. It&amp;#8217;s
             fun, and just like when you hit the gym after a three month break to
             work out those &lt;a href="http://en.wikipedia.org/wiki/Deltoid_muscle"&gt;deltoids&lt;/a&gt;,
             it usually hurts a lot afterwards!
          &lt;/p&gt;
          &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Quantitative_analyst"&gt;Quantitative
          analysis&lt;/a&gt; involves
             the study of time series data and their statistical characteristics.
             It&amp;#8217;s an interesting field with equally interesting tools. Some people
             never leave Excel while others use
             &lt;a href="http://www.mathworks.com/industries/finance/"&gt;Matlab&lt;/a&gt; or other
             &lt;a href="http://www.insightful.com/products/splus/default.asp"&gt;commercial&lt;/a&gt; and
             &lt;a href="http://www.r-project.org/"&gt;open source tools&lt;/a&gt;. Every once in a while,
             you run across tools and languages that just blow your mind. Enter kdb+
             and the Q language from &lt;a href="http://www.kx.com/"&gt;Kx Systems&lt;/a&gt;.
          &lt;/p&gt;
          &lt;p&gt;Part database and part programming language,
             &lt;a href="http://www.kx.com/developers/faq.php"&gt;kdb+&lt;/a&gt; is one of those dirty
             little secrets in the financial world that tend to stay hidden from
             public view. It is used by financial services companies as the basis for
             some of their important trading and analytical systems. The really mind
             blowing part, in my opinion, is not the database itself, but the
             language you use to control, configure, and program it:
             &lt;a href="http://www.kx.com/q/d/primer.htm"&gt;Q&lt;/a&gt;. For example, the definitive book
             on kdb+ and the Q language is called &lt;a href="https://code.kx.com/trac/wiki/QforMortals2/contents"&gt;Q for
          Mortals&lt;/a&gt;&lt;sup id="fnr2-989423838"&gt;&lt;a href="#fn2-989423838"&gt;2&lt;/a&gt;&lt;/sup&gt;.
             Here, look at this piece of code and you can see why&lt;sup id="fnr3-989423838"&gt;&lt;a href="#fn3-989423838"&gt;3&lt;/a&gt;&lt;/sup&gt;:
          &lt;/p&gt;
          &lt;pre&gt;&lt;code&gt;sample:{ 
            t:("DSF"; enlist ",") 0: `:c:/q/data/px.csv;
            tmpx:select mpx:max Price by Date,Sym from t;
            h:hopen `:aerowing:5042;
            rtmpx:h "select mpx:max Price by Date,Sym from tpx";
            hclose h;
            .[`:c:/q/data/tpx.dat; (); ,; rtmpx,tmpx]
          }
          &lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Holy Quantitative Analyst, Batman! That is some hardcore code right
             there. Even more interesting is how the functionality of this code
             snippet is described in the book (slightly edited):
          &lt;/p&gt;
          &lt;blockquote&gt;&lt;p&gt;The [previous] program reads a csv file of time-stamped symbols and
             prices, places the data into a table and computes the maximum price
             for each day. It then opens a socket connection to a q process on
             another machine and retrieves a similar daily aggregate. Finally, it
             merges the two intermediate tables and appends the result to an
             existing file.
          &lt;/p&gt;
          &lt;/blockquote&gt;&lt;p&gt;Wow. Any language that makes use of non-paired back ticks has got to be
             cool, right? From what I can surmise, engineers who understand kdb+ and
             Q are in high demand by the financial services industry. I suppose if
             you understand how to use such a seemingly powerful tool then you can
             almost set your own price.
          &lt;/p&gt;
          &lt;p&gt;Very cool indeed, but I don&amp;#8217;t think my brain will allow me to learn such
             an obscure language. I&amp;#8217;ve always been terrible at those &lt;a href="http://www0.us.ioccc.org/"&gt;obfuscated
          C&lt;/a&gt; contests. The only reason I found kdb+ was
             that Kx Systems recently released an individual license, allowing mere
             mortals like myself to download the software, try it out, and eventually
             realize that we&amp;#8217;re not worthy.
          &lt;/p&gt;
          &lt;p&gt;Alright, everyone together now: Thaaannnks Kx Systems!
          &lt;/p&gt;
          
          &lt;div class="footnote"&gt;&lt;hr/&gt;&lt;ol&gt;
           &lt;li id="fn1-989423838"&gt;&lt;p&gt;If you&amp;#8217;re interested in market microstructure I strongly recommend
             &lt;a href="http://www.larryharris.com/"&gt;Professor Larry Harris&amp;#8217;&lt;/a&gt; book
             &lt;a href="http://tradingandexchanges.com/"&gt;Trading and Exchanges: Market Microstructure for
          Practioners&lt;/a&gt;.&lt;a href="#fnr1-989423838" class="footnoteBackLink" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;
          &lt;/p&gt;
          
           &lt;/li&gt;
          
           &lt;li id="fn2-989423838"&gt;&lt;p&gt;The book is hosted at Kx Systems&amp;#8217; online wiki. To access the site
             with read only permissions use the user name &amp;#8216;anonymous&amp;#8217; and password
             &amp;#8216;anonymous&amp;#8217;, as outlined on the &lt;a href="http://code.kx.com"&gt;code.kx.com&lt;/a&gt;
             landing page.&lt;a href="#fnr2-989423838" class="footnoteBackLink" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;
          &lt;/p&gt;
          
           &lt;/li&gt;
          
           &lt;li id="fn3-989423838"&gt;&lt;p&gt;This code and the description of its functionality is from the Q for
             Mortals book, 2nd edition. Specifically the
             &lt;a href="https://code.kx.com/trac/wiki/QforMortals2/overview#Sample-Q-Program"&gt;Overview&lt;/a&gt;
             section.&lt;a href="#fnr3-989423838" class="footnoteBackLink" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;
          &lt;/p&gt;
          
           &lt;/li&gt;
          &lt;/ol&gt;
          &lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/FixedInTheNextRelease?a=qGVeEeSJyVI:-bG3lpw4A-c:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FixedInTheNextRelease?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FixedInTheNextRelease?a=qGVeEeSJyVI:-bG3lpw4A-c:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FixedInTheNextRelease?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FixedInTheNextRelease/~4/qGVeEeSJyVI" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://www.fitnr.com//archives/2008/07/holy-q-batman.html</feedburner:origLink></item>
    
    <item>
      <title>Why Do I Always Have to be Different?</title>
      <pubDate>Mon, 30 Jun 2008 22:30:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/FixedInTheNextRelease/~3/Vei0x5Qbo50/about-this-site.html</link>
      <guid isPermaLink="false">http://www.fitnr.com//archives/2008/06/about-this-site.html</guid>
      <author>louis@fitnr.com (Louis Marascio)</author>
      <description>&lt;p&gt;I like to use my personal projects as opportunities to learn about new
             things. Sometimes I explicitly try to reinvent the wheel &amp;#8212; after all,
             this is &lt;em&gt;my&lt;/em&gt; time to learn how to make a useful round object. I dedicate
             a certain amount of time every week to this type of tinkering, and the
             tool chain used to build this website is a result of such activity.
          &lt;/p&gt;
          &lt;p&gt;One day I&amp;#8217;ll spend some time explaining why I think tinkering is so
             important, but to summarize it quickly, tinkering is about becoming and
             staying a well rounded programmer&lt;sup id="fnr1-127087345"&gt;&lt;a href="#fn1-127087345"&gt;1&lt;/a&gt;&lt;/sup&gt; by gaining different
             perspectives on technology not encountered in your typical professional
             life.
          &lt;/p&gt;
          &lt;p&gt;My goal for the FITNR website is simple: I want to build a place on the
             web that I can share some of my thoughts, but I want to do it my way &amp;#8212;
             more on this later. The very reason why I don&amp;#8217;t use tools like
             &lt;a href="http://wordpress.org/"&gt;Wordpress&lt;/a&gt; is because launching this website is
             an opportunity for me to learn &amp;#8212; consistent with the philosophy
             described above.
          &lt;/p&gt;
          &lt;p&gt;To further complicate things, I don&amp;#8217;t want to rely on any dynamic server
             side code. I want something that is static on the server &amp;#8212; partly
             driven from my desire not to add to my already too large personal
             systems administration workload and partly as an experiment. Under this
             rule all interactivity needs to come from Javascript as executed by the
             client-side browser. &lt;a href="http://en.wikipedia.org/wiki/Mashup_(web_application_hybrid)"&gt;Mashups&lt;/a&gt; are all the rave these days, and
             I&amp;#8217;d like to explore that world a little bit.
          &lt;/p&gt;
          &lt;p&gt;The manner in which I edit, build, and publish Fixed in the Next Release
             is partly an experiment in building a publishing system around my
             favorite tools and partly an exploration of how interesting a website
             one can build without relying on a server side component. Quite simply,
             can I make the mashup-potatoes taste good enough &amp;#8212; is it possible,
             without all that lovely server side&lt;sup id="fnr2-127087345"&gt;&lt;a href="#fn2-127087345"&gt;2&lt;/a&gt;&lt;/sup&gt; butter? This is just
             one big opportunity to tinker.
          &lt;/p&gt;
          &lt;p&gt;To summarize, here are my requirements:
          &lt;/p&gt;
          &lt;ol&gt;
           &lt;li&gt;
               No dynamic, server-side content generation 
           &lt;/li&gt;
          
           &lt;li&gt;
               Must have some way of engaging in public discussion
           &lt;/li&gt;
          
           &lt;li&gt;
               Must support searching
           &lt;/li&gt;
          
           &lt;li&gt;
               Must support tagging
           &lt;/li&gt;
          
           &lt;li&gt;
               Must generate a feed of some type, probably RSS
           &lt;/li&gt;
          &lt;/ol&gt;
          &lt;p&gt;First, let&amp;#8217;s talk about the tool chain. I love programming languages.
             When I&amp;#8217;m tinkering, I like to use languages that don&amp;#8217;t always make it
             into my professional life. For this website, I wanted to use Python for
             everything and that naturally lead me to
             &lt;a href="http://jinja.pocoo.org/"&gt;Jinja2&lt;/a&gt; for a templating system as the basis
             for my HTML generation.
          &lt;/p&gt;
          
          &lt;h2&gt;Templating&lt;/h2&gt;
          &lt;p&gt;Jinja2 is neat. The template syntax follows that of
             &lt;a href="http://www.djangoproject.com/"&gt;Django&amp;#8217;s&lt;/a&gt; lovely syntax, in fact the
             original hack of this site was written using Django&amp;#8217;s template system by
             itself and I was able to switch to Jinja2 with only one or two minor
             modifications. Template inheritance, filters, and blocks make putting
             together something like FITNR a piece of cake.
          &lt;/p&gt;
          
          &lt;h2&gt;Editing&lt;/h2&gt;
          &lt;p&gt;When it comes to authoring the content I really only need (or want) one
             thing: &lt;a href="http://www.vim.org"&gt;vim&lt;/a&gt;. Jinja2 continued to fulfill it&amp;#8217;s
             promise of sweetness by already having a vim syntax definition for their
             templating. 
          &lt;/p&gt;
          &lt;ol&gt;
           &lt;li&gt;
               Launch vim
           &lt;/li&gt;
          
           &lt;li&gt;
               &lt;code&gt;set ft=htmljinja&lt;/code&gt; &amp;#8230; sweet colors, nice
           &lt;/li&gt;
          
           &lt;li&gt;
               Profit?
           &lt;/li&gt;
          &lt;/ol&gt;
          &lt;p&gt;Of course, the actual articles are written using
             &lt;a href="http://daringfireball.net/projects/markdown/"&gt;Markdown&lt;/a&gt; and there is
             vim a syntax definition for it as well. Finally, I integrated
             &lt;a href="http://daringfireball.net/projects/smartypants/"&gt;SmartyPants&lt;/a&gt; to add a
             bit of flare to my web typography. Luckily, for both of these bits there
             are nice Python libraries&lt;sup id="fnr3-127087345"&gt;&lt;a href="#fn3-127087345"&gt;3&lt;/a&gt;&lt;/sup&gt; that do the heavy lifting.
          &lt;/p&gt;
          &lt;p&gt;&lt;img src="/fitnr-edit.gif" title="Editing a FITNR Page" alt="Editing a FITNR Page"/&gt;
          &lt;/p&gt;
          
          &lt;h2&gt;Revision Control&lt;/h2&gt;
          &lt;p&gt;Revision control was simple: everything lives in
             &lt;a href="http://subversion.tigris.org"&gt;Subversion&lt;/a&gt;. 
          &lt;/p&gt;
          &lt;pre&gt;&lt;code&gt;&amp;gt; svn co http://svn.fitnr.com/fitnr
          &lt;/code&gt;&lt;/pre&gt;&lt;p&gt;It turns out, what I really wanted was to be true to the Unix
             philosophy, partially shown below (courtesy of
             &lt;a href="http://en.wikipedia.org/wiki/Unix_philosophy"&gt;Wikipedia&lt;/a&gt;):
          &lt;/p&gt;
          &lt;blockquote&gt;&lt;p&gt;Write programs that do one thing and do it well.
             Write programs to work together.
             Write programs to handle text streams.
          &lt;/p&gt;
          &lt;/blockquote&gt;&lt;p&gt;This was my primary requirement, and I had to be able to wire it all up
             with Python easily. No monolithic tools here, thank you very much!
          &lt;/p&gt;
          
          &lt;h2&gt;How it Works&lt;/h2&gt;
          &lt;p&gt;It all turned out quite nice, actually. I have a basic site structure as
             follows:
          &lt;/p&gt;
          &lt;pre&gt;&lt;code&gt;fitnr/
              assets/
              content/
              pages/
              templates/
          &lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The directory structure provides a nice segmentation of the various
             inputs required to make the site happen:
          &lt;/p&gt;
          &lt;ul&gt;
           &lt;li&gt;
               assets &amp;#8212; Javascript, stylesheets, images, etc.
           &lt;/li&gt;
          
           &lt;li&gt;
               content &amp;#8212; articles that will be published, many of which currently
                 sit in an unfinished state
           &lt;/li&gt;
          
           &lt;li&gt;
               pages &amp;#8212; the actual site structure, built with static html and
                 Jinja2 templates, including my &lt;a href="/feeds/"&gt;feed&lt;/a&gt;
           &lt;/li&gt;
          
           &lt;li&gt;
               templates &amp;#8212; common layouts and designs written in Jinja2&amp;#8217;s template
                 language
           &lt;/li&gt;
          &lt;/ul&gt;
          &lt;p&gt;When I want to start working on a new article I create a file in the
             &lt;code&gt;content&lt;/code&gt; directory. This file has a simplistic structure: a series of
             faux email-style headers that define meta-data, followed by an empty
             line, followed by the actual content written in Markdown syntax.
          &lt;/p&gt;
          &lt;p&gt;The files in the &lt;code&gt;pages&lt;/code&gt; directory use the data from the &lt;code&gt;content&lt;/code&gt;
             directory to render the site. Each page can be a Jinja2 template and can
             generate any content I wish. For example, I have a page that actually
             generates my feed for me.
          &lt;/p&gt;
          &lt;p&gt;I have two simple Python programs. One is called &lt;code&gt;makeit.py&lt;/code&gt; that 111
             lines of code, including comments, that does the following:
          &lt;/p&gt;
          &lt;ol&gt;
           &lt;li&gt;
               Recurse into the &lt;code&gt;content&lt;/code&gt; directory and parse each of the posts.
           &lt;/li&gt;
          
           &lt;li&gt;
               Recurse into the &lt;code&gt;pages&lt;/code&gt; directory and pass each page to Jinja2 for
             template processing.
           &lt;/li&gt;
          
           &lt;li&gt;
               Jinja2 processes the template, and loads any required parent
                  templates from the &lt;code&gt;templates&lt;/code&gt; directory as they are needed.
           &lt;/li&gt;
          
           &lt;li&gt;
               Copies the files from the &lt;code&gt;assets&lt;/code&gt; folder into a build directory.
           &lt;/li&gt;
          
           &lt;li&gt;
               Saves each of the rendered pages into the build directory.
           &lt;/li&gt;
          &lt;/ol&gt;
          &lt;p&gt;The other Python script is a simple web server that uses
             &lt;code&gt;SimpleHTTPServer&lt;/code&gt; from Python&amp;#8217;s standard library. It&amp;#8217;s all of 21 lines
             of code and allows me to preview the site before publishing.
          &lt;/p&gt;
          &lt;p&gt;So how did I do against my original goals?
          &lt;/p&gt;
          &lt;ol&gt;
           &lt;li&gt;
               No dynamic, server-side content generation &amp;#8212; &amp;#10004; No problems
             here, everything is static
           &lt;/li&gt;
          
           &lt;li&gt;
               Must have some way of engaging in public discussion &amp;#8212; &amp;#10004; I
             sort of cheated on this, but only sort of. I created a Google Group
             called &lt;a href="http://groups.google.com/group/fitnr-discuss"&gt;fitnr-discuss&lt;/a&gt;
             that you can join if you&amp;#8217;d like to discuss what you see on this site.
           &lt;/li&gt;
          
           &lt;li&gt;
               Must support searching &amp;#8212; Not yet
           &lt;/li&gt;
          
           &lt;li&gt;
               Must support tagging &amp;#8212; Not yet
           &lt;/li&gt;
          
           &lt;li&gt;
               Must generate a feed of some type, probably RSS &amp;#8212; &amp;#10004; I
          generate an RSS v2 feed &lt;a href="/feeds/rss.xml"&gt;here&lt;/a&gt;
           &lt;/li&gt;
          &lt;/ol&gt;
          &lt;p&gt;There are quite a few things I&amp;#8217;d like to add to the site in the future,
             but first I need to complete the tagging and searching functionality.
             For tagging I just need to code up the views that I&amp;#8217;d like to expose,
             and for searching it&amp;#8217;s a matter of reading some Google API
             documentation.
          &lt;/p&gt;
          &lt;p&gt;There are some other obvious things that need to be done sooner rather
             than later, most notable I need to finish the archive functionality so
             that each post gets a permanent link.
          &lt;/p&gt;
          
          &lt;div class="footnote"&gt;&lt;hr/&gt;&lt;ol&gt;
           &lt;li id="fn1-127087345"&gt;&lt;p&gt;This goes for any profession, really. It&amp;#8217;s the desire to learn
             beyond one&amp;#8217;s standard job function that, in my opinion, typically
             separates the cream of the crop when observing practitioners of any
             trade or function.&lt;a href="#fnr1-127087345" class="footnoteBackLink" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;
          &lt;/p&gt;
          
           &lt;/li&gt;
          
           &lt;li id="fn2-127087345"&gt;&lt;p&gt;You&amp;#8217;ll have to forgive me a little bit here. Of course I understand
             that &lt;em&gt;somewhere&lt;/em&gt; on the Internet will be a server side component. I
             just don&amp;#8217;t want to host it.&lt;a href="#fnr2-127087345" class="footnoteBackLink" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;
          &lt;/p&gt;
          
           &lt;/li&gt;
          
           &lt;li id="fn3-127087345"&gt;&lt;p&gt;&lt;a href="http://www.freewisdom.org/projects/python-markdown"&gt;Markdown in Python&lt;/a&gt;
             and &lt;a href="http://web.chad.org/projects/smartypants.py/"&gt;smartypants.py&lt;/a&gt;&lt;a href="#fnr3-127087345" class="footnoteBackLink" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;
          &lt;/p&gt;
          
           &lt;/li&gt;
          &lt;/ol&gt;
          &lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/FixedInTheNextRelease?a=Vei0x5Qbo50:rbyL86fPx9I:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FixedInTheNextRelease?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FixedInTheNextRelease?a=Vei0x5Qbo50:rbyL86fPx9I:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FixedInTheNextRelease?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FixedInTheNextRelease/~4/Vei0x5Qbo50" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://www.fitnr.com//archives/2008/06/about-this-site.html</feedburner:origLink></item>
    
    <item>
      <title>Better Late than Never, I Suppose</title>
      <pubDate>Thu, 22 May 2008 12:00:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/FixedInTheNextRelease/~3/Pxoj7kIK5hs/better-late-than-never.html</link>
      <guid isPermaLink="false">http://www.fitnr.com//archives/2008/05/better-late-than-never.html</guid>
      <author>louis@fitnr.com (Louis Marascio)</author>
      <description>&lt;p&gt;Well, I suppose it&amp;#8217;s time. I&amp;#8217;ve avoided jumping online with an
             official-like presence for long enough. At this point I feel like the
             guy in the 90&amp;#8217;s who was still using a Walkman listening to cassette
             tapes.
          &lt;/p&gt;
          &lt;p&gt;What will you find here? Mostly a discussion on software development,
             software teams, and other related technical bits and pieces. You&amp;#8217;ll find
             a healthy dose of cynicism and pragmatism in my viewpoints, but more
             importantly I hope there is a fair bit of humor.
          &lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/FixedInTheNextRelease?a=Pxoj7kIK5hs:hBbQmsMK2Xc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FixedInTheNextRelease?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FixedInTheNextRelease?a=Pxoj7kIK5hs:hBbQmsMK2Xc:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FixedInTheNextRelease?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FixedInTheNextRelease/~4/Pxoj7kIK5hs" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://www.fitnr.com//archives/2008/05/better-late-than-never.html</feedburner:origLink></item>
    

  </channel>
</rss>
