<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-889154506030368938</id><updated>2011-12-18T12:53:14.749+02:00</updated><category term='value'/><category term='deadline'/><category term='idea'/><category term='specialization'/><category term='cross-function'/><category term='documentation'/><category term='XP'/><category term='refactor'/><category term='development'/><category term='sell'/><category term='unit tests'/><category term='customer'/><category term='change'/><category term='improvement'/><category term='start-up'/><category term='evolving design'/><category term='TDD'/><category term='scrum'/><category term='agile'/><category term='iron triangle'/><category term='software'/><category term='craftsmanship'/><category term='design'/><category term='team'/><category term='quality'/><category term='DDD'/><category term='acceptance tests'/><category term='original'/><category term='management'/><title type='text'>The Software Craftsman</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://swcraftsman.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/889154506030368938/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://swcraftsman.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Assaf Stone</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_njIZU_X1s08/Sb0rpRzfcxI/AAAAAAAAABM/a0wzTXU3Grg/S220/Me.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>14</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-889154506030368938.post-5210779365214735041</id><published>2009-07-16T12:18:00.005+03:00</published><updated>2009-08-01T08:45:56.054+03:00</updated><title type='text'>Story Points Explained. Part 2: Size-based estimation</title><content type='html'>In &lt;a href="http://swcraftsman.blogspot.com/2009/07/story-points-explained-part-1-useful.html"&gt;part 1&lt;/a&gt;, I explained (I hope) the need for complexity/size based estimations.&lt;br /&gt;In this part I wish to explain how story points work, and why.&lt;br /&gt;&lt;br /&gt;Story Points are an &lt;span style="font-weight: bold;"&gt;arbitrary&lt;/span&gt; value assigned to a story (feature, business task, etc.) based on its &lt;span style="font-weight: bold;"&gt;complexity&lt;/span&gt; relative to other stories. There is no direct correlation to time, nor should you attempt to make one. This means, you should &lt;span style="font-style: italic;"&gt;never&lt;/span&gt; try to say "Hmm, in a fifteen day sprint we can do 45 SPs, therefore 3 SPs are equal to 1 day, so if I can do this in half a day, it's worth 1.5 SPs".&lt;br /&gt;&lt;br /&gt;What should be going through your head is: &lt;span style="font-style: italic;"&gt;Hmm, this story not very easy, nor is it difficult. It seems to be about as complex as &lt;span style="font-weight: bold;"&gt;that&lt;/span&gt;&lt;span style="font-style: italic;"&gt; story which we estimated to be 3 SPs. So I'll call it &lt;span style="font-weight: bold;"&gt;3 SPs&lt;/span&gt; as well.&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For the release planning (i.e. when you prioritize stories for the next few sprints) this is good enough. It doesn't matter how much time something will actually take. The PO can decide whether to descope, and whether to implement earlier or later, merely based on &lt;span style="font-weight: bold;"&gt;relative complexity&lt;/span&gt; alone!&lt;br /&gt;&lt;br /&gt;During the &lt;span style="font-style: italic;"&gt;Sprint Planning&lt;/span&gt; session, each story is broken down (by the team, &lt;span style="font-weight: bold;"&gt;for the team&lt;/span&gt;) into development tasks, which are small enough to be able to estimate in time with sufficient accuracy. They add up the time, and keep taking tasks (stories) until they reach the amount of time they have to develop (number of work days in a sprint, minus pre-planned abscences, etc).&lt;br /&gt;&lt;br /&gt;When they reach the limit, the team knows how many &lt;span style="font-weight: bold;"&gt;stories&lt;/span&gt; they can do in a sprint, and &lt;span style="font-weight: bold;"&gt;commit&lt;/span&gt; to that. At the end of the sprint, the sum of the story points of the stories they completed is their &lt;span style="font-weight: bold;"&gt;velocity&lt;/span&gt; (story points per sprint).&lt;br /&gt;&lt;br /&gt;The sum of the &lt;span style="font-weight: bold;"&gt;unimplemented stories' &lt;/span&gt;story points remaining in the release backlog, divided by the velocity is the &lt;span style="font-weight: bold;"&gt;number of sprints&lt;/span&gt; before the requisite features will be done, and the time until they can be released.&lt;br /&gt;&lt;br /&gt;This solves the PO's need to set the next version's release date (&lt;span style="font-style: italic;"&gt;Look ma, no time!&lt;/span&gt;)!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/889154506030368938-5210779365214735041?l=swcraftsman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swcraftsman.blogspot.com/feeds/5210779365214735041/comments/default' title='תגובות לפרסום'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=889154506030368938&amp;postID=5210779365214735041' title='0 תגובות'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/889154506030368938/posts/default/5210779365214735041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/889154506030368938/posts/default/5210779365214735041'/><link rel='alternate' type='text/html' href='http://swcraftsman.blogspot.com/2009/07/story-points-explained-part-2-size.html' title='Story Points Explained. Part 2: Size-based estimation'/><author><name>Assaf Stone</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_njIZU_X1s08/Sb0rpRzfcxI/AAAAAAAAABM/a0wzTXU3Grg/S220/Me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-889154506030368938.post-3925287753258872814</id><published>2009-07-16T11:23:00.005+03:00</published><updated>2009-07-16T13:00:08.969+03:00</updated><title type='text'>Story Points Explained. Part 1: Useful Estimation</title><content type='html'>The following is based on a real discussion. Names have been changed to protect both innocent and guilty.&lt;br /&gt;Perry, the Product Owner: "How long will it take to implement the XYZ feature in the ABC project?"&lt;br /&gt;Sam, the would-be Scrum Master: "Uh... I'll ask the team and get back to you".&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Having flipped through a few books on Scrum, &lt;/span&gt;&lt;span style="font-style: italic;"&gt;Sam heads off to the team room and asks the team to estimate.&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Sam, returning with an answer: "A week, but remember this is just and estimate".&lt;br /&gt;Perry: "Sure, sure. Great. Thank you".&lt;br /&gt;&lt;br /&gt;Sam, being in tune with the &lt;span style="font-style: italic;"&gt;Force&lt;/span&gt;, feels a cold wind on the back of his neck.&lt;br /&gt;&lt;br /&gt;End of the iteration comes, and the feature took ten days to implement.&lt;br /&gt;Perry: "You said it would take 5 days. It took 10! What gives?"&lt;br /&gt;Sam: "Hey, I told you, it's just an estimate!"&lt;br /&gt;Perry: "Estimate, okay. I expected up to half again, and padded accordingly, and billed the customer. But you took double! Your estimates are worthless!"&lt;br /&gt;&lt;hr /&gt;What's the trouble here? Was Perry wrong to use the estimate? Was Sam wrong to give it?&lt;br /&gt;I think not. I think the problem lies in their failure to communicate needs and expectations.&lt;br /&gt;Here's a stab at how the conversation &lt;span style="font-style: italic;"&gt;should&lt;/span&gt; have gone:&lt;br /&gt;&lt;br /&gt;Perry: "How long will it take to implement the XYZ feature in the ABC project?"&lt;br /&gt;Sam: "Why do you need to know? Let's take care of this at the Sprint planning session".&lt;br /&gt;Perry: "Well, I've got a customer who wants a patch with that feature. I need to know what to bill him".&lt;br /&gt;Sam: "I see. And do you have to know the amount of time it will take, in advance?"&lt;br /&gt;Perry: "Duh! How else will I bill him?"&lt;br /&gt;Sam: "Hmm... Do you bill him by the hour? days?"&lt;br /&gt;Perry: "No, but a small feature will cost differently than a large one. And a customer needs to know what he's paying for".&lt;br /&gt;Sam, smiling, as he already has the answer: "So, you're saying that you're charging on a scale, right?"&lt;br /&gt;Perry: "Right."&lt;br /&gt;Sam: "Well then, why not charge based on the size of the feature?"&lt;br /&gt;Perry: "Aren't you listening? That's what I'm doing!"&lt;br /&gt;Sam, grinning broadly: "Then why didn't you ask me what size the story is, instead?"&lt;br /&gt;Perry: "Because you already told me before the last Release Planning session, that it is 10 story points..."&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Realization dawns on Perry's face.&lt;br /&gt;Sam raises an eyebrow.&lt;br /&gt;Perry grins sheepishly, and slaps his forehead. He turns away shaking his head, and heads towards the place where all POs go...&lt;br /&gt;Sam congratulates himself and rides off into the sunset...&lt;br /&gt;&lt;hr /&gt;&lt;/span&gt;&lt;br /&gt;The most important thing to understand about estimation, is the reason for it!&lt;br /&gt;In my experience, there are two reasons to make an estimation:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;To bill a customer, in a time-based (cost) project.&lt;/li&gt;&lt;li&gt;To know when the next version's release date will be. Gotta keep them bosses happy.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Prioritize features - often. we'll want to release something small earlier.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;while these needs seem to indicate that we need a time based solution, it is actually not the case. Time is a real-world, quantifiable and tangible measurement. It conveys a sense of accuracy that may or may not exist. In software development, there is a long list of factors that increase the variability, and thus the accuracy of a time-based estimate.&lt;br /&gt;Here's a short list:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Understanding the requirements - often the needs are unclear, volatile or both.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Understanding the technology - frameworks, especially for enterprise applications are too vast and complex for anyone to truly understand all of it. Thus what one needs for a project, he may often learn for the first time while on the job.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Who does the job - in all but the simplest tasks, software development is done by a team. A team is made of heterogeneous members, each with different skills, and different knowledge. What may take one person 1 day could take another 2 days, and vice-versa. &lt;/li&gt;&lt;li&gt;etc.&lt;/li&gt;&lt;/ul&gt;In short, while in "the real world" time is a measurable factor, in practice, it is the product of job-complexity and worker-skill (speed) - two variables.&lt;br /&gt;&lt;br /&gt;The simplest way to increase our accuracy is to eliminate one of the variables: skill. What we're left with is a need for a &lt;span style="font-weight: bold;"&gt;complexity-based&lt;/span&gt; estimation method&lt;br /&gt;Enter the story-points.&lt;br /&gt;&lt;br /&gt;Continued in the &lt;a href="http://swcraftsman.blogspot.com/2009/07/story-points-explained-part-2-size.html"&gt;next part&lt;/a&gt;.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/889154506030368938-3925287753258872814?l=swcraftsman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swcraftsman.blogspot.com/feeds/3925287753258872814/comments/default' title='תגובות לפרסום'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=889154506030368938&amp;postID=3925287753258872814' title='0 תגובות'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/889154506030368938/posts/default/3925287753258872814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/889154506030368938/posts/default/3925287753258872814'/><link rel='alternate' type='text/html' href='http://swcraftsman.blogspot.com/2009/07/story-points-explained-part-1-useful.html' title='Story Points Explained. Part 1: Useful Estimation'/><author><name>Assaf Stone</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_njIZU_X1s08/Sb0rpRzfcxI/AAAAAAAAABM/a0wzTXU3Grg/S220/Me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-889154506030368938.post-6813221225932182865</id><published>2009-05-12T10:09:00.000+03:00</published><updated>2009-05-12T10:10:05.982+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='specialization'/><category scheme='http://www.blogger.com/atom/ns#' term='team'/><category scheme='http://www.blogger.com/atom/ns#' term='scrum'/><category scheme='http://www.blogger.com/atom/ns#' term='cross-function'/><title type='text'>Scrum, Done, and the Shared Specialist</title><content type='html'>Scrum suggests that we form cross-functional, self contained teams. The reason for this, is so that when a team gets assigned a User Story, or feature, the team can, on their own, reach "Done", without being stalled due to dependency on external factors (e.g. the GUI team) not finishing their tasks on time.&lt;br /&gt;&lt;br /&gt;As such, if the DoD includes (for example) development, testing, documenting and integrating the feature, the team should have members with the required capabilities.&lt;br /&gt;&lt;br /&gt;The reality, unfortunately, is that some specialized skills are often required (DBA, integrator, technical writer), and there is no justification (or money) to have one such specialist in each time. Likewise, the tasks are complex enough that people without these specialties are not qualified to do the work (i.e. only THE technical writer has a sufficient level of English, or better, some other language to write the documentation, or the R&amp;amp;D department has decided that only certified DBAs can touch the database).&lt;br /&gt;&lt;br /&gt;With two opposing requirements - self-contained, cross-functional teams, and specialization, how can we truly enable the team to be responsible for a feature getting "Done"?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/889154506030368938-6813221225932182865?l=swcraftsman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swcraftsman.blogspot.com/feeds/6813221225932182865/comments/default' title='תגובות לפרסום'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=889154506030368938&amp;postID=6813221225932182865' title='0 תגובות'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/889154506030368938/posts/default/6813221225932182865'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/889154506030368938/posts/default/6813221225932182865'/><link rel='alternate' type='text/html' href='http://swcraftsman.blogspot.com/2009/05/scrum-done-and-shared-specialist.html' title='Scrum, Done, and the Shared Specialist'/><author><name>Assaf Stone</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_njIZU_X1s08/Sb0rpRzfcxI/AAAAAAAAABM/a0wzTXU3Grg/S220/Me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-889154506030368938.post-952845513824912805</id><published>2009-05-04T15:09:00.002+03:00</published><updated>2009-05-04T15:20:07.285+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='customer'/><category scheme='http://www.blogger.com/atom/ns#' term='unit tests'/><category scheme='http://www.blogger.com/atom/ns#' term='acceptance tests'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>Unit Tests are not Enough!</title><content type='html'>TDD proponents often claim that with 100% coverage proves that the software works as expected. Whether they actually believe this to be true, or whether they are trying to convince management or developers to jump on to the TDD train, they are headed (and leading) the team to a fall.&lt;br /&gt;&lt;br /&gt;The simple reason, is that a test proves that the software works as the developer intend it to. How does this guarantee that the software does &lt;span style="font-weight: bold;"&gt;what the customer wanted it to do?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It doesn't.&lt;br /&gt;&lt;br /&gt;While high coverage is important in order to ensure that the software does what the developer intended, and enables the developer to know how the software works (with the unit test being used as an example of the API), we need &lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;Customer Acceptance Tests&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; preferably &lt;span style="font-style: italic;"&gt;automated&lt;/span&gt; tests, in order to verify that the &lt;span style="font-weight: bold;"&gt;customer's&lt;/span&gt; intent was captured.&lt;br /&gt;&lt;br /&gt;In short, Unit tests and Customer tests are both necessary to ensure quality, as they both validate the software in different, complementing ways.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/889154506030368938-952845513824912805?l=swcraftsman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swcraftsman.blogspot.com/feeds/952845513824912805/comments/default' title='תגובות לפרסום'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=889154506030368938&amp;postID=952845513824912805' title='2 תגובות'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/889154506030368938/posts/default/952845513824912805'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/889154506030368938/posts/default/952845513824912805'/><link rel='alternate' type='text/html' href='http://swcraftsman.blogspot.com/2009/05/unit-tests-are-not-enough.html' title='Unit Tests are not Enough!'/><author><name>Assaf Stone</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_njIZU_X1s08/Sb0rpRzfcxI/AAAAAAAAABM/a0wzTXU3Grg/S220/Me.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-889154506030368938.post-3059793346526693589</id><published>2009-04-30T18:41:00.002+03:00</published><updated>2009-04-30T18:56:18.669+03:00</updated><title type='text'>When to Mock, and When to Stub</title><content type='html'>One thing I noticed, ever since I got the hang of mocking, is that like anything, there &lt;span style="font-style: italic;"&gt;is&lt;/span&gt; such a thing as &lt;span style="font-weight: bold;"&gt;too much of a good thing&lt;/span&gt;!&lt;br /&gt;I started writing out my code decoratively, using unit tests to define the &lt;span style="font-style: italic;"&gt;behavior&lt;/span&gt; expected of the production code. Next, I wrote the production code that would fulfill these expectations. And the test would go 'green'. All was good.&lt;br /&gt;Or so I thought.&lt;br /&gt;As the system grew, and I found myself refactoring code that was under the test harness, I spent more and more time fixing tests that failed because the production code ceased to &lt;span style="font-style: italic;"&gt;behave as expected&lt;/span&gt;!&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Oddly enough, the assertions, and thus the actual, final results of the tests were unaffected.&lt;br /&gt;&lt;br /&gt;I realized that there was a pattern here. I was testing behavior, when I really cared about state.&lt;br /&gt;&lt;br /&gt;My conclusion was this: If I'm testing a unit &lt;span style="font-style: italic;"&gt;within&lt;/span&gt; the system, i.e. depending entirely on more code of my own (or on nothing at all), I should test state (i.e. make assertions about the results).&lt;br /&gt;Otherwise, if I can't test the result of the code (i.e. a void method), or I'm at the system boundary (i.e. depending on code that is not part of my system), then - and only then - should I mock that dependency, and test for behavior (i.e. make sure that a dependency gets called).&lt;br /&gt;&lt;br /&gt;But what if I have a dependency that I want to fake it's result? Use a stub. Your favorite mocking framework has mock-like constructs, that do  &lt;span style="font-weight: bold;"&gt;not&lt;/span&gt; raise exceptions if the expectation fails. Those are called &lt;span style="font-style: italic;"&gt;Stubs.&lt;/span&gt; Otherwise, use simple inheritance to fake a class and spoon-feed the return values.&lt;br /&gt;&lt;br /&gt;There. That makes sense.&lt;br /&gt;&lt;br /&gt;Now go, loosen up that strict behavior management.&lt;br /&gt;It's okay. I can wait.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/889154506030368938-3059793346526693589?l=swcraftsman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swcraftsman.blogspot.com/feeds/3059793346526693589/comments/default' title='תגובות לפרסום'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=889154506030368938&amp;postID=3059793346526693589' title='0 תגובות'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/889154506030368938/posts/default/3059793346526693589'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/889154506030368938/posts/default/3059793346526693589'/><link rel='alternate' type='text/html' href='http://swcraftsman.blogspot.com/2009/04/when-to-mock-and-when-to-stub.html' title='When to Mock, and When to Stub'/><author><name>Assaf Stone</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_njIZU_X1s08/Sb0rpRzfcxI/AAAAAAAAABM/a0wzTXU3Grg/S220/Me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-889154506030368938.post-178824524122148607</id><published>2009-03-15T18:43:00.007+02:00</published><updated>2009-03-15T21:28:26.775+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='sell'/><category scheme='http://www.blogger.com/atom/ns#' term='XP'/><category scheme='http://www.blogger.com/atom/ns#' term='management'/><category scheme='http://www.blogger.com/atom/ns#' term='iron triangle'/><category scheme='http://www.blogger.com/atom/ns#' term='scrum'/><category scheme='http://www.blogger.com/atom/ns#' term='deadline'/><title type='text'>Why is Agile such a Hard Sell?</title><content type='html'>&lt;span style="font-family:arial;"&gt;Did you ever try to sell Agile development to the upper management? H&lt;/span&gt;&lt;span style="font-family:arial;"&gt;ow often &lt;/span&gt;&lt;span style="font-family:arial;"&gt;did you encounter a response similar to "That's not how it works in the &lt;span style="font-style: italic;"&gt;real &lt;/span&gt;world"? I came across this in &lt;/span&gt;&lt;span style="font-family:arial;"&gt;n&lt;/span&gt;&lt;span style="font-family:arial;"&gt;umerous conversations, with members of every level of the organization, from &lt;/span&gt;&lt;span style="font-family:arial;"&gt;program&lt;/span&gt;&lt;span style="font-family:arial;"&gt;m&lt;/span&gt;&lt;span style="font-family:arial;"&gt;ers, to team leaders, to PMs, to marketing to CEOs. It seems to me that the entire gripe everybody has with Agile is centered on the &lt;a href="http://www.ambysoft.com/essays/brokenTriangle.html"&gt;&lt;span style="font-weight: bold;"&gt;Iron Triangle&lt;/span&gt;&lt;/a&gt;: The customer wants &lt;span style="font-weight: bold;"&gt;everything&lt;/span&gt; he asked for, &lt;span style="font-weight: bold;"&gt;exactly when&lt;/span&gt; he needs it, and the budget is &lt;span style="font-weight: bold;"&gt;exactly&lt;/span&gt; what he's willing to pay.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.ambysoft.com/artwork/ironTriangle.jpg"&gt;&lt;img style="cursor: pointer; width: 334px; height: 209px;" src="http://www.ambysoft.com/artwork/ironTriangle.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;br /&gt;Every single agile development methodology I've come across, states in no uncertain terms that &lt;span style="font-style: italic;"&gt;they&lt;/span&gt; (they being the customer, management, marketing, PMs) simply can't have it. The agil&lt;/span&gt;&lt;span style="font-family:arial;"&gt;e proponents say things like "it will be ready when it's ready" (very bad for business), or "We'll deliver what we can by the deadline" (not very good for business, either).&lt;br /&gt;&lt;br /&gt;So, for the non-agilists out there, it's a no-brainer. Up until those crazy &lt;span style="font-style: italic;"&gt;extremos&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;scrum-masters&lt;/span&gt; (what the hell is that?!?) came along, we could tell the developers how long they had in order to develop the system we require, and come hell or high water they would burn out the candle on both ends, working nights and weekends to make the deadline. Kindly take your "Agile" and stick it where the sun don't shine!&lt;br /&gt;&lt;br /&gt;What management conveniently ignores, is that most of these commitments are never met. And if the software is out the door by the deadline, the quality sucks. Why is that? Quite simply because there are no free lunches. &lt;span style="font-weight: bold;"&gt;Resources * Schedule = Scope&lt;/span&gt;. In otherwords, there's no breaking the triangle. Management is simply used to a methodology hinged on wishes. The way I see it, Agile is the proverbial messenger being shot for exposing the truth of it.&lt;br /&gt;PMs often prefer to get forgiveness, or figure out how to shift the blame, for missing the deadline, than to get the permission to do so. I wonder how many clients would agree, if the software shop asks them: "Is it okay with you if we lie about our abililty to deliver all of this by the deadline, with what you're paying"?&lt;br /&gt;&lt;br /&gt;What Agile methodologies such as XP and Scrum truely does for business, what really needs to be emphasized in an elevator pitch, is that they offer a solution to the problem agile exposes. By focusing on delivering, in high quality, what the customer &lt;span style="font-weight: bold; font-style: italic;"&gt;needs most&lt;/span&gt;, by &lt;span style="font-weight: bold; font-style: italic;"&gt;enabling &lt;/span&gt;changes further down the line, deadlines can &lt;span style="font-weight: bold;"&gt;always&lt;/span&gt; be met, by delaying the release of low priority features.&lt;br /&gt;&lt;br /&gt;What do you think? Are there other reasons that managers dislike Agile?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/889154506030368938-178824524122148607?l=swcraftsman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swcraftsman.blogspot.com/feeds/178824524122148607/comments/default' title='תגובות לפרסום'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=889154506030368938&amp;postID=178824524122148607' title='0 תגובות'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/889154506030368938/posts/default/178824524122148607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/889154506030368938/posts/default/178824524122148607'/><link rel='alternate' type='text/html' href='http://swcraftsman.blogspot.com/2009/03/why-is-agile-such-hard-sell.html' title='Why is Agile such a Hard Sell?'/><author><name>Assaf Stone</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_njIZU_X1s08/Sb0rpRzfcxI/AAAAAAAAABM/a0wzTXU3Grg/S220/Me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-889154506030368938.post-1594224035133524069</id><published>2008-12-18T16:33:00.002+02:00</published><updated>2008-12-18T16:33:52.319+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><title type='text'>The Power to Control the World, is in Which Finger?</title><content type='html'>&lt;span xmlns=""&gt;&lt;p&gt;The title is quoted from the movie "Willow" (1988). The high wizard made his annual appearance at the village to choose an apprentice, held out his hand, and asked the question. Each contestant picked a finger. They all failed. As it turns out, the correct answer was the contestant's own finger. In choosing the wizard's finger, the would-be apprentice showed no faith in himself.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;I was reminded of this, 20 years later, when I came across a company with a notion that to be agile is to practice TDD, or iterative development. Or any other practice.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The way I see it, TDD, iterative development, pair programming – they are all fingers. The correct answer is that agility is in you. It is a state of mind, an orientation.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;To truly be agile is to decide to be agile. It is to follow the spirit of the manifesto, to accept the concept of XP or Scrum. The rest are practices. Details. If you are Agile, then your practices are agile by proxy.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;So tell me: The Power to Be Agile, is in Which Practice?&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/889154506030368938-1594224035133524069?l=swcraftsman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swcraftsman.blogspot.com/feeds/1594224035133524069/comments/default' title='תגובות לפרסום'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=889154506030368938&amp;postID=1594224035133524069' title='0 תגובות'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/889154506030368938/posts/default/1594224035133524069'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/889154506030368938/posts/default/1594224035133524069'/><link rel='alternate' type='text/html' href='http://swcraftsman.blogspot.com/2008/12/power-to-control-world-is-in-which.html' title='The Power to Control the World, is in Which Finger?'/><author><name>Assaf Stone</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_njIZU_X1s08/Sb0rpRzfcxI/AAAAAAAAABM/a0wzTXU3Grg/S220/Me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-889154506030368938.post-1952068241571254312</id><published>2008-12-18T15:47:00.002+02:00</published><updated>2008-12-18T15:50:01.679+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='evolving design'/><category scheme='http://www.blogger.com/atom/ns#' term='change'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>The Hardest Thing I’ve Ever Done</title><content type='html'>&lt;span xmlns=""&gt;&lt;p&gt;The hardest thing I've ever done in my career as a software architect is to choose the simplest thing that works. When I first came across the concept in a book about &lt;a href="http://www.extremeprogramming.org/"&gt;XP (Extreme Programming)&lt;/a&gt;, I immediately fell in love with the agile concepts of &lt;a href="http://www.extremeprogramming.org/rules/pair.html"&gt;pair-programming&lt;/a&gt;, and &lt;a href="http://www.extremeprogramming.org/rules/testfirst.html"&gt;test driven development&lt;/a&gt;. I also became very enthusiastic about automating the build process, the metrics used to "keep score" of how the project is coming along.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;It was the simple design that caught me by surprise. I'm used to writing &lt;em&gt;smart&lt;/em&gt; designs. I'm used to writing code that is extensible at certain points. Designs that are elegant. Oh and design patterns. Lots of design patterns. I mean, you know what it's like to show everybody the class diagram, and show how you can later add another behavior without having to change the existing code. Oh, the pride. Of course, I have to make my designs like that, or else I'll have trouble justifying my salary as chief architect, right?&lt;br /&gt;&lt;/p&gt;&lt;p&gt;There's just this one little snag: Change. The customer wants something that requires us to rethink a constant into a variable. Even more often, that strategy pattern I worked so hard to put into place (even though in the meantime there's only one concrete behavior in the system, we expected more to come later) becomes useless, as the additional behaviors we were sure would be designed in the next iteration are never called for.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The cost of maintaining that extensibility point may be high, or low. It is, however, invariably cheaper not to maintain it. If you have your safety net of unit and functional tests (you are writing automated tests, aren't you?), refactoring a fixed behavior into an extensible one should be fairly easy. Even if it is more expensive to add an extensibility point in the future, than it is to do it from the get-go, it will be cheaper than to maintain all of the ones you &lt;em&gt;don't need&lt;/em&gt;.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Test-protected refactoring is cheaper than maintaining pointlessly complex code.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;It really is as &lt;em&gt;simple&lt;/em&gt; as that.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;P.S. As Chief Architect, I now find pride in the elegance of a code base that is exactly as complex as it needs to be, and not any more than that.&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/889154506030368938-1952068241571254312?l=swcraftsman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swcraftsman.blogspot.com/feeds/1952068241571254312/comments/default' title='תגובות לפרסום'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=889154506030368938&amp;postID=1952068241571254312' title='0 תגובות'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/889154506030368938/posts/default/1952068241571254312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/889154506030368938/posts/default/1952068241571254312'/><link rel='alternate' type='text/html' href='http://swcraftsman.blogspot.com/2008/12/hardest-thing-ive-ever-done.html' title='The Hardest Thing I’ve Ever Done'/><author><name>Assaf Stone</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_njIZU_X1s08/Sb0rpRzfcxI/AAAAAAAAABM/a0wzTXU3Grg/S220/Me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-889154506030368938.post-984128376487233386</id><published>2008-10-17T22:47:00.004+02:00</published><updated>2008-11-11T15:26:29.652+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='documentation'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><title type='text'>How to Write Great Software Design Specifications</title><content type='html'>&lt;span xmlns=""&gt;&lt;p&gt;When I began my journey as a programmer, I neglected design documents. I couldn't stand writing those long &lt;em&gt;books&lt;/em&gt; that described what &lt;em&gt;"the system should do"&lt;/em&gt;. I just wanted to get there. At most, I'd do a sketch of what the UI should look like, and then I'd start coding. I trusted my memory and my ability to juggle a myriad of requirements in my mind. I can honestly say that I'm &lt;em&gt;really&lt;/em&gt; good at it. I can run algorithms, complex ones in my head, and see what is supposed to happen.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Of course, no development manager could accept that. QA needs to know what the software &lt;em&gt;should&lt;/em&gt; do, so they can write tests. Collaboration with other developers necessitates design documentation as well. And of course some customers require them as delivery milestones. Finally, as I've learned time and again since those days coding on a wing and a prayer, more than a decade and a half ago, designed software is easier to maintain than software without a design.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;So we need a design. How much? What kind? When? Here's what I do:&lt;br /&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;First, I filter by the three acronyms: YAGNI (&lt;em&gt;you aren't gonna need it)&lt;/em&gt;, TAGRI (&lt;em&gt;they aren't gonna read &lt;/em&gt;it) and DRY (&lt;em&gt;don't repeat yourself&lt;/em&gt;). What this basically means is that I won't put into design specs anything that will not be of any use to the developers, the customer or the testers. Likewise, it means that my designs can't be &lt;em&gt;too&lt;/em&gt; detailed: they should &lt;em&gt;not&lt;/em&gt; repeat what the code &lt;em&gt;will&lt;/em&gt; say. This last statement hides the simple-yet-important fact that &lt;strong&gt;code should document itself&lt;/strong&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Second, I'd rather be somewhat vague in my design. I don't want something so detailed that it won't survive the first conflict with reality. I hate spending hours (or even days) on a design that will change within an hour from the moment somebody sits to read the code. It's like the coding-to-abstract principle. Think of the design as the interface and the code as the implementation.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;I like diagrams. I prefer them to words. To me, they allow me to see more of the system at once. UML is great. The most important diagrams to have in a design document are:&lt;br /&gt;&lt;/div&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Use Case Diagrams&lt;/strong&gt;: While they don't tell enough of a story by themselves, I find them to be invaluable props for design reviews, and their simple and intuitive language makes them ideal for presenting to business people: Management, customers, etc. For developers, they show encapsulation, top level components, break features into tasks, and show what needs to be mocked.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;State Diagrams&lt;/strong&gt;: Where applicable, these are invaluable to translate business requirements into code.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Component Diagrams&lt;/strong&gt;: A component is a set of classes that work together to achieve one goal: It may be one class, or many, and may span packages (dlls, assemblies). Showing how they interact with each other is the lowest level of abstraction that should be part of a design document.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Anything else, any artifact of a lower level than a component (sequence diagrams, class diagrams) should be done by the developer, when coding, to help him think through the task. These are generally either throwaways, drawn on whiteboards, or slips of paper, or kept as part of the documentation of what &lt;em&gt;was&lt;/em&gt; done (rather than what &lt;em&gt;will be&lt;/em&gt; done).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;In .NET in the visual studio (2005 and up), the class diagram is not a document but rather a graphical rendering of the actual class. It is full synchronized with the class libraries themselves. As such, I like the class diagrams to be maintained in order to help with the code review.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;In short, keep it lean, make sure it is specific enough so that it is of benefit to the developer, vague enough so that it isn't rendered obsolete by the first few lines of code, and make the highest levels transparent enough so that non-technical people can understand it.&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/889154506030368938-984128376487233386?l=swcraftsman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swcraftsman.blogspot.com/feeds/984128376487233386/comments/default' title='תגובות לפרסום'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=889154506030368938&amp;postID=984128376487233386' title='0 תגובות'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/889154506030368938/posts/default/984128376487233386'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/889154506030368938/posts/default/984128376487233386'/><link rel='alternate' type='text/html' href='http://swcraftsman.blogspot.com/2008/10/how-to-write-great-software-design.html' title='How to Write Great Software Design Specifications'/><author><name>Assaf Stone</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_njIZU_X1s08/Sb0rpRzfcxI/AAAAAAAAABM/a0wzTXU3Grg/S220/Me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-889154506030368938.post-4579296402909858728</id><published>2008-10-13T09:43:00.008+02:00</published><updated>2008-10-13T11:33:26.495+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='documentation'/><category scheme='http://www.blogger.com/atom/ns#' term='refactor'/><title type='text'>The Good, the Bad, and the Ugly (Documentation)</title><content type='html'>&lt;span style="font-family:arial;"&gt;Documenting, once a constant in the world of software development has become, with the rising of Agile Development, a somewhat controversial subject. As late as the mid 90's it was a well known fact that you have to document. The more documentation, the better. Management expects it to be there for posterity! Documentation is all that enabled a corporation to retain its intellectual property once the developer of a software project left the company. The larger the company, the more regimented the documentation was to be. There'd be page-long paragraphs at the beginning of each file, describing who wrote what, copyright, purposes, and examples and so on. Then you'd have a few lines above every method, procedure or function, describing its purpose, and usage. Then each block of code (roughly 5-20 lines) would be documented as well.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;And that is without mentioning the &lt;strong&gt;Book&lt;/strong&gt;. The book is a thick manual describing the system, "ideally" capable of telling the would-be programmer everything he needs to know about how to develop.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Of course, I haven't, in my 15 years of development, occasionally modifying code that was up to a decade old when I reached it, seen documentation worth reading. It was consistently outdated, in variable degrees of staleness. What was there was often self evident, once I understood the codebase. Needless to say, it was of limited use to me.&lt;br /&gt;Reflecting back on the matter, I wonder if this uselessness could be the reason for the neglect by myself and others before me.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;Then came Agile (bring out the fanfare). A new world order was emerging into existence. &lt;a href="http://xp.c2.com/YouArentGonnaNeedIt.html"&gt;YAGNI&lt;/a&gt; and &lt;a href="http://www.agilemodeling.com/essays/tagri.htm"&gt;TAGRI&lt;/a&gt; came marching in, bringing down the hegemony of farsighted API and vast documentation (respectively). A new concept became publicly known: quality of documentation. What should you document?&lt;br /&gt;&lt;br /&gt;The hardest part of writing this post was to define the difference between bad documentation and ugly documentation. In the end, I came up with it. So, without further ado, here they are:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;u&gt;The Bad&lt;/u&gt;&lt;/strong&gt;&lt;br /&gt;&lt;p&gt;Bad documentation is a comment, that is, quite simply, not worth reading. Reading bad documentation is at best a waste of time, telling you nothing worth knowing, or something that is self evident. At worst, bad documentation is misleading, and reading it will lead to false assumptions and mistakes. Here are a few examples of bad documentation:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Not worth knowing:&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;// I can't remember what this function does&lt;br /&gt;bool DoSomeObscureOperation(object a, object b) { ...}&lt;/p&gt;&lt;p&gt;You may laugh, but I've seen this. Many times. This kind of documentation earned many a developer in my team a spanking. Well, I didn't actually give one, but I really wanted to. If you aren't explaining the code, don't do it there. Don't write about not remembering something - ask someone. &lt;/p&gt;&lt;p&gt;Note however, that many IDEs allow for placing to-dos and tasks in the code as comments. These are useful place holders to let a developer record what must be done, but couldn't for some reason.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Self evident:&lt;br /&gt;// Returns the list of the user's favorite titles&lt;br /&gt;List&amp;lt;Title&amp;gt; GetUserFavorites(User user) { ...}&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;No, Really?!? I swear, I saw this. I admit, as a developer, I once was required to write such comments. I never understood why, and I discourage such bloat in my codebase. &lt;/p&gt;&lt;ul&gt;&lt;li&gt;Misleading:&lt;br /&gt;// Returns the list of the user's favorite titles&lt;br /&gt;List&amp;lt;Actor&amp;gt; GetUserFavorites(User user) { ...}&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Obviously, either this comment is the victim of a Copy-Paste gone badly, or the new operation was added between the comment and the original code. This might seem contrived, but see what happens when you get run time errors, because you used the wrong operation, based on the code, and then typecast the result to a different kind of collection.&lt;/p&gt;&lt;p&gt;Bad documentation can also be more insidious. It can disguise itself as good documentation, describing bad code. If you have bad code, don't explain it - fix it! It should be easy after all. You've got your&lt;em&gt; Unit Tests&lt;/em&gt; in place, right?&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;u&gt;The Ugly&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Ugly documentation stacks with bad documentation (i.e. it makes bad documentation worse). It can also disguise good documentation as bad. Ugly documentation is simply hard to look at. It can be full of spelling mistakes, its indentation can be off, capitalized, all in one case, etc. If it offends your eye, and you'd rather ignore it, it's ugly. Perhaps a spell checker wouldn't go amiss here. &lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;u&gt;The Good&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Good documentation is easy to spot, easy to describe, and a real challenge to write. It is everything that bad and ugly documentation isn't: It's well written, it tells you something you didn't know, it's synchronized with the code, it reduces effort and it saves you from making mistakes. The challenge, in writing good code, is knowing when to comment, and when to refactor. Good code is self documenting. The best documentation is the code itself: It never lies, and it isn't self evident (in as much as without the code, there would be &lt;em&gt;nothing&lt;/em&gt;). &lt;/p&gt;&lt;p&gt;This is what I ask my team to document:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;For each class and interface, describe shortly what its (single) responsibility is. This helps other developers to decide where they should add that new operation they need, as well as what they need to use.&lt;/li&gt;&lt;li&gt;For service APIs (only), document the service contract as you would a class or an interface. Additionally document each operation - as long as you aren't translating the operation signature into English.&lt;/li&gt;&lt;li&gt;Avoid in-method comments. Make the code self evident. Use good variable and method names. &lt;/li&gt;&lt;li&gt;As a last resort, if you really can't refactor a hard-to-understand operation, explain the purpose of the algorithm (not the algorithm itself). But for your team's sake, make sure it is the last resort. Code changes, so you'd be better served documenting the abstract and using member-names for documentation.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;There. That's it. Now you know. And finally, a piece of parting advice:&lt;br /&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;strong&gt;If you're gonna code, code. Don't doc!&lt;/strong&gt;&lt;/blockquote&gt;&lt;p&gt;Yes, I was rather proud of that one.&lt;br /&gt; &lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/889154506030368938-4579296402909858728?l=swcraftsman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swcraftsman.blogspot.com/feeds/4579296402909858728/comments/default' title='תגובות לפרסום'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=889154506030368938&amp;postID=4579296402909858728' title='1 תגובות'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/889154506030368938/posts/default/4579296402909858728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/889154506030368938/posts/default/4579296402909858728'/><link rel='alternate' type='text/html' href='http://swcraftsman.blogspot.com/2008/10/good-bad-and-ugly-documentation.html' title='The Good, the Bad, and the Ugly (Documentation)'/><author><name>Assaf Stone</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_njIZU_X1s08/Sb0rpRzfcxI/AAAAAAAAABM/a0wzTXU3Grg/S220/Me.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-889154506030368938.post-7540257503872852870</id><published>2008-10-12T21:37:00.002+02:00</published><updated>2008-10-12T23:55:48.065+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='value'/><category scheme='http://www.blogger.com/atom/ns#' term='DDD'/><category scheme='http://www.blogger.com/atom/ns#' term='XP'/><category scheme='http://www.blogger.com/atom/ns#' term='management'/><category scheme='http://www.blogger.com/atom/ns#' term='scrum'/><title type='text'>Value Driven Development</title><content type='html'>&lt;p&gt;&lt;span style="font-family:arial;"&gt;This might be the next big thing, the new buzz word of the agile world.&lt;br /&gt;&lt;br /&gt;In Test Driven Development (acronymed to TDD), the goal is to test everything. In Domain Driven Development (yup - DDD), we strive to make an excellent Domain Model - that's our goal. In eXtreme Programming, a.k.a. XP, the idea is to program without having to design anything, and in Scrum, the goal is to huddle together and come up with a short Gantt chart that states what we promise to deliver in about 3 weeks. Ideally, we'll have several iterations planned in advance, so that we can have a long-term view of things.&lt;br /&gt;&lt;br /&gt;The problem, as management, will be quick to tell you, is that sometimes we have to forsake these noble goals, and focus on delivering value to the customer. So here's my idea: Let's propose a new agile methodology, Value Driven Development, where we use agile process to constantly create value for our customers? That, as we know, is always our goal, right? The business people will love this.&lt;br /&gt;&lt;br /&gt;For those of you, who did not stare in shock and disbelief at the first paragraph, let me make something clear: &lt;strong&gt;Everything I wrote there was wrong!&lt;/strong&gt; Everything I wrote is an unfortunately common misconception about the respective agile methodologies. The truth is that these so-called "goals" are the means to the end. What end? Value, of course. But read on, please. Explanations to come...&lt;br /&gt;&lt;br /&gt;The question is why are these misconceptions popular? To answer this, I'd like to describe a rather common scenario I came across:&lt;/span&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;A development team is in trouble. The code base is horrendous, the schedules are ignored. Feature requests creep uncontrollably, and the bugs increase in polynomial proportion to the number of changes made to the system.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Someone, usually a veteran developer, perhaps a team leader, but often not, stumbles upon a book on agile development. Perhaps a blog.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;The developer reads the book, cover to cover, constantly smacking his or her head, exclaiming things like "OMG! That is exactly what happens to us! This is exactly what we need!!!"&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;The developer runs to his manager - all the way up to the CTO, telling them how this or that agile development process will save their bacon.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;A few days later, the idealistic developer makes his presentation to management. Describing the artifacts of DDD, or the Planning Poker session and Daily Scrum. Or perhaps touting the benefits of pair-programming ("We put two programmers together, and we'll have bug-free code, because the second programmer sees things that the first misses").&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Management quickly assesses these things as Nice-To-Have (at best), and responds with something like: &lt;em&gt;"I can't authorize putting twice the resources on a single task! It'll take you twice the time to write the code, in man-days!"&lt;/em&gt; or &lt;em&gt;"This card game is silly. We won't do it."&lt;/em&gt; and of course, the inevitable &lt;em&gt;"I don't care how you write your designs - write whatever Domain Model you need, just deliver bug-free and on time."&lt;/em&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;The room is empty. The developer picks up his laptop, and wonders how everything went wrong. &lt;strong&gt;"How come I'm the only one that understands this?"&lt;/strong&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;The answer is simple. The presentation was simple, straight-forward, technical. It did not present the real &lt;strong&gt;value&lt;/strong&gt; to the customer. The presentation was geared towards the people who will implement the methodology. The business people need the &lt;strong&gt;abstract&lt;/strong&gt;. And they need to know the &lt;strong&gt;"return value"&lt;/strong&gt; (i.e. what the actual, quantifiable value of a certain methodology is). The decision makers need to understand the interdependencies between a methodology's processes. &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;This is much like the &lt;a href="http://www.eventhelix.com/RealtimeMantra/Object_Oriented/dependency_inversion_principle.htm"&gt;Dependency Inversion Principle&lt;/a&gt;. To quote &lt;a href="http://www.objectmentor.com/omTeam/martin_r.html"&gt;Robert C. Martin&lt;/a&gt;, &lt;em&gt;"High level modules should not depend upon low level modules. Both should depend upon abstractions. Abstractions should not depend upon details. Details should depend upon abstractions".&lt;/em&gt; In other words, don't confuse them with details. Explain the idea, the essence. And make sure the process implements that essence.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;They need to understand that XP promises robust code by combining group responsibility with rigid standards of coding. They need to know that this is done at no expense to delivery schedules, because the small increase to the initial coding phase will pay off in greatly reduced time to debug and change the same code. &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;They need to know that Scrum offers a highly visible management process, and increases the values of effort estimates by early exposure of risks, and a commitment to deliver the greatest value early on, and allow the customer to change his demands to adapt to the rest of the world.&lt;br /&gt;There are more values in each methodology than I can put into a blog post, but the important thing to understand, and even more importantly, pass on: Is that &lt;em&gt;every&lt;/em&gt; agile methodology is a &lt;strong&gt;Value Driven Development&lt;/strong&gt; methodology.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;So next time you try to sell Agile to management, focus above all else, on the actual value to the customer, to the business. Use graphs, quote from white papers. Leave the specifics for the implementers. Or, if the details are requested, make sure to highlight interdependencies, so as to discourage uninformed picking of artifacts from various methodologies in what seems to be an effort to reduce costs and increase value even more - that is the uncharted road to agile hell. But that is for another post.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/889154506030368938-7540257503872852870?l=swcraftsman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swcraftsman.blogspot.com/feeds/7540257503872852870/comments/default' title='תגובות לפרסום'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=889154506030368938&amp;postID=7540257503872852870' title='0 תגובות'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/889154506030368938/posts/default/7540257503872852870'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/889154506030368938/posts/default/7540257503872852870'/><link rel='alternate' type='text/html' href='http://swcraftsman.blogspot.com/2008/10/value-driven-development.html' title='Value Driven Development'/><author><name>Assaf Stone</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_njIZU_X1s08/Sb0rpRzfcxI/AAAAAAAAABM/a0wzTXU3Grg/S220/Me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-889154506030368938.post-3358611966106840406</id><published>2008-10-11T20:23:00.005+02:00</published><updated>2008-10-11T21:08:25.082+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><title type='text'>All-Encompasing Methodologies</title><content type='html'>&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;A theory tries to explain a phenomenon. It isn't offered as solid proof. That's what &lt;span class="Apple-style-span" style="font-style: italic;"&gt;laws&lt;/span&gt; are for (as in laws of physics, of course). The more it explains, the better the theory. The best theories are unified, all encompassing theories.&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;For methodologies, I believe that a similar statement can be made: The more ways it can be applied, the better the methodology. Consequentially, I believe that applicability is a good heuristic for finding good methodologies.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;I've taken a few courses in good parenting, and talked with couple-counselors as well (don't worry, my wife and I are doing fine - I believe in taking &lt;span class="Apple-style-span" style="font-style: italic;"&gt;preventive&lt;/span&gt; measures whenever I can). They all seem to emphasize that the key for a good relationship is &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;communication&lt;/span&gt;: Communicate your desires, communicate what you are willing to do, what you aren't, what you can or cannot do. Now take a look at Agile software development. &lt;a href="http://agilemanifesto.org/"&gt;The Agile Manifesto&lt;/a&gt; states in it's fourth principle that &lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Business people and developers must work together daily throughout the project. &lt;/span&gt;Further, in the sixth principle, it is stated that &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;The most efficient and effective method of conveying information to and within a development team is face-to-face conversation.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-family:arial;"&gt;Another example of cross-discipline application of the agile methodology is in martial arts. In an advanced class I took recently, the Master taught us two things, which are key to the art. First is that &lt;span class="Apple-style-span" style="font-weight: bold; "&gt;agility&lt;/span&gt; is the basis for all. Most techniques will fail, or at the least be less powerful (i.e. less value) if the practitioner isn't agile and flexible enough. The second is that many (in fact, I believe most) stances are designed so that the practitioner &lt;span class="Apple-style-span" style="font-weight: bold; "&gt;commits&lt;/span&gt; to a move &lt;span class="Apple-style-span" style="font-weight: bold; "&gt;as late as possible&lt;/span&gt;. This is necessary because the world doesn't stand still while you make your move. Your opponent is also doing something at the time. Agile Methodology calls this &lt;span class="Apple-style-span" style="font-weight: bold; "&gt;embracing change&lt;/span&gt;.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;From parenting to marriage counseling to martial arts to software development: &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Communication, Collaboration, Agility&lt;/span&gt; and &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Embracing Change&lt;/span&gt;. These are the keys to producing value.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;And the diverse applicability of these principles are tantamount to proof of their truth.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/889154506030368938-3358611966106840406?l=swcraftsman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swcraftsman.blogspot.com/feeds/3358611966106840406/comments/default' title='תגובות לפרסום'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=889154506030368938&amp;postID=3358611966106840406' title='0 תגובות'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/889154506030368938/posts/default/3358611966106840406'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/889154506030368938/posts/default/3358611966106840406'/><link rel='alternate' type='text/html' href='http://swcraftsman.blogspot.com/2008/10/all-encompasing-methodologies.html' title='All-Encompasing Methodologies'/><author><name>Assaf Stone</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_njIZU_X1s08/Sb0rpRzfcxI/AAAAAAAAABM/a0wzTXU3Grg/S220/Me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-889154506030368938.post-8906388202426916959</id><published>2008-10-09T22:07:00.006+02:00</published><updated>2008-10-12T11:02:29.665+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='start-up'/><category scheme='http://www.blogger.com/atom/ns#' term='original'/><category scheme='http://www.blogger.com/atom/ns#' term='idea'/><category scheme='http://www.blogger.com/atom/ns#' term='improvement'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>Originality</title><content type='html'>I've never claimed to have an original thought before.&lt;br /&gt;&lt;br /&gt;George Carlin, R.I.P. once said that he'd like something extremely offensive and painful to be done to him, with a red hot poker. No, I'm not going to repeat it here. This is not &lt;em&gt;that&lt;/em&gt; kind of blog. The thing is, he said it, just so he could claim to be the first person in the world to have ever said it.&lt;br /&gt;&lt;br /&gt;It used to be my life-long goal to invent something. The next killer-app, the holy grail of software developers, to come up with that thing that nobody ever thought of before, and make about 100 million dollars, give or take a few nickels. Of course, I'd still like to make that kind of money, but this morning something dawned on me. I knew it before, I've learned it in the university, and empirical data supports it, but it just never registered with me before.&lt;br /&gt;&lt;br /&gt;You don't have to be &lt;strong&gt;original&lt;/strong&gt; to make a killing. Just be better than the rest. So the next time you have a brilliant idea for a product or service, and when you google it and find about a million hits to the term, and a product &lt;em&gt;just like your idea&lt;/em&gt; within the first five hits - &lt;em&gt;twice&lt;/em&gt; - don't pull the plug on it. see if you can come up with a feature you think is really missing. See if you can make it better, cheaper, faster.&lt;br /&gt;&lt;br /&gt;I promise I will, next time.&lt;br /&gt;&lt;br /&gt;And one more thing, regarding originality:&lt;br /&gt;I called myself The Software Craftsman. Honestly, I'm just &lt;em&gt;A&lt;/em&gt; software craftsman. I've seen the term coined by others before me (actually, I googled the term today for the first time, and realized it's been there before me).&lt;br /&gt;&lt;br /&gt;What I can say, is that I thought of the term on my own, out of my own experiences.&lt;br /&gt;&lt;br /&gt;So if anybody believes that I am a plagiarist, please let me assure you all: I'm not. I merely reached the same ideas and conclusions as others before me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/889154506030368938-8906388202426916959?l=swcraftsman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swcraftsman.blogspot.com/feeds/8906388202426916959/comments/default' title='תגובות לפרסום'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=889154506030368938&amp;postID=8906388202426916959' title='5 תגובות'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/889154506030368938/posts/default/8906388202426916959'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/889154506030368938/posts/default/8906388202426916959'/><link rel='alternate' type='text/html' href='http://swcraftsman.blogspot.com/2008/10/originality.html' title='Originality'/><author><name>Assaf Stone</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_njIZU_X1s08/Sb0rpRzfcxI/AAAAAAAAABM/a0wzTXU3Grg/S220/Me.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-889154506030368938.post-6319916293102935440</id><published>2008-10-08T21:49:00.006+02:00</published><updated>2008-10-09T21:59:49.042+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='quality'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='craftsmanship'/><title type='text'>Hello...</title><content type='html'>&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;Hello. My name is Assaf, and I'm a Software Craftsman.&lt;/span&gt; &lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;To be honest, I'm half expecting to hear a loud chorus of &lt;span class="Apple-style-span" style="FONT-STYLE: italic"&gt;"we love you, Assaf..."&lt;/span&gt; Okay, not really, but you have to admit it does seem appropriate.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;What's a software craftsman? According to Miriam Webster, a craftsman is &lt;span class="Apple-style-span" style="LINE-HEIGHT: 20px;font-family:'Times New Roman';" &gt;&lt;span class="Apple-style-span" style="FONT-WEIGHT: bold"&gt;1. A worker who practices a trade or handicraft&lt;/span&gt;, &lt;/span&gt;&lt;span class="Apple-style-span" style="LINE-HEIGHT: 20px"&gt;and &lt;/span&gt;&lt;span class="Apple-style-span" style="LINE-HEIGHT: 20px;font-family:'Times New Roman';" &gt;&lt;span class="Apple-style-span" style="FONT-WEIGHT: bold"&gt;2. One who creates or performs with skill or dexterity&lt;/span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="LINE-HEIGHT: 20px;font-family:'Times New Roman';" &gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="LINE-HEIGHT: 20px"&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;It is the second definition that I find to be of interest. &lt;span class="Apple-style-span" style="FONT-STYLE: italic"&gt;One who creates or performs with skill or dexterity. &lt;span class="Apple-style-span" style="FONT-STYLE: normal"&gt;Now, don't get the wrong idea here. I'm not trying for a nice pat on the back (though I'd never say no to one). To me, this definition implies that I use skill and dexterity in order to create. It is not enough to merely create or perform. The craftsman must bring his skill to the job. Otherwise, he's just working, not crafting.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="LINE-HEIGHT: 20px;font-family:arial;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="LINE-HEIGHT: 20px;font-family:arial;" &gt;This, to me is the essence of what a software developer should be. One must care enough about the code he writes, that he won't be satisfied with merely writing enough code to (hopefully) cover the requirements of the task. The craftsman in me strives to be skillful. Strives for quality.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="LINE-HEIGHT: 20px;font-family:arial;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="LINE-HEIGHT: 20px;font-family:arial;" &gt;Sometimes, though, I wonder - am I alone? Am I highly motivated or just plain "&lt;span class="Apple-style-span" style="FONT-STYLE: italic"&gt;high"&lt;/span&gt;? Am I a perfectionist or a deluded dreamer?&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="LINE-HEIGHT: 20px;font-family:arial;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="LINE-HEIGHT: 20px;font-family:arial;" &gt;How about you? Are you a craftsman, too? Tell me.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/889154506030368938-6319916293102935440?l=swcraftsman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swcraftsman.blogspot.com/feeds/6319916293102935440/comments/default' title='תגובות לפרסום'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=889154506030368938&amp;postID=6319916293102935440' title='0 תגובות'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/889154506030368938/posts/default/6319916293102935440'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/889154506030368938/posts/default/6319916293102935440'/><link rel='alternate' type='text/html' href='http://swcraftsman.blogspot.com/2008/10/hello.html' title='Hello...'/><author><name>Assaf Stone</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_njIZU_X1s08/Sb0rpRzfcxI/AAAAAAAAABM/a0wzTXU3Grg/S220/Me.jpg'/></author><thr:total>0</thr:total></entry></feed>
