<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Developers Developers Developers</title>
        <link>http://ayende.com/Blog/category/466.aspx</link>
        <description>Developers Developers Developers</description>
        <language>en-US</language>
        <copyright>Ayende Rahien</copyright>
        <managingEditor>Ayende@ayende.com</managingEditor>
        <generator>Subtext Version 1.9.3.51</generator>
        <item>
            <title>The Consulting Game</title>
            <link>http://ayende.com/Blog/archive/2007/10/14/The-Consulting-Game.aspx</link>
            <description>&lt;p&gt;Casey had this to say:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;I have actually seen organisations where (in one case actually explicitly expressed, and in many where it wasn't spoken out loud) software delivered roughly meeting the requirements on how the UI worked was considered delivered. The work to make it work (usually way more work than the initial delivery) was considered 'bug fixing' and therefore was billable additinally by the IT department or outsourcer.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Which reminded me of a joke about consultants, no relation to anyone I know, etc...&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;One day the manager calls the consultant to talk about the time sheet report...&lt;/p&gt; &lt;p&gt;Manager: You charged us on Wednesday for 19 hours, but you were here for only about 9 hours on Wednesday.&lt;/p&gt; &lt;p&gt;Consultant: Well, of course. Look, it is very detailed. I was here from 9:00 to 18:00, right?&lt;/p&gt; &lt;p&gt;Manager: Right.&lt;/p&gt; &lt;p&gt;Consultant: And because we left without a good solution, I kept thinking about it in the car, and when I walked the dog. You see, it is the entries for 18:00 - 19:30 and 20:00 - 20:45. From 19:30 - 20:00 I had dinner, I didn't charge you for that.&lt;/p&gt; &lt;p&gt;Manager: Nice of you. And the other 8 hours? 22:00 - 06:00 ?&lt;/p&gt; &lt;p&gt;Consultant: Well,when I walked the dog, I finally had a vision, everything came together in a moment of brilliance, and I could see the solution in my head. All I had to do is connect some little pieces and it would work.&lt;/p&gt; &lt;p&gt;Manager: Oh, so you did an all nighter?&lt;/p&gt; &lt;p&gt;Consultant: Ha? Of course not. I went home thinking about the idea, and then I went to bed and slept on it for 8 hours.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;The above is not my modus operandi, nor am I willing to work with those who does.  This is relevant because I am not going to consider practices built in those kind of shops as important to most of the discussion about software development.&lt;/p&gt; &lt;p&gt;All that aside, how the &lt;em&gt;hell&lt;/em&gt; do you get the client to agree to pay for bug fixes? All my contracts include a 6 months guarantee for bug fixing, and most of the time they also include SLAs that says "drop whatever and get there", which is annoying as hell when this happened*. This means that I can't bill someone for bug fixes (change request are another matter, but those are for another time**), which is a great incentive to &lt;em&gt;not &lt;/em&gt;have bugs. &lt;/p&gt; &lt;p&gt;* At one time I was called, after being on the phone for about an hour, came to the client, sat for 5 minute, sent a death treat to the DBA, and left. No space on the DB hard disk, argh! They backed it to the same HD and never cleaned it up.&lt;/p&gt; &lt;p&gt;** "Oh, you wanted it to also &lt;em&gt;work&lt;/em&gt;? That wasn't in the original spec..." doesn't really fly in the real world&lt;/p&gt;&lt;img src="http://ayende.com/Blog/aggbug/9773.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ayende Rahien</dc:creator>
            <guid>http://ayende.com/Blog/archive/2007/10/14/The-Consulting-Game.aspx</guid>
            <pubDate>Sun, 14 Oct 2007 08:00:04 GMT</pubDate>
            <comments>http://ayende.com/Blog/archive/2007/10/14/The-Consulting-Game.aspx#feedback</comments>
            <slash:comments>4</slash:comments>
            <wfw:commentRss>http://ayende.com/Blog/comments/commentRss/9773.aspx</wfw:commentRss>
        </item>
        <item>
            <title>People over Code</title>
            <link>http://ayende.com/Blog/archive/2007/06/18/People-over-Code.aspx</link>
            <description>&lt;p&gt;While there is value in the item on the right, I value the item on the left more.  &lt;/p&gt;
&lt;p&gt;This is in response to a &lt;a href="http://ayende.com/Blog/archive/2007/06/17/9473.aspx#16750"&gt;comment&lt;/a&gt; by Jdn, I started to comment in reply, and then I reconsidered, this is much more important. A bit of background. &lt;a href="http://www.webgambit.com/"&gt;Karthik&lt;/a&gt; has &lt;a href="http://ayende.com/Blog/archive/2007/06/17/9473.aspx#16747"&gt;commented&lt;/a&gt; that "Unfortunately too often many software managers fall into the trap of thinking that developers are "plug and play" in a project and assume they can be added/removed as needed." and proceeded with some discussion on why this is and how it can be avoided. &lt;/p&gt;
&lt;p&gt;I responded to that by saying that I wouldn't really wish to work with or for such a place, to be precise, here is what I said: &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I would assert that any place that treats their employee in such a fashion is not a place that I would like to work for or with.&lt;br /&gt;
When I was in the army, the _ultimate_ place for plug &amp;amp; play mentality, there was a significant emphasis on making soldiers happy, and a true understanding of what it was to have a good soldier serving with you. Those are rare, and people fight over them.&lt;br /&gt;
To suggest that you can replace one person with another, even given they have the same training is ludicrous&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;From personal experience, when I was the Executive Officer of the prison, the prison Commander has shamelessly stole my best man when I was away at a course, causing quite a problem for me (unfortunately not something that you can just plug &amp;amp; play). That &lt;em&gt;hurt&lt;/em&gt;, and it took about six months to get someone to do the job right, and even then, the guy wasn't on the same level. (And yes, this had &lt;em&gt;nothing&lt;/em&gt; to do with computers, programming, or the like.) &lt;/p&gt;
&lt;p&gt;Now, to Jdn's comment: &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In a perverse way, I can see, from the perspective of a business, why having good/great developers, who bring in advanced programming techniques, can be a business risk.&lt;br /&gt;
[...snip...] you have to view all employees as being replaceable, because the good/great ones will always have better opportunities (even if they are not actively looking), and turnover for whatever reason is the norm not the exception.&lt;br /&gt;
Suppose you are a business with an established software 'inventory', and suppose it isn't the greatest in the world. But it gets the job done, more or less. Suppose an Ayende-level developer comes in and wants to change things.  We already know he is a risk because he says things like:&lt;br /&gt;
"not a place that I would like to work for or with."&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If you view me as replaceable, I will certainly have an incentive to moving to somewhere where I wouldn't be just another code monkey. Bad code bothers me, I try to fix that, but that is rarely a reason to change a workplace. I like challenges. And there are few things more interesting than a colleague's face after a masterfully done shift+delete combination. &lt;br /&gt;
What I meant with that is that I wouldn't want to work for a place that thought of me and my co-workers as cogs in a machine, to be purchased by the dozen and treated as expendable.  &lt;/p&gt;
&lt;p&gt;You know what the most effective way to get good people? Treating them well, appreciating their work and making them happy. If a person &lt;em&gt;like&lt;/em&gt; what they are doing, and they like where they are doing it, there would need to be a &lt;em&gt;serious&lt;/em&gt; incentive to moving away. A good manager will ensure that they are getting good people, and they will ensure that they will keep them. &lt;em&gt;That&lt;/em&gt; is their job.  &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Mediocre code that can be maintained by a wider pool of developers is in a certain respect more valuable to a business than having great code that can only be maintained by a significantly smaller subset of developers.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;At a greater cost over the life time of the project. If you want to speak in numbers the MBAs will understand, you are going to have far higher TCO because you refuse to make the initial investment. &lt;/p&gt;
&lt;p&gt;To quote Mark Miller, you can get more done, faster, if you have good initial architecture and overall better approach to software.  &lt;/p&gt;
&lt;p&gt;Jdn's concludes with a good approach: &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I'm offering services for clients.  I can't disrupt their business because I don't think their code is pretty enough.&lt;br /&gt;
What I can do better, going forward, is learn to make the incremental changes that gets them on their way to prettier code.  My attitude is *not* "well, I can't do anything so I won't even try."&lt;br /&gt;
But at the end of the day, I have to do what is best for the *client*.  If that means typed datasets (picking on them, but include anything you personally cringe over), then I can partial class and override to make them better, but typed datasets it will be.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I would probably be more radical about the way that I would go about it, but the general approach is very similar, especially when you have an existing code base or architecture in place. &lt;/p&gt;&lt;img src="http://ayende.com/Blog/aggbug/9475.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ayende Rahien</dc:creator>
            <guid>http://ayende.com/Blog/archive/2007/06/18/People-over-Code.aspx</guid>
            <pubDate>Sun, 17 Jun 2007 22:30:03 GMT</pubDate>
            <comments>http://ayende.com/Blog/archive/2007/06/18/People-over-Code.aspx#feedback</comments>
            <slash:comments>7</slash:comments>
            <wfw:commentRss>http://ayende.com/Blog/comments/commentRss/9475.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Are Designers, Wizards, etc. inherently Bad?</title>
            <link>http://ayende.com/Blog/archive/2007/06/14/Are-Designers-Wizards-etc.-inherently-Bad.aspx</link>
            <description>&lt;p&gt;&lt;a href="http://www.blogcoward.com/"&gt;Jdn&lt;/a&gt; has a good post that I recommend that you read about &lt;a href="http://www.blogcoward.com/archive/2007/06/13/27.aspx"&gt;Novices, Sheep and Morts&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;My feeling about designers, etc is that they are most certainly no inherently bad, they can be extremely valuable to get me someplace quickly. I do think that a lot of the designers, etc in use today are bad, because they produce unmaintainable code. Hell, WCF proxy generator is a good example of one, it doesn't recognize the common binding settings, always producing custom binding. It is much easier from the developer point of view, much harder from the user point of view.&lt;/p&gt; &lt;p&gt;My objection is for dumbed-down tools, not for the existence of the tools. I don't think that it is a good business decision to make use of those for anything but a demo, and I believe that I can, with the use of good framework and maintainable practices, get faster velocity than anyone using the wizards for most kinds of applications. This include the forms over data approach, by the way. &amp;lt;% EditForm(Table: Customers) %&amp;gt; is faster than doing dragging a table to the page.&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;A *large* number of applications have a clear set of requirements, and they won't be extended in the future.  You need to handle the requirements that the business users require right now.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;If an application takes less than a man month to write, you are going to need to maintain it, simply because it is not sustainable to keep adding features to such an application without changing things. Doing it in a way that help maintenance is valuable, even if the application is not going to be significantly extended later on. Fixing bugs, working with the code, etc are all much easier when you write with maintainability in mind. And it is not as if maintainability is some painful tax that you have suddenly acquired, it is simply what happens when you write good code.&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;And it is *unarguable* that it is easier to use, say, the ObjectDataSource, to accomplish this than to do MVP/MPC.  There is *no* argument against this.  None. &lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Ha? I would certainly argue that. Just try doing anything remotely interesting with the ODS and you will see my point. The ODS is just a way to call a method to get a data source, and it has such wonder methods that pass me IDictionary of parameters, and expect me to do something with it. That may be good for tabular data, but I don't have that.&lt;/p&gt; &lt;blockquote dir="ltr" style="margin-right: 0px"&gt; &lt;p&gt;It is unarguably easier to use a wizard or designer to design the vast majority of applications that are used by businesses around the world. &lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Again, I would certainly argue that. Because you ignore the part that happens after you generated the grid or the form, where you now need to do all the tweaks that the client want (debt rows should be yellow, big debt rows should be red, late returns are marked with an icon, give me row level security and column level filtering, etc).&lt;/p&gt; &lt;blockquote dir="ltr" style="margin-right: 0px"&gt; &lt;p&gt;The code that is produced by using designers, wizards, etc. is more easily maintained by people who aren't alpha-geeks.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Here is something that I can't really understand. If alpha geeks can't maintain this code, why would others be able to do so? Unmaintainable is just it. And I have worked on creative solutions to a lot of technical problems that stemmed from the fact that I wanted to do it the RAD way, and have came to regret it.&lt;/p&gt;&lt;img src="http://ayende.com/Blog/aggbug/9462.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ayende Rahien</dc:creator>
            <guid>http://ayende.com/Blog/archive/2007/06/14/Are-Designers-Wizards-etc.-inherently-Bad.aspx</guid>
            <pubDate>Thu, 14 Jun 2007 04:52:00 GMT</pubDate>
            <comments>http://ayende.com/Blog/archive/2007/06/14/Are-Designers-Wizards-etc.-inherently-Bad.aspx#feedback</comments>
            <slash:comments>12</slash:comments>
            <wfw:commentRss>http://ayende.com/Blog/comments/commentRss/9462.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Effective Software Development or Policing Of Monkeys</title>
            <link>http://ayende.com/Blog/archive/2007/06/02/Effective-Software-Development-or-Policing-Of-Monkeys.aspx</link>
            <description>&lt;p&gt;Jeff Atwood is &lt;a href="http://www.codinghorror.com/blog/archives/000864.html"&gt;talking&lt;/a&gt; about why background compilation is part of a culture of code monkeys and that we should accept it and get on with the program:&lt;/p&gt; &lt;div style="border-right: rgb(153,153,153) 1px solid; padding-right: 4px; border-top: rgb(153,153,153) 1px solid; padding-left: 4px; padding-bottom: 4px; border-left: rgb(153,153,153) 1px solid; width: 100%; padding-top: 4px; border-bottom: rgb(153,153,153) 1px solid; background-color: rgb(255,255,225)"&gt;You could throw &lt;a href="http://en.wikipedia.org/wiki/Emacs"&gt;emacs&lt;/a&gt; and volumes 1-5 of &lt;a href="http://www-cs-faculty.stanford.edu/~knuth/taocp.html"&gt;The Art of Programming&lt;/a&gt; at your development team. Or you can buy them the best, most advanced development tools on the market. Which approach do you think will be more effective?&lt;/div&gt; &lt;p&gt;One of the problems with the army of monkeys approach that everyone seems to ignore is that treating someone like a monkey will get you monkey-like responses. We have a problem of escelating complexity in software, and trying to solve it by serregating the problems to the "Smart Dudes" and the "Monkeys" is not really helping. We are not writing Hello World applications any more.&lt;/p&gt; &lt;p&gt;I had the chance to try to port a monkey's code from one langauge to the other, and I couldn't make sense of it. You can imagine at what stage I had to throw up my hands and seek that monkey out to have it explain to me what the hell is going on in the code. It was 2 months old code, and the monkey couldn't do it. The magic numbers in the code were what the monkey was told to write, the logic constructs in the code were what the monkey was told to write. The bugs were the monkey's own fault, I assume, but it may very well be the case that the monkey was instructed to put them in as well.&lt;/p&gt; &lt;p&gt;Trying to get a good product out of an army of monkeys requires constant policing, lest they do something stupid. Software is such a complex beast that have a monkey anywhere in the process will put a serious risk to the project at large. Some of the stuff that I have seen:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Using a public static bool g_IsUserAuthenticated;  &lt;/li&gt;&lt;li&gt;Subscribing each page to a global &amp;amp; static event handler.  &lt;/li&gt;&lt;li&gt;String concentration for query building (using the safeForSQL() method, of course) &lt;/li&gt;&lt;li&gt;The single user only web applications &lt;/li&gt;&lt;li&gt;For more references, check the Daily WTF&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Each of those share a single trait, this is a single stupid thing that had a &lt;em&gt;drastic&lt;/em&gt; affect on the entire application. &lt;/p&gt; &lt;p&gt;In the case of the static event handler, it took about two days to see the effects properly, at which point the application crushed with OOM errors. That was &lt;em&gt;fun &lt;/em&gt;to find out.&lt;/p&gt; &lt;p&gt;Armies of monkeys simply doesn't scale, a monkey can't handle complexity well, so you end up dumbing the environment to the level of the monkey, therefor, you are reducing your ability to make any sort of change and maintainability is a nightmare.&lt;/p&gt; &lt;p&gt;So, Jeff, I do agree with you that there is this cult of monkeys, I do &lt;strong&gt;not&lt;/strong&gt; agree that we should agree to this.&lt;/p&gt;&lt;img src="http://ayende.com/Blog/aggbug/9381.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ayende Rahien</dc:creator>
            <guid>http://ayende.com/Blog/archive/2007/06/02/Effective-Software-Development-or-Policing-Of-Monkeys.aspx</guid>
            <pubDate>Sat, 02 Jun 2007 09:12:57 GMT</pubDate>
            <comments>http://ayende.com/Blog/archive/2007/06/02/Effective-Software-Development-or-Policing-Of-Monkeys.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://ayende.com/Blog/comments/commentRss/9381.aspx</wfw:commentRss>
        </item>
        <item>
            <title>An Open Letter to Scott Guthrie</title>
            <link>http://ayende.com/Blog/archive/2007/03/22/An-Open-Letter-to-Scott-Guthrie.aspx</link>
            <description>&lt;div style="BORDER-RIGHT: #999999 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: #999999 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; BORDER-LEFT: #999999 1px solid; WIDTH: 100%; PADDING-TOP: 4px; BORDER-BOTTOM: #999999 1px solid; BACKGROUND-COLOR: #ffffe1"&gt;Speaking and working with developers who live daily with your tools, I find confusion and concern over your relationship to the open source community that has grown up around the .Net platform. While Sun, IBM, other platform providers, and ISVs clearly see the open source community as a complimentary codebase to their products, Microsoft tends to use the best and brightest work from the community space as a feature map for .Net.&lt;/div&gt;&lt;p&gt;    &lt;a href="http://elegantcode.com/?p=539"&gt;See the full post&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;    (Via &lt;a href="http://hammett.castleproject.org/?p=136"&gt;Hammet&lt;/a&gt;)&lt;/p&gt;&lt;img src="http://ayende.com/Blog/aggbug/9143.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ayende Rahien</dc:creator>
            <guid>http://ayende.com/Blog/archive/2007/03/22/An-Open-Letter-to-Scott-Guthrie.aspx</guid>
            <pubDate>Thu, 22 Mar 2007 20:28:41 GMT</pubDate>
            <comments>http://ayende.com/Blog/archive/2007/03/22/An-Open-Letter-to-Scott-Guthrie.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://ayende.com/Blog/comments/commentRss/9143.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Darl: The Data Entry Developer</title>
            <link>http://ayende.com/Blog/archive/2007/03/16/Darl-The-Data-Entry-Developer.aspx</link>
            <description>&lt;p&gt;    &lt;a href="http://codebetter.com/blogs/jeremy.miller/"&gt;Jeremy Millier&lt;/a&gt; is brining up a pain point to me &lt;a href="http://codebetter.com/blogs/jeremy.miller/archive/2007/03/15/MVP-Summit_3A00_--Those-untrustworthy-developers.aspx"&gt;here&lt;/a&gt;. I see quite a lot of people who treat developers as data entry guys for the Architect perfect design. It gets to the point where people argue with me (vehemently) that this or that features should &lt;em&gt;abosuletly &lt;/em&gt;be removed, because it is too complex for Darl, their developer stero-type.&lt;/p&gt;&lt;div style="BORDER-RIGHT: #999999 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: #999999 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; BORDER-LEFT: #999999 1px solid; WIDTH: 100%; PADDING-TOP: 4px; BORDER-BOTTOM: #999999 1px solid; BACKGROUND-COLOR: #ffffe1"&gt;    &lt;p&gt;        Darl is a nice guy, he got into the business a few months to a year ago, although I have seen Darls with quite a few years of experiance under their belts. He may have a CS degree, but that doesn't mean he can pass the FizzBuzz test. Darl best friend is the designer, and he is completely lost without it. He may be completely lost &lt;em&gt;with&lt;/em&gt; the designer. Design and architecture are mystic concepts to Darl, they are handed from above, and are to followed religiously. Darl doesn't understand the business problems he is working on, nor can he understand the technology he uses. He was told: "Call this method with this parameter, and don't forget to use Try-Catch".     &lt;/p&gt;    &lt;p&gt;        Darl should aspire to be a Mort, but he doesn't even know that such a creature exists. The last time that Darl has opened a technical book/article was cramming before an exam. He gets all the required information from the team lead or the architect, in the five minutes they have going back from lunch.    &lt;/p&gt;&lt;/div&gt;&lt;p&gt;    It doesn't take much to move away from the Darl arch-type. But is seems to me that this is something that a lot of business do not want or not willing to change. On the contrary, they would like to get more of them, and then they get tools that have "No Code Required" stamp on them, and expect to get results.&lt;/p&gt;&lt;p&gt;    I have a junior developer working with me at the moment, my biggest pain point with him? He isn't lazy enough. It is something that I am working at right now, making sure that he will understand that Lazy is Good(TM). &lt;/p&gt;&lt;p&gt;    Yesterday I spent two hours pairing with another developer, going over everything that we needed to setup the current project. This meant that I had went over the build process target by target, explaining its use, and showing how to deploy, we created a new project and setup everything from a database to the configuration file so we could get build the [ActiveRecord] class and going over the various database inheritance implementation scenarios and what the trade-offs.&lt;/p&gt;&lt;p&gt;    The easiest way to work with good developers is to invest in them and help them grow. &lt;/p&gt;&lt;img src="http://ayende.com/Blog/aggbug/9115.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ayende Rahien</dc:creator>
            <guid>http://ayende.com/Blog/archive/2007/03/16/Darl-The-Data-Entry-Developer.aspx</guid>
            <pubDate>Fri, 16 Mar 2007 10:18:09 GMT</pubDate>
            <comments>http://ayende.com/Blog/archive/2007/03/16/Darl-The-Data-Entry-Developer.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://ayende.com/Blog/comments/commentRss/9115.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Specialization Is For Insects</title>
            <link>http://ayende.com/Blog/archive/2007/03/11/Specialization-Is-For-Insects.aspx</link>
            <description>&lt;p&gt;    &lt;a href="http://www.lhotka.net/weblog/"&gt;Rocky Lhotka&lt;/a&gt; paints a &lt;a href="http://www.lhotka.net/weblog/SpecializationTheFutureOfOurIndustry.aspx"&gt;grim picture&lt;/a&gt; of our industry 20 years from now:&lt;/p&gt;&lt;div style="BORDER-RIGHT: #999999 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: #999999 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; BORDER-LEFT: #999999 1px solid; WIDTH: 100%; PADDING-TOP: 4px; BORDER-BOTTOM: #999999 1px solid; BACKGROUND-COLOR: #ffffe1"&gt;“Developers” employed in corporate settings become general practitioners: people who know a little about a lot, and pretty much nothing about anything. Their role is primarily to take a guess about the issue and refer the customer to a specialist.&lt;/div&gt;&lt;p&gt;    As you can probably guess from the title, I don't agree. Rocky makes a good point, but I simply do not agree with his prediction.&lt;/p&gt;&lt;p&gt;    I have not a clue about how SQL Server Tabular Data Stream work, nor do I have any interest in it. That doesn't mean that I need to find a SQL guru to do my databases. Or understand what goes on the bus when I am drawing an image using GDI+. The whole &lt;em&gt;point&lt;/em&gt; of abstracting away the underlying layers is to let me focus on doing what I want without getting distracted by the implementation details.&lt;/p&gt;&lt;p&gt;    I am one of those that like to have a good understanding on what is going on under the hood, mainly because I am also one of those that keep running into problems because of this stuff. Nevertheless, quite a bit of it &lt;em&gt;Just Works&lt;/em&gt;. And unlike the medical field, which is what Rocky compare the devs into (at least it is not construction again :-)), we can move into new areas relatively safely.&lt;/p&gt;&lt;p&gt;    There is a place for specialists, certainly. If my database is running slow, and I can't figure out why, I'll call up a SQL guru to point out where I am being stupid. But, that is not something that I would need on a general basis. I expect developers to know a lot, about a wide variety of subjects, but I don't expect them to be &lt;em&gt;experts&lt;/em&gt; in all those fields. They need to have a good understanding of what they are doing in any field they are going to spend significant amount of time on, and they should definately have at least one or two areas of expertise where they excel. &lt;/p&gt;&lt;p&gt;    I expect to see a lot more work going into building non leaky abstractions in the future, and I think that we are getting better and better at it. Furthermore, I believe we will see a lot more emphasis on Not Surprising The Developer. I fully expect being able to get a new framework, read the overall idea and be &lt;em&gt;productive&lt;/em&gt; in a matter of a day or two. If I am not, then the fault is with the framework, period. This means good naming convention, discoverability and googlability, among other important attributes.&lt;/p&gt;&lt;p&gt;    In short, technology scale better than people, so I expect technology to fill the gaps. The alternative that Rocky suggest doesn't hold water, in my opinion. If I need to hire a whole bunch of consultants at 250$/hour just to get a BuzzwardTechnology working for my forms over data scenario, I'll simply stick with what I have now. BuzzwardTechnology be damned!&lt;/p&gt;&lt;p&gt;    Technology doesn't exists for the sake of technology alone, it exists to answer some sort of a business need, and if it can't handle that, it wouldn't succeed. Handling that, by defination, means that I can get my money's value back. &lt;/p&gt;&lt;img src="http://ayende.com/Blog/aggbug/9098.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ayende Rahien</dc:creator>
            <guid>http://ayende.com/Blog/archive/2007/03/11/Specialization-Is-For-Insects.aspx</guid>
            <pubDate>Sun, 11 Mar 2007 07:27:25 GMT</pubDate>
            <comments>http://ayende.com/Blog/archive/2007/03/11/Specialization-Is-For-Insects.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://ayende.com/Blog/comments/commentRss/9098.aspx</wfw:commentRss>
        </item>
        <item>
            <title>It will do what you want in version 4.0...</title>
            <link>http://ayende.com/Blog/archive/2007/03/09/It-will-do-what-you-want-in-version-4.0.aspx</link>
            <description>&lt;p&gt;    But still start using it now. Another reply to Adi, this time a &lt;a href="http://dotmad.blogspot.com/2007/03/not-religion-but-strategy-take-2.html"&gt;new post&lt;/a&gt; in which he clarifies what he meant before. The main idea is that Microsoft's products get a big mindshare regardless of their relative qualities. I do not doubt that this is true, a lot of people goes for Microsoft &lt;em&gt;because&lt;/em&gt; it is Microsoft. Expecting that this will pay off in the future is still the wrong thing to do.&lt;/p&gt;&lt;p&gt;    I am one of those that would move to a new technology just because it gives me a tiny bit more, if it preserves everything that I can do in my current technologies. I am now using MsBuild in favor of Nant, because I can get the build script and the VS project to match (and yes, I know I can call msbuild from Nant). I moved to NUnit from MbUnit and back again, for much the same reasons. &lt;/p&gt;&lt;p&gt;    But if it doesn't improve, why bother?  Adi brings up a couple of examples:&lt;/p&gt;&lt;div style="BORDER-RIGHT: #999999 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: #999999 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; BORDER-LEFT: #999999 1px solid; WIDTH: 100%; PADDING-TOP: 4px; BORDER-BOTTOM: #999999 1px solid; BACKGROUND-COLOR: #ffffe1"&gt;Team system is relatively new, but I bet in while more people will be doing unit tests using it, and not NUnit, even if NUnit is &lt;a href="http://nunit.com/blogs/?p=19"&gt;better&lt;/a&gt;.&lt;/div&gt;&lt;p&gt;    I will refuse to use MS Test until:&lt;/p&gt;&lt;ul&gt;    &lt;li&gt;        It has a performance on par with NUnit/MbUnit - currently aroudn 30% slower, clock time.&lt;/li&gt;    &lt;li&gt;        It support the &lt;em&gt;very basic&lt;/em&gt; of test patterns, Abstract Test Class.&lt;/li&gt;    &lt;li&gt;        It can be run as part of the build without jumping through hops.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;    There are people that would use MS Test instead of using NUnit, I am sure, although you don't here about it almost at all. They make compromises because they are using Microsoft, compromises that I am not willing to make.&lt;/p&gt;&lt;div style="BORDER-RIGHT: #999999 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: #999999 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; BORDER-LEFT: #999999 1px solid; WIDTH: 100%; PADDING-TOP: 4px; BORDER-BOTTOM: #999999 1px solid; BACKGROUND-COLOR: #ffffe1"&gt;Once Linq is out, I think the same would be true regarding NHibernate.&lt;/div&gt;&lt;p&gt;    Linq is an extention to the language, not a technology. Assuming that Adi is talking about one of the ORM technologies from Microsoft, I do not think that I can argue that this is the case, only that I do not think that this is something that is done with planning and foresight. Just to point out, &lt;em&gt;no one&lt;/em&gt; answered to my &lt;a href="http://www.ayende.com/Blog/archive/7018.aspx"&gt;Linq challange&lt;/a&gt; yet, and I have no idea if this is even possible.&lt;/p&gt;&lt;div style="BORDER-RIGHT: #999999 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: #999999 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; BORDER-LEFT: #999999 1px solid; WIDTH: 100%; PADDING-TOP: 4px; BORDER-BOTTOM: #999999 1px solid; BACKGROUND-COLOR: #ffffe1"&gt;I wrote about the wonder MS did releasing C# and conquering a big chunk of the market, and Oren reply was "&lt;em&gt;Just to point out, another company did, Sun &amp;amp; Java&lt;/em&gt;". But Sun introduces something &lt;strong&gt;new&lt;/strong&gt; to the world with Java, while that was not the case with C#.&lt;/div&gt;&lt;p&gt;    I started doing C# when I was mostly building Windows applications. The only good story at the time was VB or C++. If you wanted to use Java you could, if you &lt;em&gt;really&lt;/em&gt; liked laying stuff out in code, and then running it to see what you wanted. Java was never very strong on the client. C# came to replace a market that was dying for a replacement, which is why it caught such a big audiance in such a short time. If Sun had its act together in 95-00, it could have made Java the prevasive technology everywhere. &lt;/p&gt;&lt;div style="BORDER-RIGHT: #999999 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: #999999 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; BORDER-LEFT: #999999 1px solid; WIDTH: 100%; PADDING-TOP: 4px; BORDER-BOTTOM: #999999 1px solid; BACKGROUND-COLOR: #ffffe1"&gt;That leads me to the strategy part - MS related technology is a good bet because you can be sure most of the market will use it.&lt;/div&gt;&lt;p&gt;    I would really love to compete on a technology level with someone that is buying completely into this approach. I can do &lt;strong&gt;better&lt;/strong&gt; than most of the market by using the best tools for the job. Limiting myself to Microsoft tools is limiting myself to the level that Microsoft believes most programmers should be.&lt;/p&gt;&lt;p&gt;    I once had to resort to runtime code generation in order to &lt;em&gt;sort a grid view. &lt;/em&gt;It is complex, yes, but it meant that I had sorting working for all the grids in the application, for the cost of half a day, while the upstream team wrote custom code per grid per page, because that is how they were told it should work.&lt;/p&gt;&lt;p&gt;    Going with MS related technology &lt;em&gt;blindly&lt;/em&gt; is not a good thing at all. It is not a strategy, it is herd thinking. It is the old argument about: "No one was fired for choosing Microsoft".&lt;/p&gt;&lt;img src="http://ayende.com/Blog/aggbug/9088.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ayende Rahien</dc:creator>
            <guid>http://ayende.com/Blog/archive/2007/03/09/It-will-do-what-you-want-in-version-4.0.aspx</guid>
            <pubDate>Fri, 09 Mar 2007 12:01:21 GMT</pubDate>
            <comments>http://ayende.com/Blog/archive/2007/03/09/It-will-do-what-you-want-in-version-4.0.aspx#feedback</comments>
            <slash:comments>9</slash:comments>
            <wfw:commentRss>http://ayende.com/Blog/comments/commentRss/9088.aspx</wfw:commentRss>
        </item>
        <item>
            <title>How to grow a development team?</title>
            <link>http://ayende.com/Blog/archive/2007/03/08/How-to-grow-a-development-team.aspx</link>
            <description>&lt;p&gt;    &lt;a href="http://blogs.meetandplay.com/WPierce/archive/2007/03/08/Growing_the_Development_Team.aspx"&gt;Bill is asking &lt;/a&gt;how he can improve the work process of his team. The worst thing in his tale (aside from 1,500 lines of code in a set accessor!) is that there isn't somebody that is in charge for the team, at least not someone who is technical. Unless a person is in a position of authority (preferably well established, rather than ad-hoc one), making significant changes is difficult.&lt;/p&gt;&lt;p&gt;    I get a lot of milage from giving the client a link to the continious integration machine. They check to see what progress we made routinely, and the most common request I hear from them is to make the CI build more stable. (The answer to that is to give me a staging machine, but that is another story).&lt;/p&gt;&lt;p&gt;    Doing something like this can prove to the stake holders that it is possibl deliver something that they desire, therefor, they will back the requirements when demands are made. In this situations, hiring the boss can be an interesting approach, go look for someone that you really admire, and then convince them to come work as the team leader /architect. Other ways include bringing in a coach, or sending the team to training. &lt;/p&gt;&lt;p&gt;    All of the above assume that there is some sort of backup from above. If this is not possible, then support from the team members is crucial. From Bill's post, it doesn't sound like the other members of the teams are interested, but this may be because it wasn't presented in the right manner. It is very easy to give advice about people I never knew, but broadly:&lt;/p&gt;&lt;ul&gt;    &lt;li&gt;        Show Mort how he can be more productive using smarter tools     &lt;/li&gt;    &lt;li&gt;        Pair with Jade to get stuff done.     &lt;/li&gt;    &lt;li&gt;        Challange the Primadona to a duel at sunrise.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;    More seriously, since Jade is apperantly the most experiance guy in Bill's shop, a good way to start would be to sit with him and try to work incremental improvements. "For the next month, we are putting in continious integration system, month after that, we start working on our design debt, etc". Define a certain level of quality that you will not go beneath. When two developers are collaborating, it should be easier to guide Mort into the fold. To begin with, the Primadona can be ignored, but once stuff started to roll, and the Primadona breaks it, &lt;em&gt;take his code out out&lt;/em&gt;. I have reverted changes that broke unit tests in the past, much to the angst of a developer who didn't consider what would happen when I come in to a broken build with no idea what had happened. &lt;/p&gt;&lt;p&gt;    Failing all of that, starting to carry a 5Kg hammer and speaking softly always worked for me.&lt;/p&gt;&lt;p&gt;    Bill also mentions:&lt;/p&gt;&lt;div style="BORDER-RIGHT: #999999 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: #999999 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; BORDER-LEFT: #999999 1px solid; WIDTH: 100%; PADDING-TOP: 4px; BORDER-BOTTOM: #999999 1px solid; BACKGROUND-COLOR: #ffffe1"&gt;I don't want to stand up and spend 30 minutes giving a presentation on IoC and separation of concerns. &lt;/div&gt;&lt;p&gt;    Bill, if you are really serious about that, get another job. To start with, you will need to educate the rest of the team about what is happening. They need to be able to go to your code and &lt;em&gt;understand&lt;/em&gt; what is going on. If you aren't talking at the same level, this is a problem. And you are the guy to fix it.&lt;/p&gt;&lt;img src="http://ayende.com/Blog/aggbug/9085.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ayende Rahien</dc:creator>
            <guid>http://ayende.com/Blog/archive/2007/03/08/How-to-grow-a-development-team.aspx</guid>
            <pubDate>Thu, 08 Mar 2007 21:57:38 GMT</pubDate>
            <comments>http://ayende.com/Blog/archive/2007/03/08/How-to-grow-a-development-team.aspx#feedback</comments>
            <slash:comments>5</slash:comments>
            <wfw:commentRss>http://ayende.com/Blog/comments/commentRss/9085.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Customers don't want cutting-edge stuff</title>
            <link>http://ayende.com/Blog/archive/2007/03/08/Customers-dont-want-cuttingedge-stuff.aspx</link>
            <description>&lt;p&gt;    But they still want cutting edge results...&lt;/p&gt;
