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

<channel>
	<title>Programmer Joe &#187; Engineering</title>
	<atom:link href="http://programmerjoe.com/category/engineering/feed/" rel="self" type="application/rss+xml" />
	<link>http://programmerjoe.com</link>
	<description>Joe Ludwig's blog</description>
	<lastBuildDate>Sat, 17 Jul 2010 22:55:56 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>50 things I never need to hear at another conference</title>
		<link>http://programmerjoe.com/2009/09/20/50things/</link>
		<comments>http://programmerjoe.com/2009/09/20/50things/#comments</comments>
		<pubDate>Sun, 20 Sep 2009 16:16:05 +0000</pubDate>
		<dc:creator>Joe</dc:creator>
				<category><![CDATA[Engineering]]></category>
		<category><![CDATA[Game Design]]></category>
		<category><![CDATA[Game Industry]]></category>
		<category><![CDATA[Production]]></category>

		<guid isPermaLink="false">http://programmerjoe.com/?p=186</guid>
		<description><![CDATA[Korea is the future. They are five years ahead of us and where Korea goes, the rest of the world will follow.  (I have been hearing this for at least five years. ) Free to play with micro transactions is the one true business model. Client downloads are death. We must look beyond the core [...]]]></description>
			<content:encoded><![CDATA[<ol>
<li>Korea is the future. They are five years ahead of us and where Korea goes, the rest of the world will follow.  (I have been hearing this for at least five years. )</li>
<li>Free to play with micro transactions is the one true business model.</li>
<li>Client downloads are death.</li>
<li>We must look beyond the core gamer audience and embrace more casual players.</li>
<li>Women are 50% of the audience.</li>
<li>Don&#8217;t trust the client, it is in the hands of the enemy.</li>
<li>You game is a service.</li>
<li>MMOs are hard. No, they&#8217;re really really hard. Seriously. You can&#8217;t possibly imagine how hard they are.</li>
<li>Runescape is the second biggest MMO and is the one you should really watch.</li>
<li>Club Penguin is huge and is the one you should really watch.</li>
<li>Lineage is huge in Asia and is the one you should really watch. (These days it&#8217;s actually more likely to be ZT Online or some other game in China.)</li>
<li>Flash is the best platform to build your MMO on.</li>
<li>Web games are cheesy and no core gamer will ever play them.</li>
<li>Rudy&#8217;s has the best BBQ in Austin.  No, County Line is better.  Are you kidding me?  It&#8217;s obviously The Salt Lick.</li>
<li>The game industry is bigger than Hollywood.</li>
<li>Triple-A MMOs are a dead end. WoW is impossible to compete with.</li>
<li>Game X is going to take the top spot from WoW.</li>
<li>Games cost so much to make now that the industry is about to collapse under its own weight.</li>
<li>MMOs are just like MUDs and you should all learn the lessons MUDs learned X years ago.  (To be fair, I don&#8217;t think I&#8217;ve actually heard this one in a few years.)</li>
<li>All of these things happened in UO. Why won&#8217;t you people learn from UO?</li>
<li>The community around your game is incredibly important and you should take care of them.</li>
<li>Your players have no idea what they want. Don&#8217;t believe anything they say.</li>
<li>Forums are very important.</li>
<li>Don&#8217;t believe anything you read on forums.</li>
<li>Launch is just the beginning. The real work comes after launch.</li>
<li>Metrics, metrics, metrics.  Record everything!</li>
<li>Don’t record too much with your metrics. Too much data is just as useless as too little data.</li>
<li>Some people spend CRAZY amounts of money via micro-transactions</li>
<li>MMOs on consoles are the Next Big Thing.</li>
<li>Casual games are going to save the PC market</li>
<li>MMOs are going to save the PC market</li>
<li>My background in economics tells me&#8230;</li>
<li>WoW is a wonderful thing for the industry because of the way they expanded the market.</li>
<li>WoW has set expectations so high that you can&#8217;t make an MMO for less than X million dollars. (Where X&gt;=30)</li>
<li>Person X is a jerk. Let me tell you this funny story about&#8230;</li>
<li>Company Y is so clueless that they will never put out a successful game</li>
<li>Fantasy is where it&#8217;s at! MMOs just don&#8217;t work as well in other genres.</li>
<li>Fantasy has been done. Players want us to move on to other genres.</li>
<li>There&#8217;s so much money to be made in Asia! Just make sure you internationalize your game first.</li>
<li>Gamers in Asia demand click to move so they can smoke while they play.</li>
<li>Players are going to trade stuff for real money no matter what you do. You might as well embrace it.</li>
<li>RMT causes huge amounts of fraud.</li>
<li>Gold spam is impossible to stop.</li>
<li>Our startup is the next big thing in MMOs.  Just look at this giant pile of money we raised!</li>
<li>Game development is all about iteration. Waterfall doesn&#8217;t work.</li>
<li>There&#8217;s this guy named Richard Bartle who proposed dividing players into four types&#8230;</li>
<li>You can’t use scripting languages in games. They’re way too slow.</li>
<li>Writing all your code in C++ is stupid.</li>
<li>Launch early, launch often.</li>
<li>You only get to launch once.</li>
</ol>
<div>This year it was obvious to me that I&#8217;ve hit the Austin GDC level cap. Fortunately that means I have moved on to the conference elder game and learn far more interesting things speaking and engaging in deep hallway conversations.</div>
<div>What about you?  What things are you sick of hearing in conference presentations?</div>
]]></content:encoded>
			<wfw:commentRss>http://programmerjoe.com/2009/09/20/50things/feed/</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>Useless magnetic sensors</title>
		<link>http://programmerjoe.com/2009/03/07/useless-magnetic-sensors/</link>
		<comments>http://programmerjoe.com/2009/03/07/useless-magnetic-sensors/#comments</comments>
		<pubDate>Sun, 08 Mar 2009 01:48:12 +0000</pubDate>
		<dc:creator>Joe</dc:creator>
				<category><![CDATA[Augmented Reality]]></category>
		<category><![CDATA[Engineering]]></category>

		<guid isPermaLink="false">http://programmerjoe.com/?p=139</guid>
		<description><![CDATA[After getting roll and pitch working through the Kalman filter, this week I wanted to move on to yaw. Too bad the magnetic sensors in the SparkFun IMU don&#8217;t actually work: While I was recording those values the IMU rotated a full 360 degrees and was even turned upside down.  MagZ should have inverted when [...]]]></description>
			<content:encoded><![CDATA[<p>After getting <a href="http://programmerjoe.com/2009/03/07/six-degrees-of-fish/">roll and pitch</a> working through the Kalman filter, this week I wanted to move on to yaw. Too bad the magnetic sensors in the SparkFun IMU don&#8217;t actually work:</p>
<p><img class="alignnone" title="Magnetic noise from the IMU" src="/images/IMUMagneticNoise.png" alt="" width="474" height="339" /></p>
<p>While I was recording those values the IMU rotated a full 360 degrees and was even turned upside down.  MagZ should have inverted when it turned upside down, at least.  I guess there is enough stuff going on inside the IMU that it mostly detects itself.</p>
<p>I tried using just the gyros to track yaw by dead reckoning, but they drift enough that the fish are turned 90 degrees after about ten seconds. I&#8217;ll have to wait to track yaw until I can get a magnetic compas that works or have vision-based tracking working well enough to use it to compensate for the drift.</p>
]]></content:encoded>
			<wfw:commentRss>http://programmerjoe.com/2009/03/07/useless-magnetic-sensors/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Six degrees of fish</title>
		<link>http://programmerjoe.com/2009/03/07/six-degrees-of-fish/</link>
		<comments>http://programmerjoe.com/2009/03/07/six-degrees-of-fish/#comments</comments>
		<pubDate>Sat, 07 Mar 2009 22:06:02 +0000</pubDate>
		<dc:creator>Joe</dc:creator>
				<category><![CDATA[Augmented Reality]]></category>
		<category><![CDATA[Engineering]]></category>

		<guid isPermaLink="false">http://programmerjoe.com/?p=133</guid>
		<description><![CDATA[A demonstration of using a SparkFun 6DOF IMU to control models in a scene. The fish on the left uses just the pitch and roll as determined by the accelerometers. The fish on the right uses primarily the gyros and lets the accelerometers correct against bias drift. The rendering is done in Ogre. The fish [...]]]></description>
			<content:encoded><![CDATA[<p>A demonstration of using a <a href="http://www.sparkfun.com/commerce/product_info.php?products_id=8454">SparkFun 6DOF IMU</a> to control models in a scene. The fish on the left uses just the pitch and roll as determined by the accelerometers. The fish on the right uses primarily the gyros and lets the accelerometers correct against bias drift.</p>
<p><object width="425" height="344" data="http://www.youtube.com/v/qi5t_Sqc2H8&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/qi5t_Sqc2H8&amp;hl=en&amp;fs=1" /></object></p>
<p>The rendering is done in Ogre. The fish are example models that come with the engine.</p>
]]></content:encoded>
			<wfw:commentRss>http://programmerjoe.com/2009/03/07/six-degrees-of-fish/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>The hard part of continuous deployment</title>
		<link>http://programmerjoe.com/2009/02/19/the-hard-part-of-continuous-deployment/</link>
		<comments>http://programmerjoe.com/2009/02/19/the-hard-part-of-continuous-deployment/#comments</comments>
		<pubDate>Fri, 20 Feb 2009 06:26:26 +0000</pubDate>
		<dc:creator>Joe</dc:creator>
				<category><![CDATA[Engineering]]></category>
		<category><![CDATA[Game Industry]]></category>

		<guid isPermaLink="false">http://programmerjoe.com/2009/02/19/the-hard-part-of-continuous-deployment/</guid>
		<description><![CDATA[Last week I posted what sort of changes you might need to make to your deployment process to support updates multiple times a day. I said I would follow up with a description of the technical challenges involved in making your users not hate you if you actually did deploy multiple times a day. The [...]]]></description>
			<content:encoded><![CDATA[<p>Last week I <a href="http://programmerjoe.com/2009/02/12/continuous-deployment-with-thick-clients/">posted</a> what sort of changes you might need to make to your deployment process to support updates multiple times a day. I said I would follow up with a description of the technical challenges involved in making your users not hate you if you actually <strong>did</strong> deploy multiple times a day.</p>
<p>The reasons your users will hate frequent deployments are:</p>
<ul>
<li>Non-zero server downtime when a new build is released</li>
<li>Being forced to log out of their existing play session for a new build</li>
<li>Waiting for patches to download for every little change</li>
</ul>
<p>I will describe solutions to each of these problems below.</p>
<p><strong>Eliminating Lengthy Server Downtime</strong></p>
<p>The database architecture in Pirates requires that every character in the database be loaded and processed whenever there is a schema change.Â  From the programmer&#8217;s point of view such changes are easy to make, so they occur frequently. Unfortunately this processing is why the Pirates servers take an hour to upgrade. I don&#8217;t know how common this kind of processing is in other games, but I know we weren&#8217;t the only ones who had to deal with it.</p>
<p>The need to process character data stems from the fact that Pirates stores persistent character data in a SQL database, but the actual data is in opaque blobs. The blobs themselves contain just the field data for each object and do not include any kind of version information. The whole system is only able to contain one version of each class at one time.</p>
<p>A better way to go would be to build your persistence layer so that it could handle any number of historical versions for player data. If you add a schema version to each blob and register each new schema as it is encountered. When a server needs to read an object it can perform the schema upgrades on the fly and avoid the long slow upgrade of each object.Â  If necessary you could even have a process that crawls the database upgrading inactive characters in the background so that they will be ready to go the next time they login.</p>
<p><strong>Supporting multiple concurrent versions</strong></p>
<p>Database updates are the longest section of server downtime at patch time, but they aren&#8217;t the only one.Â  For Pirates (and most MMOs) each world instance must be taken offline so that the new version can be installed on the server hardware and then launched. This adds some downtime for the upgrade, but most painfully, it also disconnects all active players. A better method would be to build your server clusters in such a way that they tolerate multiple simultaneous versions of the code.</p>
<p>It turns out that Guild Wars already supports this.Â  One of the <a href="http://programmerjoe.com/2009/02/12/continuous-deployment-with-thick-clients/#comment-316278">comments</a> from the last post describes a bit about how this works:</p>
<blockquote><p>Once the new code was on all the servers in the datacenters, we flipped a switch that notified the live servers that any new â€˜instancesâ€™ should be started using the latest version of the game code. At this point, any users running older builds of the client got told that they needed to update, and attempts to load into a new instance would be rejected until they updated.<br />
To summarize how the live update worked on the server, I believe we atomically loaded the new game content onto the servers, and then loaded the newest version of the game code into the server processes alongside the older version, because each build was a single loadable DLL. That let us keep old instances alive alongside new instances on the same hardware, and isolated us from some of the hairy problems youâ€™d get from multiple client versions running in the same world.</p></blockquote>
<p>For players in the PvE parts of the game this method apparently worked quite well. However PvP players could only play with each other when everyone was running the same version of the game, so this caused problems with PvP events. It isn&#8217;t perfect, but this is a huge step in the right direction.</p>
<p>The Guild Wars approach worked for them, but would be less suitable for Pirates which has eight different types of processes making up its server clusters.Â  However with some changes to the Pirates <a href="http://programmerjoe.com/2008/09/06/serverdir-20/">Server Directory</a> multiple versions of those exes could easily co-exist on a single server machine. When a client connects to Pirates it queries the server directory process to find an IP address and port number to connect to. That query already takes the version number into account, and could be adapted to simply never return cluster servers from an older version.</p>
<p>Another approach that would eliminate the need for any client downtime for many patches is to make those systems work more like the web. The next time I architect an MMO (at Divide by Zero Games, actually) I intend to move most of what the traditional game client does outside of the typical persistent client-server connection entirely. Systems like mission interaction, guild management, in-game mail, and the like don&#8217;t require the same level of responsiveness as moving and attacking. If those systems use non-persistent HTTP connections as their transport the same protocols can be re-used to support web, mobile, or social network front endsÂ  to the same data. For chat a standarized protocol (Jabber maybe?) will let you use off the shelf servers and let chat move in and out of game easily. The more locked down these APIs are the less likely you are to affect them with your small patches.</p>
<p><strong>Eliminating patch time</strong></p>
<p>So you have eliminated all server downtime and even allowed outdated clients to stay online and play after a new version of your game is deployed. If players have to download a small patch and then spend a minute or two applying it to your giant pack files they are still going to be annoyed.Â  Well it seems that Guild Wars did a great job here too.</p>
<p>Almost all of the patching in Guild Wars is built right into the client and can be delayed until right before it is actually needed. When you download Guild Wars it is less than 1MB to start.Â  The first time you run the game it downloads everything you need to launch the game and get into character creation. After character creation it downloads enough to load the first town.Â  When you leave the first town and go out into the wilderness it loads what it needs for that zone before you leave the loading screen, and so on.Â  All of this data is stored on the user&#8217;s machine, so going back into town is fast.</p>
<p>The natural result of this is that if a user has outdated data when they reach the loading screen for a zone, tiny patches for the updated files are downloaded before they finishing zoning. The game never makes the user wait to patch data for sections of the world they aren&#8217;t anywhere near. When the client is updated an up to date list of the files in the latest version is downloaded and the client uses that to request updated data as necessary.</p>
<p>The next logical step once you have this partial patching system in place is to enable both servers and clients to load new data on the fly without shutting down. If you are doing it right, many of your new builds are going to be data-only and include no code changes. Small changes of that sort could easily be downloaded in the background and then switched on via a broadcast from the servers.</p>
<p><strong>Fixing further technical problems</strong></p>
<p>There are two remaining technical hurdles that are not directly visible to the players but still need to be solved if the latency between making a change and deploying it is to drop to under an hour. These two are strongly tied to the partial patching process described above: slow data file packing, and slow uploads to the datacenter patch servers.</p>
<p>The packed data files on Pirates are rebuilt from scratch every time a build is run. This is an artifact of my hacking in pack file support over a long weekend that could be solved with incremental pack file updates. Building them from scratch involves opening tens of thousands of files totalling 6GB in size, after compression, and compressing them out into 66 pack files and takes 80 minutes. Usually a much smaller number of files has actually changed, so an incremental build would reduce both the file opens and the data packing work itself.</p>
<p>That same incremental process could be applied to the patch deployment process itself.Â  Because of how Flying Lab&#8217;s process was arranged with SOE each packed data file had to be uploaded again in its entirity if it had any changes. That slowed the transfer to SOE considerably. I am not intimately familiar with the SOE patch servers themselves, but I suspect a similiar inefficiency existed on their end when a build was deployed.Â  This could also be eliminated with more meta-data of exactly what had changed, and you will need that information for the partial patching above to work anyway.</p>
<p><strong>So is it worth all this trouble?</strong></p>
<p>These changes represent a &#8220;never going to happen&#8221; amount of work for an existing game. While the work involved in building your game to eliminate these deployment issues is less for a game that is being build with that in mind, it still isn&#8217;t free.Â  Is it worth the expense to allow your game to deploy in an hour instead of seven and a half hours?</p>
<p>I think it is worth it from a purely operational perspective, and here&#8217;s why: One of the first few monthly builds released for Pirates included a bug that caused players to lose a ship at random whenever they scuttled a ship.Â  Their client would ask them to confirm that they wanted to scuttle whatever ship they clicked on, but when it got to the server it would instead delete the first ship in their list. Though it was only a one line code change to fix the bug it took many hours to deploy the changes. In the meantime quite a few players had deleted their favorite ships and all the cargo in them. We knew about the build in the morning of patch day, but couldn&#8217;t get a new build out for 8-10 hours, which put us into prime time. It caused a lot of bad blood that could have been avoided if we had been able to deploy the build faster. This is a particularly bad example, but this kind of thing happens all the time with live MMOs. (SWG had a bug go live where the command to launch fireworks would let players launch anything they liked into the air and then delete the object afterward.Â  That included but was not limited to fireworks, monsters, buildings, and other players.)</p>
<p>There are plenty of other reasons to be able to patch very quickly, and I may go into them in a future post. I think it&#8217;s worth ensuring you are able to push new builds within an hour simply to be able to fix your major screw-ups as quickly as possible and save your players grief.</p>
]]></content:encoded>
			<wfw:commentRss>http://programmerjoe.com/2009/02/19/the-hard-part-of-continuous-deployment/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Continuous Deployment with Thick Clients</title>
		<link>http://programmerjoe.com/2009/02/12/continuous-deployment-with-thick-clients/</link>
		<comments>http://programmerjoe.com/2009/02/12/continuous-deployment-with-thick-clients/#comments</comments>
		<pubDate>Fri, 13 Feb 2009 06:35:44 +0000</pubDate>
		<dc:creator>Joe</dc:creator>
				<category><![CDATA[Engineering]]></category>
		<category><![CDATA[Game Industry]]></category>

		<guid isPermaLink="false">http://programmerjoe.com/2009/02/12/continuous-deployment-with-thick-clients/</guid>
		<description><![CDATA[(Update: Part two is up now. It details the technical changes that are required to make this work.) Earlier this week Eric Ries and Timothy Fitz posted on a technique called Continuous Deployment that they use at IMVU.Â  Timothy describes it like this: The high level of our process is dead simple: Continuously integrate (commit [...]]]></description>
			<content:encoded><![CDATA[<p>(Update: <a href="http://programmerjoe.com/2009/02/19/the-hard-part-of-continuous-deployment/">Part two</a> is up now. It details the technical changes that are required to make this work.)</p>
<p>Earlier this week <a href="http://startuplessonslearned.blogspot.com/2009/02/continuous-deployment-and-continuous.html">Eric Ries</a> and <a href="http://timothyfitz.wordpress.com/2009/02/10/continuous-deployment-at-imvu-doing-the-impossible-fifty-times-a-day/">Timothy Fitz</a> posted on a technique called Continuous Deployment that they use at IMVU.Â  Timothy describes it like this:</p>
<blockquote><p>The high level of our process is dead simple: Continuously integrate (commit early and often). On commit automatically run all tests. If the tests pass deploy to the cluster. If the deploy succeeds, repeat.</p></blockquote>
<p>Those posts seem to be mostly about deploying new code to web servers. I thought it would be interesting to consider what it would take to follow a similar process for an MMO with a big installed client. I will do that in two parts with today&#8217;s part being the deployment process itself.Â  In a future post I will describe the architectural changes you would have to make to not have frequent updates annoy your players enough that they riot and burn down your datacenter (or go play someone else&#8217;s game instead.)</p>
<p>As a point of comparison, here&#8217;s how patches are typically developed and deployed for Pirates of the Burning Sea:</p>
<ol>
<li>The team makes the changes. That takes three weeks for monthly milestone builds with a lot of the integration happening in the last week. For a hotfix it usually takes a few hours to get to the root cause of the problem and then half an hour to make the change, build, and test on the developer&#8217;s machine.</li>
<li>A build is run on the affected branch. When that&#8217;s a full build it takes 1:20 hours. Incremental builds can be ten minutes if no major headers changed. The form of build that people on the dev team use is copied to a shared server at this point.</li>
<li>Â Some quick automated tests are run to fail seriously broken builds as early as possible. These take 10 minutes.</li>
<li>The build is packed up for deployment. This takes 80 minutes. The build is now ready for manual testing (since the testers use the packed retail files to be as close to a customer install as possible.)</li>
<li>Slow automated tests run. These take 30 minutes.</li>
<li>(concurrent with 5 if necessary) The testers run a suite of manual tests called BVTs. These take about half an hour. These tests run on each nightly build even if it isn&#8217;t going to be deployed to keep people from losing much time to bad builds. Most people wait for the BVTs to finish before upgrading to the previous night&#8217;s build.</li>
<li>For milestone builds the testers spend at least two weeks testing all the new stuff. Builds are sent to SOE for localization of new content at the same time.</li>
<li>A release test pass is run with a larger set of tests. These take about three hours.</li>
<li>The build is uploaded to SOE for client patching and to the datacenter for server upgrades. This takes a few minutes for a hotfix or 6-8 hours for a month&#8217;s worth of changes.</li>
<li>At this point the build is pushed to the test server. Milestone builds sit there for a couple weeks. Hot fixes might stay for a few hours or even go straight to live in an emergency.</li>
<li>SOE pushes the patch to their patch servers without activating the patch for download. That takes between one and eight hours depending on the size of the patch.</li>
<li>At the pre-determined downtime, the servers are taken offline and SOE is told to activate the patch. This usually happens at 1am PST and doesn&#8217;t take any time. Customers can begin downloading the patch at this point.</li>
<li>Flying Lab operations people upgrade all the servers in parallel. This takes up to three hours for milestone builds, but more like an hour for hotfixes. They bring the servers up locked so that they can be tested before people come in.</li>
<li>The customer service team tests each server to make sure it&#8217;s pretty much working and then operations unlocks the servers.Â  That takes about 20 minutes.</li>
<li>If the build was being deployed to the test server, after some days of testing steps 11-14 will happen again for the live servers.</li>
</ol>
<p>This may seem like a long, slow process but it actually works pretty well.Â  Pirates has had 11 &#8220;monthly&#8221; patches since it launched, and they go well.Â  Not many other MMOs are pushing content with that frequency.Â  Some of the slow bits (like the upload to SOE and their push to their patchers) are the result of organizational handoffs that would take quite a bit of work to change. Flying Lab also spends a fair amount of time testing manually over and above the automated tests. Those manual tests have kept thousands of bugs from going live and as far as I&#8217;m concerned they are an excellent use of resources. I am not trying to bash Flying Lab in any way, just provide a baseline for what an MMO deployment process looks like. I suspect many other games have a similar sequence of events going into each patch, and would love to hear confirmation or rebuttal from people who have experience on other games.</p>
<p>Assuming minimum time for a patch, these are the times we are left with (in hours and minutes):<br />
<center><strong>Pirates Deployment Time</strong></p>
<table>
<tr>
<td>0:10</td>
<td>Run incremental build</td>
</tr>
<tr>
<td>0:10</td>
<td>Run quick automated tests</td>
</tr>
<tr>
<td>1:20</td>
<td>Pack the build</td>
</tr>
<tr>
<td>0:30</td>
<td>Run quick manual tests/slow automated tests</td>
</tr>
<tr>
<td>3:00</td>
<td>Run release pass smoke tests</td>
</tr>
<tr>
<td>0:05</td>
<td>Upload build for patching</td>
</tr>
<tr>
<td>1:00</td>
<td>Build is pushed to patchers</td>
</tr>
<tr>
<td>1:00</td>
<td>Servers are upgraded</td>
</tr>
<tr>
<td>0:20</td>
<td>A final quick test is made on each server</td>
</tr>
<tr>
<td><strong>7:35</strong></td>
<td><strong>Total time to deploy</strong></td>
</tr>
</table>
<p></center><br />
If it takes seven and a half hours to deploy a new build you obviously aren&#8217;t going to get more than one of them out in an 8 hour work day. Let&#8217;s forget for a moment that IMVU is able to do this in 15 minutes and pretend that our target is an hour. For now let&#8217;s assume that we will spend 10 minutes on building, 10 minutes on automated testing, 30 minutes on manual testing, and the last 10 minute actually deploying the build. We will also assume that this is the time to deploy to the test server and that this is the slower than the actual push from test to live.</p>
<p>Without going into detail I am going to assume three architectural changes to make these targets much more likely. First, the way that the game uses packed files of assets will need to be changed to allow trivial incremental changes on every file in the game without any 80 minute pack processes. I will assume that pack time can go away and be a minor part of deployment.Â  The other assumption is that unlike Pirates, our theoretical continuously deployed MMO will not require every object in the database to be touched when a new build is deployed so the hour spent upgrading databases on the servers is reduced to about five minutes of file copying. The third architectural change I will assume involves moving almost all of the patching process into the client itself and out of the launcher. This eliminates both the transfer of bits to Southern California and the push of pre-built patches out to the patcher clusters around the world. I will go into each of these assumptions in my next post, but let&#8217;s just pretend for now that they appear magically and reduce our time accordingly.</p>
<p>The amount of time spent on automated testing in this deployment process is 40 minutes. Fortunately this work is relatively easy to spread out over multiple machines to reduce the total time involved. Assuming a test farm of at least five machines we should be able to accomplish our ten minute goal.</p>
<p>It is possible that we could have multiple testers working in parallel to perform the manual tests more quickly. There are 230 minutes spent on testing in this sequence, so if we expect to do that amount of work with 11.5 manual testers assuming perfect division of labor. There are two things wrong with that statement. The first is that perfect division of labor among 12 people is impossible so the number is probably closer to 20.Â  The second problem is that having a team of 12 on staff to do nothing but test new builds with tiny incremental changes in them is not worth nearly what it costs you in salaries. A much more likely outcome is that the amount of manually testing in the build process is drastically reduced. In addition to that we can get our playerbase involved in the deployment testing if we swap things around a bit.<br />
<center><strong>Trimmed Deployment Time</strong></p>
<table>
<tr>
<td>0:10</td>
<td>Run incremental build</td>
</tr>
<tr>
<td>0:10</td>
<td>Run automated tests on five machines</td>
</tr>
<tr>
<td>0:05</td>
<td>Upload only changed files to game servers and patch servers</td>
</tr>
<tr>
<td>0:05</td>
<td>Deploy build on test server</td>
</tr>
<tr>
<td>0:30</td>
<td>Manual smoke test on public test on public test server<br />
Players can test at the same time.</td>
</tr>
<tr>
<td><strong>1:00</strong></td>
<td><strong>Total time to deploy</strong></td>
</tr>
</table>
<p></center>In fact, if those 30 minutes of manual testing are your bottleneck and you can keep the pipeline full, you can push a fresh build every 30 minutes or 16 times a day. Forget entirely about pushing to live for a moment and consider what kind of impact that would have on your test server. Your team could focus on fixing issues that players on the test server find <strong>while those players are still online</strong>. Assuming a small change that you can make in half an hour, it would take only an hour from the start of the work on that fix to when it is visible to players. That pace is fast enough that it would be possible to run experiments with tuning values, prices of items, or even algorithms.Of course for any of this to work the entire organization needs to be arranged around responding to player feedback multiple times per day.  The real advantage of a rapid deployment system is to make your <em>change -&gt; test -&gt; respond</em> loop faster. If your plans are set a month out and your developers don&#8217;t have time to work on anything other than their assigned tasks for that entire time, there is not much point in pushing builds this quickly.What do you think?Â  Obviously actually implementing this is a more work than moving numbers around in a table. <img src='http://programmerjoe.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://programmerjoe.com/2009/02/12/continuous-deployment-with-thick-clients/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Computer Clubs</title>
		<link>http://programmerjoe.com/2009/02/10/computer-clubs/</link>
		<comments>http://programmerjoe.com/2009/02/10/computer-clubs/#comments</comments>
		<pubDate>Tue, 10 Feb 2009 17:45:44 +0000</pubDate>
		<dc:creator>Joe</dc:creator>
				<category><![CDATA[Engineering]]></category>
		<category><![CDATA[History]]></category>

		<guid isPermaLink="false">http://programmerjoe.com/2009/02/10/computer-clubs/</guid>
		<description><![CDATA[I&#8217;m old. Well I&#8217;m not really that old in the grand scheme of things, I just feel that way when I hang around game developers. I got my first real computer time in the fall of 1982 by hanging around after school and hacking some stuff in BASIC on the Vic-20 in the library.Â  I [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m old. Well I&#8217;m not really <strong>that</strong> old in the grand scheme of things, I just feel that way when I hang around game developers.</p>
<p>I got my first real computer time in the fall of 1982 by hanging around after school and hacking some stuff in BASIC on the <a href="http://en.wikipedia.org/wiki/VIC20">Vic-20</a> in the library.Â  I was in 5th grade at the time, and was by far the most computer-obsessed person I knew. That christmas my parents bought me a <a href="http://en.wikipedia.org/wiki/TI99">TI-99/4A</a> and a little black and white TV to hook it up to. Technically the computer was a present for &#8220;the family&#8221;, but in practice it didn&#8217;t really work out that way. I was obsessed with the TI, and wrote all sorts of little games and other programs on it.</p>
<p>A few years later I spent all my accumulated allowance and paper route money on a Commodore 64. The C64 was a big upgrade, and included such advanced features as a floppy drive and a 300 baud modem. It also had the advantage of having a manufacturer that was still in the PC business. (TI abandoned its home computer line shortly after we got ours.)Â  I spent quite a bit of time on the local BBSes, much to the delight of the other 4 people I shared a phone line with. Once I had a car began participating in one of the staples of the personal computer revolution: the computer club.</p>
<p>The local commodore user&#8217;s group met once a month in one of the classrooms at the University of Northern Colorado in Greeley. It was a group of 20-30 people, many of which came from the university or worked at the local Hewlett-Packard site. Computer enthusiasts were pretty few and far between in those days, and this was one place where we all fit in. Just about everybody in that room was a geeky, sci-fi reading, D&amp;D playing male. Everybody could program to one degree or another, and more than a few knew their way around a soldering iron. Despite all the other things they had in common it was those last two that brought this group together: everyone wanted to do cool stuff with computers.</p>
<p>I don&#8217;t know if that kind of community disappeared or if I just fell out of touch with it. There are millions of programmers these days, and they are usually specialized enough that they barely speak the same language let alone program in it. Being a &#8220;hardware guy&#8221; now means that you are comfortable plugging together prebuilt components and hunting down device drivers online. The inexorable march of progress has pretty much made the computer itself disappear as something people get excited about. Nobody cares enough about specific platforms these days to even have the sort of trash-talking arguments Commodore and Apple fans used to have with each other.</p>
<p>Does this sort of passionate niche club still exist? TheÂ <a href="http://www.seattlerobotics.org/">Seattle Robotics Society</a>Â might fall into that category. They spend their meetings talking about various components to build robots from and what sort of code to put on microcontrollers to make their robots do interesting things. The meetings feature lots of teenagers learning things about robots that they would never have any exposure to at school. There seems to be the same mix of Boeing engineers and college students that the computer clubs had.</p>
<p>What about others? Are there clubs for wearable computer enthusiasts? People who design programming languages? Quantum computing fans? Or are we nearing the end of the innovative period for computing and somewhere there are developing pockets of interest around nanotech or some other technology that doesn&#8217;t really exist yet?</p>
<p>It&#8217;s funny that I&#8217;m so nostalgic for something that was already going extinct by the time I got involved. My experience with the computer clubs was 10-15 years after theÂ <a href="http://en.wikipedia.org/wiki/Homebrew_Computer_Club">Homebrew Computer Club</a>Â spawned Apple Computer and others. The people I met in the clubs were not entrepreneurs to be, they were more like fans and maybe the occasional shareware developer. It&#8217;s been twenty years, and I&#8217;ve never seen any of those names show up as leaders of industry.</p>
<p>What about you? Are any of you old enough to have belonged to a computer club? Â :)</p>
]]></content:encoded>
			<wfw:commentRss>http://programmerjoe.com/2009/02/10/computer-clubs/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>StackOverflow is amazing</title>
		<link>http://programmerjoe.com/2008/09/28/stackoverflow-is-amazing/</link>
		<comments>http://programmerjoe.com/2008/09/28/stackoverflow-is-amazing/#comments</comments>
		<pubDate>Sun, 28 Sep 2008 16:21:11 +0000</pubDate>
		<dc:creator>Joe</dc:creator>
				<category><![CDATA[Engineering]]></category>

		<guid isPermaLink="false">http://programmerjoe.com/2008/09/28/stackoverflow-is-amazing/</guid>
		<description><![CDATA[A couple of weeks ago, Jeff Atwood and crew launched the public beta of Stack Overflow. Stack Overflow lets programmers ask questions and other programmers answer them. That&#8217;s it.Â  They just did it with a lot less suck than all the other programming community help sites: The ads are unobtrusive, there is no login requirement [...]]]></description>
			<content:encoded><![CDATA[<p>A couple of weeks ago, <a href="http://www.codinghorror.com/blog/">Jeff Atwood</a> and crew <a href="http://blog.stackoverflow.com/2008/09/then-a-miracle-occurs-public-beta/">launched the public beta of Stack Overflow</a>. Stack Overflow lets programmers ask questions and other programmers answer them. That&#8217;s it.Â  They just did it with a lot less suck than all the other programming community help sites: The ads are unobtrusive, there is no login requirement just to see an answer, answers are listed from best to worst instead of first to last, and anyone can edit a question or answer to make it better.</p>
<p>For instance, look at <a href="http://stackoverflow.com/questions/142391/getting-a-boostsharedptr-for-this">this question</a> I asked about boost shared pointers. I have work-arounds for the problem in my code, but figured that there had to be a better way. Turns out that the boost experts on Stack Overflow knew exactly what I needed, and answered within a few hours.Â  Then some other people read the question, picked the best answer, and by voting it up made that answer appear prominently.Â  By the time I got back to check to see if my question had been answered, there was a <a href="http://stackoverflow.com/questions/142391/getting-a-boostsharedptr-for-this#142401">clear winner</a>. To make it even more prominent, I marked that answer as &#8220;accepted&#8221; and now it&#8217;s highlighted.</p>
<p>If you&#8217;re a programmer, I suggest you check it out. Next time you&#8217;re looking for the answer to a programming question, see if it&#8217;s been asked on Stack Overflow. If not, ask your question. I think you&#8217;ll be pleased with the results.</p>
<p>(Back in July I joined a company called Divide by Zero.Â  Now I&#8217;m singing the praises of a site called Stack Overflow.Â  Next thing you know I&#8217;ll be renaming my blog &#8220;Access violation&#8221;. <img src='http://programmerjoe.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  )</p>
]]></content:encoded>
			<wfw:commentRss>http://programmerjoe.com/2008/09/28/stackoverflow-is-amazing/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ServerDir 2.0</title>
		<link>http://programmerjoe.com/2008/09/06/serverdir-20/</link>
		<comments>http://programmerjoe.com/2008/09/06/serverdir-20/#comments</comments>
		<pubDate>Sat, 06 Sep 2008 17:45:27 +0000</pubDate>
		<dc:creator>Joe</dc:creator>
				<category><![CDATA[Engineering]]></category>

		<guid isPermaLink="false">http://programmerjoe.com/2008/09/06/serverdir-20/</guid>
		<description><![CDATA[As I am putting together the architecture for the new game weâ€™re building at Divide by Zero, I am spending a fairly significant amount of time thinking about where the weak spots in the Pirates architecture were. The servers in Pirates worked out pretty well, but I think I can do better the second time [...]]]></description>
			<content:encoded><![CDATA[<p>As I am putting together the architecture for the new game weâ€™re building at <a href="http://dbzcorp.com">Divide by Zero</a>, I am spending a fairly significant amount of time thinking about where the weak spots in the Pirates architecture were. The servers in Pirates worked out pretty well, but I think I can do better the second time around.Â  This is the first of N posts describing how I intend to evolve Server Architecture v1 into Server Architecture v2.</p>
<p>By far the biggest scaling problem Pirates ran into right at the start of open beta was the Server Directory (ServerDir) database. This was the direct result of incredible naivetÃ© on my part about how much load a single database could handle. The original design of ServerDir called for every process in every cluster to connect to one shared database and to update its own status in that database every five seconds. When you multiply that update by all the instanced zones in the game (plus other miscellaneous servers) you find that the database needs to handle thousands of updates per second from tens of thousands of connections. It turns out that Microsoft SQL Server is <a href="http://programmerjoe.com/2007/11/24/how-to-make-microsoft-sql-server-cry-like-a-baby/">not up to the task</a>. (Thereâ€™s also the little problem that the single shared ServerDir database was a single point of failure for the entire service.)</p>
<p align="center"><img src="/images/SD2_SingleDB.png" title="Pirates ServerDir on a single DB" alt="Pirates ServerDir on a single DB" align="middle" width="372" height="332" /></p>
<p align="center">&nbsp;</p>
<p align="center">Original ServerDir design</p>
<p> When a single ServerDir was obviously not going to work, we expanded the system slightly to split that single database into up to one database per cluster. This still put quite a bit of load onto the ServerDir DB, but there were now enough of them to allow SQL Server to keep up.Â  This is the setup that Pirates was using when I left Flying Lab in July of 2008.</p>
<p align="center"><img src="/images/SD2_PerClusterDB.png" title="Pirates ServerDir with one DB per cluster" alt="Pirates ServerDir with one DB per cluster" align="middle" width="372" height="326" /></p>
<p align="center">Final ServerDir design</p>
<p> Within a cluster the ServerDir database was used by a process called Big Brother to monitor the health of the cluster. Each physical server machine in the cluster has an instance of Big Brother running on it, and they automatically pick one of their number to be the primary Big Brother for the cluster. This process is responsible for deciding which other processes need to be launched, as well as clearing out the ServerDir entries for processes that have crashed. If you want to read more about the specifics of the ServerDir system, you can read all about it in <a href="http://www.amazon.com/Massively-Multiplayer-Game-Development/dp/1584503904">Massively Multiplayer Game Development 2</a>. I wrote an article on the Pirates architecture years before the game launched, and it really didnâ€™t change too much.</p>
<p align="center"><img src="/images/SD2_InsideSD1.png" title="Pirates ServerDir inside a cluster" alt="Pirates ServerDir inside a cluster" align="middle" width="432" height="468" /></p>
<p align="center">ServerDir Inside a Cluster</p>
<p> <strong>ServerDir 2.0</strong></p>
<p>There are several fundamental problems with the original ServerDir that I intend to fix with version 2.0. First is the reliance on a database as the point of synchronization. Databases are not built for this kind of transient data, so they handle it poorly.Â  The second problem is the way the Big Brothers communicate with each other via UDP (the dashed lines above indicate non-persistent or UDP connections.) This pointlessly complicated the protocol between Big Brothers by requiring them to compensate for dropped network packets. Another goal for the new ServerDir is actually driven by broader architectural changes I want to make, specifically that I want to promote â€œshardâ€ from being an operations-level concept to one that is entirely in game design and UI.Â  That will require far more machines with far more processes per cluster, and ServerDir will need to cope. The fourth and final fix in the new ServerDir is that the old version of Big Brother actually does a pretty poor job of dealing with hung processes. We had some periods during Beta where we were getting some of those, and the operations staff had to deal with them by restarting clusters regularly and running scripts to kill all the zombies.Â  What follows is a sketch of my initial design for how to accomplish all this.</p>
<p align="center"><img src="/images/SD2_SingleService.png" title="ServerDir v2.0" alt="ServerDir v2.0" align="middle" width="432" height="619" /></p>
<p align="center">ServerDir v2.0</p>
<p> The biggest change here is that individual cluster processes no longer connect to ServerDir directly. Instead they open a persistent connection to their local Big Brother, and Big Brother updates ServerDir on their behalf. Part of this change is that the â€œevery five secondsâ€ updates never go into ServerDir at all.Â  ServerDir is notified of two events for processes: process started and process stopped. All of the â€œis this process hungâ€ detection is now the job of each individual Big Brother. While a cluster process is up, it will send period updates to Big Brother, and if none arrive for too long a period of time, Big Brother will kill the process and clean up ServerDir.</p>
<p>Another significant change is that instead of the point of synchronization being a database, the point of synchronization is a web service. Whether there is a database (or multiple databases) backing up that web service is entirely invisible to the tools and to the cluster processes. Using a stateless API with no persistent connections also makes the task of scaling the ServerDir resource much easier. With load balancers and some reasonable architecture on the back end, single points of failure and scaling problems with ServerDir itself can be all but eliminated.</p>
<p>My next post will go into much greater detail on the new web service and how BigBrothers and operations tools interact with it. Once I&#8217;ve covered the new ServerDir plan I can get into my whacky new ideas for the game servers themselves.</p>
<p>What do you think? See any red flags in my high level sketch?</p>
]]></content:encoded>
			<wfw:commentRss>http://programmerjoe.com/2008/09/06/serverdir-20/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>This is why I&#8217;m a programmer</title>
		<link>http://programmerjoe.com/2008/07/25/this-is-why-im-a-programmer/</link>
		<comments>http://programmerjoe.com/2008/07/25/this-is-why-im-a-programmer/#comments</comments>
		<pubDate>Fri, 25 Jul 2008 17:51:01 +0000</pubDate>
		<dc:creator>Joe</dc:creator>
				<category><![CDATA[Engineering]]></category>

		<guid isPermaLink="false">http://programmerjoe.com/2008/07/25/this-is-why-im-a-programmer/</guid>
		<description><![CDATA[Gustavo Duarte sums it up.]]></description>
			<content:encoded><![CDATA[<p>Gustavo Duarte <a href="http://duartes.org/gustavo/blog/post/lucky-to-be-a-programmer">sums it up</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://programmerjoe.com/2008/07/25/this-is-why-im-a-programmer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Five Kinds of Programmers</title>
		<link>http://programmerjoe.com/2008/06/29/five-kinds-of-programmers/</link>
		<comments>http://programmerjoe.com/2008/06/29/five-kinds-of-programmers/#comments</comments>
		<pubDate>Sun, 29 Jun 2008 20:23:15 +0000</pubDate>
		<dc:creator>Joe</dc:creator>
				<category><![CDATA[Engineering]]></category>

		<guid isPermaLink="false">http://programmerjoe.com/2008/06/29/five-kinds-of-programmers/</guid>
		<description><![CDATA[I recently had a conversation with one of the long-time programmers on Pirates that got me thinking about how I think about programmers. Over the course of my career I&#8217;ve run into several archetypes of professional programmers. I thought it might be interesting to formalize my thinking on the subject, and this is the result. [...]]]></description>
			<content:encoded><![CDATA[<p>I recently had a conversation with one of the long-time programmers on Pirates that got me thinking about how I think about programmers. Over the course of my career I&#8217;ve run into several archetypes of professional programmers. I thought it might be interesting to formalize my thinking on the subject, and this is the result.</p>
<p><strong>The Researcher</strong></p>
<p>These  programmers are more scientist than engineer. If your organization has a research lab, it is probably stocked with Researchers. Since academia is just one giant lab, it is almost entire filled with Researchers.</p>
<p>The Researcher loves to find solutions to problems that are poorly understood. They are on the bleeding edge of their technological specialty. If there are no papers out there that explain how to do something they will write one.</p>
<p>One downside of the Researcher is that there are so many interesting problems out there that need solving that they have trouble actually finishing any solution before they move on to the next thing. When you can get these guys to check in some code it&#8217;s usually great, but it takes them far longer than it would take other kinds of programmers to actually implement anything.  They are also the most likely archetype to suffer from <a href="http://en.wikipedia.org/wiki/Not_Invented_Here">Not Invented Here Syndrome</a>.</p>
<p><strong>The Explorer</strong></p>
<p>Like the Researcher, the Explorer is unafraid of the poorly defined dark corners of technology. The key difference is that when the Explorer delves those depths it is to <a href="http://www.amazon.com/Smart-Gets-Things-Done-Technical/dp/1590598385">get things done</a>, not for the joy of the exploration itself.</p>
<p>When you have a really thorny problem that you don&#8217;t know how to solve, this is the programmer you give it to.  Explorers will dig into unfamiliar code-bases and problem domains with a shocking level of energy. These programmers are by far the quickest learners, and are a great resource for other programmers who are trying come behind them into new territory.</p>
<p>The downside of Explorers is that their single-minded practicality can make their code a little sloppy. These programmers dedicate a lot more time to putting their current task behind them than they do to writing code they would want to maintain years down the road. This doesn&#8217;t mean that the code won&#8217;t work, but that if an extra #include or circular dependency will save an hour the Explorer is always tempted to cut that corner.</p>
<p><strong>The Craftsman</strong></p>
<p>The highest quality code in your code-base was probably written by a Craftsman. Your QA department loves Craftsmen. They value the quality of their work above all else.</p>
<p>When a new system just has to work, you give it to a Craftsman. They will do a great job coding it, and then test it until it is perfect. Craftsmen are absolutely the best programmers when it comes to handling exceptional conditions and corner cases. In my experience Craftsmen also excel at writing maintainable code because they know that they&#8217;re going to have to come back to it someday.</p>
<p>Unfortunately all that quality comes at a price.  The Craftsmen on your team are the slowest programmers you have. When they estimate tasks they generate the most accurate estimates, but also the biggest. (Partly because they always include the debugging time that everyone else hopes won&#8217;t be necessary.) Their emphasis on quality and reliability also means that Craftsmen are terrified of unfamiliar parts of the code-base or poorly defined problems.</p>
<p><strong>The Activist</strong></p>
<p>You know that guy on your team who is pushing <a href="http://en.wikipedia.org/wiki/Test-driven_development">Test-Driven Development</a>, is constantly refactoring code, and actually uses the names of design patterns? That guy is your Activist. They are the driving force for architectural and process improvements on your team.</p>
<p>Activists want the code quality in your project to be as high as it can be. They give tough code reviews, and even tougher design reviews, but that&#8217;s a good thing. Every time someone on the team listens to the Activist, they are improving as a programmer.</p>
<p>On the other hand, their ceaseless pursuit of perfect code hurts the productivity of the Activist. Quick hacks are physically painful to them, even when that is exactly what the situation calls for. Paradoxically, they also often introduce bugs with their refactoring that never would have come up otherwise. (On the plus side, the refactoring makes fixing that bug far easier.)</p>
<p><strong>The Workhorse</strong></p>
<p>In their various ways, all of the programmers above are sacrificing some of their capacity to their particular quirks. Workhorse programmers don&#8217;t do that. They are in a single-minded pursuit of adding as much to the system as possible, and as a result end up owning vast chunks of the code-base.</p>
<p>If you were count lines of code per programmer, the Workhorses would come out ahead. (That&#8217;s assuming you don&#8217;t count generated code from the Activists.) Sheer output is the domain of these kind of programmers. If you have a few great Workhorses on your team you will be able to do things that other teams only dream of.</p>
<p>The dark flip side of what a great workhorse can accomplish is that a bad one will do absurd amounts of damage to your code-base. Workhorses don&#8217;t have any significant dedication to quality that allows them to avoid doing bad things. Sometimes make up for this by having enough time to build the system two or three times in the time that a Craftsman would build it once, but that&#8217;s always painful. A single bad Workhorse can do enough damage to negate the positive effect of one or two other programmers.</p>
<p><strong>What kind of programmer are you?</strong></p>
<p>You will notice that none of these archetypes are particularly bad or particularly good. There can be good or bad programmers of any archetype. All the teams I&#8217;ve ever been on have had a mix of archetypes. For that matter, very few programmers could be assigned to one archetype.</p>
<p>Personally, I think I&#8217;m mostly a Workhorse with a little bit of Activist and Explorer mixed in.  I am put to shame by the ability of the some of the programmers around me to suss out how to do some radical new thing. I&#8217;m not hard-core enough about process or code quality to keep up with the Activists on the team. The one way I compete is on quantity, and most of that code is fortunately good enough to not doom any projects I&#8217;ve been on up to this point.</p>
<p>What about you? Where would you fit in this taxonomy? Do you recognize any programmers you know?</p>
]]></content:encoded>
			<wfw:commentRss>http://programmerjoe.com/2008/06/29/five-kinds-of-programmers/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
	</channel>
</rss>
