<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" version="2.0">
<channel>
	<title>Comments for My2Cents</title>
	
	<link>http://my2cents.safecodellc.net</link>
	<description>While Versions of Software Danced in my Head...</description>
	<lastBuildDate>Fri, 06 Aug 2010 16:12:00 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
	<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/safecode/my2cents/comments" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="safecode/my2cents/comments" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Comment on Structs in Wonderland by Max H</title>
		<link>http://my2cents.safecodellc.net/2010/07/19/structs-in-wonderland/comment-page-1/#comment-14</link>
		<dc:creator>Max H</dc:creator>
		<pubDate>Fri, 06 Aug 2010 16:12:00 +0000</pubDate>
		<guid isPermaLink="false">http://my2cents.safecodellc.net/?p=365#comment-14</guid>
		<description>The article was updated today to reflect the information in the above comment.  This was done because I have seen comments by readers on LinkedIn were who not cognizant of the new information.  I hope the changes will eliminate some of the confusion.  

My update covered the two paragraphs that immediately followed the last line of sample code.  The original text of these paragraphs was as follows:
&lt;blockquote&gt;Now there are two issues that should be emphasized about the above examples.  First, the copy semantics of structs exclude any array members, so the member &lt;em&gt;a&lt;/em&gt; will not be initialized or modified in any of the examples except the first two.  Second, the last example is very inefficient since, disregarding any possible optimizations, &lt;em&gt;gee&lt;/em&gt; will first be copied to the parameter, then to the result, then to &lt;em&gt;golly&lt;/em&gt;.


Though I am now sure that the code I was seeing is legal; given the inefficiencies of copying structures and the large number of structs being set, I believe the originators of the application I'm dealing with would have significantly improved performance by using a pass-by-reference (pointer) strategy.  While I have worked with structures in countless programs, I tend not to do direct struct-to-struct assignments, preferring to use memcpy.  The latter works whether the struct contains member arrays or not, so treatment can be consistent throughout and across applications.  &lt;/blockquote&gt;

While I am grateful for Derek Jones response, and I accept his interpretation as authoritative with respect to the intent of the standard, my own experience and articles/advice I've seen from other developers leads me to believe that at least some embedded compiler vendors shared my original interpretation; so I recommend that you tread carefully if you decide to use struct-to-struct copy with array members.  Run a few quick tests to make sure the implementation performs as you expect it to.

