<?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>Code.Implant &#187; Design</title>
	<atom:link href="http://www.codeimplant.com/category/design/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.codeimplant.com</link>
	<description>The development, technology, and business of software.</description>
	<lastBuildDate>Fri, 06 Nov 2009 04:17:38 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Links: Game-Object Component Architecture</title>
		<link>http://www.codeimplant.com/2008/08/30/links-game-object-component-architecture/</link>
		<comments>http://www.codeimplant.com/2008/08/30/links-game-object-component-architecture/#comments</comments>
		<pubDate>Sat, 30 Aug 2008 19:32:27 +0000</pubDate>
		<dc:creator>Kevin</dc:creator>
				<category><![CDATA[Design]]></category>

		<guid isPermaLink="false">http://kevindhawkins.com/codeimplant/?p=39</guid>
		<description><![CDATA[The game-object component architecture seems to be a design technique that&#8217;s gaining (or has already gained?) traction in the gaming industry. We&#8217;ve implemented a similar design at my daytime workplace&#160;with a slant toward simulation training, but until it gets further along I can&#8217;t talk about it publicly. Maybe one day I&#8217;ll write an article.
Lately I&#8217;ve [...]]]></description>
			<content:encoded><![CDATA[<p><P>The game-object component architecture seems to be a design technique that&#8217;s gaining (or has already gained?) traction in the gaming industry. We&#8217;ve implemented a similar design at <A href="http://www.raydon.com/" target=_blank>my daytime workplace</A>&nbsp;with a slant toward simulation training, but until it gets further along I can&#8217;t talk about it publicly. Maybe one day I&#8217;ll write an article.</P><br />
<P>Lately I&#8217;ve noticed a&nbsp;lot of blogs and threads around the Internet that talk about this architectural approach, so I thought I&#8217;d log some of the best links I&#8217;ve seen that discuss the design concepts&nbsp;for game-object component designs. I haven&#8217;t seen a lot of good implementation discussion online, probably because it can be implemented in a variety of ways, but perhaps anyone looking for more information on this topic will find these links useful:</P></p>
<ul>
<li>Cowboy Programming Blog, <A href="http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/" target=_blank>&#8220;Evolve Your Hierarchy&#8221;</A>, by Mick West
<li>Game Architect Blog, <A href="http://www.gamearchitect.net/Articles/GameObjects1.html" target=_blank>&#8220;Game Object Structure&#8221;</A>, by Kyle Wilson&nbsp;
<li>GDC 2002 Powerpoint, <A href="http://www.drizzle.com/~scottb/gdc/game-objects_files/frame.htm" target=_blank>&#8220;A Data-Driven Game Object System&#8221;</A>, by Scott Bilas&nbsp;
</ul>
<p><P>While I can&#8217;t personally confirm more than a few of the engines out there, it&#8217;s my understanding that just about every major game engine commercially available is using this architecture. This makes sense because those engines are trying to&nbsp;focus on gameplay programming and content creation, which this architecture is meant to accomplish.</P></p>
]]></content:encoded>
			<wfw:commentRss>http://www.codeimplant.com/2008/08/30/links-game-object-component-architecture/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Imperfection of Life in WALL-E</title>
		<link>http://www.codeimplant.com/2008/07/04/the-imperfection-of-life-in-wall-e/</link>
		<comments>http://www.codeimplant.com/2008/07/04/the-imperfection-of-life-in-wall-e/#comments</comments>
		<pubDate>Fri, 04 Jul 2008 19:50:35 +0000</pubDate>
		<dc:creator>Kevin</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Film]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://kevindhawkins.com/codeimplant/?p=49</guid>
		<description><![CDATA[Some food for thought&#160;from WALL-E director Andrew Stanton:


Life is nothing but imperfection and the computer likes perfection, so we spent probably 90% of our time putting in all of the imperfections, whether it&#8217;s in the design of something or just the unconscious stuff. How the camera lens works in [a real] housing is never perfect, [...]]]></description>
			<content:encoded><![CDATA[<p><P>Some <A href="http://mag.awn.com/?ltype=pageone&amp;article_no=3682" target=_blank>food for thought</A>&nbsp;from WALL-E director Andrew Stanton:</P><br />
<P></p>
<blockquote><p>
<P>Life is nothing but imperfection and the computer likes perfection, so we spent probably 90% of our time putting in all of the imperfections, whether it&#8217;s in the design of something or just the unconscious stuff. How the camera lens works in [a real] housing is never perfect, and we tried to put those imperfections [into the virtual camera] so that everything looks like you&#8217;re in familiar [live-action] territory.</P></p></blockquote>
<p><P><A style="FLOAT: right" href="http://simbryo.typepad.com/.a/6a00e5518a0f6d883300e553a2606e8834-pi"></A><br />Tip: <A href="http://www.kottke.org/" target=_blank>kottke.org</A></P><br />
<P></P></p>
]]></content:encoded>
			<wfw:commentRss>http://www.codeimplant.com/2008/07/04/the-imperfection-of-life-in-wall-e/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Abstraction in User Interface Design</title>
		<link>http://www.codeimplant.com/2008/06/25/abstraction-in-user-interface-design/</link>
		<comments>http://www.codeimplant.com/2008/06/25/abstraction-in-user-interface-design/#comments</comments>
		<pubDate>Wed, 25 Jun 2008 08:42:29 +0000</pubDate>
		<dc:creator>Kevin</dc:creator>
				<category><![CDATA[Design]]></category>

		<guid isPermaLink="false">http://kevindhawkins.com/codeimplant/?p=51</guid>
		<description><![CDATA[I&#39;ve been focused on a lot of tool development lately, and in my quest to design the best possible tools&#0160;my mind has wandered into the concept of&#0160;abstraction and how it is everywhere in software. 
In the world of languages, low-level assembly was developed to abstract out of bits and bytes, while C and FORTRAN were [...]]]></description>
			<content:encoded><![CDATA[<p>I&#39;ve been focused on a lot of tool development lately, and in my quest to design the best possible tools&#0160;my mind has wandered into the concept of&#0160;abstraction and how it is everywhere in software. </p>
<p>In the world of languages, low-level assembly was developed to abstract out of bits and bytes, while C and FORTRAN were developed to abstract out of assembly. These days languages like C# and Java abstract so much from the machine level that they even have their own <em>virtual </em>machine.</p>
<p>In design&#0160;we build layers and hierarchies to ease our ability to consider the higher-level&#0160;concepts inherent in the software. Engines, API&#39;s, SDK&#39;s, libraries, components. They&#39;re all abstractions.</p>
<p>Take that one step further and you have the most important abstraction of all:&#0160;the user interface.</p>
<p>It would be a mistake to design a user interface around the software design&#0160;objects. Chances are the user isn&#39;t going to be a software engineer that can quickly grab the concepts&#0160;of software design, so it&#39;s pretty worthless to create a user interface that reflects the design. Sadly, I see this on a regular basis, whether it&#39;s through my own coworkers, a tool I&#39;m trying to use, or someone else&#39;s project on the Internet.</p>
<p>A better approach would be to abstract away from the design by simplifying operations and organization at the user interface level. This puts the user interface in the role of the lens into the functionality of the software design, without even exposing those design objects to the user.</p>
<p>And that&#39;s what we are trying to achieve in our tool development work: simple interfaces abstracting from a complex system. It&#39;s not easy, but striking the right balance with the user interface abstraction will help with our tools&#39; success. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.codeimplant.com/2008/06/25/abstraction-in-user-interface-design/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Clever or Straightforward code?</title>
		<link>http://www.codeimplant.com/2008/05/09/clever-or-straightforward-code/</link>
		<comments>http://www.codeimplant.com/2008/05/09/clever-or-straightforward-code/#comments</comments>
		<pubDate>Fri, 09 May 2008 07:00:38 +0000</pubDate>
		<dc:creator>Kevin</dc:creator>
				<category><![CDATA[Design]]></category>

		<guid isPermaLink="false">http://kevindhawkins.com/codeimplant/?p=67</guid>
		<description><![CDATA[An engineer wrote some code today that at first glance confused me. I read code like I read the English language, which is to say I read patterns of code and recognize algorithms to piece together program flow, and in this particular case I didn&#8217;t recognize the pattern.
Anyway, the code looked a little something like [...]]]></description>
			<content:encoded><![CDATA[<p>An engineer wrote some code today that at first glance confused me. I read code like I read the English language, which is to say I read patterns of code and recognize algorithms to piece together program flow, and in this particular case I didn&#8217;t recognize the pattern.</p>
<p>Anyway, the code looked a little something like this and resided in a pretty large function (names have been changed and some code simplified to protect the innocent):</p>
<blockquote dir="ltr" style="BORDER-RIGHT: #666 2px solid; PADDING-RIGHT: 5px; BORDER-TOP: #666 2px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; BORDER-LEFT: #666 2px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #666 2px solid; FONT-FAMILY: 'Courier New'; BACKGROUND-COLOR: #eee"><p>Obj *myObj;<br />objListIter = GetObjListIterator();</p>
<p>for (int idx = 0; idx &lt;= objIdx; idx++)<br />&nbsp; &nbsp;&nbsp; myObj = objListIter.getNext();</p>
<p>myObj-&gt;DoStuff();</p>
</blockquote>
<p>It&#8217;s clever. Simple. Probably not the way I&#8217;d do it. In fact, it made me do a double-take to where I had to make sure I understood what the <em>for</em> loop was trying to do.</p>
<p>But that&#8217;s kind of the problem. </p>
<p><span id="more-67"></span></p>
<p>The loop is performing a common task (get an index in a list), but it&#8217;s doing it in a unique manner. Such a unique manner that even the author had to verify himself that the code worked properly. When I first saw the code it did not, but it wasn&#8217;t an immediately obvious bug <em>because</em> the algorithm was too unique in the first place.</p>
<p>And that&#8217;s a problem. It wastes time. </p>
<p>I know programmers who like to be clever. They like to show that they can solve problems in unique ways. They forget that there is a human aspect to software, that other programmers have to read their code and possibly modify it one day. </p>
<p>I also know programmers who like to be practical. They like to show that they can create working, lasting code by being straightforward in their code and working hard to ensure design integrity throughout the software. They remember that there is a human aspect to software, that other programmers have to read their code and possibly modify it one day. </p>
<p>Which type of programmer would you rather work with?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codeimplant.com/2008/05/09/clever-or-straightforward-code/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Principles of good design</title>
		<link>http://www.codeimplant.com/2008/04/29/principles-of-good-design/</link>
		<comments>http://www.codeimplant.com/2008/04/29/principles-of-good-design/#comments</comments>
		<pubDate>Wed, 30 Apr 2008 06:06:57 +0000</pubDate>
		<dc:creator>Kevin</dc:creator>
				<category><![CDATA[Design]]></category>

		<guid isPermaLink="false">http://kevindhawkins.com/codeimplant/?p=73</guid>
		<description><![CDATA[I&#8217;m still reading through the book Dreaming in Code. It&#8217;s taking longer than I had hoped, but sometimes it&#8217;s been a difficult read for me &#8211; not because it&#8217;s a bad book or bad writing, but because sometimes the author is describing something about software development of which I have enough personal knowledge that his [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m still reading through the book <a href="http://www.codeimplant.com/2008/04/started-reading.html">Dreaming in Code</a>. It&#8217;s taking longer than I had hoped, but sometimes it&#8217;s been a difficult read for me &#8211; not because it&#8217;s a bad book or bad writing, but because sometimes the author is describing something about software development of which I have enough personal knowledge that his pages of discussion become boring. </p>
<p>I suppose that&#8217;s what you get for reading a book about software development targetted at anybody but a software developer.</p>
<p>Anyway, recently I came across a passage about Mitch Kapor&#8217;s thoughts on software design, which was interesting because it gave me some ideas on how to better frame software design when communicating with both engineers and management. It also led me to reassess my own views on software design. <img title="Legosdesign" alt="Lego Designs from MoMA in NYC. Photo by wallyg on flickr." src="http://simbryo.typepad.com/photos/uncategorized/2008/04/29/legosdesign.jpg" border="0" style="FLOAT: right; MARGIN: 0px 0px 5px 5px" /></p>
<p>It turns out that Kapor <a href="http://hci.stanford.edu/bds/1-kapor.html">wrote about his thoughts on software design</a> in a manifesto in 1990, including this idea of applying to software the architecture theorist Vitruvius&#8217;s principles of good design (Vitruvius is from Ancient Rome):</p>
<ul>
<li><em>Firmness</em>, meaning &quot;A program should not have any bugs that inhibit its function.&quot; aka, no bugs</li>
<li><em>Commodity</em>, meaning &quot;A program should be suitable for the purposes of which it was intended.&quot;</li>
<li><em>Delight</em>, meaning &quot;The experience of using the program should be a pleasurable one.&quot;</li>
</ul>
<p>These three principles have been a backbone, so to speak, of building architecture for many, many years, and I think Kapor is (or was) onto something here in that these core architectural principles can and should be applied to software design. I don&#8217;t know if Kapor believed they applied to implementation or not.</p>
<p>Of course, I believe software design and implementation are the same activity at different levels of abstraction. A software architect designs algorithms at the system-level while your entry-level software engineer designs algorithms at the function level. An architect may use UML or a whiteboard as the design tool of choice, while the entry-level engineer uses code, but in the end the thought processes required are fundamentally the same.</p>
<p>When I think of these principles and view them in the context of the development I or my peers engage in I see that the best engineers are the ones who consider firmness, commodity, and delight at all levels of abstraction in design &#8211; from architecture to high-level design to subsystem implementation to function implementation.</p>
<p>So, I wonder, are truly great software designers the ones who know how to maintain that architectural integrity of design principles in the software? This isn&#8217;t an easy thing to do. It requires discipline. It requires the ability to see the big picture while diving into the weeds. It requires conceptual integrity in the design from start to end. </p>
<p>Yet, it makes sense. The best engineers are the ones who can see the big picture and work in the weeds. They are the ones who have the discipline to follow design principles from start to end and from architecture to code. They follow Vitruvius&#8217;s design principles not just from an architecture view, but even for each line of code. </p>
<p>It&#8217;s pure design integrity at every level of the software. It&#8217;s hard to do, but doing those things that are hard to do is what makes people great and it should be what everyone strives for.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codeimplant.com/2008/04/29/principles-of-good-design/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
