<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Basil Vandegriend: Professional Software Development</title>
	
	<link>http://www.basilv.com/psd</link>
	<description />
	<lastBuildDate>Thu, 17 May 2012 14:31:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/ProfessionalSoftwareDevelopment" /><feedburner:info uri="professionalsoftwaredevelopment" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><image><link>http://www.basilv.com/psd/</link><url>http://www.basilv.com/psd/wp-content/themes/bvpsd/images/gears.gif</url><title>Professional Software Development</title></image><item>
		<title>Industry Adoption of Agile</title>
		<link>http://feedproxy.google.com/~r/ProfessionalSoftwareDevelopment/~3/4MpG5CT2_k4/industry-adoption-of-agile</link>
		<comments>http://www.basilv.com/psd/blog/2012/industry-adoption-of-agile#comments</comments>
		<pubDate>Thu, 17 May 2012 14:31:08 +0000</pubDate>
		<dc:creator>Basil Vandegriend</dc:creator>
				<category><![CDATA[agile]]></category>
		<category><![CDATA[IT industry]]></category>
		<category><![CDATA[project management]]></category>
		<category><![CDATA[software development]]></category>

		<guid isPermaLink="false">http://www.basilv.com/psd/?p=812</guid>
		<description><![CDATA[Agile methods have seen a surge of adoption within I.T. in the last few years. Agile is clearly not a fad or limited to early adopters - it has entered the mainstream and is here to stay. For those of you not yet using Agile, I wanted to provide statistics and recommendations from widely-recognized industry [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://agilemanifesto.org/">Agile methods</a> have seen a surge of adoption within I.T. in the last few years. Agile is clearly not a fad or limited to early adopters - it has entered the mainstream and is here to stay. For those of you not yet using Agile, I wanted to provide statistics and recommendations from widely-recognized industry sources to emphasize just how significant Agile has become, and to strongly encourage you to adopt Agile as well.</p>
<p>I will start with statistics regarding the adoption of agile. The Forrester / Dr. Dobb's Q3 2010 Global Technographics  Survey, as referenced in the Forrester paper <a href="http://www.forrester.com/rb/Research/water-scrum-fall_is_reality_of_agile_for_most/q/id/60109/t/2">Water-Scrum-Fall is the Reality of Agile for Most Organizations Today</a>, found that 55% of projects where using some form of agile or iterative method. This statistic is now almost 2 years old. The <a href="http://www.pmi.org/Certification/New-PMI-Agile-Certification.aspx">Project Management Institute (PMI) reports that the use of Agile has tripled from 2008 to 2011</a> and states that Gartner predicts 80% of software development projects will be using Agile by the end of 2012.</p>
<p>Agile has often been perceived as developer-centric, so I have found it quite revealing that over the last year other I.T. roles have formally recognized the importance of Agile. The PMI has come out with its <a href="http://www.pmi.org/Certification/New-PMI-Agile-Certification.aspx">Agile Certified Practitioner certification</a> and the International Institute of Business Analysis (IIBA) is finalizing their <a href="http://www.iiba.org/imis15/IIBA/Professional_Development/The_Agile_Extension_of_the_BABOK/IIBA_Website/Professional_Development/Agile_Extension.aspx">Agile Extension to the Business Analysis Body of Knowledge</a>.</p>
<p>This information about the adoption of agile is interesting but I do not view it as sufficient evidence on its own to adopt agile. What I do find compelling is the benefits that Agile brings. This is clearly summarized by the <a href="http://standishgroup.com/newsroom/chaos_manifesto_2011.php">2011 CHAOS Manifesto from the Standish Group</a> which states that "software applications developed through the agile process have <em>three times</em> the success rate of the traditional waterfall method and a much lower percentage of time and cost overruns".</p>
<p>I will conclude this article with one final reference that I believe perfectly captures the point of my article. <a href="http://my.gartner.com/portal/server.pt?open=512&#038;objID=249&#038;mode=2&#038;PageID=864059&#038;resId=1837016&#038;ref=Browse">Gartner's 2012 Planning Guide for Application Delivery Strategies</a> has a section that is simply titled "Say goodbye to waterfall".</p>

<p><a href="http://feedads.g.doubleclick.net/~a/-gfSTOorjTP6wFL_Flcy2l1c2Sc/0/da"><img src="http://feedads.g.doubleclick.net/~a/-gfSTOorjTP6wFL_Flcy2l1c2Sc/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/-gfSTOorjTP6wFL_Flcy2l1c2Sc/1/da"><img src="http://feedads.g.doubleclick.net/~a/-gfSTOorjTP6wFL_Flcy2l1c2Sc/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/ProfessionalSoftwareDevelopment?a=4MpG5CT2_k4:6dK_439_eXE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/ProfessionalSoftwareDevelopment?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ProfessionalSoftwareDevelopment?a=4MpG5CT2_k4:6dK_439_eXE:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/ProfessionalSoftwareDevelopment?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/ProfessionalSoftwareDevelopment/~4/4MpG5CT2_k4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.basilv.com/psd/blog/2012/industry-adoption-of-agile/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.basilv.com/psd/blog/2012/industry-adoption-of-agile</feedburner:origLink></item>
		<item>
		<title>Adopting Agile in Government</title>
		<link>http://feedproxy.google.com/~r/ProfessionalSoftwareDevelopment/~3/kQuI-AfHouk/adopting-agile-in-government</link>
		<comments>http://www.basilv.com/psd/blog/2012/adopting-agile-in-government#comments</comments>
		<pubDate>Wed, 16 May 2012 13:26:03 +0000</pubDate>
		<dc:creator>Basil Vandegriend</dc:creator>
				<category><![CDATA[miscellaneous]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[government]]></category>

		<guid isPermaLink="false">http://www.basilv.com/psd/?p=807</guid>
		<description><![CDATA[As Agile is seeing widespread adoption in many industry sectors, what about within government (public sector) organizations? Can Agile work within governments? What are some challenges and risks to watch out for? I'm giving a presentation on this topic Thursday, May 17th, 2012 at noon that aims to answer these questions and provide guidance based [...]]]></description>
			<content:encoded><![CDATA[<p>As Agile is seeing widespread adoption in many industry sectors, what about within government (public sector) organizations? Can Agile work within governments? What are some challenges and risks to watch out for? </p>
<p>I'm giving a presentation on this topic Thursday, May 17th, 2012 at noon that aims to answer these questions and provide guidance based on a number of case studies involving Agile government projects. Along the way we will cover various perspectives on what Agile is, shatter some common misconceptions, and see some compelling evidence for why your next software development effort should use Agile.</p>
<p>The presentation is for <a href="http://www.agileedmonton.org/">Agile Edmonton</a> at a new location - <a href="http://www.startupedmonton.com/">Startup Edmonton</a> which is located on the 3rd floor of the historic Mercer Warehouse at 10363 – 104 Street (on the corner of 104st and 104 ave). Attendance is open to the public, so please drop by to attend the talk.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/W_WY1WrvM1CBLMbs5sm83mmAa0E/0/da"><img src="http://feedads.g.doubleclick.net/~a/W_WY1WrvM1CBLMbs5sm83mmAa0E/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/W_WY1WrvM1CBLMbs5sm83mmAa0E/1/da"><img src="http://feedads.g.doubleclick.net/~a/W_WY1WrvM1CBLMbs5sm83mmAa0E/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/ProfessionalSoftwareDevelopment?a=kQuI-AfHouk:pIq3Pvf9b9Y:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/ProfessionalSoftwareDevelopment?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ProfessionalSoftwareDevelopment?a=kQuI-AfHouk:pIq3Pvf9b9Y:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/ProfessionalSoftwareDevelopment?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/ProfessionalSoftwareDevelopment/~4/kQuI-AfHouk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.basilv.com/psd/blog/2012/adopting-agile-in-government/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.basilv.com/psd/blog/2012/adopting-agile-in-government</feedburner:origLink></item>
		<item>
		<title>Architects as Scouts</title>
		<link>http://feedproxy.google.com/~r/ProfessionalSoftwareDevelopment/~3/N_5r0KJmH_o/architects-as-scouts</link>
		<comments>http://www.basilv.com/psd/blog/2012/architects-as-scouts#comments</comments>
		<pubDate>Tue, 03 Apr 2012 13:29:07 +0000</pubDate>
		<dc:creator>Basil Vandegriend</dc:creator>
				<category><![CDATA[architecture]]></category>
		<category><![CDATA[software development]]></category>

		<guid isPermaLink="false">http://www.basilv.com/psd/?p=802</guid>
		<description><![CDATA[Software architects have many responsibilities and expectations placed upon them which can be confusing to handle. For a while now I have been condensing these demands into a small set of metaphorical roles. I have found this helpful in staying true to my broader objectives as I move between tasks or problems. The role that [...]]]></description>
			<content:encoded><![CDATA[<p>Software architects have many responsibilities and expectations placed upon them which can be confusing to handle. For a while now I have been condensing these demands into a small set of metaphorical roles. I have found this helpful in staying true to my broader objectives as I move between tasks or problems.</p>
<p>The role that I want to share today is the architect as a <em>scout</em> in the military sense. A definition from Google is "a person sent out ahead of a main force so as to gather information about the enemy's position, strength, or movements." I like the military metaphor because software development is a team activity - the architect as scout is serving the rest of the team with the objective of helping keep the team moving ahead at a steady pace. This means being aware of what lies ahead, mapping the path forward, avoiding or eliminating obstacles, and being an initial target for hostile fire.</p>
<h3>Awareness of what lies ahead</h3>
<p>Architects need to be aware of what lies ahead in terms of both technical and business changes. The more accurate their picture of the future, the better their designs and decisions can be. </p>
<p>Awareness of the technical domain includes staying current on new libraries, frameworks, and platforms (e.g. mobile), learning about new software development practices (e.g. DevOps), and knowing what new infrastructure might become available to the team (e.g. middleware upgrades, cloud).</p>
<p>Awareness of the business domain includes having an idea of what major new functionality the business is thinking of introducing (e.g. need for multidimensional data analysis), and also having an idea of what business events or changes might significantly impact the system (e.g. significant variations in business usage of the system from how it was originally modeled, resulting in a significant change in the load and/or data volumes).</p>
<p>As an example, I recently recommended planning to do some refactoring to eliminate some duplicate code in the generation logic for two reports. Since there was a lot of this repeated code and it was clearly identified and isolated making it an easy, low risk refactoring, I though this was an obvious decision. Unfortunately, after making the recommendation, I learned that the business was expecting to eliminate one of the two reports in the near future. This completely changed the value proposition of the refactoring, actually making it potentially harmful in that it might increase the work required to rip out the one report entirely down the road. As a result, I reversed my recommendation.</p>
<h3>Mapping the path forward</h3>
<p>Architects determine how to use new technologies and how to solution new requirements to map out a clear path forward for the rest of the team. By tackling the risky or unknown items early, architects help the team maintain consistent progress. </p>
<p>Architects can use spikes, experiments, and pilots to try out and validate new technologies, solutions, and practices. Sometimes architects cannot do more than a basic evaluation in complete isolation. One approach I have used is to then do a pilot with a single team while closely monitoring and providing guidance, and then evaluate the suitability for rolling the change out more broadly within the organization. In such a case the entire team doing the pilot becomes a scouting force for the entire organization, led by the architect.</p>
<p>Solutioning of major new requirements can involve build-versus-buy decisions, determining major new components or infrastructure required, and architectural-level design. The common objective is to clarify what the team will need to do and allow for advance planning for activities needing more lead time (e.g. provisioning of new infrastructure, installing new software, training on new technologies).</p>
<p>For agile teams mapping the path forward typically means working an iteration earlier, ahead of the majority of the team, to ensure that business requirements are ready for the team to work on in the coming iteration and to ensure that there are minimal surprises with any new technologies or solutions. Architects can also be a source of technical requirements that are part of the product backlog. These activities help ensure that the team maintains a consistent, predictable velocity in delivering business value. Some agile teams might not have someone named explicitly in the role of architect, but all teams at least occasionally need someone operating as a scout to chart the waters ahead.</p>
<h3>Dealing with obstacles</h3>
<p>Architects need to identify and then avoid or eliminate obstacles that will potentially prevent successful delivery of the software or impede the team's progress.</p>
<p>Sometimes these obstacles are tricky technical issues that the team is having trouble resolving. As an example, one time I became involved in solving a performance problem with a batch process that took ever-increasing amounts of time to process individual records as the batch process ran. The problem was hard to find because it was not due to any particular piece of application code, but to how Hibernate (the underlying object-relational mapping library) was being used. To fix the problem I had to adjust the overall design of the batch process to <a href="http://www.basilv.com/psd/blog/2010/avoiding-caching-to-improve-hibernate-performance">reduce caching within Hibernate</a> (follow the link to read more about the technical details).</p>
<p>Obstacles sometimes arise when the business raises requirements that are overly complex or extremely challenging to implement, especially in terms of meeting non-functional requirements such as performance or scalability. Architects sometimes need to push back on these requirements, or at least raise the alarm regarding the higher risk to ensure that sufficient time and resources are allocated to dealing with it.</p>
<p>Obstacles are not just with the software being developed or its requirements - they can also arise with respect to the project or external stakeholder expectations. For example, if management imposes an unrealistic delivery schedule on the team then architects are responsible for raising the alarm and helping determine ways to mitigate the risk.</p>
<h3>Target for hostile fire</h3>
<p>Architects serve as lightning rods for the team to initially bear the brunt of external problems or threats, especially those technical in nature. In this role architects act as a buffer to avoid having the team distracted or demotivated by these types of issues.</p>
<p>While the term 'hostile fire' is a metaphor, sometimes there are people in the organization who really are hostile. This may be due to political fallout from unpopular decisions, or stakeholder unhappiness with the software (e.g. due to poor performance or crippling defects). When the issues are technical the architect is the first contact - hearing the complaints and taking responsibility for what the team has produced. This is seldom pleasant, but is one of the responsibilities that comes with the role.</p>
<p>Sometimes the hostile fire really is a metaphor for tools or technologies that are too bleeding-edge or otherwise do not work as advertised. The architect then must confront the pain points and determine whether it is manageable or whether the tool must be scrapped and an alternative selected. Hostility may arise as a result of these issues or the resulting decisions, either from the team itself if they discovered these issues using a product proposed by the architect, or from parties within the organization outside of the team that are promoting or mandating the use of the problematic tool. </p>
<p>One example of this is years ago when new version control software was being introduced to replace <a href="http://www.nongnu.org/cvs/">CVS</a>. I had not been involved with the initial pilot, but had heard disturbing things about the tool despite the decision to move ahead with its adoption. So I volunteered my team to be one of the first adopters and basically did my own evaluation. Shortly after transitioning to the new tool, I discovered a major design flaw that made it unusable. Efforts to work with the vendor to get the problem rectified failed, so I presented the situation to management and the decision to abandon the tool was made.</p>
<p>In conclusion, if you are an architect or functioning as a scout for your team ensure you are aware of what lies ahead, map out the path forward, deal with obstacles, and be the first contact for hostile fire.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/6IeBk0JhKEFx94bAMtjfYSb1w44/0/da"><img src="http://feedads.g.doubleclick.net/~a/6IeBk0JhKEFx94bAMtjfYSb1w44/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/6IeBk0JhKEFx94bAMtjfYSb1w44/1/da"><img src="http://feedads.g.doubleclick.net/~a/6IeBk0JhKEFx94bAMtjfYSb1w44/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/ProfessionalSoftwareDevelopment?a=N_5r0KJmH_o:AdEo_EatC2U:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/ProfessionalSoftwareDevelopment?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ProfessionalSoftwareDevelopment?a=N_5r0KJmH_o:AdEo_EatC2U:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/ProfessionalSoftwareDevelopment?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/ProfessionalSoftwareDevelopment/~4/N_5r0KJmH_o" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.basilv.com/psd/blog/2012/architects-as-scouts/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.basilv.com/psd/blog/2012/architects-as-scouts</feedburner:origLink></item>
		<item>
		<title>My Concerns with Process Certification</title>
		<link>http://feedproxy.google.com/~r/ProfessionalSoftwareDevelopment/~3/WilhIgxPpfw/my-concerns-with-process-certification</link>
		<comments>http://www.basilv.com/psd/blog/2012/my-concerns-with-process-certification#comments</comments>
		<pubDate>Fri, 23 Mar 2012 14:15:11 +0000</pubDate>
		<dc:creator>Basil Vandegriend</dc:creator>
				<category><![CDATA[management]]></category>
		<category><![CDATA[certification]]></category>
		<category><![CDATA[process]]></category>

		<guid isPermaLink="false">http://www.basilv.com/psd/?p=791</guid>
		<description><![CDATA[In I.T. there are a number of process-based certifications that organizations can obtain based on standards like ISO-9001, ITIL via ISO 20000, and CMMI. The process of qualifying for a certification is similar across these standards: the organization defines and/or revises their internal processes to comply with the requirements of the standard, documents these processes, [...]]]></description>
			<content:encoded><![CDATA[<p>In I.T. there are a number of process-based certifications that organizations can obtain based on standards like <a href="http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=46486">ISO-9001</a>, <a href="http://en.wikipedia.org/wiki/Information_Technology_Infrastructure_Library">ITIL</a> via <a href="http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=51986">ISO 20000</a>, and <a href="http://www.sei.cmu.edu/library/abstracts/reports/10tr033.cfm">CMMI</a>. The process of qualifying for a certification is similar across these standards: the organization defines and/or revises their internal processes to comply with the requirements of the standard, documents these processes, and then goes through an external audit on a periodic basis to demonstrate compliance and obtain or maintain the certification. I have written previously about <a href="http://www.basilv.com/psd/blog/2010/drawbacks-of-formal-audits">the drawbacks of formal audits</a> which is an accompanying issue, but today I just want to focus on my concerns with the idea of organizational process certification in general.</p>
<p>To be clear, I am not talking about process certifications for individuals like the popular <a href="http://www.scrumalliance.org/pages/CSM">Certified ScrumMaster</a> and <a href="http://www.pmi.org/Certification/Project-Management-Professional-PMP.aspx">Project Management Professional</a>. I view these certifications as recognition of a person achieving a certain level of knowledge with a particular process - what the person does with this information is entirely up to them. (The value of these certifications is a completely separate debate I do not want to get into today.)</p>
<p>So what is my key issue with organizational process certification? It stems from my <a href="http://www.basilv.com/psd/blog/2008/becoming-a-champion-of-continuous-improvement">passion for continuous improvement</a>. In my mind there is a fundamental mismatch between a true culture of continuous improvement, such as I have read about regarding Toyota in books like <a href="http://www.amazon.ca/gp/product/0071392319/ref=as_li_tf_tl?ie=UTF8&#038;tag=basilvandegri-20&#038;linkCode=as2&#038;camp=15121&#038;creative=330641&#038;creativeASIN=0071392319">The Toyota Way</a><img src="http://www.assoc-amazon.ca/e/ir?t=basilvandegri-20&#038;l=as2&#038;o=15&#038;a=0071392319" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /> by Jeffrey Liker, and the requirement to comply with a particular process to maintain certification. Continuous improvement may identify activities or aspects of the process that can be altered or eliminated due to lack of value (waste, in lean terms), but if these aspects are required by the certification, then the certification itself becomes an impediment to change.</p>
<p>One example comes from software development teams starting with Scrum and then inspecting and adapting their process as they proceed (which is a key aspect of Scrum). Some teams end up with an arguably different Agile process such as Kanban that can no longer be called Scrum, and other teams end up with some hybrid version of Scrum that may or may not be as effective, but may be more achievable given the limitations of the organizational context. (Jeff Sutherland, co-creator of Scrum, <a href="http://scrum.jeffsutherland.com/2008/08/agile-2008-money-for-nothing.html">derisively labels limited adoptions as "ScrumButt".</a>) The frequent debates that occur as to whether such teams are really doing Scrum are lively but largely irrelevant to the more important question of whether such teams are as effective and successful as they can be. This dynamic would look completely different if a team or organization was required to use Scrum via formal certification (something, fortunately, I have not heard of happening.) Then the question of effectiveness would take a back seat to the question of compliance.</p>
<p><a href="http://www.basilv.com/psd/wp-content/uploads/2012/03/Yin-Yang.png"><img src="http://www.basilv.com/psd/wp-content/uploads/2012/03/Yin-Yang.png" alt="Yin-Yang" title="Yin-Yang" width="150" height="150" style="float:right" class="alignright size-full wp-image-792" /></a><br />
The Asian philosophical concept of <a href="http://en.wikipedia.org/wiki/Yin_and_yang">yin-yang</a> seems to be the source of inspiration for the Japanese attitude that avoids this mismatch between process compliance and continuous improvement. This viewpoint holds that a process represents the best way known at <em>this point in time</em> to accomplish an objective, but to always search for a better process via continuous improvement. In my readings regarding Toyota and <a href="http://www.amazon.ca/gp/product/0743249275/ref=as_li_tf_tl?ie=UTF8&#038;tag=basilvandegri-20&#038;linkCode=as2&#038;camp=15121&#038;creative=330641&#038;creativeASIN=0743249275">lean thinking</a><img src="http://www.assoc-amazon.ca/e/ir?t=basilvandegri-20&#038;l=as2&#038;o=15&#038;a=0743249275" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />, it appears that continuous improvement is the ultimate priority which all processes are subordinate to.</p>
<p>Some standards claim to be process-neutral in the sense that they do not require a specific process. For example CMMI specifies many process areas with objectives that must be met (the what), but allows you to specify the process that meets the objective (the how). However, the requirement to meet the objectives and to produce the evidence necessary to demonstrate that the objectives have been met both introduce significant constraints on what your processes are. In addition, in my experience the CMMI appraisers / consultants seem to have a bias towards particular processes being used. As a result pursuing such standards tends to push organizations towards a certain set of practices that may or may not be appropriate.</p>
<p>Just because I do not like process certifications does not mean I do not like the underlying standards. There are a lot of good ideas embedded in standards like ITIL and CMMI. But there are also aspects I think are often inappropriate depending on the context. Certification prevents you from intelligently picking and choosing - the full standard is forced upon you.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/HA2jnJITclBsdRkdedvI3uE6zbc/0/da"><img src="http://feedads.g.doubleclick.net/~a/HA2jnJITclBsdRkdedvI3uE6zbc/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/HA2jnJITclBsdRkdedvI3uE6zbc/1/da"><img src="http://feedads.g.doubleclick.net/~a/HA2jnJITclBsdRkdedvI3uE6zbc/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/ProfessionalSoftwareDevelopment?a=WilhIgxPpfw:jqjoPJoptlo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/ProfessionalSoftwareDevelopment?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ProfessionalSoftwareDevelopment?a=WilhIgxPpfw:jqjoPJoptlo:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/ProfessionalSoftwareDevelopment?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/ProfessionalSoftwareDevelopment/~4/WilhIgxPpfw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.basilv.com/psd/blog/2012/my-concerns-with-process-certification/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.basilv.com/psd/blog/2012/my-concerns-with-process-certification</feedburner:origLink></item>
		<item>
		<title>Visualizing Java Package Dependencies</title>
		<link>http://feedproxy.google.com/~r/ProfessionalSoftwareDevelopment/~3/cVf4kLBKYbk/visualizing-java-package-dependencies</link>
		<comments>http://www.basilv.com/psd/blog/2012/visualizing-java-package-dependencies#comments</comments>
		<pubDate>Wed, 07 Mar 2012 13:16:42 +0000</pubDate>
		<dc:creator>Basil Vandegriend</dc:creator>
				<category><![CDATA[architecture]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://www.basilv.com/psd/?p=781</guid>
		<description><![CDATA[I have recently been examining the overall package structure of a Java enterprise application. I discovered an easy way to visualize the dependencies between packages using two open source tools JDepend and Graphviz and a little glue code. JDepend analyzes compiled Java bytecode and determines dependencies and metrics between Java packages. These analysis results can [...]]]></description>
			<content:encoded><![CDATA[<p>I have recently been examining the overall package structure of a Java enterprise application. I discovered an easy way to visualize the dependencies between packages using two open source tools <a href="http://clarkware.com/software/JDepend.html">JDepend</a> and <a href="http://www.graphviz.org/">Graphviz</a> and a little glue code. JDepend analyzes compiled Java bytecode and determines dependencies and metrics between Java packages. These analysis results can be used to generate a graph with packages as nodes and dependencies as edges. Graphviz can then be used to layout and draw the graph as an image. Sample code is provided at the end of this article to show how to do this.</p>
<p>Visualizing package dependencies can be useful for a number of reasons:</p>
<ul>
<li>Reverse engineering the architecture of an application when documentation is limited, out-of-date, or non-existent.</li>
<li>Automatically generating diagrams, saving the time required to draw them manually.</li>
<li>To understand impacts when doing large-scale refactorings or changing implementations of components.</li>
<li>To determine how to extract functionality for reuse.</li>
<li>To support good architecture / design as espoused by Robert C. Martin in his book <a href="http://www.amazon.ca/gp/product/0135974445/ref=as_li_tf_tl?ie=UTF8&#038;tag=basilvandegri-20&#038;linkCode=as2&#038;camp=15121&#038;creative=330641&#038;creativeASIN=0135974445">Agile Software Development, Principles, Patterns, and Practices</a><img src="http://www.assoc-amazon.ca/e/ir?t=basilvandegri-20&#038;l=as2&#038;o=15&#038;a=0135974445" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />, such as by eliminating cyclical dependencies or unwanted dependencies.</li>
</ul>
<p>Here is an example package dependency diagram generated by Graphviz:<br />
<a href="http://www.basilv.com/psd/wp-content/uploads/2012/03/packages.png"><img src="http://www.basilv.com/psd/wp-content/uploads/2012/03/packages.png" alt="Example Java Package Dependencies Diagram" title="Example Java Package Dependencies Diagram" width="507" height="251" class="alignnone size-full wp-image-782" /></a></p>
<p>The source code provided below that was used to generate this example diagram is available from my <a href="https://github.com/basilv/Java-Examples">Java Examples</a> project on GitHub or as a <a href="http://www.basilv.com/psd/software#JavaExamples">packaged bundle on my Software page</a>. The code can easily be reused: change the directory of compiled code scanned by JDepend ("dist/classes"), and change the root package used to limit the scope of the diagram ("com.basilv.examples.packagediagram").</p>
<pre class="prettyprint">
package com.basilv.examples.packagediagram;
import java.io.*;
import java.util.*;
import jdepend.framework.*;

public class PackageDiagramCreatorApp {

  public static void main(String[] args) {
    createPackageDependencyDiagram();
    System.exit(0);
  }

  public static void createPackageDependencyDiagram() {
    Collection<JavaPackage> packages = analyzePackages();
    StringBuilder builder = generateGraph(packages);
    generateImage("packages", builder.toString());
  }

  @SuppressWarnings("unchecked")
  private static Collection<JavaPackage> analyzePackages() {
    JDepend jdepend = new JDepend();
    try {
      jdepend.addDirectory("dist/classes");
    } catch (IOException e) {
      throw new RuntimeException("Error adding directory for JDepend to analyze.", e);
    }
    Collection<JavaPackage> packages = jdepend.analyze();
    return packages;
  }

  private static StringBuilder generateGraph(
    Collection<JavaPackage> packages) {
    StringBuilder builder = new StringBuilder();
    builder.append("digraph packages {").append("\n");
    builder.append("node [shape=box];").append("\n");
    builder.append("rankdir=BT;").append("\n");
    Set<String> drawnDependencies = new HashSet<String>();
    for (JavaPackage javaPackage : packages) {
      String packageNodeName = getGraphVizNodeForPackage(javaPackage);
      if (packageNodeName == null) {
        continue;
      }
      builder.append(packageNodeName).append("\n");

      @SuppressWarnings("unchecked")
      Collection<JavaPackage> dependencies = javaPackage.getEfferents();

      for (JavaPackage dependency : dependencies) {
        String dependencyNodeName = getGraphVizNodeForPackage(dependency);
        if (dependencyNodeName == null
          || packageNodeName.equals(dependencyNodeName)) {
          continue;
        }
        String dependencyKey = packageNodeName + "->"
          + dependencyNodeName;
        if (drawnDependencies.contains(dependencyKey)) {
          continue;
        }
        builder.append(packageNodeName).append(" -> ").append(
          dependencyNodeName).append(" [weight=4]").append("\n");
        drawnDependencies.add(dependencyKey);
      }
    }
    builder.append("}\n");
    return builder;
  }

  private static String getGraphVizNodeForPackage(
    JavaPackage javaPackage) {

    String rootPackage = "com.basilv.examples.packagediagram";
    String packageName = javaPackage.getName();
    if (!packageName.startsWith(rootPackage)) {
      return null;
    }

    return packageName.replace(".", "_");
  }

  private static void generateImage(String fileName,
    String graphVizDotFormattedGraph) {
    try {
      File graphFile = createFileWithContents(fileName
        + ".txt", graphVizDotFormattedGraph);

      // This requires the Graphviz software to be installed -
      // see http://graphviz.org/
      String imageFileLocation = fileName + ".png";
      Runtime.getRuntime().exec(
        "dot -v -Tpng " + graphFile.getName() + " -o "
          + imageFileLocation);

      System.out.println("Image file available at "
        + new File(imageFileLocation).getAbsolutePath());
    } catch (IOException e) {
      throw new RuntimeException("Error generating image " + fileName, e);
    }
  }

  private static File createFileWithContents(
    String fileName, String graphVizDotFormattedGraph)
    throws IOException {
    File graphFile = new File(fileName);
    FileWriter writer = new FileWriter(graphFile, false);
    try {
      writer.append(graphVizDotFormattedGraph);
    } finally {
      writer.close();
    }
    return graphFile;
  }

}
</pre>

<p><a href="http://feedads.g.doubleclick.net/~a/FnC9F7K8qxtsFaqHHU1_v-AOVFs/0/da"><img src="http://feedads.g.doubleclick.net/~a/FnC9F7K8qxtsFaqHHU1_v-AOVFs/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/FnC9F7K8qxtsFaqHHU1_v-AOVFs/1/da"><img src="http://feedads.g.doubleclick.net/~a/FnC9F7K8qxtsFaqHHU1_v-AOVFs/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/ProfessionalSoftwareDevelopment?a=cVf4kLBKYbk:T-rj5TAYN2o:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/ProfessionalSoftwareDevelopment?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ProfessionalSoftwareDevelopment?a=cVf4kLBKYbk:T-rj5TAYN2o:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/ProfessionalSoftwareDevelopment?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/ProfessionalSoftwareDevelopment/~4/cVf4kLBKYbk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.basilv.com/psd/blog/2012/visualizing-java-package-dependencies/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://www.basilv.com/psd/blog/2012/visualizing-java-package-dependencies</feedburner:origLink></item>
		<item>
		<title>Meeting Milestones via Swarming and Reserves</title>
		<link>http://feedproxy.google.com/~r/ProfessionalSoftwareDevelopment/~3/ecikMWINfnQ/meeting-milestones-via-swarming-and-reserves</link>
		<comments>http://www.basilv.com/psd/blog/2012/meeting-milestones-via-swarming-and-reserves#comments</comments>
		<pubDate>Sun, 12 Feb 2012 14:06:44 +0000</pubDate>
		<dc:creator>Basil Vandegriend</dc:creator>
				<category><![CDATA[management]]></category>
		<category><![CDATA[overtime]]></category>
		<category><![CDATA[project management]]></category>
		<category><![CDATA[schedule]]></category>
		<category><![CDATA[time management]]></category>

		<guid isPermaLink="false">http://www.basilv.com/psd/?p=774</guid>
		<description><![CDATA[No matter what method of software development a team uses, there will be times when the team struggles to meet planned milestones. The milestone could be completing committed stories for an iteration or reaching the feature-complete point in a release. The struggle to meet the milestone might be caused by any number of factors like [...]]]></description>
			<content:encoded><![CDATA[<p>No matter what method of software development a team uses, there will be times when the team struggles to meet planned milestones. The milestone could be completing committed stories for an iteration or reaching the feature-complete point in a release. The struggle to meet the milestone might be caused by any number of factors like requirements churn, poor quality work, or insufficient resources. Whatever the cause, the question facing the team is how will they meet their milestone?</p>
<p>I have faced this problem yet again recently and wanted to share two approaches that I have found useful: <em>swarming</em> and <em>reserves</em>.</p>
<h3>Swarming</h3>
<p>The basic idea behind swarming is to throw extra people at the outstanding work necessary to meet the milestone. In project management terms this typically involves sacrificing effort (budget) to save time (schedule). Effort is typically sacrificed due to two factors. First, more than the optimal number of people are working on one piece of work and some effort is lost through extra coordination. Second, people get involved doing work outside their normal expertise and thus require more time than normal. </p>
<p>An example of swarming is a scrum team pulling together at the end of an iteration to finish their committed stories. Developers could pair up to more quickly resolve the remaining defects. Once done testing their own functionality testers could jump in to help test other features they are unfamiliar with. Business analysts can delay working on future requirements to help test.</p>
<p>There are a couple of guidelines to swarming effectively. The first is to focus on the critical path - the activities that are predicted to take the longest and drive what the final completion date will be. This is typically accomplished by pulling people off of non-critical-path activities, but you have to be careful that you do not inadvertently slow down something else so much that it then becomes critical path.</p>
<p>The second guideline is similar: focus on work necessary for completing the milestone instead of non-milestone-related work. This may seem obvious, but in practice it is surprising how people will tend to choose the more interesting tasks over more tedious but necessary tasks (for example, updating end-user documentation prior to release). One way of achieving this focus is to clearly define what is part of the milestone versus what is not. One team I know uses a task board with post-it notes colored by release to visualize this. </p>
<p>Swarming only works when you have people on the team who are available to swarm - i.e. not all busy on critical path and/or milestone work. This leads us to the topic of <em>reserves</em>.</p>
<h3>Reserves</h3>
<p>The basic idea behind reserves is to hold back a portion of some type of resource so that it is available if an unforeseen situation arises - usually a problem, or sometimes an opportunity. </p>
<p>One very common approach is to set aside a period of time in the schedule as contingency. This may be an extra iteration per release, an end-of-release iteration to finalize the software for release, or simply extending the original estimated schedule by a certain percentage. </p>
<p>Another approach is to ensure that the team members are working normal hours - i.e. no overtime. If a time crunch does occur, then a short burst of overtime acts as a reserve. You have to be careful using this approach, as <a href="http://www.basilv.com/psd/blog/2006/overtime-considered-harmful">too much overtime is dangerous</a>. You need to allow time for recovery afterwards, once the milestone is met, or risk disengagement, reduction in productivity, burnout, and loss of personnel. </p>
<p>A more advanced version of this approach is to ensure that each person is not normally 100% busy, as espoused by the book <a href="http://www.amazon.ca/exec/obidos/redirect?link_code=as2&#038;path=ASIN/0767907698&#038;tag=basilvandegri-20&#038;camp=15121&#038;creative=330641">Slack: Getting Past Burnout, Busywork, and the Myth of Total Efficiency</a><img src="http://www.assoc-amazon.ca/e/ir?t=basilvandegri-20&#038;l=as2&#038;o=15&#038;a=0767907698" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /> by Tom Demarco. It is suspected that this is one of the reasons that companies such as Google provides 20% time for each employee to pursue personal projects. The first benefit of slack is that this minimizes time to completion by reducing delays due to work waiting in queues (as per lean theory). This thus reduces the chance of needing to struggle to meet a milestone in the first place. The second benefit is that, like overtime, people have the capacity to increase their efforts if a milestone is threatened</p>
<p>A related approach that has worked well in my own experience is to have some project members normally be assigned part time with flexibility in how they spend their non-project time. During crunch periods they can then easily increase the percentage of time they spend on project work.</p>
<p>I would like to hear your experiences regarding swarming and maintaining reserves - please share by leaving a comment.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/YwJc0s0BKkI9wyS9GFVBHaCHQ0o/0/da"><img src="http://feedads.g.doubleclick.net/~a/YwJc0s0BKkI9wyS9GFVBHaCHQ0o/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/YwJc0s0BKkI9wyS9GFVBHaCHQ0o/1/da"><img src="http://feedads.g.doubleclick.net/~a/YwJc0s0BKkI9wyS9GFVBHaCHQ0o/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/ProfessionalSoftwareDevelopment?a=ecikMWINfnQ:rMLk_i10opg:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/ProfessionalSoftwareDevelopment?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ProfessionalSoftwareDevelopment?a=ecikMWINfnQ:rMLk_i10opg:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/ProfessionalSoftwareDevelopment?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/ProfessionalSoftwareDevelopment/~4/ecikMWINfnQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.basilv.com/psd/blog/2012/meeting-milestones-via-swarming-and-reserves/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.basilv.com/psd/blog/2012/meeting-milestones-via-swarming-and-reserves</feedburner:origLink></item>
		<item>
		<title>My System for Writing</title>
		<link>http://feedproxy.google.com/~r/ProfessionalSoftwareDevelopment/~3/cPZodX1Hc24/my-system-for-writing</link>
		<comments>http://www.basilv.com/psd/blog/2012/my-system-for-writing#comments</comments>
		<pubDate>Wed, 25 Jan 2012 13:23:47 +0000</pubDate>
		<dc:creator>Basil Vandegriend</dc:creator>
				<category><![CDATA[productivity]]></category>
		<category><![CDATA[continuous improvement]]></category>
		<category><![CDATA[personal development]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[writing]]></category>

		<guid isPermaLink="false">http://www.basilv.com/psd/?p=767</guid>
		<description><![CDATA[People from time to time ask me how I manage to write all the articles on my website despite having a family and a demanding full-time job. My simplistic, off-the-cuff answer is "one sentence at a time" :) Seriously, however, over the years I have developed a personal writing system that I would like to [...]]]></description>
			<content:encoded><![CDATA[<p>People from time to time ask me how I manage to write all the articles on my website despite having a family and a demanding full-time job. My simplistic, off-the-cuff answer is "one sentence at a time" :) Seriously, however, over the years I have developed a personal writing system that I would like to share with you. My system consists of three interdependent aspects: <em>time</em>, <em>discipline</em>, and <em>motivation</em>.</p>
<h3>Time</h3>
<p>The first key is to make time to write. Ideally this should be a decent period of time each day during which you are undisturbed and at peak mental capacity.</p>
<p>The minimum period of time that I find effective is usually around 15 - 30 minutes. This is because it sometimes takes time to get into a good flow of writing. The maximum period of time that I find effective ranged from 45 minutes to 1.5 hours. This maximum is based on how well I can maintain my flow of writing and my motivation / discipline. If I get stuck, especially on a new section for which I do not have a clear outline, I tend to stop and let it percolate in the back of my mind. The longer the writing session goes, the more likely I am to run out of steam (motivation / discipline) - e.g. by getting distracted by email or my RSS reader. I find that practically this means that I am generally unable to continue writing for more than 1.5 hours.</p>
<p>So how do I find the time to write? I get up early each morning, before the rest of my family, and use the time to write. I sometimes write in the evening, but I find I often do not have the mental energy for this after a long day at work. So I tend to save the evenings for other activities, such as exercising, and dedicate the mornings to writing. Successfully doing this day after day takes motivation and discipline.</p>
<h3>Motivation</h3>
<p>The second aspect of my system is maintaining a high level of motivation. I have found that if I am not motivated to write regarding a particular topic or section then my progress is usually quite slow and I am easily distracted. </p>
<p>One way I keep my motivation high is extremely simple: I primarily choose topics that I am motivated to write about. When a new idea comes along, motivation to write about it is usually quite high initially and decays over time. So the ideal is to start writing about such ideas immediately. Other times I am wrestling with a topic at work or researching it on my own and gain some insights that I feel like sharing. </p>
<p>My motivation in these cases is linked to the goal of helping others learn and grow, which is part of <a href="http://www.basilv.com/psd/blog/2009/evolving-my-vision-and-mission">my professional vision</a>. In some cases, as I have started writing about an idea, I realized that I only had a sentence or two of meaningful content, which by my standards is not enough to share via an article. This typically rapidly deflates my motivation, and I move on to a different idea. </p>
<p>This concept of linking the act of writing to the achievement of a larger, more personally-meaningful goal is another valuable technique for boosting motivation. In the last year I have started to tackle some larger projects (which is one reason for the decrease in my posting frequency), and I find that having this linkage is extremely powerful in maintaining motivation over the long term. Having this motivation helps in dedicating the time to write.</p>
<p>Motivation is powerful, but it tends to fluctuate. When motivation fades, discipline is needed to maintain consistency of purpose.</p>
<h3>Discipline</h3>
<p>The final key to my system of writing is discipline - consistently applying deliberately-designed techniques and practices that help me write. Discipline has also helped me discover these methods through ongoing <a href="http://www.basilv.com/psd/blog/2009/continuous-improvement-framework">reflection and improvement</a> on what is working versus what is not </p>
<p>A large part of discipline is consistency, which helps build up productive practices into positive habits. One example is my practice of getting up early each morning to write - I do this every morning, weekends as well as workdays. </p>
<p>I have found that there is an initial hurdle to overcome when sitting down to write, especially if I am struggling with a section. This difficulty often caused me to switch to email or the web as a distraction from which I tended not to emerge, resulting in me making no progress for that block of time. One practice I have developed to overcome this is to have a firm plan in mind the night before of what specifically I am going to write the next morning. As I get up in the morning, I immediately begin recalling my plan as a way to help prime my mind for action. Not only does this help me stay focused, but I also find it reduces the start-up time necessary to get into the flow, thus allowing me to be productive with even a short block of time.</p>
<p>Outlines are another practice I regularly use, even for short pieces of writing such as this article. These outlines are often quite informal, focusing on the main points I plan to write about. The purpose is not to identify all the content, or how it is organized - I often add more points that come to mind as I write, or restructure as the material comes together. Instead, I use outlines to help eliminate one of the causes of getting stuck - not knowing what content to write about. (It is still possible, unfortunately, to get stuck regarding <em>how</em> to write the content.) Outlines are also helpful in dividing the writing into sections: each section acts as a mini-milestone that I can aim to complete during a writing session, thus helping me remain motivated to write.</p>
<p>I have a technique for maintaining the flow while writing and minimizing distractions that involves the use of 'todo' labels. The general idea is that when I identify something to do or consider that falls outside my current focus, I document it with a 'todo' prefix. This keeps it preserved for later action, which helps to get it out of my mind now. Here are some common examples of how I employ this technique:</p>
<ul>
<li>When I want to link to an article on my website or elsewhere, I leave a 'todo'. Finding the link is often quite quick, but I do this to avoid distractions.</li>
<li>When I have an idea for a piece of content for a future, unwritten section, I jot down a brief note with a 'todo' in that section, then return to what I was writing.</li>
<li>When I get quite stuck on a particular paragraph or section, I leave a 'todo' comment and switch to another area. This is especially common when I have a long list of points outlined: I start writing the points for which I have the most motivation, leaving 'todo' flags on ones I skip. I then use the momentum I have built writing these more motivating points combined with the promise of almost being done them all to return to these few remaining points and grind them out.</li>
<li>When I have an outline consisting of sections, like this article does, I start by writing down the section headings with 'todo' labels on each. This serves as a road-map for me to follow while writing. It also helps me see the overall structure of what I am writing.</li>
</ul>
<p>This is my system for writing - it may not work for you. But I do suggest at least experimenting with some of these techniques and practices if you have not tried them before. I encourage you to leave a comment describing what practices or techniques you have found helpful.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/8dwjOtAuIUlb982JggA0DMQMaVU/0/da"><img src="http://feedads.g.doubleclick.net/~a/8dwjOtAuIUlb982JggA0DMQMaVU/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/8dwjOtAuIUlb982JggA0DMQMaVU/1/da"><img src="http://feedads.g.doubleclick.net/~a/8dwjOtAuIUlb982JggA0DMQMaVU/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/ProfessionalSoftwareDevelopment?a=cPZodX1Hc24:-MEB3I6VTnU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/ProfessionalSoftwareDevelopment?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ProfessionalSoftwareDevelopment?a=cPZodX1Hc24:-MEB3I6VTnU:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/ProfessionalSoftwareDevelopment?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/ProfessionalSoftwareDevelopment/~4/cPZodX1Hc24" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.basilv.com/psd/blog/2012/my-system-for-writing/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.basilv.com/psd/blog/2012/my-system-for-writing</feedburner:origLink></item>
		<item>
		<title>EnvGen Version 1.4 Available</title>
		<link>http://feedproxy.google.com/~r/ProfessionalSoftwareDevelopment/~3/kTggj4orJJs/envgen-version-1-4-available</link>
		<comments>http://www.basilv.com/psd/blog/2011/envgen-version-1-4-available#comments</comments>
		<pubDate>Tue, 20 Dec 2011 04:50:06 +0000</pubDate>
		<dc:creator>Basil Vandegriend</dc:creator>
				<category><![CDATA[miscellaneous]]></category>
		<category><![CDATA[EnvGen]]></category>

		<guid isPermaLink="false">http://www.basilv.com/psd/?p=757</guid>
		<description><![CDATA[I have just released version 1.4 of EnvGen. It is available for download from my Software page. The major changes in this release include the following: Upgrade to Java 5 compatiblity. This version of EnvGen will no longer work with Java 1.4. Migrate source code repository to GitHub at basilv/EnvGen. All known defects are now [...]]]></description>
			<content:encoded><![CDATA[<p>I have just released version 1.4 of EnvGen. It is available for download from my <a href="http://www.basilv.com/psd/software">Software</a> page. The major changes in this release include the following:</p>
<ul>
<li>Upgrade to Java 5 compatiblity. This version of EnvGen will no longer work with Java 1.4.</li>
<li>Migrate source code repository to GitHub at <a href="http://github.com/basilv/EnvGen">basilv/EnvGen</a>. All known defects are now listed there.</li>
<li>Fixed defect: <a href="https://github.com/basilv/EnvGen/issues/2">Allow comments without commas in first row of csv file</a>.
<li>Upgraded to FreeMarker 2.3.18.</li>
</ul>
<p>EnvGen is an <a href="http://ant.apache.org/">Ant</a> task for generating different versions of the same file parameterized for different environments (e.g. development, test, and production). You can read more about EnvGen in the <a href="http://www.basilv.com/psd/software-files/EnvGen/index.html">EnvGen Release Documentation</a>.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/D2B9sbdceSDUUhcdWyk7CaQofW0/0/da"><img src="http://feedads.g.doubleclick.net/~a/D2B9sbdceSDUUhcdWyk7CaQofW0/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/D2B9sbdceSDUUhcdWyk7CaQofW0/1/da"><img src="http://feedads.g.doubleclick.net/~a/D2B9sbdceSDUUhcdWyk7CaQofW0/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/ProfessionalSoftwareDevelopment?a=kTggj4orJJs:947V-15tUeg:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/ProfessionalSoftwareDevelopment?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ProfessionalSoftwareDevelopment?a=kTggj4orJJs:947V-15tUeg:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/ProfessionalSoftwareDevelopment?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/ProfessionalSoftwareDevelopment/~4/kTggj4orJJs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.basilv.com/psd/blog/2011/envgen-version-1-4-available/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.basilv.com/psd/blog/2011/envgen-version-1-4-available</feedburner:origLink></item>
		<item>
		<title>The Importance of Hiring</title>
		<link>http://feedproxy.google.com/~r/ProfessionalSoftwareDevelopment/~3/iJQomERJJKQ/the-importance-of-hiring</link>
		<comments>http://www.basilv.com/psd/blog/2011/the-importance-of-hiring#comments</comments>
		<pubDate>Mon, 12 Dec 2011 13:33:56 +0000</pubDate>
		<dc:creator>Basil Vandegriend</dc:creator>
				<category><![CDATA[management]]></category>
		<category><![CDATA[hiring]]></category>

		<guid isPermaLink="false">http://www.basilv.com/psd/?p=753</guid>
		<description><![CDATA[One of my many responsibilities at work as part of my role as Java Practice Lead is the hiring of Java programmers, developers, and architects in collaboration with human resources. Recently I have been adjusting our hiring process and clarifying the roles and people involved. I am always juggling a multitude of requests and demands [...]]]></description>
			<content:encoded><![CDATA[<p>One of my many responsibilities at work as part of my role as Java Practice Lead is the hiring of Java programmers, developers, and architects in collaboration with human resources. Recently I have been adjusting our hiring process and clarifying the roles and people involved. I am always juggling a multitude of requests and demands for my time, balancing what is important short-term versus long-term and what is truly urgent versus what is artificially or superficially urgent. So when I focused on hiring, I was acutely aware of the other activities that I was deferring or ignoring. </p>
<p>As I often do, I found myself reflecting at the end of these days as to whether I had properly prioritized my time. I could have been resolving tricky technical issues and advancing progress towards our desired future state in terms of architecture, technology, and development practices. But I am only one person. I realized that the focus on growing our group of solid Java developers and architects would pay off in the long run by increasing the overall capacity of problem-solving and progress-advancing. </p>
<p>Another consideration is that the implementation of the improvements that I wanted to see happen are limited by the capabilities and knowledge of the developers who actually put these things into practice. In the past, I have experienced problematic developers who inadvertently introduce issues that others are stuck resolving and use older technologies and/or less-effective practices through lack of awareness or poor habits. Hiring highly capable developers, in contrast, makes it much easier to make progress on these improvements. So for a limited short-term investment of my time, focusing on hiring has staggeringly immense long-term benefits.</p>
<p>The above logic regarding my personal limits apply just as equally to my direct involvement with hiring. As much as I may like to personally interview each applicant, I simply do not have the time, especially during hiring booms. So my objective in working on the hiring process is to put a system in place that can, if need be, operate without my involvement while obtaining the same results.</p>
<p>I received feedback recently from one director that the new hires we have brought on since my involvement in hiring have been almost entirely working out just fine. This is very rewarding to hear and is confirmation that my efforts in building an effective hiring system have indeed paid off.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/VhPvTXLMsqGvKOBwPWNFYc7Ff60/0/da"><img src="http://feedads.g.doubleclick.net/~a/VhPvTXLMsqGvKOBwPWNFYc7Ff60/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/VhPvTXLMsqGvKOBwPWNFYc7Ff60/1/da"><img src="http://feedads.g.doubleclick.net/~a/VhPvTXLMsqGvKOBwPWNFYc7Ff60/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/ProfessionalSoftwareDevelopment?a=iJQomERJJKQ:FfPJqAZNQCE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/ProfessionalSoftwareDevelopment?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ProfessionalSoftwareDevelopment?a=iJQomERJJKQ:FfPJqAZNQCE:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/ProfessionalSoftwareDevelopment?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/ProfessionalSoftwareDevelopment/~4/iJQomERJJKQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.basilv.com/psd/blog/2011/the-importance-of-hiring/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://www.basilv.com/psd/blog/2011/the-importance-of-hiring</feedburner:origLink></item>
		<item>
		<title>Announcing my Professional Software Development Email List</title>
		<link>http://feedproxy.google.com/~r/ProfessionalSoftwareDevelopment/~3/7mBTTSXgVF0/announcing-my-professional-software-development-email-list</link>
		<comments>http://www.basilv.com/psd/blog/2011/announcing-my-professional-software-development-email-list#comments</comments>
		<pubDate>Thu, 24 Nov 2011 13:07:21 +0000</pubDate>
		<dc:creator>Basil Vandegriend</dc:creator>
				<category><![CDATA[miscellaneous]]></category>
		<category><![CDATA[PSD email list]]></category>
		<category><![CDATA[website]]></category>

		<guid isPermaLink="false">http://www.basilv.com/psd/?p=744</guid>
		<description><![CDATA[I am pleased to announce the creation of my Professional Software Development email list for this website. This list will allow you to receive my blog articles (two per month on average) as well as useful newsletters containing exclusive information not available on my website plus announcements and special offers. My standard for blog articles [...]]]></description>
			<content:encoded><![CDATA[<p>I am pleased to announce the creation of my Professional Software Development email list for this website. This list will allow you to receive my blog articles (two per month on average) as well as useful newsletters containing exclusive information not available on my website plus announcements and special offers. </p>
<p>My standard for blog articles is to provide meaningful, substantial content - usually a minimum of 500 words. There are exceptions, such as this post :) I sometimes have short thoughts and insights to share or come across interesting articles or videos that don't meet this standard. I'm planning to assemble these tidbits into an occasional email newsletter (probably no more than once or twice per month) as a special bonus for subscribers to my list.</p>
<p>Visit <a href="http://www.basilv.com/psd-list-signup">basilv.com/psd-list-signup</a> to subscribe or use the signup form on the right sidebar of my website. Your email address will of course <em>never</em> be shared and you can unsubscribe at any time.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/HzBA5O_L_NCisjGBoXcb3GmQToc/0/da"><img src="http://feedads.g.doubleclick.net/~a/HzBA5O_L_NCisjGBoXcb3GmQToc/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/HzBA5O_L_NCisjGBoXcb3GmQToc/1/da"><img src="http://feedads.g.doubleclick.net/~a/HzBA5O_L_NCisjGBoXcb3GmQToc/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/ProfessionalSoftwareDevelopment?a=7mBTTSXgVF0:hXklyxbop3o:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/ProfessionalSoftwareDevelopment?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ProfessionalSoftwareDevelopment?a=7mBTTSXgVF0:hXklyxbop3o:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/ProfessionalSoftwareDevelopment?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/ProfessionalSoftwareDevelopment/~4/7mBTTSXgVF0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.basilv.com/psd/blog/2011/announcing-my-professional-software-development-email-list/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.basilv.com/psd/blog/2011/announcing-my-professional-software-development-email-list</feedburner:origLink></item>
	</channel>
</rss>

