<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-31854701</id><updated>2010-07-13T23:31:15.677-07:00</updated><title type='text'>Neo Diem</title><subtitle type='html'>techno-babble from the throes of large-scale custom application development.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.neodiem.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default'/><link rel='alternate' type='text/html' href='http://blog.neodiem.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default?start-index=26&amp;max-results=25'/><author><name>Tempus Fugate</name><uri>http://www.blogger.com/profile/11837079658924039253</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>87</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-31854701.post-3916572826507716103</id><published>2010-03-16T17:22:00.001-07:00</published><updated>2010-03-16T17:55:40.715-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='technobabble'/><title type='text'>Finally Some Usable Storage</title><content type='html'>I've tried a boatload of different synchronization tools and finally found one that actually works as advertised and meets my needs: &lt;a href="http://www.getdropbox.com/"&gt;Dropbox&lt;/a&gt;.  Since I'm a very picky consumer (read: perfectionist), it is rare that I say a product is &lt;b&gt;very good&lt;/b&gt;.&lt;br&gt;
&lt;br&gt;
&lt;img src="https://www.dropbox.com/static/10231/images/logo.png"&gt;&lt;br&gt;
&lt;br&gt;
So what makes this product unique? It works simply, works quickly, and it is free for normal consumption.  Considering that &lt;i&gt;my&lt;/i&gt; definition of &lt;b&gt;normal&lt;/b&gt; is anything but the norm, that's a big statement.&lt;br&gt;
&lt;br&gt;
Basically, you install the &lt;a href="http://www.getdropbox.com/"&gt;Dropbox&lt;/a&gt; client on your machine (Windows, Mac, Linux, what-have-you) and set the location for your Dropbox files.  Anything that shows up there is automatically updated on the server. By using multiple clients with the same account you get real-time-enough (that's a technical term) synchronization across multiple machines.&lt;br&gt;
&lt;br&gt;
I use &lt;a href="http://www.getdropbox.com/"&gt;Dropbox&lt;/a&gt; for all my OneNote notebooks. And my work documents.  And some source code. And some pictures. Pretty much anything I want to have A) backed-up automatically and B) available anywhere.&lt;br&gt;
&lt;br&gt;
Your free Dropbox account is limited to 2GB of data, and even for a storage hog like me this is plenty. And did I mention that the synchronization is fast?  That's because it looks inside and synchronizes parts of files.&lt;br&gt;
&lt;br&gt;
I use a notebook, a netbook, a Mac, and a desktop PC throughout every day for work.  As I was typing meeting notes into OneNote on the netbook I noticed it synchronizing in the background. Every few minutes the alert on my desktop popped up that updates were downloaded. Talk about peace of mind.  When I'm done for the day, I walk out with my netbook knowing all my machines have the same information on them.  I can edit any file on any of the machines and they all just stay in sync about as fast as I can switch from one to the other.  When I type a new article on the plane, as soon as I get home, my laptop syncs. In the span it takes for my Mac to boot up, my files are already being downloaded. I can get right to work knowing I'm using the latest versions of the files, hassle-free and worry-free.&lt;br&gt;
&lt;br&gt;
For a while I was using the Gladinet software but it wasn't reliable, was too slow, and expensive. The GoodSync tools are really slow.  In addition, it won't run on my desktop PC because I run Windows Server (boo!). With both of these, as with most of the sync solutions I've tried, the synchronization algorithm doesn't look inside the files so I was able to confuse the client with multiple updates and then lose some data. Inevitably this happened and pissed me off. And of course both of these cost money too.&lt;br&gt;
&lt;br&gt;
Among other things, I keep a Box.net account, a SkyDrive, a private FTP server, and heaps of both Amazon and Google Storage. Most of this is for work and collaboration, and I use them for encrypted back-ups too. But none of these make moving my data around easier than Dropbox.  If Box.net (my previous favorite), or any of the big boys wants to know how to do synchronization right, check these guys out.&lt;br&gt;
&lt;br&gt;
And no, I'm not paid for this, I'm not affiliated in any way with Dropbox et al.  I just rarely get the chance to toot the horn of something truly great and with such mass appeal.&lt;br&gt;
&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31854701-3916572826507716103?l=blog.neodiem.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://thedewmaker.spaces.live.com/blog/cns!B0332087ACE7C96!3961.entry' title='Finally Some Usable Storage'/><link rel='replies' type='application/atom+xml' href='http://blog.neodiem.com/feeds/3916572826507716103/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=31854701&amp;postID=3916572826507716103' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/3916572826507716103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/3916572826507716103'/><link rel='alternate' type='text/html' href='http://blog.neodiem.com/2010/03/finally-some-usable-storage.html' title='Finally Some Usable Storage'/><author><name>Tempus Fugate</name><uri>http://www.blogger.com/profile/11837079658924039253</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02393023594032387684'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31854701.post-3357154515917237470</id><published>2010-03-02T09:31:00.000-08:00</published><updated>2010-03-02T15:45:16.149-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='work'/><category scheme='http://www.blogger.com/atom/ns#' term='project management'/><category scheme='http://www.blogger.com/atom/ns#' term='leadership'/><title type='text'>The Gorilla in the Clown Suit</title><content type='html'>&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 240px;height:349px;" src="http://neodiem.com/img/gorilla.jpg" alt="" border="0" /&gt;

In my line of work, you deal with all sorts of different "leaders" and "managers".  Typically, they've achieved their position through some  confluence of skill, opportunity, and luck.  They all have their positive and negative attributes, depending on the needs of the situation and your vantage point.&lt;br&gt;
&lt;br&gt;
The one I find most fascinating though is the Gorilla.&lt;br&gt;
&lt;br&gt;
The Gorilla type of leader is epitomized by being unruly and unpredictable, beating their chest when things are rough, blundering around leaving banana peels for others to trip up other people, and applying brute force to solve any problems they can't avoid by putting their hands over their eyes.  Oh, they seem intelligent enough at first, but don't forget that their typical response to even minor irritations is to start flinging feces.&lt;br&gt;
&lt;br&gt;
When trying to identify a Gorilla, watch for them to put their hands over their eyes.  You will notice this by listening to how they handle ambiguous requirements.  You will often hear them using phrases like "I interpret this to mean. . ." and "I think what was intended. . .".  They will insist on asking everyone to estimate their completion dates, but are totally uninterested in keeping track of the actual work required to hit those dates.&lt;br&gt;
&lt;br&gt;
Because they don't actually manage risks (or a traceable work plan) their project will inevitably have unexplained delays.  They handle this through beating of the chest in more meetings about the dates and the issues. In these meetings they studiously avoid detailing the actual work involved or assigning any accountability.  Unless of course, they think they can pin blame on some small monkey.  At this point, they jump right on top of the unsuspecting ape and demand a full accounting.&lt;br&gt;
&lt;br&gt;
While this chest-beating occurs, they routinely change the process and expectations.  This creates wonderful opportunities for others to fail in meeting these new expectations or realigning to the new process quickly enough.  These little banana peels are perfect for tripping up the unsuspecting. These little slip-and-falls usually provide them with several potential candidates for assigning future blame.&lt;br&gt;
&lt;br&gt;
With all this mayhem occurring, the delays generally get worse, which means they now need to apply their brute gorilla strength in an effort to get things back on track.  Since they haven't really been paying attention, and there are banana peels everywhere, this is harder than it sounds. So of course, now they get frustrated and voila! the feces flinging commences.&lt;br&gt;
&lt;br&gt;
If you find yourself working with (or heaven-help you FOR) a Gorilla, keep these simple rules in mind and perhaps you'll do okay.&lt;br&gt;
&lt;br&gt;
First, don't look them in the eye.  Calling out that the endless meetings is a bad idea and unproductive is like poking the gorilla with a stick.  It will only get you labeled as "uncooperative" or "not a team player". Instead bring your laptop and get your own work done if you have to be there in person. If possible, make it a conference call so you can put yourself on mute and get something done while the gorilla beats his chest.&lt;br&gt;
&lt;br&gt;
Secondly, watch the ground for banana peels.  If the rules are constantly changing, give yourself plenty of time to do lots of non-value-add work aligning and re-aligning. This means get your monkeys up in the trees away from the gorilla so they can do the real work.  Keep them isolated so that if (or more likely when) you stumble into one, you're the only one that gets hurt and your team stays productive.&lt;br&gt;
&lt;br&gt;
Lastly, find and maintain a poncho. Inevitably with a Gorilla there will be flung feces and finger-pointing.  Make sure you've cataloged and highly publicized your risks and issues while maintaining transparency with your schedule, dependencies, and work plan.  When things do turn nasty, keep your cool and trust in your poncho.  If you've  kept your poncho in good repair (being transparent and publicizing early and often) you should be prepared for the worst of it.&lt;br&gt;
&lt;br&gt;
In closing, it's worth pointing out that Gorillas aren't all bad.  They are especially useful in death marches and suicide missions.  When what is being undertaken is just completely unreasonable or the situation will likely require someone's career if it is to be successful, a Gorilla is a great candidate.  When the situation is already beyond repair and you are just trying to salvage something, then chest-beating and brute force are great strategies for maximum gain.  As a leader of multiple teams, unleashing a Gorilla to work for you is a quick way to identify which teams have their feces together and which people on which teams are worth saving.  Good resources will escalate around a gorilla, and good peers will already have their ponchos firmly in place, rendering the gorilla ineffective.&lt;br&gt;
&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31854701-3357154515917237470?l=blog.neodiem.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://thedewmaker.spaces.live.com/blog/cns!B0332087ACE7C96!3381.entry' title='The Gorilla in the Clown Suit'/><link rel='replies' type='application/atom+xml' href='http://blog.neodiem.com/feeds/3357154515917237470/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=31854701&amp;postID=3357154515917237470' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/3357154515917237470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/3357154515917237470'/><link rel='alternate' type='text/html' href='http://blog.neodiem.com/2010/03/gorilla-in-clown-suit.html' title='The Gorilla in the Clown Suit'/><author><name>Tempus Fugate</name><uri>http://www.blogger.com/profile/11837079658924039253</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02393023594032387684'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31854701.post-6405453445400139643</id><published>2010-02-04T15:23:00.000-08:00</published><updated>2010-02-04T15:25:49.076-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='principles'/><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><title type='text'>Mostly Magic</title><content type='html'>&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 200px;height:213px;" src="http://neodiem.com/img/doingmagic4.jpg" alt="" border="0" /&gt;