&lt;p&gt;    &lt;a href="http://dotmad.blogspot.com/"&gt;Adi&lt;/a&gt; had &lt;a href="http://dotmad.blogspot.com/2007/03/customers-dont-want-cutting-edge-stuff.html"&gt;posted&lt;/a&gt; about my recent series of posts about getting the best tools for the job.&lt;/p&gt;
&lt;div style="border: 1px solid rgb(153, 153, 153); padding: 4px; width: 100%; background-color: rgb(255, 255, 225);"&gt;Since I don't have the details I can only guess, but supposing Oren offered to use tools such as MonoRail, Castle and NHibernate (I'm just throwing buzzwords around) and the people from that company preferred custom code, does that make them stupid?&lt;/div&gt;
&lt;p&gt;    Guilty as charged about the suggested. I argued that that we can get better productivity and higher quality, at the cost of having to train developers that we pick off the street. Adi think that I am overlooking the cost here:&lt;/p&gt;
&lt;div style="border: 1px solid rgb(153, 153, 153); padding: 4px; width: 100%; background-color: rgb(255, 255, 225);"&gt;I'm not so sure about that. Oren may be able to learn new technologies quickly when he needs them, but no every developer is the same, so training may become a huge drain on the project.&lt;/div&gt;
&lt;p&gt;    I would like to refer to this &lt;a href="http://www.ayende.com/Blog/archive/7615.aspx"&gt;post&lt;/a&gt; for backup. There is a tremendous amount of effort already invested in the tools. This means that I wouldn't have to build it myself in order to get the functionality that I need. Hell, something as simple* as MonoRail's [DataBind] can &lt;em&gt;drastically&lt;/em&gt; reduce the amount of code that you need to write and maintain.&lt;/p&gt;
&lt;p&gt;    At the end, the job has to be done, and insisting on trying to do it via custom code is simply NIH. There are cases where I say that whatever exists out there is not going to work for this scenario, and I roll everything from scratch, but to get to the point where the official policy is "either Microsoft or hand-written stuff, nothing else" - which was an actual statement made by a client to me is a &lt;em&gt;long &lt;/em&gt;shot.&lt;/p&gt;
&lt;p&gt;    About training, I do not think that it is too much to invest three days to a week in giving a new guy a chance to learn all the stuff that you are using. I had to bring in three new developers into my projects, none of them had any previous encounters with any of the technologies that we are using. All became productive in a very short time, one of them is exteremely annoying in managing to find the &lt;em&gt;wierdest&lt;/em&gt; corner cases in NHibernate. They are all good developers, but I never even thought to ask them about whatever they knew about any of the stuff that we were using.&lt;/p&gt;
&lt;p&gt;    As an aside, I keep talking about the first steps of interviews, because I stop so many interviews there, but one of the things that I do in an interview is find out what the candidate doesn't know, and have them write something trivial with that technology. For instance, one candidate didn't know GDI, so I asked him to draw a line on the screen.&lt;/p&gt;
&lt;p&gt;    One of the worst candidates that I interviewed was someone that actually had NHibernate experiance, he was one of those that could &lt;span style="font-weight: bold;"&gt;not &lt;/span&gt;reverse a string...&lt;/p&gt;
&lt;p&gt;    * Simple is defined in terms of usage, not implementation, the data binder is certainly not simple. &lt;/p&gt;&lt;img src="http://ayende.com/Blog/aggbug/9075.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ayende Rahien</dc:creator>
            <guid>http://ayende.com/Blog/archive/2007/03/08/Customers-dont-want-cuttingedge-stuff.aspx</guid>
            <pubDate>Wed, 07 Mar 2007 22:00:41 GMT</pubDate>
            <comments>http://ayende.com/Blog/archive/2007/03/08/Customers-dont-want-cuttingedge-stuff.aspx#feedback</comments>
            <slash:comments>9</slash:comments>
            <wfw:commentRss>http://ayende.com/Blog/comments/commentRss/9075.aspx</wfw:commentRss>
        </item>
    </channel>
</rss>