<?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"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Basil Vandegriend: Professional Software Development &#187; professional</title>
	<atom:link href="http://www.basilv.com/psd/blog/category/professional/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.basilv.com/psd</link>
	<description></description>
	<lastBuildDate>Wed, 16 May 2012 13:28:15 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Most Disturbing Code</title>
		<link>http://www.basilv.com/psd/blog/2011/most-disturbing-code</link>
		<comments>http://www.basilv.com/psd/blog/2011/most-disturbing-code#comments</comments>
		<pubDate>Mon, 27 Jun 2011 13:32:07 +0000</pubDate>
		<dc:creator>Basil Vandegriend</dc:creator>
				<category><![CDATA[coding]]></category>
		<category><![CDATA[professional]]></category>
		<category><![CDATA[code review]]></category>
		<category><![CDATA[mission]]></category>
		<category><![CDATA[software development]]></category>

		<guid isPermaLink="false">http://www.basilv.com/psd/?p=662</guid>
		<description><![CDATA[One question I often ask when giving job interviews is "What do you find most disturbing when reviewing code?" The answers I receive are especially interesting when compared to the interviewee's results doing an actual code review: it is rare for them to identify the problems they consider the most disturbing. This lack of congruence [...]]]></description>
			<content:encoded><![CDATA[<p>One question I often ask when giving job interviews is "What do you find most disturbing when reviewing code?" The answers I receive are especially interesting when compared to the interviewee's results doing an actual code review: it is rare for them to identify the problems they consider the most disturbing. This lack of congruence between what people say they do and what they actually do is not unusual - it is a common problem, for example, when using market focus groups. </p>
<p>This chain of thought then prompted me to ask myself this same question. What do <em>I</em> find most disturbing when reviewing code? My instinctive reaction was to answer "defects", but upon a little reflection I realized this was not true - I expect to find defects as a <a href="http://www.basilv.com/psd/blog/2011/top-seven-quality-principles-in-software-development">fundamental principle of quality</a>. So it usually does not bother me to find a few during a review. </p>
<p>There are times when I am very disappointed when reviewing code - what am I finding at those times? Here are some specific occurrences:</p>
<ul>
<li>Code riddled with defects reflecting a fundamental lack of understanding about the requirements.</li>
<li>Code very difficult to understand due to poor names and overly complicated logic that seemed repetitive or unnecessary.</li>
<li>A large amount of non-GUI code written without any supporting tests.</li>
<li>Code with inconsistent formatting and style.</li>
</ul>
<p>What is the common theme here? After further reflection, I realized that the common element underlying these situations that I find most disturbing is a lack of professionalism / craftsmanship. This can manifest in a number of ways as indicated by the above list. The key criteria is whether a developer is helping achieve or is hindering <a href="http://www.basilv.com/psd/blog/2008/our-mission-as-software-developers">our mission as software developers</a>, based on what they produce for code. My evaluation of what is most disturbing is at its essence based on my core values and beliefs concerning software development.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.basilv.com/psd/blog/2011/most-disturbing-code/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How Should You Feel About Defects</title>
		<link>http://www.basilv.com/psd/blog/2011/how-should-you-feel-about-defects</link>
		<comments>http://www.basilv.com/psd/blog/2011/how-should-you-feel-about-defects#comments</comments>
		<pubDate>Tue, 12 Apr 2011 16:19:39 +0000</pubDate>
		<dc:creator>Basil Vandegriend</dc:creator>
				<category><![CDATA[professional]]></category>
		<category><![CDATA[corporate culture]]></category>
		<category><![CDATA[defects]]></category>
		<category><![CDATA[quality]]></category>
		<category><![CDATA[software development]]></category>

		<guid isPermaLink="false">http://www.basilv.com/psd/?p=627</guid>
		<description><![CDATA[I have recently observed myself and others having a variety of reactions when defects are found ranging between the extremes of elation and despair. How should we feel when defects are discovered? Should this vary by role? Role-Based Attitudes I will first answer this question on a role by role basis, starting with the role [...]]]></description>
			<content:encoded><![CDATA[<p>I have recently observed myself and others having a variety of reactions when defects are found ranging between the extremes of elation and despair. How should we feel when defects are discovered? Should this vary by role? </p>
<h3>Role-Based Attitudes</h3>
<p>I will first answer this question on a role by role basis, starting with the role of tester. Since one of the primary objectives and professional skills of testers is to find defects, I would expect them to generally be happy when they find problems. The more significant (e.g. critical) the defect or more tricky to find, the happier I would expect them to be. If the defects are trivially easy to find, or are so serious that they prevent further testing, then I could see testers getting upset because they are prevented from exercising their craft to the fullest level of their capabilities. </p>
<p>What about developers? When developers find defects in <em>other</em> people's code, perhaps via a code review, this is fairly similar to the tester role above so I would expect developers should generally be happy in this scenario. </p>
<p>When a developer finds a defect in their own code as part of the development process - e.g. by having an automated test that unexpected fails after a code change then how should they feel? It is only natural to feel some disappointment at having made a mistake, but I do not believe this is the best reaction. In fact, it may be harmful. If you experience mild distress or pain whenever you find your own defects, you may subconsciously start to try to avoid the pain by, for example, doing less testing. So I believe a better reaction is to be happy when you find your own defects. This may seem challenging to do, but consider these rationale:</p>
<ul>
<li>Finding the defect validates your skill at performing whatever defect detection activity you were doing - whether it was automated testing or personal code review - and reinforces the value of performing that activity.</li>
<li>Discovering this defect provides a learning opportunity on how you might better prevent or detect this type of defect in the future. Learning opportunities are good.</li>
<li>As a professional, you want to pass along high quality code. Every defect you find in your own code is one less defect others will find, thus raising the quality of your final output.
</li>
</ul>
<p>The final scenario to consider is when someone else finds defects in the developer's code. A typical example is when the developer considers a feature finished and a tester is testing it. Now this must be bad, right? Even more than the prior scenario it seems natural to feel disappointment. Each defect that is discovered is essentially downgrading the quality of what you have produced. However, some of the reasons we listed previously for feeling positive still apply. In particular if the defect was still found within the team rather than being passed along to the end user or client, then this is a good thing. It can be hard to see this as a developer when it is your code at fault. </p>
<p>So let us consider the final role: that of the team lead or manager who is supervising activity rather than specifically doing coding or testing. This role has no personal stake in individual defects, but instead is typically concerned about the broader implications to the project or product. Assuming that high quality is a key objective, how should such individuals feel about defects? One tendency is to react negatively because of the extra effort and schedule time required to fix defects. Finding too many defects can also lead to alarm bells over the level of quality. I feel that since the team lead or manager essentially represents the whole team, their reaction should correspond to the perspective of the entire team.</p>
<h3>Team-Based Attitudes</h3>
<p>So what should the attitude of the team as a whole be to discovering defects? To properly answer this question we need to know what the team's objective is. I am going to assume it is to <a href="http://www.basilv.com/psd/blog/2008/our-mission-as-software-developers">build working software that is being used and meeting users' needs</a>. The <em>existence</em> of defects is clearly bad since they threaten this objective. But what about the <em>discovery</em> of defects? Discovering a defect means the team gains more information about the state of the software which it will typically use to improve the software by fixing the defect, and which the team can also use as feedback to improve. </p>
<p>Discovered defects exist prior to being found, but the team does not know about them until the time of discovery. This means that the team should experience simultaneous conflicting reactions: happy that the defect was discovered, yet unhappy that the defect exists.</p>
<h3>Individual Attitudes</h3>
<p>So what should the attitude of the various individuals on a team be towards defects? Should it be based on their role? I believe that in an ideal team every individual will understand and adopt the common objectives of the team. This means that everyone's attitude towards defects should ideally be the same, no matter what the role. </p>
<p>As I have observed, in practice attitudes tend to be quite far from this ideal state. People maintain their own personal objectives and viewpoint in addition to or instead of the team's. Often they do not appreciate the distinction between discovering defects and the existence of defects. To correct this I believe team members need to be clear on the team's objectives and understand how the existence and discovery of defects impacts these objectives. I hope this article will help in that regard.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.basilv.com/psd/blog/2011/how-should-you-feel-about-defects/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Contribution as a Function of Difficulty</title>
		<link>http://www.basilv.com/psd/blog/2010/contribution-as-a-function-of-difficulty</link>
		<comments>http://www.basilv.com/psd/blog/2010/contribution-as-a-function-of-difficulty#comments</comments>
		<pubDate>Mon, 23 Aug 2010 14:00:37 +0000</pubDate>
		<dc:creator>Basil Vandegriend</dc:creator>
				<category><![CDATA[professional]]></category>
		<category><![CDATA[productivity]]></category>
		<category><![CDATA[project management]]></category>

		<guid isPermaLink="false">http://www.basilv.com/psd/?p=536</guid>
		<description><![CDATA[In my prior article on capability for software developers I identified four measures for assessing a developer's capability. Three of these measures are closely related: the ability to work independent, the amount of assistance provided to team members, and the level of difficulty of tasks that can be handled independently. In this article I examine [...]]]></description>
			<content:encoded><![CDATA[<p>In my prior article on <a href="http://www.basilv.com/psd/blog/2010/capability-for-software-developers">capability for software developers</a> I identified four measures for assessing a developer's capability. Three of these measures are closely related: the ability to work independent, the amount of assistance provided to team members, and the level of difficulty of tasks that can be handled independently. In this article I examine this relationship in more detail. Each measure does have an aspect unrelated to the other measures which I do not discuss in this article. For example, the amount of assistance developer provides is determined in part by their willingness to help others. </p>
<p>The ability to work independently and the amount of assistance provided to others both correlate negatively with task difficulty and correlate positively with the level of contribution to the team. This similarity of relationship allows us to combine both the independence and assistance measures into what I call "net team contribution". Similar in concept to a financial balance sheet, net team contribution is calculated as contribution assets - personal achievements and the help provided to others - minus contribution liabilities – the help that others had to provide. </p>
<p>I explained in my prior article that there are two thresholds of task difficulty: the level of difficulty at which you start to require assistance, and the level of difficulty at which the task is so excessively difficult for you that it is completely beyond your capabilities. Relating these thresholds to net team contribution results in four zones of contribution. The graph below provides a visual representation showing net team contribution as a function of task difficulty.</p>
<img src="http://www.basilv.com/psd/wp-content/uploads/2010/08/ContributionVersusDifficulty1.png" alt="Contribution Versus Difficulty" title="Contribution Versus Difficulty" width="589" height="387" class="size-full wp-image-545" />
<p>The four contribution zones are as follows:</p>
<ol>
<li><em>Provide Assistance Zone</em>: The task is easy for you to complete. You can easily see the way through obstacles faced by others and can effectively help them with their issues. Working primarily on such tasks yourself probably is not the best use of your time.
</li>
<li><em>Independent Work Zone</em>: the task is just easy enough that you can work on it independently with minimal assistance, but it is still somewhat challenging.</li>
<li><em>Help Required Zone</em>: the task is difficult for you and you require some assistance to complete it. This zone starts at the first threshold of difficulty of requiring assistance.</li>
<li><em>Negative Contribution Zone</em>: the task is very difficult for you. You require so much assistance from others on the task that they are essentially doing it for you. It is more cost-effective for others to simply complete the task themselves. This zone starts before reaching the second threshold of excessive difficulty. </li>
</ol>
<p>Understanding these contribution zones and the underlying relationship between contribution and difficulty is helpful in ensuring a team is running smoothly. Is someone who has previously worked largely independently now struggling with a task? It is probably beyond their threshold of ease, so be sure to provide some assistance. If a developer is completely stuck and at a loss for how to proceed, the task may be completely beyond their abilities, in which case reassign it. When looking at the set of tasks to be tackled by the team within a single iteration, ensure there is a balance of complexity. Too few complex tasks leaves the more capable members under-utilized. Too many complex tasks is especially dangerous: it will result in the more capable members being too burdened by tasks near their level of ability to effectively provide the assistance required by the more junior members, while the juniors will be largely unable to make effective progress due to the complexity.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.basilv.com/psd/blog/2010/contribution-as-a-function-of-difficulty/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Capability for Software Developers</title>
		<link>http://www.basilv.com/psd/blog/2010/capability-for-software-developers</link>
		<comments>http://www.basilv.com/psd/blog/2010/capability-for-software-developers#comments</comments>
		<pubDate>Tue, 10 Aug 2010 13:00:56 +0000</pubDate>
		<dc:creator>Basil Vandegriend</dc:creator>
				<category><![CDATA[professional]]></category>
		<category><![CDATA[craftsmanship]]></category>
		<category><![CDATA[software development]]></category>

		<guid isPermaLink="false">http://www.basilv.com/psd/?p=533</guid>
		<description><![CDATA[I have recently been wrestling with the problem of clarifying the concept of capability levels for software developers. What does it mean to call a developer junior versus intermediate? How can a developer at one level progress to the next? How do you evaluate the capability of a developer? These questions and more formed the [...]]]></description>
			<content:encoded><![CDATA[<p>I have recently been wrestling with the problem of clarifying the concept of capability levels for software developers. What does it mean to call a developer junior versus intermediate? How can a developer at one level progress to the next? How do you evaluate the capability of a developer? These questions and more formed the parameters of my investigation.</p>
<h3>Defining Capability</h3>
<p>As I researched and reflected on this topic, I came to realize that the central core of the problem consisted of defining what capability means for software developers. <a href="http://en.wiktionary.org/wiki/capability">Wiktionary defines capability</a> as "the power or ability to generate an outcome". What is the desired outcome for developers? </p>
<p>The first answer that came to mind for me was "creating high-quality software", but on further reflection I realized this was too limited. Developers work as part of a team on a project to develop a piece of software. (I believe this is generally true if you include teams of one person - the developer working by themselves - and include extremely informal projects such as open source software development efforts with no explicitly-defined objectives, scope, budget, or end date.) It is the team outcome based on the <a href="http://www.basilv.com/psd/blog/2010/the-importance-of-defining-success">project success criteria</a> that matters. Based on the lean philosophy of optimizing the whole system instead of individual components, we need to consider the developer's contribution to the team / project rather than just their efforts in isolation. So how about defining the desired outcome as contributing to the success of the team and project? The problem now is that this is too general. It applies to every role on the team and does not differentiate how a developer contributes versus a tester, business analyst, or architect. The solution is to merge in my initial answer of "creating software" while considering the team context. Developers who mentor other developers and do code reviews are not directly creating software but are still make significant contributions to the team’s ability to create software. </p>
<p>My definition of capability for software developers therefore is the ability to contribute to the success of the team and project through creating software and helping other developers create software.</p>
<h3>Evaluating Capability</h3>
<p>This definition serves as a good starting point conceptually, but it is not enough on its own to provide clear guidance on how to evaluate developers. I did not want a long list of detailed criteria to use for an evaluation – just a few simple measures that logically derive from the definition.</p>
<p>The first measure is the ability to work independently to produce software. Independently means with a minimum of extra assistance. It does not mean working separated from the team. For example, I believe that all production code should be reviewed by a second developer. Having code reviewed does not affect the measure of working independently. In contrast, having poor quality code that the reviewer has to spend extra time reviewing and re-reviewing after fixes would reflect negatively on the measure. </p>
<p>One way of evaluating this is to determine how much support the developer needs from other team member in terms of the various team roles. Does the developer understand the business priorities and stay focused on the tasks for the most important functionality, or does the team lead or project manager need to spend extra time monitoring this and providing guidance? Can the developer create a functional design for a set of requirements that also meets all the non-functional requirements, or do they need significant help from the architect? Can they trouble-shoot problems, or do they need help from other developers?</p>
<p>The second measure is the magnitude (size/scope) and degree of complexity or difficulty of the work that can be easily performed independently. How hard or complex a task can the developer tackle without getting bogged down or stuck? Can they only handle small, clearly-defined tasks, or can they work on complex algorithms and large modules of an application with ease? This measure may seem similar to the first – both relate to working independently – but it is distinct. I think of this measure as assessing solely a developer's technical ability, while the first measure is broader. Most developers have two thresholds of complexity/magnitude: the first is the point when they need assistance to complete the work, and the second is the point when the task is completely beyond their capabilities. </p>
<p>The third measure is the level of quality of the developer's work. Quality is more than just a low defect count. Quality includes meeting non-functional requirements such as usability, maintainability, and performance in addition to functional correctness. Quality is also not limited solely to the software produced by the developer. Quality should be assessed for all a developer's work including activities like reviewing code, estimating tasks, and writing documentation. I like to use the term <a href="http://manifesto.softwarecraftsmanship.org/">craftsmanship</a> to describe this broad definition of quality. Others might prefer the term 'professionalism'. The reason I use the term 'quality' is because in my experience people hold widely varying definitions of the other terms, while definitions of 'quality' tend to be more similar. So asking people to assess developers in terms of quality has proven more useful than using these other, vaguer terms.</p>
<p>The fourth, and last, measure is the amount of assistance the developer provides to the rest of the team. Do they mentor more junior developers? Do they help diagnose a tricky defect? Do they provide advice on using some library? This measure is really assessing two different aspects: the first is the developer's willingness to help, and the second is the developer's ability to help. This second aspect is closely related to the first and second measures. A developer's overall level of ability with respect to the task determines whether they will need assistance, barely get by on their own, or easily do their work and have the capacity to provide assistance to others. </p>
<h3>Summary</h3>
<p>Capability for software developers is the ability to contribute to the success of the team and project through creating software and helping other developers create software. Use the following four questions to assess a developer’s capability:</p>
<ol>
<li>How well do they work independently without requiring the assistance of others?</li>
<li> How difficult a task in terms of complexity or scope can they handle easily?</li>
<li>What level of quality is their work at?</li>
<li>How much assistance do they provide to the rest of the team?</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.basilv.com/psd/blog/2010/capability-for-software-developers/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Would You Trust Your Life To Your Code?</title>
		<link>http://www.basilv.com/psd/blog/2009/would-you-trust-your-life-to-your-code</link>
		<comments>http://www.basilv.com/psd/blog/2009/would-you-trust-your-life-to-your-code#comments</comments>
		<pubDate>Fri, 16 Oct 2009 05:42:30 +0000</pubDate>
		<dc:creator>Basil Vandegriend</dc:creator>
				<category><![CDATA[professional]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[quality]]></category>
		<category><![CDATA[software development]]></category>

		<guid isPermaLink="false">http://www.basilv.com/psd/?p=445</guid>
		<description><![CDATA[Would you trust your life to your code? It is a simple question that you might find extreme. But is it really? You might argue that the answer to this question depends on the criticality of the software you are producing. Software like the control software for the space shuttle or software to control medical [...]]]></description>
			<content:encoded><![CDATA[<p>Would you trust your life to your code? It is a simple question that you might find extreme. But is it really? </p>
<p>You might argue that the answer to this question depends on the criticality of the software you are producing. Software like <a href="http://www.fastcompany.com/magazine/06/writestuff.html">the control software for the space shuttle</a> or software to control medical devices is literally life-critical: if the software fails, people can die. The majority of software, however, is far less critical. Business software, in particular, is often financially-critical (failure of the software leads to loss of money) rather than life-critical. So let me ask a related question. Would your trust your financial assets to your code? How much would you wager that your code is correct? </p>
<p>This question might still make you uncomfortable. If you are at all experienced as a software developer, I expect you know that everyone, no matter how experienced, introduces defects in the code they write. What matters in terms of correctness is the code that is shipped or released into production, and the quality level of this code depends on your team's overall software development process, not just your personal efforts. So the question could be applied instead to your team: would you trust your life or your financial assets to the software you deploy into production. (If you are working on the online banking / investment software that I use, I hope you do trust your personal assets to the software you write :)</p>
<p>Notwithstanding the efforts of your team, you personally need to be confident in the correctness of your code before you pass it on to others to review or test. Passing on code that you are not confident in is in essence passing on code that you suspect is wrong. Can you do this and call yourself a professional software developer? This is why I feel it is important to understand and be able to justify the correctness of every line of code you write. You ideally should be 100% sure that it is correct.</p>
<p>In the engineering profession engineers are legally required to stamp and sign the final version of engineering blueprints, documents and reports as a professional guarantee that they are correct.  The signing engineer is held personally responsible for failure: in serious cases engineers have received large fines and have had their professional status suspended or even terminated. The same legal strictures are not enforced for most software development, but if you want to call yourself a professional software developer you should feel that same sense of professional responsibility for the code you produce. </p>
<p>Even if the software you write is not life-critical, code is often reused, copied, or adapted. You just do not know where your code might end up. It is possible (although most probably very unlikely) that someone's life – maybe even your own – may end up depending on your code.</p>
<p>Would you trust your life to your code?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.basilv.com/psd/blog/2009/would-you-trust-your-life-to-your-code/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Evolving my Vision and Mission</title>
		<link>http://www.basilv.com/psd/blog/2009/evolving-my-vision-and-mission</link>
		<comments>http://www.basilv.com/psd/blog/2009/evolving-my-vision-and-mission#comments</comments>
		<pubDate>Tue, 16 Jun 2009 03:06:34 +0000</pubDate>
		<dc:creator>Basil Vandegriend</dc:creator>
				<category><![CDATA[professional]]></category>
		<category><![CDATA[learning]]></category>
		<category><![CDATA[mission]]></category>
		<category><![CDATA[personal development]]></category>

		<guid isPermaLink="false">http://www.basilv.com/psd/?p=413</guid>
		<description><![CDATA[If you are a regular reader you may have noticed that I use guiding statements like a vision or mission to motivate and inspire myself and clarify my future direction. The following articles contain some of my past efforts: My Vision for IT Our Mission as Software Developers Becoming a Champion of Continuous Improvement I [...]]]></description>
			<content:encoded><![CDATA[<p>If you are a regular reader you may have noticed that I use guiding statements like a vision or mission to motivate and inspire myself and clarify my future direction. The following articles contain some of my past efforts:</p>
<ul>
<li><a href="http://www.basilv.com/psd/blog/2006/my-vision-for-it">My Vision for IT</a></li>
<li><a href="http://www.basilv.com/psd/blog/2008/our-mission-as-software-developers">Our Mission as Software Developers</a></li>
<li><a href="http://www.basilv.com/psd/blog/2008/becoming-a-champion-of-continuous-improvement">Becoming a Champion of Continuous Improvement</a></li>
</ul>
<p>I recently drafted new vision and mission statements for the professional side of my life. While these statements significantly reuse my past efforts, I have also incorporated different elements that reflect new understandings or shifts in my thinking. This recent process has emphasized for me that I will never have a "final" vision or mission - these statements need to evolve (continuously improve :) to continue to reflect who I am and want to be. More mundanely, I am not satisfied with the current form of the statements: I think they can be made more concise and fluid. Writing these statements feels more like writing poetry than writing prose, and I am not a poet. </p>
<p>I have never clearly understood the difference between vision and mission statements. Years of reading bland, uninspiring corporate statements has probably not helped. I originally was planning to only draft a mission statement, but I discovered as I proceeded that I had two versions: one more concise but abstract, and the other more specific, containing phrases important to me that did not fit into the first version. Both statements resonated with me, so the former became my vision statement and the latter my mission statement. As a result, my mission statement is an expansion of my vision statement that makes it more concrete and more actionable. I may not have followed the <a href="http://en.wikipedia.org/wiki/Strategic_planning#Mission_statements_and_vision_statements">textbook definition of vision and mission statements</a>, but that does not matter. What is important is that these statements are meaningful to me. </p>
<p>Without further ado, here are my new vision and mission statements.</p>
<p>My professional vision is to:</p>
<blockquote style="font-size: large;"><p>
<em>Create</em> great software that makes a difference.<br />
<em>Pursue</em> mastery in the field of software development.<br />
<em>Inspire</em> others to do the same.
</p></blockquote>
<p>My professional mission is to:</p>
<blockquote style="font-size: large;"><p>
Create and inspire others to create<br />
working software that is being used and meeting users' needs<br />
through the disciplined application<br />
of effective software development practices<br />
 and to continuously improve and grow in my ability to do this.
</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.basilv.com/psd/blog/2009/evolving-my-vision-and-mission/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>100 Interview Questions to Ask Employers</title>
		<link>http://www.basilv.com/psd/blog/2009/100-interview-questions-to-ask-employers</link>
		<comments>http://www.basilv.com/psd/blog/2009/100-interview-questions-to-ask-employers#comments</comments>
		<pubDate>Sat, 07 Feb 2009 21:36:54 +0000</pubDate>
		<dc:creator>Basil Vandegriend</dc:creator>
				<category><![CDATA[professional]]></category>
		<category><![CDATA[interview]]></category>
		<category><![CDATA[IT careers]]></category>

		<guid isPermaLink="false">http://www.basilv.com/psd/?p=293</guid>
		<description><![CDATA[The interview process should ideally be an equal, two-way conversation between the interviewers for an employer and a potential employee. However, speaking as someone who has sat on both sides of the table, it has always seemed to me to be imbalanced towards the interviewers. They control the process and ask far more questions than [...]]]></description>
			<content:encoded><![CDATA[<p>The interview process should ideally be an equal, two-way conversation between the interviewers for an employer and a potential employee. However, speaking as someone who has sat on both sides of the table, it has always seemed to me to be imbalanced towards the interviewers. They control the process and ask far more questions than the interviewee. But it is just as important that the interviewee make sure the employer will be a good fit as it is that the interviewers ensure that the interviewee will be a good fit. It does neither side any good to have an unmotivated, unhappy employee looking for the first opportunity to leave, no matter how skilled they may be.</p>
<p>This point was brought to my attention again a few weeks ago when I read the article <a href="http://www.noop.nl/2009/01/100-interview-questions-for-software-developers.html">100 Interview Questions for Software Developers</a> by Jurgen. I liked the article and have used some of the questions, but it got me thinking that software developers and other I.T. professionals deserve to have the same resource – interview questions to ask of employers. So below I list 100 questions you should look for answers to during the interview process. Some of the questions are specifically for software developers, but many are more broadly applicable to any professional knowledge-worker position.</p>
<p><strong>Warning: Do not simply ask the interviewers these 100 questions in the first interview!</strong> Your first priority in an interview process is to convince the interviewers to hire you by selling yourself. The important but secondary priority is to determine that the company is a good fit. It does not matter how good a fit the company is if they will not hire you. (This reminds me of all the blog posts from people who interviewed for Google but did not get in.) So wait until the company is at least seriously interested, and better yet has extended an offer, before doing your due diligence and asking these questions. I would not recommend asking all of these questions directly of the interviewers, especially those from the human resources department, as they likely do not know what the specific working conditions are like and may sugar-coat the facts. I recommend instead talking directly to a few regular employees, preferably in a neutral setting outside of the office. </p>
<p>Without further ado here are the questions organized into categories.</p>
<ol>
<h3>Organization</h3>
<li>What drives the organization? What do senior executives value? What is important to them?</li>
<li>What are the core values that make up the organization's culture? Has this been consistently supported by  senior executives?</li>
<li>Is the organization financially strong and stable? Please provide your annual financial reports for the last three years. (This is available on-line for publicly-traded companies.)</li>
<li>What are the significant strengths, weaknesses, opportunities, and threats facing the organization over the next few years? What are the organization's strategic goals?</li>
<li>How does the department / team I will be joining relate to the overall organization? How does it support the organization's strategic goals? Is the department a cost or profit center? How is the department perceived politically?</li>
<h3>Management</h3>
<li>How often will my immediate supervisor meet with me one on one?</li>
<li>What is the management style of my immediate supervisor and their superior?</li>
<li>How do you deal with poorly performing employees?</li>
<li>What is your strategy for empowering employees?</li>
<li>How do you ensure you are delegating effectively rather than micro-managing?</li>
<li>How do you help ensure that employees are highly motivated?</li>
<li>How do you ensure that each employee is doing quality work?</li>
<li>How does management ensure that employees feel listened to?</li>
<li>How do you enhance the creativity of developers?</li>
<li>How approachable and receptive is management to suggestions and feedback?</li>
<li>How do you minimize interruptions for developers?</li>
<li>Do you treat people with respect and integrity? Provide an example.</li>
<li>How important is productivity of software developers to the organization? What do you do to maximize productivity?</li>
<li>Do you put as much if not more effort into retaining employees as you do recruiting? What is your retention strategy?</li>
<li>How do you promote a healthy work-life balance?</li>
<li>What metrics do you track and report on? Provide a report showing data from the last few months.</li>
<h3>Teams</h3>
<li>How are teams assembled? How are team members selected? What are the selection criteria?</li>
<li>How often will the team I am in meet as a group?</li>
<li>What do you expect will be my role on the team?</li>
<li>What are the experience levels (i.e. junior, intermediate, senior) and job roles of the other team members?</li>
<li>What is involved in moving to another team or changing work assignments?</li>
<li>Do teams have a sufficient diversity of skill beyond simply coding? What about ability in gathering requirements, architecture, usability design and testing, database design and administration, functional testing, and technical writing?</li>
<li>What types of team-building activities are done? How frequently?</li>
<li>Are teams empowered and self-organizing? Are teams able to choose and tailor a methodology to suit them and their work?</li>
<li>How much freedom and support is provided to mentor and consult with colleagues, superiors, and customers?</li>
<li>Describe the clients, customers and end users I will be working with or for. How reasonable and pleasant are they?</li>
<h3>Work Assignments</h3>
<li>What kind of work assignments will I be given? What will be my day-to-day responsibilities?</li>
<li>What opportunities will there be to work with new, interesting technologies?</li>
<li>How do you plan to provide me with challenging work that makes optimal use of my abilities while providing a supportive environment?</li>
<li>Are developers required to do administrative or non-value-add tasks that could be done more cost effectively by others?</li>
<h3>Work Environment</h3>
<li>Will I be situated in an office with a door?</li>
<li>Is the work environment quiet with no distracting noises like intercoms, call center staff, ventilation systems, or traffic?</li>
<li>Are living, green plants in abundance in the office?</li>
<li>Are high quality chairs provided?</li>
<li>Is the office setting (chair, desk, keyboard, and monitor) ergonomically friendly? Can I adjust the height of everything to fit my needs?</li>
<li>Do you supply at least two large monitors as a standard configuration for software developers?</li>
<li>Are software developers provided with high-powered workstations? How often are they upgraded?</li>
<li>Does the office setting support collaboration with coworkers? This includes at least one extra chair, the ability for two people to sit in front of the computer (i.e. pair programming), and a white board fixed onto a stable surface with room for at least three people to stand in front of it.</li>
<li>Will I be provided with an ergonomic keyboard and mouse to my specifications? Or can I purchase my own and expense it with no questions asked?</li>
<li>Will I have the freedom to install the tools I want on my workstation?</li>
<li>What is the process and lead time to get a new tool, workstation, or server purchased and installed? How much bureaucracy and delay is involved?</li>
<h3>Project Management</h3>
<li>Do projects have realistic schedules, resources, and scope that are actively managed and adjusted? How much freedom and control does the project manager / team have to change these three factors?</li>
<li>How do you deal with a project that is behind schedule?</li>
<li>How do you manage requests to change the scope or requirements of a project?</li>
<li>What tools and practices are used to manage project schedules?</li>
<li>Who estimates the time or effort required to do development work?</li>
<li>How is the expenditure of effort tracked? What tools are used for time entry and tracking progress?</li>
<li>What is the duration of iterations and releases?</li>
<h3>Development Practices</h3>
<li>What development methodologies do you use? Describe how they are put into practice.</li>
<li>How closely does development activities align with the philosophy &#038; principles of <a href="http://agilemanifesto.org/">Agile</a> and <a href="http://en.wikipedia.org/wiki/Lean_software_development">Lean</a>?</li>
<li>What languages, libraries, and frameworks are commonly used or mandated?</li>
<li>What developer tools (especially IDE) are provided or mandated?</li>
<p><strong>What do you do for:</strong></p>
<li>Version Control?</li>
<li>Unit Testing?</li>
<li>Code Reviews?</li>
<li>System &#038; Integration Testing?</li>
<li>Client / Customer / End User Collaboration?</li>
<li>Requirements / Design Specifications?</li>
<li>Design Reviews?</li>
<li>Defect Tracking?</li>
<li>Build Automation?</li>
<li>Continuous Integration?</li>
<li>Usability Testing?</li>
<h3>Continuous Improvement</h3>
<li>What continuous improvement activities are performed on a regular basis?</li>
<li>How often are retrospectives / lessons learned meetings held?</li>
<li>How aggressively do you minimize bureaucracy and non-value-add activities? Can you provide an example of improving in this regard in the last six months?</li>
<li>What is your process for handling suggestions and ideas from employees? How many suggestions per employee on average were received in the last year? How many were acted on?</li>
<h3>Professional Development</h3>
<li>Do you provide opportunities for developers to receive feedback and learn from having their software running in production?</li>
<li>What opportunities will I get to work with or mentor under expert world class software developers, architects, and managers?</li>
<li>How much paid training do you provide to each employee per year? What kind of training is it? Can employees choose or recommend the training they take?</li>
<h3>Performance Evaluation</h3>
<li>What kinds of opportunities for growth and advancement are possible? Describe the options for technical career paths that do not involve management.</li>
<li>How do you make decisions regarding promotions?</li>
<li>What approach is used for providing timely, effective feedback on performance? How are performance evaluations carried out?</li>
<li>What do you look for in an ideal employee?</li>
<h3>Working Hours</h3>
<li>What are the official number of hours worked per week?</li>
<li>How many hours per week on average have your software developers worked over the last three months?</li>
<li>Do you allow or expect mandatory overtime? What do you consider an unacceptable amount of overtime (both mandatory and voluntary)?</li>
<li>Do you provide flexible working hours? What limits are there?</li>
<h3>Compensation and Benefits</h3>
<li>Do you provide a competitive salary? What is your definition of competitive?</li>
<li>How do you ensure that the salary of long-term employees stays competitive, especially in a hot job market? Do you respect your long-term employees enough to raise their salaries in such situations without waiting for them to ask for raises?</li>
<li>How do you compensate for overtime?</li>
<li>Do you pay your software developers according to their level of productivity? Why or why not?</li>
<li>How many weeks per year of vacation do you offer?</li>
<li>How flexible are you concerning how banked vacation can be used? Can it be saved from year to year? Are there any restrictions on taking vacation?</li>
<li>What is your policy concerning raises? How regularly do you give raises? Do you consider a yearly increase in salary equal to the local inflation rate to be a raise?</li>
<li>How do you reward exceptional performance? What do you consider exceptional performance and how do you identify it?</li>
<li>Do you provide share options, profit sharing, retirement savings contributions, or pension? If so, what are the details of the plan(s)?</li>
<li>What medical benefits do you provide? Do you cover dental work or eyeglasses? Do you cover health preventative measures such as exercise programs, vitamins, or preventative medical exams?</li>
<li>What is your policy regarding sick days?</li>
<li>Do you allow and support people in working from home? Up to what percentage of the time?</li>
<li>Will travel be expected? If so, how frequently, for how long, to where? What is the policy on travel expenses?</li>
<li>What other benefits or perks do you provide?</li>
<h3>Contribution to Community</h3>
<li>How do you participate in and contribute to the local and global I.T. / software development community?</li>
<li>What open source software do you support? What form does this support take?</li>
<h3>Wrap-up Questions</h3>
<li>Who are you competing with locally for recruiting software developers? Who are you losing developers to?</li>
<li><em>Bonus Question</em>: Please provide three references consisting of employees I can talk to. The references should include a senior software developer and a technical lead.</li>
</ol>
<p>The vast majority of Internet resources for job interviews focus on questions to ask employees, but I did find a few relevant articles that were helpful in producing this list of questions:</p>
<ul>
<li><a href="http://www.joelonsoftware.com/articles/fog0000000043.html">The Joel Test from Joel On Software</a></li>
<li><a href="http://c2.com/cgi/wiki?DeveloperBillOfRights">C2's Developer's Bill of Rights</a></li>
<li><a href="">Jeff Atwood's Programmer's Bill of Rights</a></li>
<li><a href="http://www.career.vt.edu/Jobsearc/interview/AskQues.htm">http://www.career.vt.edu/Jobsearc/interview/AskQues.htm</a></li>
<li><a href="http://www.pohly.com/interview-2.html">http://www.pohly.com/interview-2.html</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.basilv.com/psd/blog/2009/100-interview-questions-to-ask-employers/feed</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Our Mission as Software Developers</title>
		<link>http://www.basilv.com/psd/blog/2008/our-mission-as-software-developers</link>
		<comments>http://www.basilv.com/psd/blog/2008/our-mission-as-software-developers#comments</comments>
		<pubDate>Sun, 12 Oct 2008 13:00:54 +0000</pubDate>
		<dc:creator>Basil Vandegriend</dc:creator>
				<category><![CDATA[professional]]></category>
		<category><![CDATA[mission]]></category>
		<category><![CDATA[software development]]></category>

		<guid isPermaLink="false">http://www.basilv.com/psd/?p=167</guid>
		<description><![CDATA[What is your mission as a software developer? What motivates you? I recently reflected on my values and goals as a software developer and ended up creating my own personal mission statement. I feel that one of the clauses in my mission is broadly applicable – certainly to my team and department at work, and [...]]]></description>
			<content:encoded><![CDATA[<p>What is your mission as a software developer? What motivates you? I recently reflected on my values and goals as a software developer and ended up creating my own personal mission statement. I feel that one of the clauses in my mission is broadly applicable – certainly to my team and department at work, and probably to most software developers in the industry. Here it is:</p>
<p style="font-size:large;margin-left:2em;">
Working Software
</p>
<p style="font-size:large;margin-left:2em;">
Being Used
</p>
<p style="font-size:large;margin-left:2em;">
Meeting Users' Needs
</p>
<p>This statement is deliberately formatted into three lines. Each line holds a specific meaning for me.</p>
<h3>Working Software</h3>
<p>This is fundamentally what software development is about. The software we produce needs to work. You may think this is too obvious a point. Over the last few years, however, I have witnessed (but fortunately never been part of) several software development projects that ended in failure because the software simply did not work – typically due to too many defects or performance issues.</p>
<p>It is no coincidence that one of the values of the <a href="http://agilemanifesto.org/">Agile Manifesto</a> is "Working Software over Comprehensive Documentation". I purposely chose the phrase "Working Software" in reference to this value. Some of the failed projects I witnessed had hundreds of pages of carefully written, reviewed, and signed-off documentation. But these documents become essentially worthless because the software did not work. </p>
<p>The mission to produce working software should motivate us both to produce quality code and to continually develop our abilities as software developers to improve in our ability to deliver working software. If this does not resonate with you, then I think you should carefully examine whether software development is the right career for you.  </p>
<p>I find it very rewarding to finish a section of code, see the green <a href="http://www.junit.org/">JUnit</a> bar or the user interface, and know that the software works. While this is a necessary first step – the foundation of what we do – there is much more to my mission. Once software works, the next step for it is... </p>
<h3>Being Used</h3>
<p>I mentioned above that application documentation for software that does not work is essentially worthless. Similarly, working software that is not being used has basically no value. You may disagree with this statement so I will offer another viewpoint: software that is being used is producing value. Unused software is not providing value, although it may have the potential to do so. </p>
<p>Why do I care about producing value? When I use the term "value" I do not mean financial benefit or revenue. In this context I define value to mean providing or being of benefit to people – contributing to their well-being. </p>
<p>Some developers may be satisfied with just producing working software even if it is not used. If given the choice, however, I think most developers would prefer to see their software being used – not just by themselves but by others. I personally derive an immense amount of satisfaction from seeing software I produced being used by actual users. My mission, therefore, is not just to produce working software but to ensure it ends up being used.</p>
<p>Having software be used is no guarantee that it is providing the maximum value possible to others, especially for enterprise software that users often have no choice about using. In order to maximize value,  software must not only be used but must be...</p>
<h3>Meeting Users' Needs</h3>
<p>How often have you used software that has repeatedly annoyed or upset you? Perhaps it has an illogical user interface or performs poorly. Perhaps it does not quite do what you need it to. You might use the software and get your task done, but it was not a pleasant or easy experience. How rewarding is it as a software developer to have your software being used but it causing the users to suffer?</p>
<p>To prevent this we must ensure that the software meets the needs of the users. What are the users really trying to accomplish with the software? I explicitly used the word "need" instead of "want". Users are typically quick to list "wants" that are not true needs. Delivering "wants" typically results in either unused software or unsatisfied users. Needs go deeper, ideally tapping into the mission that the users are seeking to accomplish with the software.</p>
<h3>The Process of Creation</h3>
<p>I went through many revisions of my mission statement before settling on the version presented in this article. I want to discuss some of the process and reasoning behind my mission to help you create your own.</p>
<p>Early in the process I arrived at the three phrase format with the progression between phases. This appealed to me on several levels. I liked the poetic style based loosely on Haiku. I am not into poetry normally, but expressing my mission in such a style represents the expression of my creative side, and not just my logical side, in the development of software. The progression between phases reminded me of <a href="http://en.wikipedia.org/wiki/Maslow%27s_hierarchy_of_needs">Maslow's hierarchy of needs</a>, with working software representing a survival need and the other phases loosely corresponding to esteem and self-actualization needs.</p>
<p>My first version using the three phase format was biased strongly towards enterprise software development, which I specialize in. This first version was: "Working Software, In Production, Meeting Business Needs". The two phrases "Working Software, In Production" are especially appropriate for enterprise maintenance teams since it also speaks to the necessity of keeping the software operational and incident-free in the production environment.</p>
<p>As I evolved this statement into a more general form, I struggled with the phrases "Being Used" and "Meeting Users' Needs". I worried initially that the "Being Used" phrase was redundant and could be eliminated. Further reflection, though, made me realize that the phrase "Meeting Users' Needs" is a little ambiguous on its own: is it referring only to writing software that meets users' needs, or is it referring to users using the software and having it meet their needs? I mean the latter, but it is all too easy as software developers to focus on just writing the software. Thus the importance of the phrase "Being Used" in explicitly stating that the software must be released and make its way into the hands of users. This is especially relevant in an enterprise environment with many hurdles to getting software into active use. </p>
<p>There are two points I tried to fit into my statement but ended up leaving out. The first was the notion of quality. I wanted to express the idea of taking pride as professionals in producing quality software. I did not want to use the word "quality" directly, however, due to its potential association with quality assurance and related aspects such as certifications and formal processes that I did not want reflected in my statement. Perhaps the simplest definition of quality is "fitness for use", and I feel that all three phrases of my mission link nicely into this definition.</p>
<p>The second point I wanted to bring into my statement was the ideal that software should delight users. "Meeting Users' Needs" taken to the highest level should delight users, but this seems like a bit of a stretch. One option I considered but rejected was to change the third phrase to be "Delighting Users".</p>
<h3>Conclusion</h3>
<p>My ultimate goal as a software developer is to make a positive contribution in the lives of others by helping them achieve their goals through the software I create. My mission represents the steps involved in achieving this goal:</p>
<p style="font-size:large;margin-left:2em;">
Working Software
</p>
<p style="font-size:large;margin-left:2em;">
Being Used
</p>
<p style="font-size:large;margin-left:2em;">
Meeting Users' Needs</p>
]]></content:encoded>
			<wfw:commentRss>http://www.basilv.com/psd/blog/2008/our-mission-as-software-developers/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Achieving Excellence in Software Development</title>
		<link>http://www.basilv.com/psd/blog/2007/achieving-excellence-in-software-development</link>
		<comments>http://www.basilv.com/psd/blog/2007/achieving-excellence-in-software-development#comments</comments>
		<pubDate>Wed, 01 Aug 2007 15:37:49 +0000</pubDate>
		<dc:creator>Basil Vandegriend</dc:creator>
				<category><![CDATA[professional]]></category>
		<category><![CDATA[personal development]]></category>
		<category><![CDATA[software development]]></category>

		<guid isPermaLink="false">http://www.basilv.com/psd/blog/2007/achieving-excellence-in-software-development</guid>
		<description><![CDATA[What is excellence in software development and how can you achieve it? This is a question of interest not only to software developers, but also to managers of software teams. I recent read the book First, Break All The Rules: What The Worlds Greatest Managers Do Differently which provides some great insights into this question. [...]]]></description>
			<content:encoded><![CDATA[<p>What is excellence in software development and how can you achieve it? This is a question of interest not only to software developers, but also to managers of software teams. </p>
<p>I recent read the book <a href="http://www.amazon.ca/gp/product/0684852861?ie=UTF8&#038;tag=basilvandegri-20&#038;linkCode=as2&#038;camp=15121&#038;creative=330641&#038;creativeASIN=0684852861">First, Break All The Rules: What The Worlds Greatest Managers Do Differently</a><img src="http://www.assoc-amazon.ca/e/ir?t=basilvandegri-20&#038;l=as2&#038;o=15&#038;a=0684852861" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /> which provides some great insights into this question. The book's content is based on in-depth interviews of over 80,000 managers that sought to determine what the top-performing managers across different industries and companies do differently than the majority. One point that was not surprising is that the greatest managers focus on achieving excellence within their teams - they are not content with merely average performance. But the strategies that these managers use in the pursuit of excellence do differ from what conventional wisdom suggests. </p>
<h3>Excellence is not achieved by studying and avoiding failure</h3>
<p>"Conventional wisdom asserts that good is the opposite of bad, that if you want to understand excellence, you should investigate failure and then invert it. ... Managers are far more articulate about service failure than they are about service success, and many still define excellence as 'zero defects'." (page 102. All quotes from "First, Break All the Rules")</p>
<p>"You cannot learn very much about excellence from studying failure. Of all the infinite number of ways to perform a certain task, most of them are wrong. There are only a few right ways. Unfortuntely, you don't come any closer to identifying those right ways by eliminating the wrong ways. Excellence is not the opposite of failure. It is just different. It has its own configuration, which sometimes includes behaviors that look surprisingly similar to the behaviors of your strugglers." (page 157)</p>
<p>Studying defect-ridden code may help you recognize design and coding approaches that cause defects, but this provides limited benefit if any in teaching you how to produce solid code. Furthermore, achieving zero defects in your code or in your software product is not a sufficient condition for excellence. Preventing and eliminating defects is important, and learning how to do so will make you a better developer. But there is much more to developing great software than correctly-behaving code: Is the code understandable? Easy to extend and alter? Easy to install or promote to production? Easy to diagnose problems in? Easy for users to use? Does it do what the users want and need it to? Looking at poor-quality or even average code will seldom reveal how to produce great software that can answer all these questions in the affirmative. </p>
<h3>Learn excellence by studying the best</h3>
<p>"The best way to investigate excellence is simply to spend a great deal of time with your top performers." (page 159) This statement is targetted at managers, who need to determine what factors contribute to excellence in order to be able to promote and recruit it. But the concept is equally applicable to software developers with no supervisory responsibility. In order for you as a developer to grow towards excellence, you need exposure to it. Studying great software developers and great software is one way of gaining that exposure. </p>
<p>If you are inexperienced, you face a chicken-and-egg problem of needing to first identify greatness in order to learn from it. I recommend starting with widely-recognized sources such as books, blogs of well-known developers and consultants, training courses, conferences, and open-source software as a source of code to study. You can also try to find one or more experienced developers within your organization to act as a mentor. The quality of such resources will vary, but over time as you learn and gain experience you will be able to better identify excellence. </p>
<p>The difficult part of this process is that mere exposure to excellence is not enough. You must reflect on what you are seeing in order to extract those crucial insights into the nature of excellence, and determine how you can apply them. One example of this from my own experience is from a number of years ago when I was trying to better understand how top developers do design and coding. I picked up the book <a href="http://www.amazon.ca/gp/product/0201485672?ie=UTF8&#038;tag=basilvandegri-20&#038;linkCode=as2&#038;camp=15121&#038;creative=330641&#038;creativeASIN=0201485672">Refactoring: Improving the Design of Existing Code</a><img src="http://www.assoc-amazon.ca/e/ir?t=basilvandegri-20&#038;l=as2&#038;o=15&#038;a=0201485672" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /> in order to learn about refactoring, but while reading it gained some important insights into how the author approaches design. In fact, I found that to be the most valuable aspect of the book.</p>
<p>Another example is from a presentation I heard from Bob Beck, one of the core set of developers for the <a href="http://www.openbsd.org/">OpenBSD</a> operating system. OpenBSD is best known for its focus on security, and I was able to gain some insights into the processes used by the core developers to achieve this. One key process is their regular use of code audits across the entire code base which are triggered when a defect or potential security hole is found somewhere in the code due to a bad coding construct (such as incorrect use of a C library function). The construct is first identified by <a href="http://www.basilv.com/psd/blog/2006/how-to-do-root-cause-analysis">root cause analysis</a> of the problem, and then the entire code base is inspected to eliminate any other occurrences. More details on this process are available at <a href="http://www.openbsd.org/security.html">http://www.openbsd.org/security.html</a>.</p>
<h3>Excellence takes talent</h3>
<p>"Skills, knowledge, and talents are distinct elements of a person's performance. The distinction among the three is that skills and knowledge can easily be taught [or learned], whereas talents cannot. ... Skills are the how-to's of a role. ... Your knowledge is simply 'what you are aware of'. There are two kinds of knowledge: factual knowledge - things you know; and experiential knowledge - understandings you have picked up along the way." (page 83) </p>
<p>"Talents are different phenomena altogether. Talents are the four-lane highways in your mind, those that carve your recurring patterns of thought, feeling, or behavior." (page 84)  </p>
<p>People can achieve average performance without talent, but true excellence requires talent. Talent is not, however, a binary have-it-or-not phenomena. There are a multitude of talents, and different roles require a different mix of them. One of the key points I took from the book is that everyone is talented - everyone has a particular mix of talents - and great managers excel at putting their people into the role best suited for their talents.</p>
<p>Even within software development, there are a number of roles requiring different talents. Or another way to look at it is that people have different talents which require different roles. One person may like to have their work clearly defined and prefer to start with a clear requirements or design specification. Another person might be careful and methodical, making them well-suited for doing code reviews or testing. Another person might be visual in nature and like designing or creating user interfaces or web sites. </p>
<p>The key for each of us is to identify our talents and make sure that the roles we take on fit with those talents. One way to determine this is to recognize when you are working on tasks that are a struggle, or are painful, or are de-motivating for you to do. These are potential signs that this type of work does not mesh with your talents.</p>
<h3>Excellence takes experience</h3>
<p>Across "diverse professions, it takes between ten and eighteen years before world-class competency is reached." (page 185). Even in someone with the perfect blend of talents, it takes time to amass the skills, factual knowledge, and most importantly experiential knowledge that are necessary for excelling at a role. </p>
<p>Many companies and even entire industries, however, pressure people to move up the organizational chart. Fancier titles, bigger perks, and probably most importantly larger salaries are all magnets attracting people up the corporate ladder. This not only prevents people from building sufficient experience for expertise in their original role, but also runs the risk of moving people out of a role for which they have the right talents, and moving them up into a role for which they are not talented. The net result: a formerly excellent employee becomes only an average or poor performer. This is a common problem in I.T., where star developers are promoted into team leads, project managers, or architects that require a significantly different set of talents, skills, and knowledge. I discussed this particular issue recently in my article <a href="http://www.basilv.com/psd/blog/2007/to-code-or-not-to-code">To Code or Not To Code</a>. This general problem has been identified a long time ago as the Peter Principle: people are promoted to their level of incompetence.</p>
<p>The book offers several suggestions at a corporate level for combating this promotion pressure. One idea is defining levels of achievement within a role - such as junior, intermediate, and senior software developer, so that promotions can happen without changing the nature of the role. A second idea is to offer wide, overlaping pay scales, so that an excellent senior developer, for example, would make significantly more than an in-experienced first-level manager.</p>
<h3>Achieving Excellence</h3>
<p>A summary of the steps for achieving excellence are as follows:</p>
<ol>
<li>Find a role that matches your talents.</li>
<li>Develop your skills and knowledge for the role by studying the best.</li>
<li>Spend the years gaining the necessary experience.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.basilv.com/psd/blog/2007/achieving-excellence-in-software-development/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>To Code or Not To Code</title>
		<link>http://www.basilv.com/psd/blog/2007/to-code-or-not-to-code</link>
		<comments>http://www.basilv.com/psd/blog/2007/to-code-or-not-to-code#comments</comments>
		<pubDate>Sat, 14 Jul 2007 14:48:56 +0000</pubDate>
		<dc:creator>Basil Vandegriend</dc:creator>
				<category><![CDATA[professional]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[IT careers]]></category>
		<category><![CDATA[software development]]></category>

		<guid isPermaLink="false">http://www.basilv.com/psd/blog/2007/to-code-or-not-to-code</guid>
		<description><![CDATA[To code or not to code, that is the question for senior software developers when they are presented with the opportunity to move into an architect, project manager or team lead position. Rob Walling recently wrote an excellent article titled Why Good Developers Are Promoted Into Unhappiness describing his unsatisfying experiences as a manager and [...]]]></description>
			<content:encoded><![CDATA[<p>To code or not to code, that is the question for senior software developers when they are presented with the opportunity to move into an architect, project manager or team lead position. Rob Walling recently wrote an excellent article titled <a href="http://www.softwarebyrob.com/archive/2007/07/06/Why_Good_Developers_Promoted_into_Unhappiness.aspx">Why Good Developers Are Promoted Into Unhappiness</a> describing his unsatisfying experiences as a manager and the problems that result from promoting star developers into non-development roles. Rob's article inspired me to contribute my own thoughts on this subject. </p>
<p>I have been thinking about this general topic for a while, as reflected in two of my recent articles titled <a href="http://www.basilv.com/psd/blog/2007/how-much-do-you-code">How Much Do You Code?</a> and <a href="http://www.basilv.com/psd/blog/2007/are-you-doing-enough-coding">Are You Doing Enough Coding?</a>. These articles have focused more on the amount of coding one does as a software developer, and point out that the more senior the developer, the less coding they tend to do. Rob's article, however, focuses on the separate (but related) issue of senior developers moving into non-development roles. I think there are three major forces pushing developers in this direction:</p>
<ol>
<li>Promotion from management. The top performers within a team are often the most likely to be promoted to lead the team, even if they and the corporation are better off if they remain developers. This is especially a problem in hierarchical organizations with no technical career path.</li>
<li>Desire to fix problems. As Rob pointed out, you may feel obliged to take on a leadership role in order to help your team or save your project. A contributing factor is the oft-mistaken belief that the new role will not take all of your time and that you will still have time to code.</li>
<li>Desire for new challenges. If you are feeling stale in your current role then advancing into a more senior position is often the most obvious choice. It is not, however, always the best choice.</li>
</ol>
<p>The correct answer to whether to continue to code or not depends entirely on you and your motivations. I recommend choosing the role that is most rewarding to you on a daily basis, and not choose a role based solely on its seniority, prestige, or salary level. Many developers end up unhappy in non-coding positions because they allowed external forces to push them away from coding. Unfortunately, it can be difficult to determine how much you will enjoy a role until you try it. And once you try a non-coding role, it can be difficult to move back to coding. This is when learning from the experiences of others can help. So here are some of mine.</p>
<p>I personally love coding – the act of creation, as Rob pointed out – and always have since I was young. I did my first coding as a kid on a Vic-20. So becoming a software developer was the obvious career for me. Early in my career I was offered and accepted the opportunity to become a team lead of a small team. I found that I could spend a little less than half my time coding. The other time was spent on administrative or project management activities. The exact percentage varied from week to week: there were some weeks with almost no coding, and other weeks with more. Even when I was involved with the code, a portion of this time was spent doing reviews and mentoring junior developers. The team size varied from three to seven subordinates. As the team grew, the less time I had to code. After a few years and the successful release of a new piece of software, I knew it was time for a change, partly to take on new challenges, and partly to do more coding. </p>
<p>I joined the architecture team within the same company and became involved in a project to build a new application framework. I was coding again full time together with some excellent experienced developers. Those were good times. Within six months, I was offered the architect team lead position, which I accepted partly because it had very limited administrative duties, so I was still able to devote a majority of my time to coding. I did become involved with some non-coding duties, such as a training initiative regarding the use of automated unit testing and mentoring, but I did not mind because I found both activities rewarding, though not without their frustrations. After a few years it was again time to move on.</p>
<p>I switched companies, joining CGI. I was going to be a development lead on a project, but CGI failed to win the bid. Instead, I joined a development project as a regular developer. I had no non-coding responsibilities, and the project was in the construction phase, so I got to do some of the most intensive coding of my career – probably 95% of my time. But like most development projects, it soon ended, and I moved onto a maintenance team as a senior developer. This was my first time in a pure maintenance role, and I discovered that there is definitely less time spent coding due to other responsibilities such as monitoring the operational production system and managing the process by which software changes were released into production. However, I found the role to be an incredible learning experience – check out some of my <a href="http://www.basilv.com/psd/blog/category/maintenance/">articles</a> I have written as a result. </p>
<p>A few years later I was offered another team lead position. By this point in my career, however, I knew that I needed to code at least a certain percentage of my time. The offered position was for a fairly large team with many administrative duties, which I knew would offer no time at all for coding, so I turned the position down. Instead, my role in my existing team has gradually transformed into an architect role, partly out of a desire to fix problems, and partly out of a desire for new challenges. This has led to a reduction in the amount of coding I do. I still get to do some, and I am mostly enjoying the challenges associated with the new role. But I am being careful to avoid moving any higher up as an architect. As an application architect in my existing role, I am still fairly close to the code. I know other application architects who are no longer involved with code, and once you become an enterprise architect that is guaranteed. </p>
<p>There is nothing intrinsically wrong with becoming an architect, team lead, or manager, but there is nothing intrinsically right about it either. The choice of whether to code or not is best based on your motivations. What do you want to do?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.basilv.com/psd/blog/2007/to-code-or-not-to-code/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

