<?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"
	>
<channel>
	<title>Comments on: Is it worth separating between the essential and accidental difficulties of software development?</title>
	<atom:link href="http://www.buunguyen.net/blog/is-it-worth-separating-essential-and-accidental-difficulties-of-software-development.html/feed" rel="self" type="application/rss+xml" />
	<link>http://www.buunguyen.net/blog/is-it-worth-separating-essential-and-accidental-difficulties-of-software-development.html</link>
	<description>Thoughts on software development and project management</description>
	<pubDate>Thu, 20 Nov 2008 20:29:02 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.2</generator>
		<item>
		<title>By: Buu Nguyen</title>
		<link>http://www.buunguyen.net/blog/is-it-worth-separating-essential-and-accidental-difficulties-of-software-development.html#comment-1562</link>
		<dc:creator>Buu Nguyen</dc:creator>
		<pubDate>Fri, 06 Apr 2007 01:43:28 +0000</pubDate>
		<guid isPermaLink="false">http://www.buunguyen.net/blog/is-it-worth-separating-essential-and-accidental-difficulties-of-software-development.html#comment-1562</guid>
		<description>Thanks for your comment, Fadzlan
&lt;blockquote&gt;Is Steve attacking the essentials? It appears to me that (as the other poster had mentioned) he is accidential difficulties, albeit at different levels.&lt;/blockquote&gt;
I believe he was.  I also responded about that to Jon.  Let me pull all Steve's paragraphs together
&lt;blockquote&gt;
&lt;i&gt;[Extracted from Rapid Development]&lt;/i&gt;
â€¦
As a rule of thumb, the more a technology strikes at the essence of what makes software development difficult, the more effort it is likely to save.

A high-level language compiler saves a lot of effort because it moves the whole set of concepts that you have to be concerned with to a higher level. Thatâ€™s what the move to higher-level programming languages has accomplished over the years. The switch from low-level languages like assembler to higher-level languages like C and Pascal freed you from having to think about what the underlying machine was doing when it ran your program. The move to visual-programming languages such as Delphi, PowerBuilder, and Visual Basic provides a similar kind of simplification, allowing you to forget about many of the tasks a windowing environment performs when it runs a graphically oriented program.

Tools that do not strike at the conceptual essence, the hard part of programming donâ€™t help as much.

A programming editor helps only a little because it allows you to type in code faster; itâ€™s handy, but it doesnâ€™t strike at the essence of what makes software development difficult. The same is true for source-code control tools, debuggers, execution profilers, automated testing tools, and so on; those tools provide only incremental productivity gains for the same reason.
â€¦
&lt;/blockquote&gt;

I think the above tells what Steve thought clearly.

