<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns: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/" version="2.0">

<channel>
	<title>Building Better Software</title>
	
	<link>http://www.stellman-greene.com</link>
	<description>because people want their software to work</description>
	<lastBuildDate>Thu, 02 Aug 2012 18:52:15 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/BuildingBetterSoftware" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="buildingbettersoftware" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Scrum and Self-Organizing Teams</title>
		<link>http://www.stellman-greene.com/2012/06/10/scrum-and-self-organizing-teams/</link>
		<comments>http://www.stellman-greene.com/2012/06/10/scrum-and-self-organizing-teams/#comments</comments>
		<pubDate>Sun, 10 Jun 2012 18:44:10 +0000</pubDate>
		<dc:creator>Andrew Stellman</dc:creator>
				<category><![CDATA[Agile]]></category>

		<guid isPermaLink="false">http://www.stellman-greene.com/?p=636</guid>
		<description><![CDATA[The basic pattern for a Scrum project is simple, which makes it very attractive for teams who want to go agile. And if that were all it took to adopt Scum effectively, we'd all be running great agile teams! But many teams find that they run into trouble with their Scrum adoption, and usually end up with what feels like an "empty" implementation. We explore this in our new talk, Scrum and Self-Organizing Teams: Openness, Courage, Pigs, and Chickens.]]></description>
				<content:encoded><![CDATA[<blockquote><p>“Grand principles that generate no action are mere vapor. Conversely, specific practices in the absence of guiding principles are often inappropriately used.”</p>
<p>- Jim Highsmith, <em><a href="http://www.amazon.com/Agile-Project-Management-Creating-Innovative/dp/0321658396">Agile Project Management: Creating Innovative Products (2nd ed.)</a></em></p></blockquote>
<p><a href="http://www.stellman-greene.com/blog/wp-content/uploads/2012/06/Scrum-and-Self-Organizing-Teams-1.png"><img class="alignnone size-full wp-image-649" title="Scrum and Self-Organizing Teams: Courage, Openness, Pigs, and Chickens" src="http://www.stellman-greene.com/blog/wp-content/uploads/2012/06/Scrum-and-Self-Organizing-Teams-1.png" alt="" width="598" height="445" /></a></p>
<p>The board game Othello has the slogan, “A minute to learn, a lifetime to master.” This applies really well to a team that’s learning Scrum. The basic practices and mechanics of Scrum are straightforward, and not difficult to adopt. This is why many teams use Scrum as a starting point for going agile.</p>
<p>The basic pattern for a Scrum project is simple, which makes it very attractive for teams who want to go agile. And if that were all it took to adopt Scum effectively, we&#8217;d all be running great agile teams! But many teams find that they run into trouble with their Scrum adoption, and usually end up with what feels like an &#8220;empty&#8221; implementation. We explore this in our new talk, <a href="http://www.stellman-greene.com/blog/wp-content/uploads/2012/06/Scrum-and-Self-Organizing-Teams.pdf">Scrum and Self-Organizing Teams: Openness, Courage, Pigs, and Chickens</a> [pdf].</p>
<p><a href="http://www.stellman-greene.com/blog/wp-content/uploads/2012/06/Scrum-and-Self-Organizing-Teams-2.png"><img class="alignnone size-full wp-image-650" title="Scrum and Self-Organizing Teams: Basic Scrum Pattern" src="http://www.stellman-greene.com/blog/wp-content/uploads/2012/06/Scrum-and-Self-Organizing-Teams-2.png" alt="" width="602" height="466" /></a></p>
<p>For a Scrum team to become effective, they need to do more than just follow the basic Scrum pattern. Effective Scrum teams are <strong>self-organizing</strong>, as Ken Schwaber explains (note the phrase that we emphasized):</p>
<blockquote><p>For Scrum to work, the team has to deeply and viscerally understand collective commitment and self-organization. Scrum’s theory, practices, and rules are easy to grasp intellectually. But until a group of individuals has made a collective commitment to deliver something tangible in a fixed amount of time, <strong>those individuals probably don’t get Scrum</strong>. When the team members stop acting as many and adopt and commit to a common purpose, the team becomes capable of self-organization and can quickly cut through complexity and produce actionable plans.</p>
<p>- Ken Schwaber, <em><a href="http://www.amazon.com/Agile-Project-Management-Microsoft-Professional/dp/073561993X/">Agile Project Management with Scrum</a></em></p></blockquote>
<p>The goal of this talk is to help teams “get Scrum” by building on the practices and patterns of Scrum, and through those practices show the ideas behind the principles of collective commitment and self-organization.</p>
<p><a href="http://www.stellman-greene.com/blog/wp-content/uploads/2012/06/Scrum-and-Self-Organizing-Teams-7.png"><img class="alignnone size-full wp-image-652" title="Scrum and Self-Organizing Teams: Command-and-Control vs. Self-Organizing" src="http://www.stellman-greene.com/blog/wp-content/uploads/2012/06/Scrum-and-Self-Organizing-Teams-7.png" alt="" width="601" height="454" /></a></p>
<p>In <em>Agile Project Management with Scrum</em>, Ken Schwaber introduced five Scrum values: <strong>courage</strong>, <strong>commitment</strong>, <strong>respect</strong>, <strong>focus</strong>, and <strong>openness</strong>. Understanding these values is an important key to understanding self-organizing teams.</p>
<div> Self-organizing teams work differently than command-and-control teams because they have different values. Understanding self-organization starts with learning how these values are practical things that can be incorporated into your projects:</div>
<ul>
<li><strong>Each person is committed to the project’s goals. </strong>That level of commitment can be achieved when the team has the authority to make decisions in order to meet those goals, and everyone has a say in how the project is planned and executed. For example, sometimes a requirements document isn&#8217;t perfect. To make the project successful, a team might have to ignore a documented requirement in order to deliver a product that&#8217;s much more valuable. This is only possible once they&#8217;re given the authority to make that decision.</li>
<li><strong>Team members respect each other.</strong> When team members have mutual respect, they’re able to trust each other to do a good job with the work they’ve taken on. But that respect doesn’t always come easily to programmers and other technical people. Many programmers, especially highly skilled ones, often base their respect purely on technical ability. This can be a barrier to effective Scrum adoption. If a programmer doesn’t respect the product owner, he won’t listen to that product owner when they talk about the goals of the project.</li>
<li><strong>Everyone is focused on the work.</strong> When a Scrum team member is working on a sprint, that’s his only job for the duration of the sprint. He is free to do whatever work is needed to complete the iteration backlog, and handle any changes that are made to that backlog during the sprint. When every team member is focused on the sprint goals and given the freedom to do whatever work is needed to meet those goals, the whole team is able to organize itself and easily redirect whenever a change is needed.</li>
<li><strong>Openness.</strong> When you’re working on a Scrum team, everyone else on the team should always be aware of what you’re working on and how it moves the project towards its current goals. Many of the Scrum practices are aimed at encouraging openness among the team members. Task boards, for example, allow everyone to see all of the work being done by each team member, and how much work is left to do. Burn-down charts let each person gauge for themselves how quickly the sprint is meeting its iteration goals. The Daily Scrum, when done effectively, is a almost pure exercise in openness, because each person lays bare their tasks, challenges, and progress for the whole team to see. All of these things can help the team to create an atmosphere of mutual support and encouragement.</li>
<li><strong>Team members have the courage to stand up for the project.</strong> When you choose openness over opaqueness, you make the team stronger rather than making yourself stronger at the expense of the team. It takes courage to do that, but when you do you end up with a better product and a better work environment. Scrum teams have the courage to live by values and principles that benefit the project. It takes courage to ward off the constant pushback from a company whose values clash with the Scrum and agile values. This requires vigilance on the part of every team member, especially the Scrum Master. But it also requires each person to be willing to trust that delivering valuable software will help them overcome resistance to these values. This requires courage too, especially when it comes time to sit down for a review with the boss. It takes courage to say to yourself, “Helping this team produce valuable software is more important to me that how the company sees my own personal contribution.”</li>
</ul>
<h2>Methodologies have built-in values</h2>
<p>Every company has its own culture that includes specific values. For example, some companies value separation of duties, where each person has their specific role to play, and is protected from having to be accountable for things that they can’t easily influence or control. Other companies value transparency, where information is shared freely and even low-level employees can influence management decisions. Neither of these is the “right” way to run a company. Every individual company has a culture that evolves over time, based on the way it’s managed and the decisions that are made.</p>
<p>Every methodology has values built into it. Specific <a href="http://agilemanifesto.org/principles.html">agile principles</a> are often tied to (or implemented by) individual practices, and that those practices are an effective way for a team to bring each principle to the project. A team in a company that reserves decision-making for managers only will find it difficult to truly commit to projects. The same goes for any value or principle: if they clash with the company’s values, it presents a barrier to adoption.</p>
<p>But in a company where the culture matches the agile values and principles, an agile team will be much more successful than a command-and-control team. (This is one of the sources of the “astonishing results” that some agile teams report.)</p>
<p>You might be surprised at just how well the agile values and principles match your company’s culture. A good first step in introducing agile to your company is to talk about the values, and how they might impact your company’s culture. If you find that your agile adoption runs into trouble, finding the mismatch between agile values and company culture can help you smooth out the transition (or at least help you feel better by understanding why things went wrong).</p>
<p>So how would you build courage on a team? How would you get a team to believe in themselves, and believe that Scrum will not only help them build more valuable software, but that they company will see the value in their new methodology?</p>
<img src="http://feeds.feedburner.com/~r/BuildingBetterSoftware/~4/bKMc66k6vdo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.stellman-greene.com/2012/06/10/scrum-and-self-organizing-teams/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Getting Agile Right</title>
		<link>http://www.stellman-greene.com/2011/11/05/getting-agile-right/</link>
		<comments>http://www.stellman-greene.com/2011/11/05/getting-agile-right/#comments</comments>
		<pubDate>Sat, 05 Nov 2011 14:19:07 +0000</pubDate>
		<dc:creator>Andrew Stellman</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Presentations]]></category>

		<guid isPermaLink="false">http://www.stellman-greene.com/?p=620</guid>
		<description><![CDATA[Last week Jenny and I gave our new talk, Getting Agile Right [pdf], for the first time. We&#8217;re really excited, because it also marks our first public announcement of our current book project for  O’Reilly: a new book about agile development and project management. It&#8217;s aimed at people preparing for the PMI-ACP certification, but our goal is [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.stellman-greene.com/blog/wp-content/uploads/2011/11/Getting_Agile_Right_1.png"><img class="alignnone size-full wp-image-621" title="Getting_Agile_Right_1" src="http://www.stellman-greene.com/blog/wp-content/uploads/2011/11/Getting_Agile_Right_1.png" alt="" width="575" height="425" /></a></p>
<p>Last week Jenny and I gave our new talk, <strong><a title="Getting Agile Right - presentation slides" href="http://www.stellman-greene.com/Getting_Agile_Right.pdf">Getting Agile Right</a></strong> [pdf], for the first time. We&#8217;re really excited, because it also marks our first public announcement of our current book project for  <a href="http://www.oreilly.com">O’Reilly</a>: a new book about agile development and project management. It&#8217;s aimed at people preparing for the PMI-ACP certification, but our goal is to help anyone who&#8217;s interested in agile really understand the ideas behind it.</p>
<p>We talk to a lot of teams and help  them understand what’s gone right and wrong with their projects, and look for common patterns of project problems and failure (that&#8217;s what our <a title="Why Projects Fail" href="http://www.stellman-greene.com/Why_Projects_Fail.pdf">Why Projects Fail talk</a> [pdf] is all about.) People starting with agile often us about something that we call “better-than-not-doing-it results.” Basically, they adopt a bunch of great agile practices, and they see a clear improvement. It was definitely worth going agile, but something feels a little hollow about it. They were expecting the “astonishing results” and “hyper-productive teams” that they’d read about in agile books and blog posts, but there&#8217;s a feeling that at its core, the team hasn&#8217;t really changed how they do things, they just made incremental improvements.</p>
<p>I recently read <a href="http://www.coachingagileteams.com/about/">Lyssa Adkins</a>’ excellent book, <em><a title="Coaching Agile Teams" href="http://www.coachingagileteams.com/">Coaching Agile Teams</a></em>, and one of the really insightful things she points out is that “metaphor is a powerful thing.” Jenny and I put a lot of thought into coming up with a good metaphor to help explain what’s going on. We hit on a really good one: the story of the blind men and the elephant. <a href="http://en.wikipedia.org/wiki/Blind_men_and_an_elephant">I like the Jain version of the story (from Wikipedia)</a>:</p>
<blockquote><p>A Jain version of the story says that six blind men were asked to determine what an elephant looked like by feeling different parts of the elephant&#8217;s body. The blind man who feels a leg says the elephant is like a pillar; the one who feels the tail says the elephant is like a rope; the one who feels the trunk says the elephant is like a tree branch; the one who feels the ear says the elephant is like a hand fan; the one who feels the belly says the elephant is like a wall; and the one who feels the tusk says the elephant is like a solid pipe.</p>
<p>A king explains to them: &#8221;All of you are right. The reason every one of you is telling it differently is because each one of you touched the different part of the elephant. So, actually the elephant has all the features you mentioned.&#8221;</p></blockquote>
<p>So what does this have to do with agile teams having trouble getting past better-than-not-doing-it results?</p>
<p><a href="http://www.stellman-greene.com/blog/wp-content/uploads/2011/11/Getting_Agile_Right_31.png"><img class="alignnone size-full wp-image-625" title="Getting_Agile_Right_3" src="http://www.stellman-greene.com/blog/wp-content/uploads/2011/11/Getting_Agile_Right_31.png" alt="" width="575" height="860" /></a></p>
<p>Teams that get better-than-not-doing-it results from agile are often the ones who were already able to get software out the door reasonably well before starting with agile, and were hoping that agile adoption would help them get a real improvement. The problem is that before the team started adopting agile practices, they were experiencing problems—not the serious, software crisis problems that caused their projects to fail outright, but problems that caused friction and discomfort on the team. The source of these problems is something that we call a “fractured perspective”: the developers think about developer stuff, project managers think about project manager stuff, and they throw the code over the wall to a business user who thinks about business stuff. Everyone is really busy thinking about his or her own project work. There isn’t a lot of communication between people, and they’re really functioning as individuals working separately towards compatible goals, not as a team.</p>
<p>That&#8217;s where the Blind Men and the Elephant story comes in—it&#8217;s a good metaphor for how a team with a fractured perspective adopts agile. Each person sees the practices that impact his or her work. Developers concentrate on, say, test-driven development, refactoring, and automated builds. Project managers like task boards, project velocity, and burndown charts. Business users use release planning and user stories to get a better grasp on what the team is doing. Team leads use daily standups and retrospectives to manage and improve the team. Everybody wants something different from the project, and they each see a few practices that do something specific to help them.</p>
<p>And that’s definitely going to improve things, because agile practices are generally really good. The problem is that since everyone—developers, project managers, business users, and team leads—sees the project from a different perspective, they’ll concentrate on only those practices that immediately appeal to them. There’s a paradoxical effect (we call it, <em>“See! I was right all along”</em>) where each person now sees only the part of agile that affects his specific project work, and draws the conclusion that agile is all about getting everyone else to come around to his point of view.</p>
<p><a href="http://www.stellman-greene.com/blog/wp-content/uploads/2011/11/Getting_Agile_Right_2.png"><img class="alignnone size-full wp-image-622" title="Getting_Agile_Right_2" src="http://www.stellman-greene.com/blog/wp-content/uploads/2011/11/Getting_Agile_Right_2.png" alt="" width="575" height="425" /></a></p>
<p>But agile is more than just practices. In fact, that’s one of the core ideas behind agile: <strong>principles over practices</strong>. So while the agile “elephant” is made up of many great practices, the whole thing is greater than the sum of the parts. And if you only see practices—especially if you’re only looking at the practices that directly affect your project work—then you’ll only see one small piece of agile. The “elephant” of agile is made up of the practices day to day, but it’s much bigger than just those practices.</p>
<p>A team whose members only see the practices and don’t think about the principles will miss out on the important interactions between people. Their perspective stays fractured, and they stay separate and don’t really function as an effective team. They’ll still get their work done, but they miss out on the great team interactions and collaboration that make agile really work.</p>
<p>This is built into agile. If it’s been a while since you’ve had a look at the <a title="Manifesto for Agile Software Development " href="http://agilemanifesto.org/">agile manifesto</a>, open it up again and have a look at the very first value:</p>
<p>&nbsp;</p>
<blockquote><p><span style="font-size: xx-large;">Individuals and interactions</span> <span style="font-size: large;">over processes and tools</span></p></blockquote>
<p>&nbsp;</p>
<p>Processes, methodologies, and tools are still important (“…while there is value in the items on the right, we value the items on the left more.”). But even more important than specific practices are the individuals and interactions. It’s these values, and the <a title="Principles behind the Agile Manifesto" href="http://agilemanifesto.org/principles.html">twelve principles</a>, that show us how the practices work together, and serve as a guide for how teams adopt those practices.</p>
<p>That&#8217;s one of the lessons of our <a title="Getting Agile Right talk" href="http://www.stellman-greene.com/Getting_Agile_Right.pdf">“Getting Agile Right” talk</a> [pdf]. It’s also going to be one of the big themes in our upcoming book, due out from <a href="http://www.oreilly.com">O’Reilly</a> next year, about agile development, project management, and the new PMI-ACP agile certification. We’ll continue to make posts to help connect these dots and learn more about agile.</p>
<img src="http://feeds.feedburner.com/~r/BuildingBetterSoftware/~4/ZDel8Tfbz8I" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.stellman-greene.com/2011/11/05/getting-agile-right/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Admitting that you have a problem</title>
		<link>http://www.stellman-greene.com/2011/03/12/admitting-that-you-have-a-problem/</link>
		<comments>http://www.stellman-greene.com/2011/03/12/admitting-that-you-have-a-problem/#comments</comments>
		<pubDate>Sat, 12 Mar 2011 20:52:41 +0000</pubDate>
		<dc:creator>Andrew Stellman</dc:creator>
				<category><![CDATA[Project Management]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.stellman-greene.com/?p=596</guid>
		<description><![CDATA[It’s not always easy to recognize when your project is in trouble.  Yes, if your project crashes and burns and completely fails to deliver, it’s failed. But sometimes you don’t realize that you’ve  or you’ve  built the wrong software and are about to make your users very unhappy. The first step in fixing your project problems is admitting that you have a problem.]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.stellman-greene.com/blog/wp-content/uploads/2011/03/Denial1.png"><a href="http://www.stellman-greene.com/blog/wp-content/uploads/2011/03/Denial2.png"><img class="alignnone size-full wp-image-617" title="Denial" src="http://www.stellman-greene.com/blog/wp-content/uploads/2011/03/Denial2.png" alt="" width="450" height="581" /></a></a></p>
<p>It’s not always easy to recognize when your project is in trouble. Yes, if your project crashes and burns and completely fails to deliver, it’s failed. But sometimes you don’t realize that you’ve  or you’ve built the wrong software and are about to make your users very unhappy. That’s why Jenny and I put together our <a href="http://www.stellman-greene.com/Why_Projects_Fail.pdf">Why Projects Fail talk [pdf]</a> a few years ago: to help people recognize when their projects are starting to go off the rails, and learn a few simple techniques for fixing them. If you learn to recognize the signs of project problems, it’s easier to take action quickly and turn your project around:</p>
<blockquote><p>Software projects are a lot like cheesy horror movies. After you’ve seen a few of them, you know that the first guy to leave the group is going to get an axe in his head. Projects are the same way. People keep making the same mistakes over and over, and it keeps getting their projects killed.</p>
<p>– <a href="http://www.stellman-greene.com/Why_Projects_Fail.pdf">Why Projects Fail presentation</a>, slide 6</p></blockquote>
<p>But what happens when your problems are bigger than just one project? What happens when you’ve got a team, a department, or a whole organization that runs into trouble repeatedly on projects?</p>
<p>When Jenny and I were doing research for our first book, <a href="http://www.stellman-greene.com/aspm">Applied Software Project Management</a> <em>(O&#8217;Reilly, 2005)</em>, we talked to many different people on all kinds of teams. And when we did, we started to notice something funny. We specifically reached out to people who had bad experiences with requirements, project management, Agile development—really, any way of trying to do things better. We were surprised that we kept hearing the same things over and over again, and started to suspect that they were symptoms of deep-rooted project management problems&#8230; and teams that were resistant to changing them.</p>
<p><span style="font-size: 20px; font-weight: bold;">Taking the first step</span></p>
<p>A list of the most common excuses—excuses that we’ve heard dozens or even hundreds of times, over and over again, from many different teams—is a surprisingly powerful tool. There have been many times when I’ve been brought in to try to help a team improve the way they build software. I&#8217;d be in the middle of an explanation of, say, why Agile has worked well for me in the past, and someone would give me an excuse that&#8217;s <em>almost exactly word-for-word right out of our book</em>. It’s actually pretty uncanny: how were we able to predict exactly what he would say in advance? But there it is, written down and printed in black and white.</p>
<p>That was the inspiration for the chapter in our book called <em>Understanding Change</em>. In it, we outline the most common excuses for sticking with a poor way of building software and not adopting something better. If you’ve ever tried to help your software team adopt a new tool, technique, or practice, you’ll see some very familiar arguments there.</p>
<p>Here are the top excuses that we’ve heard from teams that can’t admit that they have a problem. They’re all straight out of <em>Applied Software Project Management</em>. Treat each of these excuses as a big red flag, and you can use this to your advantage. If you’ve ever watched an episode of <a href="http://www.aetv.com/intervention/index.jsp">Intervention</a>, you probably know that the first step to fixing a serious issue is admitting that you have a problem. Do they sound familiar to you? Have you ever heard any of them before? If so, it’s time to take the first step.</p>
<p>But if you do take the step and admit that you have project problems, that’s good news! It means that there are plenty of time-tested, tried-and-true ways to help your team. (Of course, if you’re a regular reader of <a href="http://www.stellman-greene.com/">Building Better Software</a>, you already know that!)</p>
<p><em>Each of the following excuses is excerpted from pages 206 through 213 of <a title="Applied Software Project Management" href="http://www.stellman-greene.com/aspm">Applied Software Project Management</a> (Stellman A and Greene J, O</em><em>’</em><em>Reilly 2005). You can read a lot more about each one (and what you can do when you hear them from your team) in that chapter.</em></p>
<h4>We Already Build Software Well</h4>
<p>Denial is a common response to change. You may have identified a glaring problem, but people around you fail to even recognize it (or simply refuse to acknowledge it). Many professional software engineers and managers have never experienced a project that did not have enormous delays and serious problems; it’s often assumed that this is just part of how software is built. After all, they usually delivered something—most projects were eventually completed, and the software they built is now being used. Sure, some projects seem to always be eternally 90% done (with 90% left to go), but most of them seem to get something onto the users’ desktops (although many patches and bug fixes needed to be rolled out afterward). Isn’t that good enough?</p>
<h4>“Not Invented Here” Syndrome</h4>
<p>“Not Invented Here” syndrome (NIH syndrome) is a name given to a common type of organizational culture where people intentionally avoid research or innovations that were not developed within the organization. When faced with a problem, the people in the organization will typically reject a solution that is known to have worked elsewhere in the industry, solely on the grounds that it did not originate from inside the organization. They opt instead to build their own solution, often at far greater cost.</p>
<h4>It’s “Too Theoretical”</h4>
<p>When an idea does not make intuitive sense, many people will dismiss it as a result of “academic research,” which could not possibly apply to the world they live in. For example, to someone without a project management or software  engineering background, it may not be immediately obvious that reviews reduce defects, or that it’s important to write a specification before building software. To him, these procedures are time-consuming, with no obvious benefit. They sound good in a book, but would never work in the organization. In other words, they are “too theoretical.”</p>
<h4>It Just Adds More Bureaucracy</h4>
<p>An especially damaging attitude in some organizations holds that programming is the only important activity in a software project. Project management tools and techniques are seen as distractions that drain energy and effort away from the programmers’ “real job” of writing code. Any project activity that takes place before the programmers begin writing code simply amounts to “spinning our wheels,” and the goal of all early project activities should be to get the programmers doing the “real work” as quickly as possible.</p>
<h4>You Can’t Give Me More Work!</h4>
<p>Most of the changes that a project manager makes will increase the workload of other people. Software engineers, managers, and stakeholders who were not directly involved in building software will suddenly find themselves expected to attend status and review meetings, participate in planning and estimation activities, work with someone creating a vision and scope document or eliciting requirements, or perform other tasks that were never expected of them before. If you are making these changes, then you are the person piling additional work onto someone’s already overflowing plate. Not surprisingly, there are people who will not be happy with this arrangement.</p>
<h4>It’s Too Risky</h4>
<p>The economist John Maynard Keynes once wrote, “Worldly wisdom teaches that it is better for the reputation to fail conventionally than to succeed unconventionally.“ Legendary investor Warren Buffett put it this way: “Lemmings as a class may be derided but never does an individual lemming get criticized.” In other words, any manager who backs a change puts his reputation on the line; if that manager does nothing, he will not be criticized for maintaining the status quo.</p>
<p><em><br />
</em></p>
<img src="http://feeds.feedburner.com/~r/BuildingBetterSoftware/~4/TBOhOVTpKO4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.stellman-greene.com/2011/03/12/admitting-that-you-have-a-problem/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Confessions of a jerk</title>
		<link>http://www.stellman-greene.com/2011/01/09/confessions-of-a-jerk/</link>
		<comments>http://www.stellman-greene.com/2011/01/09/confessions-of-a-jerk/#comments</comments>
		<pubDate>Sun, 09 Jan 2011 17:19:38 +0000</pubDate>
		<dc:creator>Andrew Stellman</dc:creator>
				<category><![CDATA[Careers]]></category>

		<guid isPermaLink="false">http://www.stellman-greene.com/?p=585</guid>
		<description><![CDATA[The other day I made this short, shameful confession in response to a Slashdot story about a Forbes blog post called When Smart People are Bad Employees. The post outlines three distinct types of bad employees. The third one was called “The Jerk,” and it sounded eerily familiar.

Here's my confession: I've been that jerk in the past.]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.stellman-greene.com/blog/wp-content/uploads/2011/01/total_jackass.png"><img class="alignnone size-full wp-image-592" title="total_jackass" src="http://www.stellman-greene.com/blog/wp-content/uploads/2011/01/total_jackass.png" alt="The worst kind of jackass is the kind that knows he's good" width="550" height="579" /></a></p>
<p>The other day I made <a href="http://idle.slashdot.org/comments.pl?sid=1936728&amp;cid=34768188">this short, shameful confession</a> in response to a  <a href="http://idle.slashdot.org/story/11/01/05/1516204/When-Smart-People-Make-Bad-Employees">Slashdot story</a> about a Forbes blog post called <a href="http://blogs.forbes.com/bruceupbin/2011/01/03/when-smart-people-are-bad-employees/"><em>When Smart People are Bad  Employees</em></a>. The post outlines three distinct types of bad employees. The  third one was called “The Jerk,” and it sounded eerily familiar:</p>
<blockquote><p>If a member of your staff is a raging jerk, it may be impossible. Some  people are so belligerent in their communication style that people just  stop talking when they are in the room. If every time anyone brings up  an issue with the marketing organization, the VP of marketing jumps down  their throat, then guess what topic will never come up? This behavior  can become so bad that nobody brings up any topic when the jerk is in  the room.</p></blockquote>
<p>Here&#8217;s my confession: I&#8217;ve been that jerk in the past.</p>
<p>I was that really smart programmer that everyone listened to because I made really good software really quickly. But people hated  dealing with me because I was obnoxious to deal with—and worse, I knew it and was  openly arrogant about it. If <a href="http://www.thinkgeek.com/tshirts-apparel/unisex/frustrations/">snarky geek t-shirts</a> had been around at the  time (this was back in the mid-90s) I would definitely have worn  them. When someone was wrong, I definitely let them know. If I didn&#8217;t respect someone, I would make myself unpleasant to deal with, enough so that it was easiest to just shut up anytime I was in the room.</p>
<p>I was a kid in my early 20s, and it was only my second job out of college, so I was really eager to prove myself. I came up with some pretty ingenious solutions to a couple of vexing problems. It was a small company, and one of the systems I built produced an entirely new product for their salespeople to sell to clients. They had some serious problems managing client information for their help desk, serious problems where their programming team wasn’t able to track bugs properly (these were the days well before tools like JIRA and Bugzilla were cheap or free), and managing large amounts of data. I built some pretty good tools, and they made a big difference. So people put up with my attitude, because it was a net win for everyone. But it made their jobs more difficult, just so I could engage in some personal ego gratification.</p>
<p>Actually, here&#8217;s something from that time that I find really funny. The company I was working for had all prospective employees take a <a href="http://www.caliperonline.com/">Caliper Assessment test</a> as part of the interview process. At  the time, it was basically a combination of an IQ  (abstract reasoning)  test and a personality profile, and the results were compiled into a  report with a page of scores and a two-page writeup. My boss gave me a  copy of my results when I came on board. My abstract reasoning score was  100%, and scores on the “extroverted” and “ego-driven” scales were both  over 90%. The writeup said that I would be “a loose cannon,” but if I  was “aimed properly, I would knock down any barrier in front of me.” It  also warned that I would not play nice with people who I did not  respect.</p>
<p>In other words, the Caliper report certified me as an extremely smart, highly capable, grade-A jerk.</p>
<p>So, first of all, kudos to the folks at Caliper. They definitely had my  number, which was pretty impressive considering that it was based on a  100-or-so-question fill-in-the-bubble timed test. And they got that profile exactly right.</p>
<p>This all presented a really frustrating problem for the people at the  company. Here I was, this kid who kept hitting projects out of the park.  But I was truly impossible to deal with. I would barely let people  finish sentences before cutting them off (“Okay, I know exactly what you  want. You go away now.”) I perfected all of the programmer stonewalling  tricks to get people to stop asking me questions: interrupting people  with pedantic questions before they’d barely started getting to the  point, sending people back with half-answers so I didn’t have to think  through the question I was being asked, answering questions in a way  that was obviously far too technical for whoever I was talking to so.  And heaven help anyone who said something to me that was technically  inaccurate.</p>
<p>I was belligerent to people around me. I was definitely immature and  naïve. But people respected me and knew that I was worth dealing with,  because I did really good work.</p>
<p>Eventually, though, a funny thing happened.</p>
<p>I slowly discovered that if I stopped acting like a jerk, life got a lot  easier. I mean, obviously, it got easier for the people around me. But  it got easier for me, too.</p>
<p>Unthinkingly, I felt that I needed to be a jerk to make people respect  me. I think, on an intuitive level, that it was a kind of litmus test.  People had to respect me, because if they didn’t respect me they never  would have put up with my attitude. But what I found was that when I  stopped acting like a jerk, people still respected me. Not only did they  stop fighting me, but they actually went out of their way to help me.</p>
<p>Once I stopped being a jerk, it was a lot easier to do my job, and I&#8217;m  convinced that I was actually able to produce better code because of the  reduced number of bureaucratic headaches.</p>
<p>I wish I&#8217;d figured it out earlier.</p>
<p>(Hmm, on the other hand, I was asked to do more stuff because people  were less afraid of me. So I guess&#8230; be careful what you wish for?)</p>
<img src="http://feeds.feedburner.com/~r/BuildingBetterSoftware/~4/vcge7-RrUZE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.stellman-greene.com/2011/01/09/confessions-of-a-jerk/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Demoralize Your Teams Quickly And Efficiently With Micromanagement</title>
		<link>http://www.stellman-greene.com/2010/11/29/demoralize-your-teams-quickly-and-efficiently-with-micromanagement/</link>
		<comments>http://www.stellman-greene.com/2010/11/29/demoralize-your-teams-quickly-and-efficiently-with-micromanagement/#comments</comments>
		<pubDate>Mon, 29 Nov 2010 13:50:58 +0000</pubDate>
		<dc:creator>Andrew Stellman</dc:creator>
				<category><![CDATA[Project Management]]></category>
		<category><![CDATA[Teams]]></category>

		<guid isPermaLink="false">http://www.stellman-greene.com/?p=559</guid>
		<description><![CDATA[Apparently I’ve earned the dubious distinction of having become an expert in project failure. I’ve always had an interest in project failure—Jenny and I have been doing our “Why Projects Fail” talk for years now, and we’ve talked to many people in many different industries (like in our fourth book, Beautiful Teams) about what’s gone [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.stellman-greene.com/blog/wp-content/uploads/2010/11/utter_submission.png"><img class="alignnone size-full wp-image-565" title="utter_submission" src="http://www.stellman-greene.com/blog/wp-content/uploads/2010/11/utter_submission.png" alt="" width="550" height="547" /></a></p>
<p>Apparently I’ve earned the dubious distinction of having become an  expert in project failure. I’ve always had an interest in project  failure—Jenny and I have been doing our <a href="http://www.stellman-greene.com/Why_Projects_Fail.pdf"><span style="color: #0000ff;"><span style="text-decoration: underline;">“Why Projects Fail” talk</span></span></a> for years now, and we’ve talked to many people in many different industries (like in our fourth book, <em><a href="http://oreilly.com/catalog/9780596518028">Beautiful Teams</a></em>) about what’s gone wrong on their projects. We’ve looked at failures on projects through the years, from small misfires on our own projects to dramatic failures like the <a href="http://www.stellman-greene.com/about/galloping-gertie-the-tacoma-narrows-bridge-disaster/"><span style="color: #0000ff;"><span style="text-decoration: underline;">Tacoma Narrows Bridge disaster</span></span></a>, to try to figure out what software developers can learn from them.</p>
<p>One of my favorite ways that projects can fail is death by  micromanagement. It’s a nasty, insidious problem for a couple of  reasons. It’s easy for a boss to fall into the micromanagement trap,  especially for a project that’s starting to spiral out of control, because when you feel like your project is slipping away from you, it’s  hard to resist the urge to tighten your grip on every part of it that  you can.</p>
<p>And the people on the team have trouble recognizing it because a  lot of them have never worked any other way. I’ve said it before, and  I’m sure I’ll say it again: I’m willing to bet that if someone was able  to conduct an accurate survey, they would find that a surprisingly large number of managers are micromanagers.</p>
<p>On the other hand, if you’re a boss or a project manager looking  for a great way to demoralize your team and cause your projects to fail,  micromanagement is a great way to do it. Here are some handy tips to  make sure your team hates you and your project runs into serious trouble:</p>
<ul>
<li>Make sure you don’t give your team enough time to do the work, and then blame them for not getting it done on time.</li>
<li>Routinely ask people to stop working on whatever they’re doing right<strong> </strong>now to take care of urgent emergency work.</li>
<li>Then utterly fail to follow up on that urgent emergency work.</li>
<li>Never let anyone on your team release anything or even talk to a user without giving it to you to look over first.</li>
<li>When  they give you that work, make sure you send it back with a whole lot of  vague and poorly thought-out changes – but make sure you don’t give any  extra time to make them.</li>
<li>In fact, try to constantly find many small changes that your team should make, just to keep them on their toes.</li>
<li>Your  team needs constant attention! If it’s been more than two hours since  you’ve talked to someone on your team, drop by and tap one of them on  the shoulder and ask for an update.</li>
<li>All organizations run on  status. If the status updates stop flowing, a company can crumble and  perish! Also, developers feel lonely if they haven’t given a status  update in the last few hours. So make sure everyone has to fill out  elaborate status reports, and make sure you hold at least three two-hour-long status meetings  every week.</li>
<li>Did someone on your team do something differently  than how you would do it? Reprimand them! They might tell you that it  works just fine, and that their way is just as good. But it’s not <em>your</em> way, so it’s not right.</li>
<li>Remember: reading your mind is part of every team member’s job. That’s how they stay proactive!</li>
</ul>
<p>Most of all, though, remember rule #1: <strong>Nobody is ever allowed to make mistakes! </strong>If a developer makes a mistake, it reflects badly on you, and the whole  team suffers. Never admit that you were wrong about anything. If you  said it once, it’s now the law and should never be questioned.</p>
<p>If you follow this simple advice, then your team will be  demoralized in no time. Also, they’ll hate you. Oddly, though, there’s a  good chance that they won’t get their resumes together and start  looking for new jobs. I have a theory about this: when you micromanage a team, it drains their will to such an extent that they no  longer care. Psychologists call this state “learned helplessness.”  The <a href="http://en.wikipedia.org/wiki/Learned_helplessness"><span style="color: #0000ff;"><span style="text-decoration: underline;">Wikipedia article on learned helplessness</span></span></a> has a good description of a classic experiment by Martin Seligman and Steve Maier:</p>
<blockquote><p>In part one of Seligman and <a href="http://en.wikipedia.org/w/index.php?title=Steve_Maier&amp;action=edit&amp;redlink=1"><span style="color: #0000ff;"><span style="text-decoration: underline;">Steve Maier</span></span></a>&#8216;s experiment,  three groups of dogs were placed in harnesses. Group One dogs were  simply put in the harnesses for a period of time and later released.  Groups Two and Three consisted of &#8220;yoked pairs.&#8221; A dog in Group 2 would  be intentionally subjected to pain by being given electric shocks, which the dog could end by pressing a  lever. A Group 3 dog was wired in parallel with a Group 2 dog, receiving  shocks of identical intensity and duration, but his lever didn&#8217;t stop  the electric shocks. To a dog in Group 3, it seemed that the shock ended at random, because it was his paired dog in Group 2  that was causing it to stop. For Group 3 dogs, the shock was apparently  &#8220;inescapable.&#8221; Group 1 and Group 2 dogs quickly recovered from the  experience, but Group 3 dogs learned to be helpless, and exhibited symptoms similar to chronic <a href="http://en.wikipedia.org/wiki/Clinical_depression"><span style="color: #0000ff;"><span style="text-decoration: underline;">clinical depression</span></span></a>.</p>
<p>In  part two of the Seligman and Maier experiment, these three groups of  dogs were tested in a shuttle-box apparatus, in which the dogs could  escape electric shocks by jumping over a low partition. For the most part, the Group 3 dogs,  who had previously &#8220;learned&#8221; that nothing they did had any effect on the  shocks, simply lay down passively and whined. Even though they could  have easily escaped the shocks, the dogs didn&#8217;t try.</p></blockquote>
<p>If reading about the Group 3 dogs reminds you of work, then there’s a very good chance that you’re being micromanaged.</p>
<img src="http://feeds.feedburner.com/~r/BuildingBetterSoftware/~4/fhYcS_s8iy8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.stellman-greene.com/2010/11/29/demoralize-your-teams-quickly-and-efficiently-with-micromanagement/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Inflict bad UX on users you secretly hate</title>
		<link>http://www.stellman-greene.com/2010/11/20/inflict-bad-ux-on-users-you-secretly-hate/</link>
		<comments>http://www.stellman-greene.com/2010/11/20/inflict-bad-ux-on-users-you-secretly-hate/#comments</comments>
		<pubDate>Sat, 20 Nov 2010 16:53:12 +0000</pubDate>
		<dc:creator>Andrew Stellman</dc:creator>
				<category><![CDATA[Usabililty / UX]]></category>
		<category><![CDATA[Users]]></category>

		<guid isPermaLink="false">http://www.stellman-greene.com/?p=540</guid>
		<description><![CDATA[About a year ago at a conference, a programmer came up to me for some advice about an unfortunate user interface he’d built. It was a pretty miserable affair: a combination of displaying too much information and offering too many choices, while at the same time burying the one thing that the user actually wanted [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.stellman-greene.com/blog/wp-content/uploads/2010/11/bud-is-confident-about-ux.png"><img class="alignnone size-full wp-image-546" title="bud-is-confident-about-ux" src="http://www.stellman-greene.com/blog/wp-content/uploads/2010/11/bud-is-confident-about-ux.png" alt="" width="550" height="466" /></a></p>
<p>About a year ago at a conference, a programmer came up to me for some advice about an unfortunate user interface he’d built. It was a pretty miserable affair: a combination of displaying too much information and offering too many choices, while at the same time burying the one thing that the user actually wanted to work with. It was full of classic UX – user experience – mistakes and usability problem, and I suggested the usual suspects: go back to user stories, develop some use cases, try to figure out what the users actually need.</p>
<p>That did not go over well. I’d assumed that the programmer was still working on gathering feedback, since he was asking me to look over his design. So I was surprised when he mentioned that it would be difficult to make changes to it, because it had already been rolled out and his users were using it.</p>
<p>That’s when I decided that this was a devious supervillian who secretly hated his users. Or, possibly, just a thoughtless jerk—I couldn&#8217;t really decide for certain without seeing his secret lair. (Hint: If he has a secret lair, it&#8217;s probably the former.)</p>
<p>My point is that if he did hate his users, then inflicting bad UX on them was a perfect way to make them really miserable.</p>
<h2>You can&#8217;t just add usability at the end of the project</h2>
<p>You&#8217;d be surprised at how often programmers are completely unaware that they have serious UX and usability problems. Just a few days ago, someone told me, &#8220;Our users are using our software, so we don’t have any usability issues!&#8221;</p>
<p>One of my favorite sayings is that there are only a few ways to do something right, but a million ways to do it wrong. Usability is no exception. And one problem with user experience and usability is that it&#8217;s not always easy to diagnose UX problems in software that you wrote. Good UX is designed in from the beginning; bad UX can show up at any point along your project.</p>
<p>That&#8217;s why an approach that I like for fixing usability problems is to concentrate on the team, not just the software. Here are a few quick questions to ask yourself. If any of these situations sound familiar, you might have usability problems:</p>
<ul>
<li>A user is explaining what he needs you to build. Halfway through a sentence, you stop him and say, &#8220;That&#8217;s great! I know exactly what you need.&#8221;</li>
<li>The first thing you did on your new project was start up the form or page designer in an IDE and drag controls onto a window—before talking to any of the users.</li>
<li>You&#8217;ve gotten halfway thorough a project without knowing the name of anyone outside of the programming team who&#8217;s going to use the software.</li>
<li>When you deliver the first version of the software for users to test, it&#8217;s the first time they&#8217;ve seen the GUI.</li>
<li>You find out that there&#8217;s an entire feature that your users aren&#8217;t using&#8230; or a feature they don&#8217;t even know about.</li>
</ul>
<p>If any of that sounds familiar—or, even worse, if you&#8217;re now pissed off at me because you don&#8217;t see what&#8217;s wrong with any of those scenarios—then you should definitely consider getting some UX help right now. (I&#8217;d offer to help you myself, but I&#8217;ve got my hands full with my own projects!)</p>
<p><a href="http://www.stellman-greene.com/blog/wp-content/uploads/2010/11/petu-logo.png"><img class="alignnone size-full wp-image-544" title="petu-logo" src="http://www.stellman-greene.com/blog/wp-content/uploads/2010/11/petu-logo.png" alt="" width="529" height="383" /></a></p>
<p>One of these days I’m going to start an organization called <em>PeTU</em>: Programmers for the Ethical Treatment of Users. We&#8217;ll set up a protest outside the office of any development team that inflicts bad usability on their unsuspecting users. For the sake of all our sanity, please stop inflicting bad UI on unsuspecting users! If you don&#8217;t, I&#8217;ll have to stage an outlandish, somewhat juvenile protest outside your office.</p>
<img src="http://feeds.feedburner.com/~r/BuildingBetterSoftware/~4/cxssaO7Ub4E" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.stellman-greene.com/2010/11/20/inflict-bad-ux-on-users-you-secretly-hate/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A Few Things Every Job-Seeking Programmer Should Know About Project Management (part 2)</title>
		<link>http://www.stellman-greene.com/2010/09/23/a-few-things-every-job-seeking-programmer-should-know-about-project-management-part-2/</link>
		<comments>http://www.stellman-greene.com/2010/09/23/a-few-things-every-job-seeking-programmer-should-know-about-project-management-part-2/#comments</comments>
		<pubDate>Fri, 24 Sep 2010 02:16:11 +0000</pubDate>
		<dc:creator>Andrew Stellman</dc:creator>
				<category><![CDATA[Careers]]></category>
		<category><![CDATA[Project Management]]></category>

		<guid isPermaLink="false">http://www.stellman-greene.com/?p=508</guid>
		<description><![CDATA[I’ve met a lot of programmers who really hate project management. And it’s not that surprising, because project management done poorly can be a pain. But if you’re a developer looking for a job, employers are more and more likely to expect you to know something about project management. Luckily, good project management can make [...]]]></description>
				<content:encoded><![CDATA[<p><em>I’ve met a lot of programmers who really hate project management. And it’s not that surprising, because project management <strong>done poorly</strong></em><em> can be a pain. But if you’re a developer looking for a job, employers are more and more likely to expect you to know something about project management. Luckily, good project management can make your life easier, and it’s worth knowing about it—not just for job interviews, but to help you get the most out of your own projects. In <a href="http://www.stellman-greene.com/2010/08/30/a-few-things-every-programmer-should-know-about-project-management-part-1/">part 1 of this post</a></em><em>, I talked about a few basic things that I think every developer ought to know about project management. Now I’ll finish up by going into a few details that can help you run your projects more smoothly—and deliver better software.</em></p>
<p><a href="http://www.stellman-greene.com/blog/wp-content/uploads/2010/08/Seaworthy-project.png"><img title="Seaworthy project" src="http://www.stellman-greene.com/blog/wp-content/uploads/2010/08/Seaworthy-project.png" alt="" width="575" height="356" /></a></p>
<h3>Why you should care about project management</h3>
<p><a href="http://www.stellman-greene.com/blog/wp-content/uploads/2010/08/Seaworthy-project.png"></a></p>
<p>I’ve had a lot of developers over the years tell me outright that they think project management is stupid.</p>
<p>Some of the best developers I’ve worked with had pretty negative opinions of project management. At best, they’d say something like, “Well, that sounds good for another team, especially a really big team, but our projects run just fine without the extra overhead.” At worst, they think it’s malignant bureaucracy imposed on them by pointy-haired bosses. One bad experience can sour a good developer on project management. And that’s pretty unfortunate, because good project management can make a developer’s life a lot easier.</p>
<p>So why should a developer care about project management?  I think the answer is in the <a title="Why Projects FAil" href="http://www.stellman-greene.com/Why_Projects_Fail.pdf">Why Projects Fail talk</a> that Jenny and I have done many times over the years, where we outline many different ways that projects fail. We got the idea from that presentation because we’ve spent years talking to many different people about the different kinds of project problems. We had to figure out exactly what it means for a project to fail. Obviously, if your project completely crashes and burns, it’s a failure. But the funny thing about a software project is that you can almost always deliver something – even on a project that everyone agrees is a failure, you’ll have code that compiles and runs.</p>
<p>So we came up with this definition of project failure:</p>
<ul>
<li>The project costs a lot more than it should</li>
<li>It takes a lot longer than anyone expected</li>
<li>The product doesn’t do what it’s supposed to do</li>
<li>Nobody is happy about it</li>
</ul>
<p>When we go through these things, we always get a lot of head-nodding, especially from developers. More importantly, we’ve never met a single professional software engineer with more than a few years of experience who hasn’t been on at least one failed project. We always ask for a show of hands to see if there’s anyone who’s never had a failed project. And we’ve yet to meet anyone who has. (We did get someone who raised his hand once, but I talked to him afterwards, and he was just messing with us.)</p>
<p>What does this have to do with project management? Well, everything! Have a look at a typical project management textbook, and you’ll learn about the “triple constraint” (which some people call the “iron triangle”) of scope, time, and cost.</p>
<p><a href="http://www.stellman-greene.com/blog/wp-content/uploads/2010/09/triple-constraint.png"><img class="size-full wp-image-509 alignnone" title="Triple Constraint" src="http://www.stellman-greene.com/blog/wp-content/uploads/2010/09/triple-constraint.png" alt="" width="525" height="351" /></a></p>
<address>(source: <a href="http://www.headfirstlabs.com/books/hfpmp/">Head First PMP</a>, 1st ed., O’Reilly 2007)</address>
<p>Project management really boils down to managing that triple constraint: balancing the scope of the work to be done, the cost of doing the work, and the time it takes to get the work done, all in order to get the best quality that you can. If you do that right, your project runs well, and your team is happy. If you do it badly, your project stinks, and you end up with a failure. And that’s why you, as a developer, should care.</p>
<p>I’ll go into a little depth about each of those things – scope, time, cost, and quality – just to give you an idea of why you should care about each of them. But the one that developers care about most is scope, so I&#8217;ll spend a little more time on that first.</p>
<h3>Scope: the work and features that go into the project</h3>
<p>Every project can be broken down into a small number (say, ten to twenty) features. For big projects, those features are big (“solid rocket boosters,” “reuse and reentry”); for small projects, those features are small (“holds 12 fluid ounces of liquid,” “screw-top cap”). And similarly, every project can be broken down into a small number of tasks that are needed to build those features. Project managers call the list of features the product scope, and they call the tasks the project scope – and a lot of people just talk about all of it as scope.</p>
<p>I’m consistently amazed by how much work a project team can put into a project without before they realize they’ve got a scope problem. Jenny and I talked about this in our book <a href="http://www.stellman-greene.com/aspm/">Applied Software Project Management</a> in the section on scope problems:</p>
<blockquote><p>A change in the project priorities partway through the project is one of the most frustrating ways that a software project can break down. After the software design and architecture is finalized, the code is under development, the testers have begun their preparation, and the rest of the organization is gearing up to use and support the software, a stakeholder “discovers” that an important feature is not being developed. This, in turn, wreaks havoc on the project schedules, causing the team to miss important deadlines as they frantically try to go back and hammer the new feature in.</p>
<p><a href="http://www.stellman-greene.com/aspm/">Applied Software Project Management</a>, p31</p></blockquote>
<p>Does that sound familiar? If so, talking about the scope earlier in the project can really help. One way to help fix this is to put together a Vision and Scope document. It’s a really simple document, usually only a page or two, but it can really help prevent scope problems. It’s also a staple of project management. Once in a while, I’m pulled into a project that’s been running into trouble. I’ll spend a few hours talking to each of the team members, managers, and anyone else I can find who knows something about the project or needs it done. I’ll throw together a quick vision and scope document, and what I’ll often find is everyone had very different ideas of what would actually get built. And it’s usually a big relief, because everyone – especially the lead developers! – realizes that they were going down a path that would have had them waste a lot of time building the wrong software.</p>
<p><a href="http://www.stellman-greene.com/blog/wp-content/uploads/2010/09/triple-constraint-broken.png"><img class="alignnone size-full wp-image-510" title="Broken Triplpe Constraint" src="http://www.stellman-greene.com/blog/wp-content/uploads/2010/09/triple-constraint-broken.png" alt="" width="525" height="398" /></a></p>
<p><em>(source: <a href="http://www.headfirstlabs.com/books/hfpmp/">Head First PMP</a></em><em>, 1st ed., O’Reilly 2007)</em></p>
<h3>Faster, better, cheaper—choose two&#8230; right?</h3>
<p>There’s a whole lot more that I’m tempted to write about managing time, cost, and scope in order to get to the right quality level, but I really want to pare this down to the basics. There’s an old (and somewhat cynical) project management saying: “faster,  cheaper, better: pick two.” What it means is that there’s no way to reduce cost, shorten the schedule, and increase quality all at the same time. At least one of those things absolutely has to give.</p>
<p>But there’s a reason that’s a saying and not a law! All three of those constraints are related to each other, and there’s almost never an easy, obvious trade-off where you can sacrifice one to improve the other two. If there were, project management would be a lot easier. It’s really easy to fall into a trap of trying to do the impossible, but the first step in avoiding a trap is knowing that it’s there. In this case, just knowing that every project is a balancing act between scope, time, and cost is a really good first step in making sure your project ends up running well.</p>
<p>I wanted to leave you with just a couple of thoughts:</p>
<ul>
<li>One thing that makes the “time” aspect of project management tricky is that developers really hate giving estimates – or, more specifically, they hate giving estimates because they know they’ll be misinterpreted as hard commitments. I wrote a blog post about this a while back (The Perils of a Schedule) .</li>
<li>Every project needs a start, middle, and end. My old friend Scott Berkun writes about this beautifully in his book, Making Things Happen.</li>
<li>Cost doesn’t have to mean dollars – it’s often more effective to measure cost in hours.</li>
<li>Burndown charts really help, because they can make the cost seem real.</li>
<li>Sometimes the word “quality” makes developers a little nervous, because they start to think that improving quality just means doing endless testing. Sometimes it helps to replace a phrase like “high-quality software” with “software that we can be proud of.”</li>
</ul>
<img src="http://feeds.feedburner.com/~r/BuildingBetterSoftware/~4/Daa8Vl9rORo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.stellman-greene.com/2010/09/23/a-few-things-every-job-seeking-programmer-should-know-about-project-management-part-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>A Few Things Every Job-Seeking Programmer Should Know About Project Management (part 1)</title>
		<link>http://www.stellman-greene.com/2010/08/30/a-few-things-every-programmer-should-know-about-project-management-part-1/</link>
		<comments>http://www.stellman-greene.com/2010/08/30/a-few-things-every-programmer-should-know-about-project-management-part-1/#comments</comments>
		<pubDate>Mon, 30 Aug 2010 22:24:19 +0000</pubDate>
		<dc:creator>Andrew Stellman</dc:creator>
				<category><![CDATA[Careers]]></category>
		<category><![CDATA[Project Management]]></category>

		<guid isPermaLink="false">http://www.stellman-greene.com/?p=493</guid>
		<description><![CDATA[I’ve met a lot of programmers who really hate project management. And it’s not that surprising, because project management done poorly can be unnecessarily restrictive. But if you’re a developer looking for a job, employers are more and more likely to expect you to know something about project management. Luckily, good project management can make your life easier, and it’s worth knowing about it – not just for job interviews, but to help you get the most out of your own projects. Here are a few basic things that I think every developer ought to know about project management, and why I think you should care about them.]]></description>
				<content:encoded><![CDATA[<p><em>I’ve met a lot of programmers who really hate project management. And it’s not that surprising, because project management done poorly can be unnecessarily restrictive. But if you’re  a developer looking for a job, employers are more and more likely to expect you to  know something about project management. Luckily, good project  management can make your life easier, and it’s worth knowing about it – not just for job interviews, but to help you get the most out of your own projects. Here are a few basic things that I think every developer ought to know about project management, and why I think you should care about them.</em></p>
<p><a href="http://www.stellman-greene.com/blog/wp-content/uploads/2010/08/Seaworthy-project.png"><img class="alignnone size-full wp-image-494" title="Seaworthy project" src="http://www.stellman-greene.com/blog/wp-content/uploads/2010/08/Seaworthy-project.png" alt="" width="575" height="356" /></a></p>
<p><strong>Tough Programmer Interview Questions: Project Management</strong></p>
<p>Programmers are often surprised when a job interview shifts from  technical questions to questions about project management. I just saw a  great example of this in <a href="http://forums.oreilly.com/index.php?s=&amp;showtopic=20701&amp;view=findpost&amp;p=36259">a recent Head First C# forum post</a>:</p>
<div>
<blockquote><p>I am a C# programmer since 2003. I recently took a job interview where I was asked several questions about project management.</p>
<ul>
<li>How do you make an estimate for building a C# program?</li>
<li>How is a project with 3 programmers different from project with 15?</li>
</ul>
<p>- PiterKhasak</p></blockquote>
</div>
<p>This is a lot more common that developers realize. I’ve seen a lot  of discussion lately about how to do effective programmer job searching,  especially for relatively new developers who have three years of  experience or less. Did you ever ace the tech part of an interview, only to find that you didn’t get the job? I bet that a  lot of the time it comes down to questions that seem peripheral or less  relevant – to the a junior developer.</p>
<p>Not to a lot of senior developers. That’s one of the biggest  differences in attitude that I’ve seen between people who are new to  development and people who have been doing it for a long time. And in a  lot of cases, I think it really does come down to attitude. So my goal with this post is to outline the basics of project  management, the core things that really matter.</p>
<p><strong>Why should you care about project management?</strong></p>
<p>There’s a flip side to project management, too. A colleague of mine  once asked me, “What’s the most important part of project management?” I  told him that it’s managing stakeholder expectations – making sure that  the people who have control of the project or are affected by it are in the loop on all the important developments  as the project rolls along. If bad things happen, they know about them  in advance, and are prepared. The reason for this is that some projects  fail (more than you think!), often for reasons that have nothing to do with the team. If you manage everyone’s  expectations, get them on the team’s side, then the developers can come  out as heroes fighting a lost cause. On the other hand, a project can be  a roaring success, but if everyone expects something that’s not exactly what was delivered, the developers could be blamed  for something that they had no control over. Expectations matter,  communication matters, and these things can have a big impact on the  project and the team.</p>
<p>And that’s why developers should care about project management: it  affects your life, even when your job is to keep your nose buried in  code all day.</p>
<p>A lot of developers have a very poor opinion of project management  and project managers. I’ve spent a lot of my career writing books and  giving training to help project managers improve their skills. Over the  years, I’ve met many different types of project managers. And, unfortunately, while there are plenty of great ones out  there, there are a lot of really bad ones as well. In any field, there  is a wide range of skill level and aptitude. If you’re a developer who’s  only ever worked with poor project managers, it’s not surprising if you ended up with a dim view of the project  management as a whole.</p>
<p>But even if you’re a developer who doesn’t have a high opinion of  the field, you should at least acknowledge that learning more about it  can have an impact on your own career. I’ve personally seen employers  pass on good developers who didn’t know enough about project management, even ones who had the technical skills to do  the job.</p>
<p>I’ve also conducted a lot of developer interviews, easily several  hundred of them over the last decade. And one thing that I’ve noticed is  that really good developers have a healthy respect for exactly the same  things that really good project managers care about: the <strong>work</strong> and the <strong>features</strong> needed to create the software, the <strong>team</strong> that crafts it, the <strong>effort</strong> required to build it, and the <strong>quality</strong> of the final product. That’s why I think that learning more about project management can help make you a better developer.</p>
<p>In <a href="http://www.stellman-greene.com/2010/09/23/a-few-things-every-job-seeking-programmer-should-know-about-project-management-part-2/">the next part of this post</a>, I’ll outline those things, and make a case for why they should matter to you.</p>
<img src="http://feeds.feedburner.com/~r/BuildingBetterSoftware/~4/I1o3-C3_w3c" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.stellman-greene.com/2010/08/30/a-few-things-every-programmer-should-know-about-project-management-part-1/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Special Event: O’Reilly Book Club for Geeks</title>
		<link>http://www.stellman-greene.com/2010/08/09/special-event-oreilly-book-club-for-geeks/</link>
		<comments>http://www.stellman-greene.com/2010/08/09/special-event-oreilly-book-club-for-geeks/#comments</comments>
		<pubDate>Tue, 10 Aug 2010 00:10:22 +0000</pubDate>
		<dc:creator>Andrew Stellman</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.stellman-greene.com/?p=483</guid>
		<description><![CDATA[I&#8217;ve got an announcement about a really exciting event. From August 18 to 24, I&#8217;ll be leading a discussion in this forum for the a special O&#8217;Reilly Community event on the Head First C# forum. Please join me there! Bring any questions you&#8217;ve got about C#, becoming a better developer, running your projects, managing your [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.stellman-greene.com/blog/wp-content/uploads/2010/08/inner-circle-148.png"><img class="alignright size-full wp-image-484" style="padding: 6px;" title="The Inner Circle - O'Reilly Book Club for Geeks" src="http://www.stellman-greene.com/blog/wp-content/uploads/2010/08/inner-circle-148.png" alt="" width="148" height="141" /></a></p>
<p>I&#8217;ve got an announcement about a really exciting event. From August 18 to 24, I&#8217;ll be leading a discussion in this forum for the a special O&#8217;Reilly Community event on the <a href="http://forums.oreilly.com/category/60/Head-First-C-/">Head First C# forum</a>. Please join me there! Bring any questions you&#8217;ve got about C#, becoming a better developer, running your projects, managing your career, or building better software.</p>
<p>Here&#8217;s more information from the <a href="http://www.oreillynet.com/pub/e/1705" target="_blank">event page</a>, where you can sign up for the event:</p>
<blockquote>
<h3>Andrew Stellman on C#</h3>
<p><strong>Date:</strong> Aug 18-24, 2010</p>
<p><strong>Led by:</strong> <a href="http://www.oreillynet.com/pub/au/2454">Andrew Stellman</a></p>
<p>If you&#8217;re serious about learning C#, join Andrew Stellman, author of <a href="http://oreilly.com/catalog/0636920000679/">Head First C#</a>, as he discusses the nuances of C# 4.0, Visual Studio 2010 and .NET 4.<br />
<br/></p>
<h3>Andrew explores topics such as:</h3>
<p><br/></p>
<ul>
<li>Why use C# instead of any other language?</li>
<li>C# Best Practices</li>
<li>Becoming a better C# developer</li>
<li>Dealing with objects</li>
<li>Productivity Hints</li>
<li>The Best of C#</li>
</ul>
<p><br/></p>
<h3>What is The Inner Circle?</h3>
<p><strong>The Inner Circle: The O&#8217;Reilly Book Club for Geeks</strong> is an online weeklong discussion forum where passionate technologists can connect with featured O&#8217;Reilly authors.</p></blockquote>
<img src="http://feeds.feedburner.com/~r/BuildingBetterSoftware/~4/tbv02cpgddc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.stellman-greene.com/2010/08/09/special-event-oreilly-book-club-for-geeks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Our obsessive project tracking problem</title>
		<link>http://www.stellman-greene.com/2010/07/31/our-obsessive-project-tracking-problem/</link>
		<comments>http://www.stellman-greene.com/2010/07/31/our-obsessive-project-tracking-problem/#comments</comments>
		<pubDate>Sat, 31 Jul 2010 18:43:14 +0000</pubDate>
		<dc:creator>Andrew Stellman</dc:creator>
				<category><![CDATA[Project Management]]></category>

		<guid isPermaLink="false">http://www.stellman-greene.com/?p=450</guid>
		<description><![CDATA[As a group, we developers have a project tracking problem: the problem is that we constantly, almost obsessively want to track our projects, and it’s made worse by the fact that it’s so easy to abuse otherwise great tools like JIRA and Bugzilla. Unfortunately, while tracking projects may feel useful and productive, for most teams it’s just busywork – and it can lead to a self-imposed exercise in needless bureaucracy that just wastes our time. But with a few ground rules, you can escape the project tracking trap and use a tracking tool effectively.]]></description>
				<content:encoded><![CDATA[<p>&nbsp;</p>
<p><em>As a group, we developers have a project tracking problem: the problem is that we constantly, almost obsessively want to track our projects, and it’s made worse by the fact that it’s so easy to abuse otherwise great tools like <a href="http://www.atlassian.com/software/jira/">JIRA</a> and <a href="http://www.bugzilla.org/">Bugzilla</a></em><em>. Unfortunately, while tracking projects may feel useful and productive, for most teams it’s just busywork – and it can lead to a self-imposed exercise in needless bureaucracy that just wastes our time. But with a few ground rules, you can escape the project tracking trap and use a tracking tool effectively.</em></p>
<p><a href="http://www.stellman-greene.com/blog/wp-content/uploads/2010/07/project-tracking.png"><img class="alignnone size-full wp-image-453" title="Better code through project tracking" src="http://www.stellman-greene.com/blog/wp-content/uploads/2010/07/project-tracking.png" alt="" width="550" height="529" /></a></p>
<p><strong>Who needs Big Brother?</strong></p>
<p>About five years ago, a small company brought me in for a few months to help them do better project management. For about a year before I got there, they’d put a couple of their best developers on the problem, and they came up with an ingenious solution for tracking projects. The team built a database to keep track of all the projects they were working on, typically about a dozen and a half simultaneous projects running at any time. This tool gave them the ability to figure out exactly what tasks had been done, who did them, and how long they took. If you wanted to know what any specific programmer was working on eight weeks ago on Tuesday afternoon, their tool would be able to tell you that.</p>
<p>And it all worked perfectly.</p>
<p>Except that their projects were still late and full of bugs, and the users were losing their last shred of patience. This team had promised their users that things would get better with their fantastic new project tracking system. But even though the system was working exactly as advertised, the software still had serious problems, and everyone was unhappy.</p>
<p>I’ve been thinking a lot about that company lately because I’ve been doing a lot of work with <a href="http://www.atlassian.com/software/jira/">JIRA</a>. And while JIRA is a really good tool – one that can have a very positive effect on how you manage a project – it seems to really tempt a lot of good developers down the same project tracking trap that the small company fell into.</p>
<p>Programmers normally hate it when their time is tracked, which is obvious to anyone who makes the mistake of suggesting to a programming team that they should start filling out timecards that list out exactly what each person did that day. That happened at my first programming job after college: the boss, a newly minted MBA, told the programmers to fill out timecards that listed what project they were working on hour by hour, and there was nearly a rebellion. But for some reason, <a href="http://en.wikipedia.org/wiki/Comparison_of_issue-tracking_systems">JIRA, Bugzilla, and other issue tracking systems</a> cause programmers to step up and volunteer for exactly that treatment. It&#8217;s an odd phenomenon, and I think it has an interesting explanation.</p>
<p>Let’s get something straight, here: I really like JIRA a lot. It’s a great issue tracking tool, and a very good workflow tool when it’s used right. I’ve spent some time building JIRA plugins, and the plugin API is intuitive and easy to use. Sure, I’ve got a couple of nitpicks here and there (I’m not so happy with the user interface or the filters in version 3.x, although it’s definitely improved in JIRA 4). But for the most part, JIRA is one of the best issue management and workflow tools I’ve ever used.</p>
<p>When it’s used right.</p>
<p>But when you take a perfectly good tool and abuse it, you&#8217;re bound to get bad results. And that&#8217;s especially true when it comes to project tracking tools.</p>
<p><a href="http://www.stellman-greene.com/blog/wp-content/uploads/2010/07/nail-screwdriver-fail.png"><img class="alignnone size-full wp-image-456" title="FAIL" src="http://www.stellman-greene.com/blog/wp-content/uploads/2010/07/nail-screwdriver-fail.png" alt="" width="550" height="492" /></a></p>
<p><strong>Tracking projects is not a useful goal</strong></p>
<p>JIRA suffers from a problem that a lot of really good issue tracking tools suffer from. It’s really good at tracking things. And for a lot of developers, that causes a “when you’re holding a hammer, everything looks like a nail” problem. Actually, scratch that. It causes a &#8220;you&#8217;re holding a screwdriver, but for some reason you want to pound nails with it&#8221; problem. It&#8217;s odd when you step back from it, but it really seems to make sense at the time.</p>
<p>What happens is that some developers – and I admit that I&#8217;ve been guilty of this at least once or twice myself – see a tool that gathers information about what happened on a project, and this causes something to click for us. We  start tracking everything, from requirements to goals to user requests to every little ten-minute task that needs to be done. We become our own &#8220;big brother,&#8221; doing what amounts to voluntarily filling out the most detailed timecards possible.</p>
<p>The &#8220;big brother&#8221; style of project tracking is especially bad when the “pointy haired boss” type of managers pick up on it. Suddenly, the team is being nagged to start entering more and more granular estimates and updating dates in tickets. For a boss who’s nervous about delivering something, it seems like the right thing to do is to start nagging programmers about every little task that’s entered into the system, or chasing down anyone who’s got a task assigned without a due date.</p>
<p>Which is especially bad, because that’s not really what those tools are for. There’s a big difference between tracking a task or a bug so it doesn’t slip between the cracks and tracking every little thing that a the programmers do for posterity. I think it’s especially ironic that developers often volunteer for this themselves. I think it’s because we see a tool that can track something and it causes us to want to use it. “It tracks tasks? Then it should track <em>all the tasks</em>!”</p>
<p><strong>Better living through project tracking</strong></p>
<p>A while back the New York Times ran a story on people who use everyday tools like Foursquare and Twitter, blogs, spreadsheets, and datebooks to <a href="http://www.nytimes.com/2010/05/02/magazine/02self-measurement-t.html">obsessively track data about themselves</a>. I think this excerpt is telling, especially the bit at the very end (emphasis mine):</p>
<blockquote><p>At the center of this personal laboratory is the mobile phone. During the years that personal-data systems were making their rapid technical progress, many people started entering small reports about their lives into a phone. Sharing became the term for the quick post to a social network: a status update to <a href="http://www.facebook.com/">Facebook</a>, a reading list on <a href="http://www.goodreads.com/">Goodreads</a>, a location on <a href="http://www.dopplr.com/">Dopplr</a>, Web tags to <a href="http://delicious.com/">Delicious</a>, songs to<a href="http://Last.fm" target="_">Last.fm</a>, your breakfast menu on Twitter. “People got used to sharing,” says David Lammers-Meis, who leads the design work on the fitness-tracking products at Garmin. “The more they want to share, the more they want to <em>have</em> something to share.” Personal data are ideally suited to a social life of sharing. You might not always have something to say, <em><strong>but you always have a number to report</strong></em>.</p></blockquote>
<p>I think that the sort of person who becomes a developer is especially susceptible to whatever it is that causes <a href="http://www.kk.org/quantifiedself/2010/02/a-remarkable-life-logging-proj.php">some people to obsessively track things about their lives</a>. My personal theory is that this is caused by the same itch causes us to want to obsessively collect every last episode of MST3K (or whatever it is we happen to want to obsessively collect). And like that giant collection of, say, legos or video game cartridges or Start Wars figures memorabilia or dice, at some point we can&#8217;t actually play with most of it. That&#8217;s fine for collections (assuming you have it in a cool display case, and not strewn all around your home in piles so high that they cause a fire hazard). But for tracking data from projects, it&#8217;s worse than useless, because it takes effort to keep up, and it can demoralize the software team because they start to feel like they&#8217;re creating more tickets than new lines of code.</p>
<p>Luckily, if you follow a few ground rules, you can break the obsessive cycle and start using project tracking the way it should be used. Here&#8217;s what I&#8217;ve recommended to people in the past, and it seems to get good results:</p>
<ul>
<li><strong>Figure out in advance what you want to track.</strong> Most teams use an issue tracker for bugs. A lot of teams use it to figure out what work the developers are going to do. Some use it for new feature requests. I&#8217;ve seen people try to use an issue tracker for managing requirements (although personally, I really dislike that use of it). All of that could be fine, but any of it can potentially become obsessive. Before you start your project or the next iteration, sit down with the team for a few minutes and write down what you&#8217;ll be tracking. Stick it on a Wiki page, and add a sentence or two explaining how each one of those things needs to be used. I&#8217;m always amazed at how just a little bit of planning like this keeps the way we use a tool from creeping into &#8220;big brother&#8221; territory.</li>
</ul>
<ul>
<li><strong>Use post-mortem reports to track your lessons learned.</strong> One reason that &#8220;big brother&#8221; style project tracking makes intuitive sense is that we want to keep track of the lessons we learned on this project in order to make the next one run better. But there&#8217;s very little you can learn from an overwhelming pile of tracking tickets. Instead, try <a href="http://www.stellman-greene.com/2009/07/24/taking-stock-of-a-failed-project/">running a project post-mortem</a> at the end of the project. And don&#8217;t just do it for projects that ran badly. Post-mortems are really good for making sure you take a good project and turn it into great habits for the team by writing down the lessons you learned.</li>
</ul>
<ul>
<li><strong>Focus on trends and simple metrics, not complete history.</strong> A good project tracking system can spit out a lot of reports. So many reports, in fact, that it&#8217;s hard to make any real sense of them. That&#8217;s why I like to try to simplify the kind of data I get out of the system. I&#8217;m a big fan of simple metrics like (% of engineering effort per project phase) that let you compare projects or iterations against each other. Also, burn-down charts or other earned value metrics can be really valuable in figuring out how your current project is going.</li>
</ul>
<p>The bottom line is that there&#8217;s a difference between project tracking and actually managing your project. If you really want to use JIRA for project management, use a tool like <a href="http://www.atlassian.com/software/greenhopper/">Greenhopper</a> that was built for it. (I&#8217;ve been using Greenhopper lately, and I like it a lot. But if someone has a pointer to an open source tool they really like that ties a task board or agile project management into their issue tracker, I&#8217;d love to hear about it.) The most important thing to remember is that tracking your project is a means to an end, and not a goal by itself.</p>
<img src="http://feeds.feedburner.com/~r/BuildingBetterSoftware/~4/t8aqBtA7jDQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.stellman-greene.com/2010/07/31/our-obsessive-project-tracking-problem/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Announcing Head First C#, 2nd edition</title>
		<link>http://www.stellman-greene.com/2010/06/22/announcing-head-first-c-2nd-edition/</link>
		<comments>http://www.stellman-greene.com/2010/06/22/announcing-head-first-c-2nd-edition/#comments</comments>
		<pubDate>Tue, 22 Jun 2010 14:17:36 +0000</pubDate>
		<dc:creator>Andrew Stellman</dc:creator>
				<category><![CDATA[Books]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://www.stellman-greene.com/?p=478</guid>
		<description><![CDATA[Jenny and I are really proud to announce that the second edition of our bestselling C# learning book, Head First C#, went to press! We worked really hard on it, and we&#8217;re very happy with how it came out. Are you looking for the easiest way to become a great C# programmer? If want to [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.headfirstlabs.com/books/hfcsharp/"><img title="Head First C#, 2nd Edition" src="http://covers.oreilly.com/images/0636920000679/lrg.jpg" alt="Head First C#, 2nd Edition" width="500" height="578" border="1" /></a></p>
<p>Jenny and I are really proud to announce that the second edition of our bestselling C# learning book, <a href="http://www.headfirstlabs.com/books/hfcsharp/"><em>Head First C#</em></a>, went to press! We worked really hard on it, and we&#8217;re very happy with how it came out.</p>
<p>Are you looking for the easiest way to become a great C# programmer? If want to get productive fast with C#, .NET and Visual Studio 2010, then this is the book you&#8217;re looking for. We show you how to learn C# by building over 100 different projects—including lots of games!—and solving dozens of puzzles.</p>
<p><em>Head First C#</em> is a complete learning experience for programming with C#, the .NET Framework, and the Visual Studio IDE. Built for your brain, this book covers C# and .NET 4.0 and Visual Studio 2010, and teaches everything from inheritance to serialization.</p>
<p>But don&#8217;t take our word for it! Download the <a href="http://www.headfirstlabs.com/books/hfcsharp/hfcsharp_free_book.pdf">free Head First C# eBook [PDF]</a>, which includes the first three chapters, complete. Or have a look at this <a href="http://www.headfirstlabs.com/books/hfcsharp/Build-a-typing-game-updated.pdf">typing game project [PDF]</a> from chapter 4 to get a preview of the kinds of projects you&#8217;ll build throughout the book.</p>
<p>So check out <em>Head First C#</em> today, and see what the buzz is all about! <a href="http://oreilly.com/catalog/0636920000679/">Available now from O&#8217;Reilly</a>, and wherever fine books are sold.</p>
<img src="http://feeds.feedburner.com/~r/BuildingBetterSoftware/~4/_fIxSxyWENc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.stellman-greene.com/2010/06/22/announcing-head-first-c-2nd-edition/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nonfunctional Requirements Q&amp;A</title>
		<link>http://www.stellman-greene.com/2010/02/17/nonfunctional-requirements-qa/</link>
		<comments>http://www.stellman-greene.com/2010/02/17/nonfunctional-requirements-qa/#comments</comments>
		<pubDate>Wed, 17 Feb 2010 17:47:50 +0000</pubDate>
		<dc:creator>Andrew Stellman</dc:creator>
				<category><![CDATA[Q&A]]></category>
		<category><![CDATA[Quality]]></category>
		<category><![CDATA[Requirements]]></category>

		<guid isPermaLink="false">http://www.stellman-greene.com/?p=436</guid>
		<description><![CDATA[Non-functional requirements Q&#38;A: We answer questions from readers about using nonfunctional requirements on a real software project, and how to use them on a real software project. Non-functional requirements: Planning out how well your software will work A couple of months ago I wrote a post called Using nonfunctional requirements to build better software. It&#8217;s [...]]]></description>
				<content:encoded><![CDATA[<p><em>Non-functional requirements Q&amp;A: We answer questions from readers about using <strong>nonfunctional requirements</strong> on a real software project, and how to use them on a real software project.</em></p>
<p><em><a href="http://www.stellman-greene.com/blog/wp-content/uploads/2009/10/jeez.-lady.png"><img class="alignnone size-full wp-image-402" title="Jeez, lady" src="http://www.stellman-greene.com/blog/wp-content/uploads/2009/10/jeez.-lady.png" alt="" width="550" height="346" /></a></em></p>
<h3>Non-functional requirements: Planning out how well your software will work</h3>
<p>A couple of months ago I wrote a post called <a id="aptureLink_KwUExBHA6H" href="../../2009/10/03/using-nonfunctional-requirements/"><em>Using nonfunctional requirements to build better software</em></a>. It&#8217;s basically a step-by-step guide for creating an easy, practical technique to use nonfunctional requirements on a real software project, treating them in a way that&#8217;s similar to how a lot of Agile teams treat user stories, scenarios and other functional requirements: by sticking them on index cards and using them to do some lightweight planning.</p>
<p>Since then, I&#8217;ve gotten a lot of questions about nonfunctional requirements (or, as some people call them, non functional requirements, behavioral requirements, quality attributes, and probably half a dozen other names). Based on the questions I&#8217;ve been getting, a lot of people really seem to want a solid overview of exactly what they are:</p>
<ul>
<li>What are nonfunctional requirements?</li>
<li>What goes into a <em>good</em> nonfunctional requirement?</li>
<li>Is there a nonfunctional requirements checklist that I can use?</li>
<li>How do I write down a nonfunctional requirement? Is there a nonfunctional requirements template I can use?</li>
</ul>
<p>Luckily, Jenny and I addressed exactly those questions in our first book, <a href="http://www.amazon.com/Applied-Software-Project-Management-Stellman/dp/0596009488/">Applied Software Project Management</a>, and I&#8217;ve gotten feedback over the years from people who read it (and other <a href="../../category/requirements/">writing I&#8217;ve done about requirements</a>), and tell me it helped them get a handle on the concepts behind nonfunctional requirements. So I&#8217;ll do a little requirements Q&amp;A and address those questions one by one, drawing from the book where possible. And I&#8217;ve posted an O&#8217;Reilly Community blog post called <a href="http://broadcast.oreilly.com/2010/02/nonfunctional-requirements-how.html">Understanding nonfunctional requirements</a> with some additional information, which should also help get to the bottom of the issue.</p>
<h3>Q: What are non-functional requirements?</h3>
<p>Non-functional requirements &#8212; or behavioral requirements, or quality attributes &#8212; describe how well a system performs its function. This is fundamentally different than the typical functional requirements that most of us are used to, which describe what that system does.</p>
<p>Here&#8217;s a quick example. Whenever I&#8217;m talking about requirements, I like to use a &#8220;search and replace&#8221; feature in a word processor or text editor as an example, because we&#8217;re all familiar with how it works. So while a functional requirement for &#8220;search and replace&#8221; might describe how the case-sensitive matching works: &#8220;If the original text was all uppercase, then the replacement text must be inserted in all uppercase.&#8221; A nonfunctional requirement, on the other hand, might describe the performance (&#8220;it must be able to replace 1000 search terms in a 3MB document in under 250ms on one of our standard test VMs running at 50% load&#8221;).</p>
<h3>Q: What goes into a <em>good</em> nonfunctional requirement?</h3>
<p>A <em>good</em> nonfunctional requirement is one that makes it clear to everyone on the project &#8212; including the user (or someone who really understands what the user needs) &#8212; exactly how the software has to perform. Remember, a good requirement (functional or nonfunctional) is about understanding and addressing the needs of a user.</p>
<p>Here&#8217;s what Jenny and I wrote about nonfunctional requirements in our first book:</p>
<blockquote><p>Users have implicit expectations about how well the software will work. These characteristics include how easy the software is to use, how quickly it executes, how reliable it is, and how well it behaves when unexpected conditions arise. The nonfunctional requirements define these aspects about the system.<em> — <a href="http://www.amazon.com/Applied-Software-Project-Management-Stellman/dp/0596009488/">Applied Software Project Management</a>, p113 (O&#8217;Reilly 2005)</em></p></blockquote>
<p>It&#8217;s really easy for non functional requirements to be unclear or ambiguous. The best way to make sure a nonfunctional requirement is clear and easy to use is to <em>quantify</em> it. So instead of saying that a task must be done quickly, write down the maximum number of seconds it must take to perform a task. The maximum size of a database on disk, the number of hours per day a system must be available, and the number of concurrent users supported are examples of requirements that the software must implement but do not change its behavior.</p>
<h3>Q: Is there a nonfunctional requirements checklist that I can use?</h3>
<p>We put together a nonfunctional requirements checklist that I&#8217;ve used many times on real projects. It&#8217;s based on a list of nonfunctional requirements we included in <em>Applied Software Project Management</em>.</p>
<p>Here&#8217;s one thing to keep in mind about this (or any other) non functional requirements checklist: as you&#8217;re reading it, you&#8217;ll probably find yourself thinking, &#8220;Wait a minute, all my software needs to be flexible (or efficient, or robust, etc.).&#8221; Yes, that&#8217;s true, of course. But are there <strong>specific</strong> non-functional requirements that affect your project in particular, above and beyond what you do on every project? That&#8217;s what this checklist is for, and that&#8217;s what you should be thinking about when you write down nonfunctional requirements.</p>
<ul>
<li>Availability: Are their constraints on the system&#8217;s availability or uptime?</li>
<li>Efficiency: Are there resources the system needs to be careful about monopolizing?</li>
<li>Flexibility: Will the system need to be altered after deployment?</li>
<li>Portability: How easy it is to move to another platform?</li>
<li>Integrity: How sensitive is the project to data security, access, and privacy?</li>
<li>Robustness: Do error conditions need to be handled gracefully?</li>
<li>Scalability: Will the system need to handle a wide range of configuration sizes?</li>
<li>Usability: Are there specific constraints on how the users will understand, learn and use the software?</li>
</ul>
<p>If you&#8217;re interested in using this on a real project , you can read more about it in that <a href="http://broadcast.oreilly.com/2010/02/nonfunctional-requirements-how.html">O&#8217;Reilly Broadcast post about non-functional requirements</a>: I post a relevant excerpt from <em>Applied Software Project Management</em> that goes into more detail about each of these.</p>
<h3>Q: How do I write down a nonfunctional requirement? Is there a nonfunctional requirements template I can use?</h3>
<p>Yes. We put together a <a href="../../Software_requirements_specification">software requirements specification template</a>, and I&#8217;ve helped a lot of teams adopt it for their own projects over the years. When we put together our requirements templates, we put a lot of effort into streamlining them as much as possible. So this is a sort of &#8220;bare minimum&#8221; template for writing down use cases, functional requirements, and nonfunctional requirements.</p>
<p>Here&#8217;s an example of how we&#8217;d specify a functional requirement:</p>
<table border="1px">
<tbody>
<tr>
<td><strong>Name</strong></td>
<td>Nonfunctional requirement #7: Performance constraints for search-and-replace</td>
</tr>
<tr>
<td><strong>Summary</strong></td>
<td>The search-and-replace feature must perform a search quickly.</td>
</tr>
<tr>
<td><strong>Rationale</strong></td>
<td>If a search is not fast enough, users will avoid using the software.</td>
</tr>
<tr>
<td><strong>Requirements</strong></td>
<td>A case-insensitive search-and-replace performed on a 3MB document with twenty 30-character search terms to be replaced with a different 30-character search term must take under 500ms on one of our standard testing VMs at 50% CPU load.</td>
</tr>
<tr>
<td><strong>References</strong></td>
<td>See use case #8: <em>Search</em></td>
</tr>
</tbody>
</table>
<p>And that gets back to the blog post I mentioned earlier, <a id="aptureLink_KwUExBHA6H" href="../../2009/10/03/using-nonfunctional-requirements/"><em>Using nonfunctional requirements to build better software</em></a>. If you&#8217;re working on a team that uses an agile process to build software, there&#8217;s a good chance that you already write down a lot of your requirements on index cards. In that post, I outline a method that I&#8217;ve had a lot of success with in my own projects.</p>
<p>I went into a lot more detail in that post, but here&#8217;s a quick recap. First, I write the requirement itself on the front of an index card:</p>
<p><img src="http://broadcast.oreilly.com/2010/02/17/stellman/nf_index_card_front.jpg" alt="Nonfunctional requirement index card (front)" width="450" height="271" /></p>
<p>and on the back I&#8217;ll write a specific test to make sure the requirement is implemented:</p>
<p><img src="http://broadcast.oreilly.com/2010/02/17/stellman/nf_index_card_back.jpg" alt="nf_index_card_back.jpg" width="450" height="267" /></p>
<p>Then I use it for planning the project to make sure it actually gets included &#8212; you can see more about it in the post. As far as documenting nonfunctional requirements goes, that&#8217;s actually a really efficient way of doing it, and I&#8217;ve seen it work well on agile projects.</p>
<p>I hope that answers some of your questions about using nonfunctional requirements in software projects. Obviously, I&#8217;d be thrilled if you took a look at the requirements chapter in <a href="http://www.amazon.com/Applied-Software-Project-Management-Stellman/dp/0596009488/">Applied Software Project Management</a> &#8212; Jenny and I gave a lot of practical advice about how to use requirements on a software project. And I&#8217;ve got other <a href="../../category/requirements/">requirements posts on Building Better Software</a> as well. But if they don&#8217;t answer your questions, feel free to ask (or <a href="../../contact-us/">send them to us</a>).</p>
<img src="http://feeds.feedburner.com/~r/BuildingBetterSoftware/~4/Y5yit3VSFu0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.stellman-greene.com/2010/02/17/nonfunctional-requirements-qa/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>When team members hate each other</title>
		<link>http://www.stellman-greene.com/2009/10/27/when-team-members-hate-each-other/</link>
		<comments>http://www.stellman-greene.com/2009/10/27/when-team-members-hate-each-other/#comments</comments>
		<pubDate>Tue, 27 Oct 2009 13:58:39 +0000</pubDate>
		<dc:creator>Andrew Stellman</dc:creator>
				<category><![CDATA[Teams]]></category>

		<guid isPermaLink="false">http://www.stellman-greene.com/?p=430</guid>
		<description><![CDATA[We don&#8217;t always get to choose our teammates, especially at work. So what do you do when you just don&#8217;t get along with someone on your team? Not too long ago, I was doing our Beautiful Teams talk at a brown bag lunch for a big financial company here in New York. At the end [...]]]></description>
				<content:encoded><![CDATA[<p><em>We don&#8217;t always get to choose our teammates, especially at work. So what do you do when you just don&#8217;t get along with someone on your team?</em></p>
<p><img class="alignnone size-full wp-image-431" title="What's your point?" src="http://www.stellman-greene.com/blog/wp-content/uploads/2009/10/whats-your-point.png" alt="What's your point?" width="500" height="463" /></p>
<p>Not too long ago, I was doing our <a href="http://www.stellman-greene.com/2009/04/23/our-new-beautiful-teams-talk-at-boston-spin/">Beautiful Teams talk</a> at a brown bag lunch for a big financial company here in New York. At the end of the talk, I got a really good question:</p>
<blockquote><p><em>What do you do when you&#8217;re on a team with people who don&#8217;t get along?</em></p></blockquote>
<p>We don&#8217;t get to choose our teams, and while I&#8217;ve been on plenty of teams that gelled really well, I&#8217;ve definitely had to work with people who just rubbed me the wrong way or, worse, where the feeling was mutual. It&#8217;s a tough problem, but one that should be really familiar to anyone who&#8217;s been working with teams for a long time.</p>
<p>I have to admit that while I&#8217;ve had success working on teams with people who didn&#8217;t get along, there have definitely been a few times when I didn&#8217;t handle that situation as well as I could have. Luckily, those are the situations where we learn the most.</p>
<p>That&#8217;s actually one of the main reasons Jenny and I wanted to talk to Andy Lester when we were talking to contributors for <em><a href="http://www.amazon.com/Beautiful-Teams-Inspiring-Cautionary-Veteran/dp/0596518021/">Beautiful Teams</a></em>. Andy runs a great website called <a href="http://theworkinggeek.com/">The Working Geek</a>, where he talks about working life for programmers, sysadmins and other geek types. And he had some really interesting things to say about how people interact with each other — especially geeky types (like me), since we seem to be especially prone to interpersonal problems. (Imagine that!)</p>
<p>I really liked this quote from Andy, because I think it cuts to the heart of the matter:</p>
<blockquote><p><span style="color: #003366;">I was on a team once where I said, &#8220;At the very least, can we just have minimal respect for everyone here?&#8221; And I was asked quite seriously by someone else, &#8220;Well, what if not everybody on this team is worthy of respect?&#8221; And that&#8217;s baffling to me as a human, but it&#8217;s also not uncommon. And that minimal amount of respect is something that many just don&#8217;t get.</span></p>
<p><span style="color: #003366;">— <a title="The Working Geek" href="http://theworkinggeek.com/">Andy Lester</a>, <em>Beautiful Teams</em> (chapter 5)</span></p></blockquote>
<p>He&#8217;s right. When I look back over my own career, I find that many of my own conflicts with people on my team stemmed from a basic lack of respect. Since I was the top programmer on the team, I thought I knew better than everyone else about everything. Once someone got something wrong technically, I&#8217;d write that person off entirely because they didn&#8217;t have my respect.</p>
<p>Andy offers some really good personal advice for getting past those problems, both in his <em>Beautiful Teams</em> chapter and on his blog.</p>
<p>But I wanted to go a little further than that, because sometimes interpersonal problems aren&#8217;t going to be repaired. The person who asked me the question was in this situation: when I asked him about it, it sounded like some of his teammates were simply never going to get along with each other. So what do you do about that?</p>
<p>As it turns out, the answer I gave him comes from another part of <em>Beautiful Teams</em>. When Jenny and I were putting it together, we put a lot of thought into how to divide it into sections. And so many people talked explicitly about setting goals for projects that we ended up including an entire section called Goals.</p>
<p>So my answer to anyone who&#8217;s got insurmountable (at least, in the short run) conflicts between team members is to make sure that you&#8217;ve established what many of our contributors referred to as an &#8220;elevating goal.&#8221;</p>
<p>One of those contributors was <a href="http://www.stevemcconnell.com/">Steve McConnell</a>, who also happens to be one of my favorite authors. We asked another one of our favorite authors (and an old friend of mine), <a href="http://www.scottberkun.com/">Scott Berkun</a>, to interview him for the book, and out of that interview came this great quote:</p>
<blockquote><p><span style="color: #003366;">If you’re out digging ditches, that’s not very elevating or inspiring. But if you’re digging ditches to protect your town that’s about to be attacked by an enemy, well, that’s more inspiring, even though it’s the same activity. And so the leader’s job, really, is to try to determine or frame the activity in such a way that people can understand what the value is.</span></p>
<p><span style="color: #003366;">— <a href="http://www.stevemcconnell.com/">Steve McConnell</a>, Beautiful Teams (chapter 16)</span></p></blockquote>
<p>I think that really cuts to the heart of what it means to establish an elevating vision, and it should help show why that can help get past serious team problems. I have to admit that before working on this book, I hadn&#8217;t really given that much thought to establishing a vision. Yes, establishing a goal for a project is important, but I always thought about it in terms of the work that had to be done. I&#8217;d generally dismiss anything like an &#8220;elevating vision or goal&#8221; as a business-speak buzzword. A really valuable lesson for me was just how important it is to get everyone on the team on board with that one singular vision — and I mean actually understanding and embracing the vision for the project, and not just agreeing to some sort of lame mission statement.</p>
<p>What&#8217;s especially useful about getting everyone on the team to see the same vision is that you don&#8217;t need to be a manager or team lead to do it. All you need to do, minimally, is talk to people on your team. I&#8217;ve been brought onto projects where people on the team thought that there were serious architecture or requirements or quality problems. But once I started I talking to people, it turned out that everyone had a completely different idea of what they were building and why they were building it. I&#8217;ve found over and over again that just writing down what we&#8217;re building and who we&#8217;re building it for (using a <a title="Vision and Scope Document" href="http://stellman-greene.com/vision_and_scope">Vision and Scope Document</a>, for example) is enough to help the situation. It&#8217;s uncanny how often I&#8217;ve heard people say something like, &#8220;Wait, we&#8217;re building <em>what</em>? I thought we were doing something completely different!&#8221;</p>
<p>Anyone on the team can do that, and it&#8217;s a really valuable tool to help with serious teammate problems. The clearer everyone sees the real goal of the project, the easier it is to get past the disagreements and arguments and get on with the work. It&#8217;s something I&#8217;ve seen in real life many times, and it really does work: people are much more willing to settle disagreements and just get down to business if they can see that there&#8217;s a real end that they&#8217;re working towards.</p>
<p>When I look back at the times where I was able to successfully navigate serious team problems that were caused by people who didn&#8217;t like each other, I can see how this is exactly what I did. Even when people didn&#8217;t get along, I found that if I was able to get each person to see the bigger picture and work towards something he or she believed in, then most of the time they were able to put their problems on the back burner, at least long enough to get through, say, a meeting or a code review. And that was enough to save the project.</p>
<img src="http://feeds.feedburner.com/~r/BuildingBetterSoftware/~4/wVMw__l7uWM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.stellman-greene.com/2009/10/27/when-team-members-hate-each-other/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Using nonfunctional requirements to build better software</title>
		<link>http://www.stellman-greene.com/2009/10/03/using-nonfunctional-requirements/</link>
		<comments>http://www.stellman-greene.com/2009/10/03/using-nonfunctional-requirements/#comments</comments>
		<pubDate>Sat, 03 Oct 2009 20:14:44 +0000</pubDate>
		<dc:creator>Andrew Stellman</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Quality]]></category>
		<category><![CDATA[Requirements]]></category>

		<guid isPermaLink="false">http://www.stellman-greene.com/?p=397</guid>
		<description><![CDATA[Understanding nonfunctional requirements — which some people call software quality attributes or nonbehavioral requirements — can make a big difference when you&#8217;re building software. But a lot of people have trouble taking a somewhat theoretical idea and applying it to a real-life project. Luckily, we&#8217;ve got an easy, practical technique to use nonfunctional requirements on [...]]]></description>
				<content:encoded><![CDATA[<p><em>Understanding <strong>nonfunctional requirements</strong> — which some people call software quality attributes or nonbehavioral requirements — can make a big difference when you&#8217;re building software. But a lot of people have trouble taking a somewhat theoretical idea and applying it to a real-life project. Luckily, we&#8217;ve got an <strong>easy, practical technique</strong> to use nonfunctional requirements on a real software project.</em></p>
<p><img class="alignnone size-full wp-image-402" title="Jeez, lady" src="http://www.stellman-greene.com/blog/wp-content/uploads/2009/10/jeez.-lady.png" alt="Jeez, lady" width="550" height="346" /></p>
<h4>How well does your program do&#8230; well, whatever it does?</h4>
<p>I&#8217;ve wanted to write a post about <a href="http://en.wikipedia.org/wiki/Non-functional_requirement">nonfunctional requirements</a> for a while. But I&#8217;ve been trying to find a good angle for talking about them, because while they can be really practical and useful on a software project, it&#8217;s a little hard to get that practicality across in a useful way.</p>
<p>Luckily, I&#8217;ve been spending a lot of time lately talking about architecture, since Jenny and I are going to give our <a href="http://www.stellman-greene.com/2009/04/23/our-new-beautiful-teams-talk-at-boston-spin/">Beautiful Teams talk </a>at the <a title="IT Architects Conference 2009" href="http://www.iasahome.org/web/itarc/2009/NYC">ITARC New York conference</a> next week. And that&#8217;s got me thinking a lot about how architects work. I&#8217;ve been asked more than once recently about what, exactly, the term &#8220;architecture&#8221; refers to. The quick answer is the textbook definition — designing, documenting and verifying the structure, components and properties of a system. But I always want to go beyond that. Any time I come across an interesting idea (and software architecture is full of them!), I try to come up with a way that it can help a developer out today, on a project that developer is working on. In fact, I&#8217;ve got a quick technique to help you do exactly that — it&#8217;s at the end of this post. And like many great software practices, it involves index cards.</p>
<p>So I started thinking about some common problems that software architects run into, especially junior ones who are still building up their experience. And that leads me straight to a problem that I&#8217;ve seen over and over again. A lot of people jump into architecture and design by starting with the question, &#8220;What&#8217;s this system going to do?&#8221; We&#8217;ve got a lot of very useful tools for that (like <a href="http://www.stellman-greene.com/2009/05/03/requirements-101-user-stories-vs-use-cases/">user stories and use cases</a>). Obviously, you can&#8217;t design a system well without understanding what it does.</p>
<p>But I&#8217;ve had the opportunity to work with some very talented, very experienced software architects lately, and I&#8217;ve noticed something critically different about how they approach designing a system, and it&#8217;s really pointed me to an important difference that separates a senior architect from a junior one. When one of these guys gets started on a system, they don&#8217;t just think about what it&#8217;s going to do. They also think about <strong>how</strong> it&#8217;s going to do whatever it does.</p>
<p>That&#8217;s a really subtle point, and it&#8217;s a very easy one to overlook. But it&#8217;s very important. Important enough, in fact, to have a name: <strong>nonfunctional requirements</strong>.</p>
<p>Most of us have read about nonfunctional requirements. In fact, it&#8217;s a pretty common interview question: &#8220;Name a few nonfunctional requirements.&#8221; Someone who took a class in software architecture recently might be able to rattle a few of them off (usability, reliability, performance, scalability, availability&#8230;). And lots of project managers and business analysts I talk seem to be on an eternal quest for the perfect nonfunctional requirements template.</p>
<p>If you&#8217;re not familiar with nonfunctional requirements, here&#8217;s how Jenny and I defined them in our first book:</p>
<blockquote><p><em><span style="color: #003366;">Users have implicit expectations about how well the software will work. These characteristics include how easy the software is to use, how quickly it executes, how reliable it is, and how well it behaves when unexpected conditions arise. The nonfunctional requirements define these aspects about the system. (The nonfunctional requirements are sometimes referred to as &#8220;nonbehavioral requirements&#8221; or &#8220;software quality attributes.&#8221;)</span></em></p>
<p><em><span style="color: #003366;">– Andrew Stellman &amp; Jennifer Greene, </span></em><a title="Applied Software Project Management" href="http://www.stellman-greene.com/aspm"><em><span style="color: #003366;">Applied Software Project Management</span></em></a><em><span style="color: #003366;">, chapter 6 (O&#8217;Reilly 2005)</span></em></p></blockquote>
<p>And that&#8217;s a good starting point. But there&#8217;s an art to actually using nonfunctional requirements to make your software better. So how do we do that?</p>
<h4>Thinking &#8220;how well&#8221; from the start</h4>
<p>One of those senior architects I mentioned gave me a really good tip recently, one that really rings true. He told me, &#8220;Always think about performance from day one of your project, and test for it until you deliver.&#8221; Now, this particular person works on software tools used to design high-availability, high-performance server systems, so he thinks about performance a lot. But his point was that to design systems well, you need to think about performance — and other nonfunctional requirements — from the start.</p>
<p>Take a minute and think about that, because I think it&#8217;s an important point. I like it a lot for two reasons.</p>
<p>I like the fact that he&#8217;s thinking about how well the software works from the beginning of the project. I&#8217;m a firm believer in the old QA saying that &#8220;you can&#8217;t test quality in.&#8221; Yes, I know that saying rubs some people the wrong way because they think it sometimes lets people off the hook for testing at the end of the project. But there&#8217;s definitely a lot of truth in the idea that developers who think about quality from the beginning of the project build better software. If you design for performance, and if you then code for performance, then it&#8217;s pretty likely that you&#8217;ll end up with a more performant design than if only start thinking about performance at the very end of the project.</p>
<p>The other thing I like is that he didn&#8217;t say, &#8220;Think about performance, scalability, usability, robustness, etc., from the beginning of the project.&#8221; He narrowed it down to the single quality attribute that was most important to his particular project. I&#8217;ve talked to a lot of developers, project managers, designers, testers and business analysts over the years about nunfunctional requirements, and what I often find is that people seem overwhelmed. There are so many facets to quality beyond what the software does, and if you&#8217;re just trying to get started thinking about these things, it&#8217;s hard to know where to start.</p>
<p>Which leads me to my advice for developers. If you&#8217;re a programmer working on a project, here&#8217;s something that you can do today to improve the final product. Start with just three areas: availability, performance and reliability. I like these three because they&#8217;re easy to understand, it&#8217;s not hard to brainstorm examples of how they can go wrong.</p>
<p>Start with some definitions. Here are ones that Jenny and I gave in <a href="http://www.amazon.com/Applied-Software-Project-Management-Stellman/dp/0596009488/">Applied Software Project Management</a>:</p>
<blockquote><p><strong><em><span style="color: #003366;">Performance:</span></em></strong><em><span style="color: #003366;"> The performance constraints specify the timing characteristics of the software. Certain tasks or features are more time-sensitive than others; the nonfunctional requirements should identify those software functions that have constraints on their performance.</span></em></p>
<p><strong><em><span style="color: #003366;">Flexibility:</span></em></strong><em><span style="color: #003366;"> If the organization intends to increase or extend the functionality of the software after it is deployed, that should be planned from the beginning; it influences choices made during the design, development, testing, and deployment of the system.</span></em></p>
<div><strong><em><span style="color: #003366;">Reliability:</span></em></strong><em><span style="color: #003366;"> Reliability specifies the capability of the software to maintain its performance over time. Unreliable software fails frequently, and certain tasks are more sensitive to failure (for example, because they cannot be restarted, or because they must be run at a certain time).</span></em></div>
</blockquote>
<p>Now, make them <strong>practical and useful to your project</strong> by doing thee simple steps. To do this, you&#8217;ll need three index cards. Here&#8217;s what to do:</p>
<ol>
<li>On the front of each of the three index cards, write one a type of nonfunctional requirement at the top. So on the first card, write &#8220;Performance&#8221;. On the second one, write &#8220;Flexibility&#8221;. And on the third one, write &#8220;Reliability&#8221;. Write these words on the front and the back of the card. If bright colors grab your attention, use a bright-colored highlighter to highlight them. (Personally, they don&#8217;t really do anything for me.)</li>
<li>Take each of the cards. On each of them write down the name of one feature f your software and what this particular attribute means for that feature. I like to use <a href="http://www.stellman-greene.com/use_cases">Search and Replace</a> as an example whenever I talk about this sort of thing, because we&#8217;ve all used it and understand it. So on the Performance card I might write, &#8220;Search and replace: searching through a large document needs to be fast.&#8221;
<ul>
<li><img class="alignnone size-full wp-image-408" title="Performance index card" src="http://www.stellman-greene.com/blog/wp-content/uploads/2009/10/nf_index_card_front1.jpg" alt="Performance index card" width="450" height="271" /></li>
</ul>
</li>
<li>Here&#8217;s the hard part. On the back of each card, write down a single test that you can do to figure out how well your software meets that requirement. So on the back of the performance card I might write, &#8220;Replacing 100 occurrences of a 4-character string in a 25MB document has to take under 750 milliseconds.&#8221; (The more concrete you can make this test, the better this works.)
<ul>
<li><img class="alignnone size-full wp-image-406" title="Performance index card (back)" src="http://www.stellman-greene.com/blog/wp-content/uploads/2009/10/nf_index_card_back.jpg" alt="Performance index card (back)" width="450" height="267" /></li>
</ul>
</li>
</ol>
<p>Now that you&#8217;ve got those three cards, tack them up on your cubicle wall (or, even better, on your task board). Make sure the feature you wrote down in step #2 is facing forward. Make sure they&#8217;re someplace you&#8217;ll see them. Take just a minute or two each day to look at them and figure out if you&#8217;re headed in the right direction. What you&#8217;ll find more often than not is that as you&#8217;re designing your system, you won&#8217;t forget about those three things. Just spending a small amount of time writing down and thinking about these things can color your whole project.</p>
<p>Once you&#8217;ve moved from the design phase into the programming phase, flip the cards around so the test side is showing forward. (If you&#8217;re on an agile project with a three-week iteration, this might happen during the first week, but this works equally well for projects with a longer design phase.) As you&#8217;re writing the code for each of the features you wrote down, run that test by hand. It should only take a few minutes to do, and it will give you an idea of how well you&#8217;re doing. If you do this enough, you might end up figuring out a way to automate that test. If you do, and if you have a build server, then you can add it to the build. That way you&#8217;ll know any time you check in code that causes your project to see its performance (or reliability, or flexibility) degrade.</p>
<p>Try doing that on your next project, and what you should find is that you spend more time thinking about these things. When opportunities to improve those three specific things come up, you&#8217;ll recognize them and take them. And that&#8217;s a great way to build better software.</p>
<img src="http://feeds.feedburner.com/~r/BuildingBetterSoftware/~4/Q3xVRIAFmH4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.stellman-greene.com/2009/10/03/using-nonfunctional-requirements/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>What makes architecture “better”?</title>
		<link>http://www.stellman-greene.com/2009/09/22/what-makes-architecture-better/</link>
		<comments>http://www.stellman-greene.com/2009/09/22/what-makes-architecture-better/#comments</comments>
		<pubDate>Tue, 22 Sep 2009 14:45:04 +0000</pubDate>
		<dc:creator>Andrew Stellman</dc:creator>
				<category><![CDATA[Architecture]]></category>

		<guid isPermaLink="false">http://www.stellman-greene.com/?p=388</guid>
		<description><![CDATA[I&#8217;ve got some news! Jenny and I are going to be doing our Beautiful Teams talk at the upcoming IT Architect Regional Conference. We spoke at last year&#8217;s ITARC, and I was really impressed with the quality of their speakers. There were some really good insights into software architecture. It&#8217;s a great group, and I [...]]]></description>
				<content:encoded><![CDATA[<p>I&#8217;ve got some news! Jenny and I are going to be doing our <em>Beautiful Teams</em> talk at the upcoming <a title="ITARC 2009 NYC" href="http://www.iasahome.org/web/itarc/2009/NYC">IT Architect Regional Conference</a>. We spoke at last year&#8217;s ITARC, and I was really impressed with the quality of their speakers. There were some really good insights into software architecture. It&#8217;s a great group, and I definitely recommend it to anyone looking to do a serious deep dive into software architecture.</p>
<p><img class="alignnone size-full wp-image-393" title="Better" src="http://www.stellman-greene.com/blog/wp-content/uploads/2009/09/Better.png" alt="Better" width="400" height="533" /></p>
<p>And that got me thinking about one of the important areas of architecture, one that I think a lot of people tend to overlook. Actually, what really got me started thinking about it was a Slashdot post, &#8220;<a href="http://news.slashdot.org/story/09/09/20/1444228/News-Content-As-a-Resource-Not-a-Final-Product">News Content As a Resource, Not a Final Product</a>,&#8221; which refers to <a href="http://www.paulgraham.com/publishing.html">this essay on publishing by Paul Graham</a>. At the very top of the article, Graham (unintentionally) brings up a point that I think is interesting:</p>
<blockquote><p><em>Publishers of all types, from news to music, are unhappy that consumers won&#8217;t pay for content anymore.  At least, that&#8217;s how they see it.</em></p>
<p><em>In fact consumers never really were paying for content, and publishers weren&#8217;t really selling it either.  If the content was what they were selling, why has the price of books or music or movies always depended mostly on the format?  Why didn&#8217;t better content cost more? </em></p>
<p><em>A copy of <em>Time</em> costs $5 for 58 pages, or 8.6 cents a page.   <em>The Economist</em> costs $7 for 86 pages, or 8.1 cents a page.  Better journalism is actually slightly cheaper.</em></p>
<p><em>— Paul Graham, <a href="http://www.paulgraham.com/publishing.html">&#8220;Post-Medium Publishing&#8221;</a><br />
</em></p></blockquote>
<p>I think that begs a basic question: what does &#8220;better&#8221; really mean when it comes to content? Is the Economist really better than Time? Our second book, <em><a href="http://www.amazon.com/Head-First-PMP-Brain-Friendly-Professional/dp/0596801912/">Head First PMP</a></em>, outsells our first book, <em><a href="http://www.amazon.com/Applied-Software-Project-Management-Stellman/dp/0596009488/">Applied Software Project Management</a></em>. Is one better than the other?</p>
<p>Like most questions of &#8220;better,&#8221; you have to understand how something&#8217;s going to be used before you can judge how good it is at its job. If you&#8217;re preparing for the PMP certification exam, <em>Head First PMP</em> is better for that job. If you&#8217;re trying to improve the way your team runs software projects, you&#8217;ll get a lot more mileage out of <em>Applied Software Project Management</em>. That&#8217;s a basic idea behind quality. You can&#8217;t judge the quality of a product without understanding the requirements, and how it&#8217;s going to be used to do a job. (I&#8217;ve been making that point on this blog for <a href="http://www.stellman-greene.com/2006/03/29/quality-really-is-free/">quite a while now</a>!) And when it comes to testing software, that has real-life, practical implications. For example, it means that you can make sure your testing is effective by concentrating your tests on how the software is going to be used.</p>
<p>But it also has an important impact on architecture. A lot of us run into a serious problem when we&#8217;re designing a complex system: how do you actually &#8220;test&#8221; your architecture? It&#8217;s not like you can write, say, JUnit or NUnit tests for it. And architecture poses some pretty daunting review challenges. While it&#8217;s certainly a good idea to do architecture reviews, a lot of the time yo&#8217;re more likely to end up doing UI design reviews, prototype walkthroughs, and deployment reviews. Or you&#8217;ll end up starting out trying to review your object model, but you&#8217;ll end up buried in implementation detail.</p>
<p>My goal, when I&#8217;m designing a new system, is to come up with the best architecture I can. What makes one object model or database design &#8220;better&#8221; than another? The best design is the design that does the job best. That&#8217;s why <a href="http://www.stellman-greene.com/2009/05/03/requirements-101-user-stories-vs-use-cases/">user stories</a> are so useful, and why I try to have them done before I start in on the architecture: because they help make sure my design is grounded in the way the system&#8217;s actually going to be used.</p>
<p>Try this the next time you&#8217;re at that point where you&#8217;ve got an initial software architecture laid out, but you haven&#8217;t started in on the coding and you&#8217;re looking for feedback. Instead of diving straight into the review, try starting out by giving an overview of the people who are going to use the system and the job they&#8217;ll be doing. I&#8217;ve found that simply grounding people in the actual goals and purpose of the system really focuses the feedback I get.</p>
<p><a href="http://www.iasahome.org/web/itarc/2009/NYC"><img class="alignnone size-full wp-image-389" title="IASA Speaker 2009" src="http://www.stellman-greene.com/blog/wp-content/uploads/2009/09/nyspeaker.jpg" alt="IASA Speaker 2009" width="200" height="138" /></a></p>
<p><em>Andrew and Jennifer will be giving their <strong>Beautiful Teams</strong> talk at the <a href="http://www.iasahome.org/web/itarc/2009/NYC">IT Architect Regional Conference</a> on October 12</em>.</p>
<img src="http://feeds.feedburner.com/~r/BuildingBetterSoftware/~4/hcmRo1t9eiU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.stellman-greene.com/2009/09/22/what-makes-architecture-better/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
