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

<channel>
	<title>Advent Digerati &#187; Theory</title>
	<atom:link href="http://blog.adventdigerati.com/category/theory/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.adventdigerati.com</link>
	<description>Where Life meets Geek</description>
	<lastBuildDate>Mon, 26 Jul 2010 00:49:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Zen and the Art</title>
		<link>http://blog.adventdigerati.com/2009/03/zen-and-the-art/</link>
		<comments>http://blog.adventdigerati.com/2009/03/zen-and-the-art/#comments</comments>
		<pubDate>Wed, 11 Mar 2009 03:55:31 +0000</pubDate>
		<dc:creator>Zack</dc:creator>
				<category><![CDATA[Philosophy]]></category>
		<category><![CDATA[Theory]]></category>

		<guid isPermaLink="false">http://blog.adventdigerati.com/?p=46</guid>
		<description><![CDATA[Programming, specifically the intelligent design of such constructs, has always been at least twenty percent mimicry. Someone shows us how to write an efficient binary toggle and the practice stays with us. Learning how to find exclusive results between two SQL tables can shave minutes off of execution time, and your boss will certainly be [...]]]></description>
			<content:encoded><![CDATA[<p>Programming, specifically the intelligent design of such constructs, has always been at least twenty percent mimicry. Someone shows us how to write an efficient binary toggle and the practice stays with us. Learning how to find exclusive results between two SQL tables can shave minutes off of execution time, and your boss will certainly be impressed if you boost throughput by 85%.</p>
<p>Along the road to enlightenment, I&#8217;ve had some superlative teachers, professors, and friends instruct me on the best ways they knew to implement everything from Levenshtein Distance to Diffie-Helman compression, from polygon intersection to Relational Division. These lessons weren&#8217;t always apparent, and hardly ever enjoyable, but the knowledge and satisfactoin at the end of the project often put me years ahead of self-study.</p>
<p>Several times, I&#8217;ve been asked questions to which I&#8217;ve had absolutely no idea as to the solution. Yet, right then and there, an answer was demanded of me. It&#8217;s difficult and embarrassing, but situations like these are more about the reasoning than an off-the-cuff answer. This is an important concept, since it is a large step on the road to Doing Big Things.</p>
<p>Such occurrences were relatively commonplace, and for a long time I couldn&#8217;t figure out why someone looking to help me was asking a question that I either obviously had no business answering, or that was completely over my head. Then, just a few days ago, I stumbled onto the concept of zen. Zen, for want of a clearer definition, is the internal feeling and state of mind which is, in rudimentary forms, omniscience about a subject. It is the absence of bounds or form of knowledge in an area of concentration or meditation.</p>
<p>Zen and the art of programming was an interesting thought experiment, and until then I had no idea zen was being taught to me the entire time.</p>
<p>A <a href="http://dictionary.reference.com/browse/mondo" title="mondo">mondo</a> is a component of zen scripture where the roshi (`roh-shee) [teacher] asks the student a question, demanding an immediate answer. Since this question is often complex or multi-part, the process of developing the answer is more critical than the answer itself, akin to the Biblical scripture of teaching a man to fish. Had the pupil regurgitated some decade-old algorithm learned in Intro to VisualBasic doesn&#8217;t further the understanding of the problem at hand. Just because you may have learned bubble sort first doesn&#8217;t mean it&#8217;s the best choice for your production code base. A mondo would solve whether insertion sort would suffice instead of spending two days of company time implementing heap sort; and, more than that, it should help you realize the patterns in the future to prevent the same questions from needing attention again.</p>
<p>This insight, the ability to anticipate or at least keep pace with the business&#8217; needs, is one of the most efficient ways to show off one&#8217;s skill in a profession. Especially now, when employers need to &#8220;cut off the fat&#8221; out of their budgets and reign in on ambitious funding of pipe-dream projects to stay competitive.</p>
<p>And there&#8217;s no reason you <i>shouldn&#8217;t</i> want to continue to learn. If nothing else &ndash; and trust me, there&#8217;s plenty else &ndash; you will bring those skills back to the workplace every day, inspiring those around you and impressing your superiors. That&#8217;s not even counting the personal satisfaction of reasoning through an enigma and coming out the upper side with a better solution or clearer understanding of the problem.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.adventdigerati.com/2009/03/zen-and-the-art/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Skill and Quirks</title>
		<link>http://blog.adventdigerati.com/2009/02/skill-and-quirks/</link>
		<comments>http://blog.adventdigerati.com/2009/02/skill-and-quirks/#comments</comments>
		<pubDate>Thu, 26 Feb 2009 03:30:17 +0000</pubDate>
		<dc:creator>Zack</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Theory]]></category>

		<guid isPermaLink="false">http://blog.adventdigerati.com/?p=42</guid>
		<description><![CDATA[As with any profession, programming is a split of skill and quirks. Quirks come in many forms and can be quite useful or a bane. In JavaScript, for instance, you can reference a function as an object, which itself can be referenced as a hash. Thusly, window.foo[bar](baz) is perfectly valid(!). In PHP, an Array can [...]]]></description>
			<content:encoded><![CDATA[<p>As with any profession, programming is a split of skill and quirks. Quirks come in many forms and can be quite useful or a bane. In JavaScript, for instance, you can reference a function as an object, which itself can be referenced as a hash. Thusly, <code>window.foo[bar](baz)</code> is perfectly valid(!). In PHP, an Array can be accessed by square or curly braces; <code>$a['b']</code> and <code>$a{'b'}</code> are equivalent(!!). These idiosyncrasies facilitate flexible code, yes, but can also be dangerous for maintenance. A person new to JavaScript, (who probably doesn&#8217;t quite grasp closures just yet), will most likely have less than a clue as to why the snipped is valid. The PHP programmer who has a background in C would expect the curly braces to define a new scope, not act as a hash lookup.</p>
<p>I am going to argue against myself here. I realize that in a prior <a href="http://blog.adventdigerati.com/2008/10/futureproof/">post</a> I praised PHP dereferencing, longing for the direct pointer manipulation of Perl, by using <code>$value=true; $name='value'; ${$name}==true</code>. However, for the next developer, he or she must understand prior to inheriting the code, how PHP handles inline eval() statements.</p>
<p>In situations where the use of these is unavoidable &ndash; usually in dynamically-created variables, LISP anyone? &ndash; a detailed comment is assuredly in order. Even if it is simple, an example, the next programmer to stumble across your code should be able to reasonably expect an outcome from the procedure.</p>
<p>In JavaScript I&#8217;ve been writing lately, I&#8217;ve become very cautious about the nature of functions and closures. Frequently, I&#8217;ve adopted the practice of namespacing everything I write. Because of that, grouping functions down to the program area can be tedious. No programmer wants to see <code>com.acme.financial.payment.forms.construct()</code>. With JavaScript, we can fake a <code>with()</code> statement. <code>var pay_form = com.acme.financial.payment.forms</code>; additionally <code>com.acme.financial[params['object_type']].forms[action](params_hash)</code> can save a lot of code later in the process.</p>
<p>As an engineer, we should always be looking for ways to perfect our trade. Often this means coding cleanly, and using conventions. Sometimes this means using quirks to their biggest advantage: shrinking the codebase. Remember, one bug for every ten lines.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.adventdigerati.com/2009/02/skill-and-quirks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dynamic-Sql Act IV</title>
		<link>http://blog.adventdigerati.com/2009/01/dynamic-sql-act-iv/</link>
		<comments>http://blog.adventdigerati.com/2009/01/dynamic-sql-act-iv/#comments</comments>
		<pubDate>Thu, 08 Jan 2009 04:58:57 +0000</pubDate>
		<dc:creator>Zack</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Theory]]></category>

		<guid isPermaLink="false">http://blog.adventdigerati.com/?p=30</guid>
		<description><![CDATA[For those who&#8217;ve continued interest in my mini series on SQL, thanks for reading. The saga continues below. Our RDB now contains two paths from Baby (B) to Deceased (D), one including the Person (P) entity. We also presume, though our system does not outright, that there are roughly 10:1 paths from B->P->D than B->D. [...]]]></description>
			<content:encoded><![CDATA[<p>For those who&#8217;ve continued interest in my mini series on SQL, thanks for reading. The saga continues below.</p>
<p>Our RDB now contains two paths from Baby (B) to Deceased (D), one including the Person (P) entity. We also presume, though our system does not outright, that there are roughly 10:1 paths from B->P->D than B->D. We&#8217;ve been trying to solve one of the old problems of a User-generated SQL query: power and risk versus ease and safety. These are not necessarily exclusive, and I have argued why. We have the technology, now lets put it to good use!</p>
<p>The semantics, as stated, is the easy part: We will store them in our foreign key properties in the code. When the user requests a path be made, we&#8217;ll retrieve and display the semantics that relate to the links we&#8217;ve chosen.</p>
<p>Now comes the tricky part: choosing which links are best. By default, &#8220;average&#8221; queries follow a consistent path. Trying to determine if Alice and Bob work for Acme generally means we&#8217;re looking for the same link. As is the case if we&#8217;re looking for anyone who works for Acme and Borax. In our second query, we&#8217;d presumably cross the same link twice. This isn&#8217;t a coincidence, it&#8217;s a natural state of the human expectation.</p>
<p>Let&#8217;s put this into practice. Suppose we cache a rough estimate as to how many unique foreign keys are in one table for its neighbors. (This can be achieved through indexing and is a very fast query in modern RDBMS&#8217;s.) Traditionally, when attempting to discern a path from one entity to another, shortest-distance was applied. However, given our RDB situation above, this is probably flawed: What we really wanted was from B->P->D, two hops instead of one. Given that we have a fast lookup that informs us we have an alternate path out of B, let&#8217;s try that.</p>
<p>Graph theorists recognize this as a <a href="http://en.wikipedia.org/wiki/Max_flow_min_cut_theorem">max-flow/min-cut</a> problem. We are looking to maximize our probability that the path chosen is correct; likely the path with the most foreign keys. If I had the time and energy, (maybe I will later), I&#8217;d make up a diagram or code snippet to illustrate; but you get my point. Some times the shortest path isn&#8217;t always the right one, and with the proper tool set in place we can offer a much more elegant &ndash; and noticeably more user-friendly &ndash; interface.</p>
<p>In the next part, (which I don&#8217;t expect to have finished anytime soon), I&#8217;ll be addressing some caveats I think would hinder our progress &ndash; most notably worst-case scenarios and impossible Source-Sink choices. It&#8217;s the conclusion to a thought constructed more than a month ago, and possibly one of the funnest thought experiments I&#8217;ve had in quite some time. I hope you enjoy thinking outside the box!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.adventdigerati.com/2009/01/dynamic-sql-act-iv/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dynamic-Sql Act III</title>
		<link>http://blog.adventdigerati.com/2008/12/dynamic-sql-act-iii/</link>
		<comments>http://blog.adventdigerati.com/2008/12/dynamic-sql-act-iii/#comments</comments>
		<pubDate>Fri, 26 Dec 2008 00:24:27 +0000</pubDate>
		<dc:creator>Zack</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Theory]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Practicum]]></category>

		<guid isPermaLink="false">http://blog.adventdigerati.com/?p=24</guid>
		<description><![CDATA[All RDb queries are structured in a strict syntax. This is a simple axiom which can and will be exploited by our experiment on the most fundamental level: building the tree. The elementary fact is that whatever comes next must be related to something which has preceded it. It is this relationship which we will [...]]]></description>
			<content:encoded><![CDATA[<p>All RDb queries are structured in a strict syntax. This is a simple axiom which can and will be exploited by our experiment on the most fundamental level: building the tree. The elementary fact is that whatever comes next must be related to something which has preceded it. It is this relationship which we will use to link and unlink our tree.</p>
<p>Using our <a href="http://blog.adventdigerati.com///dynamic-sql-act-ii">previous example</a>, we can already see how rapidly a RDb can gain entities and relationships as correctly storing information can require many additional entities. For our &#8220;intelligent SQL constructor,&#8221; the system will need to weed through the myriad of tables to get to find the fastest path from start to finish.</p>
<p>Now suppose we expand our example yet again and include a second path between <code>Baby</code> and <code>Deceased</code>: &#8220;A Baby can be born and soon after become Deceased.&#8221; This new relationship throws a monkey wrench in some interfaces, as the most direct path from Baby to Deceased is now a single hop. For some users, that we may abstract the fact a Person will become Deceased can lead to erroneous expectations either from the developer or the user; in either event, this is a discrepancy which will cost patrons and development costs in the end.</p>
<p>So how can we expose this fact? My personal inclination is to be explicit is possible. By describing to users what you, as the developer, were intending, harmful reactions should realistically be cut to a minimum. To do this, the system will need to be mathematically aware of how the RDb is structured and what the relationships imply. As proposed in <a href="http://blog.adventdigerati.com/2008/11/dynamic-sql-act-i/trackback/">the exposition</a>, knowledge of existing information, its meaning, and a relation to other algorithms should help us greatly.</p>
<p>The first tool we&#8217;ll need is a mathematical expectation of how to go from Baby to Deceased. Because of the wonders of modern medicine, users expect that life for a Baby does not cease until having consumed a significant time on Earth. From the data-modeling standpoint, this is to trace the relationship from Baby to Deceased through the Person entity. However, some UIs may not account for this and choose the direct, 1-hop, relationship.</p>
<p>From a user&#8217;s standpoint, this is misleading. &#8220;I&#8217;m calculating social security checks for the elderly; why do the results include a dozen records which are extraneous?&#8221; The system&#8217;s presumption that it must follow the most direct path from Baby to Deceased seems flawed, though &ndash; for the criteria &ndash; its data may be perfectly correct. Shouldn&#8217;t we instead initially propose to follow the path with the highest probability of success?</p>
<p>In such an example, based on our knowledge of the use of the system, we estimate that there are ten times the number of records for paths between Baby to Deceased using the Person table as without. Taking this into account, we almost assuredly are retrieving the right result set for social security calculations. Then, for the remaining ten percent, we offer the option to &#8220;trim&#8221; the Person entity from our query.</p>
<p>Additionally, what the system hasn&#8217;t exposed here is the semantic relationship the surmised from the entities provided. Perhaps the results <i>were</i> appropriate for what was provided, just not what was expected. This is the second tool we must produce: a means of exposing to the user our presumption of the semantic meaning of their query. This is, admittedly, less for our system to act upon than to influence what the user will input next, or perhaps withdraw and try again.</p>
<p>By now it might sound familiar to problems faced in graph theory. At the moment, there are two that I can think of which aptly fit into this scenario: maximal flow and minimal cut. Both are incredibly annoying problems with surprisingly low-tech solutions. They also both make use of our mathematical model tool we prescribed earlier. An improvement to this theory which deserves its own article will be proposed at the end of the article.</p>
<p>Luckily, there are means to do all of these things when given a well thought-out framework. Semantic ties can be stored within the framework and the mathematical model can be derived quickly from the data via a few SQL queries. (I already anticipate the cries of outrage over additional SQL queries, but those drawbacks will be addressed in the conclusion; so please, save your flames until the end of the series.)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.adventdigerati.com/2008/12/dynamic-sql-act-iii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dynamic-SQL Act I</title>
		<link>http://blog.adventdigerati.com/2008/11/dynamic-sql-act-i/</link>
		<comments>http://blog.adventdigerati.com/2008/11/dynamic-sql-act-i/#comments</comments>
		<pubDate>Tue, 25 Nov 2008 07:53:16 +0000</pubDate>
		<dc:creator>Zack</dc:creator>
				<category><![CDATA[Theory]]></category>
		<category><![CDATA[Practicum]]></category>

		<guid isPermaLink="false">http://blog.adventdigerati.com/?p=14</guid>
		<description><![CDATA[Sometimes I wonder if I ever learned anything in my collegiate Computer Science classes. After all, most (whom I&#8217;ve heard) would say that, unless you&#8217;re going to be developing The Next Big Thing, then you&#8217;re wasting valuable time and money on cheap beer and expensive lectures. My father always said that &#8220;If you want to [...]]]></description>
			<content:encoded><![CDATA[<p>Sometimes I wonder if I ever learned anything in my collegiate Computer Science classes. After all, most (whom I&#8217;ve heard) would say that, unless you&#8217;re going to be developing The Next Big Thing, then you&#8217;re <i>wasting</i> valuable time and money on cheap beer and expensive lectures. My father always said that &#8220;If you want to party, go to college; if you want an education, get a job.&#8221; This, for some, may hold true. The expensive lectures I was no stranger to; the cheap beer, however, I tried hard not to touch with a 39 &#189; foot pole.</p>
<p>But, no matter how dumb you play, something seeps in. That&#8217;s how you weed good teachers from the mediocre ones: they can disseminate knowledge without you even knowing it. They&#8217;re kind of like God, in a way; sometimes the vague answers and delayed responses aren&#8217;t intended as insults or shirking, it&#8217;s a device to make you think and learn for yourself. Sometimes, when you think you need a helicopter to save you, a properly thrown life vest will do just fine.</p>
<p>While at Pittsburgh, I had a tough-as-nails professor for my algorithms class. I spent so many nights compiling Java code until 3AM when my throat was sore from too much tea and my eyes bled zeros and ones, but I got the programs working to spec and in on time. It was, for all intents and purposes, a trial by fire<sup><a href="#1">1</a></sup>. At the end of it, I thought I would forget everything and never use an iota of what it tought me for anything practical in my career. This view was incredibly, humerously, short-minded.</p>
<p>For a while, it was correct. Still, something lingered, and I should be glad it did. What remained was a desire to apply what I&#8217;d learned to what already existed. Solving old problems with more efficient solutions is always a challenge. It&#8217;s why neural networks and packet routing have evolved. But with these challenges comes personal and professional rewards, not the least of which is the ability to re-use the mental framework for the problem solved.</p>
<p>One of my least-favorite problems was graph search. (There&#8217;s a reason no one but mathematicians specialize in developing, proving, or otherwise entrenching themselves in graph theory.) Yet, graph searching is one of the most widely-applicable skills a software architect can develop. Case in point: dynamic SQL construction.</p>
<p>As a mental exercise in theory and practice, there are several parts to this post, interleaved with time for mental stretching, retractions, and analyses &amp; comments. (This is also no coincidence, as for those literary-educated readers the scaffolding is of the classical drama; enjoy.) This is <b>Act I: Exposition</b>.</p>
<p>In my experiment, there are three factors:
<ul>
<li>tree complexity,</li>
<li>semantic-path evaluation, and</li>
<li>reasonable application to graph theory.</li>
</ul>
<p> Tree complexity is the time and effort required to maneuver &#8216;blindly&#8217; from one entity to another, 2-hop-away, entity in a database. Semantic-path evaluation is the real-world implication of the statement&#8217;s conjoined entities. For instance, using the tables Painter, Plumber, and Person, a Person can become a Painter or a Plumber but each has a specific role and though both may use water they may not be what we intended to achieve. Without predefining rules, the system will have to build an assumption based on the entities provided. Lastly, while possibly obvious, the application to graph theory may need to be spelled out; this will probably be spent the least time developing.</p>
<p>If you can think of anything I&#8217;ve missed or misunderstood, constructive criticizm is encouraged! Act II: WYSIWYG will hopefully follow soon.</p>
<p><sup><a name="1">1</a></sup>Taking the class alone isn&#8217;t the Pitt CS Trial by Fire. Taking 1520 and 1550 <i>in the same semester</i> is. To exit both classes with B&#8217;s was a personal accomplishment, as well as bragging rights.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.adventdigerati.com/2008/11/dynamic-sql-act-i/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Lost in Translation</title>
		<link>http://blog.adventdigerati.com/2008/11/lost-in-translation/</link>
		<comments>http://blog.adventdigerati.com/2008/11/lost-in-translation/#comments</comments>
		<pubDate>Thu, 06 Nov 2008 06:01:22 +0000</pubDate>
		<dc:creator>Zack</dc:creator>
				<category><![CDATA[Philosophy]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Practicum]]></category>

		<guid isPermaLink="false">http://adventtechnorati.wordpress.com/?p=40</guid>
		<description><![CDATA[As a programmer, if you&#8217;ve ever been tasked with migrating any system from one implementation to another, then you have undoubtedly ran aground on technical issues ranging from missing or underperforming data structures, inefficient algorithms, or a combination of these and any number of other issues. It doesn&#8217;t matter if it&#8217;s merely going from one [...]]]></description>
			<content:encoded><![CDATA[<p>As a programmer, if you&#8217;ve ever been tasked with migrating any system from one implementation to another, then you have undoubtedly ran aground on technical issues ranging from missing or underperforming data structures, inefficient algorithms, or a combination of these and any number of other issues. It doesn&#8217;t matter if it&#8217;s merely going from one language to another or across platforms, the inevitability of technical conundrums is inescapable.</p>
<p>This is not to say, however, that they are insurmountable. Often, in fact, when we stop trying to over-engineer our system and evaluate the situation as it is, we can make optimizations beyond our expectations. As a simple &#8220;for instance,&#8221; presuming we have a determinant for a conditional that is initially a free-text entry. According to this pretense, Boolean evaluation can take as little as the first byte in the string or as much as the full text of the string; thus, for sake of computation time, memory, and most of all maintainability, it should be avoided at high cost. Compare this with replacing this free-text with a numerically-indexed list of choices and the Boolean evaluation drops to a static value. (Even better, most implementations of bit-wise integer comparison are executed as close to machine code as possible.)</p>
<p>But, inevitably, there are cases which solutions such as these are not so prevalent or obvious. <i>For instance</i>, when implementing join-context SQL conditionals as PHP, it can take a tremendous amount of derived and out of band knowledge to perform the translation. Combine this with already complex logic, (nested XORs, negated string comparisons, and cross-table lookups), and the code can get slow and ugly very fast. So what do you do as an engineer with an email, the SQL, and a pat on the back? Get a game plan.</p>
<p>It&#8217;s more important to pencil in a strategy for defining your criteria than going off of pre-existing assumptions. For one measure, repeated calculations in the original may be consolidated as a single conditional whose value is stored and later addressed; the processing efficiency alone is worth the change when scaling up to enterprise-level datasets. Additionally, as I stated above, changing data types of pre-existing conditionals can be a great boon as well, and performing integer arithmetic is <i>always</i> faster than <code>strcmp</code>.</p>
<p>Once the parameters are defined, we zoom out to observe the algorithm. Keeping in mind the practice degrades maintainability, nesting some repeated conditionals can save processing power down the line. But don&#8217;t get nesting-happy; (especially with code you&#8217;re simply translating and didn&#8217;t have the mental inception for) you&#8217;ll forget why two conditionals had been nested or why their order mattered so much. This is where your formal logic class enters the picture. Class, what is {A, B, C, D} &amp; {A, B, C}? Of course it&#8217;s {A, B, C}; it&#8217;s also &not;{D}. The optimization, however slight, of changing
<pre><code>if($var == A OR $var == B OR $var == C) { something_true(); }</code></pre>
<p> to
<pre><code>if($var != D) { something_true(); }</code></pre>
<p> may not increase performance by leaps and bounds, but if you&#8217;re deep in the code anyway why wouldn&#8217;t you shave off the time?</p>
<p>Now, after the code is written and tested, there is much rejoicing. The only thing we now have to contend with is if the translation needs to change. And while we may not, (and hopefully will not), go back to square-one with our evaluation, we should at least take the time to consider where we may have gone wrong in our previous implementations and where we can continue to go right.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.adventdigerati.com/2008/11/lost-in-translation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