As I side-note, I was very impressed with the Coccinelle tool that Mr. Jones mentioned.  I am quite sure I will be able to make use of it; and perhaps I'll give it a review here then.  In the meantime, it looks amazingly useful for anyone who is maintaining or updating a large code base, either for use in review or bulk-update.</description>
		<content:encoded><![CDATA[<p>The article was updated today to reflect the information in the above comment.  This was done because I have seen comments by readers on LinkedIn were who not cognizant of the new information.  I hope the changes will eliminate some of the confusion.  </p>
<p>My update covered the two paragraphs that immediately followed the last line of sample code.  The original text of these paragraphs was as follows:</p>
<blockquote><p>Now there are two issues that should be emphasized about the above examples.  First, the copy semantics of structs exclude any array members, so the member <em>a</em> will not be initialized or modified in any of the examples except the first two.  Second, the last example is very inefficient since, disregarding any possible optimizations, <em>gee</em> will first be copied to the parameter, then to the result, then to <em>golly</em>.</p>
<p>Though I am now sure that the code I was seeing is legal; given the inefficiencies of copying structures and the large number of structs being set, I believe the originators of the application I&#8217;m dealing with would have significantly improved performance by using a pass-by-reference (pointer) strategy.  While I have worked with structures in countless programs, I tend not to do direct struct-to-struct assignments, preferring to use memcpy.  The latter works whether the struct contains member arrays or not, so treatment can be consistent throughout and across applications.  </p></blockquote>
<p>While I am grateful for Derek Jones response, and I accept his interpretation as authoritative with respect to the intent of the standard, my own experience and articles/advice I&#8217;ve seen from other developers leads me to believe that at least some embedded compiler vendors shared my original interpretation; so I recommend that you tread carefully if you decide to use struct-to-struct copy with array members.  Run a few quick tests to make sure the implementation performs as you expect it to.</p>
<p>As I side-note, I was very impressed with the Coccinelle tool that Mr. Jones mentioned.  I am quite sure I will be able to make use of it; and perhaps I&#8217;ll give it a review here then.  In the meantime, it looks amazingly useful for anyone who is maintaining or updating a large code base, either for use in review or bulk-update.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Structs in Wonderland by Max H</title>
		<link>http://my2cents.safecodellc.net/2010/07/19/structs-in-wonderland/comment-page-1/#comment-12</link>
		<dc:creator>Max H</dc:creator>
		<pubDate>Tue, 27 Jul 2010 22:59:15 +0000</pubDate>
		<guid isPermaLink="false">http://my2cents.safecodellc.net/?p=365#comment-12</guid>
		<description>Because I was not sure of my interpretation, I contacted Mr. Derek Jones, a member of the C standards committee, and author of "The New C Standard" (linked in my previous comment); and asked him to provide feedback on the article.  His response follows:

&lt;blockquote&gt;
All named members of a structure are required to be copied by a
conforming implementation, including arrays.
The only places where implementations may vary is in the handling
of any padding between named members, they are not required to
copy this.
See sentence 1298.

I can see how you might connect 6.5.16.1 and footnote 42 to think
that members having an array type would not be copied.  The reason
that arrays cannot be copied is that they degenerate to pointers to
their first element, loosing all 'arrayness' information in the process.

Unless the struct is very small it is much more efficient to pass its
address.  Of course this usage requires that the called function does
not modify the contents of the struct.

As s1298 struct assignment can be more efficient than using memcpy (gcc
does do fancy things to figure out alignment of the objects passed to
memcpy). Member by member copy can be more efficient for low numbers
of members because it has no loop overhead.

If you are making lots of very similar changes to C source you might be
interested in using Coccinelle:
http://shape-of-code.coding-guidelines.com/2009/01/08/semantic-pattern-matching-coccinelle/

You are welcome to copy-and-paste this to the comment section of your blog.

-- 
Derek M. Jones                         tel: +44 (0) 1252 520 667
Knowledge Software Ltd                 mailto:derek@knosof.co.uk
Source code analysis                   http://www.knosof.co.uk
&lt;/blockquote&gt;

Thank you Mr. Jones for your kind and prompt response.</description>
		<content:encoded><![CDATA[<p>Because I was not sure of my interpretation, I contacted Mr. Derek Jones, a member of the C standards committee, and author of &#8220;The New C Standard&#8221; (linked in my previous comment); and asked him to provide feedback on the article.  His response follows:</p>
<blockquote><p>
All named members of a structure are required to be copied by a<br />
conforming implementation, including arrays.<br />
The only places where implementations may vary is in the handling<br />
of any padding between named members, they are not required to<br />
copy this.<br />
See sentence 1298.</p>
<p>I can see how you might connect 6.5.16.1 and footnote 42 to think<br />
that members having an array type would not be copied.  The reason<br />
that arrays cannot be copied is that they degenerate to pointers to<br />
their first element, loosing all &#8216;arrayness&#8217; information in the process.</p>
<p>Unless the struct is very small it is much more efficient to pass its<br />
address.  Of course this usage requires that the called function does<br />
not modify the contents of the struct.</p>
<p>As s1298 struct assignment can be more efficient than using memcpy (gcc<br />
does do fancy things to figure out alignment of the objects passed to<br />
memcpy). Member by member copy can be more efficient for low numbers<br />
of members because it has no loop overhead.</p>
<p>If you are making lots of very similar changes to C source you might be<br />
interested in using Coccinelle:<br />
<a href="http://shape-of-code.coding-guidelines.com/2009/01/08/semantic-pattern-matching-coccinelle/" rel="nofollow">http://shape-of-code.coding-guidelines.com/2009/01/08/semantic-pattern-matching-coccinelle/</a></p>
<p>You are welcome to copy-and-paste this to the comment section of your blog.</p>
<p>&#8211;<br />
Derek M. Jones                         tel: +44 (0) 1252 520 667<br />
Knowledge Software Ltd                 mailto:derek@knosof.co.uk<br />
Source code analysis                   <a href="http://www.knosof.co.uk" rel="nofollow">http://www.knosof.co.uk</a>
</p></blockquote>
<p>Thank you Mr. Jones for your kind and prompt response.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Structs in Wonderland by Max H</title>
		<link>http://my2cents.safecodellc.net/2010/07/19/structs-in-wonderland/comment-page-1/#comment-11</link>
		<dc:creator>Max H</dc:creator>
		<pubDate>Sat, 24 Jul 2010 04:43:23 +0000</pubDate>
		<guid isPermaLink="false">http://my2cents.safecodellc.net/?p=365#comment-11</guid>
		<description>A reader on LinkedIn posed the following question:

&lt;blockquote&gt;
I do not know the standards well, so could you direct me to where in they state that the copy semantics of structs exclude any array members. This seems inherently wrong not to copy all member of the structure. It could also take a alot more instructions, depending on how many array intermixed in the structure, to do a selective copy than just copy the whole structure.
&lt;/blockquote&gt;

As I said, these are my interpretations of the standard.  In reviewing the materials to respond to your question, I found that I had misread one section, and failed to consider the technical corrigenda.  I also dug a bit deeper by looking at &lt;a href="http://www.knosof.co.uk/cbook/cbook.html" target="_blank" rel="nofollow"&gt;"The New C Standard"&lt;/a&gt;, by Derek M. Jones.  I now believe that a more correct interpretation is that the copying of array members in structs is implementation optional.

The rule in question is not explicitly stated anywhere that I can find, and I am not entirely confident that my interpretation is correct.  
Nonetheless here are the areas that lead me to this conclusion:
&lt;ul&gt;
&lt;li&gt;Section 6.5.16.1  Makes no provision for an assignment to an array. (i.e. direct array-to-array copy is not supported).&lt;/li&gt;
&lt;li&gt;Footnote 42 to Section 6.2.6.1 par 6 indicates that a structure assignment may be copied via a memcpy or via element-by-element copy.  If the latter is used, I would expect it to be via the rules of the previously mentioned section.&lt;/li&gt;
&lt;li&gt;Section 6.7.2.1, was heavily ammended by TC2.  According to the new paragraph 22, which is discussing flexible array members, it indicates that the portions of the flexible array member which reside within the structure size may either be copied or overwritten by arbitrary data.  While this is a specific case, the treatment seems consistent with my interpretation.&lt;/li&gt;
&lt;/ul&gt;
By the way, inefficient or not, the compiler implementation I am dealing with is performing the member-by-member copy of structs.</description>
		<content:encoded><![CDATA[<p>A reader on LinkedIn posed the following question:</p>
<blockquote><p>
I do not know the standards well, so could you direct me to where in they state that the copy semantics of structs exclude any array members. This seems inherently wrong not to copy all member of the structure. It could also take a alot more instructions, depending on how many array intermixed in the structure, to do a selective copy than just copy the whole structure.
</p></blockquote>
<p>As I said, these are my interpretations of the standard.  In reviewing the materials to respond to your question, I found that I had misread one section, and failed to consider the technical corrigenda.  I also dug a bit deeper by looking at <a href="http://www.knosof.co.uk/cbook/cbook.html" target="_blank" rel="nofollow">&#8220;The New C Standard&#8221;</a>, by Derek M. Jones.  I now believe that a more correct interpretation is that the copying of array members in structs is implementation optional.</p>
<p>The rule in question is not explicitly stated anywhere that I can find, and I am not entirely confident that my interpretation is correct.<br />
Nonetheless here are the areas that lead me to this conclusion:</p>
<ul>
<li>Section 6.5.16.1  Makes no provision for an assignment to an array. (i.e. direct array-to-array copy is not supported).</li>
<li>Footnote 42 to Section 6.2.6.1 par 6 indicates that a structure assignment may be copied via a memcpy or via element-by-element copy.  If the latter is used, I would expect it to be via the rules of the previously mentioned section.</li>
<li>Section 6.7.2.1, was heavily ammended by TC2.  According to the new paragraph 22, which is discussing flexible array members, it indicates that the portions of the flexible array member which reside within the structure size may either be copied or overwritten by arbitrary data.  While this is a specific case, the treatment seems consistent with my interpretation.</li>
</ul>
<p>By the way, inefficient or not, the compiler implementation I am dealing with is performing the member-by-member copy of structs.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Slicing with Dijkstra by Max H</title>
		<link>http://my2cents.safecodellc.net/2010/06/20/slicing-with-dijkstra/comment-page-1/#comment-9</link>
		<dc:creator>Max H</dc:creator>
		<pubDate>Tue, 22 Jun 2010 04:06:27 +0000</pubDate>
		<guid isPermaLink="false">http://s328149455.onlinehome.us/my2cents/?p=187#comment-9</guid>
		<description>This article was shared to several groups on LinkedIn.  There have been a few suggestions that various automated analysis tools could have done the job as well. I disagree. Klocwork and Polyspace are two that were specifically mentioned.  Below is a copy of my reply to the suggestion that Polyspace could have done the job:

&lt;blockquote&gt;&lt;em&gt;The purpose of the article was to share a powerful technique for manual static analysis.&lt;/em&gt;  Actually I work with a number of automated analysis tools. I am very familiar with Polyspace. I have trained people in its use, and I have sold it into client sites.  It was one of the static analyzers used on this code, and it did not and could not find the issue; and we could not find a modeling technique that would permit us to find it.  The capabilities of the tool are a bit stronger now than they were then, but even in the best case Polyspace would have required extensive setup, code annotation, and modeling.  Polyspace also had some issues in how it dealt with bitfield values and bitwise operators in C.  I don't believe that any automated analysis tool in existence could have done this job.  The viable options were formal methods, simulation, and manual analysis.   Formal methods suffers from fidelity issues, and simulation was done in parallel by three of the original developers using Matlab.  The simulation team also found the issue at about the same time the analysis did, but they had a two or three day head-start.

It is not true that Polyspace creates all possible test cases.  It uses abstract interpretation to mathematically try all possible values for a variable value at every point in the program.  In many cases it also tries values that are not possible, and values that are not possible in combination.  This makes it valuable for detecting semantic errors, but without extensive modeling it generates many false positives and while it detects where exceptions might potentially be thrown; it is fairly useless for determining correct decision making in code not specifically written to take advantage of its analysis strengths.   Setting up for a Polyspace analysis of a substantial program can take a great deal of time; and if I recall correctly, the run time of the Polyspace analysis on that application was actually longer than the time I took for my manual analysis; and we had to run several times as we modeled to reduce false positives.  We had the fastest Polyspace server configuration available at the time.&lt;/blockquote&gt;

</description>
		<content:encoded><![CDATA[<p>This article was shared to several groups on LinkedIn.  There have been a few suggestions that various automated analysis tools could have done the job as well. I disagree. <a href="http://www.klocwork.com/" target="_blank">Klocwork</a> and <a href="http://www.mathworks.com/products/polyspace/">PolySpace</a> are two that were specifically mentioned.  Below is a copy of my reply to the suggestion that <a href="http://www.mathworks.com/products/polyspace/">PolySpace</a> could have done the job:</p>
<blockquote><p><em>The purpose of the article was to share a powerful technique for manual static analysis.</em>  Actually I work with a number of automated analysis tools. I am very familiar with <a href="http://www.mathworks.com/products/polyspace/">PolySpace</a>. I have trained people in its use, and I have sold it into client sites.  It was one of the static analyzers used on this code, and it did not and could not find the issue; and we could not find a modeling technique that would permit us to find it.  The capabilities of the tool are a bit stronger now than they were then, but even in the best case <a href="http://www.mathworks.com/products/polyspace/">PolySpace</a> would have required extensive setup, code annotation, and modeling.  <a href="http://www.mathworks.com/products/polyspace/">PolySpace</a> also had some issues in how it dealt with bitfield values and bitwise operators in C.  I don&#8217;t believe that any automated analysis tool in existence could have done this job.  The viable options were formal methods, simulation, and manual analysis.   Formal methods suffers from fidelity issues, and simulation was done in parallel by three of the original developers using <a href="http://www.mathworks.com/products/matlab/">MATLAB</a>.  The simulation team also found the issue at about the same time the analysis did, but they had a two or three day head-start.</p>
<p>It is not true that <a href="http://www.mathworks.com/products/polyspace/">PolySpace</a> creates all possible test cases.  It uses <a href="http://en.wikipedia.org/wiki/Abstract_interpretation">abstract interpretation</a> to mathematically try all possible values for a variable value at every point in the program.  In many cases it also tries values that are not possible, and values that are not possible in combination.  This makes it valuable for detecting semantic errors, but without extensive modeling it generates many false positives and while it detects where exceptions might potentially be thrown; it is fairly useless for determining correct decision making in code not specifically written to take advantage of its analysis strengths.   Setting up for a <a href="http://www.mathworks.com/products/polyspace/">PolySpace</a> analysis of a substantial program can take a great deal of time; and if I recall correctly, the run time of the <a href="http://www.mathworks.com/products/polyspace/">PolySpace</a> analysis on that application was actually longer than the time I took for my manual analysis; and we had to run several times as we modeled to reduce false positives.  We had the fastest <a href="http://www.mathworks.com/products/polyspace/">PolySpace</a> server configuration available at the time.</p></blockquote>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on The OOTiA Handbook: In Search of Safer OO by Max H</title>
		<link>http://my2cents.safecodellc.net/2010/05/25/ootia-handbook/comment-page-1/#comment-8</link>
		<dc:creator>Max H</dc:creator>
		<pubDate>Sat, 05 Jun 2010 05:48:55 +0000</pubDate>
		<guid isPermaLink="false">http://s328149455.onlinehome.us/my2cents/?p=195#comment-8</guid>
		<description>Thanks.  I read Jim's comment, as well as several others alluding to the obsolescence of the OOTiA.  While I am inclined to agree that the reading is dry, and not a complete guide for safety in OO; I would not agree that it is obsolete.  In my view, obsolete means that either the information is no longer correct (which is not true), or that it has been replaced by something better (which it has not... yet).  The OO annex to DO-178C is not yet official, and it is not a generally available document.  There is much valuable information contained in the OOTiA, and most is still not generally known to OO developers.</description>
		<content:encoded><![CDATA[<p>Thanks.  I read Jim&#8217;s comment, as well as several others alluding to the obsolescence of the <a href="http://www.faa.gov/aircraft/air_cert/design_approvals/air_software/oot/" target="_blank">OOTiA</a>.  While I am inclined to agree that the reading is dry, and not a complete guide for safety in OO; I would not agree that it is obsolete.  In my view, obsolete means that either the information is no longer correct (which is not true), or that it has been replaced by something better (which it has not&#8230; yet).  The OO annex to DO-178C is not yet official, and it is not a generally available document.  There is much valuable information contained in the <a href="http://www.faa.gov/aircraft/air_cert/design_approvals/air_software/oot/" target="_blank">OOTiA</a>, and most is still not generally known to OO developers.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on The OOTiA Handbook: In Search of Safer OO by hbonnin</title>
		<link>http://my2cents.safecodellc.net/2010/05/25/ootia-handbook/comment-page-1/#comment-7</link>
		<dc:creator>hbonnin</dc:creator>
		<pubDate>Thu, 27 May 2010 08:39:36 +0000</pubDate>
		<guid isPermaLink="false">http://s328149455.onlinehome.us/my2cents/?p=195#comment-7</guid>
		<description>Please consult Jim Chelini comment on LinkedIn (http://tinyurl.com/2wuzg3j), about obsolescence of OOTiA Handbook, and on next issue of RTCA/EUROCAE DO178-C/ED12-C. This standard will contain an OOT Supplement, addressing the Object Oriented Technologies issues with adavantages of 1) beeing  a consensus bw Authorities and Industry 2) beeing an accepted means of compliance for avionics regulation 3) beeing up to date regarding technologies. It will be pusblished in early 2011.</description>
		<content:encoded><![CDATA[<p>Please consult Jim Chelini comment on LinkedIn (<a href="http://tinyurl.com/2wuzg3j" rel="nofollow">http://tinyurl.com/2wuzg3j</a>), about obsolescence of <a href="http://www.faa.gov/aircraft/air_cert/design_approvals/air_software/oot/" target="_blank">OOTiA</a> Handbook, and on next issue of RTCA/EUROCAE DO178-C/ED12-C. This standard will contain an OOT Supplement, addressing the Object Oriented Technologies issues with adavantages of 1) beeing  a consensus bw Authorities and Industry 2) beeing an accepted means of compliance for avionics regulation 3) beeing up to date regarding technologies. It will be pusblished in early 2011.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Sessions on Architectural Complexity by Tweets that mention Sessions on Architectural Complexity | My2Cents -- Topsy.com</title>
		<link>http://my2cents.safecodellc.net/2010/05/20/sessions-on-architectural-complexity/comment-page-1/#comment-6</link>
		<dc:creator>Tweets that mention Sessions on Architectural Complexity | My2Cents -- Topsy.com</dc:creator>
		<pubDate>Tue, 25 May 2010 08:10:36 +0000</pubDate>
		<guid isPermaLink="false">http://my2cents.safecodellc.net/?p=266#comment-6</guid>
		<description>[...] This post was mentioned on Twitter by SaileshKrishnamurthy and Roger Sessions, Roger Sessions. Roger Sessions said: Max Hinkley criticizes my recent talk at IASA Minnesota! The nerve! And I respond: http://bit.ly/cjyFTN [...]</description>
		<content:encoded><![CDATA[<p>[...] This post was mentioned on Twitter by SaileshKrishnamurthy and Roger Sessions, Roger Sessions. Roger Sessions said: Max Hinkley criticizes my recent talk at <a href="http://iasahome.org">IASA</a> Minnesota! The nerve! And I respond: <a href="http://bit.ly/cjyFTN" rel="nofollow">http://bit.ly/cjyFTN</a> [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Sessions on Architectural Complexity by Max H</title>
		<link>http://my2cents.safecodellc.net/2010/05/20/sessions-on-architectural-complexity/comment-page-1/#comment-5</link>
		<dc:creator>Max H</dc:creator>
		<pubDate>Mon, 24 May 2010 23:04:57 +0000</pubDate>
		<guid isPermaLink="false">http://my2cents.safecodellc.net/?p=266#comment-5</guid>
		<description>Thanks for your response, Roger.  

As I said, our professional practices are in vastly different arenas, and I would expect our perspectives to be very different. I also must apologize that I mixed some of what was offered in the presentation with items from the whitepaper; and I suspect that contributed to some misunderstandings on my part.  I did not have the benefit of the presentation slides to re-visit some of the presentation topics, so I used the whitepaper as a poor substitute.

It appears that at least part of our disagreement is due to terminology.  I was reacting in part to terminology I heard during your presentation; some of which may have been raised in addressing audience questions.  Your papers do a good job of clarifying your position on some of these issues.  For example, Part 1 of your SIP briefing states: "SIP is not intended to replace existing enterprise architecture methodologies. It is intended to provide a meta-methodology on top of them."  If that was stated in the meeting, I missed it.

The "business requirements" statement was again, in response to what I recall being said in the presentation. You opened the presentation with a statement about the contribution of moving requirements to the cost of projects. This lead me to believe that you were in some way addressing that issue.  The term "business requirement" was used at least a few times, apparently in reference to the business functions; and this lead to some confusion. 

As to my assertion about multiple database systems, this answered a response you gave to an audience question. You stated that the various subsystems could be contracted to different vendors, and that if they shared a common underlying database system, that would be coincidental. I also spoke with at least a few audience members who had trouble with that idea; as well as each sub-project having to originate duplicative "plumbing code".  These were probably the two biggest objections to the whole concept. If your claim is that EVERY partition, can and/or should be outsourced to a unique development group, that's where I think the method falls down.

As to simplification, I don't know what common practice is, but I don't consider it to be only with code. Design simplification typically yields much greater benefit than code simplification. I spend a great deal of effort ensuring that the architecture is as simple as I can get it.  I will suggest again that this has been a best practice for decades.  This is exemplified by the following passage from "The Practical Guide to Structured Systems Design, 2nd ed.", 1988 (Mielir Page-Jones):  &lt;quote&gt;"Reducing the coupling between modules means, in effect, reducing the complexity of the connection(s) between the modules as much as possible.  To paraphrase Einstein, we seek to make such connections as simple as the application will allow, and no simpler."&lt;/quote&gt;  In the chapter on cohesion, the book goes on to say: &lt;quote&gt;"Cohesion is the measure of the strength of functional relatedness of elements within a module."&lt;/quote&gt;; similar information about reducing design complexity has been present in every design book I've ever bothered to look at. Unfortunately, I suspect that your perspective may be correct, that design level simplification may not be done as it should be in general practice.

I disagree with your assessment that there is a correlation between re-use and complexity. My experience indicates that the biggest barrier to re-use is the lack of effective repositories and indexing tools. Methods such as Shlaer-Mellor and MDA encourage coarse code re-use at the domain (architectural element) level; and that has seen success in some companies, but few are willing to share details of their gains. On the other hand, I think code sharing among cooperating subsystems is very common practice, and tends to lead to better designs. It sounds as if we are in agreement on this; but my argument was that your approach seems to discount the potential value.

As you've made your claims explicit, I'd like to address them directly;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;"Synergistic partitioning is based on the mathematics of partitions. No other IT methodology is based on a mathematical foundation."&lt;/em&gt;

ALL of IT is based on mathematical foundations, from relational database theory to language semantics; and there have been other numerous attempts to apply a mathematical approach to software development (for example, see &lt;a href="ftp://ftp.cse.msu.edu/pub/serg/requirements/icsp5.ps.gz" rel="nofollow"&gt;this 1998 paper&lt;/a&gt;).  Still, we tend to take an informal approach to all levels of software development.

In safety-critical domains there is a well known methodology to verification, called "Formal Methods" by which you can prove many of the operational and safety aspects of software mathematically with lower costs and greater efficacy than testing; yet organizations don't do it because they perceive the formalism and discipline required as a productivity hindrance, rather seeing the benefit of reduced testing.  I think that development methodologies tend to be informal because formal algorithmic approaches don't get adopted. The advantage that your approach appears to have is that it yields some reasonably good partitions with relatively small effort. This improves the chance of adoption.&lt;/li&gt;

&lt;li&gt; &lt;em&gt;"Synergistic partitioning drives a unique solution. For a given universe of functionality, there is only one possible solution. No other IT methodology has a unique solution."&lt;/em&gt;

I am inclined to accept this claim at face value, though I suspect that differences may arise due to how and to what level of detail the business functions are elaborated; and perhaps also due to assumptions and pre-conceptions about the architecture.&lt;/li&gt;

&lt;li&gt;&lt;em&gt;"The resulting partition is the simplest possible partition. There is no other approach that can discover a better configuration."&lt;/em&gt;

It may be unique, and functional cohesion and communications coupling are certainly large factors; but I am still skeptical that this unique solution is necessarily an optimal one. I don't disagree with the partitioning as a useful tool, but I'm not as certain that for the universe of all possible projects, the partitions provided are neccessarily the best divisions, or that they can be always farmed out as stand-alone projects.  On the other hand, they are almost certainly excellent starting points.&lt;/li&gt;

&lt;li&gt;&lt;em&gt;"The resulting reduction in complexity can be measured and translated into actual business dollars."&lt;/em&gt;

I agree that cost variability is probably reduced; only because I've seen some absolutely attrocious designs.  That the reduction in complexity can be translated to actual business dollars is dependent on knowing how the alternative approach will address complexity.  In terms of outsourced projects, I think that your approach, applied by the customer, would reduce opportunism by vendors; even if the entire project was still given to a single vendor.&lt;/li&gt;
&lt;/ul&gt;

Since my initial post, I've had a bit more time to review your papers.  Your SIP(tm) approach certainly has some interesting and useful properties.  I will be on the lookout for opportunities to put it to the test.

There are some aspects about your approach that I really do like.  As I stated in my post, there have been attempts to quantify complexity, particularly as an aspect of difficulty.  I believe your quantification method does provide a good measure. Furthermore I believe that an algorithmic and deterministic approach to partitioning may be of benefit, particularly when pushed up to the business analysis level.

It appears to me that your method may lend itself to automation tools which can simplify the production of the top level architecture.  I can also imagine that within each partition a number of partition functions could be elaborated as a decomposition excercise; and that this would permit recursive decomposition of a more complete architecture.

Best of Luck! I look forward to seeing what the future has in store for your methodology. 

-- Max</description>
		<content:encoded><![CDATA[<p>Thanks for your response, Roger.  </p>
<p>As I said, our professional practices are in vastly different arenas, and I would expect our perspectives to be very different. I also must apologize that I mixed some of what was offered in the presentation with items from the whitepaper; and I suspect that contributed to some misunderstandings on my part.  I did not have the benefit of the presentation slides to re-visit some of the presentation topics, so I used the whitepaper as a poor substitute.</p>
<p>It appears that at least part of our disagreement is due to terminology.  I was reacting in part to terminology I heard during your presentation; some of which may have been raised in addressing audience questions.  Your papers do a good job of clarifying your position on some of these issues.  For example, Part 1 of your SIP briefing states: &#8220;SIP is not intended to replace existing enterprise architecture methodologies. It is intended to provide a meta-methodology on top of them.&#8221;  If that was stated in the meeting, I missed it.</p>
<p>The &#8220;business requirements&#8221; statement was again, in response to what I recall being said in the presentation. You opened the presentation with a statement about the contribution of moving requirements to the cost of projects. This lead me to believe that you were in some way addressing that issue.  The term &#8220;business requirement&#8221; was used at least a few times, apparently in reference to the business functions; and this lead to some confusion. </p>
<p>As to my assertion about multiple database systems, this answered a response you gave to an audience question. You stated that the various subsystems could be contracted to different vendors, and that if they shared a common underlying database system, that would be coincidental. I also spoke with at least a few audience members who had trouble with that idea; as well as each sub-project having to originate duplicative &#8220;plumbing code&#8221;.  These were probably the two biggest objections to the whole concept. If your claim is that EVERY partition, can and/or should be outsourced to a unique development group, that&#8217;s where I think the method falls down.</p>
<p>As to simplification, I don&#8217;t know what common practice is, but I don&#8217;t consider it to be only with code. Design simplification typically yields much greater benefit than code simplification. I spend a great deal of effort ensuring that the architecture is as simple as I can get it.  I will suggest again that this has been a best practice for decades.  This is exemplified by the following passage from &#8220;The Practical Guide to Structured Systems Design, 2nd ed.&#8221;, 1988 (Mielir Page-Jones):  <quote>&#8220;Reducing the coupling between modules means, in effect, reducing the complexity of the connection(s) between the modules as much as possible.  To paraphrase Einstein, we seek to make such connections as simple as the application will allow, and no simpler.&#8221;</quote>  In the chapter on cohesion, the book goes on to say: <quote>&#8220;Cohesion is the measure of the strength of functional relatedness of elements within a module.&#8221;</quote>; similar information about reducing design complexity has been present in every design book I&#8217;ve ever bothered to look at. Unfortunately, I suspect that your perspective may be correct, that design level simplification may not be done as it should be in general practice.</p>
<p>I disagree with your assessment that there is a correlation between re-use and complexity. My experience indicates that the biggest barrier to re-use is the lack of effective repositories and indexing tools. Methods such as Shlaer-Mellor and <a href="http://www.omg.org/mda/">MDA</a> encourage coarse code re-use at the domain (architectural element) level; and that has seen success in some companies, but few are willing to share details of their gains. On the other hand, I think code sharing among cooperating subsystems is very common practice, and tends to lead to better designs. It sounds as if we are in agreement on this; but my argument was that your approach seems to discount the potential value.</p>
<p>As you&#8217;ve made your claims explicit, I&#8217;d like to address them directly;</p>
<ul>
<li><em>&#8220;Synergistic partitioning is based on the mathematics of partitions. No other IT methodology is based on a mathematical foundation.&#8221;</em>
<p>ALL of IT is based on mathematical foundations, from relational database theory to language semantics; and there have been other numerous attempts to apply a mathematical approach to software development (for example, see <a href="ftp://ftp.cse.msu.edu/pub/serg/requirements/icsp5.ps.gz" rel="nofollow">this 1998 paper</a>).  Still, we tend to take an informal approach to all levels of software development.</p>
<p>In safety-critical domains there is a well known methodology to verification, called &#8220;Formal Methods&#8221; by which you can prove many of the operational and safety aspects of software mathematically with lower costs and greater efficacy than testing; yet organizations don&#8217;t do it because they perceive the formalism and discipline required as a productivity hindrance, rather seeing the benefit of reduced testing.  I think that development methodologies tend to be informal because formal algorithmic approaches don&#8217;t get adopted. The advantage that your approach appears to have is that it yields some reasonably good partitions with relatively small effort. This improves the chance of adoption.</li>
<li> <em>&#8220;Synergistic partitioning drives a unique solution. For a given universe of functionality, there is only one possible solution. No other IT methodology has a unique solution.&#8221;</em>
<p>I am inclined to accept this claim at face value, though I suspect that differences may arise due to how and to what level of detail the business functions are elaborated; and perhaps also due to assumptions and pre-conceptions about the architecture.</li>
<li><em>&#8220;The resulting partition is the simplest possible partition. There is no other approach that can discover a better configuration.&#8221;</em>
<p>It may be unique, and functional cohesion and communications coupling are certainly large factors; but I am still skeptical that this unique solution is necessarily an optimal one. I don&#8217;t disagree with the partitioning as a useful tool, but I&#8217;m not as certain that for the universe of all possible projects, the partitions provided are neccessarily the best divisions, or that they can be always farmed out as stand-alone projects.  On the other hand, they are almost certainly excellent starting points.</li>
<li><em>&#8220;The resulting reduction in complexity can be measured and translated into actual business dollars.&#8221;</em>
<p>I agree that cost variability is probably reduced; only because I&#8217;ve seen some absolutely attrocious designs.  That the reduction in complexity can be translated to actual business dollars is dependent on knowing how the alternative approach will address complexity.  In terms of outsourced projects, I think that your approach, applied by the customer, would reduce opportunism by vendors; even if the entire project was still given to a single vendor.</li>
</ul>
<p>Since my initial post, I&#8217;ve had a bit more time to review your papers.  Your SIP(tm) approach certainly has some interesting and useful properties.  I will be on the lookout for opportunities to put it to the test.</p>
<p>There are some aspects about your approach that I really do like.  As I stated in my post, there have been attempts to quantify complexity, particularly as an aspect of difficulty.  I believe your quantification method does provide a good measure. Furthermore I believe that an algorithmic and deterministic approach to partitioning may be of benefit, particularly when pushed up to the business analysis level.</p>
<p>It appears to me that your method may lend itself to automation tools which can simplify the production of the top level architecture.  I can also imagine that within each partition a number of partition functions could be elaborated as a decomposition excercise; and that this would permit recursive decomposition of a more complete architecture.</p>
<p>Best of Luck! I look forward to seeing what the future has in store for your methodology. </p>
<p>&#8211; Max</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Sessions on Architectural Complexity by Roger Sessions</title>
		<link>http://my2cents.safecodellc.net/2010/05/20/sessions-on-architectural-complexity/comment-page-1/#comment-4</link>
		<dc:creator>Roger Sessions</dc:creator>
		<pubDate>Sat, 22 May 2010 20:22:17 +0000</pubDate>
		<guid isPermaLink="false">http://my2cents.safecodellc.net/?p=266#comment-4</guid>
		<description>Thanks for blogging about my talk! You have raised some interesting points. Let me tackle them one at a time.

You say I have outlined a new approach to creating software architecture. I don't think this is right. I have outlined a new approach for partitioning projects so their complexity is minimized, thus removing the main barrier to creating good software architectures. Creating a software architecture is something that occurs much later. I would agree, though, that the process partitioning that I recommend puts some constraints on the eventual software architectures that can be created.

You say that the solutions I propose are analogous but inferior to solutions that already exist. I disagree. I haven't seen anybody proposing system simplification through partitioning of functionality through use of synergy analysis. So we can discuss whether my methods are better or worse than others, but they are clearly unique. Here are four claims I make for my methodology that I haven't heard anybody else make (and I don't believe anybody else can make):
- Synergistic partitioning is based on the mathematics of partitions. No other IT methodology is based on a mathematical foundation.
- Synergistic partitioning drives a unique solution. For a given universe of functionality, there is only one possible solution. No other IT methodology has a unique solution.
- The resulting partition is the simplest possible partition. There is no other approach that can discover a better configuration.
- The resulting reduction in complexity can be measured and translated into actual business dollars. 

You say my approach forces an organization to more closely analyze business requirements. Actually, my approach doesn't deal with business requirements at all. Only business functions. In other words, I look at what the system does, not how it does it or what specific requirements it must satisfy in doing what it does. It isn't that I don't think business requirements are important, just that they come much later, after we have partitioned the business functionality.

You say I don't decompose far enough. I disagree. I decompose exactly as far as necessary to identify the atomic business functions. And then I stop. I don't care how they will be implemented, either at the business architecture or technical architectural level. Not that these things aren't important. Just that they are a different problem than what I am addressing. And just to be sure we are on the same page, my problem is Complexity. I am assuming that once you have addressed complexity, the other problems (like business requirements) are much easier to address.

You say that a problem with my example, inter-library loans, is that we could end up with multiple database systems and that this will "increase operational and support costs for each of the using libraries." I disagree. Not only does the system I proposed have no need for multiple databases, it has no need for ANY databases. The inter-library coordinator can do its work on a simple spreadsheet or file system. The Borrower system doesn't need to store anything, it just refers to the recent catalog the coordinator sent out. And the Lender is unlikely to have its own database, it will most likely just use whatever the library is using to maintain its book collection.

You say "complexity reduction is a best practice in all forms and all levels of software development." I agree. But when we are reducing complexity in software development, we are generally talking about simplifying our code. This is quite a different issue than reducing our overall project complexity. I assume that we are trying to do the best possible implementation job. But this does nothing to address the complexity I am looking at: the complexity of how the project is organized. 

You imply that I am against code reuse. Guilty. Well, almost guilty. I believe that any attempt to reuse code must be balanced against resulting complexity. Almost all attempts to reuse code result in more complexity, and thus create more problems than they solve. By the way, the example you give of reuse is more of what I think of moving functionality into the infrastructure, which is another issue and which I endorse. 

So let me summarize where I stand. I am addressing one issue only: Complexity. I am trying to understand how to best split up a project into subprojects such that 
- the overall complexity of the subprojects is as low as possible
- the suprojects can be tackled as autonomously as possible
- there are as few dependencies as possible between the subprojects. 

That is all I am trying to do. But in doing this, you can reduce the cost of a $10M project by 50% and increase the chances of that project being successful by 100%. Which makes this effort worth undertaking, the methodology important, and the approach unique.

That's my two cents!

- Roger Sessions</description>
		<content:encoded><![CDATA[<p>Thanks for blogging about my talk! You have raised some interesting points. Let me tackle them one at a time.</p>
<p>You say I have outlined a new approach to creating software architecture. I don&#8217;t think this is right. I have outlined a new approach for partitioning projects so their complexity is minimized, thus removing the main barrier to creating good software architectures. Creating a software architecture is something that occurs much later. I would agree, though, that the process partitioning that I recommend puts some constraints on the eventual software architectures that can be created.</p>
<p>You say that the solutions I propose are analogous but inferior to solutions that already exist. I disagree. I haven&#8217;t seen anybody proposing system simplification through partitioning of functionality through use of synergy analysis. So we can discuss whether my methods are better or worse than others, but they are clearly unique. Here are four claims I make for my methodology that I haven&#8217;t heard anybody else make (and I don&#8217;t believe anybody else can make):<br />
- Synergistic partitioning is based on the mathematics of partitions. No other IT methodology is based on a mathematical foundation.<br />
- Synergistic partitioning drives a unique solution. For a given universe of functionality, there is only one possible solution. No other IT methodology has a unique solution.<br />
- The resulting partition is the simplest possible partition. There is no other approach that can discover a better configuration.<br />
- The resulting reduction in complexity can be measured and translated into actual business dollars. </p>
<p>You say my approach forces an organization to more closely analyze business requirements. Actually, my approach doesn&#8217;t deal with business requirements at all. Only business functions. In other words, I look at what the system does, not how it does it or what specific requirements it must satisfy in doing what it does. It isn&#8217;t that I don&#8217;t think business requirements are important, just that they come much later, after we have partitioned the business functionality.</p>
<p>You say I don&#8217;t decompose far enough. I disagree. I decompose exactly as far as necessary to identify the atomic business functions. And then I stop. I don&#8217;t care how they will be implemented, either at the business architecture or technical architectural level. Not that these things aren&#8217;t important. Just that they are a different problem than what I am addressing. And just to be sure we are on the same page, my problem is Complexity. I am assuming that once you have addressed complexity, the other problems (like business requirements) are much easier to address.</p>
<p>You say that a problem with my example, inter-library loans, is that we could end up with multiple database systems and that this will &#8220;increase operational and support costs for each of the using libraries.&#8221; I disagree. Not only does the system I proposed have no need for multiple databases, it has no need for ANY databases. The inter-library coordinator can do its work on a simple spreadsheet or file system. The Borrower system doesn&#8217;t need to store anything, it just refers to the recent catalog the coordinator sent out. And the Lender is unlikely to have its own database, it will most likely just use whatever the library is using to maintain its book collection.</p>
<p>You say &#8220;complexity reduction is a best practice in all forms and all levels of software development.&#8221; I agree. But when we are reducing complexity in software development, we are generally talking about simplifying our code. This is quite a different issue than reducing our overall project complexity. I assume that we are trying to do the best possible implementation job. But this does nothing to address the complexity I am looking at: the complexity of how the project is organized. </p>
<p>You imply that I am against code reuse. Guilty. Well, almost guilty. I believe that any attempt to reuse code must be balanced against resulting complexity. Almost all attempts to reuse code result in more complexity, and thus create more problems than they solve. By the way, the example you give of reuse is more of what I think of moving functionality into the infrastructure, which is another issue and which I endorse. </p>
<p>So let me summarize where I stand. I am addressing one issue only: Complexity. I am trying to understand how to best split up a project into subprojects such that<br />
- the overall complexity of the subprojects is as low as possible<br />
- the suprojects can be tackled as autonomously as possible<br />
- there are as few dependencies as possible between the subprojects. </p>
<p>That is all I am trying to do. But in doing this, you can reduce the cost of a $10M project by 50% and increase the chances of that project being successful by 100%. Which makes this effort worth undertaking, the methodology important, and the approach unique.</p>
<p>That&#8217;s my two cents!</p>
<p>- Roger Sessions</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Software Architecting .vs. Software Everything-else by Michele</title>
		<link>http://my2cents.safecodellc.net/2006/11/04/software-architecting-vs-software-everything-else/comment-page-1/#comment-3</link>
		<dc:creator>Michele</dc:creator>
		<pubDate>Tue, 12 Dec 2006 20:38:42 +0000</pubDate>
		<guid isPermaLink="false">http://www.my2cents.planetmax.net/2006/11/04/software-architecting-vs-software-everything-else/#comment-3</guid>
		<description>As a technical recruiter, I enjoyed Max’s article on the differences between a software engineer and a software architect, what variables contribute to these differences, and how they intersect.

When reviewing resumes and considering candidates, it is interesting to note that while similar experiences result in similar career progressions, not all paths end in the same destination/produce the same caliber of software professional.

Max, given your thought processes, you seem to be a great resource to have on hand. I would welcome the chance to interact more directly via e-mail or phone. Feel free to visit my Linked In profile (Michele Arndt), or contact me at michele@primestaff.com.</description>
		<content:encoded><![CDATA[<p>As a technical recruiter, I enjoyed Max’s article on the differences between a software engineer and a software architect, what variables contribute to these differences, and how they intersect.</p>
<p>When reviewing resumes and considering candidates, it is interesting to note that while similar experiences result in similar career progressions, not all paths end in the same destination/produce the same caliber of software professional.</p>
<p>Max, given your thought processes, you seem to be a great resource to have on hand. I would welcome the chance to interact more directly via e-mail or phone. Feel free to visit my Linked In profile (Michele Arndt), or contact me at <a href="mailto:michele@primestaff.com">michele@primestaff.com</a>.</p>
]]></content:encoded>
	</item>
</channel>
</rss>