Writing code can be highly scientific. Design software can be highly artistic.  Defining architecture that encompasses elegant designs, is easy to test, efficient to construct, and still manages to satisfy constantly changing business goals is some science, some art, but mostly magic.&lt;br&gt;
&lt;br&gt;
Let's face it, every code monkey likes the way they write their code.  Conversely, they think the code someone else writes is mostly garbage.  In the same way, all designers thinks their particular designs are elegant and demonstrate "best practices" while simultaneously denouncing other designs as grotesque or impractical.  These two elements that are combined when defining the architecture of a solution are both highly inflammatory and subjective. So how does one allow individuals to contribute according to their skills and from their own perspectives without turning the architecture into a Frankenstein-like monstrosity?&lt;br&gt;
&lt;br&gt;
The first technique is generally applied only at the design and code levels and is called &lt;b&gt;Separation of Concerns&lt;/b&gt;.  It is generally regarded to have originally been introduced by &lt;a href="http://en.wikipedia.org/wiki/Edsger_W._Dijkstra"&gt;Dijkstra&lt;/a&gt; in a paper written in the '70s.&lt;br&gt;
&lt;br&gt;
The general idea is that the various aspects of single effort should have their boundaries defined and respected in such a way that they can each receive focus individually. For example, separating how a screen displays information from the format in which the data is stored.  Or agreeing on the bolt pattern for a tire so that tires can be manufactured by different suppliers and fit many cars.  By creating a boundary between two areas of concern, they can each apply different ways to support the boundary independently.&lt;br&gt;
&lt;br&gt;
While this principle is often touted and used a tool to flog the unsuspecting for the need for services, loose coupled interfaces, interface contracts, etc. it can just as easily be misapplied.  Consider how there are many components in an automobile that require access to the electrical system.  In software we often see these as secondary types of functionality such as providing access control, auditing activities, or styling a screen.  When you have these type of cross-cutting concerns, they tend to flout the rules by which we create primary concerns.  Which leads to the aforementioned architectural monstrosity.&lt;br&gt;
&lt;br&gt;
In reality separation of concern is more than just for the elements, but it needs to be applied at all levels from how the work is structured, how the business processes interact, to how systems utilize shared resources.  So working magic in your architecture will often involve applying this concept to more than just your designs, but will be present in your mindset and how you attack and decompose complex solutions into elements to be designed.  Including the cross-cutting concerns as first-class concerns is definitely part of practicing this magic.&lt;br&gt;
&lt;br&gt;
The second technique doesn't really have a formal name that I've been able to uncover.  It essentially is realizing that there is going to be a difference between what is asked for, and what is needed.  Generally, speaking we all think that providing good software is about giving users what they want. In reality, it's about giving them what they need in an efficient way &lt;i&gt;and helping them feel like it's what they wanted&lt;/i&gt;.&lt;br&gt;
&lt;Br&gt;
Ask any user what they want and they immediately turn into children.  We all know that every kid wants a pony.  Girls want it to be white and gentle.  Boys want it to be dark with a white streak and wild side that makes it run really fast. And there are a few crazy kids who go all out and decide they want a unicorn.  They are users, they have no idea what goes into the lifecycle of acquiring, maintaining, riding, and eventually putting a bullet in the head of said pony.  They just want all these things they associate with having a pony!&lt;br&gt;
&lt;br&gt;
If you focus on giving them the pony, you are going to end up with really sad pony-owners.  They'll have paid a premium for a beautiful pony that can't carry a rider and keeps growing until it's a huge horse that costs to much to keep.  And who knows that they might have been totally happy with a cheap, durable, practical: &lt;b&gt;donkey&lt;/b&gt;.&lt;br&gt;
&lt;br&gt;
The magic isn't just in realizing that a donkey can meet the need. It's on selling the donkey to someone who thinks they want a pony by focusing on what they get instead of what they think they want.  Sounds hard, doesn't it?&lt;br&gt;
&lt;br&gt;
I told you it was mostly magic.  And as an architect, it's what I practice every day.&lt;br&gt;
&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31854701-6405453445400139643?l=blog.neodiem.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://thedewmaker.spaces.live.com/blog/cns!B0332087ACE7C96!3363.entry' title='Mostly Magic'/><link rel='replies' type='application/atom+xml' href='http://blog.neodiem.com/feeds/6405453445400139643/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=31854701&amp;postID=6405453445400139643' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/6405453445400139643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/6405453445400139643'/><link rel='alternate' type='text/html' href='http://blog.neodiem.com/2010/02/mostly-magic.html' title='Mostly Magic'/><author><name>Tempus Fugate</name><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14500037381742728561'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31854701.post-5397806058816877483</id><published>2010-01-14T13:34:00.000-08:00</published><updated>2010-01-14T13:36:22.741-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='principles'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>Why Is The Build, The Build?</title><content type='html'>&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 211px;height:243px;" src="http://neodiem.com/img/buildingblocks1.jpg" alt="" border="0" /&gt;

Someone asked me recently about why I structure builds the way I do.&lt;br&gt;
&lt;br&gt;
For background, I should explain that I have a reference SQL build that I've been using for many years. It uses command files (.cmd) to iterate over a directory structure and create (or re-create) a database.  It has no dependancies, works with integrated or sql server security, logs outputs, etc.  Pretty much the usual.&lt;br&gt;
&lt;br&gt;
In this reference build, the structure is broken down so that tables are separate from keys and defaults and constraints and indexes, etc.  Procedures are broken down by type, views are seperated similarly.  The configuration scripts for users, data, etc. are all broken down as well.  There are dynamic drop scripts that tear everything  down before attempting to build everything back up.&lt;br&gt;
&lt;br&gt;
There were four specific concerns that came up about why it's structured the way it is that were raised. And it took some time go through the rationale.  I figured I would capture the details of the thinking for you in this post.&lt;br&gt;
&lt;br&gt;
The first was about using granular scripts.  After all, most tools, and many shops just merge artifacts into either a big script, or lumps of connected objects.  For example, merging keys and constraints into tables.  The second was about the use of the tear down scripts.  If all the scripts are designed to create objects and not perform alters, why the need for tearing down en masse at the start?  The third concern was about how we handle errors.  Specifically, the build only outputs errors from every script, and doesn't actually stop the build.  Lastly, the placement of indexes within the build, before the data load was questioned.  Typical data loading would want indexes removed so that the load happens quickly and then indexes can be restored with the server online.  These are all great questions.&lt;br&gt;
&lt;br&gt;
To address these concerns we need to set the expectations for the build process and how it fits into a larger team effort.   The core expectation is that these scripts will be used by an automated process deploying a database repeatedly into multiple environments as well as by individual engineers who want to deploy locally or alternatively as needed.  It is also expected that the scripts will be managed by a larger body of engineers as opposed to a single engineer or team who will manage all scripts.&lt;br&gt;
&lt;br&gt;
We can certainly discuss why having a single definition for the build or being able to leverage the larger team model for script development is advantageous or relevant at this level, but for this discussion these expectations are foundational.&lt;br&gt;
&lt;br&gt;
Given these expectations it becomes important to understand as early as possible, as many errors as possible that exist in every build.  Essentially, since there are potentially many people making many changes, all present in a single build, we would want to uncover all the problems in a single pass because the different issues have a good chance of being unrelated.  For example, changing an index or a table default won't affect whether  a procedure will build so we want to catch all these errors in one pass.&lt;br&gt;
&lt;br&gt;
This also translates into loading the data before the indexes.  If there is going to be a problem with the data because of an index, you would want to find it where the data is managed, not where the index is managed.&lt;br&gt;
&lt;br&gt;
Further, by using granular files, individuals change independent elements like keys, constraints, defaults, and so forth and the success or not of that change will be tied to a particular file which can be tied to a particular engineer and a particular change.  In short, we want to know about all the errors as early as possible, but we also want to be able to pinpoint the source and responsible party for every error as efficiently as possible too.&lt;br&gt;
&lt;br&gt;
So a quick review:&lt;br&gt;
&lt;ol&gt;
&lt;li&gt;&lt;b&gt;Use Granular Scripts&lt;/b&gt; - so we can detect all errors independently and pinpoint the source and responsible party as quickly as possible.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Use Tear Down Helpers&lt;/b&gt; - so engineers who are working locally or in alternative environments can restore to known point as quickly as possible with as little effort as possible.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Don't Stop On Errors&lt;/b&gt; - so we can find all errors independently with a single run of the build.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Create Indexes Before Loading Data&lt;/b&gt; - so we can find errors in the data load and pinpoint the source and responsible party as quickly as possible.&lt;/li&gt;
&lt;/ol&gt;
&lt;br&gt;
Hopefully it is clear how the specific patterns support the expectations.&lt;br&gt;
&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31854701-5397806058816877483?l=blog.neodiem.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://thedewmaker.spaces.live.com/blog/cns!B0332087ACE7C96!3345.entry' title='Why Is The Build, The Build?'/><link rel='replies' type='application/atom+xml' href='http://blog.neodiem.com/feeds/5397806058816877483/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=31854701&amp;postID=5397806058816877483' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/5397806058816877483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/5397806058816877483'/><link rel='alternate' type='text/html' href='http://blog.neodiem.com/2010/01/why-is-build-build.htm' title='Why Is The Build, The Build?'/><author><name>Tempus Fugate</name><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14500037381742728561'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31854701.post-4085166060389615245</id><published>2009-10-07T17:12:00.000-07:00</published><updated>2009-10-07T17:34:18.920-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='visual studio'/><category scheme='http://www.blogger.com/atom/ns#' term='technobabble'/><category scheme='http://www.blogger.com/atom/ns#' term='azure'/><category scheme='http://www.blogger.com/atom/ns#' term='web services'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Azure Adventures</title><content type='html'>If you are going to be using Azure, make sure your SQL Server instance isn't on a compressed drive.  Also, running in Windows Advanced Server is much easier than trying to juggle all these pieces on Vista.

If, like me, you already have an instance of SQL Server you need to use the DSINIT tool to get storage initialized before trying to run anything.  It's not a big deal just use dsinit /sqlinstance:. from the azure sdk bin directory.  One trick is to use the period for an unnamed instance.

If, like me, you are running Advanced Server, you need to also run Visual Studio in elevated-mode if you plan to debug at all. And who's kidding, you have to debug right?

I've been playing with the SQL Azure CTP as well and I see some good things in store. I'll post some more useful learnings as I port more code into the cloud.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31854701-4085166060389615245?l=blog.neodiem.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.neodiem.com/feeds/4085166060389615245/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=31854701&amp;postID=4085166060389615245' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/4085166060389615245'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/4085166060389615245'/><link rel='alternate' type='text/html' href='http://blog.neodiem.com/2009/10/azure-adventures.htm' title='Azure Adventures'/><author><name>Tempus Fugate</name><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14500037381742728561'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31854701.post-4361995899795402083</id><published>2009-07-07T13:50:00.000-07:00</published><updated>2009-07-07T14:07:14.628-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web services'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='wcf'/><title type='text'>Packaging Contracts for Services</title><content type='html'>&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 207px;height:172px;" src="http://neodiem.com/img/wcfservice.jpg" alt="" border="0" /&gt;

