<?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>The Inquisitive Coder - Davy Brion&#039;s Blog &#187; Opinions</title>
	<atom:link href="http://davybrion.com/blog/category/opinions/feed/" rel="self" type="application/rss+xml" />
	<link>http://davybrion.com/blog</link>
	<description>Trying to walk that thin line between intelligence and ignorance</description>
	<lastBuildDate>Thu, 29 Jul 2010 20:51:03 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Estimates Are A Double-Edged Sword</title>
		<link>http://davybrion.com/blog/2010/07/estimates-are-a-double-edged-sword/</link>
		<comments>http://davybrion.com/blog/2010/07/estimates-are-a-double-edged-sword/#comments</comments>
		<pubDate>Wed, 28 Jul 2010 19:45:52 +0000</pubDate>
		<dc:creator>Davy Brion</dc:creator>
				<category><![CDATA[Opinions]]></category>

		<guid isPermaLink="false">http://davybrion.com/blog/?p=2404</guid>
		<description><![CDATA[Most people in the software development industry will (hopefully) agree that estimates are important. You need estimates to predict the cost of development and how long it&#8217;s going to take. Without them, there is no way you could promise a delivery date to a customer or come up with a total cost estimate. Both of [...]]]></description>
			<content:encoded><![CDATA[<p>Most people in the software development industry will (hopefully) agree that estimates are important. You need estimates to predict the cost of development and how long it&#8217;s going to take.  Without them, there is no way you could promise a delivery date to a customer or come up with a total cost estimate.  Both of which are tremendously important when your core business is based on delivering software to clients.  It is therefore very important to make sure your estimates are as good as they can be, and that you review your estimates with the final actual figures so you can figure out where you need to start improving (either your development process, or your estimation practices).</p>
<p>But there are some things you need to watch out for in any organization which takes estimates seriously.  Most development shops have estimates at the task-level.  These task-level estimates are often used during the planning of the next iteration, but were most likely also used in the initial total estimate of the project.  I certainly don&#8217;t doubt the importance of those task-level estimates, but i do think they should be used cautiously.  </p>
<p>If too much importance is placed on staying below the estimates, or at least not going over them, you run the risk of growing a culture where developers let the estimates have too much influence on the quality of the work they&#8217;re doing.  Some developers will strive hard to routinely stay below the estimates.  Some developers will work in fear of going over the estimate.  In both cases, it leads to technical shortcuts that will be taken.  Those shortcuts will consist of skipping some tests here and there, skipping a bunch of tests altogether, decreasing willingness to refactor code that could use it and worst of all, no longer keeping a clean design in mind.  Granted, i&#8217;m painting a very bleak picture here but it <em>does</em> happen with some people and the negative results can not be underestimated.</p>
<p>Let&#8217;s consider the overall effect of these shortcuts.  A shortcut here or there is not abnormal in some circumstances, but it should be exceptional.  It should not become routine, it should be frowned upon and i&#8217;d even go as far as recommending a &#8220;no shortcuts allowed unless the team approves of it&#8221; policy.  A shortcut here or there doesn&#8217;t take a lot of effort to fix and because of this, it can often be done as soon as the original reason of the existence of the shortcut (typically: a deadline) is no longer an issue.  An accumulation of shortcuts however leads to not only an obviously bigger workload to fix all of the shortcuts, but it also impacts <em>a lot of other code</em> that shouldn&#8217;t have been impacted in the first place.  Once this happens, you&#8217;ve got yourself an <a href="http://davybrion.com/blog/2008/09/code-health/">unhealthy code base</a> and it&#8217;s only going to get worse until it eventually dies at a younger age than it could have reached.</p>
<p>Now, imagine a culture where estimates are given as much importance as quality.  If you&#8217;re approaching the estimate and you&#8217;ve still got a lot of work left to fully complete the task (and with fully completed, i really don&#8217;t mean watching it work on your machine as you manually test it), then you consult with the rest of your team members.  Estimate how much time it would take to fully complete the task, and see if the increased time over the original estimate is doable.  If you&#8217;re already behind your overall schedule, it&#8217;s probably not doable unless there are many subsequent tasks that are dependent on this particular task.  But if you&#8217;re ahead of schedule, you&#8217;re probably better off accepting the fact that you&#8217;re going to go over this task&#8217;s original estimate in order to <em>do it right</em>.  If you do so, the extra hours you spent on this task should (in most cases at least) not lead to extra hours on <em>future</em> tasks.  Conversely, if you&#8217;ve finished a task well below the estimate, it might actually be a good <em>investment</em> to refactor some &#8216;bad&#8217; code that you&#8217;ve come across while working on your task.  Or to add some missing tests here or there.  That certainly doesn&#8217;t mean that you need to spend all the available remaining time you have but you shouldn&#8217;t run to start on a new task as soon as humanly possible either.  Follow the <a href="http://programmer.97things.oreilly.com/wiki/index.php/The_Boy_Scout_Rule">boy scout rule</a> here&#8230; you won&#8217;t spend that much extra time on it, but overall quality can improve greatly from this.</p>
<p>In fact, i&#8217;d even bet that the time it takes to <em>do it right</em> will in a large majority of cases still be less than the sum of the original time that was spent on a task hastily done and the time that will be spent on bugs that resulted from that hastily done task, not to mention the impact it could have on the development of future tasks simply because of the suboptimal implementation of the hastily done task.</p>
<p>Finally, it&#8217;s also important to think about why there was a need to go over an estimate.  There can be a variety of reasons for this, and one of them is that the task was simply badly estimated.  If that indeed turns out to be the case, make sure that you <em>learn</em> from it to prevent this from happening in the future.  When we find bugs in our code, we try to prevent those bugs from ever occurring again.  We should have a similar attitude to our estimating practices as well.  If an estimate was simply too low, make sure that a similar task in the future won&#8217;t be estimated too low again or you will again introduce a possible problem in your (future) project.</p>
<p>And that, in my opinion, is also a good reason to decide to go over the estimate if you can.  If you go over the estimate and all people involved learn from the bad estimate, then everyone basically benefits from it.  Future estimates should become more accurate, and no code was harmed in the process.  You might have lost some money on it, but at least you only lost it <em>once</em> instead of losing it over and over again in similar future circumstances. </p>
]]></content:encoded>
			<wfw:commentRss>http://davybrion.com/blog/2010/07/estimates-are-a-double-edged-sword/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Working Overtime: What It Really Means</title>
		<link>http://davybrion.com/blog/2010/06/working-overtime-what-it-really-means/</link>
		<comments>http://davybrion.com/blog/2010/06/working-overtime-what-it-really-means/#comments</comments>
		<pubDate>Thu, 24 Jun 2010 20:42:28 +0000</pubDate>
		<dc:creator>Davy Brion</dc:creator>
				<category><![CDATA[Opinions]]></category>

		<guid isPermaLink="false">http://davybrion.com/blog/?p=2357</guid>
		<description><![CDATA[One of the things that pretty much every developer has had to face at least once in his career is the issue of working overtime (typically, to meet a deadline). If you&#8217;re lucky (or smart), this is a rare occasion. For some however, this is either a habit, or happens frequently. There are actually quite [...]]]></description>
			<content:encoded><![CDATA[<p>One of the things that pretty much every developer has had to face at least once in his career is the issue of working overtime (typically, to meet a deadline).  If you&#8217;re lucky (or smart), this is a rare occasion.  For some however, this is either a habit, or happens frequently.  There are actually quite a few developers who are proud of being able to do 60-80 hours a week.  And they could not be more wrong.</p>
<p>There&#8217;s nothing wrong with putting in a few extra hours occasionally.  Sometimes, it just needs to be done.  But, as soon as it is required more than occasionally (and with occasionally, i mean every couple of months), something is wrong.  First of all, you&#8217;re not gonna produce anything good if you&#8217;re doing a lot of overtime.  At first, it starts with a couple of late nights.  The first couple of nights, the work you do is still &#8216;good enough&#8217;.  It&#8217;s not gonna be great, but hey, it&#8217;ll do.  After a couple of nights though, if you&#8217;re still doing a lot of extra hours, there&#8217;s gonna be a noticeable negative effect on the work you&#8217;re doing.  And you know what the worst part is?  You, of all people, won&#8217;t notice it.  You&#8217;re working hard, you&#8217;re trying to catch up with the schedule, and you&#8217;re doing the best you can.  Or at least, you think you are.</p>
<p>In reality, you are hurting yourself, the project and your teammates more than you could imagine at that time.  Here&#8217;s the deal: there&#8217;s a reason why most people are working 8 hours a day on average.  If you routinely work more than 8 hours a day, your work is going to suffer from it (it depends on the job obviously, but for software developers, i&#8217;d argue that this is definitely the case).  If you do a bit of overtime occasionally, then you, nor the project will suffer from it.  It&#8217;ll just take a little bit more out of you than what you&#8217;re used to.  But once it becomes a routine, you, as a human being, will start performing worse and worse as time goes on.  Inevitably, that deterioration will become very noticeable in your work.  And here&#8217;s the sad thing: you&#8217;re putting in the extra effort to catch up with the schedule.  But by doing so, you&#8217;re actually performing worse and you&#8217;re hurting the schedule.  Here&#8217;s what happens: you spend a few late nights at the office.  At first, things go ok.  You&#8217;re getting things done and it appears to be working.  You keep spending late nights at the office.  After a few days (really, it happens that fast), the quality of your work starts deteriorating.  And you won&#8217;t notice it until you get back <em>the next day</em>.  So then what happens?  You start cleaning up the mess you made the night before.  Which only means you&#8217;re getting even more behind schedule.  So then you&#8217;ll need even more time to catch up with the schedule.  But you&#8217;re already spending this much extra time at work, and the problem only seems to get worse!  Well, yeah&#8230; that&#8217;s the whole point that i&#8217;m trying to make here.  You know what&#8217;s the best thing you could possibly do in those situations?  Go home at 3 or 4 in the afternoon, go have some fun, relax, and get a good night&#8217;s sleep.  You won&#8217;t believe how much more productive you&#8217;ll be the next day. </p>
<p>But where is this need to do overtime coming from?  I&#8217;d argue that, in the large majority of cases, this is due to management mistakes.  Either the wrong things were promised to the customer, or your management doesn&#8217;t have a clue of what is really going on.  So, if you find yourself in a position where you routinely need to do overtime, you really need to start asking yourself whether or not you&#8217;re working for the right company.  If you routinely need to do overtime to reach a deadline, that tells you that the project management (and highly likely, every kind of management beyond that) is pretty messed up.  I don&#8217;t know about you, but i really don&#8217;t want to work for people who don&#8217;t know what they&#8217;re doing.  If you&#8217;re doing a lot of overtime, your management is either clueless or stupid.  Probably a combination of both. </p>
<p>As for the developers who are proud of their 60-80 hour work weeks&#8230; what does that tell you about them?  There truly are very few people who can keep on producing great results beyond the regular 40 hours a week.  Something tells me that very few of those developers who brag about their extra hours really fit into that category.  If they really did fit into that category, they&#8217;d let their results speak for themselves instead of needing to brag about the amount of effort they&#8217;re putting in.</p>
]]></content:encoded>
			<wfw:commentRss>http://davybrion.com/blog/2010/06/working-overtime-what-it-really-means/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Why Do We Recycle Our Application Pools?</title>
		<link>http://davybrion.com/blog/2010/06/why-do-we-recycle-our-application-pools/</link>
		<comments>http://davybrion.com/blog/2010/06/why-do-we-recycle-our-application-pools/#comments</comments>
		<pubDate>Sat, 12 Jun 2010 13:14:16 +0000</pubDate>
		<dc:creator>Davy Brion</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Opinions]]></category>

		<guid isPermaLink="false">http://davybrion.com/blog/2010/06/why-do-we-recycle-our-application-pools/</guid>
		<description><![CDATA[I’ve never understood why IIS by default configures newly created application pools to recycle every 1740 minutes.&#160; That means that by default, our ASP.NET applications are restarted every 29 hours.&#160; And for what?&#160; Are we, the .NET community, so bad that we really can’t write code that can keep running without problems for more than [...]]]></description>
			<content:encoded><![CDATA[<p>I’ve never understood why IIS by default configures newly created application pools to recycle every 1740 minutes.&#160; That means that by default, our ASP.NET applications are restarted every 29 hours.&#160; And for what?&#160; Are we, the .NET community, so bad that we really can’t write code that can keep running without problems for more than 29 hours?&#160; Well, considering the overall lack of knowledge regarding memory management in .NET, i actually wouldn’t be surprised if that turned out to be the case for a very large portion of .NET development teams.</p>
<p>And indeed, if you browse the web to find the reason why application pools are configured to recycle automatically periodically, you’ll be hard pressed to find a reasonable answer that doesn’t pertain to memory issues.&#160; It’s like the community in general has pretty much accepted the fact that our web applications (or service layers hosted in IIS) will need to be recycled to avoid memory problems.&#160; To make things worse, i’ve frequently seen people discuss workarounds on how to keep things working properly after an application pool recycle in mailinglists for various projects.&#160; And again i ask myself: why?</p>
<p>I’ve always been of the opinion that if your code requires periodic restarts to keep working correctly, then something is <em>clearly wrong</em>.&#160; There is a bug in your code somewhere and you need to fix <em>that</em>, instead of restarting the process occasionally to make the problem ‘go away’.&#160; Guess what, it’s not going away, and if the load on your application increases, the problem will only pop up more frequently.&#160; So what are you going to do about that? Make the application pool recycle even more frequently?&#160; Put in another server to share the load?&#160; Perhaps we should focus more on fixing the actual code.&#160; You’re leaking resources somewhere, and <em>that</em> is what you need to fix.</p>
<p>In my company, it’s just standard procedure to disable application pool recycling on all application pools.&#160; Our applications simply <em>have</em> to keep working without application pool recycles.&#160; It’s that simple.&#160; If we run into a memory leak that causes problems, we focus on the actual problem and we fix it.&#160; We’ve ran into plenty of memory leaks (though it hasn’t really happened a lot in the past year, guess why?) and we’ve fixed each and every single one of them that we’ve ran into.&#160; Side note: i’m talking about .NET code that is running on the server.&#160; While i’m pretty sure that we do better at memory management in our Silverlight clients than most other Silverlight-using-shops do, you just never know for sure with Silverlight, partly because there are so many memory leaks in Silveright <em>itself</em>.&#160; But for .NET code running on a server, a memory leak is simply inexcusable in my opinion.&#160; I mean, it can happen to the best of us (i’m pretty much responsible for most of ours to be honest), but it’s not about who introduced the memory leak.&#160; It’s all about how you <em>deal with it</em>.&#160; And recycling the application pool periodically is <em>not</em> dealing with it, it’s living in denial. </p>
<p>The only viable reason to recycle application pools that i can think of is in the situation of a shared hosting provider.&#160; If you’re offering shared hosting, it only makes sense to recycle application pools occasionally since it’s quite realistic to assume that most of those application pools will not be in use constantly.&#160; If a pool is recycled, it will not consume any resources until the next request for an application in that pool is received.&#160; In the context of shared hosting, that actually makes sense.&#160; In the context of real applications, that makes little sense unless you’re hosting a lot of them and plenty of them are hardly being used.&#160; Still, is that really a good enough reason to enabling application pool recycling by default?&#160; I obviously don’t think so.</p>
<p>In my opinion, we, as a community, really need to start focusing more on <a href="http://davybrion.com/blog/2008/08/net-memory-management/" target="_blank">memory management in .NET</a> and on making sure that our applications can <em>keep running without problems.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://davybrion.com/blog/2010/06/why-do-we-recycle-our-application-pools/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>If You Can&#8217;t Say Something Bad About It, You Don&#8217;t Know It Well Enough</title>
		<link>http://davybrion.com/blog/2010/06/if-you-cant-say-something-bad-about-it-you-dont-know-it-well-enough/</link>
		<comments>http://davybrion.com/blog/2010/06/if-you-cant-say-something-bad-about-it-you-dont-know-it-well-enough/#comments</comments>
		<pubDate>Mon, 07 Jun 2010 20:00:57 +0000</pubDate>
		<dc:creator>Davy Brion</dc:creator>
				<category><![CDATA[Opinions]]></category>

		<guid isPermaLink="false">http://davybrion.com/blog/?p=2329</guid>
		<description><![CDATA[One thing that frequently bothers me when reading technical blogs or when talking to people about software development in general is that people often get extremely enthusiastic about some new kind of technology, library, framework or tool that they recently started using or heard other people talking about.&#160; In essence, there is nothing wrong with [...]]]></description>
			<content:encoded><![CDATA[<p>One thing that frequently bothers me when reading technical blogs or when talking to people about software development in general is that people often get extremely enthusiastic about some new kind of technology, library, framework or tool that they recently started using or heard other people talking about.&#160; In essence, there is nothing wrong with that.&#160; We are after all geeks, and the people who like to write or read technical blogs or talk about software development with others are typically passionate geeks and it’s only normal that we’re enthusiastic about tools, frameworks, libraries or pieces of technology in general.&#160; The thing is… we really ought to be a bit more careful in the way some things are often hyped in an uninformed manner.</p>
<p>I have a very simple rule when it comes to avoiding hype: if you can’t say something bad about it, you don’t know it well enough (yet).&#160; And until you are able to say something bad about a library, framework, approach, technology, tool or whatever, i simply can’t believe all of the good things you’re saying about it without some form of skepticism.&#160; In life, nothing is perfect.&#160; In software development even less so.&#160; Every single piece of technology or approach has its drawbacks, issues and problems.&#160; And quite often, those things only become noticeable after having truly used it on a real project for a while.&#160; I think most of us will be able to agree on that.&#160; So really, what does that tell you about someone when that person is extremely positive about something, without being able to mention <em>any</em> downside?&#160; That either tells me that you don’t know what you’re talking about or that you’re not even using whatever it is that you’re hyping on something <em>real</em> (hobby projects don’t really count).&#160; So does it really make sense for one to listen to it?&#160; Conversely, if you are very positive about something <em>but</em> are also able to mention the negative points that you’ve encountered (they don’t have to be huge, and can in fact even be minor) then i’m immediately much more inclined to believe what you’re saying.&#160; </p>
<p>Granted, my approach frequently prevents me from being an early adopter.&#160; But if/when i do become an adopter, i <em>will</em> be a pretty informed one.&#160; In many cases i’ll know about the negatives before they bite me, and will either guard myself against them, work around them if i have no other alternative or simply choose to ignore the technology altogether if the positives don’t outweigh the negatives.&#160; The only downside that i’ve experienced so far from this approach is that i’ll never be one of the cool kids on the internet and among the hype-hungry developers.&#160; Then again, that’s probably more of an upside than a downside, come to think of it <img src='http://davybrion.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Looking back over the past 5 years or so, i can say that i was late in adopting unit testing, agile development, Inversion Of Control, Dependency Injection, ORM, and probably a bunch of other things that i can’t really think of right now.&#160; But i’m pretty sure that i know all of those things <em>pretty</em> well by now.&#160; A large reason for that (i think) is because i took my time and made sure that i made informed decisions before adopting something.&#160; I experimented, thought about drawbacks, tried it in real projects, learned from mistakes that i made, worked around problems that were inherent with the piece of technology or approach in question and only <em>then</em> did i consider myself able to make informed statements about it.&#160; That doesn’t mean you can’t talk about something that you don’t know fully yet.&#160; A lot of very valuable blog posts are written by a lot of people who are learning things or are just experimenting with things.&#160; The smart ones among them though, will be very honest about how much they know about it, how much they <em>don’t</em> know about it, and how far they are in the learning progress. </p>
<p>So, as Public Enemy said: don’t believe the hype!</p>
<p>Get informed instead.</p>
]]></content:encoded>
			<wfw:commentRss>http://davybrion.com/blog/2010/06/if-you-cant-say-something-bad-about-it-you-dont-know-it-well-enough/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Isolation At Work: Good Or Bad?</title>
		<link>http://davybrion.com/blog/2010/06/isolation-at-work-good-or-bad/</link>
		<comments>http://davybrion.com/blog/2010/06/isolation-at-work-good-or-bad/#comments</comments>
		<pubDate>Sat, 05 Jun 2010 14:09:02 +0000</pubDate>
		<dc:creator>Davy Brion</dc:creator>
				<category><![CDATA[Opinions]]></category>

		<guid isPermaLink="false">http://davybrion.com/blog/2010/06/isolation-at-work-good-or-bad/</guid>
		<description><![CDATA[A lot of people are of the opinion that isolating yourself at work, as a developer, is a bad thing to do.&#160; Communication with your teammates is highly important, and thus, isolating yourself from your surroundings by sitting in a different or separate office or listening to your iPod is often spoken of as an [...]]]></description>
			<content:encoded><![CDATA[<p>A lot of people are of the opinion that isolating yourself at work, as a developer, is a bad thing to do.&#160; Communication with your teammates is highly important, and thus, isolating yourself from your surroundings by sitting in a different or separate office or listening to your iPod is often spoken of as an inherently bad thing to do. But is it really?&#160; The way i see it, this can be a good thing, and this can be a bad thing.&#160; It pretty much depends on the type of person you are, what kind of people you work with, or what kind of environment you’re working in.</p>
<p>I can only speak from my own experience, but i frequently isolate myself from my coworkers and my surroundings by turning on my iPod and listening to some music while i work.&#160; I don’t do it all the time, and it definitely depends on what i’m working on, or who i’m working with.&#160; Obviously, if you’re doing pair programming then listening to your iPod is pretty much out of the question.&#160; But if you’re all sitting together, do we really need to avoid any kind of isolation?&#160; When i’m working on something complex, and i don’t really need to communicate with my teammates at that time, then there really isn’t anything wrong with listening to some music and getting some work done.&#160; In fact, it often helps me focus on my work without getting easily distracted, helps me get into a good zone, and it would certainly surprise me if i were the only one who thought that way.&#160; If you or some of your teammembers actually produce better results while they tune into their music, then this can’t really be an inherently bad thing, no?</p>
<p>But obviously, there will be many situations where you actually want to avoid listening to music.&#160; Sometimes you might be working on something that requires you to consult with teammates frequently, whether it is about design decisions or to ask some feedback on implications of certain implementation details.&#160; In those cases, you can end up pausing and resuming your iPod way too frequently so it might just be better to refrain from turning it on altogether.&#160; Or when you notice that teammates are discussing something and it’s taking them a bit too long.&#160; It’s hard to tell when a discussion is too long if you’re not hearing what they’re saying but when i notice 2 developers talking for more then a couple of minutes, i’ll often pause the iPod to check out what they’re talking about.&#160; Maybe you can help by offering a different perspective or maybe you know an immediate answer to the question that they’re discussing.&#160; If you can’t help, go ahead and press Play again.</p>
<p>The thing is… even if you do tune into some music at work, it’s important not to tune out of your coworkers completely.&#160; Go ahead and listen to your music, but keep looking around occasionally.&#160; Turn it off when you notice your teammates are talking and follow the discussion to see if it’s interesting to you or if you can help them.&#160; Conversely, if you’re participating in a discussion and you notice that one or more of your teammates is listening to music while they should probably be involved or at least hear what the conclusion or decision was, go ahead and notify them of what’s been discussed/decided/concluded.&#160; Also don’t be afraid to involve people who weren’t involved yet if you think that it <em>might</em> be important to them.&#160; If it turns out that it wasn’t important to them, then all you’ve lost is a few minutes.&#160; But if it was important to them, you might have saved a lot more than a few minutes by pulling them into the discussion.</p>
<p>As for sitting in a separate office… i’m not a fan of that.&#160; I’ve always noticed the best results are achieved when all of the developers are sitting together in the same office.&#160; In some organizations, senior developers, lead developers or ‘architects’ might be sitting in different offices from the people they’re supposed to be working with.&#160; I don’t know about you, but i’ve never actually seen that work properly.&#160; The typical on-the-floor communication that is so vital to successful teamwork is just reduced a lot of if some people are sitting in a different office.&#160; Obviously, when working with remote coworkers, this problem only increases but that’s something i haven’t really found an efficient solution for either.&#160; In some cases, communication through IM works great.&#160; And sometimes it doesn’t.&#160; It depends on how effectively you can communicate through IM, and how effectively the others can.&#160; </p>
<p>But anyway, when you hear people talk about how developers that isolate themselves at work is a bad thing, don’t necessarily buy into it.&#160; Like i said, it can be good or it can be bad.&#160; As with anything in our business, it all depends.</p>
]]></content:encoded>
			<wfw:commentRss>http://davybrion.com/blog/2010/06/isolation-at-work-good-or-bad/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Is It Just Me Or Is .NET 4 Just Not That Special?</title>
		<link>http://davybrion.com/blog/2010/05/is-it-just-me-or-is-net-4-just-not-that-special/</link>
		<comments>http://davybrion.com/blog/2010/05/is-it-just-me-or-is-net-4-just-not-that-special/#comments</comments>
		<pubDate>Tue, 25 May 2010 20:54:34 +0000</pubDate>
		<dc:creator>Davy Brion</dc:creator>
				<category><![CDATA[Opinions]]></category>

		<guid isPermaLink="false">http://davybrion.com/blog/?p=2323</guid>
		<description><![CDATA[I&#8217;ve been using Visual Studio 2010 for about 2 weeks now, and i&#8217;ve upgraded several of our projects to .NET 4 as well. I&#8217;ve noticed that i&#8217;ve hardly used any of the new features of C# or any of the new classes in the .NET framework. Granted, i don&#8217;t have a very thorough knowledge of [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been using Visual Studio 2010 for about 2 weeks now, and i&#8217;ve upgraded several of our projects to .NET 4 as well.  I&#8217;ve noticed that i&#8217;ve hardly used any of the new features of C# or any of the new classes in the .NET framework.  Granted, i don&#8217;t have a very thorough knowledge of everything that&#8217;s been added in C# 4 and i don&#8217;t know all of the new classes in the .NET framework.  But i do know something about the new stuff, and so far, i haven&#8217;t really noticed anything compelling.  Nothing that made me think &#8220;this is awesome!&#8221;.</p>
<p>I looked at the new WCF 4 features so i could see how Agatha could benefit from it, but apart from the improved REST support (which <a href="http://weblogs.asp.net/andrewrea/default.aspx">Andrew Rea</a> is working on), there&#8217;s nothing that Agatha could really benefit from.  Perhaps maybe the fact that you can reduce XML configuration for your WCF services but then again, the amount of XML config that you need for Agatha is already very limited compared to typical WCF services and the parts that you do need are things that i actually prefer to see explicitly in a configuration file instead of hidden away in some infrastructure assembly that your project is using.</p>
<p>As for the new language features&#8230; i like the whole dynamic thing, though i haven&#8217;t found a need to use it yet.  The next time i see some old reflection code i&#8217;ll probably modify it to use dynamic, but i don&#8217;t really need to use tricks like that very often.  Optional parameters are something that i can&#8217;t really get excited about, perhaps because i hardly ever use interop and more likely because i still believe in meaningful method overloads.  In fact, it sometimes makes me think that C# 4 is moving closer to Dysfunctional Programming as opposed to at least being influenced by Functional Programming in C# 3.  Named Parameters is something that i can see myself using to increase readability when it comes to using multiple overloads with confusing method parameters but that as well is something that i don&#8217;t frequently run into.</p>
<p>The greatly improved support for parallelism looks very nice, though i haven&#8217;t really needed that either.  The new thread-safe collections look nice too, though every time i want to modify some code to make use of it, i notice that i typically need my locking to be just a bit more coarse-grained than what i can get from the new collections.  Unless i haven&#8217;t looked hard enough of course, which is certainly possible.</p>
<p>As for Visual Studio 2010&#8230; from a performance point of view it is somewhat better than i expected but i really can&#8217;t say it&#8217;s an improvement over Visual Studio 2008 (again, from a performance point of view).  I occasionally notice about 25% CPU usage (on a quad core system, so that&#8217;s pretty bad IMO) coming from devenv.exe while it isn&#8217;t actually doing anything.  I can&#8217;t really say that i&#8217;m happy about that.  The default color theme looks butt ugly IMHO, but at least there&#8217;s a plugin to change that.  Which i haven&#8217;t actually done yet though <img src='http://davybrion.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Now the thing is&#8230; maybe it&#8217;s just because i haven&#8217;t looked hard enough, or that i&#8217;m missing some cool new stuff, but isn&#8217;t this very different from when .NET 3.5 came out? The Linq extension methods and the ability to use Expressions was highly welcome and i guess a lot of us kinda went overboard with it (and some probably still do).  But at least that showed that those new features were not only highly welcome, but very popular and in general just great new additions to the C# language.  But with .NET 4 i really find it pretty hard to find anything to get really excited about.  And just to be clear on this: that&#8217;s not to be critical of Microsoft or anything like that.  But i&#8217;m just wondering: &#8220;is it just me or is this really not that special?&#8221;</p>
<p>So what do you think? Are there great new additions to C#/.NET that i&#8217;m probably missing and that you are enjoying a lot? What are your favorite additions to the platform?  Or are you, like me, not really all that excited about the new stuff?</p>
]]></content:encoded>
			<wfw:commentRss>http://davybrion.com/blog/2010/05/is-it-just-me-or-is-net-4-just-not-that-special/feed/</wfw:commentRss>
		<slash:comments>29</slash:comments>
		</item>
		<item>
		<title>Why You Shouldn&#8217;t Expose Your Entities Through Your Services</title>
		<link>http://davybrion.com/blog/2010/05/why-you-shouldnt-expose-your-entities-through-your-services/</link>
		<comments>http://davybrion.com/blog/2010/05/why-you-shouldnt-expose-your-entities-through-your-services/#comments</comments>
		<pubDate>Mon, 17 May 2010 15:18:43 +0000</pubDate>
		<dc:creator>Davy Brion</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Code Quality]]></category>
		<category><![CDATA[Opinions]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[WCF]]></category>

		<guid isPermaLink="false">http://davybrion.com/blog/?p=2318</guid>
		<description><![CDATA[I sometimes still get questions from people who want to expose their entities through their WCF Services.&#160; Regardless of whether these are entities that are populated through NHibernate or any other ORM, this is just not a good thing to do.&#160; Many people prefer to accept and return entities through their services because they believe [...]]]></description>
			<content:encoded><![CDATA[<p>I sometimes still get questions from people who want to expose their entities through their WCF Services.&#160; Regardless of whether these are entities that are populated through NHibernate or any other ORM, this is just not a good thing to do.&#160; Many people prefer to accept and return entities through their services because they believe this is an easier programming model.&#160; They believe that it takes less work than mapping to DTO’s and that as a whole, this solution is much more manageable.&#160; Rest assured that this is a fallacy.&#160; Any perceived benefit that you’ll get from exposing entities outside of your service layer will only last a <em>very short time</em> and will quickly be dwarfed by added complexity, increased maintenance overhead and a performance overhead which must not be ignored.&#160; </p>
<p>In this post, i’d like to take the chance to explain the downsides to exposing entities through services.&#160; Though i’ll probably miss quite a few of the downsides (feel free to add to the list through comments), the ones i will mention are IMO important enough to take note of.</p>
<p><strong>Exposing entities to clients means your clients are very tightly coupled to your service(s)</strong></p>
<p>Entities are a part of your domain.&#160; These entities in your domain can change for various reasons.&#160; Sometimes because functional changes are required, but quite often also for optimizations (whether they are for performance reasons or to improve the clarity and maintainability of your domain).&#160; Functional changes <em>can </em>impact your clients, though that is not necessarily the case.&#160; Optimizations hardly ever have an impact on your clients (other than possibly improved response times from your service calls obviously).&#160; If your service layer accepts and returns domain entities, each possible change is highly likely to have an impact on your clients.&#160; And this impact is not cheap.&#160; In the best case scenario, it means updating your service contracts, regenerating your service proxies and redeploying your clients.&#160; In the worst case scenario, it means making actual changes to the code of your clients.&#160; And for what? Because of changes that shouldn’t have impacted your clients in the first place? </p>
<p>Ideally, your clients are as dumb as they can be.&#160; They should know as little as possible about the actual <em>implementation</em> of the domain because that implementation is simply not relevant to them.&#160; They should present users with data and give them the option to modify that data, to trigger actions and to perform certain tasks.&#160; They should focus squarely on those tasks and pretty much everything else is typically better suited to be done behind your service layer.&#160; If you build your clients with no real knowledge of the actual domain model, but of DTO’s and possible actions to be performed then you can reduce the level of coupling between your clients and your services substantially. </p>
<p>Many of the people who prefer to expose entities often claim that going for the DTO approach introduces too much extra work and too many extra, seemingly unnecessary classes.&#160; For starters, they don’t want to write code that maps entities to DTO’s.&#160; First of all, the amount of code that this requires is in reality <em>very small</em>, not to mention <em>very easy</em>.&#160; Secondly, you can just as well use a library such as AutoMapper to take that pain away from you.&#160; And contrary to what you might think, there is a big performance gain to be had from returning DTO’s over entities, but i’ll get to that in the next section.</p>
<h5></h5>
<h5></h5>
<p><strong>Entities are hardly ever the most optimal representation of data</strong></p>
<p>I think we can safely say that most applications need to show data in the following 3 ways:</p>
<ul>
<li>In a grid view, either as a total listing of all instances of a certain type of data or the result of a search query or some kind of filtering action </li>
<li>In dropdown controls or anything else that lets users select pieces of data </li>
<li>In edit screens where a piece of data needs to be displayed in its entirety, perhaps even to be modified by the user </li>
</ul>
<p>There are undoubtedly more ways in which data can be presented to the user but i think it’s safe to say that most business applications will certainly rely on the following 3 ways quite heavily.</p>
<p>In the case of a grid view, you’re frequently showing data that is related to more than one entity.&#160; You’ll often need to include the name or the description of some associated entities.&#160; So what exactly is it that you want to do in this situation?&#160; Do you want to return a list of the main entities of the grid view, which all have their required association properties filled in so you can display the columns that you need in the grid view?&#160; Do you actually need all of the properties of these entities (for both the main entities and the associated entities)?&#160; Odds are high that you’re going to be returning a lot more data to the client than you actually need.&#160; And that is what is realistically going to hurt the performance of your system.&#160; Any piece of unnecessary data that you transmit to your clients has a cost associated with it.&#160; The unnecessary data is retrieved from the database.&#160; The entities are then serialized at the service end.&#160; Then they are transmitted to the client.&#160; Then they are deserialized by your client.&#160; All of this is pretty costly, so the more unnecessary data that is included in this operation, the more your performance and the responsiveness of your client (not to mention your database and your server) is impacted negatively.</p>
<p>In the case of dropdown controls or anything else that lets users select pieces of data, you typically only need very few of the properties of that piece of data.&#160; In many cases, the primary key and a name or a description are sufficient.&#160; Do you really need to transmit the entire entity every time for usages like this? Again, keep in mind that all of that extra data that will never be used by your client needs to be retrieved, serialized, transmitted and deserialized again.&#160; Surely, this is an awful waste, no?&#160; </p>
<p>And then there’s the case where a piece of data needs to be displayed in its entirety.&#160; In these cases, you will almost always need all of the properties of the entity that is displayed, but you’ll most often also need to show other data (things that can be selected, or linked to the main entity).&#160; This other data will in most cases fall into the previous category where you’ll only need very little information about the actual entity.&#160; If you’re smart, you’ve chosen the DTO approach to retrieve this data for the data that can be selected, and in that case, you already have all of the infrastructural code in place to project entities or data into DTO’s.&#160; So you might as well reuse it for the main entity as well since you already have the capability to do this.</p>
<p>Always keep in mind that your entities will frequently either contain <em>more data than needed</em>, or <em>less data than needed</em>.&#160; As such, it just doesn’t make much sense to expose entities to your clients since they are hardly ever optimal for client-side usage.&#160; If you really want to think about performance, stop worrying about the supposed cost of mapping to DTO’s (which is truly negligible) and start focusing on <em>what</em> your actually <em>sending</em> to and from your service because this is far more costly than any kind of DTO-mapping really is. </p>
<p><strong>Must your data really come from entities?</strong></p>
<p>If you are displaying data to your user, does that data really need to come from your domain model?&#160; Does it really need to be retrieved by populating a collection of entities to then return them to the client?&#160; Again, keep the <em>form</em> of the data in mind when thinking about this.&#160; In many cases, as i mentioned above, an entity is not the most optimal form of the data that your client needs.&#160; So why even retrieve it through entities? Sure, asking your ORM to retrieve a set of entities based on a set of criteria is often the easiest thing to do, but if the easiest path were the best path, the overall quality of software projects wouldn’t be in the sad state that it’s in today.&#160; If the form of the required data is not identical to the structure of an entity, it’s often far more optimal to simply populate a DTO <em>directly from the data.</em>&#160; With NHibernate, you can easily do this by adding a list of projections to your query and then using a ResultTransformer to populate the DTO’s based on the direct output of the query.&#160; In this case, no entity instance ever needs to be created when you’re just retrieving data, and no extra mapping between the entity and the DTO’s needs to be performed.&#160; Your data access code simply retrieves the resulting data from a query, and puts that data directly in your DTO’s.&#160; There’s no reason why usage of an ORM should prevent you from doing this.&#160;&#160; Once again, this approach will offer far more performance benefits than avoiding DTO mapping at all costs ever can.</p>
<p><strong>What about the behavior of your entities?</strong></p>
<p>Do your entities have any behavior in them?&#160; If not, they are already more of a DTO than a true entity.&#160; In fact, if your entities have no behavior at all, you could even wonder why you’re using an ORM in the first place.&#160; Now, behavior can mean many things.&#160; It could mean lazy loading of associations.&#160; It could mean actual business logic.&#160; Obviously, lazy-loading doesn’t (and shouldn’t!) work client-side, but what about your business logic? Do you have business logic that <em>can </em>be executed client-side? Or is it business logic that should only be executed behind the service layer? If so, how do you make the distinction between this to prevent client-side usage from these entities? Whatever you do, you’re pretty much opening up a can of worms that really is better avoided in the first place.</p>
<p><strong>How are you going to deal with technical issues?</strong></p>
<p>Accepting and returning entities from services introduces a host of technical issues that can be quite substantial.&#160; Serialization and deserialization specifically are issues that you need to be worried about.&#160; If you’re using an ORM which does lazy-loading of associations, this will certainly cause serialization issues that you need to work around.&#160; You can either disable lazy loading, or you can make sure that your entities are always fully initialized (as in: always have their associations fully loaded) before they are sent back to the client.&#160; Disabling lazy-loading <em>will </em>cause performance problems in your service layer, either in places where you don’t expect them to be or in places that you haven’t thought of before it’s too late.&#160; Fully loading your entities and their associates before returning them is another performance nightmare waiting to happen so that’s really not an ideal solution either.&#160; You can try to hook into the serialization process or even the lazy-loading features of your ORM but whatever you do in that case will be a hack that <em>will</em> cause issues sooner or later.&#160; And again, all of these problems can very easily be avoided with a solution which, i hope you realize by now, offers plenty more benefits than any solution where you accept/return entities in your service.</p>
<p><strong>Conclusion</strong></p>
<p>Every single downside to exposing entities through services are issues that i have myself encountered in past projects, either ones i’ve worked on myself, or ones that i’ve seen other people work on.&#160; If that’s not enough for you, then maybe you’ll find it interesting to know that some of the brightest and most respected people (like Udi Dahan and Ayende for instance) in the .NET community also actively recommend against exposing entities through services because of the same downsides that i mentioned, though they could probably give you even more downsides that i forgot to cover in this post.&#160; These downsides are not figments of anyone’s imagination.&#160; They are very real, and you really, really ought to think twice before dismissing this advice.&#160; </p>
]]></content:encoded>
			<wfw:commentRss>http://davybrion.com/blog/2010/05/why-you-shouldnt-expose-your-entities-through-your-services/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
		<item>
		<title>Clients Shouldn&#8217;t Define Your Services</title>
		<link>http://davybrion.com/blog/2010/04/clients-shouldnt-define-your-services/</link>
		<comments>http://davybrion.com/blog/2010/04/clients-shouldnt-define-your-services/#comments</comments>
		<pubDate>Mon, 05 Apr 2010 16:35:53 +0000</pubDate>
		<dc:creator>Davy Brion</dc:creator>
				<category><![CDATA[Opinions]]></category>
		<category><![CDATA[WCF]]></category>

		<guid isPermaLink="false">http://davybrion.com/blog/2010/04/clients-shouldnt-define-your-services/</guid>
		<description><![CDATA[I just got a question about an earlier post of mine, in which i describe how i use NHibernate in my WCF services.&#160; Here’s the question that i got: My architecture at works requires a web app and a windows app to talk to the application server via WCF. The Application server being where all [...]]]></description>
			<content:encoded><![CDATA[<p>I just got a question about an earlier post of mine, in which i describe <a href="http://davybrion.com/blog/2009/12/using-nhibernate-in-your-service-layer" target="_blank">how i use NHibernate in my WCF services</a>.&#160; Here’s the question that i got:</p>
<blockquote><p>My architecture at works requires a web app and a windows app to talk to the application server via WCF. The Application server being where all the Data access and Service libraries live. I intend to implement NHibernate into the project. But wanted to get some pointers if your approach above is recommended for Web and Windows clients alike when sending and receiving data via WCF?</p>
</blockquote>
<p>The short answer to that question is simply: It sure as hell is!</p>
<p>But you know i always prefer the longer answer <img src='http://davybrion.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .&#160; The type of client always has an impact on the usage patterns of the service(s) that it needs.&#160; A web client will often have a different usage pattern than a windows client or a mobile client will.&#160; Each client should be able to consume the service in the manner that is most suitable to its requirements and constraints.&#160; A web client is (or should be) completely stateless so a service that is meant to be used by a web client is typically geared towards that stateless model.&#160;&#160; Windows clients or mobile clients are typically not entirely stateless and as such, the way they could use a service in the most optimal way often differs from how a web client would use the service.</p>
<p>One of the most important SOA principles is that there should be no implicit coupling between a service and its client(s) at all.&#160; Generally speaking, coarse-grained operations are favored over fine-grained ones due to the cost of the communication overhead.&#160; Yet, that easily conflicts with the usage patterns of different clients.&#160; Since a web client is stateless, it often needs more coarse grained operations than a windows client which can retain data in its own process memory and thus, might benefit more from calling a fine-grained operation here and there.</p>
<p>Obviously, my solution to that problem is <a href="http://code.google.com/p/agatha-rrsl/" target="_blank">Agatha</a> which makes it possible to implement each operation (or call them actions or commands and queries or whatever else you can think of) in the way that just makes the most sense, no matter what kind of client is going to call them.&#160; Each client can consume the service operations in a manner that is optimal to the client, without the typical design impact and overhead that you have with traditional WCF services.</p>
<p>We have a few services that serve multiple types of clients.&#160; ASP.NET pages.&#160; Silverlight applications. Windows Services.&#160; WPF tools.&#160; Outlook add-ins.&#160; And guess what?&#160; Those services don’t have a clue as to who or what is using them and they are all implemented in the same way.&#160; And it hasn’t caused a single problem or difficult design decision (as to the service API) yet. </p>
]]></content:encoded>
			<wfw:commentRss>http://davybrion.com/blog/2010/04/clients-shouldnt-define-your-services/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Everybody Wins In The Certification Game</title>
		<link>http://davybrion.com/blog/2010/03/everybody-wins-in-the-certification-game/</link>
		<comments>http://davybrion.com/blog/2010/03/everybody-wins-in-the-certification-game/#comments</comments>
		<pubDate>Sat, 20 Mar 2010 18:59:37 +0000</pubDate>
		<dc:creator>Davy Brion</dc:creator>
				<category><![CDATA[Opinions]]></category>

		<guid isPermaLink="false">http://davybrion.com/blog/2010/03/everybody-wins-in-the-certification-game/</guid>
		<description><![CDATA[You often hear developers complain about the value of certifications.&#160; Most certifications are worthless in my opinion, and you sure as hell don’t need to be smart or talented to be able to get certified.&#160; The only thing you really need is time. That’s it.&#160; So i can understand why so many people in this [...]]]></description>
			<content:encoded><![CDATA[<p>You often hear developers complain about the value of certifications.&#160; Most certifications are worthless in my opinion, and you sure as hell don’t need to be smart or talented to be able to get certified.&#160; The only thing you really need is time. That’s it.&#160; So i can understand why so many people in this industry are frustrated with people who are either too hung up on their certifications, or the companies and/or customers who value them so greatly.&#160; But fear not, my friends, for the truth is that we can all benefit from the software certification game.</p>
<p>If you’re a company or an individual who’s looking for an easy way to make a few extra bucks, just create your own certification! The only reason certifications exist is to make more money and there is no reason in the world why you wouldn’t be able to do the same.&#160; Want some proof?&#160; People are paying money to go to a 2 day course which ends with them being proclaimed Certified Scrum Master.&#160; Obviously, most people who’ve actually given it some thought know that it’s a pretty meaningless certificate but hey, plenty of people are willing to pay for it, so why not take advantage? </p>
<p>Suppose you’re a developer who’s primarily interested in getting a nice cushy job for some company where it’s easy to get away with incompetence or an actual lack of demonstrable progress.&#160; The best possible thing for you to do is to get yourself a couple of buzzword-laden certifications, apply with some big companies who’s core business is <em>not</em> software development and that’s it.&#160; You’re pretty much set for life if you want to.</p>
<p>Suppose you’re a developer who’s primarily interested in interesting work.&#160; Simply stay away from <em>every</em> job that lists one or more certifications in its requirement, or even hints that certification might improve your chances of being hired.&#160; Ignoring those kind of jobs probably improves your chances of interesting work by a significant amount and as a bonus, you relieve yourself of the pain of having to deal with people who value certifications.</p>
<p>If you’re a company who’s looking to hire somebody or some other company to develop some software for you, while you have absolutely no idea where you should go, what to look for, and simply don’t want to get fired, then just hire the company that can show you the highest number of certifications.&#160; The software that will be delivered might suck or it might not.&#160; But one thing is for sure: you will not get fired if the software turns out to be a mess.&#160; After all, you hired certified professionals so surely, you can’t be blamed for this fiasco.</p>
<p>As you can see, the certification game really does provide plenty of positive opportunities for a variety of people and interests.&#160; The only people who don’t benefit from the certification game at all, are end users and consumers.&#160; But then again, this industry has a very strong history of not caring about them anyway, so that’s not really a problem we should care about, right?</p>
]]></content:encoded>
			<wfw:commentRss>http://davybrion.com/blog/2010/03/everybody-wins-in-the-certification-game/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Accepting OSS Donations&#8230; A Slippery Slope</title>
		<link>http://davybrion.com/blog/2010/03/accepting-oss-donations-a-slippery-slope/</link>
		<comments>http://davybrion.com/blog/2010/03/accepting-oss-donations-a-slippery-slope/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 21:18:46 +0000</pubDate>
		<dc:creator>Davy Brion</dc:creator>
				<category><![CDATA[Opinions]]></category>

		<guid isPermaLink="false">http://davybrion.com/blog/2010/03/accepting-oss-donations-a-slippery-slope/</guid>
		<description><![CDATA[As i’m sure most of you have noticed, Ayende recently started an NHibernate Donation Campaign.&#160; I was against the idea from the beginning and even though this post will probably piss off a few people (like i ever cared about that, right?), i wanted to share a few of my thoughts on this with you. [...]]]></description>
			<content:encoded><![CDATA[<p>As i’m sure most of you have noticed, Ayende recently started an <a href="http://ayende.com/Blog/archive/2010/02/27/nhibernate-donation-campaign.aspx" target="_blank">NHibernate Donation Campaign</a>.&#160; I was <a href="http://groups.google.com/group/nhibernate-development/browse_thread/thread/7cf59efa31c46119" target="_blank">against</a> the idea from the beginning and even though this post will probably piss off a few people (like i ever cared about that, right?), i wanted to share a few of my thoughts on this with you.</p>
<p>The idea of sponsoring an open source project and helping out financially is definitely nice, but there are some very important practical issues that need to be kept in mind.&#160; Those practical issues are IMO being ignored by this campaign (which honestly feels like a publicity stunt more than anything else) … some of them were mentioned in the original mailinglist discussion but no resolution has been offered.&#160; There are probably more issues that we haven’t even thought of yet, but the most important ones are (again, IMO):</p>
<ul>
<li>Who’s going to decide how much of the money will go to the committers, and what will that be based on?&#160; Will it be based on past contributions? Future contributions? The complexity of the contributions? Total number of contributions? Total time spent on the project?&#160; We can’t even measure some of these things, so this is bound to either raise some discussions sooner or later, or might even upset some people.&#160; I can certainly imagine that some contributors from the past (like, the ones who did most of the really hard work in the beginning) could feel that they’re entitled to some (or most) of the money.&#160;&#160; Discussing how to spend the money on committers is just going to open a can of worms that could possibly cause much more problems between committers than it would solve.&#160; </li>
<li>There has to be some legal entity (or at least a person) who’s in charge of the bank account where the money will be deposited.&#160; At this point, we have no formal structure or organization to deal with something like that.&#160; I’m no expert on legal matters at all, but i can’t help but think that this isn’t something you can just decide on in a mailinglist… Some level of formalization is most likely required here.</li>
<li>Taxes… if the money goes to committers, then they will have to pay taxes on it based on the laws of the country they’re living in.&#160; Tax laws obviously vary from country to country, but i don’t think it’s unrealistic to claim that between 25% and 50% of the money will simply go to the government(s) instead of actually benefitting the project.&#160; You might wanna keep this in mind before you donate…</li>
</ul>
<p>These are just 3 big issues that could come of this, and i don’t really see a true benefit to the whole thing.&#160; The people who in the past have spent time on NHibernate either volunteered to do so, or were paid by someone (or some company) to spend a certain amount of time on it.&#160; Without donations, it will just go on like that and i don’t really think there’s anything wrong with that.&#160;&#160; While resources are certainly limited, this approach probably causes <em>less</em> problems than one that distributes donations amongst committers.</p>
<p>Now, just to be absolutely clear on this… i am one of the NHibernate committers, and i don’t feel that i’m entitled to any of the money that will be raised.&#160; For one, i haven’t committed anything in the past 6 months, and the things i did commit definitely aren’t worthy of a donation.&#160; If we are going to accept donations and spend it on people instead of infrastructure, i believe any money that would be raised should go to the people who originally started NHibernate and worked hard to get it to a state where it actually became usable in the .NET world.&#160; If it weren’t for their efforts, it never would’ve been in a position to become the de facto ORM in the .NET world, regardless of who’s working on it right now. </p>
]]></content:encoded>
			<wfw:commentRss>http://davybrion.com/blog/2010/03/accepting-oss-donations-a-slippery-slope/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>You&#8217;ll Never Get Sustainable Progress For Free</title>
		<link>http://davybrion.com/blog/2010/02/youll-never-get-sustainable-progress-for-free/</link>
		<comments>http://davybrion.com/blog/2010/02/youll-never-get-sustainable-progress-for-free/#comments</comments>
		<pubDate>Sun, 21 Feb 2010 21:10:58 +0000</pubDate>
		<dc:creator>Davy Brion</dc:creator>
				<category><![CDATA[Opinions]]></category>

		<guid isPermaLink="false">http://davybrion.com/blog/2010/02/youll-never-get-sustainable-progress-for-free/</guid>
		<description><![CDATA[Ayende recently wrote about how most software development processes ignore the actual building of software.&#160; Which reminded me of an excellent post written by James Shore over a year ago, and that i commented on as well.&#160; What James (and Ayende) are saying is that if you don’t actually take care of the way you [...]]]></description>
			<content:encoded><![CDATA[<p>Ayende recently <a href="http://ayende.com/Blog/archive/2010/02/20/nice-process-but-what-about-the-engineering-bits.aspx" target="_blank">wrote about</a> how most software development processes ignore the actual building of software.&#160; Which reminded me of an <a href="http://jamesshore.com/Blog/The-Decline-and-Fall-of-Agile.html" target="_blank">excellent post</a> written by James Shore over a year ago, and that i <a href="http://davybrion.com/blog/2008/11/agile-development-going-downhill/" target="_blank">commented on</a> as well.&#160; What James (and Ayende) are saying is that if you don’t actually take care of the way you <em>build</em> the software, no process can guarantee that any kind of perceived progress in the beginning can be sustained over the long run.&#160; Sustainable progress takes effort, and you’ll never keep it up if you don’t put the proper practices in place to <em>enable</em> it.</p>
<p>The sad (and typical) part is that the methodology which makes everything sound easy and prescribes the least amount of effort required is the one that took off the most.&#160; Obviously, i’m talking about Scrum.&#160; Scrum makes no mention whatsoever about technical practices that are required to enable sustained progress and Scrum proponents will proudly proclaim that it doesn’t need to since it’s about <em>product development</em> instead of <em>software development</em>.&#160;&#160; You can easily become a certified Scrum master while you might not know anything about real-world software development.&#160; In fact, i’ve seen plenty of people boasting that certification on their resume and their linkedin profiles while they really shouldn’t be involved in any kind of professional software development to begin with. </p>
<p>And since Scrum is simple enough for middle-management (you know who i’m talking about… the ones that are usually not competent enough to promote to upper management) to understand, they jump on it as well and before you know it, they’ll be talking about the Scrum concepts as if they actually knew what they’re talking about.&#160; Teams and even entire departments in large corporations are told to be ‘agile’ and follow the Scrum rules and concepts for every new project.&#160; And they do.&#160; And it works great… for a while.&#160; We all know what happens after that.</p>
<p>Then take a look at Extreme Programming (XP).&#160; It’s been around for a while now.&#160; And it unfortunately doesn’t have a good, catchy name.&#160; In fact, its name is probably one of the biggest reasons why it never took off the way Scrum did.&#160; XP prescribes a lot more than Scrum, and even details the technical practices that you’ll need to enable sustainable progress.&#160; And while you don’t need every single one of them, they all provide major benefits and the more of them that you do use, the better off you’ll be.&#160;&#160; So what is the problem with XP?&#160; I never really understood why so many people jumped on Scrum, and now Lean (until the Toyota recalls that is) but never really got into XP.&#160;&#160; Well yeah i do understand.&#160; XP takes more work and effort to understand and apply.&#160; And that, my friends, is the price you’ll have to pay for sustainable progress(*).</p>
<p>*: i’m talking about the actual effort and work, not XP in itself</p>
]]></content:encoded>
			<wfw:commentRss>http://davybrion.com/blog/2010/02/youll-never-get-sustainable-progress-for-free/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Good Team Dynamics Are Essential For High Technical Quality</title>
		<link>http://davybrion.com/blog/2010/01/good-team-dynamics-are-essential-for-high-technical-quality/</link>
		<comments>http://davybrion.com/blog/2010/01/good-team-dynamics-are-essential-for-high-technical-quality/#comments</comments>
		<pubDate>Sun, 31 Jan 2010 20:42:16 +0000</pubDate>
		<dc:creator>Davy Brion</dc:creator>
				<category><![CDATA[Opinions]]></category>

		<guid isPermaLink="false">http://davybrion.com/blog/2010/01/good-team-dynamics-are-essential-for-high-technical-quality/</guid>
		<description><![CDATA[Just read an interesting post from David Tchepak about the lessons he learned from his long-term agile project.&#160; The post itself is interesting but there was one point in particular on the momentum of his team that caught my attention: This probably sounds a bit touchy-feely, but I think dismissing it on those grounds is [...]]]></description>
			<content:encoded><![CDATA[<p>Just read an interesting post from David Tchepak about the <a href="http://www.davesquared.net/2010/01/lessons-learned-from-my-current-project.html" target="_blank">lessons he learned from his long-term agile project</a>.&#160; The post itself is interesting but there was one point in particular on the momentum of his team that caught my attention:</p>
<blockquote><p>This probably sounds a bit touchy-feely, but I think dismissing it on those grounds is ignoring a fairly fundamental part of human nature. If every day, every task is a thankless struggle, the intertia will pull down your team&#8217;s morale, motivation, concentration, and reduce their creativity and ability to innovate. On the flip side, once the team gets up a bit of steam and starts churning through stories, seeing visible progress as they move across the task board and into the Done column, the team&#8217;s enthusiasm and creativity soars. They start kicking around new ideas on how to remove some duplication from the code and reduce some overhead for future stories.</p>
</blockquote>
<p>David is right, but i’d go even further than that.&#160; I’d assert that good team dynamics are essential for achieving high technical quality that is sustainable in the long term.&#160; I think we can all agree that people work better together if they actually like working with each other.&#160; And i’m pretty sure that many of us have experienced first hand how a negative relationship within a team can have a pretty negative impact on the technical quality of a project.&#160; </p>
<p>Have you ever been on a project where you were looking at a piece of code thinking “wow, this really ought to be cleaned up… but i’m not touching it since John is gonna get all pissed over somebody touching his code”.&#160; Or worse, “wow, he really made a mess of this but i’m not touching it… let him live with the pain”.&#160;&#160; I certainly wouldn’t be surprised if many of us have at one point (or more) in our career had this exact thought about a certain piece of code written by a teammate at the time.&#160; That is a perfect example of how negative team dynamics can have a pretty serious impact on the technical quality and thus, i’d argue, the long-term viability of the project.&#160;&#160; See, the thing is that it won’t end what that certain piece of code.&#160; Sure, code rot has been introduced.&#160; But even worse, team rot is being introduced by this behavior as well, even if you are just trying to preserve the peace by trying to avoid a possible confrontation.</p>
<p>This kind of team rot will not end there.&#160; If you don’t actively try to get rid of it ASAP, it’ll eventually spread throughout the team, as more and more people gradually get into the same mentality.&#160; Eventually, even the strongest, most positive personalities can fall victim to it.&#160; When new people join the team, they’ll quickly pick up on it as well and there are very few people who are willing to stand up to such a situation when joining an existing team.&#160; As i’m sure you can imagine, nobody really likes working in such a team.&#160; A lot of people in that situation will get into a “i’m just gonna look out for myself and to hell with anyone else” mentality.&#160;&#160; They will try to do their job in a way that they will not be blamed for anything.&#160; Communication will drop to a ‘nothing-more-than-necessary’-level.&#160; A lot of issues will be ignored until they are actually found by end-users.&#160; A lot of time and effort is going to be wasted in general.&#160; And you’ll probably end up with a pretty high turnover rate of team members.&#160; Believe it or not, these kind of teams truly do exist.</p>
<p>On the other hand, if everybody on the team gets along everything seems to go much more smoothly.&#160; People won’t be afraid to make changes in other people’s code if everyone understands that it’s for the best of the project and if they know that it’s not gonna lead to a bitchfest from a difficult team member.&#160; Discussions will be about actual facts and merits, not about not-wanting-to-give-in-to-someone-you-no-longer-like.&#160; People will alert their team members when they notice something that could cause problems later on.&#160; People will be much more likely to maintain their technical discipline when there is positive peer pressure to maintain high standards.&#160;&#160; People will help each other when they can.&#160; Essentially, those people will form a true team instead of being a collection of coworkers who are unfortunately working on the same project together.</p>
<p>As much as many of us strive to improve our technical abilities and skills on a continuous basis, we also need to ask ourselves the following questions regularly: </p>
<ul>
<li>Am i a good team member? </li>
<li>Would i like to work with someone like me? </li>
<li>What can i do to make people enjoy working with me more than they might do now? </li>
</ul>
<p>That doesn’t mean you have to become Mr Popular.&#160; It doesn’t mean you have to crack the best jokes.&#160; You can be almost entirely yourself, as long as you realize that:</p>
<ul>
<li>communication is extremely important </li>
<li>treating others with respect is crucial </li>
<li><a href="http://davybrion.com/blog/2009/12/dont-be-a-whiny-developer/" target="_blank">nobody likes working with whiney developers</a> </li>
<li>you can’t expect others to work on their flaws if you’re not willing to work on yours… it’s a two-way street </li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://davybrion.com/blog/2010/01/good-team-dynamics-are-essential-for-high-technical-quality/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>As A Movement, ALT.NET Has Been Dead For A While</title>
		<link>http://davybrion.com/blog/2010/01/as-a-movement-alt-net-has-been-dead-for-a-while/</link>
		<comments>http://davybrion.com/blog/2010/01/as-a-movement-alt-net-has-been-dead-for-a-while/#comments</comments>
		<pubDate>Sun, 24 Jan 2010 15:06:58 +0000</pubDate>
		<dc:creator>Davy Brion</dc:creator>
				<category><![CDATA[ALT.NET]]></category>
		<category><![CDATA[Opinions]]></category>

		<guid isPermaLink="false">http://davybrion.com/blog/2010/01/as-a-movement-alt-net-has-been-dead-for-a-while/</guid>
		<description><![CDATA[Quite a few posts have been written lately on the state of the ALT.NET community, or movement or whatever else you want to consider or call it.&#160; I’ve always thought of ALT.NET in 3 ways. it is a mindset it is a community there is a movement The ALT.NET mindset was originally described perfectly by [...]]]></description>
			<content:encoded><![CDATA[<p>Quite a few posts have been written lately on the state of the ALT.NET community, or movement or whatever else you want to consider or call it.&#160; I’ve always thought of ALT.NET in 3 ways.</p>
<ol>
<li>it is a mindset </li>
<li>it is a community </li>
<li>there is a movement </li>
</ol>
<p>The ALT.NET mindset was originally described perfectly by <a href="http://laribee.com/blog/2007/04/10/altnet/" target="_blank">Dave Laribee</a>:</p>
<blockquote><ol>
<li>You’re the type of developer who uses what works while keeping an eye out for a better way. </li>
<li>You reach outside the mainstream to adopt the best of any community: Open Source, Agile, Java, Ruby, etc. </li>
<li>You’re not content with the status quo. Things can always be better expressed, more elegant and simple, more mutable, higher quality, etc. </li>
<li>You know tools are great, but they only take you so far. It’s the principles and knowledge that really matter. The best tools are those that embed the knowledge and encourage the principles (e.g. Resharper.) </li>
</ol>
</blockquote>
<p>This mindset still lives on, and will always stay alive. There will always be .NET developers that are continuously looking for better ways to create software.&#160; We might not think there are enough of them, but they are still growing gradually.&#160; Typical ALT.NET topics, practices and principles have become much more popular and more and more people are definitely still looking to learn about them.&#160; I can’t think of a single reason why this would ever cease to happen.</p>
<p>As a community, ALT.NET hasn’t done a good job (IMO) of being accessible to new-comers.&#160; I’ve complained about this <a href="http://davybrion.com/blog/2008/08/why-the-altnet-community-needs-to-change-their-ways/" target="_blank">in August 2008</a>.&#160; Nothing changed after that post, and nothing will change after this post either.&#160; A lot of the people in the ALT.NET community are still too negative in expressing their views, or have even stopped trying altogether.&#160; Some of them just attacked everyone who disagreed with them.&#160; Things like that will obviously never, ever lead to adoption of your thoughts and ideas.&#160; And after that, they’d complain that nobody was listening anyway and that they were tired of trying to discuss these things with people who didn’t believe in it yet. It also doesn’t help that quite a few people got involved purely for the sake of bettering themselves.&#160; After all, the ALT.NET name was hot and being associated with it and getting involved with it was an easy way to improve your reputation, status and for some even their finances.</p>
<p>As a movement, we’ve failed as well.&#160; Essentially, the ALT.NET movement is about education.&#160; Teaching people the things we believe in.&#160; Showing them that there are better ways to develop software than that what is more accepted in the Microsoft world.&#160; In the early stages of the movement, there was a tremendous amount of interesting blog posts being written with exactly that purpose in mind.&#160; Teaching people.&#160; Showing them the benefits.&#160; Explaining things to them.&#160;&#160; After a while though, some of those bloggers didn’t quite put the same effort into it anymore.&#160; A lot of them resorted to one-liners about why approach A is better than approach B and they weren’t really taking the time anymore to try to educate people.&#160; The rise of Twitter certainly didn’t help either since you simply can’t teach this stuff to people through 140-character tweets.&#160; You can’t really show them the benefit of whatever it is that you think is a good thing to do.&#160; And since a lot of those bloggers are spending more of their time on Twitter than on working on their blogs nowadays, a lot of valuable knowledge and experience isn’t being spread as much anymore as it used to.&#160; Now obviously, we can’t tell people how to spend their time so if those people prefer to spend time on Twitter instead of writing good posts that could help more people, that is their personal choice and nobody can blame them for that.&#160;&#160; At the same time, they can’t really complain about the current state of ALT.NET as a movement and a community either.</p>
<p>But hey, the mindset still lives and will continue on living.&#160; The best thing you can do is to share your knowledge and experience with as many people that want to hear it.&#160; And trust me, there are quite a few people who want to hear it.&#160; </p>
]]></content:encoded>
			<wfw:commentRss>http://davybrion.com/blog/2010/01/as-a-movement-alt-net-has-been-dead-for-a-while/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Hey Microsoft, Our Databases Aren&#8217;t Services!</title>
		<link>http://davybrion.com/blog/2010/01/hey-microsoft-our-databases-arent-services/</link>
		<comments>http://davybrion.com/blog/2010/01/hey-microsoft-our-databases-arent-services/#comments</comments>
		<pubDate>Sun, 17 Jan 2010 17:46:11 +0000</pubDate>
		<dc:creator>Davy Brion</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Opinions]]></category>
		<category><![CDATA[WCF]]></category>

		<guid isPermaLink="false">http://davybrion.com/blog/2010/01/hey-microsoft-our-databases-arent-services/</guid>
		<description><![CDATA[Something that frequently bothers me is when people/companies create services that are basically thin layers on top of their database.&#160; The service contracts expose the typical CRUD operations for each table, and add some additional methods for specific queries etc.&#160; These kind of services will sometimes pretend to contain a bit of ‘business logic’ but [...]]]></description>
			<content:encoded><![CDATA[<p>Something that frequently bothers me is when people/companies create services that are basically thin layers on top of their database.&#160; The service contracts expose the typical CRUD operations for each table, and add some additional methods for specific queries etc.&#160; These kind of services will sometimes pretend to contain a bit of ‘business logic’ but they are essentially just a remote interface into your database with maybe a bit of extra security on top of it.&#160; They effectively turn your database into a remote service.&#160; Now if you’re anything like me, you’re probably thinking “why on earth would people do that?”</p>
<p>There are probably a few answers to that question, but one reason that can’t really be disputed is that a lot of the tooling that Microsoft offers to developers simply encourage this kind of stuff.&#160; Let’s go over a little example.</p>
<p>I wanted to see what some of Microsoft’s recommended tools would create for me if i wanted to create a Silverlight application which uses a database.&#160; Obviously, a Silverlight application can’t use a database directly so the application will need to communicate with a service.&#160; The service obviously does have access to the database.&#160; RIA Services is a solution that Microsoft seems to be pushing a lot for this specific scenario so i figured i’d give this a shot.</p>
<p>I created a RIA Services Class Library project in my solution and tried to add a ‘Domain Service Class’ (as the RIA Services templates call it) to the project.&#160; If you already have a DataContext or an ObjectContext defined within the same assembly, you can immediately select the database tables that you want to expose.&#160;&#160; So i canceled the dialog and quickly added an ADO.NET Entity Data Model to the solution for which i selected my <a href="http://www.codeplex.com/ChinookDatabase" target="_blank">Chinook</a> database.&#160; I tried to create a ‘Domain Service Class’ again and got the following window:</p>
<p><a href="http://davybrion.com/pictures/YourDatabaseIsNotAService_E97E/create_service.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="create_service" border="0" alt="create_service" src="http://davybrion.com/pictures/YourDatabaseIsNotAService_E97E/create_service_thumb.png" width="454" height="554" /></a> </p>
<p>Well, now that sure is easy isn’t it? I can immediately select all my ‘Entities’ and i can even check whether i want to be able to edit them through the service, and apparently i can also generate associated classes for metadata (which would be useful for validation according to the tooltip).&#160; I checked the Album table, and left the ‘Enable editing’ option unchecked.&#160; This created a service with the following code:</p>
<div style="font-family: consolas; background: white; color: black; font-size: 10pt">
<p style="margin: 0px">&#160;&#160;&#160; <span style="color: green">// Implements application logic using the ChinookEntities context.</span></p>
<p style="margin: 0px">&#160;&#160;&#160; <span style="color: green">// TODO: Add your application logic to these methods or in additional methods.</span></p>
<p style="margin: 0px">&#160;&#160;&#160; <span style="color: green">// TODO: Wire up authentication (Windows/ASP.NET Forms) and uncomment the following to disable anonymous access</span></p>
<p style="margin: 0px">&#160;&#160;&#160; <span style="color: green">// Also consider adding roles to restrict access as appropriate.</span></p>
<p style="margin: 0px">&#160;&#160;&#160; <span style="color: green">// [RequiresAuthentication]</span></p>
<p style="margin: 0px">&#160;&#160;&#160; [<span style="color: #2b91af">EnableClientAccess</span>()]</p>
<p style="margin: 0px">&#160;&#160;&#160; <span style="color: blue">public</span> <span style="color: blue">class</span> <span style="color: #2b91af">AlbumService</span> : <span style="color: #2b91af">LinqToEntitiesDomainService</span>&lt;<span style="color: #2b91af">ChinookEntities</span>&gt;</p>
<p style="margin: 0px">&#160;&#160;&#160; {</p>
<p style="margin: 0px">&#160;</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: green">// TODO: Consider</span></p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: green">// 1. Adding parameters to this method and constraining returned results, and/or</span></p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: green">// 2. Adding query methods taking different parameters.</span></p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: blue">public</span> <span style="color: #2b91af">IQueryable</span>&lt;<span style="color: #2b91af">Album</span>&gt; GetAlbum()</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: blue">return</span> <span style="color: blue">this</span>.ObjectContext.Album;</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p>
<p style="margin: 0px">&#160;&#160;&#160; }</p>
</p></div>
<p>&#160;</p>
<p>I don’t know about you, but i love those TODO statements.&#160; After all, you really do might want to <em>consider</em> constraining the resultset that could be returned by the GetAlbum method.&#160;&#160; Who knows, perhaps you have certain use cases where you don’t want <em>all</em> of the ‘entities’ in the Album <em>table</em> to be returned by your ‘domain service’<em>.</em>&#160; Hopefully, this service will be used by developers who are smart enough to realize that they should modify this method, instead of using client-side LINQ statements to filter the returned Album ‘entities’ as i’m sure we’ve all seen in too many Microsoft demo’s already.</p>
<p>It gets better if you recreate the service and check the ‘Enable editing’ option.&#160; Now you’re ‘domain service’ will also contain the following methods:</p>
<div style="font-family: consolas; background: white; color: black; font-size: 10pt">
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: blue">public</span> <span style="color: blue">void</span> InsertAlbum(<span style="color: #2b91af">Album</span> album)</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: blue">this</span>.ObjectContext.AddToAlbum(album);</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p>
<p style="margin: 0px">&#160;</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: blue">public</span> <span style="color: blue">void</span> UpdateAlbum(<span style="color: #2b91af">Album</span> currentAlbum)</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: blue">if</span> ((currentAlbum.EntityState == <span style="color: #2b91af">EntityState</span>.Detached))</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: blue">this</span>.ObjectContext.AttachAsModified(currentAlbum, <span style="color: blue">this</span>.ChangeSet.GetOriginal(currentAlbum));</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p>
<p style="margin: 0px">&#160;</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: blue">public</span> <span style="color: blue">void</span> DeleteAlbum(<span style="color: #2b91af">Album</span> album)</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: blue">if</span> ((album.EntityState == <span style="color: #2b91af">EntityState</span>.Detached))</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: blue">this</span>.ObjectContext.Attach(album);</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: blue">this</span>.ObjectContext.DeleteObject(album);</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p>
</p></div>
<p>&#160;</p>
<p>Man, this sure is easy, isn’t it? I now have a service that offers me full CRUD access to the Album table in my database.&#160; If i wanted to, i could now start implementing a screen in my Silverlight application which allows my users to list the albums, edit them, delete them, create new ones, etc… and i wouldn’t even have to change anything in my ‘service layer’.&#160;&#160; The problem is that too many developers actually will do exactly that.&#160;&#160; After all, why should they doubt any code that was generated by a tool which comes from Microsoft?&#160; If the tool can generate this, then certainly some people actually want you to use it like this, no?&#160; If not, why would it even generate code like this?</p>
<p>I’m sure this kind of stuff gets a lot of ooh’s and aah’s during the product demo’s at Microsoft events, but other than that, what good does this really bring?&#160; Is this really the way you want people to develop their services?&#160; Do you really want developers to pretty much expose the database as-is to remote clients?&#160; And those TODO statements simply won’t cut it, you know that all too well.&#160; I simply don’t think there’s any good reason to generate code like this because a lot of people will simply take it as is and use it like that directly from their client code.&#160; Oh sure, most of them will hook up the authentication but i’m willing to bet that very few people will actually put real business logic in there.&#160; Why would they?&#160; The message that a lot of people will get from the resulting code is that a service is merely a way to provide CRUD for your database tables.&#160; What’s business logic to these people?&#160; Right, the stuff they’ll implement in their presentation layer because this service doesn’t really encourage people to consider implementing it there.</p>
<p>The <em>only </em>benefit that i can see from using RIA services is that you don’t really have to deal with your service contracts, and your operation contracts or any of that stuff.&#160;&#160; No, we won’t be doing any of that.&#160; We simply use a [EnableClientAccess] attribute and we’re done!&#160; I don’t really consider that a benefit, though i can certainly understand why people would not want to deal with <a href="http://davybrion.com/blog/2009/07/why-i-dislike-classic-or-typical-wcf-usage/" target="_blank">the pain of classic WCF services</a>.&#160; RIA Services is simply a solution to the <em>wrong</em> problem.</p>
<p>I haven’t looked at ADO.NET Data Services (which will be renamed to WCF Data Services in .NET 4.0) yet, but i suppose it’ll be more of the same: something that makes it incredibly easy to create services directly on top of your database data. </p>
<p>Seriously though: who on earth actually <em>wants </em>that? </p>
<p>I have no doubt that there are some people out there that are using RIA Services in a responsible manner and are sticking by responsible architectural guidelines.&#160; I also have no doubt that those people are ignoring most of the tooling that is offered by Microsoft around it.&#160; So really, why not get rid of this kind of tooling, and spend the effort that normally goes into those tools (or anything else which encourages bad practices for that matter) on providing actual guidance to the developers of your platform?&#160; The last thing we need are more developers who think that this is ‘ok’, or projects that have been delivered based on this kind of ‘architecture’, or customers that are turned off by .NET projects because “they all have maintenance problems”.&#160; </p>
]]></content:encoded>
			<wfw:commentRss>http://davybrion.com/blog/2010/01/hey-microsoft-our-databases-arent-services/feed/</wfw:commentRss>
		<slash:comments>25</slash:comments>
		</item>
		<item>
		<title>Career Advice For Young Developers, Part 2</title>
		<link>http://davybrion.com/blog/2010/01/career-advice-for-young-developers-part-2/</link>
		<comments>http://davybrion.com/blog/2010/01/career-advice-for-young-developers-part-2/#comments</comments>
		<pubDate>Wed, 13 Jan 2010 20:37:35 +0000</pubDate>
		<dc:creator>Davy Brion</dc:creator>
				<category><![CDATA[Opinions]]></category>

		<guid isPermaLink="false">http://davybrion.com/blog/?p=2183</guid>
		<description><![CDATA[Little over a year ago, i wrote a post which had some career advice for young software developers. That post was mostly based on things that worked for me, but obviously also on mistakes that i had seen other people make. Now, a large percentage of posts in my &#8216;Opinions&#8217; category are directed at people [...]]]></description>
			<content:encoded><![CDATA[<p>Little over a year ago, i wrote a post which had some <a href="http://davybrion.com/blog/2008/10/career-advice-for-young-developers/">career advice for young software developers</a>.  That post was mostly based on things that worked for me, but obviously also on mistakes that i had seen other people make.   Now, a large percentage of posts in my &#8216;Opinions&#8217; category are directed at people that i know personally, and this one is no exception.  I typically don&#8217;t mention names or actual situations in those posts, but in this post i am going to talk about a certain situation, though i won&#8217;t name names.  I am going to contact the person in question so he knows full well that this post is directed to him.  If he doesn&#8217;t like that, that&#8217;s his problem.  Hopefully, he&#8217;ll appreciate the advice though.</p>
<p>Every year we work with interns from the school that i and many of my coworkers come from.  We&#8217;ve been extremely lucky with the interns we&#8217;ve gotten from that school so far, and many of our best developers actually come from that school.  We basically expect to get really good people from them and when they do good during their internship, they usually get offered a job and most of them accept it.  Last year, we had 5 interns from that school.  Two of them are now working for us.  There was another guy who i would&#8217;ve loved to have on our staff.   This kid was 21 (maybe 22, not sure) years old, and i quickly noticed that he was exceptionally talented.  I don&#8217;t know about you guys, but i rarely get to talk with anyone who really makes a great impression on me (on a technical level) who i&#8217;m not already working with or who i&#8217;ve haven&#8217;t worked with in the past.  I was <em>very</em> impressed with this kid even before i saw his code.  He knew a lot of stuff that most of us only learn after a while, and he seemed to be a very all-round talent.</p>
<p>I was very curious to see how he would complete his internship and i was already hoping that he would be working for us once he graduated.  He took on a leadership role of his team (which admittedly, consisted only of interns) but he really managed them pretty well.   He took care of most of the technical challenges, and he made sure the others were productive in their tasks.  If he wasn&#8217;t sure of certain technical issues, he didn&#8217;t mind asking for advice or help.  The skills and the approaches he demonstrated at his age were truly exceptional in my opinion.  No matter how good you think you are right now, think back about how you were when you were 21, 22 years old.  I thought i was pretty good back then, but i didn&#8217;t even know a fraction of what i know right now.  And i don&#8217;t just mean on a technical level, but more about how businesses work, how you need to deal with people and situations, stuff like that.  Most people simply don&#8217;t have a clue about how to deal with that at that age.</p>
<p>This kid knew, though.  Not everything obviously, but at least a lot more than most people would at that age.  He&#8217;s smart, he&#8217;s talented and he knows how to apply his skills.   The one thing he doesn&#8217;t know yet, is how to deal with previous mistakes.   And that is something you only learn once you&#8217;ve been working in a professional environment for a year or two, and if you&#8217;re lucky enough that people will challenge you and confront you with your mistakes.  He may not have liked it, but i once caught him breaking the build and i told him he needed to fix it.  He said it was a problem with subversion and that something must&#8217;ve gone wrong with the commit in question.  I showed him that it was impossible that it could&#8217;ve been due to a problem with subversion and that he simply made a mistake in his commit.  And while he probably still won&#8217;t admit it, he knew that i was right and that he was wrong.  Now, there&#8217;s nothing wrong with a situation like that per se, but it was clear that he wasn&#8217;t used to a situation like that.</p>
<p>Think about it.  You&#8217;re gifted.  You&#8217;ve got a lot of talent.  You&#8217;re pretty much better than anyone you&#8217;ve ever had to deal with at school.  But the thing is, true improvement comes from learning from your mistakes, and you need to be in a situation where people aren&#8217;t afraid or too intimidated by your skills to be able to tell you when you&#8217;re wrong.  If you don&#8217;t get confronted with your own mistakes, you are going to miss out on a lot of opportunities to improve yourself.  </p>
<p>This guy made it very clear from the beginning that he wanted to pursue another degree after he graduated.  And he&#8217;s currently doing that.  The thing is, with the skills that he has, and the ability to convince other people of his skills, combined with the extra degree that i have no doubt he&#8217;ll earn this year, it&#8217;s very likely that he is going to end up with some large company in a very comfortable position.  The thing that worries me though, is that a lot of people in those kind of companies aren&#8217;t very honest with their employees.  Especially the ones they consider to be &#8216;high-potentials&#8217;.  I doubt that he&#8217;s going to be around the kind of people who are going to be honest with him when he makes mistakes (and he surely will make them, as everyone does).  And no matter how good you are, no matter how well you learn from your own mistakes, a very large part of self-improvement comes from being confronted with your mistakes by others.</p>
<p>So finally, we get to the &#8216;advice&#8217; part of the post.  To him specifically, and anyone else who recognizes himself (or herself) in a story like this i would advise the following:</p>
<ul>
<li>Do not automatically assume that a fancy position at a large company is the best situation for you.  For most of these companies, you&#8217;re only valuable as long as you&#8217;re willing to play along with <em>their</em> game.  It&#8217;s their game, their rules.  You either play along, or you fold after a while, and believe me when i tell you that it is going to end up bothering the hell out of you.</li>
<li>Learn to appreciate criticism.  If you handle it right, you&#8217;re only going to end up better from it and you will truly learn from it.</li>
<li>Status or position doesn&#8217;t mean anything if you suddenly realize you&#8217;re surrounded by idiots.</li>
<li>If you don&#8217;t really need the extra money you can make while working for people who truly couldn&#8217;t care less about you personally, you certainly don&#8217;t need to subject yourself to all of the crap that <em>will</em> come with it.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://davybrion.com/blog/2010/01/career-advice-for-young-developers-part-2/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>OMG! Someone Stole My Code</title>
		<link>http://davybrion.com/blog/2010/01/omg-someone-stole-my-code/</link>
		<comments>http://davybrion.com/blog/2010/01/omg-someone-stole-my-code/#comments</comments>
		<pubDate>Tue, 12 Jan 2010 21:06:53 +0000</pubDate>
		<dc:creator>Davy Brion</dc:creator>
				<category><![CDATA[Opinions]]></category>

		<guid isPermaLink="false">http://davybrion.com/blog/?p=2170</guid>
		<description><![CDATA[I received an email from someone who wanted to let me know that she noticed that a coworker of her used all of the code from my Build Your Own Data Access Layer Series in their project without any notice of where it actually came from. The code in that series was posted using the [...]]]></description>
			<content:encoded><![CDATA[<p>I received an email from someone who wanted to let me know that she noticed that a coworker of her used all of the code from my <a href="http://davybrion.com/blog/2009/08/build-your-own-data-access-layer-series/">Build Your Own Data Access Layer Series</a> in their project without any notice of where it actually came from.  The code in that series was posted using the <a href="http://creativecommons.org/licenses/by/2.0/">Creative Commons Attribution license</a> which only states one simple condition:</p>
<blockquote><p>You must attribute the work in the manner specified by the author or licensor (but not in any way that suggests that they endorse you or your use of the work).</p></blockquote>
<p>First of all, i don&#8217;t really get what this person was trying to achieve by notifying me of this.  What am i going to do about it?  Ask them to add a notice?  Should i even care about it?  I don&#8217;t, actually.  If anything, i&#8217;m glad they&#8217;re using it and i just hope that it works for them and that they don&#8217;t run into any issues with it.  If i didn&#8217;t want people using it, i shouldn&#8217;t have posted it.  And as for adding a notice&#8230; that would be nice, but it&#8217;s not going to make any difference for me whether they do or don&#8217;t.  </p>
<p>I think it&#8217;s different when you release code as an open source project.  Then i obviously do want people to respect the license, but for blog code i don&#8217;t really care what people do with it.  I did mention a license in the original post, but that&#8217;s pretty much only because some people don&#8217;t want to use it if there is no license mentioned.  Which is correct, theoretically.  But the vast majority of code that i list on this blog never has a mention of a specific license.  It&#8217;s just too much of a bother IMO, and there isn&#8217;t anything that i can realistically do about it if people use it without respecting the license anyway.</p>
<p>So for future reference: feel free to do whatever you want with any code that i post on this blog, unless of course that code comes from an open source project.  Would it be legal? No. Am i going to do something about it? No.</p>
]]></content:encoded>
			<wfw:commentRss>http://davybrion.com/blog/2010/01/omg-someone-stole-my-code/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>There&#8217;s Nothing Courageous About Being Honest About Mistakes</title>
		<link>http://davybrion.com/blog/2010/01/theres-nothing-courageous-about-being-honest-about-mistakes/</link>
		<comments>http://davybrion.com/blog/2010/01/theres-nothing-courageous-about-being-honest-about-mistakes/#comments</comments>
		<pubDate>Sat, 09 Jan 2010 18:46:07 +0000</pubDate>
		<dc:creator>Davy Brion</dc:creator>
				<category><![CDATA[Opinions]]></category>

		<guid isPermaLink="false">http://davybrion.com/blog/?p=2163</guid>
		<description><![CDATA[Michel Grootjans recently left the following comment on a post where i discussed a really stupid mistake i made: Been there, done that, but never had the courage to post it. That got me thinking.&#160; What exactly is courageous about being honest about a mistake you made?&#160; I mean, everybody makes mistakes and nobody is [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://geekswithblogs.net/alternativedotnet/Default.aspx" target="_blank">Michel Grootjans</a> recently left the following comment on a <a href="http://davybrion.com/blog/2010/01/never-underestimate-your-own-stupidity" target="_blank">post</a> where i discussed a really stupid mistake i made:</p>
<blockquote><p>Been there, done that, but never had the courage to post it.</p>
</blockquote>
<p>That got me thinking.&#160; What exactly is courageous about being honest about a mistake you made?&#160; I mean, everybody makes mistakes and nobody is an exception to that.&#160; Why do so many people try to hide this fact?</p>
<p>I used to work at a large financial institution where a lot of the people weren’t very honest about mistakes they made.&#160; When things went wrong, a lot of them came up with excuses or denied outright that they had made a mistake and blamed it one someone else or on some other event.&#160; That’s one of the worst things you can do if you ask me.&#160; For one, it reduces your credibility and people will be less likely to trust whatever it is you say once they realize that you’re not entirely honest about such things.</p>
<p>One of the biggest mistakes that i made there led to learning one of my most cherished lessons.&#160; I once accidentally truncated 4 large tables in a production database.&#160; It was very early in the morning and parts of my brain must’ve still been sleeping.&#160; I knew that the database operations guys were going to spend a lot of time on trying to fix things, and that it would be a very unpleasant situation for me.&#160; When i called them, i just told them outright that i had made a really stupid mistake and that i needed their help.&#160; It was pretty obvious that they weren’t used to someone actually telling them that and to my surprise, they were very cool about it.&#160; They restored the 4 tables rather quickly and the whole situation was resolved without too many problems.&#160; I told my superior about what had happened and that it was my own stupid fault that the application was down for a few hours.&#160; He too took that rather well.&#160; From that point on, i’ve made it a habit to just be entirely honest about every mistake or screw up that i’d make.&#160; </p>
<p>For one, why on earth should i worry about what people will think of me because i made a stupid mistake?&#160; Like i said, everyone makes mistakes and as long as you don’t make too many of them too frequently, there is nothing wrong with it.&#160; And anyone who will think differently of you because of it is really just a hypocrite.&#160; In fact, most people will respect you more if you are just honest and open about it.</p>
<p>As for writing posts about them… there are a few reasons why i do that.&#160; First of all, by writing about them you are more likely to remember the mistake and you’ll hopefully won’t make it again.&#160; Secondly, it’s typically an interesting opportunity for others to learn from as well.&#160; Last but not least, by posting honestly about them i can hopefully show people that there really isn’t anything wrong with being honest about it and who knows, maybe even encourage them to do the same in the future when it happens to them.</p>
<p>But is it courageous? I don’t think so… If a certain action doesn’t justify any fear, then there’s no reason to consider doing so courageous either.</p>
<p>Oh, and if you want to read up on more of my mistakes, check out the following posts:</p>
<ul>
<li><a title="http://davybrion.com/blog/2009/01/my-2-most-cherished-mistakes/" href="http://davybrion.com/blog/2009/01/my-2-most-cherished-mistakes/" target="_blank">My 2 most cherished mistakes</a></li>
<li><a title="http://davybrion.com/blog/2008/05/how-a-simple-foreach-statement-can-waste-an-afternoon/" href="http://davybrion.com/blog/2008/05/how-a-simple-foreach-statement-can-waste-an-afternoon/" target="_blank">How a simple foreach statement can waste an afternoon</a></li>
<li><a title="http://davybrion.com/blog/2008/10/do-not-dispose-in-the-prerender-event/" href="http://davybrion.com/blog/2008/10/do-not-dispose-in-the-prerender-event/" target="_blank">Do not dispose in the prerender event</a></li>
<li><a title="http://davybrion.com/blog/2008/12/the-importance-of-releasing-your-components-through-windsor/" href="http://davybrion.com/blog/2008/12/the-importance-of-releasing-your-components-through-windsor/" target="_blank">The importance of releasing your components through Windsor</a></li>
</ul>
<p>Come to think of it, there should be plenty more of those… guess i gotta start posting about them more often <img src='http://davybrion.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://davybrion.com/blog/2010/01/theres-nothing-courageous-about-being-honest-about-mistakes/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Don&#8217;t Strive For Perfection</title>
		<link>http://davybrion.com/blog/2010/01/dont-strive-for-perfection/</link>
		<comments>http://davybrion.com/blog/2010/01/dont-strive-for-perfection/#comments</comments>
		<pubDate>Mon, 04 Jan 2010 20:38:05 +0000</pubDate>
		<dc:creator>Davy Brion</dc:creator>
				<category><![CDATA[Code Quality]]></category>
		<category><![CDATA[Opinions]]></category>

		<guid isPermaLink="false">http://davybrion.com/blog/?p=2155</guid>
		<description><![CDATA[A mistake that you commonly see developers make (especially young ones) is to try to achieve perfection when they need to design something.&#160; Whether it’s just a reusable base class, a component, or even a small library or framework, a lot of people get too caught up in details that don’t really matter in most [...]]]></description>
			<content:encoded><![CDATA[<p>A mistake that you commonly see developers make (especially young ones) is to try to achieve perfection when they need to design something.&#160; Whether it’s just a reusable base class, a component, or even a small library or framework, a lot of people get too caught up in details that don’t really matter in most cases.</p>
<p>It is understandable though, and i think most developers have gone down that path quite a few times in their careers.&#160; Especially early on.&#160; You know how it goes… you need to create something that is going to be reused by others, and you want to make sure that it is just perfect.&#160; That nobody can say anything bad about it.&#160; That everyone will agree without discussion that that piece of code is simply great.</p>
<p>So a lot of people in that situation start thinking about things like:</p>
<ul>
<li>Shouldn’t i seal this class? Nobody’s ever going to need to derive from this because i’ve left plenty of other extensibility points </li>
<li>Shouldn’t i seal this method? After all, nobody should ever change the way this particular piece of code works </li>
<li>This class will never be used by anyone outside of this assembly, so i probably should make it internal, right? </li>
<li>This particular method will be a bottleneck so i should really make it as fast as i can </li>
<li>Whenever i can pull some common logic in a base class, or introduce more base classes i should do so! </li>
<li>Etc… </li>
</ul>
<p>The reality of the situation is that despite your best intentions, focusing too much on details like that will quite frequently lead to very inflexible code that a lot of people will find hard or annoying to use.&#160; Unless you are very experienced with this kind of stuff (and for the record, i’m not saying that i am) you’re very likely to get these decisions wrong if you think about them up front so it really isn’t worth spending so much time on ‘details’ like that.&#160; In fact, the best thing to do is often to keep things as simple as possible until you actually have a reason to make them more complicated.&#160; Making things more complicated than they need to be in advance never works, and you’re probably going to over-complicate things in places where it turns out not to matter.&#160; If you’re really unlucky, that will actually make it harder to modify or extend other parts that over time really do need to be modified or extended in some ways.</p>
<p>Generally speaking, i think you’re better off focusing on the following goals/principles:</p>
<ul>
<li>Avoid writing classes that are <a href="http://davybrion.com/blog/2009/10/slutty-types/" target="_blank">slutty</a> </li>
<li>Make sure that your consumers primarily communicate with your classes through interfaces.&#160; Though you don’t need to put everything behind an interface either… pretty much anything that people might need/want to change in some way typically are good candidates. </li>
<li>Use Dependency Injection so implementations can easily be switched with others </li>
<li>Use virtual methods unless you can think of a really good reason not to </li>
<li>Don’t make your classes internal unless you can think of a good reason to do so (and keep in mind that we can still do whatever we want with them through reflection, and will do so if that turns out to be the best way to get something working the way we need it to if you failed to provide proper extension points) </li>
<li>Do not seal classes unless you can think of a really good reason to do so </li>
<li>Do not worry about performance up front, unless for those places where you are going out-of-process (remote services, databases, file systems, etc…) </li>
<li>Keep your classes small and focused </li>
<li>Learn about the SOLID principles, and apply them. Keep in mind that going for 100% SOLID code is typically not worth it either.&#160; Go for the 80/20 rule here. </li>
</ul>
<p>If you keep those things in mind, you will typically end up with code that is flexible to use, and easy to change.</p>
<p>Obviously, all of this assumes that you are in a position where you can go back to the code and make changes.&#160; If you’re releasing frameworks/libraries/components that will be used by a lot of people and can’t afford to break backwards compatibility, then you probably need to be more strict about these things because then you can’t always just go back to change something.&#160; I don’t think it’s a stretch to claim that most developers are not in this situation however, so most of us often don’t need to waste time thinking about those things in advance <img src='http://davybrion.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://davybrion.com/blog/2010/01/dont-strive-for-perfection/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>What Business Applications Could (Or Should) Look Like</title>
		<link>http://davybrion.com/blog/2010/01/what-business-applications-could-or-should-look-like/</link>
		<comments>http://davybrion.com/blog/2010/01/what-business-applications-could-or-should-look-like/#comments</comments>
		<pubDate>Sun, 03 Jan 2010 16:39:45 +0000</pubDate>
		<dc:creator>Davy Brion</dc:creator>
				<category><![CDATA[Opinions]]></category>
		<category><![CDATA[Silverlight]]></category>

		<guid isPermaLink="false">http://davybrion.com/blog/?p=2145</guid>
		<description><![CDATA[A lot of us develop business applications, right? Ever got tired of the same old boring and traditional user interfaces that are used for these applications?&#160; At Item Solutions we like to do things differently from what other companies are doing, and we apply that principle to our user interfaces as well.&#160; One of my [...]]]></description>
			<content:encoded><![CDATA[<p>A lot of us develop business applications, right? Ever got tired of the same old boring and traditional user interfaces that are used for these applications?&#160; At <a href="http://www.itemsolutions.com" target="_blank">Item Solutions</a> we like to do things differently from what other companies are doing, and we apply that principle to our user interfaces as well.&#160; One of my coworkers recently created a couple of screencasts of some of our Silverlight applications and i figured you might find them interesting.&#160; You’ll see that in most cases, the way the data is presented isn’t quite how most applications do it, and the way you interact with the data is often different as well.&#160; Not only is this more interesting to work on, most users actually love the user experience that these interfaces offer them.</p>
<p>Check out the movies, and if you want a bit more information on what these applications do, just <a href="http://www.itemsolutions.com/products/products2/interfaces" target="_blank">click here</a>.</p>
<p><object width="400" height="225"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=8439903&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=8439903&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="225"></embed></object></p>
<p><a href="http://vimeo.com/8439903">CRM</a> from <a href="http://vimeo.com/user2878714">itemsolutions</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<p><object width="400" height="225"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=8439918&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=8439918&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="225"></embed></object></p>
<p><a href="http://vimeo.com/8439918">Genesis</a> from <a href="http://vimeo.com/user2878714">itemsolutions</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<p><object width="400" height="225"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=8439847&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=8439847&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="225"></embed></object></p>
<p><a href="http://vimeo.com/8439847">Glance</a> from <a href="http://vimeo.com/user2878714">itemsolutions</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<p><object width="400" height="225"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=8439789&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=8439789&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="225"></embed></object></p>
<p><a href="http://vimeo.com/8439789">Emmaus</a> from <a href="http://vimeo.com/user2878714">itemsolutions</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<p><object width="400" height="225"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=8440076&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=8440076&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="225"></embed></object></p>
<p><a href="http://vimeo.com/8440076">Synergy</a> from <a href="http://vimeo.com/user2878714">itemsolutions</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<p><object width="400" height="225"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=8439937&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=8439937&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="225"></embed></object></p>
<p><a href="http://vimeo.com/8439937">Nokeos</a> from <a href="http://vimeo.com/user2878714">itemsolutions</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://davybrion.com/blog/2010/01/what-business-applications-could-or-should-look-like/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Software Patents: Our Industry&#8217;s Nuclear Weapon</title>
		<link>http://davybrion.com/blog/2009/12/software-patents-our-industrys-nuclear-weapon/</link>
		<comments>http://davybrion.com/blog/2009/12/software-patents-our-industrys-nuclear-weapon/#comments</comments>
		<pubDate>Tue, 29 Dec 2009 20:42:51 +0000</pubDate>
		<dc:creator>Davy Brion</dc:creator>
				<category><![CDATA[Opinions]]></category>

		<guid isPermaLink="false">http://davybrion.com/blog/?p=2136</guid>
		<description><![CDATA[I&#8217;m the kind of guy who believes that any attained knowledge and experience should be shared with your peers. If you come up with a great new idea, then it is in everyone&#8217;s best interest to share it with the world and let as many people as possible benefit from it. That&#8217;s probably the biggest [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m the kind of guy who believes that any attained knowledge and experience should be shared with your peers.  If you come up with a great new idea, then it is in everyone&#8217;s best interest to share it with the world and let as many people as possible benefit from it.  That&#8217;s probably the biggest reason why i love the idea of Open Source Software so much, though i&#8217;m not dogmatic about it.  Then again, a lot of people aren&#8217;t interested in what is in everyone&#8217;s best interest and are merely looking out for themselves or their shareholders.  </p>
<p>In the software development industry, many of the large corporations have been quite busy on the software patent front in the last couple of years.  Every single idea or innovation that those companies could get patented has probably been patented by now.   And for what?  What&#8217;s the large scale benefit that has come from it?  Some small companies have won patent suits against big companies.  And who benefited from that?  The consumer?  Not really.  A very large minority of people benefited from software patents on a financial level at best.  Our industry sure didn&#8217;t benefit from it.  The consumer sure as hell never benefited from it.</p>
<p>I&#8217;ve always compared software patents to nuclear weapons.  Every large country wants them, yet nobody truly wants to use them unless they have no other choice.  If a large country ever uses nuclear weapons, they know that retaliation will occur and that there is no true benefit.  In the case of nuclear weapons, once they are used everybody loses.  It&#8217;s pretty much the same thing with software patents.  Some small companies who are only interested in a quick profit will be glad to use them, but only if they know damn well that they can&#8217;t get hit with a counter-suit for patent infringements that they might have been guilty of.   But big companies?  How many of them have truly benefited from them?  The only value they&#8217;ve shown to have so far is as a defensive measure.  As in: if you sue us for patent infringement, you know damn well that we will counter sue you based on the patents that we have and that you are surely violating.  A nice example of that is the current Apple-Nokia dispute which will end up costing only Apple and Nokia money and not a single consumer is actually going to benefit from that.  The only people that will truly benefit from it are the lawyers representing both parties.  </p>
<p>So really, what&#8217;s the point in software patents?  Microsoft has amassed a boatload of patents in the past 10 years or so, and what do they have to show for it?  They lost one patent dispute which <a href="http://www.thefreelibrary.com/Word+Escapes+Microsoft+In+Patent+Dispute.-a0215143436">prevents them from selling certain version of MS Word</a> and none of the patents they hold is going to save them from that particular ruling.   In fact, can you name any situation where a big company truly benefited from a software patent they hold?  Sure, Amazon has its One-Click patent but that didn&#8217;t really prevent other e-commerce sites from offering a highly usable alternative.  I can&#8217;t really think of any other situation where a patent has really benefited a large corporation.  </p>
<p>The only people who&#8217;ve truly benefited from software patents so far have been niche companies who happened to got lucky, and lawyers representing both sides in the disputes.  That&#8217;s it.  If a small company or individual happens to have had a certain idea or implementation patented at the right time, they could simply wait long enough until they could sue a large company for infringing on their patent and watch the money come in.  The large companies (you know, the ones we buy our products from) simply add their expenses to the cost price of the products that we buy.  Does that sound fair to you?  And before you go all &#8220;we should protect individuals and small companies&#8221; on me, think very carefully on how many of those patents have been awarded in a fair manner.  I don&#8217;t really follow software patents that closely, but as a former Linux user who was concerned for some of his favorite software projects, i&#8217;ve seen my share of awarded patents where there truly was quite a bit of &#8216;prior art&#8217; that should have prevented the patent from ever being awarded in the first place.</p>
<p>The thing is&#8230; if you have a great idea and want to profit from it, then you need to market it right and provide the best possible consumer experience.  You know that countless competitors are going to copy your ideas, and most of them will do it without being guilty of infringing your worthless patent.  No matter how valuable your idea is, it doesn&#8217;t mean anything if the <em>total package</em> doesn&#8217;t entice the consumer to purchase your product over someone else&#8217;s.  So why even bother with software patents in the first place?</p>
]]></content:encoded>
			<wfw:commentRss>http://davybrion.com/blog/2009/12/software-patents-our-industrys-nuclear-weapon/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
