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

<channel>
	<title>Blogging about Software Development &#187; Methodologies</title>
	<atom:link href="http://www.bloggingaboutjava.org/category/general/methodologies/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bloggingaboutjava.org</link>
	<description>Blogging about Software Development</description>
	<pubDate>Wed, 03 Dec 2008 15:09:11 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.2</generator>
	<language>en</language>
			<item>
		<title>Process Acceleration</title>
		<link>http://www.bloggingaboutjava.org/2008/11/process-acceleration/</link>
		<comments>http://www.bloggingaboutjava.org/2008/11/process-acceleration/#comments</comments>
		<pubDate>Sun, 23 Nov 2008 23:46:45 +0000</pubDate>
		<dc:creator>Michel Klabbers</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[General]]></category>

		<category><![CDATA[Methodologies]]></category>

		<category><![CDATA[acceleration]]></category>

		<category><![CDATA[process]]></category>

		<guid isPermaLink="false">http://www.bloggingaboutjava.org/?p=408</guid>
		<description><![CDATA[Last thursday I visited a presentation about Process Acceleration (PA) [1]. PA is a Business Change method that also uses separation of concerns: it separates the end result from anything else in the business process. The end result of the process is the success state, i.e. all employees correctly submitted their billing forms and all [...]]]></description>
			<content:encoded><![CDATA[<p>Last thursday I visited a presentation about Process Acceleration (PA) [1]. PA is a Business Change method that also uses separation of concerns: it separates the end result from anything else in the business process. The end result of the process is the success state, i.e. all employees correctly submitted their billing forms and all team managers got a correct summary by mail. The emphasis lies primarely on getting the definition of the end result as accurate as possible.</p>
<p><span id="more-408"></span>I will try to give more insight into PA by using a more formal approach. In the section below I will use the definitions &#8220;success state&#8221; and &#8220;system&#8221; a lot. I will define these first:</p>
<blockquote><p>Success state: P_1 and P_2 and &#8230; P_N</p>
<p>P_x (1 &lt;= x &lt;= N) is a predicate, for example: P_1 == (All timesheets employees are submitted), P_2 == (All submitted timesheets are correct).</p>
<p>System: S</p>
<p>S =&gt; P_i and P_i+1 and &#8230; P_i+m and Q_j and Q_j+1 and &#8230; Q_j+n</p>
<p>where P_i and P_i+1 and &#8230; P_i+m is a subset of our success state P_1 and P_2 and &#8230; P_N</p>
<p>Q_j and Q_j+1 and &#8230; Q_j+n are additional predicates, not in our success state.</p></blockquote>
<p>Instead of system you can also read solution. A system can be an already existing system or something that can be built. To illustrate the difference between traditional strategies and the PA strategy, we will do a step by step construction towards an at first unknown success state T_success. We will start from an empty state T_empty.</p>
<blockquote><p>Traditional strategy 1:<br />
Step 1) Design new component C_1.<br />
Step 2) Check new state T_1 with customer: is this state the success state? Yes: done, No: proceed.<br />
Step 3) Design new component C_2, connect C_2 to C_1.<br />
Step 4) Check new state T_2 with customer: is this state the success state? Yes: done, No: proceed.<br />
Step 5) Design new component C_3, connect C_3 to C_2 and C_1.<br />
Step 6) Check new state T_3 with customer: is this state the success state? Yes: done, No: proceed.<br />
&#8230;</p></blockquote>
<p>The first strategy starts building new components, one at a time. After each component is finished we check if success state is reached. This is not unlike many hobby projects where you start from scratch and build a component at a time. Once you are happy with result you have reached T_success.</p>
<blockquote><p>Traditional strategy 2:<br />
Step 1) Apply systems S_q, S_q+1, &#8230; , S_q+k (short: S_q&#8217;) to T_empty.<br />
Step 2) Check new state T_k&#8217; with customer: is this state the success state? Yes: done, No: proceed.<br />
Step 3) Design new component C_1, add this component to S_q&#8217;.<br />
Step 4) Check new state T_k1&#8242; with customer: is this state the success state? Yes: done, No: proceed.<br />
Step 5) Design new component C_2, add this component to S_q+1&#8242;.<br />
Step 6) Check new state T_k2&#8242; with customer: is this state the success state? Yes: done, No: proceed.<br />
&#8230;</p></blockquote>
<p>The second strategy starts from a combination of, most likely existing, systems. We then add components one at a time. After each component we check if we have reached the success state. This is a way of building systems which is used often when adding functionality to legacy systems.</p>
<blockquote><p>Traditional strategy 3:<br />
Step A.1) Apply a permutation of systems S_q, S_q+1, &#8230; , S_q+k (short: S_q&#8217;) to T_empty.<br />
Step A.2) Check new state T_k&#8217; with customer: is this state a good enough approximation of the success state? Yes: proceed to B.1), No: proceed.<br />
Step A.3) Apply a different permutation of systems S_q, S_q+1, &#8230; , S_q+k (short: S_q1&#8242;) to T_empty.<br />
Step A.4) Check new state T_k1&#8242; with customer: is this state a good enough approximation of the success state? Yes: proceed to B.1), No: proceed.<br />
Step A.5) Apply a different permutation of systems S_q, S_q+1, &#8230; , S_q+k (short: S_q2&#8242;) to T_empty.<br />
&#8230;<br />
Step B.1) Design new component C_1, add this component to previously found near success system permutation S_q&#8221;.<br />
Step B.2) Check new state T_k1&#8221; with customer: is this state the success state? Yes: done, No: proceed.<br />
Step B.3) Design new component C_2, add this component to previously found near success system permutation S_q&#8221;.<br />
Step B.4) Check new state T_k1&#8221; with customer: is this state the success state? Yes: done, No: proceed.<br />
&#8230;</p></blockquote>
<p>The third, somewhat less traditional, starts by finding a good combination of systems. This combination should give a good approximation of the final state the customer wants to achieve. Only then you start adding new components.</p>
<blockquote><p>Classic PA strategy:<br />
Step A.1) Create a definition of T_success, called T_success&#8217;.<br />
Step A.2) Check T_success&#8217; with customer: is this state the success state? Yes: proceed to B.1), No: proceed.<br />
Step A.3) Change the definition of T_success&#8217; resulting in a new definition called T_success1&#8242;.<br />
Step A.4) Check T_success1&#8242; with customer: is this state the success state? Yes: proceed to B.1), No: proceed.<br />
&#8230;<br />
Step B.1) Directly derive definitions of components C_1, &#8230; C_u from best definition T_success&#8221;.<br />
Note that C_1, &#8230;, C_u =&gt; P_1 and P_2 and &#8230; P_N must hold.<br />
Step B.2) Match components C_1, &#8230; C_u with systems S_q, S_q+1, &#8230; , S_q+k.<br />
Step B.3) Choose best matching(s). For these matchings T_success&#8221; must be a subset of resulting state T_matching.</p></blockquote>
<p>PA first creates a state definition as close as possible to the success state. It then reviews and alters this state iteratively. Only when the definition is satisfactory the next phase starts. In this phase component definitions are derived from the success state definition. These component definitions are then matched with systems and the best matchings are chosen. Simplicity is important in PA: we always strive for a correct succes state with minimal size.</p>
<p>Note that the first two traditional strategies have no real focus on the final success state. This means that during development the chosen success state might actually be (a lot) different than the real success state. The biggest difference between the third strategy and the PA strategy is that in PA we disregard existing systems (read: solutions) until a really good success state definition has been found. Also, we extract as much information as we can from the success state definition. We then use this information to define components. Each component definition should represent a part of the success state. These component definitions should be mutually exclusive (i.e. no overlap) and all component definitions together should imply the success state. Next we match the component definitions with all known systems and come up with the best matchings. Classic PA is almost done here. We now compare the best matchings and present them, with cost figures, to the customer.</p>
<p>As mentioned earlier an important aspect of PA is the separation of the success state from any solution. This is important because of the reduced effort needed: anyone involved in the process can just think about the success state and can forget about (existing) systems. Depending on the number of systems this can be a serious advantage.</p>
<p>When there are only few solutions and the customer really doesn&#8217;t know what he or she wants, starting from an existing solution and building from that is the way to go. However, when there is one clear success state and many possible (existing) solutions PA will shine.</p>
<ul>
<li>[1]: <a title="http://www.procesacceleratie.nl/" href="http://www.procesacceleratie.nl/" target="_blank">http://www.procesacceleratie.nl/</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.bloggingaboutjava.org/2008/11/process-acceleration/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Metric Driven Software Development ?</title>
		<link>http://www.bloggingaboutjava.org/2007/11/metric-driven-software-development/</link>
		<comments>http://www.bloggingaboutjava.org/2007/11/metric-driven-software-development/#comments</comments>
		<pubDate>Wed, 28 Nov 2007 15:17:47 +0000</pubDate>
		<dc:creator>Arjen van Schie</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Java]]></category>

		<category><![CDATA[Methodologies]]></category>

		<category><![CDATA[j2se]]></category>

		<guid isPermaLink="false">http://www.bloggingaboutjava.org/cms/wordpress/2007/11/metric-driven-software-development/</guid>
		<description><![CDATA[In my last blog I already mentioned the role of software metrics in my graduation assignment. Software metrics are indicators for the quality of the source of a program. For example, one of the most well known metrics is McCabe&#8217;s cyclomatic complexity. This metric gives an indication of the complexity of a method or module/class. [...]]]></description>
			<content:encoded><![CDATA[<p>In <a href="http://www.google.com/url?sa=t&amp;ct=res&amp;cd=1&amp;url=http%3A%2F%2Fwww.bloggingaboutjava.org%2Fcms%2Fwordpress%2F2007%2F11%2Fprogramming-with-meta-data-an-example-for-concurrency%2F&amp;ei=Gh84R732C5a40gS_5bHmDA&amp;usg=AFQjCNFvsEeu75GFIwKhwJXdXghKcMAQMQ&amp;sig2=CqxCJJqWlWvjD8pkWY4YqA">my last blog</a> I already mentioned the role of <a href="http://en.wikipedia.org/wiki/Software_metric">software metrics</a> in my graduation assignment. Software metrics are indicators for the quality of the source of a program. For example, one of the most well known metrics is <a href="http://en.wikipedia.org/wiki/Cyclomatic_complexity">McCabe&#8217;s cyclomatic complexity</a>. This metric gives an indication of the complexity of a method or module/class. To calculate this complexity it uses the number of control-flows within this module.<br />
Other well known metrics are described by Chidamber and Kemerer, <a href="http://www.pitt.edu/~ckemerer/CK%20research%20papers/MetricForOOD_ChidamberKemerer94.pdf"><em>A Metrics Suite for Object Oriented Design</em></a><a href="http://www.pitt.edu/~ckemerer/CK%20research%20papers/MetricForOOD_ChidamberKemerer94.pdf">.</a> These metrics can play a great role in source-code reviewing; for instance to give an indication of the classes that will be hard to maintain and understand.</p>
<p>For my assignment I used metrics to evaluate the modularity, encapsulation and complexity of different implementations of the same concurrency functionalities.The modularity, encapsulation and complexity gave an indication of their maintainability.</p>
<p>The fact that more and more tools for software metrics are released and used is a good thing, because evaluating source-code and refactoring the &#8216;bad&#8217; code can be of great importance for a good evolution of a software product (to keep it maintainable).<br />
But it should not be used as a &#8216;development method&#8217;, lately I see other developers write their code in a way to get optimal results on one or two of these metrics. This is what I would like to call <em>metric driven development</em> and should be avoided. <em>Why ?</em><br />
Well because software metrics are <strong><em>indicators</em></strong> no more no less, a program for which metrics show good complexity metrics indicates the code is easy to understand, but does not guarantee it !</p>
<p>Software with good metric values can still be &#8216;bad&#8217;. For example, brainlessly refactoring for good metrics might hurt the shared abstraction levels of the methods or their cohesiveness. Which are also important source-code characteristics <a href="http://www.amazon.com/Code-Complete-Practical-Handbook-Construction/dp/0735619670/ref=pd_bbs_sr_1?ie=UTF8&amp;s=books&amp;qid=1196261911&amp;sr=1-1">according to McConnell</a>, and therefore making it doubtful that the refactoring was of any help to the project.</p>
<p>A second reason would be that optimizing code for some metrics will likely hurt the other metrics. For example when minimizing the number of lines of code in a method, one might extract new methods, resulting in a larger amount of methods per object and probably larger amount of lines per class.</p>
<p>So my personal advice would be to use software metrics only in the way they where meant to be: to evaluate a piece of software and to realize that it&#8217;s just a tool to <strong><em>indicate</em></strong> software quality not a <strong><em>guarantee</em></strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bloggingaboutjava.org/2007/11/metric-driven-software-development/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Ant Task for parsing JDeveloper 10.1.3 project files: solving the build</title>
		<link>http://www.bloggingaboutjava.org/2006/10/ant-task-for-parsing-jdeveloper-1013-project-files-solving-the-build/</link>
		<comments>http://www.bloggingaboutjava.org/2006/10/ant-task-for-parsing-jdeveloper-1013-project-files-solving-the-build/#comments</comments>
		<pubDate>Mon, 09 Oct 2006 13:16:38 +0000</pubDate>
		<dc:creator>Robert Willems of Brilman</dc:creator>
		
		<category><![CDATA[Methodologies]]></category>

		<category><![CDATA[Oracle J2EE]]></category>

		<category><![CDATA[Oracle System Development]]></category>

		<guid isPermaLink="false">http://www.bloggingaboutoracle.org/?p=188</guid>
		<description><![CDATA[One of my own pet projects is to create a neat &#8216;continuous integration&#8217; solution for our development environment. It is my vision that developers should work on a central source repository (currently implemented by CVS) and building and testing (if possible) should be done automatically. This interest was sparked by an article by Martin Fowler [...]]]></description>
			<content:encoded><![CDATA[<p>One of my own pet projects is to create a neat &#8216;continuous integration&#8217; solution for our development environment. It is my vision that developers should work on a central source repository (currently implemented by CVS) and building and testing (if possible) should be done automatically. This interest was sparked by an article by Martin Fowler on <a href="http://www.martinfowler.com/articles/continuousIntegration.html">Continuous Integration</a>.</p>
<p>During our projects we noticed that working in a central repository really isn&#8217;t a problem, but when looking at the automated build some problems arise. First you&#8217;ll need a tool to provide the automation. We currently use <a href="http://cruisecontrol.sourceforge.net/">CruiseControl</a> to provide the loop.</p>
<p>But how to build the results from the sources? JDeveloper provides us with a deployment profile with which we can create JAR, WAR and EAR files very easily, but on our development machine. However JDeveloper is the only program that understands those .deploy files. On the build server we don&#8217;t want any manual intervention. We first started to create Ant files to build the project by hand. This is a tedious and repetitive task that really is bug prone. You&#8217;ll also have to supply those ADF libraries someplace that is accessible (and known) by the build process (JDeveloper hides those libraries pretty well). Next we tried a solution that uses JDeveloper itself. It is an Ant task created by Gerard Davidson and is available via OTN (<a href="http://www.oracle.com/technology/products/jdev/htdocs/partners/addins/exchange/anttasks/index.html">here at the extension exchange</a>). It starts JDeveloper headless and can execute any JDeveloper command. We found found it a little troublesome and tricky to work with. Especially when an update is available JDeveloper will wait around for your mouse-click and so break your automated cycle.</p>
<p>Then an idea came to mind: what if we parsed the project files ourselves and built our Ant build file around that? Most problems creating Ant files manually where caused by libraries (user defined and those from extensions) and source paths. All that information is stored inside your project file (and the extensions within JDeveloper). As practically all JDeveloper configuration files are currently written in XML, those can be parsed without problem.</p>
<p>The current solution is one i did not want to withhold from all you guys (and gals ofcourse). We created an Ant Task that takes your (ViewController) project file and parses it (and it&#8217;s dependent projects, for example the Model project) and exposes the relevant paths and settings as filesets, paths and properties that Ant can use to compile, copy and jar to create your deliverable(s).</p>
<p>We almost always have workspaces that contain two projects: a ADF BC Model project and an ADF Faces ViewController project. The Ant Task is currently tailored to that situation (However probably other projects can work with it, however i haven&#8217;t tested it). The Task does however need a complete JDeveloper installation on the server. It won&#8217;t run it, but it is used to parse the JDeveloper extensions to find out with internal libraries are used (for example all those ADF BC libraries). You can now use a pretty generic Ant script that just uses those lists and properties to build your deliverables (JAR/WAR/EAR).<br />
<span id="more-84"></span><br />
The Task itself has the following JavaDoc which hopefully makes it more clear:<br />
<blockquote><code><br />
Task to parse a jDeveloper project file.<br />
&nbsp;<br />
Takes the supplied jpr (Jdeveloper project file) parses it and creates the following lists:<br />
&nbsp;- (Path structure) Sourcepaths (prefix + '.sources')<br />
&nbsp;- (Path structure) Classpath (prefix + '.classpath')<br />
&nbsp;- (Fileset structor) Resources (non java-files) on the classpath (prefix + '.resources')<br />
&nbsp;- (Fileset structure) Deployed libraries (subset of classpath) (prefix + '.deployed')<br />
&nbsp;- (Fileset structure) Web content directory (prefix + '.webcontent')<br />
&nbsp;- (Property) J2EE web application name (prefix + '.j2ee.name')<br />
&nbsp;- (Property) J2EE web application context (prefix + '.j2ee.context')<br />
&nbsp;<br />
With this information you can use ant to create a simple WAR/EAR deployment.<br />
To copy the resources from the classpath(s) you need to use the supplied filename<br />
mapper (based multiple classpaths can be used and you'll not want those relative<br />
directories in the classpath)<br />
&nbsp;<br />
A known problem is that fileset cannot span multiple drives on windows. If your<br />
deployed libraries are located on multiple drives you will get an exception through<br />
the ProjectParser.<br />
</code></p></blockquote>
<p>We are currently using it to automatically build our projects on a Build server. Unfortunately i cannot give you the sources as my boss would go through the roof. However i think this Task will be usefull to a lot of people so hopefully you won&#8217;t mind.</p>
<p>You can download the package <a href="http://www.bloggingaboutoracle.org/wp-content/upload/logicacmgjdevprojectparser1.0.0.zip">here</a>.</p>
<p>Just unzip and read the included .HTML file. The package contains the HTML (overview from the JavaDoc), the JAR file and the JAR-ed JavaDoc. The HTML (or JavaDoc) also supplies a complete Ant build file that we currently use in our project to create the WAR and EAR files.</p>
<p> If anything is unclear (or, i hope not, not working) just leave me a comment or give me a howler on e-mail.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bloggingaboutjava.org/2006/10/ant-task-for-parsing-jdeveloper-1013-project-files-solving-the-build/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