In working on a green field system recently (green field means it's new from scratch development) the discussion for a series of services turned to the subject of which type of data interaction should be used.  Specifically, should the service be designed using message contracts or data contracts?&lt;br&gt;
&lt;br&gt;
Since it became clear that the basic inflection points were not well understood, I had to hold an impromptu clinic.  After we finished, I wrote down the salient points and turned it into this post.&lt;br&gt;
&lt;br&gt;
The first thing to consider when choosing packaging formats is whether the messages need to be conformed.  You see, many technologies don't comply with the published contract specifications choosing instead to rely on the lowest level XML serialization for interchange.  If these messages already are in use, or you intend to interoperate with a system that has such restrictions, the choice is usually made for you.&lt;br&gt;
&lt;br&gt;
If you are playing green field (as in the conversation sparking this post) it helps to understand that data contracts have good portability which makes them widely applicable.  Message contracts are less capable and therefore can have less portability .&lt;br&gt;
&lt;br&gt;
So the less conformant you are required to be, the more reason to choose data contracts.  The more conformant your requirements, the more likely you will need message contracts or even base XML serialization.&lt;br&gt;
&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31854701-4361995899795402083?l=blog.neodiem.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://thedewmaker.spaces.live.com/blog/cns!B0332087ACE7C96!3283.entry' title='Packaging Contracts for Services'/><link rel='replies' type='application/atom+xml' href='http://blog.neodiem.com/feeds/4361995899795402083/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=31854701&amp;postID=4361995899795402083' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/4361995899795402083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/4361995899795402083'/><link rel='alternate' type='text/html' href='http://blog.neodiem.com/2009/07/packaging-contracts-for-services.htm' title='Packaging Contracts for Services'/><author><name>Tempus Fugate</name><uri>http://www.blogger.com/profile/11837079658924039253</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02393023594032387684'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31854701.post-5192213793363190553</id><published>2009-06-02T17:07:00.000-07:00</published><updated>2009-06-02T17:09:45.304-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technobabble'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='performance testing'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>What's The Hold-up?</title><content type='html'>You know you are having one of those days when you're writing code like this:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt; select top 5&lt;br /&gt;
(select substring(text, (statement_start_offset / 2 ) + 1,                       ((case when statement_end_offset = -1 then len(convert(nvarchar(max),text)) * 2                                else statement_end_offset end ) - statement_start_offset ) / 2 )&lt;br /&gt;
from sys.dm_exec_sql_text(sql_handle) ) AS statement&lt;br /&gt;
,last_worker_time&lt;br /&gt;
,total_worker_time&lt;br /&gt;
,last_elapsed_time&lt;br /&gt;
,total_elapsed_time&lt;br /&gt;
,execution_count&lt;br /&gt;
from sys.dm_exec_query_stats&lt;br /&gt;
order by last_elapsed_time desc&lt;br /&gt;
&lt;br /&gt;
&lt;/blockquote&gt; &lt;br /&gt;
This technique of pulling from query stats is great for finding those nasty performing culprits, especially in environments when you can't just attach a profiler.&lt;br /&gt;
&lt;br /&gt;
In case you were wondering, I use queries like this instead of sp_who or sp_who2 because it's specifically grabbing the statement that is executing not just the batch.&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31854701-5192213793363190553?l=blog.neodiem.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://thedewmaker.spaces.live.com/blog/cns!B0332087ACE7C96!3262.entry' title='What&apos;s The Hold-up?'/><link rel='replies' type='application/atom+xml' href='http://blog.neodiem.com/feeds/5192213793363190553/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=31854701&amp;postID=5192213793363190553' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/5192213793363190553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/5192213793363190553'/><link rel='alternate' type='text/html' href='http://blog.neodiem.com/2009/06/whats-hold-up.htm' title='What&apos;s The Hold-up?'/><author><name>Tempus Fugate</name><uri>http://www.blogger.com/profile/11837079658924039253</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02393023594032387684'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31854701.post-8384958169974832675</id><published>2009-02-12T12:59:00.000-08:00</published><updated>2009-02-12T13:03:06.141-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technobabble'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Cyclomatic Complexity</title><content type='html'>&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 240px; height: 233px;" src="http://neodiem.com/img/spaghetticode.jpg" alt="" border="0"&gt;  Much of my day is spent convincing engineers that there are simpler ways of implementing their designs.  Much of the rest is convincing executives and managers that what they want isn't simple at all.&lt;br /&gt;
&lt;br /&gt;
Invariably some little hot-head tries to argue with me that implementing a general case is more complicated than a special optimized case.  If the punk in question has cracked a book they'll likely bring up some metric like &lt;strong&gt;Cyclomatic Complexity&lt;/strong&gt;.&lt;br /&gt;
&lt;br /&gt;
Thomas McCabe socialized this metric in the 70's as a mechanism for predicting where code would have future maintain problems.  It's often thrown into the blender when people are trying to construct qualitative measures for code quality.  Here's the formal equation:&lt;br /&gt;
&lt;blockquote&gt; &lt;br /&gt;
CC = E - N + P&lt;br /&gt;
&lt;br /&gt;
E = number of edges N = number of nodes P = number of connections or exits &lt;br /&gt;
&lt;/blockquote&gt; &lt;br /&gt;
It can be hard to see how equations like this apply to code so let me say it a different way: &lt;strong&gt;Cyclomatic Complexity represents the number of code paths through a section code.&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
How do you count  the code paths?  Start with one for the entry into the code, and add one more for every decision point.  Decision points are the control of flow statements like &lt;strong&gt;If…Then…Else&lt;/strong&gt; or &lt;strong&gt;Switch&lt;/strong&gt;.  The CC for the following snippet is three (3).&lt;br /&gt;
&lt;blockquote&gt; &lt;br /&gt;
&lt;span style="font-family: Courier New,Courier,mono;"&gt; public int adjustRange( int rangePrimary ) {&lt;/span&gt;&lt;br style="font-family: Courier New,Courier,mono;"&gt;&lt;span style="font-family: Courier New,Courier,mono;"&gt; bool adjustedValue =  42;&lt;/span&gt;&lt;br style="font-family: Courier New,Courier,mono;"&gt;&lt;span style="font-family: Courier New,Courier,mono;"&gt; if ( rangePrimary ==  6 )  {&lt;/span&gt;&lt;br style="font-family: Courier New,Courier,mono;"&gt;&lt;span style="font-family: Courier New,Courier,mono;"&gt;  adjustedValue =  42;&lt;/span&gt;&lt;br style="font-family: Courier New,Courier,mono;"&gt;&lt;span style="font-family: Courier New,Courier,mono;"&gt; } else {&lt;/span&gt;&lt;br style="font-family: Courier New,Courier,mono;"&gt;&lt;span style="font-family: Courier New,Courier,mono;"&gt;  adjustedValue =  9;&lt;/span&gt;&lt;br style="font-family: Courier New,Courier,mono;"&gt;&lt;span style="font-family: Courier New,Courier,mono;"&gt; }&lt;/span&gt;&lt;br style="font-family: Courier New,Courier,mono;"&gt;&lt;span style="font-family: Courier New,Courier,mono;"&gt; return adjustedValue;&lt;/span&gt;&lt;br style="font-family: Courier New,Courier,mono;"&gt;&lt;span style="font-family: Courier New,Courier,mono;"&gt; }&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/blockquote&gt;  This example was really simple  but is illustrative of how the CC may be calculated.&lt;br /&gt;
&lt;br /&gt;
So how complex is complex?  As with most metrics, the interpretation is very subjective.  Since the higher the number, the more complex the code, it stands to reason that code with higher numbers would be more prone to issues.  Perhaps bugs because of the logic convolutions, or issues with maintenance because of the number of things impacted by even simple changes.  In a sweeping generalization I can say that for my reviews, code with values higher than 20 would be suspect, and higher than 30 would likely not pass.&lt;br /&gt;
&lt;br /&gt;
The important thing is to realize it isn't a measure of &lt;em&gt;quality&lt;/em&gt;, just an indicator where better organization or testing might be advisable.  Personally, I tend to gauge an engineers competence inversely to the CCs of the code they routinely produce.  In my experience, engineers who write better code routinely produce code with low CCs and vice versa. &lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31854701-8384958169974832675?l=blog.neodiem.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://thedewmaker.spaces.live.com/blog/cns!B0332087ACE7C96!3210.entry' title='Cyclomatic Complexity'/><link rel='replies' type='application/atom+xml' href='http://blog.neodiem.com/feeds/8384958169974832675/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=31854701&amp;postID=8384958169974832675' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/8384958169974832675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/8384958169974832675'/><link rel='alternate' type='text/html' href='http://blog.neodiem.com/2009/02/cyclomatic-complexity.htm' title='Cyclomatic Complexity'/><author><name>Tempus Fugate</name><uri>http://www.blogger.com/profile/11837079658924039253</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02393023594032387684'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31854701.post-7593408398214795062</id><published>2009-02-06T10:30:00.000-08:00</published><updated>2009-02-06T10:51:54.670-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technobabble'/><category scheme='http://www.blogger.com/atom/ns#' term='funny'/><title type='text'>A Goofball CEO and a Silly Journalist</title><content type='html'>&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 240px;height:175px;" src="http://neodiem.com/img/leo-apotheker.jpg" alt="" border="0" /&gt;

If you run a major international company, you shouldn't be dropping cuss words in public.  IMHO.&lt;br&gt;
&lt;br&gt;
In a &lt;a href="http://blogs.zdnet.com/BTL/?p=12267"&gt;recent article&lt;/a&gt;, the SAP co-CEO Leo Apotheker was quoted making some of the dumbest CEO comments I've ever heard.  I wonder what how big his *ahem* bonus must be for him to so blatantly disregard common sense.&lt;br&gt;
&lt;br&gt;
The &lt;a href="http://www.alleyinsider.com/2009/2/sap-clueless-consultants-from-accenture-and-ibm-giving-us-a-bad-name-sap"&gt;follow-on article&lt;/a&gt; was equally hilarious.  It shows how much pressure the Old Timers are under to stay relevant.  Add this to the recent absurdity of the &lt;a href="http://blog.neodiem.com/2009/01/truth-revealed.htm"&gt;Satyam Scandal&lt;/a&gt; and it becomes clear some house cleaning is in order.&lt;br&gt;
&lt;br&gt;
I found the most insightful comment in the follow-on to be:&lt;br&gt;
&lt;blockquote&gt;
The core of most cost/time overruns stems from CIOs committing to ERP, but middle managers insisting after implementation is already well underway that the software be changed to accommodate legacy business processes rather than the other way around.
 -- &lt;a href="http://www.alleyinsider.com/2009/2/sap-clueless-consultants-from-accenture-and-ibm-giving-us-a-bad-name-sap"&gt;Eric Krangel&lt;/a&gt;
&lt;/blockquote&gt;
&lt;br&gt;
Amen, brother.&lt;br&gt;
&lt;br&gt;
But wait, it doesn't stop there. You have to read the comments too.  Here's  my favorite:&lt;br&gt;
&lt;blockquote&gt;
Accenture made me rich when we IPO'd it in 2001.&lt;br&gt;
I'm willing to forgive all else. &lt;br&gt;
&lt;br&gt;
 -- Maurice (commented on the Alley Insider article)
 &lt;/blockquote&gt;
&lt;br&gt;
That pretty much sums up how the Bozo Effect is getting worse.  I think it's time to go back into retirement. Again.&lt;br&gt;
&lt;br&gt;
Or maybe a start-up? Hmmm...&lt;br&gt;
&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31854701-7593408398214795062?l=blog.neodiem.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://thedewmaker.spaces.live.com/blog/cns!B0332087ACE7C96!3204.entry' title='A Goofball CEO and a Silly Journalist'/><link rel='replies' type='application/atom+xml' href='http://blog.neodiem.com/feeds/7593408398214795062/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=31854701&amp;postID=7593408398214795062' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/7593408398214795062'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/7593408398214795062'/><link rel='alternate' type='text/html' href='http://blog.neodiem.com/2009/02/goofball-ceo-and-silly-journalist.htm' title='A Goofball CEO and a Silly Journalist'/><author><name>Tempus Fugate</name><uri>http://www.blogger.com/profile/11837079658924039253</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02393023594032387684'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31854701.post-5529385878441870828</id><published>2009-01-16T12:16:00.000-08:00</published><updated>2009-01-16T12:18:02.938-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='performance testing'/><title type='text'>Priming For Performance Testing</title><content type='html'>&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 240px;height:236px;" src="http://neodiem.com/img/iceburg.jpg" alt="" border="0" /&gt;
One of the last few endeavors I've had involved planning for some performance testing of the critical application stack for extremely large volume business.  Specifically, they were looking to make some architectural changes because of performance and needed to know which ones to make.  Which explains why I was in a room with a bunch of big-wigs yet again explaining why the performance test is more than throwing requests/transactions/load at the system and seeing what breaks.&lt;br&gt;
&lt;br&gt;
After quite a bit of round-and-round, it became evident that I had to bring us back to basics and get on the same page.  This is hardly new and I find myself often giving impromptu primers on Performance Testing.  This posts covers the basics and illustrates a simple example of how to apply them.&lt;br&gt;
&lt;br&gt;
Let's get started. . .&lt;br&gt;
&lt;br&gt;
When it comes to performance testing, there are two generally accepted types. You can Prove, or you can Predict.  These are not equivalent.  The names may be self-evident but let me give some quick examples to clarify.&lt;br&gt;
&lt;br&gt;
If you are seeking to Prove, you put load on a system and determine that the system can in fact handle the load within set constraints.  For example, it handles X requests using only Y memory and Z processing units with Q response time.  You know it to be true because you &lt;i&gt;&lt;b&gt;actually&lt;/b&gt;&lt;/i&gt; did the work.  It's not simulated work, there aren't stubs, there is no approximation involved.&lt;br&gt;
&lt;br&gt;
If you are seeking to Predict, you put load on the system under constraints in such a way as to understand how the system will react to changes in either load or constraints. For example, the system performed X requests with Q response time utilizing Y memory and Z processing units. Further it performed (X*2) requests with Q response time utilizing (Y*2) memory and Z processing units. Therefore I predict the system can perform (X*3) requests with Q response time utilizing (X*3) memory and Z processing units. Obviously it is never &lt;i&gt;this&lt;/i&gt; simple as there are many ways that variables interact, but you get the idea.&lt;br&gt;
&lt;br&gt;
As part of the discussion, it became clear that an understanding of the basic math involved would be helpful.  Naturally you can't expect a bunch of execs to sit still for a calculus lesson.  But it was possible to give them a simple example to demonstrate how complicated even the "simple" vectors can become very quickly. So we walked through using a &lt;i&gt;very&lt;/i&gt; simple statistical probability formula to calculate a Poisson distribution for the number of concurrent users.&lt;br&gt;
&lt;br&gt;
The simplest form of this generally only uses three variables:&lt;br&gt;
&lt;ol&gt;
&lt;li&gt;User Population&lt;br&gt;
This is the population or total sample size. Just because there are billions of people in the world, not all of them will be using  your application. Hopefully.&lt;/li&gt;
&lt;li&gt;Session Length&lt;br&gt;
This is a measure of how long the operation that each user performs.  As you can imagine, this one is hard to simplify and in sophisticated models is the quickest to require much more work to derive the real value.&lt;/li&gt;
&lt;li&gt;Availability Window&lt;br&gt;
This is a measure of the time range in which the application will be available for use.  Usually you want to exclude maintenance windows, or perhaps reduce this to only include normal business hours.&lt;/li&gt;
&lt;/ol&gt;
&lt;br&gt;
Using these variables, we can create a formula &lt;b&gt;c = (p * s) / A&lt;/b&gt; to allow us to find a concurrency distribution.&lt;br&gt;
&lt;br&gt;
c = Concurrence&lt;br&gt;
p = User Population&lt;br&gt;
s = Session Length&lt;br&gt;
A = Availability Window&lt;br&gt;
&lt;br&gt;
So for example, there are 2000 employees who have access to the portal.  Each user spends an average of 7 minutes submitting an expense report.  They only do this from work during normal business hours (9am-6pm or 9 hours).&lt;br&gt;
&lt;br&gt;
Therefore the likely concurrency is  (2000 * 7) / 540 or 26 users in a 7 minute session using the application.&lt;br&gt;
&lt;br&gt;
These are of course just numbers by probability, not proof.  But it would help you figure out by taking further percentages, what your concurrency expectations &lt;b&gt;might&lt;/b&gt; be.&lt;br&gt;
&lt;br&gt;
This is really just a small scratch on the surface of a very large topic but it helped to demonstrate how large and complicated it can be.  Which is why you should really on expertise and not guesswork.  And why things that appear really simple in models like this, typically are not.&lt;br&gt;
&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31854701-5529385878441870828?l=blog.neodiem.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://thedewmaker.spaces.live.com/blog/cns!B0332087ACE7C96!3191.entry' title='Priming For Performance Testing'/><link rel='replies' type='application/atom+xml' href='http://blog.neodiem.com/feeds/5529385878441870828/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=31854701&amp;postID=5529385878441870828' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/5529385878441870828'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/5529385878441870828'/><link rel='alternate' type='text/html' href='http://blog.neodiem.com/2009/01/priming-for-performance-testing.htm' title='Priming For Performance Testing'/><author><name>Tempus Fugate</name><uri>http://www.blogger.com/profile/11837079658924039253</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02393023594032387684'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31854701.post-7375679540776933844</id><published>2009-01-09T17:06:00.000-08:00</published><updated>2009-01-09T17:09:04.647-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technobabble'/><category scheme='http://www.blogger.com/atom/ns#' term='offshore'/><title type='text'>A Truth Revealed...</title><content type='html'>&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 240px;height:240px;" src="http://neodiem.com/img/fireglass.jpg" alt="" border="0" /&gt;
If you've done any offshore work, and I do mean really done the work not just been near the work, you know what a house of cards some of the industry players can be.  Finally it seems we are getting more details on exactly how messed up this market can get.&lt;br&gt;
&lt;br&gt;
Just recently the head of one of the larger organizations, Satyam Computer Services, released a letter detailing the ongoing fraudulent activity that was riddling the corporate books.  If you've ever competed against these guys you have invariably asked yourself, "How are they making money?" as they priced you out of a deal with ridiculously low costs.  Now you know: &lt;b&gt;They Didn't&lt;/b&gt;.&lt;br&gt;
&lt;br&gt;
You can read more in the &lt;a href="
http://www.nytimes.com/2009/01/08/business/worldbusiness/08satyam.html?partner=rss&amp;emc=rss"&gt;
New York Times&lt;/a&gt; and elsewhere on the web.&lt;br&gt;
&lt;br&gt;
The near term impact means that there will be quite a few companies including GE, GM, Nestle, Caterpillar, Coca-Cola, Microsoft, Pfizer and the US government who will be looking for new IT providers pretty quick.   The real downside is that those companies have been budgeting for years using unrealistic offshore rates.  Shifting that burden to more realistic rate schedules on short notice could be quite a jolt to many corporate bottom-lines.  The ripple effect is that it will take money away from advancements, growth and sustainability just when we need this type of spending the most.&lt;br&gt;
&lt;br&gt;
It's a fun thing to be able to say "I told you so." when you find out a company who consistently undercut the market in extremely detrimental ways finally comes clean.  Unfortunately, it's not very satisfying.  You see, we have the same experience in many markets and segments of our economy.  Rather than paying what something &lt;i&gt;should&lt;/i&gt; be worth and recognizing that money spent is money that feeds our nation, we continually strive to cut costs and do things on the cheap.  Commoditizing high-tech doesn't help anyone, anywhere.  Not in this country, and not in the country you are moving the work too.  And besides not helping in the short-term, the long-term effects of depressed rate structures create unrealistic expectations and remove incentives for growth. They have ripple effects throughout the economies and cultures involved and can do irreversible damage when reality finally does come crashing down.&lt;br&gt;
&lt;br&gt;
This situation is not unlike the consumer credit crisis or the disease that is WalMart. If people think they can pay less, they will.  Even if it isn't best for them or &lt;i&gt;anyone&lt;/i&gt; in the long-term.  In many cases, even if it isn't best for them in the &lt;i&gt;short-term&lt;/i&gt;!  That's why people spend multiple dollars in gas to drive to a further store and save a few pennies.  That's why people buy organic food that has to be shipped &lt;b&gt;from another country&lt;/b&gt; to a horrendous environmental detriment instead of recognizing that industrialization is VITAL to a sustainable civilization. But I digress.&lt;br&gt;
&lt;br&gt;
In the future, we won't always get such a clear explanation of the full cost of those ludicrous deals we take advantage of every day.  Sometimes it isn't just plain-old fraud that's at the root.  But there are always costs and impacts and we should try and understand the big picture instead of being naive consumers.  Remaining ignorant about the supply and service chains that provide everything we consume and rely on is a surefire way to create an even bigger mess in the future (like we need a bigger one than gas prices?).&lt;br&gt;
&lt;br&gt;
Next time you see a deal that seems to good to be true, remember the old adage and realize: It Is.&lt;br&gt;
&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31854701-7375679540776933844?l=blog.neodiem.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://thedewmaker.spaces.live.com/blog/cns!B0332087ACE7C96!3186.entry' title='A Truth Revealed...'/><link rel='replies' type='application/atom+xml' href='http://blog.neodiem.com/feeds/7375679540776933844/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=31854701&amp;postID=7375679540776933844' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/7375679540776933844'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/7375679540776933844'/><link rel='alternate' type='text/html' href='http://blog.neodiem.com/2009/01/truth-revealed.htm' title='A Truth Revealed...'/><author><name>Tempus Fugate</name><uri>http://www.blogger.com/profile/11837079658924039253</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02393023594032387684'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31854701.post-8089257056485254803</id><published>2008-12-08T10:57:00.000-08:00</published><updated>2008-12-08T11:02:40.928-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technobabble'/><category scheme='http://www.blogger.com/atom/ns#' term='marketing'/><title type='text'>My Online Eyeballs</title><content type='html'>&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 240px;height:205px;" src="http://neodiem.com/img/eyeballs.jpg" alt="" border="0" /&gt;

I'm a huge fan of Fred Wilson.  Have been from the first time I ever read his words.&lt;br&gt;
&lt;br&gt;
Lately, he's wrote a little something on an area that I generally ignore but had been catching my eye.  Specifically, this post was about the challenges and opportunities with online advertising.&lt;br&gt;
&lt;br&gt;
Most of the time, I tend to put my energy into learning about and understanding other areas of technology or trends, but lately I've become more interested.  This is mostly because I have friends that work in various segments of advertising and those specializing in the online space have had interesting things to say.&lt;br&gt;
&lt;br&gt;
One of the great things about Fred is that no matter whether I agree or not, he brings up the salient and pivotal points of the subject matter with precision and elegance.  This is how I would want to write if I could write the way I want. Witness:&lt;br&gt;
&lt;blockquote&gt;&lt;br&gt;
Analog and digital, it turns out, are polar opposites. Analog has physical costs which lead to scarcity driven business models. Digital has zero marginal cost (or near zero) which leads to ubiquity driven business models.&lt;br&gt;
 - from &lt;a href="http://www.avc.com/a_vc/2008/11/trading-analog.html"&gt;Trading Analog Dollars For Digital Pennies&lt;/a&gt; by &lt;a href="http://www.avc.com/"&gt;Fred Wilson&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
&lt;/blockquote&gt;
The remainder of the article is a succinct primer proving once again that smart people are in fact out in the world, kicking ass and taking names.  And then there are geniuses who take the time to write about it for the rest of us.&lt;br&gt;
&lt;br&gt;
What struck me in this discussion is not the conclusion (in any logical progression that's typically the boring part), it was how subtly he separates two behemoths that are often deemed inseparable and treated as such.  Too often, I find myself in the discussion with an educated person who is waving theirs hands about the effort it will take to "move more of our advertising to the web". Or some such nonsense.  They fail to understand that the basic economics, motivators, and operating principles for digital consumers is completely different.  When I listen to a "marketing person" talk about how a platform will have "captive eyeballs" or "impressions" I realize immediately I am talking to &lt;b&gt;&lt;i&gt;someone who doesn't get it&lt;/i&gt;&lt;/b&gt;.&lt;br&gt;
&lt;br&gt;
This was made real in conversation with a buddy of mine recently about some time after Wii Music hit the stores. His introductory comment:&lt;br&gt;
&lt;blockquote&gt;
I own a Wii.  I love music. How did I not know about this?&lt;br&gt;
&lt;/blockquote&gt;
Hmm, lets think about this.  When I consider his lifestyle it is like many of my friends. He uses Firefox with ad-blocking software, watches tv only online and usually just via netflix streaming, listens to pandora or online music, works from home/coffee shops, and doesn't drive.  No wonder it slipped under his radar.&lt;br&gt;
&lt;br&gt;
If you want to get his attention (or mine, or most of my friends) you need to leverage the things we do care about and the media we do invest in.  Simply running ads on blogs won't find a growing hoard of us.  Put that information &lt;b&gt;IN&lt;/b&gt; that same blog and then we'll be all over it.&lt;br&gt;
&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31854701-8089257056485254803?l=blog.neodiem.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://thedewmaker.spaces.live.com/blog/cns!B0332087ACE7C96!3173.entry' title='My Online Eyeballs'/><link rel='replies' type='application/atom+xml' href='http://blog.neodiem.com/feeds/8089257056485254803/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=31854701&amp;postID=8089257056485254803' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/8089257056485254803'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/8089257056485254803'/><link rel='alternate' type='text/html' href='http://blog.neodiem.com/2008/12/my-online-eyeballs.htm' title='My Online Eyeballs'/><author><name>Tempus Fugate</name><uri>http://www.blogger.com/profile/11837079658924039253</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02393023594032387684'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31854701.post-4084756489528182801</id><published>2008-12-01T13:15:00.000-08:00</published><updated>2008-12-01T13:27:40.918-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='work'/><category scheme='http://www.blogger.com/atom/ns#' term='planning'/><title type='text'>And...I'm Safe.</title><content type='html'>It's good to know that according to the big analyst firms, the key areas I'm focused on are going to continue to be the top spending areas in this down-turned economy.&lt;br /&gt;
&lt;br /&gt;
InfoWorld reported in an article &lt;a href="http://www.infoworld.com/article/08/11/19/47FE-five-recession-proof-technologies_1.html"&gt;here&lt;/a&gt;, about the findings of several big IT analysis firms what are supposed to be the top 5 spending priorities for the next year.  Not surprisingly, cloud computing and business optimization were up there.  &lt;br /&gt;
&lt;br /&gt;
When the economy isn't doing well, I often get the question about how my business is doing.  The great thing about helping companies &lt;strong&gt;&lt;em&gt;do business better&lt;/em&gt;&lt;/strong&gt; is that tough times are great motivator in the way that years of plenty are not.  Simply put, if they are making lots of money anyway, it's hard to get people to focus on the costs involved.  When they aren't making money so easily, all of sudden they are very interested in what things cost.&lt;br /&gt;
&lt;br /&gt;
You can apply this to your own life too.  Are you in feast or famine?  Should you be making hay while the sun shines, or playing frisbee?  Having billable work is no excuse to put off training, writing, and exercise.&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31854701-4084756489528182801?l=blog.neodiem.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://thedewmaker.spaces.live.com/blog/cns!B0332087ACE7C96!3170.entry' title='And...I&apos;m Safe.'/><link rel='replies' type='application/atom+xml' href='http://blog.neodiem.com/feeds/4084756489528182801/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=31854701&amp;postID=4084756489528182801' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/4084756489528182801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/4084756489528182801'/><link rel='alternate' type='text/html' href='http://blog.neodiem.com/2008/12/andim-safe.htm' title='And...I&apos;m Safe.'/><author><name>Tempus Fugate</name><uri>http://www.blogger.com/profile/11837079658924039253</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02393023594032387684'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31854701.post-1807518862373217138</id><published>2008-11-07T09:21:00.000-08:00</published><updated>2008-11-07T09:23:20.569-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project management'/><category scheme='http://www.blogger.com/atom/ns#' term='planning'/><category scheme='http://www.blogger.com/atom/ns#' term='offshore'/><title type='text'>Preparing For Multi-site Engagements</title><content type='html'>&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 240px;height:185px;" src="http://neodiem.com/img/virtualteam2.jpg" alt="" border="0" /&gt;
I've spent quite a bit of time in the last several years living and learning with the challenges of doing multi-site projects.  From offshore development where I managed teams operating between the US and India, to near-shore development with teams on both coasts of America, to smaller engagements with 6 people in 3 west coast cities.  I've had successes and not a few glorious failures.  It's the pitfalls, missteps, and screw ups that helped me learn the most.&lt;br&gt;
&lt;br&gt;
Recently, I was asked to give some feedback on the things that have the most impact to new multi-site engagements.  This is a pretty common request these days and I've since written down my thoughts so I could present them more consistently.  This post is a very succinct summation of the big ticket items.&lt;br&gt;
&lt;br&gt;
Naturally, much of this advice would be tailored to the specific circumstances and players, but the items discussed in the post are all generically applicable.  If your situation involves working with teams in India or Manila or Slovenia (as examples), you'd want to get some specific tips on dealing with those cultures.  This is no different than if you will be working with any of the Native American nations or in Silicon Valley where there are special considerations.  Always get the heads up so you can be sensitive to the culture in which you'll be working.  But those are for other posts, on with the show.&lt;br&gt;
&lt;br&gt;
My personal guide is an ordered list I cheekily refer to as the Four T's.  In order of impact they are Trust, Time, Transparency, and Talking.  I'll discuss each a little to explain what I mean.&lt;br&gt;
&lt;br&gt;
Building and maintaining trust is the single most critical thing that can impact your engagement.  It is extremely easy to take this for granted, especially since it seems so obvious.  In reality, we rarely address issues of trust head-on in the corporate world, but they become very important when you don't have face-time to rely on in the relationship.  Nothing builds trust as fast as personal bonding time, nothing destroys it faster than a lack of transparency.  Once trust becomes compromised, every other facet becomes harder and more risky.  Without trust, communication become s suspect and morphs from a tool into a weapon.&lt;br&gt;
&lt;br&gt;
If you want to earn trust, get some face-time.  Obviously, in the real world is best, but lacking that, get on a video chat.  You have to be able to read and see body language.  You have to find a way to bond and see each other as people not resources.  You have to allow everyone to take the measure of everyone else and to fill in the mental picture that they'll remember and substitute into every other conversation regardless of media.&lt;br&gt;
&lt;br&gt;
Recognize up front that coordination among parties in different physical locations is inherently going to take more time.  It takes more iterations to verify directional correctness, ensure quality, and declare accomplishments.  Everything just takes more time.  Stop trying to pretend this isn't the case or even to minimize this to act like it won't.  Just prepare and plan for the impact, embrace the reality when it occurs, and don't get cocky when things are going smooth and you think you can tighten up.&lt;br&gt;
&lt;br&gt;
When it comes to operating transparently, make sure you are delivering messages properly.  Any directional messages should be disseminated with the whole team at the same time.  When possible, do all messaging to the entire team at once.  Then reserve your smaller leadership group for issue resolution and check-pointing.  This can feel unwieldy at first, but the dividends it pays in trust will more than make up for it.  If you are suffering from any trust issues, this can be the only chance at repairing the damage and pulling the team back together.&lt;br&gt;
&lt;br&gt;
Lastly, don't under-estimate the power of Talking.  Emails do not carry tone or intent very well.  They aren't very transparent so they wear down the trust and are the easiest road to miscommunication.  This is not to imply you don't write things down.  On the contrary, always follow up your conversations with a written summary of the talking points decisions, action items, etc.  But as much as possible carry your meaningful conversations over voice.  If you can add the element of your face and body language via video, this is all the better.&lt;br&gt;
&lt;br&gt;
These are important things to consider as you move forward but the attitude in which you apply each of them is also critical.  Remember that you aren't planning for efficiency, you plan so that you'll recognize the problems that WILL occur and fix them without a total collapse.  This is similar to how automobiles are designed.  Some years ago, some automobile companies made amazing and powerful engines but you had to take the whole thing apart to change the oil. Other companies came along with designs that weren't as efficient to run, and were a little more expensive to design and build.  But the oil change was a simple thing anyone could do for a few dollars.  Ultimately the more successful designs were those that made it easiest to deal with the challenges that were certain to arise (changing the oil) as efficiently as possible instead of trying to optimize for performance or build cost.&lt;br&gt;
&lt;br&gt;
The last tip I'll offer in this post is about quality and standards.  When doing multi-site engagements that involve parallel efforts or multiple work streams, consider separating the oversight for quality or standards enforcement into an isolated group.  Leaving the oversight functions within the different operating units allows disparities in enforcement or standards to creep in.  This often is construed as unfair advantage or favoritism or something equally nefarious.  Left within each group this disparity is pretty unavoidable and is a very subtle disease that can do a lot of damage when left unchecked.  Making a distinct group responsible for these functions will help avoid this issue and its variants.  It can also serve as a single neck to choke when trouble does arise.&lt;br&gt;
&lt;br&gt;
Don't forget that tips like these aren't any use if you don't treat people with respect and act with integrity.&lt;br&gt;
&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31854701-1807518862373217138?l=blog.neodiem.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://thedewmaker.spaces.live.com/blog/cns!B0332087ACE7C96!3161.entry' title='Preparing For Multi-site Engagements'/><link rel='replies' type='application/atom+xml' href='http://blog.neodiem.com/feeds/1807518862373217138/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=31854701&amp;postID=1807518862373217138' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/1807518862373217138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/1807518862373217138'/><link rel='alternate' type='text/html' href='http://blog.neodiem.com/2008/11/preparing-for-multi-site-engagements.htm' title='Preparing For Multi-site Engagements'/><author><name>Tempus Fugate</name><uri>http://www.blogger.com/profile/11837079658924039253</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02393023594032387684'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31854701.post-8547115771778218192</id><published>2008-07-30T12:47:00.000-07:00</published><updated>2008-12-08T11:10:20.190-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technobabble'/><category scheme='http://www.blogger.com/atom/ns#' term='planning'/><category scheme='http://www.blogger.com/atom/ns#' term='mdm'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>Master Data Management</title><content type='html'>&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 237px; height: 240px;" src="http://neodiem.com/img/olap.jpg" alt="" border="0"&gt; Recently I had the pleasure of discussing with a prospective client  the bulky subject of Master Data Management (MDM).  In this situation the client was considering  a variety of MDM solutions and wanted some specific direction into which technology/vendor to choose from.&lt;br /&gt;
&lt;br /&gt;
Now it is no secret that I tend to favor Microsoft products but in this case the platform already in place was Oracle so naturally, I wanted to give them &lt;a href="http://thedewmaker.spaces.live.com/blog/cns%21B0332087ACE7C96%213105.entry"&gt;more general advice&lt;/a&gt; instead of just pushing MS MDM.&lt;br /&gt;
&lt;br /&gt;
There are quite a few upfront activities that must be done regardless of which products you are going to use.  I've listed some introductory efforts that need to be done earlier in the process and that can be done before production selection.&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt; &lt;li&gt;&lt;strong&gt;Governance&lt;/strong&gt;&lt;br /&gt;
To  get the ball rolling, you really need to figure out what data you are talking about, where it lives, who thinks they own it now, and what organization you need to address this effort.  Here are some suggestions on how to make this go smoothly:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt; &lt;li&gt;&lt;strong&gt;Identify External Data Ownership&lt;/strong&gt;&lt;br /&gt;
Often there will be multiple owners identified for the same data.  Being able to identify these different uses in their various applications is a significant lever used throughout the rest of the process.  Without a clear understanding of where the data is currently 'owned' and its criticality to various applications, mis-matched expectations will cause problems. &lt;/li&gt; &lt;li&gt;&lt;strong&gt;Formalize Ownership in MDM&lt;/strong&gt;&lt;br /&gt;
This often requires significant negotiation and compromise from the various stakeholders.  In organizations where the inter-organization  trust level is high, this is more straight-forward.  In some environments, only a top-down directive will accomplish this.  Whichever tactic is used, establishing formal ownership is a prerequisite for success. &lt;/li&gt; &lt;li&gt;&lt;strong&gt;Identify Data Domains&lt;/strong&gt;&lt;br /&gt;
This sounds a lot easier than it always ends of being.  Attributes utilized by disparate systems often have subtleties in their definitions which must be accommodated.  Being able to provide synonym mapping and transition approaches is imperative to keeping comfort levels high between organizations. &lt;/li&gt; &lt;li&gt;&lt;strong&gt;Formalize Domain Administration Process&lt;/strong&gt;&lt;br /&gt;
Having an established (and hopefully standardized!) set of processes to perform CRUD operations on domains can take the stress out of relationships where trust levels are sub par between applications. &lt;/li&gt; &lt;li&gt;&lt;strong&gt;Establish Organizational Governance&lt;/strong&gt;&lt;br /&gt;
This is often rolled up into Change Management or a similar phase, but in reality needs to be an ongoing activity.  These organizational groupings will allow for escalation procedures, conflict resolution, and increased visibility into the data lifecycles. &lt;/li&gt; &lt;/ol&gt;  &lt;/li&gt;  &lt;br /&gt;
Once you have the basic framework to talk about data ( and who owns it, how it gets maintained, etc. )  you can then delve into the specifics of the data.&lt;br /&gt;
&lt;br /&gt;
&lt;li&gt;&lt;strong&gt;Model Dimensions&lt;/strong&gt;&lt;br /&gt;
If governance is properly addressed, this should be a fairly straightforward exercise for data architects.  They'll go through some steps similar to the following:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt; &lt;li&gt;&lt;strong&gt;Identify Dimensions&lt;/strong&gt;&lt;br /&gt;
What data are you really talking about?  You need to pick a single name for each domain.  Sometimes the same type of data is called different things in different places.  You have to formalize on a common taxonomy. &lt;/li&gt; &lt;li&gt;&lt;strong&gt;Identify Consuming Applications&lt;/strong&gt;&lt;br /&gt;
There may be downstream consumers beyond the currently perceived data owners.  Make sure you understand the data lifecycle and flows so you can estimate impacts properly. &lt;/li&gt; &lt;li&gt;&lt;strong&gt;Identify Entities Per Dimension&lt;/strong&gt;&lt;br /&gt;
Make sure you flesh out the taxonomy down to the most granular level necessary.  The more detail you include now, the more hours saved later. &lt;/li&gt; &lt;li&gt;Identify Entity Attributes&lt;br /&gt;
This is a critical step that is often treated as a second-class citizen.  In reality, it is a key driver.  Without precision about attributes, the potential values and rules (which come next) can't be properly defined.  It also means your estimates will be incorrect.  &lt;/li&gt; &lt;li&gt;&lt;strong&gt;Quantify Attribute Values&lt;/strong&gt;&lt;br /&gt;
This is only as important as the complexity of the data rules (which come next) and the accuracy of your rule implementation estimates need to be.  If your sources have this well defined, it should be straightforward to ensure this is comprehensive. &lt;/li&gt; &lt;li&gt;&lt;strong&gt;Identify Data Rules&lt;/strong&gt;&lt;br /&gt;
This is sometimes referred to ambiguously as Business Rules which is very imprecise.  Here we are speaking not to rules governing operations or activities (hence the term Business) but instead the states, lifecycles, and value cohorts for entities and domains. &lt;/li&gt; &lt;/ol&gt;  &lt;/li&gt; &lt;/ul&gt; &lt;br /&gt;
As you can well imagine this is a significant undertaking for any organization, and can be done in a technology agnostic way.  Once you've identified and quantified this information, you can begin to look at transition plans, data flow planning and infrastructure.  These are very technology and environmentally specific.&lt;br /&gt;
&lt;br /&gt;
As the proverb states: "Measure twice, cut once."&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31854701-8547115771778218192?l=blog.neodiem.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://thedewmaker.spaces.live.com/blog/cns!B0332087ACE7C96!3105.entry' title='Master Data Management'/><link rel='replies' type='application/atom+xml' href='http://blog.neodiem.com/feeds/8547115771778218192/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=31854701&amp;postID=8547115771778218192' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/8547115771778218192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/8547115771778218192'/><link rel='alternate' type='text/html' href='http://blog.neodiem.com/2008/07/master-data-management.htm' title='Master Data Management'/><author><name>Tempus Fugate</name><uri>http://www.blogger.com/profile/11837079658924039253</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02393023594032387684'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31854701.post-1126555895747230090</id><published>2008-06-23T17:12:00.000-07:00</published><updated>2008-12-08T11:08:46.982-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='device'/><category scheme='http://www.blogger.com/atom/ns#' term='technobabble'/><category scheme='http://www.blogger.com/atom/ns#' term='music'/><title type='text'>I Just Want My Media on My TV</title><content type='html'>&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 240px;height:180px;" src="http://neodiem.com/img/mediacenterstartmenu.jpg" alt="" border="0" /&gt;
The last couple of weeks have been ridiculously frustrating.  All I want is to get my media, on my television, playing the sound through my stereo. This should be a no brainer, right?&lt;br&gt;
&lt;br&gt;
Well it turns out that once again I must be just an outlying data point in the world of consumer electronics.  What a frustrating adventure this is turning out to be. I've tried lots of different combinations with mixed bag of success and no clear winners.  To start with here's a quick run-down of my basic requirements.&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;My media is on two big hard-drives:
&lt;ul&gt;
&lt;li&gt;1TB external hard-drives&lt;/li&gt;
&lt;li&gt;accessible via USB&lt;/li&gt;
&lt;li&gt;willing to share them over the net with an always on pc, but prefer to just plug them in&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;My media is very big and mixed:
&lt;ul&gt;
&lt;li&gt;about 100K songs, from 10K artists, all in MP3, with cover art and ratings embedded in the tags (about 600 GBs)&lt;/li&gt;
&lt;li&gt;about 10k high-quality pictures (about 100GB)&lt;/li&gt;
&lt;li&gt;about 3K videos, mostly DIVX and XVID, organized in folders by type, series, season, etc. (about 400 GB)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;I need to navigate music by playlists, artists, and genre. I've listed them in the order of importance to me. Playlists need to be 'smart' so they'll respect the ratings, genre, etc. that have been painstakingly maintained. For example, a playlist would be 'Songs in Genre = Folk, Subgenre = Acoustic, Rating &gt; 3'&lt;/li&gt;
&lt;li&gt;Displaying cover art from the file is a must. Displaying other tag attributes is a nice-to-have.&lt;/li&gt;
&lt;li&gt;Displaying a picture slide-show while playing songs is a must.
&lt;ul&gt;
&lt;li&gt;Being able to choose a specific directory is a nice-to-have.&lt;/li&gt;
&lt;li&gt;Being able to pick a set of specific directories is a nice-to-have.&lt;/li&gt;
&lt;li&gt;Assigning a set of directories to a playlist is a nice-to-have.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Being able to navigate videos by type, show, season is important.&lt;/li&gt;
&lt;li&gt;Output via HDMI or DVI is important.&lt;/li&gt;
&lt;li&gt;I have no interest in using a tv tuner, scheduling recordings or any of that other TV nonsense. So not having it in my way is a good thing.&lt;/li&gt;
&lt;li&gt;Being able to edit ratings on screen is important.&lt;/li&gt;
&lt;li&gt;Being able to create playlists on the fly is important.&lt;/li&gt;
&lt;li&gt;Being able to shuffle by playlist, album, artist is important.&lt;/li&gt;
&lt;li&gt;Media will get added routinely, so being able to monitor the folders on the drives is important.&lt;/li&gt;
&lt;li&gt;Start-up time for spinning up music and videos is important.&lt;/li&gt;
&lt;li&gt;Being able to navigate the very large amount of media quickly and by different attributes is important.&lt;/li&gt;
&lt;li&gt;Being able to access this media from more than one television is important.&lt;/li&gt;
&lt;li&gt;Being able to do all this without a dedicated, always-on pc, is only a nice-to-have.&lt;/li&gt;
&lt;li&gt;Being able to get all this with commercial off-the-shelf stuff is important. I don’t crack boxes, and most soft-mods are off the table too.&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
When it comes to home electronics, I'm no slouch.  I've been trying a whole host of devices and combinations.  For example the &lt;a href="http://www.amazon.com/Netgear-EVA8000-Digital-Entertainer-HD/dp/B000NNBK9O/ref=sr_1_1?ie=UTF8&amp;s=electronics&amp;qid=1214263095&amp;sr=8-1"&gt;Netgear EVA8000 Digital Entertainer HD&lt;/a&gt; and the &lt;a href="http://helios-labs.com/"&gt;Helios X5000 Network Media Player&lt;/a&gt; are two examples I've tried.  They both really suck.  Not only are they slow and can't do half of what I need, they are expensive and crashed often.&lt;br&gt;
&lt;br&gt;
I do have a Windows Media Center pc (from Windows Vista Ultimate) which is a pretty good interface. And we have two Xbox 360's.  There are multiple ways to connect these bad boys, but the really obvious one (as a Media Extender) doesn't seem to work out of the box.  Being pretty good at figuring this crap out, if I can't get it to work after a couple long sessions of fiddling, it's just not meant to be (for me). Tips anyone?&lt;br&gt;
&lt;br&gt;
One option I'm considering is the &lt;a href="http://apple.com/appletv"&gt;Apple TV&lt;/a&gt;.  The interface is one of the slickest I've ever seen and the speed appears acceptable.  But it won't play my videos without jumping through mod hoops and I'm not a fan of that.  Unless someone has an alternative?&lt;br&gt;
&lt;br&gt;
So now you know my predicament.  What else should I try?  Ideas? Anyone? Bueller? Bueller?&lt;br&gt;
&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31854701-1126555895747230090?l=blog.neodiem.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://thedewmaker.spaces.live.com/blog/cns!B0332087ACE7C96!3073.entry' title='I Just Want My Media on My TV'/><link rel='replies' type='application/atom+xml' href='http://blog.neodiem.com/feeds/1126555895747230090/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=31854701&amp;postID=1126555895747230090' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/1126555895747230090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/1126555895747230090'/><link rel='alternate' type='text/html' href='http://blog.neodiem.com/2008/06/i-just-want-my-media-on-my-tv.htm' title='I Just Want My Media on My TV'/><author><name>Tempus Fugate</name><uri>http://www.blogger.com/profile/11837079658924039253</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02393023594032387684'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31854701.post-1636193752223274317</id><published>2008-06-02T16:43:00.001-07:00</published><updated>2008-06-02T16:46:35.373-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal spew'/><category scheme='http://www.blogger.com/atom/ns#' term='technobabble'/><title type='text'>It's Been A Circus</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://neodiem.com/img/clownfeet.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 320px;" src="http://neodiem.com/img/clownfeet.jpg" alt="" border="0" /&gt;&lt;/a&gt;Sorry for the delay guys!&lt;br&gt;
&lt;br&gt;
Lately it has been a circus around here.  Lots of new projects and learning going on these days. Who's in a recession?  Not the tech industry!&lt;br&gt;
&lt;br&gt;
So I've been working on Facebook Apps, MOSS customizations, writing tons of Silverlight widgets, reams of XAML and buckets of boatloads of WPF.&lt;br&gt;
&lt;br&gt;
I'll bring you up to date on the latest shenanigans once things calm down a bit. Feel free to post questions if you want to spur my creative juices!&lt;br&gt;
&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31854701-1636193752223274317?l=blog.neodiem.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.neodiem.com/feeds/1636193752223274317/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=31854701&amp;postID=1636193752223274317' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/1636193752223274317'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/1636193752223274317'/><link rel='alternate' type='text/html' href='http://blog.neodiem.com/2008/06/its-been-circus.htm' title='It&apos;s Been A Circus'/><author><name>Tempus Fugate</name><uri>http://www.blogger.com/profile/11837079658924039253</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02393023594032387684'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31854701.post-2727623770183559208</id><published>2008-04-25T11:23:00.000-07:00</published><updated>2008-04-25T12:19:06.838-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='technobabble'/><category scheme='http://www.blogger.com/atom/ns#' term='leadership'/><title type='text'>Leadership and Agile</title><content type='html'>&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 188px;height:240px;" src="http://neodiem.com/img/tworoads.jpg" alt="" border="0" /&gt;
This week I had several opportunities to speak with people about Agile.&lt;br&gt;
&lt;br&gt;
As I listened to yet another discussion about Agile there were several things about the conversation that just really stuck out to me.  It started with one strong idea of which I just couldn't seem to let go:
&lt;blockquote&gt;
Agile is great under the umbrella of strong leadership.  If the direction, metrics or criteria for success aren't well understood and broadly accepted across the organization, then returns on investment and efficiencies will likely not be realized.&lt;br&gt;
&lt;/blockquote&gt;
&lt;br&gt;
In high-performing companies the gestalt is achieved when the employees are empowered to self-direction and a feeling of ownership.  Even in these companies, that sense of empowerment and value is only powerful as the individual choices and decisions can be aligned to the bigger vision of the organization as a whole. When the vision or mandates of the organization aren't clearly articulated or fail to be fully accepted within the ranks, then organizations experience churn and confusion.  Without alignment to a bigger mission, the agendas from the various levels of management tend to begin conflicting and drifting as individual interpretations of value and success criteria are formed.  This churn due to conflicting expectations makes it easier for issues to hide and for misalignment to go unchecked for increasing periods of time.&lt;br&gt;
&lt;br&gt;
Even in cases where misalignment is uncovered, the process needed to achieve consensus can then take longer and without strong leadership won't necessarily drive the business impact needed for growth or even sustainment.&lt;br&gt;
&lt;br&gt;
This then is the crux.  Leadership is essential for achieving business value.  You can use Agile processes to seek business value, but without strong leadership you will find the criteria for success shifting too often and hiding behind the easy process of consensus building.&lt;br&gt;
&lt;br&gt;
To bring this back to the Agile conversations, I was feeling frustration with the reactive nature of those who ascribe to the Agile approaches.  They espouse this easy-going attitude of reaction in which direction, strategy, and even the definition of business value are left completely to the client.  This zen-like state in which the Agile practitioner responds fluidly to the changing and ethereal nature of the client demands is unnatural and impractical.  Business value is unlocked by making the hard choices, by understanding the elements of the business value and capability chain better than everyone else and leveraging that unfair advantage.&lt;br&gt;
&lt;blockquote&gt;
The reasonable man adapts himself to the world; the unreasonable one persists in trying to adapt the world to himself. &lt;br&gt;
Therefore, all progress depends on the unreasonable man.&lt;br&gt;
-- &lt;b&gt;George Bernard Shaw &lt;/b&gt;
&lt;/blockquote&gt;
&lt;br&gt;
Simply put, it is called &lt;b&gt;work&lt;/b&gt; because it IS hard.  It's painful and requires discipline.  If you are choosing to avoid the hard choices you are inevitably giving up the business advantages, wasting opportunities, and releasing accountability.  Live in a reactive mode long enough and you remove the incentive to estimate well, to live up to commitments, and to deliver beyond expectations.&lt;br&gt;
&lt;br&gt;
As everyone in technology knows, regardless of how long a task &lt;i&gt;should&lt;/i&gt; take, it always takes at least as long as the plan said it should.  We don't finish early, we just fill up the extra time with more stuff and junk.  We test a little more, refine a little more, increase scope if necessary.  If you aren't pushing the boundary and requiring unreasonable attainment, then you'll never get it either.&lt;br&gt;
&lt;br&gt;
When it comes to Agile, I embrace the incremental nature.  I covet the consensus of reactive expectations.  I do not respect the reduced commitment to discipline, the minimization of leadership, or the dismissal of accountability afforded a facilitator.  As Harry would say, "If you are going to come, come correct."  Harry can be very wise.&lt;br&gt;
&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31854701-2727623770183559208?l=blog.neodiem.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://thedewmaker.spaces.live.com/blog/cns!B0332087ACE7C96!3042.entry' title='Leadership and Agile'/><link rel='replies' type='application/atom+xml' href='http://blog.neodiem.com/feeds/2727623770183559208/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=31854701&amp;postID=2727623770183559208' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/2727623770183559208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/2727623770183559208'/><link rel='alternate' type='text/html' href='http://blog.neodiem.com/2008/04/leadership-and-agile.htm' title='Leadership and Agile'/><author><name>Tempus Fugate</name><uri>http://www.blogger.com/profile/11837079658924039253</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02393023594032387684'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31854701.post-4332184335404029287</id><published>2008-04-01T17:01:00.000-07:00</published><updated>2008-04-01T17:23:39.577-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='web services'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>Free Code</title><content type='html'>&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 240px; height: 90px;" src="http://chart.apis.google.com/chart?cht=p3&amp;amp;chd=t:70,30&amp;amp;chs=240x90&amp;amp;chl=Tempus%7CFugate" alt="" border="0"&gt;  Lately, I've been really paying attention to how much functionality you can reuse for free from major players.  For example, you can check out the various Google APIs (&lt;a href="http://code.google.com/"&gt;http://code.google.com/&lt;/a&gt;)and the Yahoo! User Interface Library (&lt;a href="http://developer.yahoo.com/yui/"&gt;http://developer.yahoo.com/yui/&lt;/a&gt;).  These libraries are free, released via Open Source licenses, and offer ridiculous amounts of functionality.&lt;br /&gt;
&lt;br /&gt;
As a developer, I love the idea of being able to leverage the work of other people.  Most of the time, this is hard to do because so much of the code that everyone else writes is crap.  ;-)  But seriously, there is even a name for this, we call it Not Invented Here (NIH). The premise being most developers like to know exactly what their code is going to do, so using someone else's code can be hard.&lt;br /&gt;
&lt;br /&gt;
In the case of the big boys like Yahoo! and Google, it becomes a lot easier to trust that the code is going to deliver expected results and not be malicious or buggy.  After all, when it is provided (and used) by a company with billions of dollars of online reputation to uphold, you can pretty much bet they've tested it.&lt;br /&gt;
&lt;br /&gt;
Which isn't to say that just because they are all that, you don't need your own bag of chips, they have their issues too. Dependency and version issues, occasional bugs, and warped programming models are abundant.  But in the end, you are definitely getting your moneys worth.&lt;br /&gt;
&lt;br /&gt;
The chart at the top of this post is generated using the super cool (and free!) Google Chart API which means I won't be paying for Dundas or ChartFX licenses again.  You can find the details at &lt;a href="http://code.google.com/apis/chart/"&gt;http://code.google.com/apis/chart/&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31854701-4332184335404029287?l=blog.neodiem.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://thedewmaker.spaces.live.com/blog/cns!B0332087ACE7C96!3026.entry' title='Free Code'/><link rel='replies' type='application/atom+xml' href='http://blog.neodiem.com/feeds/4332184335404029287/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=31854701&amp;postID=4332184335404029287' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/4332184335404029287'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/4332184335404029287'/><link rel='alternate' type='text/html' href='http://blog.neodiem.com/2008/04/free-code.htm' title='Free Code'/><author><name>Tempus Fugate</name><uri>http://www.blogger.com/profile/11837079658924039253</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02393023594032387684'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31854701.post-4057356558501714045</id><published>2008-03-10T11:40:00.000-07:00</published><updated>2008-03-10T11:43:28.247-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>Why Unit Test?</title><content type='html'>&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 161px;height:240px;" src="http://neodiem.com/img/lonetreedirt.jpg" alt="" border="0" /&gt;

Recently, I had a down and dirty discussion with a team who is gearing up for a new engagement.  This team has been doing Scrum for a while but was struggling with how to fold testing more tightly into their development processes.&lt;br&gt;
&lt;br&gt;
The heart of the matter ended up being differences in the purpose and perception of Unit Tests specifically.  One camp saw the role of Unit Test as "to find bugs".  That's it.  They tell you where the bugs are.  If they are just about finding bugs, they have more value to new developers than established developers.  After all, great developers are much less likely to allow the kind of bugs found by Unit Tests in their code.  As a great developer I'm going to catch bad parameters and logic flaws before checking in my code.  Integration and functional bugs are probably not going to be found in Unit Tests anyway. &lt;br&gt;
&lt;br&gt;
The other camp (read: in my opinion) was resolute that Unit Tests fill a much larger purpose.  To my eyes, Units Tests go way beyond just finding bugs.  Following are four big ways that Unit Tests can add significant value over and above just finding bugs.&lt;br&gt;
&lt;br&gt;
&lt;b&gt;Proving Integration&lt;/b&gt;&lt;br&gt;
Today's applications are more distributed and componentized than ever.  The number of moving parts has just sky-rocketed with the use of frameworks and new API's, the prevalence of SOA and more  component-oriented designs.  Personally I see goodness here, but regardless if you like this direction or not, it's happening and is relevant to address.  With this fragmentation comes a need to understand when the integration between components is complete.  Simple Unit Tests can tell you quickly if the work being delegated downstream of a component is completed and ready. As you are bringing on multiple layers of components the pass rates of the Unit Tests at various layers can quickly show you the level of completeness for the entire integrated system.&lt;br&gt;
&lt;br&gt;
&lt;b&gt;Sample Code&lt;/b&gt;&lt;br&gt;
One of the difficult parts of delivering a complete software product especially when the product is a framework or an API, if the product is extensible or supports programmability.  In these cases specifically, Unit Tests can serve as great examples of how to utilize the API or exercise the programming model.  They can often be directly consumed as documentation and sample code for SDKs or in knowledge transfers throughout the life of the product.  Building this from outside the team without relying on the author of the component is extremely costly and difficult.  However the returns are typically the most valuable.&lt;br&gt;
&lt;br&gt;
&lt;b&gt;Proving Design&lt;/b&gt;&lt;br&gt;
Designing and building components is easy with the current toolsets. The downside of this is that we can create classes and objects so easily that we don't always think about the bigger picture.  Taking time to write code that exercises a new component or interface can act as a sanity check to ensure that the component is easy to use and meets the programmability desires. It's quite often that I see a single API that requires two or three different programming or data interaction models.  Some quick Unit Tests would have shown the designer how difficult and inconsistent the usage of the API had become.&lt;br&gt;
&lt;br&gt;
&lt;b&gt;Change Management&lt;/b&gt;&lt;br&gt;
As a great engineer, it might be totally natural for you to write code that has few bugs.  Are the engineers who take up your legacy as experienced?  Will the engineer who will open the code in six months to add some features or fix an integration issue be as comfortable knowing how to change things without breaking anything? Would you?  Being able to run regressions over time adds a wonderful safety net in the identification of the impact of changes upstream, downstream, or inside your code.  It doesn't mean you will (or can) catch everything with Unit Tests but it can sure give you a head start and a level of confidence.&lt;br&gt;
&lt;br&gt;
So perhaps this is more about semantics or expectation setting, but I think it helps to keep in mind the variety of purposes Unit Testing can serve.  When you expand the contributions made by Unit Tests hopefully you will have an incentive to get even your experienced engineers to spend time writing them.&lt;br&gt;
&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31854701-4057356558501714045?l=blog.neodiem.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://thedewmaker.spaces.live.com/blog/cns!B0332087ACE7C96!3006.entry' title='Why Unit Test?'/><link rel='replies' type='application/atom+xml' href='http://blog.neodiem.com/feeds/4057356558501714045/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=31854701&amp;postID=4057356558501714045' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/4057356558501714045'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/4057356558501714045'/><link rel='alternate' type='text/html' href='http://blog.neodiem.com/2008/03/why-unit-test.htm' title='Why Unit Test?'/><author><name>Tempus Fugate</name><uri>http://www.blogger.com/profile/11837079658924039253</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02393023594032387684'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31854701.post-1459177655368712194</id><published>2008-03-04T21:07:00.000-08:00</published><updated>2008-03-04T21:08:57.534-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='principles'/><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='leadership'/><title type='text'>Are You Sure?</title><content type='html'>&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 240px;height:192px;" src="http://neodiem.com/img/signposts.jpg" alt="" border="0" /&gt;
It is a pretty normal day for me when a friend says they want to accomplish something and yet they have no idea how to go about it.  They want to start a business, but aren't sure what kind of business.  They want to make more money, but aren't sure how.  They want to get certified/learn new technology/become famous/[insert random goal here].  In all cases, they have an ambiguous idea but not a specific agenda.&lt;br&gt;
&lt;br&gt;
&lt;blockquote&gt;
A man with a watch knows what time it is. A man with two watches is never sure.
 -- &lt;b&gt;Segal's Law&lt;/b&gt;
&lt;/blockquote&gt;
&lt;br&gt;
In our era of The Paradox of Choice, it is the amazing potential we all have to stand on the shoulders of giants and achieve greatness that is most often our downfall.&lt;br&gt;
&lt;br&gt;
We have to choose every day as engineers which technologies to support, which languages to learn, which certifications to pursue.  We are bombarded with choices for what social networks to participate in, which email system to rely on, and should we use an Mac or PC?  Is it IPhone or Windows Mobile?&lt;br&gt;
&lt;br&gt;
As an architect, the most valuable thing you can do is be deliberate in your choices.  The hard part is being deliberate quickly.  Digesting the massive amounts of ambiguity at a breathtaking pace to synthesize answers and clarity as and when they are needed, usually well before the obvious answers have become apparent.  If being an architect was just about picking the obvious when it became obvious, then everyone could do it. (Which probably explains why everyone thinks they can do it.)&lt;br&gt;
&lt;br&gt;
If you want to get out there and do something, first narrow down what that something might be.  Perhaps start by writing down what it isn't.  Then start writing down the attributes or identifying characteristics for what it is.  If you can describe what the world looks like when you've achieved your goal, you'll be a good way towards deciding what road will get you there.&lt;br&gt;
&lt;br&gt;
Or don't.&lt;br&gt;
&lt;br&gt;
It's your choice.&lt;br&gt;
&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31854701-1459177655368712194?l=blog.neodiem.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://thedewmaker.spaces.live.com/blog/cns!B0332087ACE7C96!3001.entry' title='Are You Sure?'/><link rel='replies' type='application/atom+xml' href='http://blog.neodiem.com/feeds/1459177655368712194/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=31854701&amp;postID=1459177655368712194' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/1459177655368712194'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/1459177655368712194'/><link rel='alternate' type='text/html' href='http://blog.neodiem.com/2008/03/are-you-sure.htm' title='Are You Sure?'/><author><name>Tempus Fugate</name><uri>http://www.blogger.com/profile/11837079658924039253</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02393023594032387684'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31854701.post-3285801818231213931</id><published>2008-02-20T09:16:00.000-08:00</published><updated>2008-02-20T09:22:16.739-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technobabble'/><category scheme='http://www.blogger.com/atom/ns#' term='project management'/><category scheme='http://www.blogger.com/atom/ns#' term='offshore'/><title type='text'>Offshoring for Rank and File</title><content type='html'>&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 208px;height:240px;" src="http://neodiem.com/img/borat.jpg" alt="" border="0" /&gt;

I've been doing offshore work as long as the next guy, if the next guy has been doing it for almost a decade.  There are successes and failures and lots of learning along the way.  It's hardly the only thing I've done, but it's a good share of the pot.&lt;br&gt;
&lt;br&gt;
Recently, I was asked to speak with some gents about how their offshore effort was going.  Which is usually code for "We don't think it's going well".  And by all accounts from the team, it wasn't going all that well.  It helps when everyone at least starts from the level of dissatisfaction.&lt;br&gt;
&lt;br&gt;
Whenever we start to talk about the concept of managing work efforts in more than one location, everyone spits out the same mantras.  Communicate, be sensitive to cultural differences, etc.  The thing is there aren't all that many that have moved past the theory into practical application.  I should say demonstrably successful application.  A big part of this shortcoming, from my perspective, has been that while we can have concepts in our heads like cultural differences, and detailed communication plans, we miss what can be the subtle point of these guidelines.&lt;br&gt;
&lt;br&gt;
Let's borrow from a recent experience at Big Redmond Software Company.  Companies (like Microsoft or Google) don't really run tight ships.  Not in the way the unfamiliar would think.  At the foundation, they expect individuals to be very self-sufficient and to work with minimal communication.  Contributors are expected to bridge gaps in their own style.  These companies are impactful because they have leveraged the ability to walk down the hall and say "Build this" while pointing to the contents of a Visio diagram or the corner of a whiteboard.  The resources are expected to be accountable for the applicability and context of their solutions, not just the code or outputs they produce. The business value driving the work should naturally be taken into account by the self-reliant resources who are tasked with unlocking that capability.&lt;br&gt;
&lt;br&gt;
When you start moving that work to different geographies and timezones, suddenly that level of communication isn't enough.  The expectation on all parties is to minimize communication since that is a cost both parties share.  But how they each tend to approach that goal is often different.  Remember that the sender is expecting to point and grunt and have accountability and context magically shift.  They'll be available for questions, they expect to review the progress and deliverables and throw stones along the way.  But if it takes more than [insert arbitrary threshold here] energy and time commitment, then it just isn't working out.  It would have been easier to do it myself in house.&lt;br&gt;
&lt;br&gt;
Meanwhile, the receiver of the work has an expectation that the work will be fully-formed, coherent, and that they will not have significant decision-making requirements.  Give me enough information up-front to be self-sufficient and yardstick with which to measure success.  I'll come back when the output meets the success criteria.  My accountability only extends to the output according to the specifications and acceptance criteria.  If those have been ill-defined, that is the senders responsibility.&lt;br&gt;
&lt;br&gt;
Obviously, I over simplify a little and as always YMMV.  But in practice, understanding the different accountability and communication expectations we place on resources on different sides of a pond (or client-facing fence) will help you be more successful at leveraging offshore resources.&lt;br&gt;
&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31854701-3285801818231213931?l=blog.neodiem.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://thedewmaker.spaces.live.com/blog/cns!B0332087ACE7C96!2988.entry' title='Offshoring for Rank and File'/><link rel='replies' type='application/atom+xml' href='http://blog.neodiem.com/feeds/3285801818231213931/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=31854701&amp;postID=3285801818231213931' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/3285801818231213931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/3285801818231213931'/><link rel='alternate' type='text/html' href='http://blog.neodiem.com/2008/02/offshoring-for-rank-and-file.htm' title='Offshoring for Rank and File'/><author><name>Tempus Fugate</name><uri>http://www.blogger.com/profile/11837079658924039253</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02393023594032387684'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31854701.post-574555194288757736</id><published>2008-02-02T11:57:00.000-08:00</published><updated>2008-02-02T12:00:24.211-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='technobabble'/><title type='text'>How "Open" Can It Be?</title><content type='html'>&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 168px;height:240px;" src="http://neodiem.com/img/fistofmoney.jpg" alt="" border="0" /&gt;
Something that has bothered me from the beginning of the Open Source movement (and I use the word very loosely) is the seeming hypocrisy of these commercial companies that have huge revenue streams based around the idea of Open Source software.&lt;br&gt;
&lt;br&gt;
Not to go off on a rant here, but how &lt;b&gt;&lt;i&gt;open&lt;/i&gt;&lt;/b&gt; can they really be when they've got hundreds of people paying money for them to support their specific releases?  To my mind the idea of Open Source was always that the source could and would be extended by the community at large.  However if you are going to start asking people to pay for the specific versions of extensions that you are providing, you've essentially closed the system.  At this point, it seems to me you aren't an Open Source contributor any more.  You are someone who took an Open Source offering, tweaked it, and are now asking people to pay for your tweaks, thereby closing it.  If you did this once, perhaps a point could be argued, but when you've been building on &lt;b&gt;YOUR&lt;/b&gt; specific tweaks for release after release, and your support policies are version specific, then you are just like any other software company.  Okay, perhaps there is a little more transparency into the code, but still.&lt;br&gt;
&lt;blockquote&gt;
” SANTA CLARA, CA January 16, 2008 Sun Microsystems, Inc. (NASDAQ: JAVA) today announced it has entered into a definitive agreement to acquire MySQL AB, an open source icon and developer of one of the world's fastest growing open source databases for approximately $1 billion in total consideration. The acquisition accelerates Sun's position in enterprise IT to now include the $15 billion database market. Today's announcement reaffirms Sun's position as the leading provider of platforms for the Web economy and its role as the largest commercial open source contributor.”&lt;br&gt;
From:  &lt;a href="http://www.sun.com/aboutsun/pr/2008-01/sunflash.20080116.1.xml"&gt;http://www.sun.com/aboutsun/pr/2008-01/sunflash.20080116.1.xml&lt;/a&gt;
&lt;br&gt;
&lt;/blockquote&gt;
&lt;br&gt;
Exactly how open to the inputs of Joe developer are they really going to be when they have to sustain a $15 &lt;i&gt;billion&lt;/i&gt; dollar Support industry around these products.  Do they really expect us to believe they are going to leave the evolution of these products to the average engineer?  The community at large?  Hell no.  They have product teams and planners and release strategists just like every one else.  They just don't have the huge upfront investment in research and development, they essentially jumpstarted their code from the masses.  And they won't have a huge testing effort, they'll just rest on the backs of the industry at large. Which makes for good stability.&lt;br&gt;
&lt;br&gt;
I hate to see such blatant parasitical behavior cowering behind the beauty that could be Open Source.  Greedy bastards.&lt;br&gt;
&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31854701-574555194288757736?l=blog.neodiem.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://thedewmaker.spaces.live.com/blog/cns!B0332087ACE7C96!2976.entry?' title='How &quot;Open&quot; Can It Be?'/><link rel='replies' type='application/atom+xml' href='http://blog.neodiem.com/feeds/574555194288757736/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=31854701&amp;postID=574555194288757736' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/574555194288757736'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/574555194288757736'/><link rel='alternate' type='text/html' href='http://blog.neodiem.com/2008/02/how-open-can-it-be.htm' title='How &quot;Open&quot; Can It Be?'/><author><name>Tempus Fugate</name><uri>http://www.blogger.com/profile/11837079658924039253</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02393023594032387684'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31854701.post-628427935262218026</id><published>2008-01-16T17:15:00.000-08:00</published><updated>2008-01-16T17:22:12.993-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technobabble'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Running The Gauntlet</title><content type='html'>&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 240px;height:233px;" src="http://neodiem.com/img/gauntletshirt.jpg" alt="" border="0" /&gt;

This week I had the chance to discuss using Team Foundation Server in a large team setting specifically as concerns Build and Deployment.&lt;br&gt;
&lt;br&gt;
As I was organizing my thoughts to answer a question about check-in policies, merging and branching, and so forth and I kept coming back to my guiding principles:&lt;br&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;The Build is the build.  There is only one Build.&lt;br&gt;&lt;/li&gt;
&lt;li&gt;Build anywhere you like, as much as you like, but it only counts if it is in the Build.&lt;br&gt;&lt;/li&gt;
&lt;li&gt;If it doesn't work in the Build, it doesn't work.&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
Now I am certainly familiar with having to manage simultaneous release schedules, juggling branches, and so forth, but that doesn't mean I like it.  I absolutely support the mainline concept.  Much like the Highlander, when it comes to the build, there can be only one.&lt;br&gt;
&lt;br&gt;
We could argue that there are many techniques to allow these fancy behaviors but that doesn't make it okay.  Just because you &lt;b&gt;can&lt;/b&gt; do something, doesn't mean you &lt;i&gt;should&lt;/i&gt;.  Experience tells us that if you have a big team, you can't afford to have anyone interrupt the flow of the system.  This includes breaking the build, causing failures of critical tests, etc.  When more people or organizations are involved, the cost increases.&lt;br&gt;
&lt;br&gt;
In the agile communities there is a push towards Continuous Integration (CI) which is really an attempt to implement the Only One Build concept as an ideal.  When you can do it, you should.  When the amount of code grows or the number of loose connections increases this can be cost-prohibitive, primarily in time.  Compiling 1.8 million lines of code is going to take a little while regardless of how big the build machine might be.  And when it comes to running Build Verification Tests, these problems are compounded.  Especially if you are using disparate services that are loosely coupled.&lt;br&gt;
&lt;br&gt;
The idea behind CI is to bring compilation and integration issues to the attention of the team as soon as possible thereby minimizing distribution.  Going beyond that are tools that would actually test code entering the system before check-ins occur and reject or accept them based on the results.  With TFS policies this is fairly straightforward to set up and an open source effort has begun to bring this to life.  You can find out more about this effort at &lt;a href="http://www.opengauntlet.org/"&gt;http://www.opengauntlet.org/&lt;/a&gt;. &lt;br&gt;
&lt;br&gt;
If you prefer to wait until this functionality is built-in, you'll be glad to know that the next product release most likely will include a similar feature with a working title of "Gated Checkin". &lt;br&gt;
&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31854701-628427935262218026?l=blog.neodiem.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://thedewmaker.spaces.live.com/blog/cns!B0332087ACE7C96!2966.entry' title='Running The Gauntlet'/><link rel='replies' type='application/atom+xml' href='http://blog.neodiem.com/feeds/628427935262218026/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=31854701&amp;postID=628427935262218026' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/628427935262218026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/628427935262218026'/><link rel='alternate' type='text/html' href='http://blog.neodiem.com/2008/01/running-gauntlet.htm' title='Running The Gauntlet'/><author><name>Tempus Fugate</name><uri>http://www.blogger.com/profile/11837079658924039253</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02393023594032387684'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31854701.post-2074145883365180571</id><published>2007-12-23T17:38:00.000-08:00</published><updated>2008-12-08T11:10:48.047-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='device'/><category scheme='http://www.blogger.com/atom/ns#' term='technobabble'/><category scheme='http://www.blogger.com/atom/ns#' term='phone'/><title type='text'>I Need A New Phone</title><content type='html'>My friend has a cool Nokia with a 3 or 4 megapixel camera and it just puts my Dash to shame.  Which means that now I'm in the market for a new phone.&lt;br /&gt;
&lt;br /&gt;
Here are some things I care about in weighted order of importance:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-left: 40px;"&gt;1. 3+ megapixels&lt;br /&gt;
2. autofocus&lt;br /&gt;
3. windows mobile 5+&lt;br /&gt;
4. works on t-mobile&lt;br /&gt;
72. standard headphone jack&lt;br /&gt;
74. sd card slot&lt;br /&gt;
81. flash&lt;br /&gt;
89. gps&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
So any ideas?&lt;br /&gt;
&lt;br /&gt;
Right now I am considering the HTC Touch Cruise and the HTC TyTN II.  But I'd love to find some more options to choose from.  Surely there are other choices?&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31854701-2074145883365180571?l=blog.neodiem.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://thedewmaker.spaces.live.com/blog/cns!B0332087ACE7C96!2942.entry' title='I Need A New Phone'/><link rel='replies' type='application/atom+xml' href='http://blog.neodiem.com/feeds/2074145883365180571/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=31854701&amp;postID=2074145883365180571' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/2074145883365180571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31854701/posts/default/2074145883365180571'/><link rel='alternate' type='text/html' href='http://blog.neodiem.com/2007/12/i-need-new-phone.htm' title='I Need A New Phone'/><author><name>Tempus Fugate</name><uri>http://www.blogger.com/profile/11837079658924039253</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02393023594032387684'/></author><thr:total>1</thr:total></entry></feed>