<?xml version="1.0"?>
<rss version="2.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:yt="http://gdata.youtube.com/schemas/2007" xmlns:atom="http://www.w3.org/2005/Atom">
   <channel>
      <title>Max Guernsey, III</title>
      <description>An aggregation of all my feeds.</description>
      <link>http://pipes.yahoo.com/pipes/pipe.info?_id=3e1fedc3e1ca771e70d1d51b261fc8ac</link>
      <atom:link rel="next" href="http://pipes.yahoo.com/pipes/pipe.run?_id=3e1fedc3e1ca771e70d1d51b261fc8ac&amp;_render=rss"/>
      <pubDate>Thu, 01 Oct 2015 23:14:07 +0000</pubDate>
      <generator>http://pipes.yahoo.com/pipes/</generator>
      <item>
         <title>A viable stand-in for every free-form poem</title>
         <link>http://maxg3prog.blogspot.com/2014/09/a-viable-stand-in-for-every-free-form.html</link>
         <description>He fired an electric beagle at her.&lt;br /&gt;&lt;br /&gt;Oh no! &amp;nbsp;Cumulus hairballs in a Tycho lace hack!&lt;br /&gt;&lt;br /&gt;It was too late to return the pancakes.</description>
         <author>Max Guernsey</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-921062121031970663</guid>
         <pubDate>Fri, 26 Sep 2014 20:48:00 +0000</pubDate>
      </item>
      <item>
         <title>Sentio Ergo Sum</title>
         <link>http://maxg3prog.blogspot.com/2014/09/sentio-ergo-sum.html</link>
         <description>My friend and current boss, &lt;a rel=&quot;nofollow&quot; class=&quot;g-profile&quot; target=&quot;_blank&quot; href=&quot;https://plus.google.com/115700775213425167492&quot;&gt;Al Shalloway&lt;/a&gt;, has been talking with be about &lt;i&gt;cogito ergo sum&lt;/i&gt;&amp;nbsp;for a little while, now.&lt;br /&gt;&lt;br /&gt;While I think the &lt;i&gt;ergo sum&lt;/i&gt;&amp;nbsp;part is the critical insight - the recognition that your knowledge is limited to your own existence - he's been debating the &lt;i&gt;cogito&lt;/i&gt;&amp;nbsp;part.&lt;br /&gt;&lt;br /&gt;The assertion I think he's making is that you don't think. &amp;nbsp;I don't know if I agree but I definitely have become convinced that you don't &lt;i&gt;know&lt;/i&gt;&amp;nbsp;you think.&lt;br /&gt;&lt;br /&gt;You do, however, know that you experience. &amp;nbsp;At least, I know that I do. &amp;nbsp;Moreover, I &lt;i&gt;don't&lt;/i&gt;&amp;nbsp;know anything else.&lt;br /&gt;&lt;br /&gt;So I wonder if the &lt;i&gt;sentio ergo sum&lt;/i&gt; is a more appropriate declaration. &amp;nbsp;It still contains the essential assertion underpinning all reason: that we basically don't know anything. &amp;nbsp;It's actually a stronger statement of that fact.</description>
         <author>Max Guernsey</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-3971053623294203404</guid>
         <pubDate>Tue, 09 Sep 2014 21:00:00 +0000</pubDate>
      </item>
      <item>
         <title>Cogito Ergo Sum</title>
         <link>http://maxg3prog.blogspot.com/2014/09/cogito-ergo-sum.html</link>
         <description>&lt;h3&gt;First, I'll Rant About How Crazy People Are...&lt;/h3&gt;If you're one of those people who is insane but can't face it so you call my ideas nuts, you might want to skip this section. &amp;nbsp;You know who you are (but can't admit it).&lt;br /&gt;&lt;br /&gt;When I learned about Descartes's discovery. &amp;nbsp;I learned from someone who understood what it really meant.&lt;br /&gt;&lt;br /&gt;I'm referring, of course, to the discovery he made that mattered most, not all his contributions to mathematics. &amp;nbsp;His mathematical contributions were great but, next to his philosophical contributions, they are a mouse fart on the Yellowstone Caldera.&lt;br /&gt;&lt;br /&gt;It has come to my attention that there are some insane people who have interpreted &quot;cogito ergo sum&quot; as the foundation of all knowledge. &amp;nbsp;This is false. &amp;nbsp;That discovery is the root of all doubt.&lt;br /&gt;&lt;br /&gt;The fact that the only knowledge you truly have is that there is an observing thing doing something you call &quot;thinking&quot; that you call &quot;I&quot; means that everything else you call &quot;knowledge&quot; is actually just a well-supported guess.&lt;br /&gt;&lt;br /&gt;It doesn't matter if this was his intent. &amp;nbsp;This is the correct interpretation of his findings and it is why he won philosophy regardless of what he meant.&lt;br /&gt;&lt;br /&gt;It sure looks to me like he meant the right thing but there's no point in arguing with someone over what a dead guy meant. &amp;nbsp;If you don't believe me just go count up all the Christians who think they can use the words of the most world's most famous pacifist to justify war. &amp;nbsp;So I'll just say that the right interpretation is the right interpretation and move on to my real point.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Doubt as an Exploratory Tool&lt;/h3&gt;The tool Descartes used, as I recall it, to arrive at his critical discovery is a powerful tool and I don't think it's done all the work it can.&lt;br /&gt;&lt;br /&gt;First, let me introduce a similar tool I first heard of by reading the Heath brothers book, &lt;i&gt;Decisive&lt;/i&gt;. &amp;nbsp;One of the thought-tools they suggest for widening your options is a mental game called &quot;the vanishing-options genie.&quot; &amp;nbsp;In this game, you pretend that you have a reverse genie following you around taking away options (rather than granting wishes).&lt;br /&gt;&lt;br /&gt;I've seen this tool help people break out of narrow-frames of reference when making decision. &amp;nbsp;It's very effective.&lt;br /&gt;&lt;br /&gt;That got me thinking, can we use a great Deceiver to do the same thing with our analyses? &amp;nbsp;So often, I find that humans (myself included) want to stick to what they know.&lt;br /&gt;&lt;br /&gt;We start with a thought and say &quot;Is this true?&quot; &amp;nbsp;Sometimes we say &quot;How might this be wrong?&quot; &amp;nbsp;Either way, we're starting with a point-of-reference that shapes subsequent thoughts and actions.&lt;br /&gt;&lt;br /&gt;One tool that helps me is to use Descartes's omnipotent deceiver as a stand-in for the vanishing-options genie; instead of being a vanishing-options genie, it's a vanishing-assumptions genie.&lt;br /&gt;&lt;br /&gt;Basically, when you are trying to understand why something works the way it does, take something you know to be true and assume it's actually one of the Deceiver's illusions.&lt;br /&gt;&lt;br /&gt;I find this helps me branch out and consider alternative interpretations more readily.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Implementation&lt;/h3&gt;In case my previous suggestion was too abstract, I'll throw some examples in here. &amp;nbsp;The examples of knowledge to abandon are just placeholders; you'll need to pick stuff relevant to whatever you are considering. &amp;nbsp;The examples of kinds of replacements are probably reusable.&lt;br /&gt;&lt;br /&gt;One way to do this is to replace the &quot;illusion&quot; with a &quot;truth&quot; - an alternate reason why something works the way it does. &amp;nbsp;For instance, you could say &quot;it's not going faster than the speed of light, it's just going back in time.&quot; &amp;nbsp;Or, if you're one of the nutjobs who already believes that kind of crap, flip it around and see what happens.&lt;br /&gt;&lt;br /&gt;Another option is to replace the &quot;illusion&quot; with an admission of ignorance. &amp;nbsp;Instead of &quot;pull works because it aligns the efforts of many people toward a single goal and organizes their work in a delay-minimizing order toward achieving that goal.&quot; &amp;nbsp;You can just say &quot;I don't know why pull works.&quot;&lt;br /&gt;&lt;br /&gt;A third option is to replace an &quot;illusion&quot; with an assertion of illusion. &amp;nbsp;Replace &quot;gas makes the car go&quot; with &quot;gas doesn't make the car go, something else does&quot; and see what happens.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Try It...Or Don't&lt;/h3&gt;It works for me and it works for other people. &amp;nbsp;Try it and see what happens. &amp;nbsp;You know...or don't try it and don't see what happens.</description>
         <author>Max Guernsey</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-6706280998007585323</guid>
         <pubDate>Sun, 07 Sep 2014 13:55:00 +0000</pubDate>
      </item>
      <item>
         <title>All malaria is saying...</title>
         <link>http://maxg3prog.blogspot.com/2014/07/all-malaria-is-saying.html</link>
         <description>&lt;p dir=&quot;ltr&quot;&gt;...is give peace a chance!&lt;/p&gt;</description>
         <author>Max Guernsey</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-6922372227299382172</guid>
         <pubDate>Thu, 17 Jul 2014 20:32:00 +0000</pubDate>
      </item>
      <item>
         <title>Sitting in Ringo Starr Concert</title>
         <link>http://maxg3prog.blogspot.com/2014/07/sitting-in-ringo-starr-concert.html</link>
         <description>&lt;p dir=&quot;ltr&quot;&gt;I'm sitting in the a Ringo Starr concert in Bend, OR and realizing that the Boomer's greatest achievement is not completely reversing six thousand years worth of advancement.&lt;/p&gt;&lt;p dir=&quot;ltr&quot;&gt;Way to go guys.&amp;nbsp; You barely didn't do it!&lt;/p&gt;</description>
         <author>Max Guernsey</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-2554374740779935032</guid>
         <pubDate>Thu, 17 Jul 2014 20:00:00 +0000</pubDate>
      </item>
      <item>
         <title>Canceling my iContact account</title>
         <link>http://maxg3prog.blogspot.com/2014/07/canceling-my-icontact-account.html</link>
         <description>All these people who talk about how hard it is to cancel their iContact accounts... I don't know what they are talking about.&lt;br /&gt;&lt;br /&gt;My cancellation was a two-step process:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Send them an email informing them that I wish to cancel.&lt;/li&gt;&lt;li&gt;Confirming that I wanted to cancel when they asked if I was sure.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;My total investment in the entire process was less than forty-five seconds. &amp;nbsp;The cycle time on the process was about ten hours, most of which were during the night-time.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Maybe there are some circumstances where it is hard to cancel with them but I certainly didn't experience it. &amp;nbsp;All in all, I was happy with the service they provided. &amp;nbsp;I would recommend it to anyone who needs to build and maintain that kind of mailing list.&lt;/div&gt;</description>
         <author>Max Guernsey</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-4668784744671484045</guid>
         <pubDate>Thu, 10 Jul 2014 12:06:00 +0000</pubDate>
      </item>
      <item>
         <title>The Fermi Paradox is ridiculous</title>
         <link>http://maxg3prog.blogspot.com/2014/07/the-fermi-paradox-is-ridiculous.html</link>
         <description>If it serves a purpose, it is just to illustrate Man's hubris. &amp;nbsp;There are so many fallacious assumptions and assertions in every version of it that I've heard. &amp;nbsp;It's not even worth debunking.&lt;br /&gt;&lt;br /&gt;I know the Fermi Paradox is all the rage, right now. &amp;nbsp;Please, people, try to retain a little intellectual dignity when evaluating this kind of garbage.</description>
         <author>Max Guernsey</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-1593370815339551967</guid>
         <pubDate>Tue, 01 Jul 2014 22:07:00 +0000</pubDate>
      </item>
      <item>
         <title>We Don't Need Campaign Finance Reform, We Need Campaign Audience Reform</title>
         <link>http://maxg3prog.blogspot.com/2014/04/we-dont-need-campaign-finance-reform-we.html</link>
         <description>People bitch about campaign money all the time. &amp;nbsp;An argument that is regularly made can be paraphrased as follows:&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;The campaign with the most money can buy the most votes so we need to modify how people get funded to ensure their interests align with the people's.&lt;/blockquote&gt;This is a specious argument. &amp;nbsp;The problem is not that we must control who has the money to buy the opinion of the voting public so that the right opinion is bought. &amp;nbsp;The problem is that we let people vote who are so easily influenced that an insubstantial, 30-second advertisement can change the course of their actions.&lt;br /&gt;&lt;br /&gt;Think about it. &amp;nbsp;Is it really reasonable that someone who, essentially, votes in accordance with the last advertisement they happened to hear should be given the power to choose who lives and who dies? &amp;nbsp;Of course it isn't.&lt;br /&gt;&lt;br /&gt;...and don't kid yourself. &amp;nbsp;That's nothing short of what voting is: the power to kill someone who disagrees with your choices strongly enough to not comply. &amp;nbsp;Sure, it's filtered through dozens of layers of indirection - judges, juries, laws, cops, &lt;i&gt;et cetera&lt;/i&gt; - but that doesn't make voting any less what it is: the power to compel under threat of death.&lt;br /&gt;&lt;br /&gt;Most people - even really, really stupid people - would agree that one guy shouldn't be allowed to take whatever he wants and kill whomever tries to stop him. &amp;nbsp;Nearly one-hundred percent of that group would agree that the power should no more be granted to two or twenty such people.&lt;br /&gt;&lt;br /&gt;In fact, the public response to organized crime - groups of people who compel under (ultimately) the threat of death - seems to indicate that many of us have an implicit grasp on the non-linear nature of this kind of problem. &amp;nbsp;That is, everyone seems to know that two thugs are a little more that twice as bad as one thug. &amp;nbsp;Most of us know that a large organization that takes what it wants and kills those who try to stop it is a really dangerous, bad, and - dare I level a value judgment? - &lt;i&gt;evil&lt;/i&gt;&amp;nbsp;thing.&lt;br /&gt;&lt;br /&gt;So why is a group of four-hundred million people doing the same thing somehow magically better? &amp;nbsp;Why do we care about the opinion of someone who just wants to vote themselves money? &amp;nbsp;Their vote certainly shouldn't count. &amp;nbsp;Why do we care about the opinion of someone who is persuaded by arguments like &quot;Yuh-huh!&quot; and &quot;Nuh-uh!&quot;? &amp;nbsp;Isn't that person's opinion noise at best and, at worst, and amplifier for the person who can buy the most ad-space in their field of view?&lt;br /&gt;&lt;br /&gt;My dad likes to complain about how we live in a marketing-driven economy. &amp;nbsp;We all see some huge number of advertisements every day. &amp;nbsp;Corporations are using those ads to drive people's behavior.&lt;br /&gt;&lt;br /&gt;How the hell is that the corporations' fault? &amp;nbsp;You see the ads. &amp;nbsp;You choose how (or, I guess in some people's cases, whether or not) to interpret them. &amp;nbsp;If you elect to be a subject of the media's sway, that doesn't make the corporation at fault. &amp;nbsp;It's &lt;i&gt;your&lt;/i&gt;&amp;nbsp;fault.&lt;br /&gt;&lt;br /&gt;If I was playing chess with you, you'd not fault me for exploiting an enormous opening you left me, would you? &amp;nbsp;It's no more wrong for a company to exploit the weak minds of its potential buyers. &amp;nbsp;It's no more wrong for a politician to buy an ad spot that says there's no proof his opponent &lt;i&gt;isn't&lt;/i&gt;&amp;nbsp;a lizard man who worships the devil and eats puppies. &amp;nbsp;It's no more wrong for a major lobby group to fund that ad.&lt;br /&gt;&lt;br /&gt;If there is any fault to be assigned - and, given the current state of affairs, I believe there is - it must be on the people who are influenced by such things. &amp;nbsp;If someone is too simple to vote properly, it is their own fault, not the fault of the people who take advantage of that fact.&lt;br /&gt;&lt;br /&gt;A simple thought experiment can demonstrate this. &amp;nbsp;Imagine this scenario:&lt;br /&gt;&lt;br /&gt;Ninety-nine percent of the voting public bases their decisions on their own thoughts. &amp;nbsp;That is, they take their own experiences, values, and judgments and synthesize a model of the world then base decisions on that model. &amp;nbsp;One politician's promises and track record jives with the model developed by fifty-five percent of those thinking voters - more than half of all voters. &amp;nbsp;His opponent has ten times as much funding but they both have enough funding to reach basically all of the potential voters. &amp;nbsp;Who's going to win in that scenario?&lt;br /&gt;&lt;br /&gt;Naturally, it would be the person whom the thinking people believe will accomplish what they want accomplished.&lt;br /&gt;&lt;br /&gt;Now flip it around. &amp;nbsp;One percent of the population thinks and the remainder votes in accordance with the number of advertising dollars to which they've been exposed. &amp;nbsp;In such a case, funding would be almost the only thing that matters. &amp;nbsp;If you imagine the same funding bias, it's pretty obvious who is most likely to win that election.&lt;br /&gt;&lt;br /&gt;Both cases have a huge funding bias but only one has a corrupted election, the one where corrupt and weak people are allowed to vote.&lt;br /&gt;&lt;br /&gt;We don't need better campaign financing rules. &amp;nbsp;We don't need better rules around advertisements. &amp;nbsp;We just need to start taking responsibility for our actions - including the act of voting - and peeling off the mantle of power the sticky fingers of anyone who can't or won't do that.</description>
         <author>Max Guernsey</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-2581858709938673653</guid>
         <pubDate>Wed, 23 Apr 2014 20:55:00 +0000</pubDate>
      </item>
      <item>
         <title>Another Generally Positive Review for Test-Driven Database Development</title>
         <link>http://maxg3prog.blogspot.com/2014/04/another-generally-positive-review-for.html</link>
         <description>I would be a fool to think that my first book would receive only positive feedback. &amp;nbsp;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://bit.ly/R5ZNvu&quot;&gt;This review&lt;/a&gt;, I think, is excellent. &amp;nbsp;I like it for three reasons:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;My own self-interest&lt;/li&gt;&lt;li&gt;The reviewer clearly understood what he was reviewing&lt;/li&gt;&lt;li&gt;It contains actionable criticisms that will benefit a 2nd edition, if there is one&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;Vanity of the Database Authors&lt;/h2&gt;&lt;div&gt;Mr. Carlson's review is, I think, generally positive. &amp;nbsp;This means that it will cause more people to buy my book, which is nice. &amp;nbsp;It also means that it fans the flames of my own vanity, which is really nice. &amp;nbsp;Most importantly, though, it means that more people are likely to actually &lt;i&gt;read&lt;/i&gt;&amp;nbsp;my book which, in turn, means more people are likely to take a sane approach to database development.&lt;/div&gt;&lt;h2&gt;Deep Understanding&lt;/h2&gt;&lt;div&gt;The author of the review in question clearly took the time to read, understand, and evaluate the concepts in my book. &amp;nbsp;I think a lot of people who buy books do this but, for some reason, only about half of people who write reviews appear to do it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Mr. Carlson didn't necessarily understand all of my motivations or what I know about outside the scope of &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://bit.ly/tdd-db&quot;&gt;Test-Driven Database Development: Unlocking Agility&lt;/a&gt; but... hey... who's fault is that? &amp;nbsp;Right?&lt;/div&gt;&lt;h2&gt;Actionable Criticisms&lt;/h2&gt;&lt;div&gt;Not everything Mr. Carlson has to say is positive but those bits which are negative are highly actionable. &amp;nbsp;He says I give the appearance of not understanding normalization. &amp;nbsp;I do understand how to do it and why people do it in addition to why it actually &lt;i&gt;should&lt;/i&gt; be done. &amp;nbsp;However, looking back, I can see how someone might get the impression I don't if they were basing their opinion solely on my book. &amp;nbsp;In the 2nd edition, I will remedy that by adding material that addresses those kinds of concepts.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Likewise, he makes the point that I don't address object-relational-mapping at all. &amp;nbsp;He rightly guessed that it is because ORM runs contrary the message I send - databases as instances of classes with tightly-controlled and rigorously-tested sets of exposed behaviors. &amp;nbsp;Nevertheless, his argument is that ORM is a very popular concept in designing interactions with databases is true. &amp;nbsp;If I ever get to do a second edition, which I happily think I might, and ORM is still popular, which I sadly believe it may be, then I will address it at that time.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I may address those concepts sooner, too, in the form of blog entries or articles.&lt;/div&gt;</description>
         <author>Max Guernsey</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-5125659915952764363</guid>
         <pubDate>Thu, 10 Apr 2014 08:19:00 +0000</pubDate>
      </item>
      <item>
         <title>Being a Jerk Is Only the Beginning!</title>
         <link>http://maxg3prog.blogspot.com/2014/04/being-jerk-is-only-beginning.html</link>
         <description>It occurred to me while I was writing &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://maxg3prog.blogspot.com/2014/04/technical-leadership-is-leadership.html&quot;&gt;yesterday's entry&lt;/a&gt;. &amp;nbsp;That there is a cute little play on words to be had. &amp;nbsp;I wrote this post then and couldn't resist posting it today when the word &quot;jerk&quot; is flying around like hail in a windstorm.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;I'm a Big Jerk&lt;/h2&gt;In physics, jerk is the 3rd derivative of position over time. &amp;nbsp;That is, velocity is the derivative of position, acceleration the derivative of velocity, and jerk is the derivative of acceleration.&lt;br /&gt;&lt;br /&gt;In business, if you allow yourself an analogy between value-delivered and position, then some interesting parallels become apparent. &amp;nbsp;Your product would be analogous to velocity, as it is what continuously delivers more value. &amp;nbsp;Developers would then be agents of acceleration - constantly working to improve the product and increase velocity of value-delivered.&lt;br /&gt;&lt;br /&gt;It would follow that technical leaders who take an interest in developing the skills of those around them would be agents of jerk - working to improve the rate of acceleration.&lt;br /&gt;&lt;br /&gt;So yes, I am a jerk. &amp;nbsp;For the last eight or so years, it's been my primary objective to be a big jerk.&lt;br /&gt;&lt;br /&gt;At long last, I can wear the label with pride. &amp;nbsp;Who am I kidding. &amp;nbsp;I've always worn it with pride.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;To Jerkdom and Beyond!&lt;/h2&gt;Sometimes, though, I'd like to think I'm more than a mere jerk. &amp;nbsp;The fourth derivative of position over time is called &quot;jounce.&quot;&lt;br /&gt;&lt;br /&gt;Lately, I've not been as interested in being a jerk. &amp;nbsp;I've wanted to grow beyond that role and jounce seems like just the ticket. &amp;nbsp;What exactly would parallel that in the software development world?&lt;br /&gt;&lt;br /&gt;I think a good analogy is leader-making.&lt;br /&gt;&lt;br /&gt;As I get older and wiser, I take more of an interest (and show more aptitude) in developing new technical leaders. &amp;nbsp;Not that I'm anywhere near the level of&amp;nbsp;&lt;a rel=&quot;nofollow&quot; class=&quot;g-profile&quot; target=&quot;_blank&quot; href=&quot;https://plus.google.com/115700775213425167492&quot;&gt;Al Shalloway&lt;/a&gt;&amp;nbsp;or&amp;nbsp;&lt;a rel=&quot;nofollow&quot; class=&quot;g-profile&quot; target=&quot;_blank&quot; href=&quot;https://plus.google.com/116028739193766539535&quot;&gt;Scott Bain&lt;/a&gt;, both of whom I consider to be my mentors,&amp;nbsp;but I am starting to gain some traction nonetheless.&lt;br /&gt;&lt;br /&gt;So, every once in a little while, in addition to being a big jerk, I'm a little jounce but, over time, I'd like to get more jouncy and less jerky.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Orthogonal Kinds of Growth&lt;/h2&gt;Anyway, it occurred to me that this is the real ladder of skill to climb. &amp;nbsp;Sure, having a better product is good but having a sustainable way of making it better is better. &amp;nbsp;Sure, having a sustainable way of improving a product is good but having an accelerating way of improving it is better. &amp;nbsp;You get the idea.&lt;br /&gt;&lt;br /&gt;Being an expert developer is good and important but it is not the end of the journey. &amp;nbsp;There are other kinds of learning that are very important.&lt;br /&gt;&lt;br /&gt;Going from being an okay developer to being a good developer is mostly a matter of practice and study. &amp;nbsp;Going from being any kind of developer to any kind of leader is a qualitative change.&lt;br /&gt;&lt;br /&gt;At least, for me, it was. &amp;nbsp;It required (requires?) a fundamental shift in how I think about and interact with people and in what kind of problems I consider. &amp;nbsp;Going from being a leader to helping develop leaders probably requires just as big a leap but I'm so new to it that I can't really say.&lt;br /&gt;&lt;br /&gt;Here is a handy picture I composed illustrating the distinction between &lt;i&gt;kinds&lt;/i&gt;&amp;nbsp;of skill and &lt;i&gt;level&lt;/i&gt;&amp;nbsp;of skill within an organization.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://3.bp.blogspot.com/-YPBaXQMOh-8/U0QiwgXcaeI/AAAAAAAAAms/WnyI0exz4dw/s1600/LeadershipSkillMatrix.jpg&quot; style=&quot;margin-left:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-YPBaXQMOh-8/U0QiwgXcaeI/AAAAAAAAAms/WnyI0exz4dw/s1600/LeadershipSkillMatrix.jpg&quot; height=&quot;360&quot; width=&quot;640&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Planning Ahead&lt;/h2&gt;So, if you're a young developer and setting goals for yourself, you might want to consider that there is more than one dimension to your growth. &amp;nbsp;You can (and will need to) make yourself a competent programmer but you can do the most good by going from being a good programmer, to a leader, to a leader-maker.&lt;br /&gt;&lt;br /&gt;If you work hard, maybe one day you can become a big jerk like me. &amp;nbsp;I'll do my best to be a bigger jerk by the time you get there and, if I'm lucky, I'll be more than just a big jerk too.</description>
         <author>Max Guernsey</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-8108159729230052226</guid>
         <pubDate>Tue, 08 Apr 2014 08:51:00 +0000</pubDate>
         <media:thumbnail height="72" url="http://3.bp.blogspot.com/-YPBaXQMOh-8/U0QiwgXcaeI/AAAAAAAAAms/WnyI0exz4dw/s72-c/LeadershipSkillMatrix.jpg" width="72" xmlns:media="http://search.yahoo.com/mrss/"/>
      </item>
      <item>
         <title>Technical Leadership Is Leadership</title>
         <link>http://maxg3prog.blogspot.com/2014/04/technical-leadership-is-leadership.html</link>
         <description>Being a technical leader can involve a number of challenges. &amp;nbsp;Between outside forces, long- and short-term pressures, legacy systems, and complex problems an architect, lead developer, or development manager has a lot on his plate.&lt;br /&gt;&lt;br /&gt;Many of the most skilled programmers are comfortable with those kinds of challenges. &amp;nbsp;For a lot of technical people that's the &lt;i&gt;only&lt;/i&gt;&amp;nbsp;kind of problem with which you are comfortable. &amp;nbsp;Whether, like me, you are arrogant and demanding or, like many others, you are shy and reserved, there is a decent chance that you don't count people skills among your strongest.&lt;br /&gt;&lt;br /&gt;Yet the technical challenges only represent half of the problems facing a technical leader. &amp;nbsp;To be truly effective, you have to be a leader of people in addition to a setter of technical direction. &amp;nbsp;That is, unless you want to do everything yourself.&lt;br /&gt;&lt;br /&gt;I'm not saying that every kind of management problem necessarily rests on the shoulders of a technical leader. &amp;nbsp;I do believe, however, that empowering the people you work with to make better technical decisions on their own will have an enormous impact on your &lt;i&gt;effectiveness as&lt;/i&gt; a technical leader.&lt;br /&gt;&lt;br /&gt;For instance, I recently wrote an article for InformIT that touches on the subject, entitled&amp;nbsp;&lt;i&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://bit.ly/arch-encapsulation&quot;&gt;Five Ways to Optimize Encapsulation in Your Software Architecture&lt;/a&gt;&lt;/i&gt;. &amp;nbsp;In most scenarios, every single step requires someone to not just be a leader in the area of design and architecture but also a leader of men.&lt;br /&gt;&lt;br /&gt;For me, this is the biggest kind of challenge available in the software world. &amp;nbsp;It's hard and rewarding. &amp;nbsp;Sure, there are things that are harder - like trying to maintain really terrible legacy code - but those things aren't as rewarding because so little is accomplished in exchange for so much energy. &amp;nbsp;There are areas where I have more success - like maintaining code that was written the modern way - but that's not as rewarding because so little energy was exchanged for the benefit obtained.&lt;br /&gt;&lt;br /&gt;Building up people's skills, guiding them, helping them grow, and influencing their decision making meets all my challenge criteria. &amp;nbsp;At least, it does now that I've become interested in that level of challenge. &amp;nbsp;It requires patience, understanding, and a close approximation of empathy - things that don't come easily to me. &amp;nbsp;On the other hand, in exchange for the enormous effort involved, you get enormous value.&lt;br /&gt;&lt;br /&gt;The worst likely case is that you fail and nothing happens. &amp;nbsp;In the software industry, that's actually a pretty good bad scenario. &amp;nbsp;Once you develop your mentoring and leadership skills, the most likely case is that you will permanently modify how effective someone is as a programmer, building up a portfolio of recurring dividends over time. &amp;nbsp;Sometimes, you will help someone else become a true technical leader, improving the rate at which dividends are increased.&lt;br /&gt;&lt;br /&gt;The rate of return on this kind of effort is very, very high. &amp;nbsp;For most of us, there's nothing more rewarding than hard work with a high rate of return. &amp;nbsp;So, the next time you're considering your position as a technical leader, try to think about how much time you spend leading people not just products.</description>
         <author>Max Guernsey</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-9210766014295275291</guid>
         <pubDate>Mon, 07 Apr 2014 08:50:00 +0000</pubDate>
      </item>
      <item>
         <title>Referencing Concepts from Presentations</title>
         <link>http://maxg3prog.blogspot.com/2014/02/referencing-concepts-from-presentations.html</link>
         <description>I've been delivering shorter presentations of late. &amp;nbsp;To keep things compact, I've been experimenting with just saying &quot;I'm assuming you're familiar with these things. &amp;nbsp;If not, there are resources to help you with them.&quot;&lt;br /&gt;&lt;br /&gt;For audiences that do know the things called out as assumptions, this has worked really well. &amp;nbsp;What hasn't worked so well is when the audience doesn't really have a good understanding of a body of knowledge that I reference rather than cover.&lt;br /&gt;&lt;br /&gt;In retrospect, this is obvious but I certainly failed to predict it.&lt;br /&gt;&lt;br /&gt;I'm grappling with a number of possible solutions. &amp;nbsp;I'll probably think of more later but here is what I can think of now:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Keep materials on hand that address assumed knowledge and adapt a talk to the audience's needs.&lt;/li&gt;&lt;li&gt;Do a better job of determining an audience's needs in advance and screen out ones that don't have the prerequisites.&lt;/li&gt;&lt;li&gt;Do a better job of determining an audience's needs in advance and pre-adapt a talk before showing up at the venue, setting expectations appropriately in the process.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;I don't know where I'm going with this but any suggestions would be welcome.&lt;/div&gt;</description>
         <author>Max Guernsey</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-6071161355003124952</guid>
         <pubDate>Tue, 25 Feb 2014 11:11:00 +0000</pubDate>
      </item>
      <item>
         <title>Test-Driven Architecture Article Published</title>
         <link>http://maxg3prog.blogspot.com/2014/02/test-driven-architecture-article.html</link>
         <description>The article my friend,&amp;nbsp;&lt;a rel=&quot;nofollow&quot; class=&quot;g-profile&quot; target=&quot;_blank&quot; href=&quot;https://plus.google.com/110061844943185874180&quot;&gt;Mike Brown&lt;/a&gt;, and I wrote has been published. &amp;nbsp;The topic is how to apply test-driven development to architecture. &amp;nbsp;You can find it &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://bit.ly/tdd-architecture&quot;&gt;here&lt;/a&gt;.</description>
         <author>Max Guernsey</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-7903498958743748610</guid>
         <pubDate>Thu, 20 Feb 2014 13:04:00 +0000</pubDate>
      </item>
      <item>
         <title>Another Article Submitted</title>
         <link>http://maxg3prog.blogspot.com/2014/02/another-article-submitted.html</link>
         <description>I've submitted a third article about architecture to &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://bit.ly/informit-mg&quot;&gt;InformIT&lt;/a&gt;. &amp;nbsp;This will probably be my last one for a while. &amp;nbsp;I want to go back to focusing on the database stuff. &amp;nbsp;This most recent article has a moderately interesting story.&lt;br /&gt;&lt;br /&gt;It started out as a position statement: Encapsulation is the most important thing in architecture. &amp;nbsp;Encapsulation is already the most important thing in any software development effort, so that ended up coming off a little pompous.&lt;br /&gt;&lt;br /&gt;I then rewrote it as something that addressed the root motivation which underlies encapsulation: longevity. &amp;nbsp;That article ended up being interesting but it didn't talk enough about encapsulation, which was the original point of the original article.&lt;br /&gt;&lt;br /&gt;I settled on the working title &quot;Five Tips to Maximize Encapsulation in Your Architecture&quot; and I have received word that it will be published on February 20&lt;sup&gt;th&lt;/sup&gt;, 2014.&lt;br /&gt;&lt;br /&gt;I'll post a link when it is published.</description>
         <author>Max Guernsey</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-8768613119947307046</guid>
         <pubDate>Tue, 18 Feb 2014 13:11:00 +0000</pubDate>
      </item>
      <item>
         <title>Why Revision Control is Not Enough</title>
         <link>http://maxg3prog.blogspot.com/2014/01/why-revision-control-is-not-enough.html</link>
         <description>Several people have suggested that revision control might be an alternative to creating a class of databases. &amp;nbsp;I really have no way to counter such an argument because I cannot fathom what they were thinking in the first place.&lt;br /&gt;&lt;br /&gt;The two concepts target completely and utterly different things. &amp;nbsp;I guess that all I can really do is talk about how different they are and hope some people change their stance.&lt;br /&gt;&lt;br /&gt;Revision control (e.g.: CVS, Subversion, or Perforce) allows you to track and manage the changes you are making to source code. &amp;nbsp;The point is to (a) provide a place of safekeeping for your documents of design and (b) to allow you to access previous versions of a design. &amp;nbsp;When you update the design of a class, you create a new version of it in source control and do not generally see older versions unless you go looking for them.&lt;br /&gt;&lt;br /&gt;The point is to allow you to work on the most recent design in a particular branch while keeping a history of what was done and not betting on a single computer to keep your source code safe. &amp;nbsp;In short: Source control is about managing the relationship between developers and designs.&lt;br /&gt;&lt;br /&gt;A class of databases has a totally different functions. &amp;nbsp;Like any other class, it's most interesting relationship is between it and its objects. &amp;nbsp;Yes, a database class must store the steps required to build older versions in it but for a totally different reason that why a version-control system stores older versions of source code.&lt;br /&gt;&lt;br /&gt;Whereas a revision control system tracks versions for the benefit of the development process, a class of databases must track revisions for the benefit of the database-construction process.&lt;br /&gt;&lt;br /&gt;Storing the incremental deltas required to get from each version to the next and forcing all databases in a class to follow the exact same path of growth enables test-driven, agile database development in two ways. &amp;nbsp;For one thing, it drastically simplifies the database deployment model; every single database of a given type grows exactly the same way. &amp;nbsp;For another, it allows you to properly test the transitions from one version to the next.&lt;br /&gt;&lt;br /&gt;The versions of a source file are created because a developer has learned something, changed his mind, or otherwise revised design and they are created to ensure that developers can revisit previous designs. &amp;nbsp;The versions of a database class are created because a revision to design was actually released to production and they are created so that every database in a class is built in the exact same way as every other database in that class.</description>
         <author>Max Guernsey</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-8266681733426034425</guid>
         <pubDate>Tue, 07 Jan 2014 08:41:00 +0000</pubDate>
      </item>
      <item>
         <title>Encapsulation of Database Design</title>
         <link>http://maxg3prog.blogspot.com/2014/01/encapsulation-of-database-design.html</link>
         <description>It seems to me like every software developer goes through a phase where they think stored procedures are bad and a phase where they think they are good. &amp;nbsp;Like me, some alternate through these positions several times before settling on a position that works.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In the end, I discovered that there was never a dichotomy in the first place. &amp;nbsp;The real question was not whether to use stored procedures but how to use them. &amp;nbsp;The struggle over whether or not to use stored procedures was never really about stored procedures. &amp;nbsp;It was always about properly separating concerns and encapsulating designs.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;In the Beginning...&lt;/h2&gt;&lt;div&gt;I started off loving the idea of stored procedures. &amp;nbsp;I &lt;i&gt;loved&lt;/i&gt;&amp;nbsp;them based on a single argument that, at the time, was possibly relevant: performance. &amp;nbsp;That pernicious specter that looms over our industry, the myth of proactive optimization, cast its spell over me and I was totally sold.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In the nineties, it might even have been true that there was a compelling performance-based reason to write a stored procedure. &amp;nbsp;In general, for modern database systems, that is no longer the case.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;Flip&lt;/h2&gt;&lt;div&gt;As with many people in the pro-stored-procedure camp, I ran into one of the many potential failings of heavy stored-procedure use. &amp;nbsp;Putting behavior in a stored procedure because it is &quot;faster&quot; or &quot;more appropriate&quot; often drives bad design decisions.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The more logic I added to a database, the harder it was to test. &amp;nbsp;This was before I stumbled into the ideas in&amp;nbsp;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://bit.ly/tdd-db&quot;&gt;my book&lt;/a&gt;&amp;nbsp;but it would still be true, at least to some extent, today. &amp;nbsp;Also, the fatter I made my database layer, the thinner I made the other layers. &amp;nbsp;The coup de grace was the fact that, on a regular basis, large stored procedures were actually slower than performing dumb selects and processing the data into meaningful results in a middle-tier service.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Essentially, every time I transferred business logic from somewhere more appropriate to a database, I made my system harder to test, less flexible, and slower. &amp;nbsp;So I did what humans often do and switch from one extreme to its opposite: no stored procedures of any kind.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;Flop&lt;/h2&gt;&lt;div&gt;The problem with toggling between extremes is that it reduces the world to binary decisions. &amp;nbsp;Of course it is true that, in any decision, one is considering a finite set of options which can be reduced to a series of binary decisions. &amp;nbsp;There's nothing wrong with choosing between two things but there is something wrong with limiting your options early in the decision-making process.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The &quot;no stored procedures&quot; stance didn't work out very well either, although it does work better than &quot;everything in the database&quot; way of working. &amp;nbsp;Instead of a tightly-wound, change resistant machine that served as the center of an application's universe and ground change to a halt, I was building delicate arrangements of glass work that shattered at the first hint of change which served as the center of an application's universe and ground change to a halt.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The problem with not having any stored procedures is that something has to have an intimate relationship with the structure of a database. &amp;nbsp;When the stored procedures go away, that tends to become whatever is connected to the database (usually a middle-tier service).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That kind of intricate understanding of implementation details between one module and another is inherently more difficult to enforce that such an understanding residing exclusively within a module. &amp;nbsp;It drives the cost of change through the roof.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;The Other Way&lt;/h2&gt;&lt;div&gt;As is often the case, the artificial binary decision was hiding the true nature of the decision in the first place. &amp;nbsp;The question was never &quot;should stored procedures be used or not?&quot; &amp;nbsp;The right question to ask is &quot;for what should we use stored procedures?&quot; &amp;nbsp;Note the &quot;yes&quot; and &quot;no&quot; answers to the former question map to answers in the latter but there are many other potential answers as well.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I don't want to iterate through all the possible ways stored procedures could be used in a database design; mostly because that list is probably infinite in length. &amp;nbsp;So I'll just cut straight to the one that I think is right: encapsulation.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A while back, someone I was working with,&amp;nbsp;&lt;a rel=&quot;nofollow&quot; class=&quot;g-profile&quot; target=&quot;_blank&quot; href=&quot;http://plus.google.com/115673214433256724634&quot;&gt;Christopher Taylor&lt;/a&gt;, suggested to me that stored procedures were the equivalent of a class's interface for a database. &amp;nbsp;They are a contract between a database and its clients. &amp;nbsp;So long as the contract is fulfilled, you are free to revise the implementation details to your heart's desire. &amp;nbsp;He didn't use these words and I don't recall the exact words he used but it the point is that it was he who turned me on to this idea.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;Database Designs Require Encapsulation&lt;/h2&gt;&lt;div&gt;Probably the most sapient portion of the observation had little to do with stored procedures, specifically. &amp;nbsp;Stored procedures are merely a tool we use in recognizing that databases need encapsulation of their designs just the same way that any other object would.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Depending on the features available in your chosen database platform, you could conceivably create encapsulation other ways. &amp;nbsp;For instance, some platforms allow updateable views. &amp;nbsp;So long as you could keep satisfying the contract specified by an earlier set of exposed tables, you can change the design of your database behind that wall of encapsulation.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As&amp;nbsp;&lt;a rel=&quot;nofollow&quot; class=&quot;g-profile&quot; target=&quot;_blank&quot; href=&quot;http://plus.google.com/116028739193766539535&quot;&gt;Scott Bain&lt;/a&gt;&amp;nbsp;says, encapsulation is the first principle of design. &amp;nbsp;It should come as no surprise that this is true for database designs.&lt;/div&gt;&lt;/div&gt;</description>
         <author>Max Guernsey</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-5253598219330074586</guid>
         <pubDate>Mon, 06 Jan 2014 09:22:00 +0000</pubDate>
      </item>
      <item>
         <title>Test-Driven Architecture Article Accepted by InformIT</title>
         <link>http://maxg3prog.blogspot.com/2013/12/test-driven-architecture-article.html</link>
         <description>As you may recall some friends of mine and I are working on &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://maxg3prog.blogspot.com/2013/11/architecture-articles.html&quot;&gt;articles and blog entries&lt;/a&gt; intended to reform architecture for the modern age. &amp;nbsp;This is a quick note that the article&amp;nbsp;&lt;a rel=&quot;nofollow&quot; class=&quot;g-profile&quot; target=&quot;_blank&quot; href=&quot;http://plus.google.com/110061844943185874180&quot;&gt;Mike Brown&lt;/a&gt;&amp;nbsp;and I wrote regarding the impact of TDD on architecture has been submitted to the publisher and is in the editorial phase.&lt;br /&gt;&lt;br /&gt;I'll post something here when it is published.</description>
         <author>Max Guernsey</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-1826416301603490648</guid>
         <pubDate>Mon, 30 Dec 2013 12:01:00 +0000</pubDate>
      </item>
      <item>
         <title>The Version Manager</title>
         <link>http://maxg3prog.blogspot.com/2013/12/the-version-manager.html</link>
         <description>One of the more recent phases in my &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://maxg3prog.blogspot.com/2013/12/my-journey-to-class-of-databases.html&quot;&gt;journey to a class of databases&lt;/a&gt;&amp;nbsp;was understanding that the best way to codify a database's design was as the series of revisions that could get you there rather than in terms of specific design elements. &amp;nbsp;It's harder to find fault in this way of thinking because I still use and recommend it today but it was incomplete; sufficient to enable some level of sustainable database development but not true test-driven database development.&lt;br /&gt;&lt;br /&gt;Let me refresh your memory on the building technique to which I am referring. &amp;nbsp;You store an ordered list of scripts that are used to build a database. &amp;nbsp;You build some infrastructure that ensures only the right scripts are executed against any given database and in the right order. &amp;nbsp;So, if you have a version 2 database instance and you want to upgrade it to version 5, the infrastructure will execute the steps to upgrade to version 3, then 4, then 5.&lt;br /&gt;&lt;br /&gt;Digging the nugget of truth out of this way of doing things is weird because the thing is its own nugget of truth and, at the same time, is not sufficient to support a modern test-driven environment. &amp;nbsp;The reason for this weirdness is that version-based builds are the best way I know to do things but they aren't enough. &amp;nbsp;More was required.&lt;br /&gt;&lt;br /&gt;Anyway, the grain of truth in this way of thinking was the recognition that the &lt;i&gt;actual&lt;/i&gt;&amp;nbsp;revisions applied to real production databases should govern how we organize database build scripts. &amp;nbsp;That is, while I had not yet discovered the true class of database concept - at least not as I understand it today - I had discovered one of the principles that drives test-driven database development: the historical reality of important database instances must be respected and always trumps our wishes, hopes, and ideals.</description>
         <author>Max Guernsey</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-5560770344368111860</guid>
         <pubDate>Fri, 27 Dec 2013 11:00:00 +0000</pubDate>
      </item>
      <item>
         <title>Knowledge, Behavior, and Information</title>
         <link>http://maxg3prog.blogspot.com/2013/12/knowledge-behavior-and-information.html</link>
         <description>I mention this in my book but I thought I might elaborate. &amp;nbsp;I think a &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://maxg3prog.blogspot.com/2013/12/division-of-ideas.html&quot;&gt;useful way to conceptually divide&lt;/a&gt; the parts of a database is into three groups of design elements: information, knowledge, and behavior.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;The Three Concepts&lt;/h2&gt;Information and knowledge are often confused in everyday language. &amp;nbsp;So, first, I'll disambiguate those two words. &amp;nbsp;Not all data are information or knowledge and rarely are the two interchangeable.&lt;br /&gt;&lt;br /&gt;Information is a special subclass of data. &amp;nbsp;I'm sure someone who is an expert in communication theory or some other kind of academic would be glad to correct me and I won't fight them on what the technical definition of the word is. &amp;nbsp;I'm only interested in what the useful definition for my own purposes is, not the officially right definition. &amp;nbsp;For the purposes of this blog entry, and of everything I say and write, it is the part of a signal that the recipient did not know in advance. &amp;nbsp;Simply put, information is data which &lt;i&gt;informs&lt;/i&gt;&amp;nbsp;its recipient.&lt;br /&gt;&lt;br /&gt;If information could be thought of as facts in transit, then knowledge would be facts at rest. &amp;nbsp;In essence, knowledge is potential information but it is also a potential driver for action. &amp;nbsp;That is, the two uses of any given object's knowledge are to inform other objects, thereby adding to their knowledge, and to inform decisions, thereby improving the value of an action taken.&lt;br /&gt;&lt;br /&gt;That latter purpose is the perfect opening to briefly introduce the third player in the database design world: behavior. &amp;nbsp;If knowledge and information are facts at rest and in motion, behavior can be thought of as how something responds to knowledge or information. &amp;nbsp;For instance, you drive on the correct side of the road because you &lt;i&gt;know&lt;/i&gt;&amp;nbsp;you will slam into something if you do. &amp;nbsp;Likewise, you yank your hand away from a too-recently poured cup of coffee have become&amp;nbsp;&lt;i&gt;informed&lt;/i&gt;&amp;nbsp;that the cup is too hot to touch without damaging tissue.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Information as Pertains to Databases&lt;/h2&gt;In the database world, information is the set of signals sent or received by a database. &amp;nbsp;A query and its parameters, the invocation of a stored procedure, the results set, and any errors that occurred are all examples of information as a database sees it.&lt;br /&gt;&lt;br /&gt;In essence, information is the &quot;surface&quot; of a database's design. &amp;nbsp;It is impossible for external parties to access the value of a database except by sending and receiving signals.&lt;br /&gt;&lt;br /&gt;Moreover, it is the means by which value is conveyed between a database and its clients. &amp;nbsp;It is pointless to update a database with information it already knows. &amp;nbsp;It is useless to query a database for what you already know. &amp;nbsp;Value is created by such actions that results in one of the other entities &quot;learning&quot; something.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Knowledge as Pertains to Databases&lt;/h2&gt;Knowledge is the reason why databases cannot be maintained using the simple &quot;blast and rebuild&quot; upgrade path we apply to most software deployment problems. &amp;nbsp;All the facts stored in a database are knowledge; not all the data, because you can introduce noise into a database's design, but all the facts.&lt;br /&gt;&lt;br /&gt;Knowledge is the purpose of a database. &amp;nbsp;Most software products and components exist to convey facts between parties or to process data and discover new facts. &amp;nbsp;Some software exists to entertain. &amp;nbsp;Databases exist to preserve knowledge. &amp;nbsp;Each production database is a modern day Library of Alexandria, complete with the ability for some asshole to burn it down and, in so doing, to cause irreversible damage.&lt;br /&gt;&lt;br /&gt;We have known this for a long time - as close to &quot;forever&quot; as matters. &amp;nbsp;Databases have always been designed around the knowledge they capture and preserve. &amp;nbsp;Those design decisions stand as a reflection of our implicit understanding that databases aren't merely &lt;i&gt;data&lt;/i&gt;&amp;nbsp;bases, but &lt;i&gt;knowledge&lt;/i&gt;&amp;nbsp;bases.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Behavior as Pertains to Databases&lt;/h2&gt;&lt;div&gt;So what is the role of behavior in database design? &amp;nbsp;It's another one of those things that can be put simply or drawn crisply, but can take a lot of work to implement correctly. &amp;nbsp;The role of behavior in a database is to mediate between knowledge and information.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;All the information that a database receives needs to be translated into knowledge and stored for safekeeping. &amp;nbsp;Why? &amp;nbsp;So that, later, that knowledge can be translated back into information to help other actors make decisions or discoveries.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You can codify the behavior of a database in many different ways. &amp;nbsp;At the time of this entry, the most common way is to couple the behavior offered by a database directly to the kinds of knowledge that database can store. &amp;nbsp;This is accomplished by creating, publicly exposing, and coupling clients to table structures and relationships.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;The Relationship Between the Three&lt;/h2&gt;&lt;div&gt;I find it useful to divide database design into three parts. &amp;nbsp;The information layer of design is where the interactions between databases and other objects are defined. &amp;nbsp;The knowledge layer of design is where the facts you want to store in a database are housed. &amp;nbsp;The behavior layer is where one codifies the manner in which facts are absorbed or emitted.&lt;br /&gt;&lt;br /&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left:auto;margin-right:auto;text-align:center;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://2.bp.blogspot.com/-ssmjGHxODw8/Uq4zlGd0AXI/AAAAAAAAAj4/HC1PUVXUgCU/s1600/KnowledgeBehaviorInformation.jpg&quot; style=&quot;margin-left:auto;margin-right:auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;100&quot; src=&quot;http://2.bp.blogspot.com/-ssmjGHxODw8/Uq4zlGd0AXI/AAAAAAAAAj4/HC1PUVXUgCU/s400/KnowledgeBehaviorInformation.jpg&quot; width=&quot;400&quot;/&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align:center;&quot;&gt;behavior translates between knowledge and information&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'll post more on each of the specific layers of design with some implementation recommendations later.&lt;/div&gt;</description>
         <author>Max Guernsey</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-6959925859702288434</guid>
         <pubDate>Mon, 23 Dec 2013 07:30:00 +0000</pubDate>
         <media:thumbnail height="72" url="http://2.bp.blogspot.com/-ssmjGHxODw8/Uq4zlGd0AXI/AAAAAAAAAj4/HC1PUVXUgCU/s72-c/KnowledgeBehaviorInformation.jpg" width="72" xmlns:media="http://search.yahoo.com/mrss/"/>
      </item>
      <item>
         <title>Division of Ideas</title>
         <link>http://maxg3prog.blogspot.com/2013/12/division-of-ideas.html</link>
         <description>We choose how we organize ideas in our heads. &amp;nbsp;Take the concept of a wrench. &amp;nbsp;For me, there are two kinds of wrenches: regular wrenches and monkey wrenches. &amp;nbsp;That distinction exists because one kind of wrench is useful for binding while the other is good for bashing. &amp;nbsp;For a mechanic, however, I'm sure there are many kinds of wrenches.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'm not sure either of us is wrong. &amp;nbsp;Now, I want to be clear: I am&amp;nbsp;&lt;u&gt;&lt;b&gt;not&lt;/b&gt;&lt;/u&gt;&amp;nbsp;saying that everyone who believes anything is correct because it's what they believe. &amp;nbsp;I am saying that someone who looks at a room full of people and sees two groups is every bit as right as someone standing right next to him who sees three groups in that there is no &quot;right&quot; way to divide things into groups, only &quot;useful&quot; ways to do so.&lt;br /&gt;&lt;br /&gt;This may be obvious to others but it wasn't obvious to me. &amp;nbsp;I'm documenting it here as much to ensure I'll have the discovery available for myself when I forget it later as to share it with you.&lt;/div&gt;</description>
         <author>Max Guernsey</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-5236634572677811570</guid>
         <pubDate>Sat, 21 Dec 2013 13:56:00 +0000</pubDate>
      </item>
      <item>
         <title>The Database Installer</title>
         <link>http://maxg3prog.blogspot.com/2013/12/the-database-installer.html</link>
         <description>Another fallacious idea I, and many others, had was to treat database instances like programs that need to be installed. &amp;nbsp;Again, there are many things wrong with this line of reasoning, but something positive came from it.&lt;br /&gt;&lt;br /&gt;You know me... &quot;Mr. Positive.&quot;&lt;br /&gt;&lt;br /&gt;This particular step in my&amp;nbsp;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://maxg3prog.blogspot.com/2013/12/my-journey-to-class-of-databases.html&quot;&gt;journey to a class of databases&lt;/a&gt;&amp;nbsp;bore what was, at least for me, a pretty subtle value. &amp;nbsp;Part of the subtlety came from the fact that the installer paradigm looks like it works for longer than a lot of its predecessors, which tended to break down extremely early. &amp;nbsp;Part of it was my own stubbornness - I was spending so much energy arguing the small improvement that I couldn't see the bigger improvements waiting just around the corner.&lt;br /&gt;&lt;br /&gt;I'm pretty sure that's irony: that this way of thinking was so successful kept me from seeing other, more successful, ways of understanding a problem. &amp;nbsp;Wait. &amp;nbsp;Maybe that's not irony. &amp;nbsp;Maybe that's the human condition. &amp;nbsp;...or maybe those things do not really oppose one another.&lt;br /&gt;&lt;br /&gt;Anyway, grain of truth in this way of imagining database build technologies is that it recognizes the importance of discrete, tracked, testable deltas in design and highly controlled, repeatable ways of introducing those changes. &amp;nbsp;That ends up being a pretty fundamental concept. &amp;nbsp;It serves as the basis for building a testable class of databases, enabling test-driven database development, and ultimately unlocking database agility.&lt;br /&gt;&lt;br /&gt;So there you have it. &amp;nbsp;Another step in the journey. &amp;nbsp;Another failure to hit the mark. &amp;nbsp;Another lesson that built to what we know today.</description>
         <author>Max Guernsey</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-8465634030239690737</guid>
         <pubDate>Fri, 20 Dec 2013 13:30:00 +0000</pubDate>
      </item>
      <item>
         <title>Next Step: Test-Driven Architecture</title>
         <link>http://maxg3prog.blogspot.com/2013/12/next-step-test-driven-architecture.html</link>
         <description>Recently, I published an &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://bit.ly/vso-arch&quot;&gt;article on InformIT&lt;/a&gt; about how we should focus our software-architectural efforts. &amp;nbsp;I've been blogging about it a little bit since.&lt;br /&gt;&lt;br /&gt;Like everything in the software development industry, Test-Driven Development can make architecture better. &amp;nbsp;So&amp;nbsp;&lt;a rel=&quot;nofollow&quot; class=&quot;g-profile&quot; target=&quot;_blank&quot; href=&quot;http://plus.google.com/110061844943185874180&quot;&gt;Mike Brown&lt;/a&gt;&amp;nbsp;and I have set out to document our ideas on that subject. &amp;nbsp;Originally, that was going to be a single article on InformIT.&lt;br /&gt;&lt;br /&gt;That's not going to cut it. &amp;nbsp;As one might have guessed (I didn't but, now, I can imagine someone else might), the topic is too rich to fit into a single 3,000 word article. &amp;nbsp;So, with luck, it will turn into a series of articles written by my friend and myself (and possibly others) that help this industry take another step toward being truly test-driven.</description>
         <author>Max Guernsey</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-3160110871811237976</guid>
         <pubDate>Thu, 19 Dec 2013 07:19:00 +0000</pubDate>
      </item>
      <item>
         <title>The Database Design Applicator</title>
         <link>http://maxg3prog.blogspot.com/2013/12/the-database-design-applicator.html</link>
         <description>Another step in my &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://maxg3prog.blogspot.com/2013/12/my-journey-to-class-of-databases.html&quot;&gt;journey to a class of databases&lt;/a&gt; was believing that a design tool could properly maintain all my database instances for me. &amp;nbsp;Again, I want to try and dig the nugget of truth out of this belief rather than beat it to death for what is wrong about it.&lt;br /&gt;&lt;br /&gt;I think that, in this case, the nugget of truth is actually pretty self-evident. &amp;nbsp;The idea is to have a document that specifies the current design of a database and a tool that can update any database to have that design. &amp;nbsp;If you scrape away the part of that sentence that is obviously magical thinking, you are left with this:&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;&quot;The idea is to have a document that specifies the current design of a database.&quot;&lt;/blockquote&gt;The part that is not quite as readily-apparent is that the motivation runs just a little bit deeper than that. &amp;nbsp;The real drive behind a tool that can update any database to a well-understood definition of the most recent design is that you have a document that codifies the current design and a tool that &lt;i&gt;enforces &lt;/i&gt;the current design.&lt;br /&gt;&lt;br /&gt;That's a noble goal, actually and an attainable one at that. &amp;nbsp;Think about it...&lt;br /&gt;&lt;br /&gt;Disregarding all the ancient ideas, don't we still have a way of doing that when defining a &quot;regular&quot; object model? &amp;nbsp;We just do it a different way. &amp;nbsp;Instead of technical specifications and UML diagrams, we have unit tests. &amp;nbsp;Instead of a tool that generates code from high-level specifications, we have test runners.&lt;br /&gt;&lt;br /&gt;Given a class of databases, using unit tests as the primary specification of design is a discipline that transfers straight over to database development; practically unmodified.&lt;br /&gt;&lt;br /&gt;So that's the positive takeaway from the era of magical design-application tool mysticism: that we do in fact need a way to specify and enforce the current design of a class of databases and that, like Java, .Net, or C++ classes, that should be automated unit tests specifying how a database behaves and enforcing that specification on a regular basis.</description>
         <author>Max Guernsey</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-323326289019776587</guid>
         <pubDate>Wed, 18 Dec 2013 03:30:00 +0000</pubDate>
      </item>
      <item>
         <title>Wrangling Wild Databases</title>
         <link>http://maxg3prog.blogspot.com/2013/12/wrangling-wild-databases.html</link>
         <description>I've received some interesting questions lately. &amp;nbsp;One question at my most recent talk for the DAMA group in Portland rang very familiar. &amp;nbsp;It got me thinking.&lt;br /&gt;&lt;br /&gt;There are a lot of database instances out there that were developed before my book was published. &amp;nbsp;Even if everyone adopted the techniques therein, that would still leave trillions of rows of data in databases that were not in accordance with the book. &amp;nbsp;Among other things, these databases are generally created with insufficient automated test coverage so, in the spirit of &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://bit.ly/18OUMt8&quot;&gt;Working Effectively with Legacy Code&lt;/a&gt;, I call such databases &quot;legacy databases.&quot;&lt;br /&gt;&lt;br /&gt;I cover legacy databases a little bit in the book but there is a limited number of scenarios. &amp;nbsp;This blog seems like a natural place to start addressing other issues.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;The Scenario&lt;/h2&gt;Imagine the following:&lt;br /&gt;&lt;br /&gt;You work for a company that sells an enterprise product; we'll call that product &quot;Calm Cheddar.&quot; &amp;nbsp;As with most enterprise software products, Calm Cheddar has a database back end. &amp;nbsp;Calm Cheddar has been successful in several applicable markets and has been sold to numerous customers over the course of several years. &amp;nbsp;In that same time, it has grown as a product. &amp;nbsp;Along with the overall design of Calm Cheddar, the design of its database has grown and morphed over time.&lt;br /&gt;&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float:left;margin-right:1em;text-align:left;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://3.bp.blogspot.com/-rm71bpondSY/Uq1dDzu2u9I/AAAAAAAAAjM/Pa7uUCqRjSY/s1600/Deviation.jpg&quot; style=&quot;clear:left;margin-bottom:1em;margin-left:auto;margin-right:auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;221&quot; src=&quot;http://3.bp.blogspot.com/-rm71bpondSY/Uq1dDzu2u9I/AAAAAAAAAjM/Pa7uUCqRjSY/s400/Deviation.jpg&quot; width=&quot;400&quot;/&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align:center;&quot;&gt;manual deployment and broad customer base leads to&lt;br /&gt;deviation in database builds&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;The final result is that there is an array of customers with varying versions of the software and each with a different path to their current deployment. &amp;nbsp;The saving grace is that Calm Cheddar's customers tend to upgrade to the latest version. &amp;nbsp;They may or may not upgrade often, but then never upgrade to something that is already outdated.&lt;br /&gt;&lt;br /&gt;Now let's say you want to start emerging a class of databases in this scenario. &amp;nbsp;What I've shown in the past and what I teach in the first two thirds of my book do not cover scenarios like this. &amp;nbsp;This specific scenario is not covered anywhere and I imagine that there are several people in a similar situation.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;The Ideal and the Real&lt;/h2&gt;The ideal class of databases is expressed as a &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://maxg3prog.blogspot.com/2013/12/why-linear-chain-of-deltas-is-best-way.html&quot;&gt;linear sequence of versions&lt;/a&gt;&amp;nbsp;created using a linear series of revisions. &amp;nbsp;The class of databases is simple, knows how to perform any reasonable upgrade, and is very robust.&lt;br /&gt;&lt;br /&gt;Circumstances, however, are rarely ideal.&lt;br /&gt;&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float:right;margin-left:1em;text-align:right;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://2.bp.blogspot.com/-qBgkRciUXhU/Uq1VYYzlwLI/AAAAAAAAAi8/Dflh2Ab47EY/s1600/IdealAndReality.jpg&quot; style=&quot;clear:right;margin-bottom:1em;margin-left:auto;margin-right:auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;249&quot; src=&quot;http://2.bp.blogspot.com/-qBgkRciUXhU/Uq1VYYzlwLI/AAAAAAAAAi8/Dflh2Ab47EY/s320/IdealAndReality.jpg&quot; width=&quot;320&quot;/&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align:center;&quot;&gt;just because you want it, doesn't make it so&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;There are at least two lessons from &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://bit.ly/tdd-db&quot;&gt;Test-Driven Database Development: Unlocking Agility&lt;/a&gt; that apply to this scenario. &amp;nbsp;First: drive variation out of your database build process as much as you possibly can. &amp;nbsp;Second: above all else, make your database build process reflect the actual transitions that have really been applied to real databases.&lt;br /&gt;&lt;br /&gt;These two forces might appear to be contradictory but, in fact, they align perfectly. &amp;nbsp;You should drive all variation out of your database development process, yes, but that does not mean you will succeed or will have started autonomating your database build mechanism at the very beginning of your very first database's life. &amp;nbsp;That you should drive all variation from a system does not mean that none will ever be there.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;The Reckoning&lt;/h2&gt;&lt;div&gt;The key to reconciling these two forces - the impulse to minimize variation in database build paths and the need to recognize the true database upgrade steps that have actually occurred - with the reality that there is a large, diverse population of databases within a given class is in understanding that you must merge these disparate paths together. &amp;nbsp;What was once a vast array of trickling creeks should, over time, be coalesced into a single coursing river of features.&lt;/div&gt;&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float:left;margin-right:1em;text-align:left;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://1.bp.blogspot.com/-PsCoSkH-4QE/Uq1fw2NADBI/AAAAAAAAAjY/ygDXH5G9_nU/s1600/Remediation.jpg&quot; style=&quot;clear:left;margin-bottom:1em;margin-left:auto;margin-right:auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;254&quot; src=&quot;http://1.bp.blogspot.com/-PsCoSkH-4QE/Uq1fw2NADBI/AAAAAAAAAjY/ygDXH5G9_nU/s320/Remediation.jpg&quot; width=&quot;320&quot;/&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align:center;&quot;&gt;there can be only one&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Two techniques must be applied to resolve any differences between the various deployment paths. &amp;nbsp;One is taming a legacy database. &amp;nbsp;The other is remediation deviations.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Without getting into the details, the former amounts to creating a new class of databases that has conditional build logic in its very first version to address the potential of a database that has been built prior to the class's creation. &amp;nbsp;The latter consists of documenting variations in a database's historical construction patterns, then using transition tests to drive conditional logic that reconciles the various &quot;flavors&quot; of a database design.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Sometimes it will be a great deal of time. &amp;nbsp;Imagine that eighty percent of your database instances are almost exactly alike, fifteen percent fall into a few other distinct categories, and the remainder are &quot;lone wolves&quot; with highly deviant paths.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In such a case, you might want to phase your database wrangling activities, starting with the large body of highly similar databases first, moving on to the smaller groups second, and start picking off the lone wolf types on an &quot;as-needed&quot; basis.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This technique works great in a relatively controlled environment where, among other things, all of the databases are roughly the same version. &amp;nbsp;They don't need to all have exactly the same design to start but it does make things a lot easier if they have approximately the same design.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In the Calm Chowder scenario, however, we don't have the luxury. &amp;nbsp;Remember: we have variation in both the version and the manner of construction.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;The Conditioner&lt;/h2&gt;&lt;div&gt;A friend of mind,&amp;nbsp;&lt;a rel=&quot;nofollow&quot; class=&quot;g-profile&quot; target=&quot;_blank&quot; href=&quot;http://plus.google.com/117379558916454158061&quot;&gt;Seth McCarthy&lt;/a&gt;,&amp;nbsp;has also come up with an interesting twist on this way of doing things; one that, I think, addresses the extra kind of variation.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;He suggested adding a proxy over the simple, linear-step-oriented database builder at the heart of a class of databases. &amp;nbsp;This proxy's job is twofold. &amp;nbsp;First and foremost, it detects the version of a database's design then conditions it to look as though the infrastructure for a class of databases has been used to build it. &amp;nbsp;Typically, that means creating and populating some kind of &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://maxg3prog.blogspot.com/2013/12/tracking-versions-in-your-database.html&quot;&gt;version registry table&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Naturally, if acting on an empty database, the proxy does nothing but delegate to the core database builder.&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float:left;text-align:left;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://3.bp.blogspot.com/-uZnYFwLEkTw/Uq1qHufpx6I/AAAAAAAAAjo/yEByvELPC2U/s1600/Rinzler.jpg&quot; style=&quot;clear:left;margin-bottom:1em;margin-left:auto;margin-right:auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;179&quot; src=&quot;http://3.bp.blogspot.com/-uZnYFwLEkTw/Uq1qHufpx6I/AAAAAAAAAjo/yEByvELPC2U/s320/Rinzler.jpg&quot; width=&quot;320&quot;/&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align:center;&quot;&gt;rectify...&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;Also, the conditioner code is in a position to perform conditional transformations before delegating to the core class of databases. &amp;nbsp;It can even inject custom transitions in between steps if necessary.&lt;br /&gt;&lt;br /&gt;The conditioner represents almost the exact opposite of the linear sequence of database upgrade steps I ordinarily recommend but special circumstances demand special responses. &amp;nbsp;Ordinarily, one would be adding a new version to a class of databases on a very regular basis and one would have to manage an ever-growing number of possible historical versions as a starting point. &amp;nbsp;There should be very little variation between one instance and another of any given version. &amp;nbsp;In that case, having special transformations that go from each version to each other version adds complexity and work.&lt;br /&gt;&lt;br /&gt;In this scenario, however, the conditioner proxy exists in the exact opposite context. &amp;nbsp;There's only one target version with which the proxy is principally concerned. &amp;nbsp;There are many source versions and there is the potential for some amount of variation between two instances of any given historical version. &amp;nbsp;So having a special place to handle one or more of the special cases makes perfect sense.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;So There You Have It&lt;/h2&gt;&lt;/div&gt;&lt;div&gt;At a very high level, this should serve as a strategy one could apply to the problem of handling a large, diverse population of databases in various historical states and previously managed with an at least somewhat unreliable process such has being built by hand.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The strategy can be stated simply, though it is not always easy to do. &amp;nbsp;Capture the historical versions of your class of databases. &amp;nbsp;Codify those versions, either as conditional logic in the initial version of a simple linear sequence of modification scripts or as a proxy to a similarly sustainable database class format. &amp;nbsp;Drive each conditional behavior from transition tests that model the variant starting points. &amp;nbsp;Force all of the variation out of existence in a controlled way. &amp;nbsp;If you have too much variation to handle all at once, ingest smaller segments of the source database space into your class of databases.&lt;/div&gt;</description>
         <author>Max Guernsey</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-1201232531619210623</guid>
         <pubDate>Tue, 17 Dec 2013 07:39:00 +0000</pubDate>
         <media:thumbnail height="72" url="http://3.bp.blogspot.com/-rm71bpondSY/Uq1dDzu2u9I/AAAAAAAAAjM/Pa7uUCqRjSY/s72-c/Deviation.jpg" width="72" xmlns:media="http://search.yahoo.com/mrss/"/>
      </item>
      <item>
         <title>Tracking Versions in your Database</title>
         <link>http://maxg3prog.blogspot.com/2013/12/tracking-versions-in-your-database.html</link>
         <description>As you may or may not know, I preach creating classes of databases over manipulating the designs of individual databases. &amp;nbsp;There are many different implementation decisions one could make while elevating design from instance to class.&lt;br /&gt;&lt;br /&gt;In a &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://maxg3prog.blogspot.com/2013/12/why-linear-chain-of-deltas-is-best-way.html&quot;&gt;previous post&lt;/a&gt;, I discussed the shape of the class itself, arguing that it should be organized around actual released versions plus the thing you intend to deploy next. &amp;nbsp;This is not revolutionary. &amp;nbsp;It's not ubiquitous but I'm certainly not the only one to suggest that this is how databases should be maintained.&lt;br /&gt;&lt;br /&gt;There are several ways to manage how versions are tracked when an instance of a database has been deployed. &amp;nbsp;One way that I've seen done is to keep a text file with a list of the scripts that have been executed. &amp;nbsp;Another way is to fill a directory with scripts that have been executed, with each script living in its own file.&lt;br /&gt;&lt;br /&gt;The way that I think works best and that fits most naturally within the concept of a class of databases is to store the state of a database instance within the instance itself. &amp;nbsp;The alignment is so strong, in fact, that it makes the other methods seem bizarre and beyond the realm of consideration.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Dependency&lt;/h2&gt;From a practical perspective, storing a database's version information inside the database only makes sense. &amp;nbsp;You don't want to have something outside a database that is required to run or maintain it. &amp;nbsp;What if that thing gets lost?&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float:right;text-align:right;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://1.bp.blogspot.com/-79WP8gIWbl4/Uq041VyW0XI/AAAAAAAAAiQ/GFcwZKe4FWk/s1600/MissingPiece.jpg&quot; style=&quot;margin-left:auto;margin-right:auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;200&quot; src=&quot;http://1.bp.blogspot.com/-79WP8gIWbl4/Uq041VyW0XI/AAAAAAAAAiQ/GFcwZKe4FWk/s200/MissingPiece.jpg&quot; width=&quot;199&quot;/&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align:center;&quot;&gt;the puzzle stops working when&lt;br /&gt;it has a missing piece&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;Sure, one could make the same argument about the class of databases itself but the odds of a document or set of documents that serve as the source of record for something's design getting lost are extremely low - we have revision control and backup policies to ensure that.&lt;br /&gt;&lt;br /&gt;In most environments, the rigorous database maintenance procedures ensure that losing data stored inside a database is many, many, many times less likely than losing a text file or a folder full of scripts. &amp;nbsp;The main way that you might lose said data is if you somehow lost the database itself, along with all its backups, in which case you would probably not care if you also lost the version data for that database.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Management&lt;/h2&gt;&lt;div&gt;Another matter of pragmatism is managing databases is that of managing the dependency between them and their version-tracking data. &amp;nbsp;If those data are external to a database instance, then you have to know where they are stored in addition to how to connect to a database.&lt;br /&gt;&lt;br /&gt;The most dreadful consequence of this management hassle is that you might accidentally upgrade one database based on the state of another database. &amp;nbsp;Depending on what precautions you take, that could have consequences ranging from a few minutes of aggravation to loss of valuable data.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float:left;text-align:left;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://3.bp.blogspot.com/-3_98NZFJ6TY/Uq05MRWMcZI/AAAAAAAAAiY/c5XVRQ5TFt0/s1600/OverwhelmedWithMinutae.jpg&quot; style=&quot;clear:left;margin-bottom:1em;margin-left:auto;margin-right:auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;212&quot; src=&quot;http://3.bp.blogspot.com/-3_98NZFJ6TY/Uq05MRWMcZI/AAAAAAAAAiY/c5XVRQ5TFt0/s320/OverwhelmedWithMinutae.jpg&quot; width=&quot;320&quot;/&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align:center;&quot;&gt;do you want to feel like this guy?&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Moreover, there is a persistent and non-trivial management cost. &amp;nbsp;Everything you do with a database - every single instance you create - also has to have this manifest of its upgrades stored somewhere else and the association between the two must be tracked for as long as the database lives.&lt;br /&gt;&lt;br /&gt;What about all those little databases that only last a few seconds or a few minutes? &amp;nbsp;As your test suite is executing? &amp;nbsp;What about all the development databases? &amp;nbsp;It's not like tracking each of these relationships is or expensive but all those little tasks accumulate to produce an awkward development environment fraught with menial tasks that draw your attention from the things that matter.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;h2&gt;Principle&lt;/h2&gt;&lt;/div&gt;There are several different supporting arguments and each, to me, is sufficient but all are derivatives of one overriding factor: objects are only objects if they are &lt;i&gt;whole&lt;/i&gt;. &amp;nbsp;In a normal object-oriented environment, access to one object is achieved with a single reference. &amp;nbsp;One pointer to a spot in memory. &amp;nbsp;One connection string to a database instance. &amp;nbsp;Those are a good ways to access an object.&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;clear:right;float:right;margin-bottom:1em;text-align:right;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://2.bp.blogspot.com/-x-pmZ6h_t1g/Uq053PYCirI/AAAAAAAAAik/_dWljwBRYkY/s1600/Incomplete.jpg&quot; style=&quot;clear:right;margin-bottom:1em;margin-left:auto;margin-right:auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;213&quot; src=&quot;http://2.bp.blogspot.com/-x-pmZ6h_t1g/Uq053PYCirI/AAAAAAAAAik/_dWljwBRYkY/s320/Incomplete.jpg&quot; width=&quot;320&quot;/&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align:center;&quot;&gt;this is not a house&lt;br /&gt;not yet&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;Imagine if, instead, you needed two things to make an object work. &amp;nbsp;What if a string object stored all its data intrinsically except for its length and, in order to properly use it, you had to track its length in another variable? &amp;nbsp;Could you do it? &amp;nbsp;Of course. &amp;nbsp;Would it be insanely complex? &amp;nbsp;Definitely.&lt;br /&gt;&lt;br /&gt;The wholeness of an object is what grants it its identity; what elevates it from being a mere blob of data that can be accessed by a program into an object. &amp;nbsp;Tracking the upgrade state of a database in said database is part of keeping it whole.&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;/div&gt;</description>
         <author>Max Guernsey</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-6193150166866990345</guid>
         <pubDate>Mon, 16 Dec 2013 07:30:00 +0000</pubDate>
         <media:thumbnail height="72" url="http://1.bp.blogspot.com/-79WP8gIWbl4/Uq041VyW0XI/AAAAAAAAAiQ/GFcwZKe4FWk/s72-c/MissingPiece.jpg" width="72" xmlns:media="http://search.yahoo.com/mrss/"/>
      </item>
      <item>
         <title>You’re still a &quot;traditional&quot; architectur...</title>
         <link>http://maxg3prog.blogspot.com/2013/11/architecture-articles.html?showComment=1385334679909#c5343432719111892422</link>
         <description>You’re still a &amp;quot;traditional&amp;quot; architecture antibody - in finding a way to perform the duties of an architect that don&amp;#39;t make you hate yourself, you&amp;#39;ve also changed the notion of what an architect is.</description>
         <author>Mike Brown</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-5343432719111892422</guid>
         <pubDate>Sun, 24 Nov 2013 15:11:19 +0000</pubDate>
      </item>
      <item>
         <title>By definition, rules cannot be enforced by consens...</title>
         <link>http://maxg3prog.blogspot.com/2013/04/im-so-sick-of-hearing-about-how-unfair.html?showComment=1367248800795#c485659228512794575</link>
         <description>By definition, rules cannot be enforced by consensus.  I&amp;#39;m not sure it&amp;#39;s the rules that are creating that effect.  I think it might be the community of volunteers policing the material.  I wonder how well they would do enforcing style without a codified guide.  Nevertheless, you have pointed out an example of a system of rules that does not obviously increase the game-ability of the thing it supposedly guards.</description>
         <author>Max Guernsey</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-485659228512794575</guid>
         <pubDate>Mon, 29 Apr 2013 08:20:00 +0000</pubDate>
      </item>
      <item>
         <title>I love the points you're making here.  Especia...</title>
         <link>http://maxg3prog.blogspot.com/2013/04/im-so-sick-of-hearing-about-how-unfair.html?showComment=1367207821369#c3408116404918778751</link>
         <description>I love the points you&amp;#39;re making here.  Especially your challenge regarding a &amp;#39;layer of rules&amp;#39; to reduce gaming.  Yet I think other sorts of improvements are possible (as you go on to discuss) and I&amp;#39;m not sure I could tell merely from the form of a proposed process change whether it would turn out to be helpful or not.  Take Wikipedia&amp;#39;s style guide, for example.  You could call it a layer of rules but it&amp;#39;s special because it&amp;#39;s defined and enforced entirely by consensus.  Because of that, I think, it meaningfully contributes to the quality of the articles.</description>
         <author>Gabriel Behm</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-3408116404918778751</guid>
         <pubDate>Sun, 28 Apr 2013 20:57:01 +0000</pubDate>
      </item>
      <item>
         <title>I'm glad.</title>
         <link>http://maxg3prog.blogspot.com/2013/04/regulation-versus-recommendation.html?showComment=1367041551301#c3745266840219742912</link>
         <description>I&amp;#39;m glad.</description>
         <author>Max Guernsey</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-3745266840219742912</guid>
         <pubDate>Fri, 26 Apr 2013 22:45:51 +0000</pubDate>
      </item>
      <item>
         <title>I loved this.</title>
         <link>http://maxg3prog.blogspot.com/2013/04/regulation-versus-recommendation.html?showComment=1367031672462#c1497683133334717084</link>
         <description>I loved this.</description>
         <author>Gabriel Behm</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-1497683133334717084</guid>
         <pubDate>Fri, 26 Apr 2013 20:01:12 +0000</pubDate>
      </item>
      <item>
         <title>This is why I do not wish to continue this convers...</title>
         <link>http://maxg3prog.blogspot.com/2013/04/nuh-uh.html?showComment=1366638187899#c8657442957690759662</link>
         <description>This is why I do not wish to continue this conversation.  This is the last of your posts I will read.  Not because they are uncomfortable.  Because they are wastes of time.&lt;br /&gt;&lt;br /&gt;You keep insisting falsehoods are truths.  Hitler was elected and then used coercion.  The electoral process is not magical, as you seem to think, and does not prevent or negate coercion.  As I said, the degree to which people were not coerced is the degree to which they, themselves were guilty.&lt;br /&gt;&lt;br /&gt;Likewise in the U.S., there are few (if any) who support the constitution and indefinite detention.  There are few (if any) who support human rights and drone strikes.  It is your nonsense view of societies as whole things rather than the millions of individuals that they are which creates the contradiction in the first place.&lt;br /&gt;&lt;br /&gt;Moreover, your arguments are irrelevant to your point.  They are just more noise, not supporting arguments.&lt;br /&gt;&lt;br /&gt;One day, the people who believe in personal responsibility will either cast off the shackles of the likes of you or collapse under the burden of carrying the rest of the world on their shoulders.&lt;br /&gt;&lt;br /&gt;Your time is better spent preparing for the impending war or dark age than it is trying to convince us our backs don&amp;#39;t hurt.</description>
         <author>Max Guernsey</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-8657442957690759662</guid>
         <pubDate>Mon, 22 Apr 2013 06:43:07 +0000</pubDate>
      </item>
      <item>
         <title>Hi Max,

People forget that Hitler was elected. No...</title>
         <link>http://maxg3prog.blogspot.com/2013/04/nuh-uh.html?showComment=1366612257622#c1210405669315329554</link>
         <description>Hi Max,&lt;br /&gt;&lt;br /&gt;People forget that Hitler was elected. No physical coercion there. Yes he went on to physically brutalise minorities, but that was only once he had gained the implicit consent of the majority... He didn&amp;#39;t use force to do that!&lt;br /&gt;&lt;br /&gt;Lets find an example closer to home. Americians will talk incessantly about their constitution and their human rights... whilst at the same time supporting the use of drones in Pakistan, and detention without trial in Guantanamo.&lt;br /&gt;&lt;br /&gt;Why?  Because they are petrified of foreigners and have been conditioned to not see them as people the same as they are...&lt;br /&gt;&lt;br /&gt;It is this conditioning to which I speak.  There are no logical fallacies here, just uncomfortable truths about the human condition.&lt;br /&gt;&lt;br /&gt;Truths that you choose to ignore....</description>
         <author>Paul Beckford</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-1210405669315329554</guid>
         <pubDate>Sun, 21 Apr 2013 23:30:57 +0000</pubDate>
      </item>
      <item>
         <title>Thank you.</title>
         <link>http://maxg3prog.blogspot.com/2013/04/busted-wrist.html?showComment=1366351103254#c6688977469584365597</link>
         <description>Thank you.</description>
         <author>Max Guernsey</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-6688977469584365597</guid>
         <pubDate>Thu, 18 Apr 2013 22:58:23 +0000</pubDate>
      </item>
      <item>
         <title>Oh, damn.  Sorry to hear it, Max.</title>
         <link>http://maxg3prog.blogspot.com/2013/04/busted-wrist.html?showComment=1366350874391#c2296195379533254882</link>
         <description>Oh, damn.  Sorry to hear it, Max.</description>
         <author>iesavage</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-2296195379533254882</guid>
         <pubDate>Thu, 18 Apr 2013 22:54:34 +0000</pubDate>
      </item>
      <item>
         <title>No.</title>
         <link>http://maxg3prog.blogspot.com/2012/09/connectmydnacom-is-crock-of-shit.html?showComment=1365045447608#c4577793673872684182</link>
         <description>No.</description>
         <author>Max Guernsey</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-4577793673872684182</guid>
         <pubDate>Wed, 03 Apr 2013 20:17:27 +0000</pubDate>
      </item>
      <item>
         <title>Also If you haven't heard about Ancestry.com&amp;#...</title>
         <link>http://maxg3prog.blogspot.com/2012/09/connectmydnacom-is-crock-of-shit.html?showComment=1365040583822#c8208943717397345174</link>
         <description>Also If you haven&amp;#39;t heard about Ancestry.com&amp;#39;s new price change for their Ancestrydna test,they&amp;#39;re following 23andme and dropping down to $99. 23andme is still the better deal since there are so may flaws with Ancestry.com&amp;#39;s Ancestrydna. A test taker is no better doing Ancestry.com&amp;#39;s Ancestrydna than DNA Diagnostics Center&amp;#39;s Ancestrybydna 2.5!</description>
         <author>Anthony Parker</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-8208943717397345174</guid>
         <pubDate>Wed, 03 Apr 2013 18:56:23 +0000</pubDate>
      </item>
      <item>
         <title>Hi again. Have you seen the changes Connectmydna h...</title>
         <link>http://maxg3prog.blogspot.com/2012/09/connectmydnacom-is-crock-of-shit.html?showComment=1365040414522#c6502458332635556950</link>
         <description>Hi again. Have you seen the changes Connectmydna has made again(Connectmydna &amp;quot;3.0&amp;quot;)? I think they did it last week.</description>
         <author>Anthony Parker</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-6502458332635556950</guid>
         <pubDate>Wed, 03 Apr 2013 18:53:34 +0000</pubDate>
      </item>
      <item>
         <title>If my wife sees that comment, then I won't get...</title>
         <link>http://maxg3prog.blogspot.com/2013/03/time-to-get-new-computer.html?showComment=1363879883682#c7496919707468150474</link>
         <description>If my wife sees that comment, then I won&amp;#39;t get my new computer.  :)</description>
         <author>Max Guernsey</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-7496919707468150474</guid>
         <pubDate>Thu, 21 Mar 2013 08:31:23 +0000</pubDate>
      </item>
      <item>
         <title>If I had realized what the issue was, I would have...</title>
         <link>http://maxg3prog.blogspot.com/2013/03/time-to-get-new-computer.html?showComment=1363849228330#c8845514769962078408</link>
         <description>If I had realized what the issue was, I would have suggested running across the street to OfficeMax and getting a USB video adapter. About $50.</description>
         <author>Isaac Rabinovitch</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-8845514769962078408</guid>
         <pubDate>Thu, 21 Mar 2013 00:00:28 +0000</pubDate>
      </item>
      <item>
         <title>I updated the entry to have a picture to the previ...</title>
         <link>http://maxg3prog.blogspot.com/2013/03/hes-mine-now-damn-it.html?showComment=1363758838699#c5839274710160658656</link>
         <description>I updated the entry to have a picture to the previous entry, in which the only halfway decent pictures I&amp;#39;ve been able to get of him reside.</description>
         <author>Max Guernsey</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-5839274710160658656</guid>
         <pubDate>Tue, 19 Mar 2013 22:53:58 +0000</pubDate>
      </item>
      <item>
         <title>This comment has been removed by the author.</title>
         <link>http://www.blogger.com/feeds/21981243/1364980878794960177/comments/default/2467178276912163726</link>
         <description>This comment has been removed by the author.</description>
         <author>Max Guernsey</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-2467178276912163726</guid>
         <pubDate>Tue, 19 Mar 2013 22:51:44 +0000</pubDate>
      </item>
      <item>
         <title>Yes.  It's true.  Not every cat expresses anxi...</title>
         <link>http://maxg3prog.blogspot.com/2013/03/hes-mine-now-damn-it.html?showComment=1363747122990#c4254658561256745778</link>
         <description>Yes.  It&amp;#39;s true.  Not every cat expresses anxiety at separation.  If there&amp;#39;s a strong bond, though, most of them do.&lt;br /&gt;&lt;br /&gt;This one is so well cared for that I can only imagine there was a strong bond and that he already underwent his mourning period over the loss of his previous family before seeking out a new home.</description>
         <author>Max Guernsey</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-4254658561256745778</guid>
         <pubDate>Tue, 19 Mar 2013 19:38:42 +0000</pubDate>
      </item>
      <item>
         <title>Pics please.

You know, cats are not always uptigh...</title>
         <link>http://maxg3prog.blogspot.com/2013/03/hes-mine-now-damn-it.html?showComment=1363745110837#c8949504376733375076</link>
         <description>Pics please.&lt;br /&gt;&lt;br /&gt;You know, cats are not always uptight about being separated from their previous people. Which is not to say you were wrong to claim him, since you obviously did everything you could to find out where he came from.&lt;br /&gt;&lt;br /&gt;I just envy you being able to keep so many cats. My lease limits me to two.</description>
         <author>Isaac Rabinovitch</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-8949504376733375076</guid>
         <pubDate>Tue, 19 Mar 2013 19:05:10 +0000</pubDate>
      </item>
      <item>
         <title>I have no problem with encapsulating construction ...</title>
         <link>http://maxg3prog.blogspot.com/2013/02/different-forces-are-no-excuse-for-bad.html?showComment=1363292148721#c7248009553950495985</link>
         <description>I have no problem with encapsulating construction in C# and Java.  It&amp;#39;s pretty much no overhead and follows standard Java usage.  &lt;br /&gt;&lt;br /&gt;Everything is relative and everyone has their own ideas of what are the cost/benefit tradeoffs.   For my viewpoint, these extra lines and their implications are a cost which out weigh the benefit.  You have a different viewpoint.   &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</description>
         <author>Ken</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-7248009553950495985</guid>
         <pubDate>Thu, 14 Mar 2013 13:15:48 +0000</pubDate>
      </item>
      <item>
         <title>You had me and then you lost me.  Now it sounds li...</title>
         <link>http://maxg3prog.blogspot.com/2013/02/different-forces-are-no-excuse-for-bad.html?showComment=1363227528012#c7909997162902987005</link>
         <description>You had me and then you lost me.  Now it sounds like you are making, word for word, the exact argument that resistors make against encapsulation of construction in C# and Java:&lt;br /&gt;&lt;br /&gt;&amp;quot;I have to type a few extra lines of code in every class to encapsulate construction and I can always just make that class a think that calls another thing.&amp;quot;&lt;br /&gt;&lt;br /&gt;If I accepted that argument anywhere, I would probably accept it everywhere.  I don&amp;#39;t, though.  I thought you had a stronger argument that the impact on the client was larger because you&amp;#39;d have to separate initialization and declaration.  I can address that.&lt;br /&gt;&lt;br /&gt;Your most recent argument is not convincing to me at all, however.  I don&amp;#39;t care if someone has to type a few extra lines.  Those lines are cheap.  I don&amp;#39;t care if debugging is harder.  Tests make debugging a rare event.  I do care if I can transition from a concrete class to an abstract one with no impact on the client and without having to duplicate the interface of that class in something I demoted to an adapter for its own interface.</description>
         <author>Max Guernsey</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-7909997162902987005</guid>
         <pubDate>Wed, 13 Mar 2013 19:18:48 +0000</pubDate>
      </item>
      <item>
         <title>What I mean by standard constructor syntax  is:   ...</title>
         <link>http://maxg3prog.blogspot.com/2013/02/different-forces-are-no-excuse-for-bad.html?showComment=1363226906169#c670671895329869540</link>
         <description>What I mean by standard constructor syntax  is:   &lt;br /&gt;&lt;br /&gt;class MyClass      &lt;br /&gt;   {&lt;br /&gt;private:&lt;br /&gt;   IsConcreteForNow::TransientPointer my_data; &lt;br /&gt;public:&lt;br /&gt;   MyClass(int i):  my_data(i) {}&lt;br /&gt;   };&lt;br /&gt;&lt;br /&gt;Without a constructor for IsConcreteForNow::TransientPointer that takes an int, then the code has to be:&lt;br /&gt;&lt;br /&gt;   MyClass(int i) {&lt;br /&gt;      my_data = IsConcreteForNow::CreateTransient(i);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;What I mean by overhead is that every class with the additions you suggested has to have:&lt;br /&gt;&lt;br /&gt;#include “ OnStack.h”  // To get the template  &lt;br /&gt;class MyClass { &lt;br /&gt;private:&lt;br /&gt;   friend class OnStack;&lt;br /&gt;   // data members &lt;br /&gt;public:&lt;br /&gt;   typedef OnStack TransientPointer;&lt;br /&gt; &lt;br /&gt;   static TransientPointer CreateTransient(int initialValue) {&lt;br /&gt;   .... // implementing code to set data members&lt;br /&gt;   }&lt;br /&gt; &lt;br /&gt;That’s extra code in every class to achieve flexibility.      &lt;br /&gt;&lt;br /&gt;Doing a watch on a MyClass object means having to do one more click on “core” to get to the MyClass data members.  &lt;br /&gt;</description>
         <author>Ken</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-670671895329869540</guid>
         <pubDate>Wed, 13 Mar 2013 19:08:26 +0000</pubDate>
      </item>
      <item>
         <title>I don't think I understand your argument.  If ...</title>
         <link>http://maxg3prog.blogspot.com/2013/02/different-forces-are-no-excuse-for-bad.html?showComment=1363217015881#c4344022265366805905</link>
         <description>I don&amp;#39;t think I understand your argument.  If you could do something like type...&lt;br /&gt;&lt;br /&gt;Foo::TransientPointer ptr = Foo::CreateTransient();&lt;br /&gt;&lt;br /&gt;...and then have the pointed-to-thing be destroyed when ptr goes out of scope, would that satisfy you?</description>
         <author>Max Guernsey</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-4344022265366805905</guid>
         <pubDate>Wed, 13 Mar 2013 16:23:35 +0000</pubDate>
      </item>
      <item>
         <title>With the form you describe, you can no longer use ...</title>
         <link>http://maxg3prog.blogspot.com/2013/02/different-forces-are-no-excuse-for-bad.html?showComment=1363205970347#c2705527727512974992</link>
         <description>With the form you describe, you can no longer use standard constructor syntax to initialize data members of a class that are of type IsConcreteForNow::TransientPointer.   You would need to call the initialization method inside the constructor.   &lt;br /&gt;&lt;br /&gt;As I mentioned to Scott Bain when he first pointed out your article, I thought it was interesting, but not convincing.   I found you have presented an interesting way to be able to apply an overloaded -&amp;gt; operator to a stack variable.   But I do not believe that the overhead added to each class to give flexibility is justified, particularly since there is an easy way to give the flexibility (when needed) using the line of attack that I gave in my original comment.  &lt;br /&gt;</description>
         <author>Ken</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-2705527727512974992</guid>
         <pubDate>Wed, 13 Mar 2013 13:19:30 +0000</pubDate>
      </item>
      <item>
         <title>Well.  I would probably start by pushing back on t...</title>
         <link>http://maxg3prog.blogspot.com/2013/02/different-forces-are-no-excuse-for-bad.html?showComment=1362782612095#c264547114982557015</link>
         <description>Well.  I would probably start by pushing back on that particular syntax but I assume that...&lt;br /&gt;&lt;br /&gt;IsConcreteForNow::TransientPointer transient = IsConcreteForNow::CreateTransient(1);&lt;br /&gt;&lt;br /&gt;...would suffice.&lt;br /&gt;&lt;br /&gt;I would probably start out with transient pointer being basically what I attached but with a copy constructor and then, if I promoted it to being a heap-allocated object, I would make it an auto pointer that tracked ownership (where assignment or copy-construction &amp;quot;steals&amp;quot; ownership and only the owner deletes) or whatever.&lt;br /&gt;&lt;br /&gt;Because you can change what the actual type of TransientPointer is without affecting clients (other than a recompile), you can pretty much do whatever you want.</description>
         <author>Max Guernsey</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-264547114982557015</guid>
         <pubDate>Fri, 08 Mar 2013 14:43:32 +0000</pubDate>
      </item>
      <item>
         <title>If IsConcreteForNow required an argument to initiz...</title>
         <link>http://maxg3prog.blogspot.com/2013/02/different-forces-are-no-excuse-for-bad.html?showComment=1362781696174#c3420924854681545640</link>
         <description>If IsConcreteForNow required an argument to initizliae it, then I presume you would call something like: &lt;br /&gt;&lt;br /&gt;IsConcreteForNow::CreateTransient(transient, 1);&lt;br /&gt;&lt;br /&gt;What is your approach to eliminating this call and just being able to declare:&lt;br /&gt;&lt;br /&gt; IsConcreteForNow::TransientPointer transient(1);  &lt;br /&gt;&lt;br /&gt;</description>
         <author>Ken</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21981243.post-3420924854681545640</guid>
         <pubDate>Fri, 08 Mar 2013 14:28:16 +0000</pubDate>
      </item>
      <item>
         <title>Keynesian Economics</title>
         <link>http://maxg3.blogspot.com/2011/11/keynesian-economics.html</link>
         <description>I learned a new word: &quot;Keynesian.&quot; &amp;nbsp;Apparently it means this: &amp;nbsp;&quot;The free market sometimes makes imperfect or &quot;inefficient&quot; decisions so we should give some market control over to an entity that consistently makes terrible and wasteful decisions.&quot; &amp;nbsp;That, of course, is paraphrased - a Keynesian would never admit that's what he or she is suggesting - but it definitely is an accurate way to describe the school of thought.&lt;br /&gt;&lt;br /&gt;Keynes is another example of why academia is mostly a waste of time and money. &amp;nbsp;Before we fire the lawyers into the sun, we should get rid of the economists, the sociologists (including cultural &quot;anthropologists&quot;), and the political &quot;scientists.&quot;</description>
         <author>Max Guernsey</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21979873.post-7296045124964305836</guid>
         <pubDate>Sat, 05 Nov 2011 10:41:00 +0000</pubDate>
      </item>
      <item>
         <title>Session Materials - &quot;Transition Testing: Cornerstone of Database Agility&quot; - 12.10.2009</title>
         <link>http://www.hexsw.com/Products/Components/DataConstructor/PressReleases.aspx?FileName=Session-12.10.2009.BlogItem</link>
         <description>DataConstructor v20.09.1805 is released and now available.&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/Products/Components/DataConstructor/PressReleases.aspx?FileName=Session-12.10.2009.BlogItem</guid>
         <pubDate>Mon, 14 Dec 2009 13:00:00 +0000</pubDate>
      </item>
      <item>
         <title>DataConstructor SDK v20.09.1805 now available.</title>
         <link>http://www.hexsw.com/Products/Components/DataConstructor/PressReleases.aspx?FileName=Release-20.09.1805.BlogItem</link>
         <description>DataConstructor v20.09.1805 is released and now available.&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/Products/Components/DataConstructor/PressReleases.aspx?FileName=Release-20.09.1805.BlogItem</guid>
         <pubDate>Sat, 26 Sep 2009 20:14:00 +0000</pubDate>
      </item>
      <item>
         <title>iContactProxy SDK v20.09.1726 now available.</title>
         <link>http://www.hexsw.com/Products/Components/iContactProxy/PressReleases.aspx?FileName=Release-0.2.0.BlogItem</link>
         <description>iContactProxy v20.09.1726 is released and now available for download.&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/Products/Components/iContactProxy/PressReleases.aspx?FileName=Release-0.2.0.BlogItem</guid>
         <pubDate>Fri, 13 Mar 2009 21:23:45 +0000</pubDate>
      </item>
      <item>
         <title>The BitmapCompare News channel is now open!</title>
         <link>http://www.hexsw.com/Products/Components/BitmapCompare/PressReleases.aspx?FileName=ChannelOpen.BlogItem</link>
         <description>An introduction to the Bootstrap news channel.&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/Products/Components/BitmapCompare/PressReleases.aspx?FileName=ChannelOpen.BlogItem</guid>
         <pubDate>Wed, 19 Nov 2008 15:30:00 +0000</pubDate>
      </item>
      <item>
         <title>Free Seminar: Data Structure Metamorphism - May 8, 2008 - Wrap-Up</title>
         <link>http://www.hexsw.com/Courses/PressReleases.aspx?FileName=DataStructureMetamorphism-05-08-2008-Review.BlogItem</link>
         <description>Our seminar at the XP users group went pretty well.  We got some great feedback and the next one will be better-still.
&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/Courses/PressReleases.aspx?FileName=DataStructureMetamorphism-05-08-2008-Review.BlogItem</guid>
         <pubDate>Sun, 11 May 2008 03:07:39 +0000</pubDate>
      </item>
      <item>
         <title>Free Seminar: Data Structure Metamorphism - May 8, 2008 - Wrap-Up</title>
         <link>http://www.hexsw.com/Courses/PressReleases.aspx?FileName=DataStructureMetamorphism-05-08-2008-Review.BlogItem</link>
         <description>Our seminar at the XP users group went pretty well.  We got some great feedback and the next one will be better-still.
&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/Courses/PressReleases.aspx?FileName=DataStructureMetamorphism-05-08-2008-Review.BlogItem</guid>
         <pubDate>Sun, 11 May 2008 03:07:39 +0000</pubDate>
      </item>
      <item>
         <title>Part VI: Structure and Information, Revisited</title>
         <link>http://www.hexsw.com/Products/Components/DataConstructor/RethinkingAgilityInDatabases.aspx?FileName=06.StructureAndInformationRevisited.BlogItem</link>
         <description>By Max Guernsey, III - Managing Member, Hexagon Software LLC&lt;br/&gt;A new discussion of how structure, behavior, data, and information relate in the database world.&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/Products/Components/DataConstructor/RethinkingAgilityInDatabases.aspx?FileName=06.StructureAndInformationRevisited.BlogItem</guid>
         <pubDate>Fri, 09 May 2008 22:43:21 +0000</pubDate>
      </item>
      <item>
         <title>Free Seminar: Data Structure Metamorphism - May 8, 2008 (repost)</title>
         <link>http://www.hexsw.com/Courses/PressReleases.aspx?FileName=DataStructureMetamorphism-05-08-2008.BlogItem</link>
         <description>We've obtained a venue on Seattle's west side:
&lt;br/&gt;
Data Structure Metamorphism: Controlled Emergence of Database Design&lt;br/&gt;
hosted by The Seattle XP User Group.
&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/Courses/PressReleases.aspx?FileName=DataStructureMetamorphism-05-08-2008.BlogItem</guid>
         <pubDate>Wed, 30 Apr 2008 09:11:34 +0000</pubDate>
      </item>
      <item>
         <title>Free Seminar: Data Structure Metamorphism - May 8, 2008 (repost)</title>
         <link>http://www.hexsw.com/Courses/PressReleases.aspx?FileName=DataStructureMetamorphism-05-08-2008.BlogItem</link>
         <description>We've obtained a venue on Seattle's west side:
&lt;br/&gt;
Data Structure Metamorphism: Controlled Emergence of Database Design&lt;br/&gt;
hosted by The Seattle XP User Group.
&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/Courses/PressReleases.aspx?FileName=DataStructureMetamorphism-05-08-2008.BlogItem</guid>
         <pubDate>Wed, 30 Apr 2008 09:11:34 +0000</pubDate>
      </item>
      <item>
         <title>The Courses News channel is now open!</title>
         <link>http://www.hexsw.com/Courses/PressReleases.aspx?FileName=ChannelOpen.BlogItem</link>
         <description>This is where we will post notices of upcoming courses and seminars.&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/Courses/PressReleases.aspx?FileName=ChannelOpen.BlogItem</guid>
         <pubDate>Wed, 30 Apr 2008 08:44:44 +0000</pubDate>
      </item>
      <item>
         <title>The Courses News channel is now open!</title>
         <link>http://www.hexsw.com/Courses/PressReleases.aspx?FileName=ChannelOpen.BlogItem</link>
         <description>This is where we will post notices of upcoming courses and seminars.&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/Courses/PressReleases.aspx?FileName=ChannelOpen.BlogItem</guid>
         <pubDate>Wed, 30 Apr 2008 08:44:44 +0000</pubDate>
      </item>
      <item>
         <title>Common Components SDK v1.6.0 now available.</title>
         <link>http://www.hexsw.com/Products/Components/Common/PressReleases.aspx?FileName=Release-1.6.0.BlogItem</link>
         <description>Common Components SDK v1.6.0 can be downloaded.  The graph-building piece has been upgraded to support &quot;forwarding&quot; and a new block of functionality has been added to support dynamic rule ordering.&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/Products/Components/Common/PressReleases.aspx?FileName=Release-1.6.0.BlogItem</guid>
         <pubDate>Wed, 16 Apr 2008 04:32:16 +0000</pubDate>
      </item>
      <item>
         <title>Free Seminar: Data Structure Metamorphism - May 8, 2008</title>
         <link>http://www.hexsw.com/AllPressReleases.aspx?FileName=DataStructureMetamorphism-05-08-2008.BlogItem</link>
         <description>We've obtained a venue on Seattle's west side:
&lt;br/&gt;
Data Structure Metamorphism: Controlled Emergence of Database Design&lt;br/&gt;
hosted by The Seattle XP User Group.
&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/AllPressReleases.aspx?FileName=DataStructureMetamorphism-05-08-2008.BlogItem</guid>
         <pubDate>Mon, 14 Apr 2008 20:18:33 +0000</pubDate>
      </item>
      <item>
         <title>Free Seminar: Data Structure Metamorphism - April 24, 2008</title>
         <link>http://www.hexsw.com/AllPressReleases.aspx?FileName=RefactoringData-04-24-2008.BlogItem</link>
         <description>The response to our last free seminar was so positive, we decided to do it again with a new name:
&lt;br/&gt;
Data Structure Metamorphism: Controlled Emergence of Database Design&lt;br/&gt;
hosted by Net Objectives.
&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/AllPressReleases.aspx?FileName=RefactoringData-04-24-2008.BlogItem</guid>
         <pubDate>Sat, 05 Apr 2008 21:22:45 +0000</pubDate>
      </item>
      <item>
         <title>Part V: Collaboration</title>
         <link>http://www.hexsw.com/Products/Components/DataConstructor/RethinkingAgilityInDatabases.aspx?FileName=05.Collaboration.BlogItem</link>
         <description>By Max Guernsey, III - Managing Member, Hexagon Software LLC&lt;br/&gt;A discussion of how the need for collaboration doesn't change between Agile software and databases.&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/Products/Components/DataConstructor/RethinkingAgilityInDatabases.aspx?FileName=05.Collaboration.BlogItem</guid>
         <pubDate>Fri, 28 Mar 2008 10:25:15 +0000</pubDate>
      </item>
      <item>
         <title>Refactoring Data - March 25th, 2008: Success!</title>
         <link>http://www.hexsw.com/Products/Components/DataConstructor/PressReleases.aspx?FileName=RefactoringData-03-25-2008-Results.BlogItem</link>
         <description>We had approximately fifty-percent attendance and a very positive response.&lt;br/&gt;		As promised, we have made the slides available in PDF format.&lt;br/&gt;	&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/Products/Components/DataConstructor/PressReleases.aspx?FileName=RefactoringData-03-25-2008-Results.BlogItem</guid>
         <pubDate>Thu, 27 Mar 2008 00:08:10 +0000</pubDate>
      </item>
      <item>
         <title>Update: Refactoring Data - March 25, 2008</title>
         <link>http://www.hexsw.com/AllPressReleases.aspx?FileName=RefactoringData-03-25-2008-Update.BlogItem</link>
         <description>This is an update on a previous post.  The new deadline to RSVP is 3-24-2008.
&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/AllPressReleases.aspx?FileName=RefactoringData-03-25-2008-Update.BlogItem</guid>
         <pubDate>Thu, 20 Mar 2008 23:14:48 +0000</pubDate>
      </item>
      <item>
         <title>Part IV: Change</title>
         <link>http://www.hexsw.com/Products/Components/DataConstructor/RethinkingAgilityInDatabases.aspx?FileName=04.Change.BlogItem</link>
         <description>by Max Guernsey, III - Managing Member, Hexagon Software LLC&lt;br/&gt;Ruminations on the nature of change in the database world as opposed to in the software world.&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/Products/Components/DataConstructor/RethinkingAgilityInDatabases.aspx?FileName=04.Change.BlogItem</guid>
         <pubDate>Sat, 08 Mar 2008 22:46:29 +0000</pubDate>
      </item>
      <item>
         <title>Part III: Testing</title>
         <link>http://www.hexsw.com/Products/Components/DataConstructor/RethinkingAgilityInDatabases.aspx?FileName=03.Testing.BlogItem</link>
         <description>By Max Guernsey, III - Managing Member, Hexagon Software LLC&lt;br/&gt;We consider how current testing practices apply to the database world.&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/Products/Components/DataConstructor/RethinkingAgilityInDatabases.aspx?FileName=03.Testing.BlogItem</guid>
         <pubDate>Fri, 29 Feb 2008 19:03:31 +0000</pubDate>
      </item>
      <item>
         <title>Free Seminar: Refactoring Data - March 25, 2008</title>
         <link>http://www.hexsw.com/AllPressReleases.aspx?FileName=RefactoringData-03-25-2008.BlogItem</link>
         <description>Hexagon Software is proud to announce its first free seminar:
&lt;br/&gt;
Refactoring Data: Mitigating the Risks of Structural Changes&lt;br/&gt;
hosted by Net Objectives.
&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/AllPressReleases.aspx?FileName=RefactoringData-03-25-2008.BlogItem</guid>
         <pubDate>Thu, 28 Feb 2008 18:16:34 +0000</pubDate>
      </item>
      <item>
         <title>Part II: Builds &amp; Deployment</title>
         <link>http://www.hexsw.com/Products/Components/DataConstructor/RethinkingAgilityInDatabases.aspx?FileName=02.BuildsAndDeployment.BlogItem</link>
         <description>By Max Guernsey, III - Managing Member, Hexagon Software LLC&lt;br/&gt;Here we talk about how we should think of database creation.  Many of us currently think of it as an operational concern.  This can lead to a number of stumbling blocks when attempting to introduce agility...&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/Products/Components/DataConstructor/RethinkingAgilityInDatabases.aspx?FileName=02.BuildsAndDeployment.BlogItem</guid>
         <pubDate>Mon, 25 Feb 2008 17:48:21 +0000</pubDate>
      </item>
      <item>
         <title>Part I: Evolution</title>
         <link>http://www.hexsw.com/Products/Components/DataConstructor/RethinkingAgilityInDatabases.aspx?FileName=01.EvolutionAndDataStructures.BlogItem</link>
         <description>By Max Guernsey, III - Managing Member, Hexagon Software LLC&lt;br/&gt;In this installment we discuss what I think is one of the most central and least portable practices: evolutionary development.  Why is this so important?  It's the practice that let's designs emerge.  Without the ability to change our design for the better, we have to plan for every kind of variation; if not every variant.  Why does it not work with data?  Simple: databases don’t evolve.&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/Products/Components/DataConstructor/RethinkingAgilityInDatabases.aspx?FileName=01.EvolutionAndDataStructures.BlogItem</guid>
         <pubDate>Sat, 23 Feb 2008 11:57:11 +0000</pubDate>
      </item>
      <item>
         <title>A New Series: Rethinking Agility in Databases</title>
         <link>http://www.hexsw.com/Products/Components/DataConstructor/RethinkingAgilityInDatabases.aspx?FileName=RethinkingAgilityInDatabases.BlogItem</link>
         <description>Author: Max Guernsey, III - Managing Member, Hexagon Software LLC&lt;br/&gt;We cannot simply reapply the Agile practices we have developed for software development to databases.  Instead, we need to reduce these practices to their essence - the principles which underly them.  From those principles, we can then rebuild practices for databases.&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/Products/Components/DataConstructor/RethinkingAgilityInDatabases.aspx?FileName=RethinkingAgilityInDatabases.BlogItem</guid>
         <pubDate>Sat, 23 Feb 2008 03:29:29 +0000</pubDate>
      </item>
      <item>
         <title>DataLink SDK v0.2.0 now available.</title>
         <link>http://www.hexsw.com/Products/Components/DataLink/PressReleases.aspx?FileName=Release-0.2.0.BlogItem</link>
         <description>DataLink v0.2.0 is released and now available for download.  This is the beginning of a new product.&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/Products/Components/DataLink/PressReleases.aspx?FileName=Release-0.2.0.BlogItem</guid>
         <pubDate>Mon, 18 Feb 2008 05:44:50 +0000</pubDate>
      </item>
      <item>
         <title>DataLink SDK v0.1.0 now available.</title>
         <link>http://www.hexsw.com/Products/Components/DataLink/PressReleases.aspx?FileName=Release-0.1.0.BlogItem</link>
         <description>DataLink v0.1.0 is released and now available for download.  This is the beginning of a new product.&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/Products/Components/DataLink/PressReleases.aspx?FileName=Release-0.1.0.BlogItem</guid>
         <pubDate>Tue, 12 Feb 2008 09:20:04 +0000</pubDate>
      </item>
      <item>
         <title>License Enforcement SDK v1.5.0 now available.</title>
         <link>http://www.hexsw.com/Products/Components/LicenseEnforcement/PressReleases.aspx?FileName=Release-1.5.0.BlogItem</link>
         <description>The License Enforcement SDK v1.5.0 has been released and is available for download.&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/Products/Components/LicenseEnforcement/PressReleases.aspx?FileName=Release-1.5.0.BlogItem</guid>
         <pubDate>Mon, 11 Feb 2008 11:34:48 +0000</pubDate>
      </item>
      <item>
         <title>DataConstructor SDK v1.5.1 now available.</title>
         <link>http://www.hexsw.com/Products/Components/DataConstructor/PressReleases.aspx?FileName=Release-1.5.1.BlogItem</link>
         <description>DataConstructor v1.5.1 is released and now available.  This version is based on Common Components 1.5.1 and installs assemblies into the GAC.&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/Products/Components/DataConstructor/PressReleases.aspx?FileName=Release-1.5.1.BlogItem</guid>
         <pubDate>Mon, 11 Feb 2008 11:34:26 +0000</pubDate>
      </item>
      <item>
         <title>ALERT: Windows Vista Security Issue With Install Package</title>
         <link>http://www.hexsw.com/Products/Components/PressReleases.aspx?FileName=WindowsVistaInstallIssue.BlogItem</link>
         <description>It has come to our attention that Windows Vista security changes make it difficult for some customers to install our products.&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/Products/Components/PressReleases.aspx?FileName=WindowsVistaInstallIssue.BlogItem</guid>
         <pubDate>Mon, 11 Feb 2008 06:31:54 +0000</pubDate>
      </item>
      <item>
         <title>License Enforcement SDK v1.4.0 now available.</title>
         <link>http://www.hexsw.com/Products/Components/LicenseEnforcement/PressReleases.aspx?FileName=Release-1.4.0.BlogItem</link>
         <description>The License Enforcement SDK v1.4.0 has been released and is available for download.&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/Products/Components/LicenseEnforcement/PressReleases.aspx?FileName=Release-1.4.0.BlogItem</guid>
         <pubDate>Mon, 11 Feb 2008 06:31:47 +0000</pubDate>
      </item>
      <item>
         <title>The Basics of Test Driven Database Design</title>
         <link>http://www.hexsw.com/Products/Components/DataConstructor/TechnicalArticles.aspx?FileName=TheBasicsOfTestDrivenDatabaseDesign.BlogItem</link>
         <description>Author: Max Guernsey, III&lt;br/&gt;The basics of test-driven development for databases.  It does not directly reference Hexagon Software DataConstructor but everything it discusses can be achieved with DataConstructor.&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/Products/Components/DataConstructor/TechnicalArticles.aspx?FileName=TheBasicsOfTestDrivenDatabaseDesign.BlogItem</guid>
         <pubDate>Mon, 11 Feb 2008 06:30:42 +0000</pubDate>
      </item>
      <item>
         <title>DataConstructor SDK v1.5.0 now available.</title>
         <link>http://www.hexsw.com/Products/Components/DataConstructor/PressReleases.aspx?FileName=Release-1.5.0.BlogItem</link>
         <description>DataConstructor v1.5.0 is released and now available.  This version represents a significant leap forward.&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/Products/Components/DataConstructor/PressReleases.aspx?FileName=Release-1.5.0.BlogItem</guid>
         <pubDate>Mon, 11 Feb 2008 06:30:37 +0000</pubDate>
      </item>
      <item>
         <title>DataConstructor SDK v1.4.0 now available.</title>
         <link>http://www.hexsw.com/Products/Components/DataConstructor/PressReleases.aspx?FileName=Release-1.4.0.BlogItem</link>
         <description>DataConstructor v1.4.0 is released and now available.  This version represents a significant leap forward.&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/Products/Components/DataConstructor/PressReleases.aspx?FileName=Release-1.4.0.BlogItem</guid>
         <pubDate>Mon, 11 Feb 2008 06:30:34 +0000</pubDate>
      </item>
      <item>
         <title>Immutable, Self-Referential Graphs: Why &amp; How</title>
         <link>http://www.hexsw.com/Products/Components/Common/TechnicalArticles.aspx?FileName=ImmutableSelfReferentialGraphsHowAndWhy.BlogItem</link>
         <description>Author: Max Guernsey, III&lt;br/&gt;This entry explains why immutability is important, even in self-referential graphs, and demonstrates how it can be achieved using Hexagon Software Common Components.&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/Products/Components/Common/TechnicalArticles.aspx?FileName=ImmutableSelfReferentialGraphsHowAndWhy.BlogItem</guid>
         <pubDate>Mon, 11 Feb 2008 06:27:38 +0000</pubDate>
      </item>
      <item>
         <title>Common Components SDK v1.5.1 now available.</title>
         <link>http://www.hexsw.com/Products/Components/Common/PressReleases.aspx?FileName=Release-1.5.1.BlogItem</link>
         <description>Common Components SDK v1.5.1 can be downloaded.  It has been upgraded to depend on Bootstrap 1.4.0 and the installer places assemblies in the GAC.&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/Products/Components/Common/PressReleases.aspx?FileName=Release-1.5.1.BlogItem</guid>
         <pubDate>Mon, 11 Feb 2008 06:27:33 +0000</pubDate>
      </item>
      <item>
         <title>Common Components SDK v1.5.0 now available.</title>
         <link>http://www.hexsw.com/Products/Components/Common/PressReleases.aspx?FileName=Release-1.5.0.BlogItem</link>
         <description>Common Components SDK v1.5.0 can be downloaded.  It comes with an expanded set of Reference implementations and a new object-lease-management framework.&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/Products/Components/Common/PressReleases.aspx?FileName=Release-1.5.0.BlogItem</guid>
         <pubDate>Mon, 11 Feb 2008 06:27:31 +0000</pubDate>
      </item>
      <item>
         <title>Common Components SDK v1.4.0 now available.</title>
         <link>http://www.hexsw.com/Products/Components/Common/PressReleases.aspx?FileName=Release-1.4.0.BlogItem</link>
         <description>Common Components SDK v1.4.0 can be downloaded.  It introduces a few new features in the same vane as ChainObjectProcessorBuilder.&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/Products/Components/Common/PressReleases.aspx?FileName=Release-1.4.0.BlogItem</guid>
         <pubDate>Mon, 11 Feb 2008 06:27:28 +0000</pubDate>
      </item>
      <item>
         <title>Bootstrap SDK v1.4.0 now available.</title>
         <link>http://www.hexsw.com/Products/Components/Bootstrap/PressReleases.aspx?FileName=Release-1.4.0.BlogItem</link>
         <description>Bootstrap SDK v1.4.0 has been released.&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/Products/Components/Bootstrap/PressReleases.aspx?FileName=Release-1.4.0.BlogItem</guid>
         <pubDate>Mon, 11 Feb 2008 06:25:41 +0000</pubDate>
      </item>
      <item>
         <title>We now have a Resources page</title>
         <link>http://www.hexsw.com/AllPressReleases.aspx?FileName=NewResourcesPage.BlogItem</link>
         <description>We now have a page linking to other services and resources that we think promote Lean and Agile programming.&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/AllPressReleases.aspx?FileName=NewResourcesPage.BlogItem</guid>
         <pubDate>Sun, 30 Dec 2007 23:33:00 +0000</pubDate>
      </item>
      <item>
         <title>DataConstructor SDK v1.3.0 now available.</title>
         <link>http://www.hexsw.com/Products/Components/DataConstructor/PressReleases.aspx?FileName=Release-1.3.0.BlogItem</link>
         <description>DataConstructor v1.3.0 is released and now available.  This version is signed with our code-signing certificate.&lt;br/&gt;This version of DataConstructor is also based on version 1.3.0 or later of License Enforcement, Common Components, et al.&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/Products/Components/DataConstructor/PressReleases.aspx?FileName=Release-1.3.0.BlogItem</guid>
         <pubDate>Sat, 29 Dec 2007 23:28:00 +0000</pubDate>
      </item>
      <item>
         <title>License Enforcement SDK v1.3.0 now available.</title>
         <link>http://www.hexsw.com/Products/Components/LicenseEnforcement/PressReleases.aspx?FileName=Release-1.3.0.BlogItem</link>
         <description>The License Enforcement SDK v1.3.0 has been released and is available for download.&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/Products/Components/LicenseEnforcement/PressReleases.aspx?FileName=Release-1.3.0.BlogItem</guid>
         <pubDate>Sat, 29 Dec 2007 22:59:00 +0000</pubDate>
      </item>
      <item>
         <title>Common Components SDK v1.3.2 now available.</title>
         <link>http://www.hexsw.com/Products/Components/Common/PressReleases.aspx?FileName=Release-1.3.2.BlogItem</link>
         <description>Common Components SDK v1.3.2 can be downloaded.&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/Products/Components/Common/PressReleases.aspx?FileName=Release-1.3.2.BlogItem</guid>
         <pubDate>Sat, 29 Dec 2007 22:44:00 +0000</pubDate>
      </item>
      <item>
         <title>The DataConstructor News channel is now open!</title>
         <link>http://www.hexsw.com/Products/Components/DataConstructor/PressReleases.aspx?FileName=ChannelOpen.BlogItem</link>
         <description>You've found the source for the latest DataConstructor news and alerts.&lt;br/&gt;Check this page on a regular basis, if you're interested in releases, features, or product updates.&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/Products/Components/DataConstructor/PressReleases.aspx?FileName=ChannelOpen.BlogItem</guid>
         <pubDate>Thu, 27 Dec 2007 17:31:00 +0000</pubDate>
      </item>
      <item>
         <title>Common Components SDK v1.3.0 now available.</title>
         <link>http://www.hexsw.com/Products/Components/Common/PressReleases.aspx?FileName=Release-1.3.0.BlogItem</link>
         <description>Common Components SDK v1.3.0 has been released.  It contains three new features:&lt;br/&gt;1. Support for immutable object-graphs with circular references&lt;br/&gt;2. Strategy objects that can easily be extended by composition&lt;br/&gt;3. Advanced XML serialization&lt;br/&gt;	&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/Products/Components/Common/PressReleases.aspx?FileName=Release-1.3.0.BlogItem</guid>
         <pubDate>Sat, 22 Dec 2007 21:19:00 +0000</pubDate>
      </item>
      <item>
         <title>Bootstrap SDK v1.3.0 now available.</title>
         <link>http://www.hexsw.com/Products/Components/Bootstrap/PressReleases.aspx?FileName=Release-1.3.0.BlogItem</link>
         <description>Bootstrap SDK v1.3.0 has been released.&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/Products/Components/Bootstrap/PressReleases.aspx?FileName=Release-1.3.0.BlogItem</guid>
         <pubDate>Tue, 18 Dec 2007 19:29:00 +0000</pubDate>
      </item>
      <item>
         <title>VSGlue SDK v1.3.0 now available.</title>
         <link>http://www.hexsw.com/Products/Components/VSGlue/PressReleases.aspx?FileName=Release-1.3.0.BlogItem</link>
         <description>VSGlue SDK v1.3.0 has been released.&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/Products/Components/VSGlue/PressReleases.aspx?FileName=Release-1.3.0.BlogItem</guid>
         <pubDate>Tue, 18 Dec 2007 18:26:00 +0000</pubDate>
      </item>
      <item>
         <title>Bootstrap SDK v1.0.3 now available.</title>
         <link>http://www.hexsw.com/Products/Components/Bootstrap/PressReleases.aspx?FileName=Release-1.0.3.BlogItem</link>
         <description>Bootstrap SDK v1.0.3 has been released.&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/Products/Components/Bootstrap/PressReleases.aspx?FileName=Release-1.0.3.BlogItem</guid>
         <pubDate>Thu, 06 Dec 2007 19:36:00 +0000</pubDate>
      </item>
      <item>
         <title>VSGlue SDK v1.0.3 now available.</title>
         <link>http://www.hexsw.com/Products/Components/VSGlue/PressReleases.aspx?FileName=Release-1.0.3.BlogItem</link>
         <description>VSGlue SDK v1.0.3 has been released.&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/Products/Components/VSGlue/PressReleases.aspx?FileName=Release-1.0.3.BlogItem</guid>
         <pubDate>Tue, 04 Dec 2007 11:02:00 +0000</pubDate>
      </item>
      <item>
         <title>Coming Soon: Inventory Liquidator.</title>
         <link>http://www.hexsw.com/Products/Applications/PressReleases.aspx?FileName=ApplicationsComingSoon.BlogItem</link>
         <description>Soon we will be releasing a new application called &quot;Inventory Liquidator.&quot;&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/Products/Applications/PressReleases.aspx?FileName=ApplicationsComingSoon.BlogItem</guid>
         <pubDate>Sun, 02 Dec 2007 06:11:00 +0000</pubDate>
      </item>
      <item>
         <title>The Applications News channel is now open!</title>
         <link>http://www.hexsw.com/Products/Applications/PressReleases.aspx?FileName=ChannelOpen.BlogItem</link>
         <description>An introduction to the Applications news channel.&lt;br/&gt;</description>
         <guid isPermaLink="false">http://www.hexsw.com/Products/Applications/PressReleases.aspx?FileName=ChannelOpen.BlogItem</guid>
         <pubDate>Sun, 02 Dec 2007 04:01:00 +0000</pubDate>
      </item>
   </channel>
</rss>
<!-- fe8.yql.bf1.yahoo.com compressed/chunked Thu Oct  1 23:14:05 UTC 2015 -->