&lt;blockquote&gt;High level languages and the tools appear to me as accidental difficulties addressed, instead of essential and accidental respectively.&lt;/blockquote&gt;
I think it is debatable as to whether a high-level language can address the essence (defined by  Brooks as &lt;i&gt;"a construct of interlocking concepts: data sets, relationships among data items, algorithms, and invocations of functions"&lt;/i&gt;) - Steve' view VS Brooks' view is one example.  Are the algorithm s, data sets, function invocations etc. floating in the mind of a Assembly designer the same with those in the mind of a Ruby designer?  How about a future language or tool which completely hides most of the algorithms and function invocations?</description>
		<content:encoded><![CDATA[<p>Thanks for your comment, Fadzlan</p>
<blockquote><p>Is Steve attacking the essentials? It appears to me that (as the other poster had mentioned) he is accidential difficulties, albeit at different levels.</p></blockquote>
<p>I believe he was.  I also responded about that to Jon.  Let me pull all Steve&#8217;s paragraphs together</p>
<blockquote><p>
<i>[Extracted from Rapid Development]</i><br />
â€¦<br />
As a rule of thumb, the more a technology strikes at the essence of what makes software development difficult, the more effort it is likely to save.</p>
<p>A high-level language compiler saves a lot of effort because it moves the whole set of concepts that you have to be concerned with to a higher level. Thatâ€™s what the move to higher-level programming languages has accomplished over the years. The switch from low-level languages like assembler to higher-level languages like C and Pascal freed you from having to think about what the underlying machine was doing when it ran your program. The move to visual-programming languages such as Delphi, PowerBuilder, and Visual Basic provides a similar kind of simplification, allowing you to forget about many of the tasks a windowing environment performs when it runs a graphically oriented program.</p>
<p>Tools that do not strike at the conceptual essence, the hard part of programming donâ€™t help as much.</p>
<p>A programming editor helps only a little because it allows you to type in code faster; itâ€™s handy, but it doesnâ€™t strike at the essence of what makes software development difficult. The same is true for source-code control tools, debuggers, execution profilers, automated testing tools, and so on; those tools provide only incremental productivity gains for the same reason.<br />
â€¦
</p></blockquote>
<p>I think the above tells what Steve thought clearly.</p>
<blockquote><p>High level languages and the tools appear to me as accidental difficulties addressed, instead of essential and accidental respectively.</p></blockquote>
<p>I think it is debatable as to whether a high-level language can address the essence (defined by  Brooks as <i>&#8220;a construct of interlocking concepts: data sets, relationships among data items, algorithms, and invocations of functions&#8221;</i>) - Steve&#8217; view VS Brooks&#8217; view is one example.  Are the algorithm s, data sets, function invocations etc. floating in the mind of a Assembly designer the same with those in the mind of a Ruby designer?  How about a future language or tool which completely hides most of the algorithms and function invocations?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Fadzlan</title>
		<link>http://www.buunguyen.net/blog/is-it-worth-separating-essential-and-accidental-difficulties-of-software-development.html#comment-1555</link>
		<dc:creator>Fadzlan</dc:creator>
		<pubDate>Fri, 06 Apr 2007 00:12:08 +0000</pubDate>
		<guid isPermaLink="false">http://www.buunguyen.net/blog/is-it-worth-separating-essential-and-accidental-difficulties-of-software-development.html#comment-1555</guid>
		<description>Is Steve attacking the essentials? It appears to me that (as the other poster had mentioned) he is accidential difficulties, albeit at different levels.

High level languages and the tools appear to me as accidental difficulties addressed, instead of essential and accidental respectively.</description>
		<content:encoded><![CDATA[<p>Is Steve attacking the essentials? It appears to me that (as the other poster had mentioned) he is accidential difficulties, albeit at different levels.</p>
<p>High level languages and the tools appear to me as accidental difficulties addressed, instead of essential and accidental respectively.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Buu Nguyen</title>
		<link>http://www.buunguyen.net/blog/is-it-worth-separating-essential-and-accidental-difficulties-of-software-development.html#comment-1470</link>
		<dc:creator>Buu Nguyen</dc:creator>
		<pubDate>Tue, 03 Apr 2007 14:07:54 +0000</pubDate>
		<guid isPermaLink="false">http://www.buunguyen.net/blog/is-it-worth-separating-essential-and-accidental-difficulties-of-software-development.html#comment-1470</guid>
		<description>@Peter: thanks for your comments.  I totally agree with your opinion that the distinction between accidental and essential difficulties is a function of time.  </description>
		<content:encoded><![CDATA[<p>@Peter: thanks for your comments.  I totally agree with your opinion that the distinction between accidental and essential difficulties is a function of time.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Buu Nguyen</title>
		<link>http://www.buunguyen.net/blog/is-it-worth-separating-essential-and-accidental-difficulties-of-software-development.html#comment-1469</link>
		<dc:creator>Buu Nguyen</dc:creator>
		<pubDate>Tue, 03 Apr 2007 13:55:58 +0000</pubDate>
		<guid isPermaLink="false">http://www.buunguyen.net/blog/is-it-worth-separating-essential-and-accidental-difficulties-of-software-development.html#comment-1469</guid>
		<description>@Jon: thanks a lot for your comments
&lt;blockquote&gt;...either McConnell is wrong or just misunderstood as a result of being taken out of context...&lt;/blockquote&gt;
I'll respond to this in a below paragraph...

&lt;blockquote&gt;The whole point of the accidental/essential difficulty idea is that you canâ€™t really make tools/programming languages/etc. that let the programmer avoid essential difficulty&lt;/blockquote&gt;
I don't think so, nor do I think Brooks thought so, since he wrote the following paragraph, in response to a 1990 paper of Brad Cox, in "No Silver Bullet - Refired"
&lt;blockquote&gt;
He (and others) read "NSB" as asserting that there is no hope of attacking the essential difficulties of software building. That was not my intent. Crafting the conceptual construct does indeed have as inherent difficulties complexity, conformity, changeability, and invisibility. The troubles caused by each of these difficulties can, however, be ameliorated.
&lt;/blockquote&gt;
In the same paper, Brooks also mentioned that reusability is an attacker of the essential difficulties.  I can infer from it that if a language makes it easier to create reusability components, it is attacking the essence.

&lt;blockquote&gt;
If you look at the examples he gives, they all have to do with removing as much accidental difficulty as possible (window environment constraints, low-level machine operations, etc.).&lt;/blockquote&gt;
I can understand your point.  I should have added another paragraph, right after the last sentence in Steve's quote since I think that would make his point more obvious to us.  
&lt;blockquote&gt;
&lt;i&gt;[...continued to Steve McConnell's quote in the blog entry...]&lt;/i&gt;
Tools that do not strike at the conceptual essence, the hard part of programming, don't help as much. A programming editor helps only a little because it allows you to type in code faster; it's handy, but it doesn't strike at the essence of what makes software development difficult. The same is true for source-code control tools, debuggers, execution profilers, automated testing tools, and so on; those tools provide only incremental productivity gains for the same reason.
&lt;/blockquote&gt;
I think it should be clear by now that Steve was really making a compare and contrast between things attacking the essential (high-level languages) and things attacking the accidental (editors, automated testing tools etc.)

&lt;blockquote&gt;
I do think that the difference between accidental and essential difficulties is important, because programmers should focus as much of their attention as possible on solutions for the essential difficulties, and apply other tools and languages which help them ignore the accidental difficulty
&lt;/blockquote&gt;
This does not seem to me as a good argument.  I use a tool, a language, or a methodology because it addresses a pain that I have, and I do not see me or anybody I know consider whether those things tackling the essential or accidental difficulties, or why we need to care about that.</description>
		<content:encoded><![CDATA[<p>@Jon: thanks a lot for your comments</p>
<blockquote><p>&#8230;either McConnell is wrong or just misunderstood as a result of being taken out of context&#8230;</p></blockquote>
<p>I&#8217;ll respond to this in a below paragraph&#8230;</p>
<blockquote><p>The whole point of the accidental/essential difficulty idea is that you canâ€™t really make tools/programming languages/etc. that let the programmer avoid essential difficulty</p></blockquote>
<p>I don&#8217;t think so, nor do I think Brooks thought so, since he wrote the following paragraph, in response to a 1990 paper of Brad Cox, in &#8220;No Silver Bullet - Refired&#8221;</p>
<blockquote><p>
He (and others) read &#8220;NSB&#8221; as asserting that there is no hope of attacking the essential difficulties of software building. That was not my intent. Crafting the conceptual construct does indeed have as inherent difficulties complexity, conformity, changeability, and invisibility. The troubles caused by each of these difficulties can, however, be ameliorated.
</p></blockquote>
<p>In the same paper, Brooks also mentioned that reusability is an attacker of the essential difficulties.  I can infer from it that if a language makes it easier to create reusability components, it is attacking the essence.</p>
<blockquote><p>
If you look at the examples he gives, they all have to do with removing as much accidental difficulty as possible (window environment constraints, low-level machine operations, etc.).</p></blockquote>
<p>I can understand your point.  I should have added another paragraph, right after the last sentence in Steve&#8217;s quote since I think that would make his point more obvious to us.  </p>
<blockquote><p>
<i>[...continued to Steve McConnell's quote in the blog entry...]</i><br />
Tools that do not strike at the conceptual essence, the hard part of programming, don&#8217;t help as much. A programming editor helps only a little because it allows you to type in code faster; it&#8217;s handy, but it doesn&#8217;t strike at the essence of what makes software development difficult. The same is true for source-code control tools, debuggers, execution profilers, automated testing tools, and so on; those tools provide only incremental productivity gains for the same reason.
</p></blockquote>
<p>I think it should be clear by now that Steve was really making a compare and contrast between things attacking the essential (high-level languages) and things attacking the accidental (editors, automated testing tools etc.)</p>
<blockquote><p>
I do think that the difference between accidental and essential difficulties is important, because programmers should focus as much of their attention as possible on solutions for the essential difficulties, and apply other tools and languages which help them ignore the accidental difficulty
</p></blockquote>
<p>This does not seem to me as a good argument.  I use a tool, a language, or a methodology because it addresses a pain that I have, and I do not see me or anybody I know consider whether those things tackling the essential or accidental difficulties, or why we need to care about that.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Peter Bell</title>
		<link>http://www.buunguyen.net/blog/is-it-worth-separating-essential-and-accidental-difficulties-of-software-development.html#comment-1438</link>
		<dc:creator>Peter Bell</dc:creator>
		<pubDate>Mon, 02 Apr 2007 20:06:42 +0000</pubDate>
		<guid isPermaLink="false">http://www.buunguyen.net/blog/is-it-worth-separating-essential-and-accidental-difficulties-of-software-development.html#comment-1438</guid>
		<description>My take on this has always been that the distinction between accidental and essential difficulties is a function of time. I am sure there would have been times when people would have argued that garbage collection and a bunch of other things we take for granted were essentially difficult. I am not convinced that essential difficulties exist. For example, for a class of programming problems, an expert system may well be able to be developed to automate the entire programming process.</description>
		<content:encoded><![CDATA[<p>My take on this has always been that the distinction between accidental and essential difficulties is a function of time. I am sure there would have been times when people would have argued that garbage collection and a bunch of other things we take for granted were essentially difficult. I am not convinced that essential difficulties exist. For example, for a class of programming problems, an expert system may well be able to be developed to automate the entire programming process.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Jon</title>
		<link>http://www.buunguyen.net/blog/is-it-worth-separating-essential-and-accidental-difficulties-of-software-development.html#comment-1416</link>
		<dc:creator>Jon</dc:creator>
		<pubDate>Mon, 02 Apr 2007 14:26:34 +0000</pubDate>
		<guid isPermaLink="false">http://www.buunguyen.net/blog/is-it-worth-separating-essential-and-accidental-difficulties-of-software-development.html#comment-1416</guid>
		<description>From what I can tell from reading this, I'd have to say either McConnell is wrong or just misunderstood as a result of being taken out of context. The whole point of the accidental/essential difficulty idea is that you can't really make tools/programming languages/etc. that let the programmer avoid essential difficulty. The essential difficulty is the core of the problem, and therefore it is the part that the programmer needs to work on.

Honestly, I think both McConnell and Brooks are trying to say the same thing in two different ways. The problem is just that McConnell talks about "striking at the conceptual essence" when, from what I can tell, he really means "eliminating any accidental difficulties of the problem". If you look at the examples he gives, they all have to do with removing as much accidental difficulty as possible (window environment constraints, low-level machine operations, etc.). So I think he's really contrasting more tools which only remove some of the accidental difficulty (say, assembly language instead of machine code), and those which remove a large amount of accidental complexity (high-level languages instead of machine code).

Finally, yes, I do think that the difference between accidental and essential difficulties is important, because programmers should focus as much of their attention as possible on solutions for the essential difficulties, and apply other tools and languages which help them ignore the accidental difficulty.</description>
		<content:encoded><![CDATA[<p>From what I can tell from reading this, I&#8217;d have to say either McConnell is wrong or just misunderstood as a result of being taken out of context. The whole point of the accidental/essential difficulty idea is that you can&#8217;t really make tools/programming languages/etc. that let the programmer avoid essential difficulty. The essential difficulty is the core of the problem, and therefore it is the part that the programmer needs to work on.</p>
<p>Honestly, I think both McConnell and Brooks are trying to say the same thing in two different ways. The problem is just that McConnell talks about &#8220;striking at the conceptual essence&#8221; when, from what I can tell, he really means &#8220;eliminating any accidental difficulties of the problem&#8221;. If you look at the examples he gives, they all have to do with removing as much accidental difficulty as possible (window environment constraints, low-level machine operations, etc.). So I think he&#8217;s really contrasting more tools which only remove some of the accidental difficulty (say, assembly language instead of machine code), and those which remove a large amount of accidental complexity (high-level languages instead of machine code).</p>
<p>Finally, yes, I do think that the difference between accidental and essential difficulties is important, because programmers should focus as much of their attention as possible on solutions for the essential difficulties, and apply other tools and languages which help them ignore the accidental difficulty.</p>
]]></content:encoded>
	</item>
</channel>
</rss>
