<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	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/"
		>
<channel>
	<title>Comments on: What Is Overengineering?</title>
	<atom:link href="http://www.codesimplicity.com/post/what-is-overengineering/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.codesimplicity.com/post/what-is-overengineering/</link>
	<description></description>
	<lastBuildDate>Tue, 27 Dec 2011 03:40:15 -0600</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<item>
		<title>By: John</title>
		<link>http://www.codesimplicity.com/post/what-is-overengineering/comment-page-1/#comment-2611</link>
		<dc:creator>John</dc:creator>
		<pubDate>Tue, 27 Dec 2011 03:40:15 +0000</pubDate>
		<guid isPermaLink="false">http://www.codesimplicity.com/archives/12#comment-2611</guid>
		<description>I know the topic is stale, but I must chime in with a tell-tale sign that you&#039;re dev&#039;s (or yourself) is over engineering when:

Code &gt; DataModel

When developers are more focused on macro-intricacies of their code VS retaining the integrity of the data model.

IE: when you&#039;re code is building relationships to form data models VS the data models being normalized entities that I identify their relationships using primary identifiers.

Most of the time, this is a result of the &quot;Second System&quot; effect where you need to prove your ninja status by producing the most robust backend operations that utilize every design pattern that the gang-of-four called out.

My view: You can always re-factor and redesign shitty code, it&#039;s not so easy to roll back transactions after your data model is corrupted and/or fragmented.

DataModel &gt; Code

