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

<channel>
	<title>Mark Needham &#187; Books</title>
	<atom:link href="http://www.markhneedham.com/blog/category/books/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.markhneedham.com/blog</link>
	<description>Thoughts on Software Development</description>
	<lastBuildDate>Tue, 31 Aug 2010 18:27:42 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Linchpin: Book Review</title>
		<link>http://www.markhneedham.com/blog/2010/07/12/linchpin-book-review/</link>
		<comments>http://www.markhneedham.com/blog/2010/07/12/linchpin-book-review/#comments</comments>
		<pubDate>Mon, 12 Jul 2010 16:07:12 +0000</pubDate>
		<dc:creator>Mark Needham</dc:creator>
				<category><![CDATA[Books]]></category>
		<category><![CDATA[linchpin]]></category>

		<guid isPermaLink="false">http://www.markhneedham.com/blog/?p=2679</guid>
		<description><![CDATA[I've read a couple of Seth Godin's other books &#8211; Tribes and The Dip &#8211; and found them fairly readable so I figured his latest offering, Linchpin, would probably be worth a read too. This is the first book that I've read on the iPad's Kindle application and it was a reasonably good reading experience [...]]]></description>
			<content:encoded><![CDATA[<p>I've read a couple of Seth Godin's other books &#8211; <a href="http://www.amazon.co.uk/Tribes-Seth-Godin/dp/0749939753/ref=ntt_at_ep_dpt_2">Tribes</a> and <a href="http://www.amazon.co.uk/Dip-Little-Book-Teaches-Stick/dp/1591841666/ref=ntt_at_ep_dpt_12">The Dip</a> &#8211; and found them fairly readable so I figured his latest offering, <a href="http://www.amazon.co.uk/gp/product/0749953357/ref=s9_simh_gw_p14_i1?pf_rd_m=A3P5ROKL5A1OLE&#038;pf_rd_s=center-1&#038;pf_rd_r=03JWTHZX5TTSTXV1BEN6&#038;pf_rd_t=101&#038;pf_rd_p=467198433&#038;pf_rd_i=468294">Linchpin</a>, would probably be worth a read too.</p>
<p><img src="http://www.markhneedham.com/blog/wp-content/uploads/2010/07/51fMyB3O1TL._SL500_AA300_1.jpg" alt="51fMyB3O1TL._SL500_AA300_.jpg" border="0" width="210" height="300" style="float:right;" /></p>
<p>This is the first book that I've read on the <a href="http://itunes.apple.com/us/app/kindle/id302584613?mt=8">iPad's Kindle application</a> and it was a reasonably good reading experience &#8211; I particularly like the fact that you can make notes and highlight certain parts of the text.</p>
<p>It's also possible to see which areas of the book other Kindle users have highlighted and you can <a href="http://kindle.amazon.com/your_reading">see your highlights/notes via the Kindle website</a>. </p>
<h3>The Review</h3>
<p>The sub-title of the book: 'Are you indispensable? How to drive your career and create a remarkable future' didn't really appeal to me all that much but I've found that these types of things are often just for provocation and don't necessarily detract from the message.</p>
<p>As with the other Godin books I've read, he spends a lot of time making his original point and in this one it felt like I'd already agreed with what he was saying for at least 50 pages before we moved onto something else.</p>
<p>Despite that I think there were some good points made in the book. These were some of the more interesting ones for me:</p>
<ul>
<li>One of my favourite quotes from the book is the following about fire:<br />
<blockquote><p>
Fire is hot. That’s what it does. If you get burned by fire, you can be annoyed at yourself, but being angry at the fire doesn’t do you much good. And trying to teach the fire a lesson so it won’t be hot next time is certainly not time well spent.</p>
<p>Our inclination is to give fire a pass, because it’s not human. But <strong>human beings are similar, in that they’re not going to change any time soon either</strong>. </p></blockquote>
<p>One of the things I've noticed over time is that it's very unlikely that the core way a person behaves is likely to change regardless of the feedback that they get from other people.</p>
<p>Pat touches on this in <a href="http://www.thekua.com/atwork/2009/09/reminder-of-a-rule-for-giving-feedback/">a post where he points out that we need to be prepared for feedback to not be accepted</a>.</p>
<p>I don't think this means we should stop giving feedback to people if we think it will help them be more effective but it does seem useful to keep in mind and help us avoid frustration when we can't change a person to behave in the way we'd like them to.</li>
<li>Godin makes an interesting point about the value of the work that we do:<br />
<blockquote><p>A day’s work for a day’s pay (work <=> pay). I hate this approach to life. It cheapens us.</p></blockquote>
<p>This is exactly the consulting model &#8211; billing by the hour or by the day &#8211; and although I've come across a couple of alternative approaches I'm not sure that they work better than this model.</p>
<p><a href="http://www.guerrillaconsulting.com/newsletter/issue13-nov-05.html">Value based pricing</a> is something which I've read about but it seems to me that there needs to be a certain degree of trust between the two parties for that to work out. The other is <a href="http://www.sourcingmag.com/dictionary/Shared_risk/reward_pricing-173.htm">risk/reward pricing</a> and I've heard good/bad stories about this approach.</p>
<p>It seems to me that we'd need to have a situation where both parties were really involved in the long term outcome of the project/system so if one party is only invested for a short % of this time then it's going to be difficult to make it work.</li>
<li>Shipping is another area he touches on in a way that makes sense to me:<br />
<blockquote><p>I think <strong>the discipline of shipping is essential in the long-term path to becoming indispensable.</strong></p>
<p>The only purpose of starting is to finish, and while the projects we do are never really finished, they must ship. Shipping means hitting the publish button on your blog, showing a presentation to the sales team, answering the phone, selling the muffins, sending out your references. Shipping is the collision between your work and the outside world.</p></blockquote>
<p>While this is just generally applicable, in software terms this would be about the sort of thing that my colleagues Rolf Russell &#038; Andy Duncan cover in their talk '<a href="http://www.infoq.com/presentations/Rapid-Reliable-Releases">Rapid and Reliable Releases</a>'.</p>
<p>I also had an interesting discussion with <a href="http://twitter.com/spalders79">Jon Spalding</a> about the importance of just getting something out there with respect to the '<a href="https://chrome.google.com/extensions/detail/lghjfnfolmcikomdjmoiemllfnlmmoko">Invisible Hand</a>' browser plugin that he's currently working on. Jon pointed out that it's often best to ship and then rollback if there are problems rather than spending a lot of time trying to make sure something is perfect before shipping.</li>
<li>Godin spends a lot of time pointing out how important human interactions and relationships are and I think this is something that is very important for software delivery teams. One of the most revealing quotes is this:<br />
<blockquote><p>
You might be parroting the words from that negotiation book or the public-speaking training you went to, but every smart person you encounter knows that you’re winging it or putting us on.</p>
<p>Virtually all of us make our living engaging directly with other people. <strong>When the interactions are genuine and transparent, they usually work. When they are artificial or manipulative, they fail.</strong>
</p></blockquote>
<p>I attended a consulting training course when I first started working at ThoughtWorks 4 years ago and I've always found it impossible to actually use any of the ideas because it doesn't feel natural. It's interesting that Godin points out why this is!</li>
</ul>
<p>Overall this book feels to me like a more general version of Chad Fowler's '<a href="http://www.amazon.co.uk/Passionate-Programmer-Remarkable-Development-Pragmatic/dp/1934356344/ref=sr_1_1?ie=UTF8&#038;s=books&#038;qid=1278947712&#038;sr=8-1">The Passionate Programmer</a>' which is probably a more applicable book for software developers.</p>
<p>This one is still an interesting read although it primarily points out stuff that you probably already knew in a very clear and obvious way.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.markhneedham.com/blog/2010/07/12/linchpin-book-review/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Maverick: Book review</title>
		<link>http://www.markhneedham.com/blog/2010/04/14/maverick-book-review/</link>
		<comments>http://www.markhneedham.com/blog/2010/04/14/maverick-book-review/#comments</comments>
		<pubDate>Wed, 14 Apr 2010 07:23:54 +0000</pubDate>
		<dc:creator>Mark Needham</dc:creator>
				<category><![CDATA[Books]]></category>

		<guid isPermaLink="false">http://www.markhneedham.com/blog/?p=2341</guid>
		<description><![CDATA[My colleagues Frankie and Danilo have been recommending 'Maverick' to me for a long time and I finally got around to reading it. In this book Ricardo Semler, the CEO of Semco, tells the story of the company and how he helped evolved the organisation into one which is more employee led and embraces ideas [...]]]></description>
			<content:encoded><![CDATA[<p>My colleagues <a href="http://blog.franktrindade.com/">Frankie</a> and <a href="http://www.dtsato.com/blog/">Danilo</a> have been recommending '<a href="http://www.amazon.co.uk/Maverick-Success-Behind-Unusual-Workplace/dp/0712678867/ref=sr_1_1?ie=UTF8&#038;s=books&#038;qid=1266791367&#038;sr=8-1">Maverick</a>' to me for a long time and I finally got around to reading it.</p>
<p>In this book Ricardo Semler, the CEO of Semco, tells the story of the company and how he helped evolved the organisation into one which is more employee led and embraces ideas such as open &#038; self set salaries while encouraging civil obedience in the workforce as a necessity to alert the organisation to its problems.</p>
<p>These were some of the ideas that I found the most interesting:</p>
<ul>
<li>Early on Semler points out that <strong>Semco doesn't have a culture of looking busy</strong>. He describes how a sales manager spends a lot of his day just reading the newspaper but then as soon as there's a problem for him to handle that's when he earns his salary. Even though this book isn't specifically about systems thinking, the description of this situation suggests to me that they are able to look at the bigger picture at Semco.
<p>In software teams we can often feel quite guilty if we're not busy but a bit of slack time is often useful for thinking about better ways to do things or to spike out new ideas.</li>
<li>Semler emphasises the need to have <strong>small business units</strong> of under 150 people while matches up quite well with <a href="http://en.wikipedia.org/wiki/Dunbar's_number">research done by Robin Dunbar</a> which indicates that 150 is the 'theoretical cognitive limit to the number of people with whom one can maintain stable social relationships.' Semler also adds that keeping the units small 'keeps them human'.
<p>I know ThoughtWorks keeps this in mind with respect to our offices and will look to open a new one if the number of people in one is getting close to the 150-200 mark. </li>
<li>Semco have a culture of what Semler refers to as '<strong>absolute trust</strong>' which he suggests is a more natural way. They implemented this at Semco by removing security checks on the gates into/out from the plants.
<p>He almost then predicts the inevitable question in the reader's mind with the following statement:</p>
<blockquote><p>
2 or 3% will take advantage of an employer's trust. Is this a valid reason to subject 97% to a ritual of humiliation?</p>
<p>Have thefts increased or decreased?</p>
<p>I don't know and I don't care. It's not worth it to me to have a company at which you don't trust the people with whom you work.
</p></blockquote>
<p>He promotes <strong>an approach of common sense</strong> amongst his employees, suggesting that 'rules freeze companies inside a glacier; innovation lets them ride sleighs over it'.</p>
<p>The general idea seems to be that the small details aren't really that important and only serve to distract from the bigger objectives that the company are trying to achieve.</li>
<li>
I was quite surprised to read how strongly Semler recommends <strong>job rotation</strong>:</p>
<blockquote><p>
Man is by nature restless. When left too long in one place he will inevitably grow bored, unmotivated, and unproductive. The cure, I believed, was to encourage managers to exchange jobs with one another
</p></blockquote>
<p>He goes on to point out that this type of rotation forces people to learn new skills which makes them more valuable but also discourages empire building because people don't stay in the same place for too long.</p>
<p>I think we do this to some extent in the software industry between some roles but probably not as much as we could do. Having said that there is a lot to learn as a developer anyway so perhaps it's not so applicable here.
</li>
<li>Perhaps the most controversial idea in the book is that of <strong>transparent/self set salaries</strong>. There was initially resistance to the latter idea as cynics believed that a few people would take advantage and award themselves massive pay increases. However, they found that having those salaries public served as a strong disincentive.
<p>He also identifies the fact that people have a stake in the success of the company as being key for allowing this to work:</p>
<blockquote><p>
The third reason our people tended to be modest about salaries has to do with self preservation&#8230;Our people know salaries account for most of our operating costs, and they think about our budgets when they set them. It's easy to solve a budget problem by eliminating a salary that seems too high, and noone wants to stick out.
</p></blockquote>
</li>
<li>
The underlying reason behind why a lot of the ideas Semler implements seem to be about <strong>unhiding information</strong> as described by the following quote:</p>
<blockquote><p>
There is power in knowing something someone else doesn't&#8230;but when cards are held close to the chest, communication will be faulty and anxieties, misunderstandings, insecurity, and eventually hostility will manifest itself&#8230;which is why when we started sharing information at Semco it has such a profound effect. People in the higher echelons could no longer rely on the conventional symbols and had to develop leadership skills and knowledge to inspire respect.
</p></blockquote>
<p>Spreading responsibility for problem solving across the organisation is another idea Semler strongly encourages and I think this partly explains why it's more fun working in an agile environment.</p>
<p>Information in general is more accessible and because of that people have more opportunity to solve problems than they otherwise would.
</li>
<li>Semler discusses the need to <strong>keep the organisation lean even when times are good</strong> which he acknowledges is much more difficult than trying to keep it lean when times are hard! For Semco this involves being careful when hiring people to work on product lines which they knew had a short life span as well as ensuring that they didn't add any unnecessary roles just because sales were strong.</li>
</ul>
<p>Towards the end of the book Semler suggests that his goal with Semco was to '<strong>make people look forward to coming to work in the morning</strong>' which seems like quite a noble objective!</p>
<p>I found it quite interesting that although a lot of these ideas seem a  bit radical, they made sense in Semco's context because they were introduced incrementally and only after some other ideas had been introduced which helped smooth the way.</p>
<p>It's certainly an interesting read and the ideas expressed at quite different than what is typical in most organisations.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.markhneedham.com/blog/2010/04/14/maverick-book-review/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Getting real: Book review</title>
		<link>http://www.markhneedham.com/blog/2010/03/08/getting-real-book-review/</link>
		<comments>http://www.markhneedham.com/blog/2010/03/08/getting-real-book-review/#comments</comments>
		<pubDate>Mon, 08 Mar 2010 21:56:58 +0000</pubDate>
		<dc:creator>Mark Needham</dc:creator>
				<category><![CDATA[Books]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.markhneedham.com/blog/?p=2230</guid>
		<description><![CDATA[I recently came across 37 Signals 'Getting Real' book where they go through their approach to building web applications and there have certainly been some good reminders and ideas on the best way to do this. These are some of my favourite parts: Ship it! If there are minor bugs, ship it as soon you [...]]]></description>
			<content:encoded><![CDATA[<p>I recently came across 37 Signals '<a href="http://gettingreal.37signals.com">Getting Real</a>' book where they go through their approach to building web applications and there have certainly been some good reminders and ideas on the best way to do this.</p>
<p>These are some of my favourite parts:</p>
<ul>
<li><strong>Ship it!</strong><br />
<blockquote><p>
If there are minor bugs, ship it as soon you have the core scenarios nailed and ship the bug ﬁxes to web gradually after that. The faster you get the user feedback the better.
</p></blockquote>
<p>Often on projects I've worked on we've taken the approach that bugs get worked on before new stories which makes sense in a way because it means that we are fixing problems quickly and keeping the quality of the application high.</p>
<p>In reality what often happens is that low priority bugs just end up not getting looked at but I like the fact that we can choose to make that an explicit approach rather than just allowing it to happen to us.</p>
<blockquote><p>
Prioritize your bugs (and even ignore some of them) </p>
<p>Just because you discover a bug in your product, doesn’t mean it’s time to panic. All software has bugs – it’s just a fact of life.
</p></blockquote>
<p>I find it interesting that there might be more value in getting something out the door and then getting feedback on it rather than spending extra time perfecting it up front.
</li>
<li><strong>Fix Time and Budget, Flex Scope</strong><br />
<blockquote><p>
You have to ﬁgure out what’s really important. What’s going to make it into this initial release? This forces a constraint on you which will push you to make tough decisions instead of hemming and hawing.
</p></blockquote>
<p>From my experience a lot of times we end up implementing features just because that's what was agreed in the initial release plan and there is often a reluctance to change that even if a feature isn't really that useful  anymore.</p>
<p>It becomes even more problematic if we get to the stage where it's not possible to deliver all the features promised in the remaining time so it certainly makes sense to me that in that situation we would look to focus on getting the absolutely essential things in first.</p>
</li>
<li><strong>Choose any enemy</strong><br />
<blockquote><p>
Sometimes the best way to know what your app should be is to know what it shouldn’t be. Figure out your app’s enemy and you’ll shine a light on where you need to go.
</p></blockquote>
<p>This seems to be a much better idea than just copying the ideas of your competitor which might seem the obvious thing to do if you're working in the same area.</p>
<p>The problem with that approach of course is that when you do copy you have no actual vision of what you're doing with your application anyway so you'll always be playing catch up.
</li>
<li><strong>Don't overcomplicate the application</strong>
<p>There are a few parts of the book where the authors talk about keeping the application simple and then letting the users play with it:</p>
<blockquote><p>
The harder we tighten things down, the less room there is for a creative, emergent solution. Whether it’s locking down requirements before they are well understood or prematurely optimizing code, or inventing complex navigation and workﬂow scenarios before letting end users play with the system, the result is the same: an overly complicated, stupid system instead of a clean, elegant system that harnesses emergence. </p>
<p>Keep it small. Keep it simple. Let it happen.
</p></blockquote>
<p>Andrew Hunt, The Pragmatic Programmers</p>
<p>The users can then decide for us where we need to fill in more details:</p>
<blockquote><p>
Details reveal themselves as you use what you’re building. You’ll see what needs more attention. You’ll feel what’s missing. You’ll know which potholes to pave over because you’ll keep hitting them. That’s when you need to pay attention, not sooner.
</p></blockquote>
<p>In particular they suggest that focusing on very specific details about the page layout/colour/wording can be left until later because it will only serve to hinder forward progress if we concentrate on it too early.
</li>
<li><strong>Scaling an application</strong><br />
<blockquote><p>
You don’t have a scaling problem yet </p>
<p>“Will my app scale when millions of people start using it?” </p>
<p>Ya know what? Wait until that actually happens.
</p></blockquote>
<p>On several projects that I've worked on there often seems to be a desire to focus on performance and scaling an application very early on which seems wasteful when we could be focusing on actually building something that has so many users that we need to scale it later on. I think this advice is spot on.
</li>
<li><strong>Write less software</strong>
<p>A common theme throughout the book is that of writing less software to achieve our goals:</p>
<blockquote><p>
The best designers and the best programmers&#8230;are the ones that can determine what just doesn’t matter. </p>
<p>That’s where the real gains are made. </p>
<p>Most of the time you spend is wasted on things that just don’t matter. If you can cut out the work and thinking that just don’t matter, you’ll achieve productivity you’ve never imagined.
</p></blockquote>
<blockquote><p>
Innovation is not about saying yes to everything. It’s about saying NO to all but the most crucial features. </p>
<p>Throw away customer feature requests &#8211; if they're really important then they'll come back anyway</p>
<p>Don’t worry about tracking and saving each request that comes in. Let your customers be your memory. If it’s really worth remembering, they’ll remind you until you can’t forget.
</p></blockquote>
<p>The authors ideas around preferences were particularly interesting to me:</p>
<blockquote><p>
Preferences are also evil because they create more software. </p>
<p>More options require more code. And there’s all the extra testing and designing you need to do too.
</p></blockquote>
<p>I hadn't appreciated until recently quite how much complexity we can add to an application by allowing users to play around with the display of information on a screen.</p>
<p>It seems like a nice feature to have but it would be interesting to see statistics that could tell us what percentage of users actually that type of thing when it's not the core idea of the application.</p>
<p>I also quite liked the following and I think it's something that we need to do more often on teams:</p>
<blockquote><p>
Encourage programmers to make counteroﬀers.You want to hear: “The way you suggested will take 12 hours. But there’s a way I can do it that will only take one hour. It won’t do x but it will do y.” Let the software push back. Tell programmers to fight for what they think is the best way.
</p></blockquote>
</li>
<li><strong>Decisions are temporary so make the call and move on</strong><br />
<blockquote><p>
So don’t do the “paralysis through analysis” thing. That only slows progress and saps morale. </p>
<p>Instead, value the importance of moving on and moving forward. Get in the rhythm of making decisions. Make a quick, simple call and then go back and change that decision if it doesn’t work out.
</p></blockquote>
<p>I think a big part of this is getting the mentality that it's fine to make changes after we've 'finished' something. Any other approach doesn't work from my experience.</p>
</li>
<li><strong>Reduce meetings</strong><br />
<blockquote><p>
Meetings usually arise when a concept isn’t clear enough. Instead of resorting to a meeting, try to simplify the concept so you can discuss it quickly via email or im or Campﬁre.
</p></blockquote>
<p>I find it interesting that they prefer communicating by email because I've often found that it's not the best communication mechanism since it's really easy to misinterpret what people mean.</p>
<p>Having said that if we can make concepts clearer and the need for a meeting is an indicator that we need to do that then perhaps we can still meet in person and just make the meeting much shorter.
</li>
<li><strong>Design the interface before you start programming</strong><br />
<blockquote><p>
Too many apps start with a program-ﬁrst mentality. That’s a bad idea. Programming is the heaviest component of building an app, meaning it’s the most expensive and hardest to change. Instead, start by designing ﬁrst.
</p></blockquote>
<p>I've certainly fallen into this trap a lot but I've been trying to follow the <a href="http://www.infoq.com/presentations/bdd-dan-north">outside in approach</a> more strictly recently and so far I'm finding that it reduces the feedback cycle quite substantially which is only a good thing.
</li>
<li><strong>Design for regular, blank, and error states </strong><br />
<blockquote>
<p>For each screen, you need to consider three possible states: </p>
<p>Regular<br />
The screen people see when everything’s working ﬁne and your app is ﬂush with data. </p>
<p>Blank<br />
The screen people see when using the app for the ﬁrst time, before data is entered. </p>
<p>Error<br />
The screen people see when something goes wrong.
</p></blockquote>
<p>I'd never even though of this at all and I'm certainly guilty of only ever considering applications when all the data is filled in so this is certainly something else to consider.
</li>
<li><strong>Tear down the walls between support and development </strong><br />
<blockquote><p>In the restaurant business, there’s a world of diﬀerence between those working in the kitchen and those out front who deal with customers. It’s important for both sides to understand and empathize with the other. That’s why cooking schools and restaurants will often have chefs work out front as waiters so the kitchen staff can interact with customers and see what it’s actually like on the front lines.
</p></blockquote>
<p>My colleague Chris Read and some others seem to be trying to close this gap with the <a href="http://www.devopsdays.org/">devops</a> movement which also has <a href="http://qconlondon.com/london-2010/tracks/show_track.jsp?trackOID=331">a track at QCon London</a> this week.</p>
<p>The idea of working in support to see what an application is like from that perspective is something that more experienced colleagues often recommend although I've not done it as yet.
</li>
</ul>
<p>Overall I found this book a really interesting and quick read and although many of the ideas suggested seem like common sense it's strange that we often don't do all of them. </p>
<p>The 37 Signals guys also have a new book coming out in the UK tomorrow titled '<a href="http://www.amazon.co.uk/Rework-Meetings-One-Down-Competition-Greatness/dp/0091929784/ref=sr_1_1?ie=UTF8&#038;s=books&#038;qid=1268085360&#038;sr=8-1">Rework</a>' which sounds like it could be quite a good read as well.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.markhneedham.com/blog/2010/03/08/getting-real-book-review/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>The Last Lecture &#8211; Randy Pausch</title>
		<link>http://www.markhneedham.com/blog/2010/01/01/the-last-lecture-randy-pausch/</link>
		<comments>http://www.markhneedham.com/blog/2010/01/01/the-last-lecture-randy-pausch/#comments</comments>
		<pubDate>Fri, 01 Jan 2010 14:32:58 +0000</pubDate>
		<dc:creator>Mark Needham</dc:creator>
				<category><![CDATA[Books]]></category>

		<guid isPermaLink="false">http://www.markhneedham.com/blog/?p=1984</guid>
		<description><![CDATA[I recently watched Randy Pausch's 'Last Lecture: Achieving Your Childhood Dreams' and read the corresponding book and although it's not directly related to software development I think that some of the points that he makes are really intriguing. These were some of the parts that particularly stood out for me: Introduce the elephant in the [...]]]></description>
			<content:encoded><![CDATA[<p>I recently watched Randy Pausch's '<a href="http://www.youtube.com/watch?v=ji5_MqicxSo">Last Lecture: Achieving Your Childhood Dreams</a>' and read the <a href="http://www.amazon.com/gp/product/1401323251?ie=UTF8&#038;tag=marneesblo-20&#038;linkCode=as2&#038;camp=1789&#038;creative=390957&#038;creativeASIN=1401323251">corresponding book</a> and although it's not directly related to software development I think that some of the points that he makes are really intriguing.</p>
<p>These were some of the parts that particularly stood out for me:</p>
<ul>
<li><strong>Introduce the elephant in the room</strong> &#8211; whatever it is that people are really thinking about, put it out in the open. I think on development teams there is often a distrust of the way that other people write code because it's different to the way that we do. If we can get this out in the open more frequently and agree on a shared approach then it should result in a <a href="http://www.markhneedham.com/blog/2009/11/04/consistency-in-the-code-base/">more consistent code base</a>.</li>
<li><strong>Get the fundamentals down</strong> &#8211; Pausch suggests that we need to understand the fundamentals because otherwise the fancy stuff isn't going to work. In Apprenticeship Patterns Ade Oshineye and Dave Hoover suggest that we should '<a href="http://my.safaribooksonline.com/9780596806842/study_the_classics">Study the Classics</a>' which is a similar idea.
<p>While I think they're certainly right I'm not sure that <a href="http://www.markhneedham.com/blog/2008/02/09/learning-theory-first/">learning theory before putting it into practice</a> is the most effective way to learn. I think we need to do a bit of both at the same time alternating between the two so that we actually have a frame of reference when we're learning the fundamentals.</li>
<li><strong>The brick walls are there for a reason</strong> &#8211; Pausch describes how we'll often come across obstacles stopping or blocking us from what we want to do but that we shouldn't be discouraged, they are there so that we can see how much we really want something. I think this is just generally true and not just related to software development.</li>
<li><strong>The skill of self assessment</strong> &#8211; Pausch suggests that we need know what we don't know which I think is perhaps the best advice in the book. We need to recognise our true abilities but also have a sense of our flaws and create feedback loops to allow this to happen.
<p>My colleague Liz Douglass has come up with the idea of <a href="http://lizdouglass.wordpress.com/2009/11/16/friday-feedback-frenzies/">Feedback Frenzies</a> to help create this feedback loop and this is one of the best ideas I've come across for doing this.</li>
<li>One of my favourite quotes from the book is the following which I believe was originally from Dan Stanford:<br />
<blockquote><p>Experience is what you get when you didn't get what you wanted</p>
<p>&#8230;</p>
<p>It's a phrase worth considering at every brick wall we encounter, and at every disappointment. It's also a reminder that <strong>failure is not just acceptable, it's often essential</strong>.</p></blockquote>
<p>I think we can do this much more in the software world. There sometimes seems to be a stigma with identifying things which fail but I think it's really useful for others to learn from mistakes that have been made.</li>
</ul>
<p>The Last Lecture is one of the best presentations I've had the chance to watch &#8211; I'd certainly recommend it.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.markhneedham.com/blog/2010/01/01/the-last-lecture-randy-pausch/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Debug It: Book Review</title>
		<link>http://www.markhneedham.com/blog/2009/12/24/debug-it-book-review/</link>
		<comments>http://www.markhneedham.com/blog/2009/12/24/debug-it-book-review/#comments</comments>
		<pubDate>Wed, 23 Dec 2009 19:26:46 +0000</pubDate>
		<dc:creator>Mark Needham</dc:creator>
				<category><![CDATA[Books]]></category>
		<category><![CDATA[debugging]]></category>

		<guid isPermaLink="false">http://www.markhneedham.com/blog/?p=1971</guid>
		<description><![CDATA[David Agans' 'Debugging' is the best debugging book that I've read so I was intrigued to see that there was another book being written on the subject. Paul Butcher offered me a copy of the book to review so I was keen to see whether it was more like 'Debugging' or 'Release It' as Ted [...]]]></description>
			<content:encoded><![CDATA[<p>David Agans' '<a href="http://www.amazon.com/gp/product/0814474578?ie=UTF8&#038;tag=marneesblo-20&#038;linkCode=as2&#038;camp=1789&#038;creative=390957&#038;creativeASIN=0814474578">Debugging</a>' is the best debugging book that I've read so I was intrigued to see that there was another book being written on the subject. </p>
<p>Paul Butcher offered me a copy of the book to review so I was keen to see whether it was more like 'Debugging' or '<a href="http://www.amazon.com/gp/product/0978739213?ie=UTF8&#038;tag=marneesblo-20&#038;linkCode=as2&#038;camp=1789&#038;creative=390957&#038;creativeASIN=0978739213">Release It</a>' <a href="http://blogs.tedneward.com/2009/11/23/Book+Review+Debug+It+Paul+Butcher+Pragmatic+Bookshelf.aspx">as Ted Neward suggests</a>.</p>
<h3>The Book</h3>
<p><a href="http://www.amazon.com/gp/product/193435628X?ie=UTF8&#038;tag=marneesblo-20&#038;linkCode=as2&#038;camp=1789&#038;creative=390957&#038;creativeASIN=193435628X">Debug It</a> by Paul Butcher</p>
<h3>The Review</h3>
<p><a href="http://devlicio.us/blogs/krzysztof_kozmic/archive/2009/08/30/book-review-debug-it-find-repair-and-prevent-bugs-in-your-code.aspx">Much like Krzysztof Kozmic</a> I found that a lot of the ideas early on in the book were similar to what I've been taught by my ThoughtWorks colleagues over the last 3 1/2 years.</p>
<p>I do think it's really good seeing these ideas in words though because it's quite easy to forget about the best way to approach problems in the heat of the moment and the approaches suggested by Paul certainly aren't done everywhere in my experience.</p>
<p>These were some of my favourite parts of the book:</p>
<ul>
<li>When chasing a bug Butcher suggests that a useful technique to use is to<strong> try and disprove your theory of why the problem has happened</strong>. Too often we come up with a theory and just adapt any data to fit our thinking. This is also known as <a href="http://en.wikipedia.org/wiki/Confirmation_bias">confirmation bias</a>.
<p>In his talk '<a href="http://www.markhneedham.com/blog/2009/04/25/pimp-my-architecture-dan-north/">Pimp my architecture</a>' Dan North suggests a similar approach more generally when working out how to tackle any problem. Each person has to take the other person's argument and then fight for that to be used instead. I quite like this idea &#8211; certainly something to try out.</li>
<li>When discussing the need to refactor code as we go along, the author points out that <strong>if the code we want to change doesn't have any tests around it then we need to write some</strong> to provide us with a safety net.<br />
<blockquote><p>
Remember, however, that refactoring crucially depends upon the support of an extensive suite of automated tests. Without tests, you’re not refactoring. You’re hacking.
</p></blockquote>
<p>Hamlet D'Arcy <a href="http://hamletdarcy.blogspot.com/2009/06/forgotten-refactorings.html">makes a similar point but perhaps more forcibly in a really good blog post</a> and Michael Feathers' '<a href="http://www.amazon.com/gp/product/0131177052?ie=UTF8&#038;tag=marneesblo-20&#038;linkCode=as2&#038;camp=1789&#038;creative=390957&#038;creativeASIN=0131177052">Working Effectively With Legacy Code</a>' covers the topic in much more detail.
</li>
<li>One tip which seems obvious but is still one I've tripped up on many times is to <strong>go through the list of changes that we've made before checking in</strong>! It's incredibly easy to forget about some seemingly insignificant change that we made before checking it in and perhaps breaking our application unexpectedly.
<p>Somewhat tied in with this is the idea of checking in small changes more frequently and <a href="http://www.markhneedham.com/blog/2009/12/22/one-change-at-a-time/">only changing one thing at a time which I wrote about previously</a>.</li>
<li>I like that Butcher puts a lot of emphasis on <strong>ensuring that we actually know what's going wrong before we attempt to fix anything</strong>.<br />
<blockquote><p>Without ﬁrst understanding the true root cause of the bug, we are outside the realms of software engineering and delving instead into voodoo programming or programming by coincidence.
</p></blockquote>
<p>This is particularly true when addressing performance problems where he rightly suggests that we should look to profile the code before making a premature optimisation. </p>
<p>He also suggests using the <a href="http://www.markhneedham.com/blog/2009/03/20/coding-reassessing-what-the-debugger-is-for/">debugger</a> so that we can get a good idea about what the code is actually doing when it's running. While I think this is useful I feel that the need to use the debugger in this way frequently might suggest that our code is difficult to reason about which could well be something to address. </li>
<li>A couple of other cool suggestions are to<a href="http://www.markhneedham.com/blog/2009/09/07/a-reminder-that-sometimes-its-best-just-to-ask/"> call on team mates to help us out</a> if we're getting stuck trying to fix a bug and if that's not possible then to either <a href="http://www.markhneedham.com/blog/2009/11/15/a-reminder-to-talk-to-the-rubber-duck/">write out the problem or talk to the rubber duck</a>.<br />
<blockquote><p>
If you don’t have someone to play the role of cardboard cutout, all is not necessarily lost. Try scribbling down a narrative of the problem on paper or perhaps composing an email to a friend. The trick is not to censor yourself — just like a writer would.
</p></blockquote>
<p>I don't think <strong>the importance of communicating with team mates can be underestimated</strong> and Butcher points out that if we notice a bad pattern in the code than it's no good just going through and changing it everywhere. We need to talk with the rest of the team to decide whether we can get an agreement on the way we'll develop code going forwards.</li>
<li>The only idea I disagreed with is that of putting <a href="http://www.markhneedham.com/blog/2009/02/14/coding-assertions-in-constructors/">assertions</a> <a href="http://www.markhneedham.com/blog/2009/10/31/coding-invariant-checking-on-dependency-injected-components/">into</a> <a href="http://www.markhneedham.com/blog/2009/10/29/coding-consistency-when-invariant-checking/">the code</a> which I feel adds clutter to our code even though it makes it fail faster than would otherwise be the case. From my experience if we write good enough unit tests and have <a href="http://watchitlater.com/blog/archives/115">good logging</a> in our code then the assertions aren't needed.</li>
</ul>
<h3>In Summary</h3>
<p>The book is pretty quick to read at around 200 pages and packs a lot of useful tips into that space. I'd say it's a pretty useful book to keep by your desk to refer to now and then.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.markhneedham.com/blog/2009/12/24/debug-it-book-review/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Fundamentals of Object-Oriented Design in UML: Book Review</title>
		<link>http://www.markhneedham.com/blog/2009/12/01/fundamentals-of-object-oriented-design-in-uml-book-review/</link>
		<comments>http://www.markhneedham.com/blog/2009/12/01/fundamentals-of-object-oriented-design-in-uml-book-review/#comments</comments>
		<pubDate>Tue, 01 Dec 2009 13:26:38 +0000</pubDate>
		<dc:creator>Mark Needham</dc:creator>
				<category><![CDATA[Books]]></category>
		<category><![CDATA[object-orientation]]></category>

		<guid isPermaLink="false">http://www.markhneedham.com/blog/?p=1890</guid>
		<description><![CDATA[One of my favourite recent blog posts is one written by Sammy Larbi on coupling and cohesion and while discussing it with Phil he suggested that I would probably like this book and in particular the chapter on connascence which I've previously written about. The Book Fundamentals of Object-Oriented Design in UML by Meilir Page-Jones [...]]]></description>
			<content:encoded><![CDATA[<p>One of my favourite recent blog posts is one written by <a href="http://www.codeodor.com/index.cfm/2009/6/17/Strive-for-low-coupling-and-high-cohesion-What-does-that-even-mean/2902">Sammy Larbi on coupling and cohesion</a> and while discussing it with <a href="http://fragmental.tw/">Phil</a> he suggested that I would probably like this book and in particular <a href="http://www.markhneedham.com/blog/2009/10/28/coding-connascence-some-examples/">the chapter on connascence which I've previously written about</a>.</p>
<h3>The Book</h3>
<p><a href="http://www.amazon.com/gp/product/020169946X?ie=UTF8&#038;tag=marneesblo-20&#038;linkCode=as2&#038;camp=1789&#038;creative=390957&#038;creativeASIN=020169946X">Fundamentals of Object-Oriented Design in UML</a> by Meilir Page-Jones</p>
<h3>The Review</h3>
<p>I really enjoyed reading this book and I think it's one that I could come back and read again to gain something else from in the future.</p>
<p>Nearly all the mistakes that I've made and seen made with respect to the design of object oriented code are outlined in one form or the other in this book.</p>
<p>The book is split into three sections. The first discusses some fairly basic object oriented concepts, the second covers UML as a notation for describing our designs and the final section goes more deeply into the principles of object-oriented design. </p>
<h4>What did I learn?</h4>
<ul>
<li>Although we don't seem to use UML much these days I was coming to the conclusion while reading those chapters that perhaps UML is useful as a design tool but the aim shouldn't be to come up with a UML diagram, but rather to drive a design in code.
<p>This is something which <a href="http://blog.objectmentor.com/articles/2009/10/08/tdd-triage">Uncle Bob also touched on recently</a>:</p>
<blockquote><p>
Is TDD a replacement for design?</p>
<p>No. You still need all your design skills. You still need to know design principles, and design patterns. You should know UML. And, yes, you should create lightweight models of your proposed software designs.
</p></blockquote>
<p>We actually found on a project I worked on recently that everyone had a different way of diagramming a design and it would have been useful to have a common notation between us. UML is surely the tool to solve that problem.</li>
<li>I quite like the way that Page-Jones describes the <strong>different types of messages</strong> that objects can receive:
<ul>
<li>Informative &#8211; a message telling an object about something that happened in the past.</li>
<li>Interrogative &#8211; a message asking an object to reveal something about itself.</li>
<li>Imperative &#8211; a message telling an object to take some action on itself.</li>
</ul>
<p>An interrogative message is effectively a getter whereas the other two are commands being sent to the object. I've not seen the distinction between events which happened in the past and those which are going to happen in the immediate future.</li>
<li>I've frequently come across the idea of information hiding when it comes to designing objects but Page-Jones introduces the idea of <strong>implementation hiding</strong> which I think is really neat.
<p>The idea is that while some information about our object will be viewable to other objects e.g. through attributes/getters, we can still hide the implementation of that information internally so that if we we want to change it in the future then we won't have to change all its clients too.</li>
<li>I found the concept of the <strong>rings of operation</strong> really interesting.  The idea is that there are some methods on our objects which just make use of other methods on the same object. Those methods wouldn't touch any of the fields of an object directly but would rely on those methods in the inner rings to do so.
<p>For example if we have a getter on an object to access a field then if other methods on that object want to access that field they should go via the getter instead of accessing the field directly. </p>
<p>I often find myself avoiding using getters with the hope that if don't increase their usage then it will be easier to get rid of them in the future. This approach would discourage doing that.</li>
<li>I like the idea of <a href="http://www.markhneedham.com/blog/2009/11/19/two-controllers-type-conformance-and-the-liskov-substitution-principle/">type conformance</a> when it comes to inheritance &#8211; we should try to ensure that any sub types adhere to the contract of their parent.
<p>The other part of this chapter describes '<strong>closed behaviour</strong>' &#8211; all the operations on any class that we inherit from should obey our class' invariant. </p>
<p>I think this can be where we go wrong when <a href="http://www.markhneedham.com/blog/2009/07/24/wrapping-collections-inheritance-vs-composition/">we write classes which extend a List for example</a>. The API of a List will typically have 'Add' and "Remove' operations but on a lot of the application I work on we only want the 'Add' functionality and not the 'Remove' option. Page Jones suggests that if we want to use inheritance in this situation then we should override methods on the super class to make 'Remove' do nothing. </li>
<li>I now find that I prefer Page Jones definition of cohesion:<br />
<blockquote><p>
Class cohesion is the measure of interrelatedness of the features (the attributes and operations) located in the external interface of a class</p></blockquote>
<p>I'm inclined to believe that we might be able to tell how related the features are by looking at the clients of the class and seeing whether they are all using the class in similar ways.</p>
<p>He then outlines three signs that we have cohesion problems with a class:</p>
<ul>
<li>Mixed instance cohesion &#8211; a class has some features that are undefined for some objects of the class. I find that this typically happens when we try to make a generic data type to cover everything and then try to jam any variations on the type into the same definition. It is typically solved by pulling out another class. This is the worst type of cohesion.</li>
<li>Mixed domain cohesion &#8211; a class contains an element that directly couples the class with another class that is unrelated domain wise. This typically happens when we mix infrastructure code into our domain code.</li>
<li>Mixed role cohesion &#8211; a class contains an element that couples it with an unrelated class in the same domain. I think this is the most typical type of cohesion that I've seen and the main problem is that we end up with classes which have multiple roles which makes them difficult to change.</li>
</ul>
</ul>
<h3>In Summary</h3>
<p>There's way more in this book than I could ever hope to cover here but these are some of the interesting bits that stood out from this reading of it. I'm pretty sure that I'll come back to this one in the future.</p>
<p>While reading the book I had the feeling that some of the ideas are quite similar to those in Domain Driven Design and since this book was published it contributes to my belief that <a href="http://www.markhneedham.com/blog/2008/09/20/similarities-between-domain-driven-design-object-oriented-programming/">a lot of DDD is covered by just doing OOP well</a>.</p>
<p>Overall this is a really good book, worth reading.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.markhneedham.com/blog/2009/12/01/fundamentals-of-object-oriented-design-in-uml-book-review/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Zen Mind, Beginners Mind: Book Review</title>
		<link>http://www.markhneedham.com/blog/2009/08/12/zen-mind-beginners-mind-book-review/</link>
		<comments>http://www.markhneedham.com/blog/2009/08/12/zen-mind-beginners-mind-book-review/#comments</comments>
		<pubDate>Tue, 11 Aug 2009 23:06:53 +0000</pubDate>
		<dc:creator>Mark Needham</dc:creator>
				<category><![CDATA[Books]]></category>
		<category><![CDATA[beginners-mind]]></category>

		<guid isPermaLink="false">http://www.markhneedham.com/blog/?p=1530</guid>
		<description><![CDATA[The Book Zen Mind, Beginner's Mind by Shunryu Suzuki The Review I first came across the actual term beginner's mind when reading through the 'Wear The White Belt' chapter of Apprenticeship Patterns although it was often mentioned to me on one of the first projects I did at ThoughtWorks a couple of years ago that [...]]]></description>
			<content:encoded><![CDATA[<h3>The Book</h3>
<p><a href="http://www.amazon.co.uk/Zen-Mind-Beginners-Shunryu-Suzuki/dp/0834800799/ref=sr_1_1?ie=UTF8&#038;qid=1249997223&#038;sr=8-1">Zen Mind, Beginner's Mind</a> by Shunryu Suzuki</p>
<h3>The Review</h3>
<p>I first came across the actual term <a href="http://www.c2.com/cgi/wiki?BeginnersMind">beginner's mind</a> when reading through the '<a href="http://softwarecraftsmanship.oreilly.com/wiki/wear_the_white_belt">Wear The White Belt</a>' chapter of <a href="http://softwarecraftsmanship.oreilly.com/wiki">Apprenticeship Patterns</a> although it was often mentioned to me on one of the first projects I did at ThoughtWorks a couple of years ago that people liked teaching me things because I just took the information in pretty much without questioning.</p>
<p>I find nowadays that I analyse what people tell me way a lot more and then compare it against what I already know to see if it adds to my understanding. In a way this is useful but sometimes prevents me fully understanding ideas since I have already judged them.</p>
<p>I started researching beginner's mind a bit to see if there was anything written on the state of mind required to maximise learning and this was the book that kept being mentioned so I decided to get a copy of it.</p>
<p>It is fundamentally a book on Zen and a lot of the stuff around that area didn't make a lot of sense to me but I think there were some general ideas which can be applied to learning in general.</p>
<h4>What did I learn?</h4>
<ul>
<li>One of the early chapters sets the message for the book with the following quote:<br />
<blockquote><p>
In the beginner's mind there are many possibilities. In the experts there are few.</p></blockquote>
<p>Straight away it gets to the point which I think describes the problem that we have in software development once we've done a few projects and accumulated a set of ideas of the best way to deliver software &#8211; <strong>we often stick to those ideas and aren't open to the idea of better ideas</strong> being out there.</p>
<p>On the other hand <a href="http://www.markhneedham.com/blog/2009/04/11/the-mythical-man-month-book-review/">as Fred Brooks points out</a> there is no silver bullet so perhaps this also explains why there is often skepticism when new ideas are described since its quite likely that potential negative points of these approaches have either not been described or not yet discovered.</li>
<li>The author raises some interesting ideas around how to get the best out of people by suggesting that the best way to do this is to let them do what they want but to watch them. Although he then went out to reference this back as a metaphor for controlling our own thoughts I was reminded of the <a href="http://www.slideshare.net/reed2001/culture-1798664">Netflix culture slide show</a> which I came across lately in terms of how they give employees freedom but expect them to act in the organisation's best interest rather than expecting employees to follow a lot of rules.</li>
<li>One thing I really liked was the emphasis on <strong>listening to what someone says</strong> 'without having your own idea [in mind]&#8230;forgot what you have in your mind and just listen to what he says'. I think one problem we can run into when listening to other people is that we extract the bits of what they say which fit in with what we believe &#8211; something known as the <a href="http://en.wikipedia.org/wiki/Confirmation_bias">confirmation bias</a>.
<p>I actually found <a href="http://www.markhneedham.com/blog/2006/09/03/active-listening/">an old post of mine which lists some mistakes we commonly make when listening to others speak</a>. It makes quite interesting reading.</p>
<p>Another quote from the book sums up a more useful approach:</p>
<blockquote><p>See things as they are, observe things as they are, let everything go as it goes</p></blockquote>
</li>
<li>He goes on to suggest that we should have <strong>no negative or positive feelings towards what someone says to us and that we should give up our preconceived ideas and subjective opinions</strong> which I didn't think made much sense in the software development game since a lot of what we do is about assessing the merits of different approaches.
<p>The beginner's mind entry on the C2 wiki makes more sense by describing Ward Cunningham's approach:</p>
<blockquote><p>
You can generally tell when you're dealing with someone who really knows their stuff by the amount of reference they make to the way it has always been done. Folk like our own WardCunningham seem able to ditch all that stuff and approach each problem as if it were completely new and they had never done anything like it before.</p>
<p>Then, when they have a solution, they'll either recognize it as a Pattern in the standard lexicon, and leverage readymade tools, or not. But they never come in armed for bear when all the customer needs to catch is clams.
</p></blockquote>
<p>It seems like we only initially need to have an empty mind while we are taking in the new information and then we can make use of the knowledge that we already have later on.</li>
<li>The author suggests that '<strong>when you do something just to do it should be your purpose</strong>' which seems somewhat similar to the idea of focusing on the process in Agile instead of always on the outcome of what we're doing.
<p>While a result focus can be helpful I often notice that important things like the quality of what we're making get dropped by the wayside if we focus too much just on completion.</p>
<p>I do think there is some need to focus on whether what we're doing is actually improving us (although the book advises against this) and I recently came across Chad Fowler's idea of always asking '<a href="http://www.fourhourworkweek.com/blog/2009/07/28/the-big-question-are-you-better-than-yesterday/">Am I better than yesterday?</a>'.
</li>
<li>It is pointed out then when learning zaizen <strong>we cannot expect rapid progress but instead that we will progress little by little</strong> which I think is pretty much the same in software development.
<p>With nearly all skills a lot of practice is needed &#8211; as <a href="http://www.markhneedham.com/blog/2008/12/29/talent-is-overrated-book-review/">Talent is Overrated</a> points out &#8211;  we don't just become an overnight sensation but need to work our way through the <a href="http://www.markhneedham.com/blog/2009/08/10/dreyfus-model-more-thoughts/">Dreyfus Model</a> for each skill gradually improving our level.</li>
</ul>
<h3>In Summary</h3>
<p>Although this book is about Zen I still found some interesting ideas about learning and I guess its always interesting to read something a bit different.</p>
<p>I'd be interested in knowing if there was a book that covered beginner's mind purely from a learning point of view instead of Zen if anyone knows of any titles!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.markhneedham.com/blog/2009/08/12/zen-mind-beginners-mind-book-review/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Brownfield Application Development in .NET: Book Review</title>
		<link>http://www.markhneedham.com/blog/2009/07/06/brownfield-application-development-in-net-book-review/</link>
		<comments>http://www.markhneedham.com/blog/2009/07/06/brownfield-application-development-in-net-book-review/#comments</comments>
		<pubDate>Sun, 05 Jul 2009 14:43:40 +0000</pubDate>
		<dc:creator>Mark Needham</dc:creator>
				<category><![CDATA[Books]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[manning]]></category>

		<guid isPermaLink="false">http://www.markhneedham.com/blog/?p=1414</guid>
		<description><![CDATA[The Book Brownfield Application Development in .NET by Kyle Baley and Donald Belcham The Review I asked to be sent this book to review by Manning as I was quite intrigued to see how well it would complement Michael Feather's Working Effectively with Legacy Code, the other book I'm aware of which covers approaches to [...]]]></description>
			<content:encoded><![CDATA[<h3>The Book</h3>
<p><a href="http://manning.com/baley/">Brownfield Application Development in .NET</a> by Kyle Baley and Donald Belcham</p>
<h3>The Review</h3>
<p>I asked to be sent this book to review by Manning as I was quite intrigued to see how well it would complement Michael Feather's <a href="http://www.amazon.co.uk/Working-Effectively-Legacy-Robert-Martin/dp/0131177052/ref=sr_1_1?ie=UTF8&#038;s=books&#038;qid=1246755805&#038;sr=8-1">Working Effectively with Legacy Code</a>, the other book I'm aware of which covers approaches to dealing with non green field applications.</p>
<h4>What did I learn?</h4>
<ul>
<li>The authors provide a brief description of the two different approaches to unit testing &#8211; state based and behaviour based &#8211; I'm currently in favour of the latter approach and <a href="http://martinfowler.com/articles/mocksArentStubs.html">Martin Fowler has a well known article</a> which covers pretty much anything you'd want to know about this topic area. </li>
<li>I really like the section of the book which talks about 'Zero Defect Count', whereby the <strong>highest priority should be to fix any defects</strong> that are found in work done previously rather than racing ahead onto the next new piece of functionality:<br />
<blockquote><p>
Developers are geared towards driving to work on, and complete, new features and tasks. The result is that defect resolution subconsciously takes a back seat in a developer’s mind. </p></blockquote>
<p>I think this is quite difficult to achieve when the team is getting pressure to complete new features but then again it will take longer to fix defects if we leave them until later since we need to regain the context around them which is more fresh in our mind the earlier we fix them.
</li>
<li>Another cool idea is that of <strong>time boxing efforts at fixing technical debt</strong> in the code base &#8211; that way we spend a certain amount of time fixing one area and when the time's up we stop. I think this will work well as an approach as often when trying to fix code we can either get into the mindset of not fixing anything at all because it will take too long to do so or ending up <a href="http://sethgodin.typepad.com/seths_blog/2005/03/dont_shave_that.html">shaving the yak</a> in an attempt to fix a particularly problematic area of code.</li>
<li>I like the definition of abstraction that the authors give:<br />
<blockquote><p>
From the perspective of object- oriented programming, it is the method in which we simplify a complex “thing”, like an object, a set of objects, or a set of services.</p></blockquote>
<p>I often end up over complicating code in an attempt to create 'abstractions' but by this definition I'm not really abstracting since I'm not simplifying but complicating! This seems like a useful definition to keep in mind when looking to make changes to code.
</li>
<li>Maintainability of code is something which is seriously undervalued &#8211; I think it's very important to write your code in <a href="http://www.markhneedham.com/blog/2009/03/18/coding-make-it-obvious/">such a way that the next person who works with it can actually understand what's going on</a>. The authors have a fantastic quote from Perl Best Practices:<br />
<blockquote><p>
Always code as if the guy who ends up maintaining your code is a violent psychopath who knows where you live.</p></blockquote>
<p>Writing code that is easy for the next person to understand is much harder than I would expect it to be although on teams which pair programmed frequently I've found the code easier to understand. I recently read a blog post by Jaibeer Malik where he claims that it is <a href="http://jaibeermalik.wordpress.com/2009/04/12/code-quality-learn-measure-and-organize-awareness/">harder to read code than to write code</a> which I think is certainly true in some cases.
</li>
<li>There is a discussion of some of the design patterns and <a href="http://www.markhneedham.com/blog/2008/08/16/naming-the-patterns-we-use-in-code/">whether or not we should explicitly call out their use in our code</a>, the suggestion being that we should only do so if it makes our intent clearer. </li>
<li>While describing out how to refactor some code to loosen its dependencies it's pointed out that <strong>when the responsibilities of a class are a bit fuzzy the name of the class will probably be quite fuzzy too</strong> &#8211; it seems like this would server as quite a useful indicator for refactoring code to the <a href="http://www.objectmentor.com/resources/articles/srp.pdf">single responsibility principle</a>. The authors also suggest trying not to append the suffix 'Service' to classes since it tends to be a very overloaded term and a lot of the time doesn't add much value to our code.</li>
<li>It is constantly pointed out how important it is to do refactoring in small steps so that we don't break the rest of our code and to allow us to get rapid feedback on whether the refactoring is actually working or not. This is something that we've <a href="http://www.markhneedham.com/blog/2009/05/15/coding-dojo-14-rock-scissors-paper-tdd-as-if-you-meant-it/">practiced in coding dojos</a> and Kent mentions it as being <a href="http://www.infoq.com/presentations/responsive-design">one of his tools when dealing with code</a> &#8211; I've certainly found that the overall time is much less when doing small step refactorings than trying to do everything in one go.
<p>I'm quite interested in trying out an idea called '<a href="http://manicprogrammer.com/cs/blogs/heynemann/archive/2008/11/13/bowling-scorecards-great-agile-practice.aspx">Bowling Scorecards</a>' which my former colleague Bernardo Heynemann wrote about &#8211; the idea to have a card which has a certain number of squares, each square reprsenting a task that needs to be done. These are then crossed off as members of the team do them.</li>
<li>An interesting point which is made when talking about how to refactor data access code is to try and make sure that we are <strong>getting all the data from a single entry point</strong> &#8211; this is something which I noticed on a recent project where we were cluttering the controller with two calls to different repositories to retrieve some data when it probably could have been encapsulated into a single call.</li>
<li>Although they are talking specifically about <strong>poor encapsulation</strong> in data access layers, I think the following section about this applies to anywhere in our code base where we expose the inner workings of classes by failing to encapsulate properly:<br />
<blockquote><p>
Poor encapsulation will lead to the code changes requiring what is known as the Shotgun Effect. Instead of being able to make one change, the code will require you to make changes in a number of scattered places, similar to how the pellets of a shotgun hit a target. The cost of performing this type of change quickly becomes prohibitive and you will see developers pushing to not have to make changes where this will occur.
</p></blockquote>
</li>
<li>The creation of an <a href="http://ibuilthiscage.com/2008/09/21/anatomy-of-an-anti-corruption-layer-part-1/">anti corruption layer</a> to shield us from 3rd party dependency changes is suggested and I think this is absolutely vital otherwise whenever there is a change in the 3rd party code our code breaks all over the place. The authors also adeptly point out:<br />
<blockquote><p>
The reality is that when you rely on another company's web service, you are ultimately at their mercy. It's the nature of third-party dependencies. You don't have control over them.
</p></blockquote>
<p>Even if we do recognise that we are <a href="http://www.markhneedham.com/blog/2009/07/04/domain-driven-design-conformist/">completely reliant on a 3rd party service for our model</a> I think there is still a need for an anti corruption layer even if it is very thin to protect us from changes.</p>
<p>The authors also describe run time and compile time 3rd party dependencies &#8211; I think it's <strong>preferable if we can have compile time dependencies since this gives us much quicker feedback</strong> and this is an approach we used on a recent project I worked on by making use of generated classes to interact with a SOAP service rather than using WCF message attributes which only provided us feedback at runtime.
</ul>
<h3>In Summary</h3>
<p>This book starts off with the very basics of any software development project covering things such as version control, continuous integration servers, automated testing and so on but it gets into some quite interesting areas later on which I think are applicable to any project and not necessarily just 'brownfield' ones.</p>
<p>There is a lot of useful advice about making use of abstractions to protect the code against change both from internal and external dependencies and I particularly like the fact that the are code examples showing the progression of the code through each of the refactoring ideas suggested by the authors.</p>
<p>Definitely worth reading although if you've been working on any type of agile projects then you're probably better off skim reading the first half of the book but paying more attention to the second half.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.markhneedham.com/blog/2009/07/06/brownfield-application-development-in-net-book-review/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Real World Functional Programming: Book Review</title>
		<link>http://www.markhneedham.com/blog/2009/05/24/real-world-functional-programming-book-review/</link>
		<comments>http://www.markhneedham.com/blog/2009/05/24/real-world-functional-programming-book-review/#comments</comments>
		<pubDate>Sun, 24 May 2009 09:25:07 +0000</pubDate>
		<dc:creator>Mark Needham</dc:creator>
				<category><![CDATA[Books]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[F#]]></category>

		<guid isPermaLink="false">http://www.markhneedham.com/blog/?p=1243</guid>
		<description><![CDATA[The Book Real World Functional Programming by Tomas Petricek with Jon Skeet (corresponding website) The Review I decided to read this book after being somewhat inspired to learn more about functional programming after talking with Phil about his experiences learning Clojure. I'm currently working on a .NET project so it seemed to make sense that [...]]]></description>
			<content:encoded><![CDATA[<h3>The Book</h3>
<p><a href="http://manning.com/petricek/">Real World Functional Programming</a> by Tomas Petricek with Jon Skeet (<a href="http://www.functional-programming.net/">corresponding website</a>)</p>
<h3>The Review</h3>
<p>I decided to read this book after being somewhat inspired to learn more about functional programming after talking with <a href="http://fragmental.tw/">Phil</a> about his experiences learning <a href="http://clojure.org/">Clojure</a>. I'm currently working on a .NET project so it seemed to make sense that F# was the language I picked to learn.</p>
<h4>What did I learn?</h4>
<ul>
<li>I've worked with C# 3.0 since around July 2008 so I had a bit of experience using some of the functional features in C# before picking up this book. I therefore found it very interesting to read about the history of lambda and the different functional languages and how they came into being. Having this as an opening chapter was a nice way to introduce the functional approach to programming.</li>
<li><strong>Immutable state</strong> is one of the key ideas in functional programming &#8211; this reminded me of a <a href="http://channel9.msdn.com/posts/Charles/JAOO-2007-Joe-Armstrong-On-Erlang-OO-Concurrency-Shared-State-and-the-Future-Part-2/">Joe Armstrong video</a> I watched last year where he spoke of his <a href="http://www.markhneedham.com/blog/2009/03/22/coding-making-the-debugger-redundant/">reduced need to use a debugger</a> when coding Erlang due to the fact that there was only one place where state could have been set rather than several as is the case with a more imperative approach. We have been trying to code with immutable state in mind in our <a href="http://www.markhneedham.com/blog/category/coding-dojo/">coding dojos</a> and while it takes a bit more thinking up front, the code is much easier to read when written that way.</li>
<li><strong>Separating the operations from the data</strong> is important for allowing us to write code that can be parallelised, focusing on <strong>what to do to the data rather than how to do it</strong>. <a href="http://sadekdrobi.com/">Sadek Drobi</a> has a nice illustration of what he calls mosquito programming vs functional programming on page 14 of the <a href="http://qconlondon.com/london-2009/file?path=/qcon-london-2009/slides/SadekDrobi_FunctionalProgrammingWithAMainstreamLanguage.pdf">slides of his QCon presentation</a>. It describes this idea quite nicely.</li>
<li>A cool technique that Phil taught me when reading language related books is to have the PDF of the book on one side of the screen and the <a href="http://en.wikipedia.org/wiki/REPL">REPL</a> (in this case F# interactive) on the other side so that you can try out the examples in real time. The book encourages this approach and all the examples follow on from previous ones which I think works quite well for gradually introducing concepts. </li>
<li><strong>Functions are types</strong> in functional programming &#8211; I have had a bit of exposure to this idea with Funcs in C# but partial function application is certainly a new concept to me. I can certainly see the value in this although it took me a while to get used to the idea. I am intrigued as to where we should use a functional approach and where an OO approach when working in C#. I think both have a place in well written code. </li>
<li>F#'s <strong>implicit static typing</strong> is one of my favourite things about the language &#8211; you get safety at compile time but you don't waste a lot of code writing in type information that the compiler should be able to work out for you. It has the strongest type inference of any language that I've worked with and I thought it was quite nice that it was able to work stuff out for me instead of me having to type it all out.</li>
<li>I really like the idea of <a href="http://www.markhneedham.com/blog/2009/01/02/f-option-types/">option types</a> which I first learnt about from the book. Having the ability to explicitly define when a query hasn't worked is far superior to having to do null checks in our code or the <a href="http://www.markhneedham.com/blog/2008/08/16/null-handling-strategies/">various strategies we use to get around this</a>.</li>
<li>I thought it was cool that in the early chapters the focus with the F# code is to provide <strong>examples that you can just get running straight away</strong> instead of having to worry about the need to structure your code in a maintainable way. After I had a reasonable grasp of this then the chapter about using record types to structure code in an OO way come up. I still prefer the C# style of structuring code in objects &#8211; it just feels more natural to me at the moment and manages the complexity more easily. It is quite easy to switch between the two styles <a href="http://www.markhneedham.com/blog/2009/04/18/f-refactoring-that-little-twitter-application-into-objects/">using features like member augmentation</a> so I think it's probably possible to mix the two styles quite easily.</li>
<li>We can <strong>use modules to make F# functions which don't fit onto any class available from C# code</strong>. The code is not as clean as if we were writing just for it to be used by other F# code but it's not too bad:

<div class="wp_syntax"><div class="code"><pre class="ocaml" style="font-family:monospace;"><span style="color: #06c; font-weight: bold;">module</span> Tests <span style="color: #a52a2a;">=</span>                                               
    <span style="color: #06c; font-weight: bold;">let</span> WithIncome <span style="color: #6c6;">&#40;</span>f<span style="color: #a52a2a;">:</span>Func<span style="color: #a52a2a;">&lt;</span>_, _<span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#41;</span> client <span style="color: #a52a2a;">=</span>                  
        <span style="color: #6c6;">&#123;</span> client <span style="color: #06c; font-weight: bold;">with</span> Income <span style="color: #a52a2a;">=</span> f<span style="color: #a52a2a;">.</span><span style="color: #060;">Invoke</span><span style="color: #6c6;">&#40;</span>client<span style="color: #a52a2a;">.</span><span style="color: #060;">Income</span><span style="color: #6c6;">&#41;</span> <span style="color: #6c6;">&#125;</span></pre></div></div>

<p>We can then call this in our C# code like so:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">Tests.<span style="color: #0000FF;">WithIncome</span><span style="color: #000000;">&#40;</span>income <span style="color: #008000;">=&gt;</span> income <span style="color: #008000;">+</span> <span style="color: #FF0000;">5000</span>, client<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>Dave Cameron has <a href="http://intwoplacesatonce.com/?p=9">written more about this</a>.
 </li>
<li>Although I studied <strong>data structures</strong> at university I don't really pay a great deal of attention to them in terms of performance normally so it was interesting to see the massive performance hit that you take when appending a value to the end of an F# list compared to adding it to the beginning. F# uses linked lists so if we want to add something to the end then there is a lot of recursion involved to do that which is quite costly. In terms of <a href="http://en.wikipedia.org/wiki/Big_O_notation">big O notation</a> we go from O(N) where N is the number of elements to append to O(N*M) in terms of performance.</li>
<li>Chapter 13 is about parallel processing of data for which I found I needed to download the <a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=348F73FD-593D-4B3C-B055-694C50D2B0F3&#038;displaylang=en">Microsoft Parallel Extensions to .NET Framework 3.5, June 2008 Community Technology Preview</a> and then add a reference to 'C:\Program Files\Microsoft Parallel Extensions Jun08 CTP\System.Threading.dll' in order to make use of those features. </li>
<li>The author provides a nice introduction to <a href="http://en.wikipedia.org/wiki/Continuation">continuations</a> and how you can make use of them in F# by using <a href="http://blogs.msdn.com/wesdyer/archive/2007/12/22/continuation-passing-style.aspx">continuation passing style</a>. I'm intrigued as to how we can make use of these in our code &#8211; we do a bit already by making use of callbacks which get fired at a later point in our code &#8211; but <a href="http://www.double.co.nz/pdf/inverting-back-the-inversion.pdf">from what I've read</a> it sounds like we should be able to do even more especially when writing web applications. </li>
<li><a href="http://www.infoq.com/articles/pickering-fsharp-async">Asynchronous workflows</a> are also made very accessible in this book &#8211; I had previously struggled a bit with them but the author covers the various API methods available to you and then explains what is going on behind the syntactic sugar that F# provides. I have made some use of these in the <a href="http://www.markhneedham.com/blog/2009/04/13/f-a-day-of-writing-a-little-twitter-application/">little</a> <a href="http://www.markhneedham.com/blog/2009/04/18/f-refactoring-that-little-twitter-application-into-objects/">twitter appication</a> that I've been working on now and again.</li>
</ul>
<h3>In Summary</h3>
<p>I really enjoyed reading this book &#8211; it's my first real foray into the world of functional programming since university and I think I understand the functional approach to programming much better than I did back then from reading this book.</p>
<p>It takes an approach of introducing various functional programming concepts before showing examples of where that concept might come in useful when coding. It's also particularly useful that examples are shown in C# and F# as this made it much easier for me to understand what the F# code was doing by comparing it with the code in a more familiar language.</p>
<p>I'd certainly recommend this to any .NET developers curious about learning how to apply ideas derived from functional programming to their C# code and indeed to any developers looking to start out learning about functional programming.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.markhneedham.com/blog/2009/05/24/real-world-functional-programming-book-review/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>97 Things Every Software Architect Should Know: Book Review</title>
		<link>http://www.markhneedham.com/blog/2009/05/18/97-things-every-software-architect-should-know-book-review/</link>
		<comments>http://www.markhneedham.com/blog/2009/05/18/97-things-every-software-architect-should-know-book-review/#comments</comments>
		<pubDate>Sun, 17 May 2009 15:03:25 +0000</pubDate>
		<dc:creator>Mark Needham</dc:creator>
				<category><![CDATA[Books]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.markhneedham.com/blog/?p=1223</guid>
		<description><![CDATA[The Book 97 Things Every Software Architect Should Know by Richard Monson-Haefel The Review My colleague Erik Doernenburg mentioned that he had written a couple of chapters in this book a while ago and there was a copy of the book in the ThoughtWorks office so I thought I'd take a look. I'm far from [...]]]></description>
			<content:encoded><![CDATA[<h3>The Book</h3>
<p><a href="http://www.amazon.co.uk/Things-Every-Software-Architect-Should/dp/059652269X/ref=sr_1_1?ie=UTF8&#038;s=books&#038;qid=1242525416&#038;sr=8-1">97 Things Every Software Architect Should Know</a> by Richard Monson-Haefel</p>
<h3>The Review</h3>
<p>My colleague <a href="http://erik.doernenburg.com/">Erik Doernenburg</a> mentioned that he had written a couple of chapters in this book a while ago and there was a copy of the book in the ThoughtWorks office so I thought I'd take a look.</p>
<p>I'm far from being an architect but since their decisions affect what I do I was intrigued to see what they should be doing.</p>
<p>The contributions in the book are <a href="http://97-things.near-time.net/wiki/97-things-every-software-architect-should-know-the-book">also available on the 97 things wiki</a>.</p>
<h4>What did I learn?</h4>
<p>This book contains a series of short essays by software architects, 97 in total, so clearly there is a lot to be learnt from this book. I'll just cover some of the ones I found most interesting.</p>
<ul>
<li>The first chapter in the book talks of the need to not put your resume ahead of the requirements and instead <strong>choose the right technology for the customer</strong> rather than the one that you want to use. Later on Greg Nyberg talks about how <a href="http://97-things.near-time.net/wiki/avoid-good-ideas">good ideas kill projects</a> due to them getting out of hand and taking up much more time than expected to implement and affecting far more of the code than you would think. The suggestion therefore seems to be that we shouldn't upgrade frameworks and should be cautious about introducing technologies into our project.
<p>At face value this seems to make sense but it somewhat limits our ability to improve in my opinion. If we always choose the technology based on what we currently know then how will we know when something better comes along.</p>
<p>I much prefer the idea of trying out several solution early on (an idea that Erik Doernenburg mentions in '<a href="http://97-things.near-time.net/wiki/Try%20before%20choosing">Try before choosing</a>' using lean's idea of <a href="http://xp123.com/xplor/xp0611/index.shtml">concurrent set based engineering</a>. Experimentation is very important early on in a project although of course we must eventually be looking to choose the best solution and go with that at the <a href="http://www.codinghorror.com/blog/archives/000705.html">last responsible moment</a>.</li>
<li>Another one that really stood out for me is '<a href="http://97-things.near-time.net/wiki/Simplicity%20before%20generality,%20use%20before%20reuse">Simplicity Before Generality, Use Before Reuse</a>' written by Kevin Hennery. He speaks of how we <strong>often use general purpose infrastructure code/class libraries which don't actually help us solve our specific problem</strong>.
<p>It's better to derive the generality of a solution later on having originally designed for what we need them for in the first place. Joe Walnes' <a href="http://xstream.codehaus.org/">XStream</a> framework is often pointed out as being a library which was developed in this way &#8211; he only put in the features that he needed rather than trying to think how people might want to use it and by doing so actually did cover the way that most people would use it.</li>
<li>I think my favourite essay in the book is '<a href="http://97-things.near-time.net/wiki/dont-be-clever">Don't Be Clever</a>' by Eben Hewitt where he talks of the importance of being '<strong>as dumb as you possibly can and still create the appropriate design</strong>'. He goes on to add:<br />
<blockquote><p>
More developers can implement and maintain dumb solutions. In dumb solutions, each component can only do one thing. They will take less time to create, and less time to change later.
</p></blockquote>
<p>It's so easy to make clever design decisions but when there are other people on a team that need to work with these designs it is in fact pointless to be clever and creating something simple that everyone will be able to work with is a much better approach.</p>
<p><a href="http://97-things.near-time.net/wiki/your-system-is-legacy-design-for-it">Dave Anderson also talks about the importance of designing our code so that it's easy for someone from a different team to work</a> with especially if they have to make production fixes. The need for the code to be <a href="http://www.markhneedham.com/blog/2009/03/18/coding-make-it-obvious/">obvious</a>, testable, correct and traceable are pointed out as being key.
</li>
<li>Another one which I really liked is '<a href="http://97-things.near-time.net/wiki/the-business-vs-the-angry-architect">The Business vs The Angry Architect</a>' which talks about <strong>the need to listen to what the business are saying instead of always waiting to have our say and display our superior knowledge</strong>. My favourite quote from this chapter is:<br />
<blockquote><p>
Remember; when you’re talking you can only hear something you already know. Don’t ever start thinking you’re so smart that no one else has something valuable to say.<br />
&#8230;<br />
Don’t allow yourself to become a disgruntled genius that spends all of your time trying to impress others by making witty, condescending statements about how poorly the company is run. They won’t be impressed.
</p></blockquote>
<p>This is certainly something that anyone in a software team can apply not only architects. Certainly I have learnt that it's important to accept some decisions instead of constantly pointing out how wrong they are, something which Dan North also points out in his '<a href="http://www.markhneedham.com/blog/2009/04/25/pimp-my-architecture-dan-north/">Pimp My Architecture</a>' talk.</li>
<li>I really like Timothy High's idea of '<a href="http://97-things.near-time.net/wiki/record-your-rationale">Recording Your Rationale</a>' where he suggests keeping track of all the <a href="http://www.markhneedham.com/blog/2009/03/02/trade-offs-some-thoughts/">trade offs</a> being made so that we know in the future why certain decisions were made. This ties in quite nicely with Dan North's idea of the project shaman who tells the stories of the project and why different decisions were made. <a href="http://97-things.near-time.net/wiki/communication-is-king">Mark Richards also talks about the need to communicate clearly</a> with the developers on the team and keep them informed about the big picture and the like and Timothy High goes on to talk about the importance of recording any assumptions that we make.
<p>On every project I've worked on we have recorded assumptions related to the order of stories and the approach we are likely to take during estimation sessions and it certainly makes it easier to explain decisions in the future.</p>
<p>Dave Quick suggests that we could also <a href="http://97-things.near-time.net/wiki/warning-problems-in-mirror-may-be-larger-than-they-appear">record potential risks</a> on projects until they are no longer a risk. They can be prioritised and reviewed when there is new information. I quite like this idea as it puts the information out in the open rather than sweeping it under the carpet.
</li>
<li>Paul W. Homer talks of the benefit of <a href="http://97-things.near-time.net/wiki/share-your-knowledge-and-experiences">sharing our knowledge and experiences</a>, an idea that I absolutely agree with and I think can be valuable within teams as well as within the industry. He points out that <strong>explaining our ideas to others helps us find the weaknesses in what we are saying</strong> &#8211; I agree, I find I learn most when <a href="http://www.markhneedham.com/blog/2009/04/21/learning-through-teaching/">trying to teach things to other people</a>.</li>
<li>Einar Landre's essay about how the <a href="http://www.markhneedham.com/blog/2009/04/21/learning-through-teaching/">architect's focus is around the boundaries and interfaces</a> is another interesting one &#8211; I think this is the place where the messiest code ends up being so it makes sense that you would have the strongest person technically in the team involved. Creating these boundaries is certainly essential from my experience.
<p>The author talks about making use of <a href="http://domaindrivendesign.org">Domain Driven Design</a> concepts such as <a href="http://www.markhneedham.com/blog/2009/03/07/ddd-bounded-contexts/">bounded contexts</a> and <a href="http://dddstepbystep.com/wikis/ddd/context-map.aspx">context mapping</a> to handle the complexity around these areas.</p>
<p>Keith Braithwaite also talks about the value of <a href="http://97-things.near-time.net/wiki/There%20Can%20be%20More%20than%20One">having multiple overlapping representations instead of trying to have one representation for the whole system</a> which seems along the same lines as the DDD approach.</li>
<li><a href="http://97-things.near-time.net/wiki/shortcuts-now-are-paid-back-with-interest-later">Scott Mcphee</a> and <a href="http://97-things.near-time.net/wiki/pay-down-your-technical-debt">Burkhardt Hufnagel</a> both talk about the importance of <strong>paying back technical debt before it causes us problems</strong>. Scott covers it more from the angle of correcting incorrect decisions as soon as we can while Burk comes at this more from the angle of making changes the correct way later on if we can't do the first time we make them. I think this is something that we often forget to do and it's not immediately painful so we think we've got away with it until a few months later we notice how truly difficult it is to make any changes at all and then it's really hard to recover the code to a good state. </li>
<li><a href="http://97-things.near-time.net/wiki/Reuse%20is%20about%20people%20and%20education,%20not%20just%20architecture">Jeremey Mayer</a> makes a very astute observation about reuse of code &#8211; <strong>developers need to know that code is there to reuse</strong> otherwise they will just write the functionality that they need themselves. He also notes that developers tend to prefer to solve problems themselves rather than ask for help.
<p><a href="http://www.markhneedham.com/blog/2009/03/15/qcon-london-2009-the-power-of-value-power-use-of-value-objects-in-domain-driven-design-dan-bergh-johnsson/">Dan Bergh Johnsson also noted at QCon</a> that developers will only wait 30 seconds to try and find a piece of code that they need before writing it themselves.</li>
</ul>
<h3>In Summary</h3>
<p>I enjoyed reading this book and there is plenty more in this book than just what I've mentioned &#8211; I was mainly interested in the architecture advice which affects me as a developer but there's also advice which doesn't apply so much to me at the moment which is probably more interesting to architects.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.markhneedham.com/blog/2009/05/18/97-things-every-software-architect-should-know-book-review/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