Presentation &gt; &lt;b&gt;To customer/user&lt;/b&gt; VS mutli-threaded com apartments using a polymorhphic factory pattern.</description>
		<content:encoded><![CDATA[<p>I know the topic is stale, but I must chime in with a tell-tale sign that you&#8217;re dev&#8217;s (or yourself) is over engineering when:</p>
<p>Code &gt; DataModel</p>
<p>When developers are more focused on macro-intricacies of their code VS retaining the integrity of the data model.</p>
<p>IE: when you&#8217;re code is building relationships to form data models VS the data models being normalized entities that I identify their relationships using primary identifiers.</p>
<p>Most of the time, this is a result of the &#8220;Second System&#8221; effect where you need to prove your ninja status by producing the most robust backend operations that utilize every design pattern that the gang-of-four called out.</p>
<p>My view: You can always re-factor and redesign shitty code, it&#8217;s not so easy to roll back transactions after your data model is corrupted and/or fragmented.</p>
<p>DataModel &gt; Code</p>
<p>Presentation &gt; <b>To customer/user</b> VS mutli-threaded com apartments using a polymorhphic factory pattern.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Thomas</title>
		<link>http://www.codesimplicity.com/post/what-is-overengineering/comment-page-1/#comment-2516</link>
		<dc:creator>Thomas</dc:creator>
		<pubDate>Thu, 22 Sep 2011 06:51:50 +0000</pubDate>
		<guid isPermaLink="false">http://www.codesimplicity.com/archives/12#comment-2516</guid>
		<description>Great Post! Thank you :)</description>
		<content:encoded><![CDATA[<p>Great Post! Thank you <img src='http://www.codesimplicity.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Max Kanat-Alexander</title>
		<link>http://www.codesimplicity.com/post/what-is-overengineering/comment-page-1/#comment-2441</link>
		<dc:creator>Max Kanat-Alexander</dc:creator>
		<pubDate>Tue, 14 Jun 2011 05:08:21 +0000</pubDate>
		<guid isPermaLink="false">http://www.codesimplicity.com/archives/12#comment-2441</guid>
		<description>Hahaha, thanks! :-)</description>
		<content:encoded><![CDATA[<p>Hahaha, thanks! <img src='http://www.codesimplicity.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Erik</title>
		<link>http://www.codesimplicity.com/post/what-is-overengineering/comment-page-1/#comment-2440</link>
		<dc:creator>Erik</dc:creator>
		<pubDate>Mon, 13 Jun 2011 13:18:18 +0000</pubDate>
		<guid isPermaLink="false">http://www.codesimplicity.com/archives/12#comment-2440</guid>
		<description>Good analogy in the original post.  The comments seem a bit overengineered though.</description>
		<content:encoded><![CDATA[<p>Good analogy in the original post.  The comments seem a bit overengineered though.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Warren</title>
		<link>http://www.codesimplicity.com/post/what-is-overengineering/comment-page-1/#comment-1451</link>
		<dc:creator>Warren</dc:creator>
		<pubDate>Fri, 11 Dec 2009 22:34:15 +0000</pubDate>
		<guid isPermaLink="false">http://www.codesimplicity.com/archives/12#comment-1451</guid>
		<description>Here are some examples. You can decide for yourselves if they are necessarily complex, or overengineered.

Early web browsers had to parse HTML and present it reasonably. Modern browsers must present HTML precisely, support XML, support XSLT, support a lexer/parser and (fast) compiler for javascript, a DOM object model, a plugin infrastruture, CSS, SSL, SVG, embedded Java, Flash, O3D. 

C++ supports &#039;generics&#039;, generics let you define a data structure once, and then make multiple versions of it for different payload types. You write a generic linked list, and instantiate it to carry INTS, another for carrying CHARACTERS, and another for carrying a user defined structure.  You end up with 3x the object code, but it is typesafe.  This was done in C by using void* (a pointer to an object of unknown type) as the datatype -- a solution which needs 0 new lines of code.

Programming languages are conventionally a lexer (to turn TEXT into tokens), parser (to turn TOKENS into AST [abstract syntax tree]) and compiler (to optimize the AST and produce COMPUTER INSTRUCTIONS). An alternative is to just write a text -&gt; AST translation, which can be done easily if the language is not complicated (i.e. PREFIX: (+ 1 4 3) or POSTFIX: 1 4 + 3 +, but not INFIX: 1 + 4 + 3)</description>
		<content:encoded><![CDATA[<p>Here are some examples. You can decide for yourselves if they are necessarily complex, or overengineered.</p>
<p>Early web browsers had to parse HTML and present it reasonably. Modern browsers must present HTML precisely, support XML, support XSLT, support a lexer/parser and (fast) compiler for javascript, a DOM object model, a plugin infrastruture, CSS, SSL, SVG, embedded Java, Flash, O3D. </p>
<p>C++ supports &#8216;generics&#8217;, generics let you define a data structure once, and then make multiple versions of it for different payload types. You write a generic linked list, and instantiate it to carry INTS, another for carrying CHARACTERS, and another for carrying a user defined structure.  You end up with 3x the object code, but it is typesafe.  This was done in C by using void* (a pointer to an object of unknown type) as the datatype &#8212; a solution which needs 0 new lines of code.</p>
<p>Programming languages are conventionally a lexer (to turn TEXT into tokens), parser (to turn TOKENS into AST [abstract syntax tree]) and compiler (to optimize the AST and produce COMPUTER INSTRUCTIONS). An alternative is to just write a text -&gt; AST translation, which can be done easily if the language is not complicated (i.e. PREFIX: (+ 1 4 3) or POSTFIX: 1 4 + 3 +, but not INFIX: 1 + 4 + 3)</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Simon Berg</title>
		<link>http://www.codesimplicity.com/post/what-is-overengineering/comment-page-1/#comment-1366</link>
		<dc:creator>Simon Berg</dc:creator>
		<pubDate>Wed, 07 Oct 2009 12:13:08 +0000</pubDate>
		<guid isPermaLink="false">http://www.codesimplicity.com/archives/12#comment-1366</guid>
		<description>Hilarious! So ironic. The first post from Chris is a classic example of over engineering a comment! The analogy of Laser and Ant hill was perfectly fine. Its an analogy! Its supposed to be short simple and easy for a none experienced person to relate to. Not a literal example! Funny!</description>
		<content:encoded><![CDATA[<p>Hilarious! So ironic. The first post from Chris is a classic example of over engineering a comment! The analogy of Laser and Ant hill was perfectly fine. Its an analogy! Its supposed to be short simple and easy for a none experienced person to relate to. Not a literal example! Funny!</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Max Kanat-Alexander</title>
		<link>http://www.codesimplicity.com/post/what-is-overengineering/comment-page-1/#comment-1175</link>
		<dc:creator>Max Kanat-Alexander</dc:creator>
		<pubDate>Fri, 28 Aug 2009 19:22:22 +0000</pubDate>
		<guid isPermaLink="false">http://www.codesimplicity.com/archives/12#comment-1175</guid>
		<description>Well, I think the problem with &quot;enterprise&quot; solutions is that they&#039;re just trying to do too much, and often in the wrong way.

For example, it&#039;s just wrong to build a monolithic application instead of a collection of single, focused applications. We&#039;ve proved this over and over for almost 40 years now in software development--it&#039;s time that people just took the obvious proof and stopped designing systems to &quot;do everything&quot;.

Once we get down to the single, focused application, that&#039;s where under-engineering (or as you correctly put it, under-designing) gets into play too often. When you&#039;re designing a focused application, you can actually be a lot more flexible than people think about. In fact, the smaller your focus is, the more flexible you can be. For example, if you break things out into libraries, then you can really focus on the quality of the library as though it was a library that &lt;em&gt;anybody&lt;/em&gt; was going to use.

For example, I just wrote &lt;a href=&quot;http://search.cpan.org/dist/Parse-StackTrace&quot; rel=&quot;nofollow&quot;&gt;Parse::StackTrace&lt;/a&gt;--a library that I needed for actually only one purpose, but I wrote it as though lots of other people were going to use it--I gave it a full test suite, a complete API, etc. As a result, it was a lot easier for &lt;em&gt;me&lt;/em&gt; to use, too!

Anyhow, I could go on and on about this, but that&#039;s the basics.

-Max</description>
		<content:encoded><![CDATA[<p>Well, I think the problem with &#8220;enterprise&#8221; solutions is that they&#8217;re just trying to do too much, and often in the wrong way.</p>
<p>For example, it&#8217;s just wrong to build a monolithic application instead of a collection of single, focused applications. We&#8217;ve proved this over and over for almost 40 years now in software development&#8211;it&#8217;s time that people just took the obvious proof and stopped designing systems to &#8220;do everything&#8221;.</p>
<p>Once we get down to the single, focused application, that&#8217;s where under-engineering (or as you correctly put it, under-designing) gets into play too often. When you&#8217;re designing a focused application, you can actually be a lot more flexible than people think about. In fact, the smaller your focus is, the more flexible you can be. For example, if you break things out into libraries, then you can really focus on the quality of the library as though it was a library that <em>anybody</em> was going to use.</p>
<p>For example, I just wrote <a href="http://search.cpan.org/dist/Parse-StackTrace" rel="nofollow">Parse::StackTrace</a>&#8211;a library that I needed for actually only one purpose, but I wrote it as though lots of other people were going to use it&#8211;I gave it a full test suite, a complete API, etc. As a result, it was a lot easier for <em>me</em> to use, too!</p>
<p>Anyhow, I could go on and on about this, but that&#8217;s the basics.</p>
<p>-Max</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Palani Nama</title>
		<link>http://www.codesimplicity.com/post/what-is-overengineering/comment-page-1/#comment-1167</link>
		<dc:creator>Palani Nama</dc:creator>
		<pubDate>Fri, 28 Aug 2009 05:34:58 +0000</pubDate>
		<guid isPermaLink="false">http://www.codesimplicity.com/archives/12#comment-1167</guid>
		<description>Max &amp; others, thank you for the valuable comments. I see that we started with over &quot;Designing&quot; and ended up illustrating over &quot;Coding&quot;. Well, I would like to bring back the focus to over &quot;Design&quot;. From my experiences, I have come across problems that arise due to either extremes &amp; also observed a pattern where these extremes occur. I see that we under-design applications targeted towards solving specific business problems, for example, a pre-process for an upload job, or a standalone application doing specific job and interacting with limited systems. On the contrary, enterprise solutions are over designed on purpose to provide interfaces to interact distinct non-existent (future) systems depending on future roadmaps. 

Well, my point here is, I couldn&#039;t figure out a hardcore rule to categorize a system as over designed or under designed. If you have some guidelines to classy software systems so, pls let us know.</description>
		<content:encoded><![CDATA[<p>Max &amp; others, thank you for the valuable comments. I see that we started with over &#8220;Designing&#8221; and ended up illustrating over &#8220;Coding&#8221;. Well, I would like to bring back the focus to over &#8220;Design&#8221;. From my experiences, I have come across problems that arise due to either extremes &amp; also observed a pattern where these extremes occur. I see that we under-design applications targeted towards solving specific business problems, for example, a pre-process for an upload job, or a standalone application doing specific job and interacting with limited systems. On the contrary, enterprise solutions are over designed on purpose to provide interfaces to interact distinct non-existent (future) systems depending on future roadmaps. </p>
<p>Well, my point here is, I couldn&#8217;t figure out a hardcore rule to categorize a system as over designed or under designed. If you have some guidelines to classy software systems so, pls let us know.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Code Simplicity What Is Overengineering &#124; debt solutions</title>
		<link>http://www.codesimplicity.com/post/what-is-overengineering/comment-page-1/#comment-1065</link>
		<dc:creator>Code Simplicity What Is Overengineering &#124; debt solutions</dc:creator>
		<pubDate>Tue, 16 Jun 2009 00:28:20 +0000</pubDate>
		<guid isPermaLink="false">http://www.codesimplicity.com/archives/12#comment-1065</guid>
		<description>[...] Code Simplicity What Is Overengineering   Posted by root 59 minutes ago (http://www.codesimplicity.com)        Powered by wordpress theme based on a design by jared quinn this is an overengineered solution strangely enough though it hard to find an actual in the very rare chance that somebody adds something like say the euro symbol to the language comment by max k        Discuss&#160;  &#124;&#160; Bury &#124;&#160;    News &#124; Code Simplicity What Is Overengineering [...]</description>
		<content:encoded><![CDATA[<p>[...] Code Simplicity What Is Overengineering   Posted by root 59 minutes ago (<a href="http://www.codesimplicity.com" rel="nofollow">http://www.codesimplicity.com</a>)        Powered by wordpress theme based on a design by jared quinn this is an overengineered solution strangely enough though it hard to find an actual in the very rare chance that somebody adds something like say the euro symbol to the language comment by max k        Discuss&nbsp;  |&nbsp; Bury |&nbsp;    News | Code Simplicity What Is Overengineering [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Max Kanat-Alexander</title>
		<link>http://www.codesimplicity.com/post/what-is-overengineering/comment-page-1/#comment-1008</link>
		<dc:creator>Max Kanat-Alexander</dc:creator>
		<pubDate>Wed, 25 Feb 2009 21:45:45 +0000</pubDate>
		<guid isPermaLink="false">http://www.codesimplicity.com/archives/12#comment-1008</guid>
		<description>That&#039;s a good question. I think if we&#039;re talking about &lt;em&gt;software&lt;/em&gt; engineering, then the over-engineering is something that happens in the software. But we could be talking about process, and the same general principle would carry over--basically, building complex structures that don&#039;t need to be there to accomplish the purpose into the reasonably-viewed future.

-Max</description>
		<content:encoded><![CDATA[<p>That&#8217;s a good question. I think if we&#8217;re talking about <em>software</em> engineering, then the over-engineering is something that happens in the software. But we could be talking about process, and the same general principle would carry over&#8211;basically, building complex structures that don&#8217;t need to be there to accomplish the purpose into the reasonably-viewed future.</p>
<p>-Max</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Christine</title>
		<link>http://www.codesimplicity.com/post/what-is-overengineering/comment-page-1/#comment-1007</link>
		<dc:creator>Christine</dc:creator>
		<pubDate>Wed, 25 Feb 2009 15:31:21 +0000</pubDate>
		<guid isPermaLink="false">http://www.codesimplicity.com/archives/12#comment-1007</guid>
		<description>Hi, this is very interesting. 

I got a deliverable in a research project asking me to make sure I avoid over-engineering in the project. Whilst I worked as programmer before and am totally with you on the way you discussed the topic above, thinking about it: Does over-engineering not go much further than just writing complicated code rather than a few lines which would do the job. Doesnt it start already on a mangement level? Is it not over-engineering in software projects in general if I for instance impose processes and reguluations (such as Unit tests) for all possible cases even if it might not be necessary? 

If anyone has any ideas or hints to literature that be great!!

Christine</description>
		<content:encoded><![CDATA[<p>Hi, this is very interesting. </p>
<p>I got a deliverable in a research project asking me to make sure I avoid over-engineering in the project. Whilst I worked as programmer before and am totally with you on the way you discussed the topic above, thinking about it: Does over-engineering not go much further than just writing complicated code rather than a few lines which would do the job. Doesnt it start already on a mangement level? Is it not over-engineering in software projects in general if I for instance impose processes and reguluations (such as Unit tests) for all possible cases even if it might not be necessary? </p>
<p>If anyone has any ideas or hints to literature that be great!!</p>
<p>Christine</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: ph</title>
		<link>http://www.codesimplicity.com/post/what-is-overengineering/comment-page-1/#comment-1004</link>
		<dc:creator>ph</dc:creator>
		<pubDate>Tue, 03 Feb 2009 02:26:00 +0000</pubDate>
		<guid isPermaLink="false">http://www.codesimplicity.com/archives/12#comment-1004</guid>
		<description>This string_reverse example is not great, its stupid because
a single string should be the same as an one-element array.</description>
		<content:encoded><![CDATA[<p>This string_reverse example is not great, its stupid because<br />
a single string should be the same as an one-element array.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Max Kanat-Alexander</title>
		<link>http://www.codesimplicity.com/post/what-is-overengineering/comment-page-1/#comment-974</link>
		<dc:creator>Max Kanat-Alexander</dc:creator>
		<pubDate>Sat, 03 Jan 2009 08:24:44 +0000</pubDate>
		<guid isPermaLink="false">http://www.codesimplicity.com/archives/12#comment-974</guid>
		<description>Ha, yes, that is a great example, and you are totally right! :-) Nice! :-)

-Max</description>
		<content:encoded><![CDATA[<p>Ha, yes, that is a great example, and you are totally right! <img src='http://www.codesimplicity.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  Nice! <img src='http://www.codesimplicity.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>-Max</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Chris</title>
		<link>http://www.codesimplicity.com/post/what-is-overengineering/comment-page-1/#comment-973</link>
		<dc:creator>Chris</dc:creator>
		<pubDate>Sat, 03 Jan 2009 05:28:13 +0000</pubDate>
		<guid isPermaLink="false">http://www.codesimplicity.com/archives/12#comment-973</guid>
		<description>Good post! I think your examples aren&#039;t realistic enough though. Here&#039;s a much more tangible example of overengineering:

Say that you need to reverse a string in ONE place in your code, and to make it reusable you decide to make a function:

function string_reverse(string)
{
  // reverse the string
  // return the reversed string
}

somestring = string_reverse(somestring)

While you are coding this, you think to yourself &quot;wouldn&#039;t it be AWESOME if this could handle a whole array of strings and process each of them? that COULD come in handy SOMETIME&quot;, so you code:

function string_reverse(string)
{
  // if this is an array of STRINGS, loop through it:
  // {
  // --&gt; reverse the string in the current element
  // --&gt; add the reversed string back to the array
  // --&gt; return the reversed array once the loop is complete
  // }
  // else (this is a string)
  // {
  // --&gt; reverse the string
  // --&gt; return the reversed string
  // }
}

somestring = string_reverse(somestring)

Notice the ONLY thing that changed here? You just wrote a bunch of completely useless lines, and you STILL ended up with a function that did just one thing for YOU, reversing that ONE string you have.

That&#039;s why less overengineering is more productivity, because you spent X minutes coding something you don&#039;t need now, and could have JUST AS EASILY added the array handling LATER if you ever needed it, but instead you wasted time coding features into a function you A) only used once on your code and B) only ever NEED it to handle strings for the forseeable future.

I think this is a prime example of real-world overengineering. ;-)</description>
		<content:encoded><![CDATA[<p>Good post! I think your examples aren&#8217;t realistic enough though. Here&#8217;s a much more tangible example of overengineering:</p>
<p>Say that you need to reverse a string in ONE place in your code, and to make it reusable you decide to make a function:</p>
<p>function string_reverse(string)<br />
{<br />
  // reverse the string<br />
  // return the reversed string<br />
}</p>
<p>somestring = string_reverse(somestring)</p>
<p>While you are coding this, you think to yourself &#8220;wouldn&#8217;t it be AWESOME if this could handle a whole array of strings and process each of them? that COULD come in handy SOMETIME&#8221;, so you code:</p>
<p>function string_reverse(string)<br />
{<br />
  // if this is an array of STRINGS, loop through it:<br />
  // {<br />
  // &#8211;&gt; reverse the string in the current element<br />
  // &#8211;&gt; add the reversed string back to the array<br />
  // &#8211;&gt; return the reversed array once the loop is complete<br />
  // }<br />
  // else (this is a string)<br />
  // {<br />
  // &#8211;&gt; reverse the string<br />
  // &#8211;&gt; return the reversed string<br />
  // }<br />
}</p>
<p>somestring = string_reverse(somestring)</p>
<p>Notice the ONLY thing that changed here? You just wrote a bunch of completely useless lines, and you STILL ended up with a function that did just one thing for YOU, reversing that ONE string you have.</p>
<p>That&#8217;s why less overengineering is more productivity, because you spent X minutes coding something you don&#8217;t need now, and could have JUST AS EASILY added the array handling LATER if you ever needed it, but instead you wasted time coding features into a function you A) only used once on your code and B) only ever NEED it to handle strings for the forseeable future.</p>
<p>I think this is a prime example of real-world overengineering. <img src='http://www.codesimplicity.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
	</item>
	<item>
		<title>By: zibaldone.info &#187; Blog Archive &#187; Sii prolifico, non perfetto. Stupidi più bravi a fare soldi.</title>
		<link>http://www.codesimplicity.com/post/what-is-overengineering/comment-page-1/#comment-327</link>
		<dc:creator>zibaldone.info &#187; Blog Archive &#187; Sii prolifico, non perfetto. Stupidi più bravi a fare soldi.</dc:creator>
		<pubDate>Mon, 23 Jun 2008 22:41:42 +0000</pubDate>
		<guid isPermaLink="false">http://www.codesimplicity.com/archives/12#comment-327</guid>
		<description>[...] What Is Overengineering? - Code Simplicity [...]</description>
		<content:encoded><![CDATA[<p>[...] What Is Overengineering? &#8211; Code Simplicity [...]</p>
]]></content:encoded>
	</item>
</channel>
</rss>

