<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-3114382043962780956</atom:id><lastBuildDate>Sat, 14 Sep 2024 17:01:32 +0000</lastBuildDate><category>debugging</category><category>engineers</category><category>presentations</category><category>Microsoft</category><category>streamofconsciousness</category><category>CINNUG</category><category>CONDG</category><category>CONDG debug</category><category>DDD</category><category>LINQ</category><category>POCO</category><category>UX</category><category>arcready</category><category>codemash</category><category>jeff blankenburg</category><category>josh holmes</category><category>lambda</category><category>mobile</category><category>movies</category><category>nvidia</category><category>performance</category><category>quality</category><category>rock band</category><category>specification</category><category>support</category><category>swe101 presentations</category><category>tech tools</category><title>#pragma-tech</title><description>There are *no* silver bullets. Only hollow points...</description><link>http://pragma-tech.blogspot.com/</link><managingEditor>noreply@blogger.com (Scott Walker)</managingEditor><generator>Blogger</generator><openSearch:totalResults>30</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3114382043962780956.post-7394933759242687006</guid><pubDate>Mon, 20 Sep 2010 18:58:00 +0000</pubDate><atom:updated>2010-09-20T15:01:03.336-04:00</atom:updated><title>Moving On</title><description>Not that many people probably read this blog (which is no fault but my own) but for anyone that still does I thought I&#39;d let you know that I&#39;m moving on. &lt;br /&gt;&lt;br /&gt;You see I&#39;m starting my own Rails firm called &lt;a href=&quot;http://www.protectedmethod.com&quot;&gt;ProtectedMethod&lt;/a&gt; here in Columbus. Therefore any future blog posts I write will be posted on the company blog &lt;a href=&quot;http://www.protectedmethod.com/blog&quot;&gt;here&lt;/a&gt;.</description><link>http://pragma-tech.blogspot.com/2010/09/moving-on.html</link><author>noreply@blogger.com (Scott Walker)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3114382043962780956.post-2260177372555504476</guid><pubDate>Fri, 23 Apr 2010 16:55:00 +0000</pubDate><atom:updated>2010-04-23T13:08:31.857-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">debugging</category><title>Learning The Dark Arts of Debugging</title><description>Several months ago I had the opportunity to record an episode of&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://deepfriedbytes.com/files/media/image/WindowsLiveWriter/Media_8AE9/image_12.png&quot;&gt;&lt;img style=&quot;float:left; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 250px; height: 102px;&quot; src=&quot;http://deepfriedbytes.com/files/media/image/WindowsLiveWriter/Media_8AE9/image_12.png&quot; border=&quot;0&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;with &lt;a href=&quot;http://twitter.com/cwoodruff&quot;&gt;Chris Woodruff&lt;/a&gt; and &lt;a href=&quot;http://twitter.com/keithelder&quot;&gt;Keith Elder&lt;/a&gt;. The idea for the podcast started way back at Devlink 2009 where I ran into Keith at the speaker&#39;s VIP dinner. We&#39;d both had a couple of drinks by that time and got to chatting about a lot of different subjects, one of which was the talk I was giving at the conference about production debugging. Keith thought it sounded like an interesting and relevant topic that they hadn&#39;t had on the show before so we struck a deal to get an episode recorded. &lt;br /&gt;&lt;br /&gt;I put quite a bit of time and effort into synthesizing some of the most important information into a form I thought I could talk about over the phone. Even with all that prep work though I must say I was still pretty nervous on the night of the actual recording. I feel like at this point I&#39;m pretty good in front of a crowd giving the talk when I&#39;ve got slides and examples to show. I found out that trying to explain it all with just words can be a much more difficult endeavor! &lt;br /&gt;&lt;br /&gt;All that aside though I think the end result turned out quite well. Probably thanks in no small part to some great editing work by Chris and Keith! ;) If you&#39;ve already seen my talk in person there probably isn&#39;t a whole lot new to hear on the podcast, but if not I encourage you to check it out!  I think there is definitely some useful info there in regards to where to get started on solving your next big customer problem.&lt;br /&gt;&lt;br /&gt;Thanks again guys for having me on and keep up the good work of spreading tech knowledge to all your loyal listeners!</description><link>http://pragma-tech.blogspot.com/2010/04/learning-dark-arts-of-debugging.html</link><author>noreply@blogger.com (Scott Walker)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3114382043962780956.post-3086786890310376193</guid><pubDate>Mon, 04 Jan 2010 17:56:00 +0000</pubDate><atom:updated>2010-01-04T13:14:30.004-05:00</atom:updated><title>OS X: Essential Software for Developers</title><description>Favorite Mac Software&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://macromates.com/&quot;&gt;TextMate&lt;/a&gt; - The indispensable, extensible, text editor for all your programming and text editing needs.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.macports.org/&quot;&gt;MacPorts&lt;/a&gt; - Package / application management system. Easiest way to install thousands of apps and required dependencies without having to pull source recompile, yada, yada...&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.blacktree.com&quot;&gt;QuickSilver&lt;/a&gt; - Can&#39;t live without this if you are a keyboard junkie.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://macpaw.com/cleanmymac&quot;&gt;CleanMyMac&lt;/a&gt; - OK... I admit it... I&#39;m *totally* OCD when it comes to PC cleanliness. The fact that I know that uninstalling apps doesn&#39;t get rid of all their related junk drives me nuts.  CleanMyMac will fix that problem as well as many other routine maintenance tasks.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://evernote.com&quot;&gt;Evernote&lt;/a&gt; - You take notes right? Keep em in the cloud and synced across all your devices. With plugins for all major browsers, there is no better note client than this.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://ourapples.com/downloads/macloc&quot;&gt;MacLoc&lt;/a&gt; - I like to be able to lock my machine without logging out and closing all my apps. Seems like something that should be built into the OS, but it doesn&#39;t appear to be there in OS X. This program solves that problem.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.omnigroup.com/applications/OmniGraffle/&quot;&gt;OmniGraffle&lt;/a&gt;- If you do any significant form of diagramming this is the tool for you.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.perforce.com/perforce/products/merge.html&quot;&gt;p4Merge&lt;/a&gt; - This is the merge client I&#39;m currently using and have setup with GIT. I hear Araxis Merge is the bees knees, but it&#39;s also not cheap. Really wish BeyondCompare had a mac version. *sigh*&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.pixelmator.com/&quot;&gt;Pixelmator&lt;/a&gt; - My photoshop replacement. It&#39;s an absolutely gorgeous (and affordable) app for those times when you need to get your hands dirty with some image editing.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.irradiatedsoftware.com/sizeup/&quot;&gt;SizeUp&lt;/a&gt; - One of the features I *love*, *love*, *love*, about Windows 7 was the new shortcut keys for sending windows around the screen. Either to certain positions / sizes, or to other monitors. Also one of the hardest things I&#39;ve had to get used to on OS X is the non-windows way in which window management is handled. SizeUp solves this issue for me by giving me back the windowing features of Windows 7.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.atebits.com/tweetie-mac/&quot;&gt;Tweetie&lt;/a&gt; - My twitter client of choice. No holy wars here, just the one I like the best.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://growl.info/&quot;&gt;Growl&lt;/a&gt; - Get notifications of events happening on your system in an unobtrusive way.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.islayer.com/apps/istatmenus/&quot;&gt;iStat Menus&lt;/a&gt; - Ever want to know what the hardware on your mac is doing? This program will tell you at a glance on the menu bar.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.vmware.com/products/fusion/&quot;&gt;VMWare Fusion&lt;/a&gt; - Great virtualization app for running your Windows VMs. One mistake I made was not creating a partition for my windows installation thereby allowing me to boot into it natively using bootcamp, or as the VM from inside OS X. One of these days I&#39;ll correct that.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://blacktree.com&quot;&gt;Visor&lt;/a&gt; - Gives you a globally available terminal window available from a hotkey. This one is the hotness for developers who find themselves using the terminal a lot.&lt;br /&gt;&lt;br /&gt;AutoTest + Growl - Not really an application per say, but I love the autotest/zentest tool as a way to help guide my TDD. This will automagically monitor a folder containing some ruby specs and run the corresponding specs every time you save either the spec, or the source file. Set it up with growl and you will be notified by growl about whether your specs passed / failed. Also recommend setting up the fsevent library to reduce CPU overhead and save yourself some battery life.</description><link>http://pragma-tech.blogspot.com/2010/01/os-x-essential-software-for-developers.html</link><author>noreply@blogger.com (Scott Walker)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3114382043962780956.post-3536290698163012242</guid><pubDate>Thu, 24 Sep 2009 02:25:00 +0000</pubDate><atom:updated>2009-09-23T22:34:46.686-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">swe101 presentations</category><title>Software Engineering Conference 101</title><description>Today I was honored to be a presenter at the Software Engineering 101 Conference organized by &lt;a href=&quot;http://frazzleddad.blogspot.com/&quot;&gt;Jim Holmes&lt;/a&gt; in Columbus OH. This was a great little conference idea put together and organized by Jim as a way to get back to some of the basics people need to know about developing good software. There were sessions on things such as OOP, SOLID, TDD, and of course my talk on debugging. &lt;br /&gt;&lt;br /&gt;The great thing that set this conference apart for me from many others I&#39;ve attended in recent memory was that there was a very high degree of new faces in attendance. I attend a fair amount of events and so have come to at least be familiar with a lot of people in this region so I was surprised by this. The same sentiment was echoed by my fellow speakers who all agreed with me that this is a great thing! These are exactly the people we want to be reaching out to as speakers and helping to learn new and cool things that they can then take back and share with their coworkers and peers. &lt;br /&gt;&lt;br /&gt;I can&#39;t claim to know everyone&#39;s thoughts on the subject, but for me that is the reward I feel from giving back to the community through speaking... The sense that maybe I served as the spark that started a fire that will continue to grow and spread carrying good engineering practices with it. The more we all pitch in to educate each other, the better all of our lives are going to be. &lt;br /&gt;&lt;br /&gt;Slides for the talk can be found &lt;a href=&quot;http://cid-c7b1a424eb69cc6f.skydrive.live.com/self.aspx/.Public/Production|_Debugging.zip&quot;&gt;here&lt;/a&gt;. These are the Devlink specific version, but 99% of the content was the same I talked about today.</description><link>http://pragma-tech.blogspot.com/2009/09/software-engineering-conference-101.html</link><author>noreply@blogger.com (Scott Walker)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3114382043962780956.post-2400702052205199569</guid><pubDate>Thu, 27 Aug 2009 13:48:00 +0000</pubDate><atom:updated>2009-08-27T10:02:16.245-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">debugging</category><category domain="http://www.blogger.com/atom/ns#">presentations</category><title>Dayton .NET UG Presentation Followup</title><description>Big thanks to &lt;a href=&quot;http://twitter.com/JoeWirtley&quot;&gt;Joe Wirtley&lt;/a&gt;, &lt;a href=&quot;http://twitter.com/JimHolmes&quot;&gt;Jim Holmes&lt;/a&gt;, and &lt;a href=&quot;http://twitter.com/JustinKohnen&quot;&gt;Justin Kohnen&lt;/a&gt; for hosting my talk on Production Debugging last night at the Dayton .NET User Group. Thanks also for all the attendees that came out to learn something new! The feedback was tremendously positive, which makes the experience for me as the speaker very rewarding. &lt;br /&gt;&lt;br /&gt;During the presentation Joe suggested that I post some links here about how to setup Symbol/Source server, which I think is a fantastic idea. So the best links I&#39;ve come across to get all this stuff working can be found here:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://entland.homelinux.com/blog/2006/07/06/setting-up-a-symbol-server/&quot;&gt;Setting up a Symbol Server&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://jelle.druyts.net/2007/12/09/SettingUpSourceServerForTFSBuilds.aspx&quot;&gt;Setting up Source Server&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In addition for more great reference material on symbols, debugging, windbg, etc... please see my del.icio.us bookmarks &lt;a href=&quot;http://delicious.com/swalke16&quot;&gt;here&lt;/a&gt;. I have many items tagged with &quot;debugging&quot;, &quot;windbg&quot;, &quot;symbols&quot; and other terms I talked about last night that represent the best links I&#39;ve found from across the web over the years I&#39;ve been doing this.&lt;br /&gt;&lt;br /&gt;For presentation content please see the link in my post about my &lt;a href=&quot;http://pragma-tech.blogspot.com/2009/08/devlink-conference.html&quot;&gt;presentation &lt;/a&gt;at Devlink, as the content is 99% the same.</description><link>http://pragma-tech.blogspot.com/2009/08/dayton-net-ug-presentation-followup.html</link><author>noreply@blogger.com (Scott Walker)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3114382043962780956.post-8559904835530255190</guid><pubDate>Sun, 16 Aug 2009 02:59:00 +0000</pubDate><atom:updated>2009-08-27T10:00:21.285-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">debugging</category><category domain="http://www.blogger.com/atom/ns#">presentations</category><title>Devlink Conference</title><description>Got back a few hours ago from the Devlink conference in Nashville TN. Kudos to Jon Kellar and all the other folks that worked extremely hard to put together a great conference. Thanks again to those same people for giving me the opportunity to speak to other passionate developers at such a great venue. My experiences at this conference opened my mind in some ways I wasn&#39;t expecting (which I&#39;ll blog about later once I find the right words to say what I want to say). &lt;br /&gt;&lt;br /&gt;As a followup to my presentation I wanted to add the answers to the two questions that were asked that I didn&#39;t have good answers for at the time.&lt;br /&gt;&lt;br /&gt;1) What permissions are required to use ADPLUS.vbs to get memory dumps?&lt;br /&gt;&lt;br /&gt;Extensive searching on google for the answer to this question turned up no results. I know that for visual studio remote debugging however things tend to work much more easily with admin privileges. I imagine the same would be true for ADPLUS. If anyone does happen to find a definitive answer to this question please post it in the comments for all to share!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2) Do these techniques work for the .NET Compact Framework?&lt;br /&gt;&lt;br /&gt;From the research I did I could not find reference of anyone using WinDbg to debug memory dumps of .NET CF applications. I did however find this &lt;a href=&quot;http://blogs.msdn.com/raffael/archive/2008/02/21/netcf-memory-leak-now-what.aspx&quot;&gt;blog post&lt;/a&gt; describing how one could go about finding memory leaks in a .NET CF application that I thought might be useful.&lt;br /&gt;&lt;br /&gt;Thanks to everyone who gave feedback on my presentation!  I had a great time doing it and I hope that everyone in attendance was able to learn something useful from it. You all are the reason I keep doing this so I can&#39;t say thanks enough for all the kind feedback I&#39;ve received.&lt;br /&gt;&lt;br /&gt;The slides / example scripts can be found &lt;a href=&quot;http://cid-c7b1a424eb69cc6f.skydrive.live.com/self.aspx/.Public/Production|_Debugging.zip&quot;&gt;here&lt;/a&gt;. (Note that the virtual machine is too big to host anywhere, but you can always download the BuggyBits application source from &lt;a href=&quot;http://blogs.msdn.com/tess&quot;&gt;Tess&#39;s&lt;/a&gt; website.)</description><link>http://pragma-tech.blogspot.com/2009/08/devlink-conference.html</link><author>noreply@blogger.com (Scott Walker)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3114382043962780956.post-1984988802118661189</guid><pubDate>Sat, 25 Jul 2009 19:15:00 +0000</pubDate><atom:updated>2009-07-26T15:04:53.371-04:00</atom:updated><title>A Programming Renaissance Affair</title><description>So I&#39;ve been experimenting a lot recently with Ruby during my free time. Writing some simple applications and exploratory tests to help learn the many interesting nuances of the language. The feeling that has consistently struck me throughout this period is one of profound... freedom. At first I thought that this feeling was merely a reflection of the expressiveness of the syntax, the abundance of helpful libraries available, or the way things just seem to work. I still think those things are a part of that feeling, and I&#39;ll dive into those with more detail later. After significant further reflection though, I&#39;m starting to believe that there is a much deeper reason for those feelings as well...&lt;br /&gt;&lt;br /&gt;In my daily work I primarily write .NET code using all the fancy visual tooling of Visual Studio and R#. The work I&#39;ve done in Ruby thus far has been something of a programming Renaissance for me. For the Ruby work, I&#39;ve been working with primitive tools (SCITE, command line, etc...), and as a dynamic interpreted language, Ruby necessarily lacks a lot of the static type trappings and compile time warnings of languages like C# or Java. This has been quite a change for someone like me whom has said on numerous occasions that I don&#39;t know how I would live without R#. It&#39;s been a very different experience programming with almost no fancy visual tooling. Most strange indeed because I haven&#39;t missed any of it one bit! I&#39;ve heard similar phenomenon described by other rubyists, but never understood or believed it until now.&lt;br /&gt;&lt;br /&gt;Which brings me back to the main point I&#39;m getting to. I&#39;ve been reading Uncle Bob Martin&#39;s clean code tips of the week recently which have had me ruminating quite a bit on the various topics of code quality. It was &lt;a href=&quot;http://www.informit.com/articles/article.aspx?p=1355312&quot;&gt;Clean Code Tip of the Week #9&lt;/a&gt; however that really got me thinking. In this tip the intrepid adventurers are recounting tails of a time in the past when it took 24 hours to run a program on punch cards. Because of this they spent inordinate amounts of time manually reviewing their code to make sure things worked right, and consequently they had very few defects. We live in a golden age compared to that were compute resources are cheap enough and fast enough we can let the computers do a lot of that heavy work for us. This all seems great on the surface, but I&#39;m beginning to wonder if all these advancements in technology don&#39;t have a much darker un-talked about downside. &lt;br /&gt;&lt;br /&gt;One thing I have definitely experienced during my renaissance affair with Ruby, is that I&#39;ve felt myself thinking much more carefully about the code I was creating. Without static typing to warn me at compile time about type mismatches, and things like intellisense to easily discover parameter and method return types it becomes much more important to pay attention to the details of variable naming, parameter counts, object orientation, etc... &lt;br /&gt;&lt;br /&gt;All of this begs the question in my mind of: have advancements in technology, and visual tooling actually been making us dumber or lazier by allowing us not to exercise our brain? Biologically / psychologically speaking, as I understand it, our higher-order brain functionality is one of th key characteristics of what makes us humans. If we offload too much of that processing to machines, what is left to define us as humans? Not directly related to programming, but I certainly know I&#39;m not alone in thinking about these issues. Some time ago Rick Strahl blogged about how he felt as though the rise of search technology has been diminishing his mental capacity. His blog post (which I can&#39;t seem to find at the momemnt) very closely echoed my own thoughts on the matter. If we can search anything at a moment&#39;s notice why do we need to remember it? Are we stifling our own creativity and innovative capacity by having any answer we desire readily available at our fingertips? Are we as programmers (and indeed society in general) doomed to head down a Wall-E esque path of increased technological oversight leading to humanity&#39;s complete inability to do anything for ourselves without assistance?&lt;br /&gt;&lt;br /&gt;Perhaps more importantly, or at least more approachabble is the question of are these tools really needed? The claim of course is that they are productivity boosters, but is that really the case? Having witnessed some true Ruby experts at work it was nothing short of amazing what they could accomplish in an hour with nothing more than VIM. As another example, I used to work on software written in an obscure language called DIBOL on VAX/ALPHA systems. There was no such thing as a GUI on these systems so your only option was to use a good text editor such as TPU. When I first started that job, coming from a windows background I railed at the lack of intellisense, etc... and sought ought and found a windows based text editor that would at least give me syntax highlighting for this obscure language. I convinced the company to  buy me a copy and spent several painful weeks working with it. It was a ridiculously painful process because I would edit the source on windows and then have to FTP it to the VAX to compile and run it. After witnessing my boss crank out some code like nobodys business with TPU I finally broke down and decided to learn the tool. Within a few weeks I whipping out DIBOL code like I&#39;d never done before and my productivity only continued to increase as my familiarty with TPU became greater. I know that Jimmy Bogard recently had a similar experience at the NFJS conference where he witnessed Stuart Halloway a Clojure master complete an absolutely insane amount of work in an hour using Clojure. I certainly think that there is some evidence at least to suggest that these so-called productivity boosting tools are just a band-aid for deficiencies in some of our common programming languages. &lt;br /&gt;&lt;br /&gt;Don&#39;t get me wrong, there are some *great* things about R#, VS, etc... and certainly people can use these tools effecively without writing crappy code. I do wonder however it wouldn&#39;t be better to make these tools something that people have to earn over time through demonstration of mastery without. If we give new programmers in college all these tools right from the get go, and they become dependent on them to help them write clean code, will they still be able to stand on their own when the crutch has been removed? Will allowing tools to point out all the smells in their code for them cause them to be blind to the smells they create when the tools are not present?&lt;br /&gt;&lt;br /&gt;An exercise for the reader is to create a reasonably complex system using your statically typed language of choice and your favorite visual tooling. Then create a reasonably complex system using Ruby and a basic text editor. Come back to both after a few months and see which is easier to reabsorb. Another exercise is to spend some time watching someone who is a true expert with an alternative language at work for a while without all the fancy tools we have in .NET. I think the results might be eye opening.&lt;br /&gt;&lt;br /&gt;All that being said, I am totally loving the Ruby language and all the tools that have sprung up around it. As I said to someone else recently, once you pierce the veil of static typing as being some kind of safety blanket you can stop worrying about angle brackets and interfaces and just get down to business. Ruby is just that... a language designed to get out of your way and help you get things done. Rarely have I found what amounts to reading a reference novel for a language an enjoyable experience, but the Pickaxe has truly been a fun read. Also some of the frameworks built-up around Ruby are completely amazing in their simplicity and power. Things like Sinatra, Heroku, etc... make it incredibly easy to get a site up in running (the way YOU want it) in no time flat. &lt;br /&gt;&lt;br /&gt;Along with Ruby has come my first exposure to GIT which at least from my limited experience thus far seems like &quot;source control done right&quot;. I&#39;ve got a lot more reading to do on the topic, but so far I think TFS and heavy-handed SCMs are for the birds.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4BgPZsx3DrQbxZYPD4_Rt9US-riUOsX_5LGvCxRq8poPBTBRclE4aElq7u00XTnMCNsyqlq7vUy5oHU2Fyf5iHCw9hEJFoBeaKG_CfEIiiYvfRmQ4He4-O-D3sGOVcimgtymqQHgmRcc/s1600-h/freebird-1.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 134px; height: 200px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4BgPZsx3DrQbxZYPD4_Rt9US-riUOsX_5LGvCxRq8poPBTBRclE4aElq7u00XTnMCNsyqlq7vUy5oHU2Fyf5iHCw9hEJFoBeaKG_CfEIiiYvfRmQ4He4-O-D3sGOVcimgtymqQHgmRcc/s200/freebird-1.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5362846286518514962&quot; /&gt;&lt;/a&gt;</description><link>http://pragma-tech.blogspot.com/2009/07/programming-renaissance-affair.html</link><author>noreply@blogger.com (Scott Walker)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4BgPZsx3DrQbxZYPD4_Rt9US-riUOsX_5LGvCxRq8poPBTBRclE4aElq7u00XTnMCNsyqlq7vUy5oHU2Fyf5iHCw9hEJFoBeaKG_CfEIiiYvfRmQ4He4-O-D3sGOVcimgtymqQHgmRcc/s72-c/freebird-1.png" height="72" width="72"/><thr:total>5</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3114382043962780956.post-761522260277521994</guid><pubDate>Tue, 21 Apr 2009 02:13:00 +0000</pubDate><atom:updated>2009-04-23T14:59:04.888-04:00</atom:updated><title>I Fought the AJAX and the AJAX Won!</title><description>So up until a few days ago I thought I had a pretty good handle on how all this AJAX stuff worked. It was at that point investigating what seemed to be a pretty innocuous bug report that I we ran into a particularly painful behavior of the XMLHTTP object that made me rethink my assumption. The behavior makes sense once you give it some thought, but is not at all obvious at first which is why I&#39;m posting the story here both so I can remember it and so hopefully someone else will benefit from the information.&lt;br /&gt;&lt;br /&gt;So picture for a minute a scenario where you have an input form that a user must fill out before clicking a button to submit the form. Some of these input fields are textboxes that require some complicated validation logic (easy to do on the server, but difficult on the client) that you run to ensure that the entered data is valid. To get the best user experience you want to have the validation appear to be on the client side, occurring right after the user leaves the field. To achieve such functionality you may have likely taken the same approach that we did of attaching an &lt;font style=&quot;font-style: italic;&quot;&gt;onchange&lt;/font&gt; event handler to the input element that makes an AJAX request to the server to perform the validation. And this is where the problem begins...&lt;br /&gt;&lt;br /&gt;Likely (as we did) you want the input to be validated and any errors flagged for the user before you submit the whole form to the server. Therefore it makes perfectly logical sense to execute the AJAX request synchronously so that it blocks further downstream processing from occurring until the validation routine has had a chance to finish. So you test all this functionality and it seems to be working just great and life is good... or is it...?&lt;br /&gt;&lt;br /&gt;So the next functionality you add is the ability for the user to submit the form which requires some javascript processing of its own. So you wire up an onclick event handler to the submit button and you think you&#39;re good to go... until...&lt;br /&gt;&lt;br /&gt;A user testing the application finds that if they change the value in one of the input fields that is using the AJAX validation (to an invalid value) and then immediately click the select button before clicking elsewhere on the page that the validation does not prevent them from submitting the form. A simple example could be as follows:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: vb; html-script: true&quot;&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;&lt;br /&gt;&amp;lt;head&gt;&lt;br /&gt; &amp;lt;title&gt;Untitled Page&amp;lt;/title&gt;&lt;br /&gt; &amp;lt;script language=javascript type=&quot;text/javascript&quot; src=&quot;Scripts/jquery-1.3.2-vsdoc.js&quot;&gt;&amp;lt;/script&gt;&lt;br /&gt; &amp;lt;script language=&quot;javascript&quot; type=&quot;text/javascript&quot;&gt;&lt;br /&gt;  $(document).ready(function()&lt;br /&gt;  {&lt;br /&gt;   $(&quot;#mybutton&quot;).click(HandleClick);&lt;br /&gt;  });&lt;br /&gt; &lt;br /&gt;  var lastTextBoxValue = &quot;&quot;;&lt;br /&gt;&lt;br /&gt;  function HandleClick()&lt;br /&gt;  {&lt;br /&gt;   console.log(&quot;HandleClick:&quot;+lastTextBoxValue);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  function HandleChange(input)&lt;br /&gt;  {&lt;br /&gt;   console.log(&quot;HandleChange Before Ajax&quot;);&lt;br /&gt;   $.ajax({ url: &quot;EventTest.html&quot; });&lt;br /&gt;   console.log(&quot;HandleChange After Ajax&quot;);&lt;br /&gt;   lastTextBoxValue = input.value;&lt;br /&gt;  }&lt;br /&gt; &amp;lt;/script&gt;&lt;br /&gt;&amp;lt;/head&gt;&lt;br /&gt;&amp;lt;body&gt;&lt;br /&gt; &amp;lt;div id=&quot;mybutton&quot; style=&quot;border: 1px solid black; background-color: Aqua&quot;&gt;&lt;br /&gt;  Click&amp;lt;/div&gt;&lt;br /&gt; &amp;lt;input type=&quot;text&quot; onchange=&quot;HandleChange(this)&quot; /&gt;&lt;br /&gt;&amp;lt;/body&gt;&lt;br /&gt;&amp;lt;/html&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;EGADS! What possibly could have gone wrong with such simple functionality??? Firing up the debugger you swiftly realize that something very strange is going on... Setting breakpoints anywhere in the chain of processing appears to prevent the issue from happening. So you spend several hours banging your head against the wall looking for an answer.&lt;br /&gt;&lt;br /&gt;That is, of course, unless you happen to have read this blog post and have learned from our frustration in finding the cause of this issue. To make a long story short what is happening here is that using the XMLHTTP object in synchronous form does not behave exactly as you might expect it to at first blush...&lt;br /&gt;&lt;br /&gt;A synchronous request does in fact block further execution of javascript in the current execution stack that led to the request as one would expect. What it does *not* block however is other execution stacks that may have been triggered by other asynchronous processes such as events like a button click! So in the validation case where you changed an input value and clicked the submit button what you would see is:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;onchange event of the input field fires&lt;/li&gt;&lt;li&gt;synchronous AJAX request begins&lt;/li&gt;&lt;li&gt;click event of button fires&lt;/li&gt;&lt;/ol&gt;The behavior makes sense once you realize that if the synchronous call blocked all javascript from processing that it would basically lock your browser and prevent such scenarios as having a cancel button to cancel a long-running synchronous request.&lt;br /&gt;&lt;br /&gt;We haven&#39;t found a great solution to this issue yet, but I&#39;m throwing this out there as a word of caution to all that there is a reason the abbreviation stands for ASYNCHRONOUS Javascript and XML. I&#39;ve seen time and time again that if you fight the asynchronous nature too much you usually end up burning yourself sooner or later.&lt;br /&gt;&lt;br /&gt;In addition, please see &lt;a href=&quot;http://twitter.com/WalkrCodeRanger&quot;&gt;Jeff&#39;s&lt;/a&gt; comments below for why this behavior might be a little more nefarious outside of my validation example. He actually did a lot of the work on finding this bug, but since he hasn&#39;t got his blog up and running yet I&#39;m posting it here.&lt;br /&gt;&lt;br /&gt;Some further reading materials on javascript timers / events / performance that can help to understand all this better are:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://ejohn.org/blog/how-javascript-timers-work/&quot;&gt;How Javascript Timers Work&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://windyroad.org/2007/03/30/web-apps-the-new-single-threaded-gui/&quot;&gt;Secret of Keeping Web Apps Responsive&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://piecesofrakesh.blogspot.com/2007/10/client-side-performance-optimization-of.html&quot;&gt;Client-side Performance Optimization of AJAX Applications&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;</description><link>http://pragma-tech.blogspot.com/2009/04/i-fought-ajax-and-ajax-won.html</link><author>noreply@blogger.com (Scott Walker)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3114382043962780956.post-5258327393922508280</guid><pubDate>Wed, 25 Feb 2009 15:52:00 +0000</pubDate><atom:updated>2009-02-25T11:12:57.362-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">CINNUG</category><category domain="http://www.blogger.com/atom/ns#">debugging</category><category domain="http://www.blogger.com/atom/ns#">presentations</category><title>CINNUG Presentation Followup</title><description>Last night was my second go-round giving my Production Debugging talk. This time it was for the &lt;a href=&quot;http://cinnug.org/&quot;&gt;Cincinnati .NET User Group&lt;/a&gt;. This group is run by a great group of people, &lt;a href=&quot;http://mvwood.com/blog/&quot;&gt;Mike Wood&lt;/a&gt;, &lt;a href=&quot;http://www.linkedin.com/in/mattbrewer1&quot;&gt;Matt Brewer&lt;/a&gt;, &amp; &lt;a href=&quot;http://www.japikse.blogspot.com/&quot;&gt;Phil Japikse&lt;/a&gt; (sorry if I left anyone out). There was quite a turn-out last night at 67 people, nearly setting the record for the group! I was impressed by the passion and insightful questions of all those in attendance and want to give thanks to the organizers as well as the attendees. &lt;br /&gt;&lt;br /&gt;Feedback thus far has been extremely positive which goes a long way to validate why I believe so strongly in the .NET community and getting involved in giving back. Hopefully everyone there last night learned a few new tricks and will be better prepared for when those critical issues happen.&lt;br /&gt;&lt;br /&gt;One question came up last night that threw me for a bit of a loop and so after ruminating on that question some more last night I wanted to go ahead and address it here on the blog. The question was roughly:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;During the crash demo why didn&#39;t you open the 1st Chance NullReferenceException dump? Wouldn&#39;t that have shown us the original error and location without having to jump through hoops in the 2nd chance dump to find it?&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;This was a great question, and in reference to this particular simple crash demo was spot on correct! For this very simple case opening the 1st chance dump would have been a quicker way to get to the root of the problem. For more complicated crash scenarios however this likely would not have been a good choice. If we remember what I spoke about last night in regards to how exceptions are handled, the 1st chance exceptions occur when the exception is first thrown and the application has not yet had a chance to handle that exception. Therefore in a more complicated scenario there potentially could have been multiple 1st chance exceptions of NullReference or other types out there that had corresponding dump files written but were actually handled gracefully by the application and not the source of the actual application crash. In those types of scenarios we want to make sure to open the 2nd chance dump so that we can be sure that we are looking at the actual UNHANDLED exceptions.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;As promised, I have attached all the presentation materials to this post so people can refer back to them later. There are a lot of files in the package, so I recommend first checking out the Readme.docx which talks about what each of those files represents. &lt;br /&gt;&lt;br /&gt;Please feel free to leave any comments / questions you may have either here on my blog or ping me on twitter. &lt;br /&gt;&lt;br /&gt;Happy debugging!&lt;br /&gt;&lt;br /&gt;&lt;iframe scrolling=&quot;no&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; frameborder=&quot;0&quot; style=&quot;width:240px;height:26px;margin:3px;padding:0;border:1px solid #dde5e9;background-color:#ffffff;&quot; src=&quot;http://cid-c7b1a424eb69cc6f.skydrive.live.com/embedrow.aspx/.Public/Debugging%20Presentation.zip&quot;&gt;&lt;/iframe&gt;</description><link>http://pragma-tech.blogspot.com/2009/02/cinnug-presentation-followup.html</link><author>noreply@blogger.com (Scott Walker)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3114382043962780956.post-5485096749824650855</guid><pubDate>Sat, 07 Feb 2009 04:20:00 +0000</pubDate><atom:updated>2009-02-06T23:20:59.250-05:00</atom:updated><title>Farewells Are Always Hard</title><description>&lt;p&gt;I’ll stand by the statement I made several months ago to my buddy (and now co-worker) Jeff that I think we’ve got a pretty stellar team at our current place of employment. Unfortunately today that team got a little weaker with the departure of another friend and co-worker, Lee. It seems to be be a bit of a disturbing trend these days that a lot of good people I know are either leaving or being forced to leave their current places of employment. Perhaps that is just the way things have been and will always be in troubling economic times, but I’d certainly like to hope for better.&lt;/p&gt;  &lt;p&gt;It’s always hard to say goodbye to a good co-worker, and even harder if they happen to be a friend as well. After working at a few different places in this business I think you come to realize that one of the most important factors in being happy with your job is getting to work with really smart, passionate people who share your same interests. Those people seem to be few and far between these days, especially as companies attempt to outsource and contract resources from other sources. This makes it all the more important to do everything you can to hold on to those good people when you’ve got them. It’s unfortunate that sometimes companies don’t realize the value of keeping that well-oiled machine of a good team whole.&lt;/p&gt;  &lt;p&gt;I’s hard not to feel at least a little pang of guilt as a part of management when you do lose one of those. You always wonder if there was a little something more you could have done to change their minds, or better yet, to stem the underlying tide of discontent before they began considering other options. I can honestly say that the team I work with is one of the most important factors I weigh when evaluating my career opportunities. I want to be a part of a really good team, and more importantly I want to be a part of making that good team into a *great* team. &lt;/p&gt;  &lt;p&gt;With that in mind I plan on spending more time being a little retrospective in the coming months. Focusing some time on energy on what I can do to become a better manager to those I work with. It’s easy for me to get lost in the technology sometimes because it’s what I know. It’s safe and comfortable and easy to learn. Management on the other hand is a relatively new thing for me, and I believe something infinitely harder to learn to be great at than simply banging out code. &lt;/p&gt;  &lt;p&gt;Lee… Goodbye and good luck with your new endeavors. You’ll be missed. &lt;/p&gt;  </description><link>http://pragma-tech.blogspot.com/2009/02/farewells-are-always-hard.html</link><author>noreply@blogger.com (Scott Walker)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3114382043962780956.post-5769600290929624422</guid><pubDate>Tue, 09 Dec 2008 01:59:00 +0000</pubDate><atom:updated>2009-04-15T09:42:35.070-04:00</atom:updated><title>ASP.NET Ajax Ate My Site</title><description>&lt;p&gt;So despite all the doom &amp;amp; gloom people have posted in the past about using ASP.NET AJAX’s UpdatePanel control we’ve gone ahead and used it in one of our applications. Things were going along quite swimmingly for a while until one day with a particular customer’s data we encountered a severe performance problem any time an async postback occurred. The odd thing was that the bug was only reproducible in IE7/8. &lt;br /&gt;&lt;br /&gt;The screen would pretty much freeze up and after a while we’d get that wonderful dialog box stating that scripts were taking to long would you like to let it finish or stop it? Firing up the nice JavaScript profiler in IE8 revealed that ~18 seconds of time was being spent in the destroyTree function from the ASP.NET Ajax JavaScript library. hmm… interesting…  &lt;br /&gt;&lt;br /&gt;Poking around a bit more revealed that this function is called whenever an UpdatePanel control has new content being loaded from an async postback. It’s purpose is to loop through all of the DOM elements inside the UpdatePanel and ensure that any javascript objects / behaviors attached to the elements get their dispose method called. This seemed like a rather trivial task to be taking that amount of time. Poking around a bit more revealed that in the particular UpdatePanel that was being destroyed we had ~7000 DOM elements. Having that many DOM elements in and of itself is a separate problem that we need to address, but still didn’t explain why any browser but IE could handle this task in ~1 second compared to IE’s ~18 seconds. Apparently walking a large DOM tree in IE is *appallingly* slow!  &lt;br /&gt;&lt;br /&gt;After a bit of google searching I found that this issue has been discussed at least a few times on the ASP.NET Ajax community forums. Most people seemed to suggest to write some code to manually clear out the DOM elements of the known problematic DOM nodes before the framework has a chance to call destroyTree. Hating to hardcode special cases for specific elements I set out to create a generic fix and came up with the following:  &lt;br /&gt;&lt;/p&gt;  &lt;pre class=&quot;brush: js&quot;&gt;&lt;br /&gt;function DisposeItems(sender, args)&lt;br /&gt;{&lt;br /&gt;$.each(args.get_panelsUpdating(), function(i, panel)&lt;br /&gt;{&lt;br /&gt;  destroyTree(panel);&lt;br /&gt;});&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function destroyTree(elem)&lt;br /&gt;{&lt;br /&gt;$(&quot;[dispose],[__behaviors],[control]&quot;, elem)&lt;br /&gt;  .each(function()&lt;br /&gt;  {&lt;br /&gt;    if(this.dispose &amp;amp;&amp;amp; typeof (this.dispose) === &quot;function&quot;)&lt;br /&gt;      this.dispose();&lt;br /&gt;    else if(this.control &amp;amp;&amp;amp; typeof (this.control.dispose) === &quot;function&quot;)&lt;br /&gt;      this.control.dispose();&lt;br /&gt;&lt;br /&gt;     $.each(Sys.UI.Behavior.getBehaviors(this), function(i, behavior) {&lt;br /&gt;        behavior.dispose(); });&lt;br /&gt;     });&lt;br /&gt;elem.innerHTML = &quot;&quot;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Sys.WebForms.PageRequestManager.getInstance().add_pageLoading(disposeItems);&lt;/pre&gt;&lt;br /&gt;Hooking into the framework’s pageLoading event that is called when new async postback content is received we use a little jQuery magic to basically take over the work the framework was doing to ensure that all the dispose methods are called properly. For each of the UpdatePanels that are going to be updated with new content we call our own implementation of destroyTree. Our implementation instead of looping over all ~7000 nodes uses a jQuery selector to find all the elements that need disposing. Then we simply duplicate the framework’s dispose functionality. Finally we clear the innerHTML of each element effectively removing the nodes from the DOM. This way when the framework’s destroyTree function is called it has practically no work to do.&lt;br /&gt;&lt;p&gt;&lt;br /&gt;From a performance standpoint, this fix reduced the time we were spending in IE to destroy the tree from the previously ludicrous ~18 seconds to around ~1 second which then put IE on par with the other browsers. This was an interesting one to find and fix and I hope Microsoft finds a better way to solve this in the next version of the framework so we don’t have to continue to hack around it. Who knows, now that they have officially embraced jQuery maybe they can reuse my fix!&lt;/p&gt;</description><link>http://pragma-tech.blogspot.com/2008/12/aspnet-ajax-ate-my-site.html</link><author>noreply@blogger.com (Scott Walker)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3114382043962780956.post-940636983587990707</guid><pubDate>Tue, 25 Nov 2008 22:52:00 +0000</pubDate><atom:updated>2008-11-25T18:05:53.973-05:00</atom:updated><title>Citizens of Wisconsin UNITE!</title><description>This is a letter to the hip-hop artists of America. I&#39;ve stood silently by all these years without saying much about the content of your &quot;music&quot; as quite honestly some of it is very catchy if not entirely satisfying. I&#39;ve stood silently by all this time despite the questionable moral content of your songs that glorifies boozing, whoring, and drug consumption. I&#39;ve stood silently by all these years despite your inability to have even a rudimentary command of the English language, creating words such as &quot;shorty&quot;, &quot;drizzy&quot;, &quot;crunk&quot;, &quot;drank&quot;, etc...&lt;br /&gt;&lt;br /&gt;Your most recent flagrant abuse of the Enligsh language however has finally pushed me over the edge. You see, the other day while listening to the radio I heard a song (whose name escapes me at the moment) that for lack of a better word attempted to rhyme &quot;Wiscansin&quot; with something. I&#39;m not afraid to say that I threw up a little bit in my mouth upon hearing this. &quot;Wiscansin&quot;??? Seriously!?!?! That&#39;s the best you can do? Making up words wasn&#39;t cutting it any more so you had to bastardize the name of a state? You&#39;ve given up even trying to be creative and have now resorted to Dr. Seuss like nonsensical words?&lt;br /&gt;&lt;br /&gt;If I were a citizen of the great state of Wisconsin right now I think I would officially boycott from this moment on all forms of hip-hop, ban it&#39;s playtime from radio stations, and force relocate all hip-hop artists living in the state to the land of Whoville where they so clearly belong.&lt;br /&gt;&lt;br /&gt;To those of you out there who actually like this kind of drivel I pity you for every minute you spend making yourself dumber by subjecting yourself to such folly.</description><link>http://pragma-tech.blogspot.com/2008/11/citizens-of-wisconsin-unite.html</link><author>noreply@blogger.com (Scott Walker)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3114382043962780956.post-9120945832179207822</guid><pubDate>Thu, 06 Nov 2008 20:21:00 +0000</pubDate><atom:updated>2008-11-06T15:37:57.445-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">quality</category><title>On Quality</title><description>At our book club meeting today on Evan&#39;s Domain Driven Design we got into a rather passionate discussion of whether quality is something you can negotiate. There were good arguments presented on both sides, but I&#39;m firmly in the camp that quality is never something that should be on the negotiating table.&lt;br /&gt;&lt;br /&gt;I&#39;m fine with saying that under specific circumstances (one-off, non-asset projects) you can save time by sacrificing on certain design patterns or principles that don&#39;t make sense. For instance using LINQ To SQL instead of NHibernate, or ADO.NET vs full blown repositories, etc... Those things to me are all design principles and patterns that promote flexibility not quality. What you can&#39;t sacrifice on are the basic principles of SOLID:&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;&lt;a href=&quot;http://www.objectmentor.com/resources/articles/srp.pdf&quot;&gt;SRP: Single Responsibility Principle&lt;/a&gt;&lt;/h2&gt; &lt;blockquote&gt; &lt;p&gt;&lt;em&gt;THERE SHOULD NEVER BE MORE THAN ONE REASON FOR A CLASS TO CHANGE.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;ul&gt;&lt;li&gt; &lt;p&gt;&lt;a href=&quot;http://www.lostechies.com/blogs/sean_chambers/archive/2008/03/15/ptom-single-responsibility-principle.aspx&quot;&gt;PTOM: The Single Responsibility Principle by Sean Chambers&lt;/a&gt;&lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p&gt;&lt;a href=&quot;http://lostechies.com/blogs/jason_meridth/archive/2008/03/26/ptom-single-responsibility-principle.aspx&quot;&gt;POTM: The Single Responsibility Principle by J.D. Meridth&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt; &lt;h2&gt;&lt;a href=&quot;http://www.objectmentor.com/resources/articles/ocp.pdf&quot;&gt;OCP: Open Closed Principle&lt;/a&gt;&lt;/h2&gt; &lt;blockquote&gt; &lt;p&gt;&lt;em&gt;SOFTWARE ENTITIES (CLASSES, MODULES, FUNCTIONS, ETC.) SHOULD BE OPEN FOR EXTENSION BUT CLOSED FOR MODIFICATION&lt;/em&gt;. &lt;/p&gt;&lt;/blockquote&gt; &lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://www.lostechies.com/blogs/joe_ocampo/archive/2008/03/21/ptom-the-open-closed-principle.aspx&quot;&gt;PTOM: The Open Closed Principle by Joe Ocampo&lt;/a&gt;  &lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.lostechies.com/blogs/joe_ocampo/archive/2008/03/30/ptom-ocp-revisited-in-ruby.aspx&quot;&gt;PTOM: OCP Revisited in Ruby by Joe Ocampo&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;h2&gt;&lt;a href=&quot;http://www.objectmentor.com/resources/articles/lsp.pdf&quot;&gt;LSP: Liskov Substitution Principle&lt;/a&gt;&lt;/h2&gt; &lt;blockquote&gt; &lt;p&gt;&lt;em&gt;FUNCTIONS THAT USE ... REFERENCES TO BASE CLASSES MUST BE ABLE TO USE OBJECTS OF DERIVED CLASSES  WITHOUT KNOWING IT.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;  &lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://www.lostechies.com/blogs/chad_myers/archive/2008/03/09/ptom-the-liskov-substitution-principle.aspx&quot;&gt;PTOM: The Liskov Substition Principle by Chad Myers -- My own post on the subject&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;h2&gt;&lt;a href=&quot;http://www.objectmentor.com/resources/articles/isp.pdf&quot;&gt;ISP: Interface Segregation Principle&lt;/a&gt;&lt;/h2&gt; &lt;blockquote&gt; &lt;p&gt;&lt;em&gt;CLIENTS SHOULD NOT BE FORCED TO DEPEND UPON INTERFACES THAT THEY DO NOT USE&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://www.lostechies.com/blogs/rhouston/archive/2008/03/14/ptom-the-interface-segregation-principle.aspx&quot;&gt;PTOM: The Interface Segregation Principle by Ray Houston&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;h2&gt;&lt;a href=&quot;http://www.objectmentor.com/resources/articles/dip.pdf&quot;&gt;DIP: Dependency Inversion Principle&lt;/a&gt;&lt;/h2&gt; &lt;blockquote&gt; &lt;p&gt;&lt;em&gt;A. HIGH LEVEL MODULES SHOULD NOT DEPEND UPON LOW LEVEL MODULES. BOTH SHOULD DEPEND UPON ABSTRACTIONS&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;B. ABSTRACTIONS SHOULD NOT DEPEND UPON DETAILS. DETAILS SHOULD DEPEND UPON ABSTRACTIONS&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://www.lostechies.com/blogs/jimmy_bogard/archive/2008/03/31/ptom-the-dependency-inversion-principle.aspx&quot;&gt;PTOM: The Dependency Inversion Principle by Jimmy Bogard&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;These things like paying attention to cohesion and coupling are the fundamentals of good software engineering that allow any program no matter the design methodolgy or patterns used to maintain good quality. You can sacrifice on scope or flexibility, but not on good principles, unit testing, or QA... PERIOD.&lt;br /&gt;&lt;br /&gt;Any customer who wants to put quality on the negotiating table is one that you should probably walk away from! As a consumer you wouldn&#39;t ask an auto manufacturer to sacrifice on passing the government safety standards would you? Granted most decisions are not of that life or death nature, but whenever you building anything for a customer that thing is of some essential value to the customer and their business process. If it isn&#39;t adding essential value, or the customer is saying that they are willing to sacrifice on it&#39;s quality they are implicity saying it has lower value so why are you bothering to build it? The customer would most likely be much better served by refocusing the effort that would have gone into half-assing that feature into one that does provide some essential value.&lt;br /&gt;&lt;br /&gt;So in the end I think you can&#39;t sacrifice quality, and if you stick to that as an unflinching principle the majority of customers will likely respect you for having the gumption to stick to your core values. If not you should probably strongly question if you want them as a customer in the first place.</description><link>http://pragma-tech.blogspot.com/2008/11/on-quality.html</link><author>noreply@blogger.com (Scott Walker)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3114382043962780956.post-2814737302108427710</guid><pubDate>Fri, 02 May 2008 12:56:00 +0000</pubDate><atom:updated>2008-05-02T09:00:07.053-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">CONDG</category><title>Screencast Coming Soon</title><description>In my last post I mentioned that I would be posting a screencast version of my CONDG debugging presentation sometime in the future. I am hoping to get that up sometime next week. Unfortunately I have been sick this week with fever and sore throat so I haven&#39;t exactly felt like giving a 2 hour long talk. So I apologize for the delay in getting that done, but the good news is that when I do get around to posting it, it will be an extended version with some new content I&#39;ve thought of since the presentation as well as some other content that we had prepared for the presentation but didn&#39;t have time to get into.&lt;br /&gt;&lt;br /&gt;So keep your eyes peeled on this space and I promise I&#39;ll get it up here soon.</description><link>http://pragma-tech.blogspot.com/2008/05/screencast-coming-soon.html</link><author>noreply@blogger.com (Scott Walker)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3114382043962780956.post-1540279446303046616</guid><pubDate>Fri, 25 Apr 2008 12:58:00 +0000</pubDate><atom:updated>2008-04-25T09:36:41.228-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">CONDG debug</category><title>CONDG Debugging Presentation Followup</title><description>It was a long haul the last couple of weeks trying to get all the details hammered out for my presentation on Production Debugging for &lt;a href=&quot;http://www.condg.org&quot;&gt;CONDG&lt;/a&gt;. Now that the presentation is over and the dust has settled I can emphatically state that all the hard work has been worth it. The feedback so far has been overwhelmingly positive and for me that makes it all worth while. Lots of people in this community have helped me out in various ways over the years and I&#39;m extremely glad that I could give something back.&lt;br /&gt;&lt;br /&gt;Were there things that we could have done better?  Sure! (I apologize wholeheartedly for the technical foibles) At the end of the night though I think everyone learned some cool new tricks they didn&#39;t know before, and that was really what I was hoping for. I&#39;m sure people aren&#39;t going to remember all the minute details of everything we talked about, but as I said last night, at least everyone there now has taken the first step towards having a &quot;catastrophe plan&quot; in place.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://brianhprince.blogspot.com/&quot;&gt;Briance Prince &lt;/a&gt;our resident MS Architect Evangelist has suggested that we do a webcast of the presentation for the world at large. Because of the technical nature of the presentation and the demos we did I think this is a great idea and so we will get this done sometime in the future. I don&#39;t want to promise a timeframe yet, but we will be doing this at some point. For the webcast we will likely also do the expanded version of the presentation in which we cover some details on the garbage collector and how you can use WinDBG to find memory leaks in your applications. &lt;br /&gt;&lt;br /&gt;In the meantime we will at least be posting a short screencast that shows of &lt;a href=&quot;http://bdemuth.blogspot.com/&quot;&gt;Bryan&#39;s&lt;/a&gt; super-sexy demo that we didn&#39;t get to show last night. We&#39;ll get that up in the more immediate future. In addition, because things went so well last night we will also likely be trying to pimp this presentation to other conferences around the area throughout the rest of the year. I know I&#39;ll definitely be angling for a session at CODEMASH &#39;09 so we can reach a larger audience.&lt;br /&gt;&lt;br /&gt;Again, thanks to all who came out last night, and special thanks to my employer &lt;a href=&quot;http://www.tdci.com&quot;&gt;TDCI&lt;/a&gt; for believing in the community and ponying up the funds to sponsor last night&#39;s meeting. For those of you who are waiting on some answers to questions that you had for me after the presentation, I&#39;ll be in contact soon with whatever I can find out.&lt;br /&gt;&lt;br /&gt;In the meantime please go ahead and grab the &lt;a href=&quot;http://filebox.vt.edu/users/grwalker/Debugging%20Presentation.zip&quot;&gt;slides&lt;/a&gt; and check out some of the links in the deck. There are some blogs linked in there that know far more about this topic than I do!</description><link>http://pragma-tech.blogspot.com/2008/04/condg-debugging-presentation-followup.html</link><author>noreply@blogger.com (Scott Walker)</author><thr:total>7</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3114382043962780956.post-5175519987937037119</guid><pubDate>Fri, 14 Mar 2008 20:15:00 +0000</pubDate><atom:updated>2008-04-18T20:05:36.457-04:00</atom:updated><title>Ultimate Debug Tool List</title><description>&lt;p&gt;As a prelude to my talk with &lt;a title=&quot;t-SQL Ninja&quot; href=&quot;http://bdemuth.blogspot.com/&quot; target=&quot;_blank&quot;&gt;t-SQL ninja&lt;/a&gt; in April for &lt;a href=&quot;http://www.condg.org/&quot; target=&quot;_blank&quot;&gt;CONDG&lt;/a&gt; about advanced debugging and production debugging I thought I should write a post about the tools that I commonly use in these scenarios. &lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://www.microsoft.com/whdc/devtools/debugging/default.mspx&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;Windows Debugging Tools&lt;/strong&gt;&lt;/a&gt; -- First and foremost for production debugging scenarios the tools that you should become intimately familiar with are the parts and pieces of this package. It includes a ton of useful debugging tools of which I&#39;m going to only highlight the few that I use most often here. These will likely be the primary focus of my talk in April. &lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/WinDbg&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;WinDBG&lt;/strong&gt;&lt;/a&gt; -- This is in my opinion the ultimate windows debugger available. It can debug just about any scenario and is especially useful for post-mortem debugging scenarios. &lt;a href=&quot;http://blogs.msdn.com/tess/default.aspx&quot; target=&quot;_blank&quot;&gt;Lots&lt;/a&gt; &lt;a href=&quot;http://mtaulty.com/communityserver/blogs/mike_taultys_blog/archive/2004/08/03/4656.aspx&quot; target=&quot;_blank&quot;&gt;of&lt;/a&gt; &lt;a href=&quot;http://www.stevestechspot.com/default.aspx&quot; target=&quot;_blank&quot;&gt;people&lt;/a&gt; way smarter than I have written great articles about using WinDBG to help in solving common debug problems. I owe them and many others thanks for taking the time to blog in such detail and opening my eyes to the possibilities this tool provides. By default WinDBG is a native only debugger but there are a couple of extensions that one can use with WinDBG for debugging managed code. &lt;ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://msdn2.microsoft.com/en-us/magazine/cc164138.aspx&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;SOS&lt;/strong&gt;&lt;/a&gt; -- Otherwise known as &quot;son of strike&quot; this extension comes packaged with the .NET framework itself. It adds a whole slew of useful commands into WinDBG that really make managed debugging easier. First available back in the .NET v1.1 timeframe, this extension although still provided with .NET v2.0 contains only a subset of the features available in the v1.1 compatible version. Unfortunately some of the best commands were left out for v2.0 and we can only hope that they will someday be put back in. &lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.stevestechspot.com/SOSEXANewDebuggingExtensionForManagedCode.aspx&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;SOSEX&lt;/strong&gt;&lt;/a&gt; -- Steve Johnson has attempted to correct some of the deficiencies in SOS that I mentioned above by releasing this new managed debugging extension. It even does some new and better things than the original version of SOS. &lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://support.microsoft.com/kb/286350&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;ADPLUS&lt;/strong&gt;&lt;/a&gt; -- This is a VBScript that can help to automate a lot of tasks such as gathering memory dump files of a process upon certain exception conditions, application hangs, crashes, etc... It&#39;s highly configurable through the use of an XML file so that you can very finely tune how and when you want to generate a memory dump, write log information, or break into a process. &lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.microsoft.com/downloads/details.aspx?FamilyID=18b1d59d-f4d8-4213-8d17-2f6dde7d7aac&amp;amp;displaylang=en&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;SYMSTORE&lt;/strong&gt;&lt;/a&gt; -- Microsoft symbol server utility. This allows you to store debug symbols and even binaries for use by debuggers that support symbol servers. Basically what this means is that if done properly, your debugger can automatically download the proper debug symbols and binaries from some server when you are debugging a piece of code. This is especially useful for post-mortem debugging where all you have is a crash-dump. Having debug symbols available will really make your debugging life easier as you will now have call stack information at the very least. &lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://tools.osherove.com/CoolTools/SourceServerSupportforTeamSystem/tabid/190/Default.aspx&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;TFINDEX&lt;/strong&gt;&lt;/a&gt; -- Source server support for Team Foundation Server. This takes the symbol server concept discussed above to a whole new level! The idea is that you run this on your debug symbol files before storing them in your symbol server. Then when you are debugging a piece of code along with pulling the proper debug symbols and binaries from your symbol server your debugger can also talk to your source control server to pull the actual source files for the code you are debugging!  &lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.aisto.com/roeder/dotnet/&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;Reflector&lt;/strong&gt;&lt;/a&gt; -- If you are a .NET developer and you&#39;ve never used Reflector before you should probably reconsider calling yourself a .NET developer. Reflector lets you peek inside assemblies and dissect the source code, embedded resources, etc... Where it becomes very useful in debugging is when you don&#39;t happen to have the source for a particular assembly but you do have access to the assembly itself. If you know the method where a failure is occurring from a stack trace in an error message or memory dump you can load the assembly in reflector to peek at the source for the method and get an idea of what might be causing the failure. It &lt;a href=&quot;http://blogs.msdn.com/sburke/archive/2008/01/16/configuring-visual-studio-to-debug-net-framework-source-code.aspx&quot; target=&quot;_blank&quot;&gt;used to be&lt;/a&gt; the only good way to take a peak inside the .NET framework DLLs if you had an itch to know what was going on in there. There are also a wealth of &lt;a href=&quot;http://www.codeplex.com/reflectoraddins&quot; target=&quot;_blank&quot;&gt;add-ins&lt;/a&gt; available for Reflector to extend its capabilities in various ways. &lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.fiddler2.com/&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;Fiddler&lt;/strong&gt;&lt;/a&gt; -- An indispensable resource for you web developers out there. It acts as an HTTP debugging proxy between your machine and the net allowing you to inspect network traffic, set breakpoints, and otherwise mess with the data. It also includes a powerful scripting system to enable even more advanced scenarios. I find this tool particularly useful in applications that make heavy use of AJAX. Often times when things go wrong in out-of-band calls only strong knowledge of the HTTP pipeline and a network tracing tool can help you find what&#39;s going wrong. &lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.microsoft.com/downloads/details.aspx?FamilyID=18b1d59d-f4d8-4213-8d17-2f6dde7d7aac&amp;amp;displaylang=en&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;Network Monitor&lt;/strong&gt;&lt;/a&gt; -- This is the big brother to Fiddler when you need to get *really* low level with your network traffic analysis, analyze traffic outside of just your machine, or analyze traffic other than the HTTP variety. Like Fiddler it is highly customizable, scriptable, etc... It has a steep learning curve, but if you really need to get to this level of analysis to solve your problem you&#39;re probably already in deep doo-doo. &lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;Process Monitor&lt;/strong&gt;&lt;/a&gt; -- Originally developed as three separate tools (Filemon, Regmon, Procmon) by SysInternals after being bought by microsoft it has been compiled into one tool. This can be used to monitor activity against the registry and file system on your machine, as well as running processes. Useful in a number of situations such as permissions errors. &lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://msdn2.microsoft.com/en-us/library/aa373083(VS.85).aspx&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;Performance Counters&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; &lt;/strong&gt;-- Often times finding a problem is a process of elimination. Often times performance counters can be a good place to start that process. For instance, when troubleshooting memory issues a quick examination of memory related counters can indicate the type of leak that is occurring. A jump in virtual bytes while private bytes remains stagnant points to a component reserving memory but not using it. So understanding what counters are available, what they mean, and how to use them can really narrow down the focus of a bug hunt. &lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://sqlprofiler.googlepages.com/&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;SQLExpress Profiler&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; / SQL Profiler&lt;/strong&gt; -- If you believe you&#39;ve got something going wrong with your access to your database these are the tools to use. They provide customizable filtered tracing of all SQL requests going to a server. &lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Event_Viewer&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;Windows Event Log&lt;/strong&gt;&lt;/a&gt; -- Often this is the first place to begin a bug hunt. Many system and application errors get logged here by default. Sometimes these messages will provide you with the exact information you need to solve the problem, while other times it can at least point you in the right direction. &lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://logging.apache.org/log4net/&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;Trace&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; &lt;/strong&gt;&lt;a href=&quot;http://www.codeplex.com/entlib&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;Files&lt;/strong&gt;&lt;/a&gt; -- Hopefully the application you are debugging writes its own log files in the event of an error. If so this would be the first place I&#39;d check when a problem occurs. &lt;/li&gt;&lt;/ol&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Well that&#39;s it for now! If anyone knows of other great debugging tools I should check out feel free to leave a comment and I&#39;ll add them to this list. &lt;/p&gt;</description><link>http://pragma-tech.blogspot.com/2008/03/ultimate-debug-tool-list.html</link><author>noreply@blogger.com (Scott Walker)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3114382043962780956.post-6069605688779705229</guid><pubDate>Sun, 24 Feb 2008 01:09:00 +0000</pubDate><atom:updated>2008-02-24T13:51:10.897-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">engineers</category><category domain="http://www.blogger.com/atom/ns#">performance</category><category domain="http://www.blogger.com/atom/ns#">streamofconsciousness</category><title>Performance -- The Implicit Feature Request</title><description>I&#39;ve been giving some thought recently to the fact that a lot of companies, and also a lot of developers don&#39;t give enough thought to application performance. It&#39;s something I know I&#39;ve been guilty of at times so don&#39;t think I&#39;m just pointing fingers. There is a very fine balance to be struck between being performance conscious and falling prey to premature optimization. Like most things, it&#39;s a balance I think that can be found by the application of due dilligence. Just like TDD is all the rage these days because it helps to ensure that your code is thoroughly unit tested (among other things), I believe a little automated performance testing could go a long way. &lt;br /&gt;&lt;br /&gt;The observation that made me wander down this path is that when you have a really short release cycle coupled with a mountain of requirements, performance testing is absolutely the first thing to go out the window (if it was even being done in the first place). It is also nearly a foregone conclusion that at least some of the items in that mountain of features are going to have a negative performance impact on an exisiting process in the system. Even in a well-architected, highly-modularized system, the more steps you add to an existing process the longer that process is going to take. This is where a fundamental disconnect in the software engineering process occurrs.&lt;br /&gt;&lt;br /&gt;Most users of an application fail to grasp the point I just made above. It&#39;s a problem that may actually be even a bit more sinister than it sounds at first. It&#39;s my conjecture that users expectations are such that at a *minumum* the application should perform at least as well as it used to, no matter how many new features were added to a new release. In fact, I think it&#39;s highly likely that users implicitly expect the performance to increase as a whole with each version... To them, the worth of an application is in what features it offers and it is just a given that those features will perform up to the characteristics they have set forth in their heads. They don&#39;t think to list &quot;performance&quot; as a requirement of a project or feature, nor I think should they have to. &lt;br /&gt;&lt;br /&gt;As software engineers and software engineering managers we are some of the most demanding software users there are! We tend to have a very low tolerance for software that doesn&#39;t function correctly, or speedily enough. Therefore, we are also intelligent enough to know that the users of the applications we create should not have to settle for anything less than the standards we set forth ourselves. It becomes our job then to bake performance considerations into our development process. That means, knowing how to perform meaningful performance testing and budgeting enough time in our estimates to allow that testing to happen.&lt;br /&gt;&lt;br /&gt;Given the choice between a meaningful business feature and &quot;performance improvements&quot;, end users and product owners are never going to choose &quot;performance improvements&quot; as a work item for a given iteration until performance has become so bad that it is already too late. Once you&#39;ve reached this point you are in very dangerous territory because as the old saying goes, &quot;the squeaky wheel gets the grease&quot;. The more that the end users complain about performance issues, the more likely it becomes that you&#39;ll have to get into a situation where you need to drop everything just to placate the angry mob banging down your door. At this point, you&#39;re lucky if the steps necessary to resolve the performance issues are anything short of a wide-scale rearchitecting of the system which nine times out of ten is not a valid option. When that happens you then run the risk of missing other established project deadlines which also leads to unhappy users. It&#39;s a vicious cycle to break free from and one that should be avoided at all costs.</description><link>http://pragma-tech.blogspot.com/2008/02/performance-implicit-feature-request.html</link><author>noreply@blogger.com (Scott Walker)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3114382043962780956.post-7174913027860311146</guid><pubDate>Tue, 12 Feb 2008 14:41:00 +0000</pubDate><atom:updated>2008-02-12T09:49:47.095-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">mobile</category><category domain="http://www.blogger.com/atom/ns#">nvidia</category><title>Time to buy NVIDIA stock?</title><description>Is there any geek out there who can read &lt;a href=&quot;http://www.electronista.com/articles/08/02/11/nvidia.apx.2500.mobile.gpu/&quot;&gt;this announcement&lt;/a&gt; without practically wetting their pants with excitement?  Could it be that my long-standing dreams of the perfect all in one device are nearing reality? If I could get my hands one a device with one of these, a true GPS, and a 32gb MicroSD card I think my life would be complete. Granted it&#39;s still going to probably be somewhat crippled by running Windows Mobile, but maybe this explains (aside from pressure from the iPhone) why MS has said that the &lt;a href=&quot;http://microsoft.blognewschannel.com/archives/2008/01/06/exclusive-windows-mobile-7-to-focus-on-touch-and-motion-gestures/&quot;&gt;next version&lt;/a&gt; of Windows Mobile is going to be a complete redesign?</description><link>http://pragma-tech.blogspot.com/2008/02/time-to-buy-nvidia-stock.html</link><author>noreply@blogger.com (Scott Walker)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3114382043962780956.post-5976748573210408146</guid><pubDate>Wed, 06 Feb 2008 01:36:00 +0000</pubDate><atom:updated>2009-12-02T09:08:15.253-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">DDD</category><category domain="http://www.blogger.com/atom/ns#">lambda</category><category domain="http://www.blogger.com/atom/ns#">LINQ</category><category domain="http://www.blogger.com/atom/ns#">POCO</category><category domain="http://www.blogger.com/atom/ns#">specification</category><title>Specifications, LINQ, and Lambdas</title><description>&lt;div&gt;In our current application that we work on the most our &quot;business objects&quot; follow more of an &lt;a href=&quot;http://en.wikipedia.org/wiki/Active_record&quot;&gt;ActiveRecord&lt;/a&gt; kind of model. Well more specifically they are sort of a heavily bastardized version of &lt;a href=&quot;http://www.lhotka.net/cslanet/Default.aspx&quot;&gt;Rocky Lhotka&#39;s CSLA&lt;/a&gt;, but who&#39;s keeping track? Looking towards the future, I&#39;ve done lots of research into alternative models that will hopefully help us solve many of the problems we&#39;ve got with our current implementation. It seems all the buzz these days is around &lt;a href=&quot;http://domaindrivendesign.org/&quot;&gt;DDD&lt;/a&gt;, &lt;a href=&quot;http://www.hibernate.org/343.html&quot;&gt;ORM&lt;/a&gt;, &lt;a href=&quot;http://martinfowler.com/articles/injection.html&quot;&gt;IOC, DI&lt;/a&gt;, et al. I have to say the more I&#39;ve read about those topics in particular the more enamoured I&#39;ve become with them and the very &lt;a href=&quot;http://en.wikipedia.org/wiki/POCO&quot;&gt;POCO&lt;/a&gt;, &lt;a href=&quot;http://weblogs.asp.net/pgielens/archive/2005/07/29/420995.aspx&quot;&gt;PI&lt;/a&gt; objects they facilitate. Furthermore I like that these tend to favor the use of patterns over specific frameworks.&lt;br /&gt;&lt;br /&gt;I was a big fan of CSLA when the .NET v1.1 version of it came out, and used it to some great success on a project back then. I&#39;ve been following its progress since then and although it certainly has some cool concepts in it, I feel as though it is slowly but steadily succumbing to the problem that is the eventual death of all frameworks, the &quot;silver bullet syndrome&quot;. CSLA has increasingly been trying to become everything to everybody and in the process I think it is becoming overly complex and heavy-handed as all frameworks that are around long enough seem to do. He&#39;s got some great concepts that I will consider borrowing for our implementations, but the framework as a whole no longer matches my style, nor indeed it seems the community at large.&lt;br /&gt;&lt;br /&gt;So back to the original point of this post, as we evolve to a more DDD oriented model than a CSLA oriented one, one of the main challenges we are working on is what the right way to do validation is. I agree with &lt;a href=&quot;http://ayende.com/Blog/archive/2007/04/02/Input-Validation-vs.Business-Rules-Validation.aspx&quot;&gt;Oren&lt;/a&gt; and &lt;a href=&quot;http://udidahan.weblogs.us/2007/04/30/generic-validation/&quot;&gt;Udi &lt;/a&gt;that there are different types of validation and that they should be addressed in different ways. The first piece of the puzzle I attempted to tackle is what they termed &quot;business rule validation&quot;. To me it makes sense that any kind of complex (non-input) validation should be performed by a specific object dedicated to that task as it promotes the greatest flexibility and reuse. This got me to thinking about the &lt;a href=&quot;http://www.martinfowler.com/apsupp/spec.pdf&quot;&gt;specification&lt;/a&gt; pattern as this type of validation is just one of the cases that pattern can be used for. The other great use of this pattern is for selecting a subset of objects from a master list, which ties in very well with the &lt;a href=&quot;http://martinfowler.com/eaaCatalog/repository.html&quot;&gt;repository&lt;/a&gt; pattern for object retrieval. This line of thinking eventually lead me to the idea of somehow creating an implementation of the specification pattern that could be used for both validation and entity selection (using &lt;a href=&quot;http://msdn2.microsoft.com/en-us/netframework/aa904594.aspx&quot;&gt;LINQ&lt;/a&gt;) types of scenarios. It seemed like a reasonable goal and one that could be very beneficial if done correctly.&lt;br /&gt;&lt;br /&gt;As I am a #pragma-tech programmer (pragmatic, get it?), I always like to see what work others may have done in the area. I hate being a plumber so I fired up a google search and turned up several articles on implementations of the specification pattern in .NET but the ones that were most interesting to me were &lt;a href=&quot;http://codebetter.com/blogs/ian_cooper/archive/2007/12/04/architecting-linq-to-sql-applications-part-4.aspx&quot;&gt;this one&lt;/a&gt; and &lt;a href=&quot;http://iancooper.spaces.live.com/blog/cns%21844BD2811F9ABE9C%21451.entry&quot;&gt;this one&lt;/a&gt;, both by Ian Cooper. I&#39;ll spare you the gory details of how its all works, you can go read Ian&#39;s articles for that. In short though, in these articles Ian pretty much lays out an implementation for exactly what I wanted to accomplish, but unfortunately neglected to include a download for the code. Luckily his articles themselves were detailed enough and contained enough code that I was able to get the gist.&lt;br /&gt;&lt;br /&gt;As I wanted to spend some time honing my C# / LINQ / lambda skills anyways I decided to take a crack at fleshing out an implementation of what he talks about to see how it all comes together. A few hours later I had it all banged out and the default implementation of what he was talking about worked quite nicely. There were a few warts with it that I didn&#39;t much like however that I decided to fix in my implementation...&lt;br /&gt;&lt;br /&gt;The first was that the only way to chain specifications was by writing code like this:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;Specification ProductSpec = new Specification&lt;dbproduct&gt;(p=&gt; p.PartNumber != string.Empty).And(new Specification(p=&gt; p.MinOrderQty &gt; 0));&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;I didn&#39;t like the fact that you had to create a new specification object inside the chaining method to make this work, so I overloaded those functions to also just directly take a lambda expression so you now you can do this which is more fluent in my opinion...&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/dbproduct&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;Specification ProductSpec = &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;new Specification&lt;dbproduct&gt;(p=&gt; p.PartNumber != string.Empty).And(p=&gt; p.MinOrderQty &gt; 0);&lt;/dbproduct&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;I also added extension methods for the IQueryable&lt;t&gt; and IEnumerable&lt;t&gt; methods that accept an instance of an ISpecification to use as the query filter. I think this is *much* nicer than the way Ian demonstrates doing it in his article as it can be done all in one line instead of the three that it took with his implementation. So now you can do:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;var prd =&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;               (from p in products&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;               select p).WhereSpecification(ProductSpecifications.ProductIsConfigurable);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;I also added caching of the compiled expression to improve performance.&lt;br /&gt;&lt;br /&gt;The end result is a way of creating a single object using a pretty fluent interface that you can then use to validate an object&#39;s state, or use in a LINQ expression against any type of LINQ datasource to specify a filter criteria. Pretty cool!&lt;br /&gt;&lt;br /&gt;The bits are &lt;a href=&quot;http://cid-c7b1a424eb69cc6f.skydrive.live.com/self.aspx/.Public/Specifications.zip&quot;&gt;here&lt;/a&gt;...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/t&gt;&lt;/t&gt;&lt;/div&gt;</description><link>http://pragma-tech.blogspot.com/2008/02/specifications-linq-and-lambdas.html</link><author>noreply@blogger.com (Scott Walker)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3114382043962780956.post-8817475772939785097</guid><pubDate>Tue, 05 Feb 2008 00:47:00 +0000</pubDate><atom:updated>2008-02-04T21:28:53.573-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">arcready</category><category domain="http://www.blogger.com/atom/ns#">jeff blankenburg</category><category domain="http://www.blogger.com/atom/ns#">josh holmes</category><category domain="http://www.blogger.com/atom/ns#">UX</category><title>Special Thanks</title><description>I want to give a special shout out today to &lt;a href=&quot;http://www.joshholmes.com/&quot;&gt;Josh Holmes&lt;/a&gt; and &lt;a href=&quot;http://www.jeffblankenburg.com/&quot;&gt;Jeff Blankenburg&lt;/a&gt;. I had the opportunity (much to my good fortune) to have a chat over lunch one day while attending &lt;a href=&quot;http://www.codemash.org/&quot;&gt;Codemash 2.0&lt;/a&gt;. We talked about some of the challenges that we are facing at my company when it comes to the design of the user experience for our applications. I attended Josh&#39;s &lt;a href=&quot;http://www.arcready,com/&quot;&gt;ArcReady &lt;/a&gt;presentation on Architecting for the UX last year and found it to be an excellent presentation. During our chat at Codemash, Josh offered to re-present that presentation especially for my organization.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Today after coming to town for the ArcReady SOA presentation for this quarter, Josh and Jeff delivered on that offer by coming to TDCI and spending a couple of hours talking to us and answering our questions. I think these guys went above and beyond the call of duty in attempting to tailor the presentation to address some of the specific challenges we face as a company. For that, guys I salute you!&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWUyJoKDR8t5rJ1kXprIMe_l6So1HnOvHcGgnNOfKoy3Wquon6D7N7oRy1pRSzbnQwKEq3_6o-MBNk6qROcPO6kOx4acKYAPUmiR1JtaSOEUIUIB2L0W3hfhuRMKvUz1l5KljEkv827Ok/s1600-h/salute.jpg&quot;&gt;&lt;img id=&quot;BLOGGER_PHOTO_ID_5163316513213038338&quot; style=&quot;DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center&quot; alt=&quot;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWUyJoKDR8t5rJ1kXprIMe_l6So1HnOvHcGgnNOfKoy3Wquon6D7N7oRy1pRSzbnQwKEq3_6o-MBNk6qROcPO6kOx4acKYAPUmiR1JtaSOEUIUIB2L0W3hfhuRMKvUz1l5KljEkv827Ok/s200/salute.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;I highly recommend anyone who has a problem in their development process to call upon these guys and see what they can do for you. I guarantee that if they don&#39;t have the particular skillset needed to address your issue they certainly know someone who does and will be more than willing to put you in contact with them.&lt;/p&gt;&lt;p&gt;So again, one last time... Josh, Jeff... thanks!&lt;/p&gt;</description><link>http://pragma-tech.blogspot.com/2008/02/special-thanks.html</link><author>noreply@blogger.com (Scott Walker)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWUyJoKDR8t5rJ1kXprIMe_l6So1HnOvHcGgnNOfKoy3Wquon6D7N7oRy1pRSzbnQwKEq3_6o-MBNk6qROcPO6kOx4acKYAPUmiR1JtaSOEUIUIB2L0W3hfhuRMKvUz1l5KljEkv827Ok/s72-c/salute.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3114382043962780956.post-9107721328490203909</guid><pubDate>Thu, 31 Jan 2008 14:44:00 +0000</pubDate><atom:updated>2008-01-31T10:01:25.935-05:00</atom:updated><title>Is Great *really* great?</title><description>Jeff Attwood never ceases to amaze me with his always &lt;a href=&quot;http://www.codinghorror.com/blog/archives/001046.html&quot;&gt;insightful commentary&lt;/a&gt; on oh... just about anything!  I truly don&#39;t know when he finds the time to put together these incredibly articulate, thought provoking, and well researched blog posts. I am however truly glad that he does as he gives me something to think about on practically a daily basis.&lt;br /&gt;&lt;br /&gt;Today&#39;s topic from Jeff is about how greatness is achieved. It challenges the old proverb of &lt;blockquote&gt;&quot;Reach for the stars and at worst you&#39;ll land on the roof...&quot;&lt;/blockquote&gt;The premise is that greatness is something that is extremely hard to achieve. It takes an incredibly large set of variables to all have the right values at the right time to be great. The natural variability there makes it nearly impossible to be consistently great. So the argument that I tend to agree with is that the way you achieve greatness is being demonstrably, repeatably, consistently *good* over a long period of time.&lt;br /&gt;&lt;br /&gt;I agree with this because I think this applies very much to the way I feel about my own career thus far. I certainly do not consider myself to be one of the &lt;a href=&quot;http://www.codinghorror.com/blog/archives/001002.html&quot;&gt;&quot;astronaut&quot;&lt;/a&gt; programmers out there. I don&#39;t live, breathe, and dream code like some of these guys do. I just have too many other interests to let coding be such an all-consuming factor in my life. I do think however that over the course of my career thus far I have demonstrated time and time again that I am very good at whatever it is I choose to do.&lt;br /&gt;&lt;br /&gt;So I guess if you believe in Jeff  (and the material he references) then that means there is hope out there for all of us who don&#39;t consider ourselves to be &quot;astronauts&quot; to one day achieve greatness.</description><link>http://pragma-tech.blogspot.com/2008/01/is-great-really-great.html</link><author>noreply@blogger.com (Scott Walker)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3114382043962780956.post-6158951225214820934</guid><pubDate>Tue, 22 Jan 2008 15:10:00 +0000</pubDate><atom:updated>2008-01-25T15:38:34.643-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">debugging</category><category domain="http://www.blogger.com/atom/ns#">engineers</category><category domain="http://www.blogger.com/atom/ns#">Microsoft</category><category domain="http://www.blogger.com/atom/ns#">movies</category><category domain="http://www.blogger.com/atom/ns#">support</category><title>What Movie Plot Is Your Product Support Experience Like?</title><description>Every job I&#39;ve had in my career thus far has been for smaller sized companies. When you work for a smaller company as I have you quickly discover that everyone generally &quot;wears a lot of hats&quot;. Everyone is expected to take on responsibilities outside the scope of what it is you were initially hired / educated to do. Being a software engineer by trade, one of the extra hats I&#39;ve found I had to wear at every job so far is that of 3rd level product support. It&#39;s a role that I find engenders a lot of passion in people who have to work it. It&#39;s either love or hate with very little in between.&lt;br /&gt;&lt;br /&gt;Personally I lean toward the love it end of the spectrum in an odd masochistic sort of way. You see, what I have found is that this role provides some very unique and challenging scenarios, rife with unusual problems that require an out of the box thinker to solve efficiently and effectively. It forces my brain to think in ways that are different from the pattern it falls into during my day-to-day work. Since I had to tackle this role (to some degree) in my first job out of college, the other observation I have made is this:&lt;br /&gt;&lt;blockquote style=&quot;font-style: italic;&quot;&gt;Ironically, as a software engineer just starting your career, you are likely to make the most mistakes you will ever make, and also least well equipped to find and fix those mistakes when it matters.&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;It is for that very reason that I have made it my personal &quot;quest&quot; of sorts to find tools and techniques to deal with these types of challenging situations while attempting to maintain my sanity and also have some fun along the way. At some point in the future I will be delivering a core dump of my knowledge accumulated on this subject for the &lt;a href=&quot;http://www.condg.org/&quot;&gt;Central Ohio .NET Developer Group&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In the meantime, the mention of a &quot;quest&quot; has brought us, dear reader, in my rambling, circuitous fashion to the point of this post. I was ruminating the other night over some support experiences I&#39;ve had from a consumer experience with other companies and it occurred to me that with a little thought they could all be likened to movie plots.&lt;br /&gt;&lt;br /&gt;The company that I have by far had the most of these support experiences with is &lt;a href=&quot;http://www.microsoft.com/&quot;&gt;Microsoft&lt;/a&gt;. Quite often I have found when attempting to find the solution to one complex problem or another that the underlying issue appeared to be coming from &lt;a href=&quot;http://www.microsoft.com/sql/default.mspx&quot;&gt;one&lt;/a&gt; Microsoft product or &lt;a href=&quot;http://www.microsoft.com/windows/products/winfamily/ie/default.mspx&quot;&gt;another&lt;/a&gt;. The collective experiences I&#39;ve had on these calls has lead me to believe that Microsoft has modeled their developer support call process after the plot of the movie &lt;a href=&quot;http://www.imdb.com/character/ch0042091/&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;The Princess Bride.&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As is the case with any movie we must first establish a cast of characters for the plot to unfold around. For the sake of this dramatization, I of course will be playing the part of the strapping young hero Westley:&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9-gaImFHhwD1oW6A2DMH1ALDvZw5-gTYhj4E0DqyC8-YkUJONc0XPDwspsylZCbtDn_YlWGe_iRteXizxGKOXJL0-Pp0iGFG2xUCZbxYWX69nxYTfl5puE08oQx2zCjhv7ROR4RLb-Xg/s1600-h/westley.jpg&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 178px; height: 128px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9-gaImFHhwD1oW6A2DMH1ALDvZw5-gTYhj4E0DqyC8-YkUJONc0XPDwspsylZCbtDn_YlWGe_iRteXizxGKOXJL0-Pp0iGFG2xUCZbxYWX69nxYTfl5puE08oQx2zCjhv7ROR4RLb-Xg/s200/westley.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5159434696001109634&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Westley was just a poor overworked programmer slaving day in and day out to make ends meet. He had big dreams however of one day making lots of money by releasing the 1.0 version of the most beautiful application in the world that he had codenamed &quot;ButterCup&quot;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggFkLP9yW5SVQtra66FfWHQKyflk4nCZ5S-o6XxpTSm0n64ZZ5hyphenhyphen8lolex3fcYg7pYbMieFGRpP979spSf2wRq6eAEsViwzo0uR4mMzPUlw7nHYc5JuDNWwLNmJCjzmzeWeOFy-klseI0/s1600-h/5938.jpg&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggFkLP9yW5SVQtra66FfWHQKyflk4nCZ5S-o6XxpTSm0n64ZZ5hyphenhyphen8lolex3fcYg7pYbMieFGRpP979spSf2wRq6eAEsViwzo0uR4mMzPUlw7nHYc5JuDNWwLNmJCjzmzeWeOFy-klseI0/s200/5938.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5159443900116024994&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;There was however, just one small problem regarding Westley&#39;s dream of living happily ever after with Buttercup... You see in beta testing Buttercup&#39;s users discovered a particularly nasty flaw in buttercup. A particular sequence of events that seemed to occur on a monthly basis would cause Buttercup to fly completely off the handle, corrupt important data and give the users one of these:&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_DVyM2wFqbB96jHbfar179A037kzow7FWlatPN4uPVqKclSRh2S1T7o5s6vW18WWRXH2EwsUjpxK2G7ZPdxcFQvRn3wcfIH18EGjFmAWsCsGK9-gth7ZnhzDXd4vuXoXwFz0XKFBs-Do/s1600-h/bsod.jpg&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_DVyM2wFqbB96jHbfar179A037kzow7FWlatPN4uPVqKclSRh2S1T7o5s6vW18WWRXH2EwsUjpxK2G7ZPdxcFQvRn3wcfIH18EGjFmAWsCsGK9-gth7ZnhzDXd4vuXoXwFz0XKFBs-Do/s200/bsod.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5159445472074055346&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;This was obviously a serious roadblock in Westley&#39;s plans as a an error this serious in nature was unacceptable in production level software and therefore was preventing him from releasing the product. Not to be deterred, Westley did the only thing he knew to do and fired up his trusty development environment and attempted to debug the problem. As it turned out, this was a particularly precocious problem. Westley put forth a herculean effort (akin to climbing the cliffs of insanity) attempting to find the source of he issue. Many sleepless nights and many cases of &lt;a href=&quot;http://www.bawls.com/&quot;&gt;bawls&lt;/a&gt; later he was exhausted and no closer to solving the issue. The one good thing that came out of all this work was that problem did not seem to be occurring as a result of Buttercup&#39;s application code, but rather a bug in a Microsoft component used by the application.&lt;br /&gt;&lt;br /&gt;It was at this point that with no other place to turn Westley decided to place a call to Microsoft developer support. The person that picks up the line on the other end is none other than this guy, let&#39;s call him Inigo:&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIBz7x1LkfjAlA7tTXBllULBlsw3os_yoFbGDu2MR3RoBbC9eoUOQ1mw0nJQhS2zjytUU3lRGH_pJnMbNnTqRGpa4bhnZg84lHGNmHOy2cBouTUnP5HJxNZqw13rI93TmEP-O2YNDzH_E/s1600-h/inigo.jpg&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIBz7x1LkfjAlA7tTXBllULBlsw3os_yoFbGDu2MR3RoBbC9eoUOQ1mw0nJQhS2zjytUU3lRGH_pJnMbNnTqRGpa4bhnZg84lHGNmHOy2cBouTUnP5HJxNZqw13rI93TmEP-O2YNDzH_E/s200/inigo.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5159482988613385922&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Inigo sensing the frustration and exhaustion in Westley&#39;s voice very respectfully proceeds to ask Westley a series of questions:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Who are you?&lt;/li&gt;&lt;li&gt;Do you have a support case number?&lt;/li&gt;&lt;li&gt;What are you calling about?&lt;/li&gt;&lt;/ol&gt;And quite suspiciously...&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Do you by any chance have six fingers on your right hand?&lt;/li&gt;&lt;/ol&gt;Westley, quite baffled by the last question and sensing Inigo&#39;s growing impatience over the duration of the conversation deftly steers the conversation in  a new direction and so the duel begins... It&#39;s a fierce exchange to behold! Inigo presses Westley hard suggesting incorrect product groups he should be directed to next. Westley in turn parries with an alternate suggestion, and Inigo counters with yet another. The battle rages on for some minutes until Inigo finally succumbs to Westley&#39;s masterful negotiation skills, and transfers Westley on to become someone else&#39;s problem to deal with...&lt;br /&gt;&lt;br /&gt;And now a new person is on the other end of the phone line... Let&#39;s call him Fezzik:&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkohWYO0UedfyR6GCB2h7_wuiKXCtp7i1gB6jGfGzaojV-g_ZEfsJ-YB3thOObni7aRlG0k0oobKc4V-1miycRw67I__-GG5ruX_TGR-JQK00mefc79Zfrprmx3Si39yI3chkZzWN1n4g/s1600-h/fezzik-1.jpg&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkohWYO0UedfyR6GCB2h7_wuiKXCtp7i1gB6jGfGzaojV-g_ZEfsJ-YB3thOObni7aRlG0k0oobKc4V-1miycRw67I__-GG5ruX_TGR-JQK00mefc79Zfrprmx3Si39yI3chkZzWN1n4g/s200/fezzik-1.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5159488116804337362&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;Fezzik and Westley converse for a few minutes in which Westley has to re-answer most of the questions he prviously answered for Inigo. It quickly becomes apparent to Westley that Fezzik is not the brightest bulb on the strand and will be no help to him on his quest to save his beloved Buttercup. In fact it appears that Fezzik&#39;s sole job on this call is to bludgeon Westley to death through brute force, repetitive, inconsequential questioning! After an excruciatingly painful exchange, Westley through sheer perseverance and determination finally manages to overcome the fearsome giant with the mind of a mental midget. And again  he is transfered on to become someone else&#39;s problem...&lt;br /&gt;&lt;br /&gt;At this point, INCONCEIVABLY, a new voice comes on the line... The voice belongs to a weaselly little man we shall call Vizzini:&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjCL_eBoAf8CxB6i9d1uLAd7o8k_QdHZr1QdUjMjqfpQnbTVhph__TmRO0IYJGPoPWQPmBINd6PEYADYmGHSY1OClv6hESYCC6fTFOiGSYRIFov-bQ6IfU8v32uSZDH11-92Z2mY9KezQ/s1600-h/princess-bride.jpg&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjCL_eBoAf8CxB6i9d1uLAd7o8k_QdHZr1QdUjMjqfpQnbTVhph__TmRO0IYJGPoPWQPmBINd6PEYADYmGHSY1OClv6hESYCC6fTFOiGSYRIFov-bQ6IfU8v32uSZDH11-92Z2mY9KezQ/s200/princess-bride.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5159494125463584482&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Vizzini is a crafty little fellow with an over inflated sense of his own self-worth. He boasts of how much of a genius he is saying things such as:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;&quot;Let me put it this way:  have you ever heard of Guthrie, Hanselman, Ford? ... Morons!&quot;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;It is clear however that Vizzini holds Buttercup hostage by not providing the answers Westley needs and thus Westley must somehow find a way to overcome Vizzini. Vizzini attempts to get the best of Westley by using flattery and misdirection and generally flaunting his self-perceived massive intellect. He offers suggestions and hints that seem likely to work just to throw Westley off the track as he can not ever admit to being wrong. In the end however it is Westley who triumphs. With the facts and evidence on his side Westley turns the tables on Vizzini by providing two samples that clearly demonstrate the issue (poisoning both goblets if you will) that clearly demonstrate the problem. In the end Vizzini concedes, admits to being wrong and provides Westley a hotfix to test that should solve all of Buttercup&#39;s problems.&lt;br /&gt;&lt;br /&gt;So now Westley with Buttercup in tow must navigate the technical and political quagmire of updating the beta clients environments and re-testing the application after the fix is applied. There are many perils to this particular quaqmire...&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Creating a proper hotfix package for the application.&lt;/li&gt;&lt;li&gt;Ensuring correct application of the hotfix to all beta customer environments.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Both of which are easy to avoid once you know what you are looking for. The real danger in all this mess however are the H.O.U.Ses...  which are spoken of in legend and only rumored to exist. Much to Westley&#39;s horror however as legends in fairy tale stories often do come true, so did this legend come true. Further testing of Buttercup by the beta customers swiftly revealed that the fix he had been given by Vizzini did not truly solve the problem and was indeed an H.O.U.S (Hotfixes Of Untested Stature)!&lt;br /&gt;&lt;br /&gt;So Westley once again was forced to call Microsoft and this time having conquered Vizzini he was finally allowed to talk to the man who could truly solve his problem... Humperdink!&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsnwhAUbp-Uzmeq-fSdbc7rEaFdClSDNVdbNmNOsVLDw0mD5pTW3xv9x6k9pGPbG-ElfvmRhyphenhyphenJ3o_HRtsYgTGAfo2xCqx45aJJOfqs_Z1729Kqut8S-ARxi8qreuDQRHpdRpDi7yRvkZs/s1600-h/3202858_std.jpg&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsnwhAUbp-Uzmeq-fSdbc7rEaFdClSDNVdbNmNOsVLDw0mD5pTW3xv9x6k9pGPbG-ElfvmRhyphenhyphenJ3o_HRtsYgTGAfo2xCqx45aJJOfqs_Z1729Kqut8S-ARxi8qreuDQRHpdRpDi7yRvkZs/s200/3202858_std.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5159508973165526770&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;You see ultimately Humperdink was the guy responsible for creating this whole mess in the first place by creating the bug in the Microsoft component that was causing Buttercup to go haywire, and only he was capable of fixing it correctly. Humperdink is quite an angry bitter fellow who puts on a very tough exterior and at first refuses to solve the problem claiming it has to remain for &quot;backwards compatibility&quot; reasons. This of course is a ridiculous excuse, and after significant  verbal posturing by Westley about a duel &quot;to the pain&quot;, Humperdink crumples like the girly-man he really is and concedes to create a real fix for the problem.&lt;br /&gt;&lt;br /&gt;So Westley&#39;s long and grueling quest is now finally at an end. He gets the hotfix that he desperately wants and deserves applies it to Buttercup and the two live happily ever after having a life of riches and luxury.&lt;br /&gt;&lt;br /&gt;Although the Microsoft style can be arduous and time-consuming, at least it is modeled after a movie that I truly love. Other companies fall far short of achieving even that. A certain COMPONENT vendor (who shall remain nameless) for instance appears to me to have modeled their support experience on a foreign language adaptation of &lt;a href=&quot;http://www.imdb.com/title/tt0329028/&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Dumb &amp;amp; Dumberer&lt;/span&gt;&lt;/a&gt;. It&#39;s like somebody took &lt;a href=&quot;http://www.imdb.com/title/tt0109686/&quot;&gt;something&lt;/a&gt; that was already horrible in the first place, somehow made it even more horrible and then made a foreign language version of that even more horrible thing so that now besides being absolutely abysmal you can only understand half of what is being said.&lt;br /&gt;&lt;br /&gt;PLEASE! Don&#39;t let your support experience be like that!&lt;br /&gt;&lt;br /&gt;Do whatever it takes to make your support experience more like this movie:&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://www.imdb.com/title/tt0271027/&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggsvlFZhz400xEbArpBpIiFRlF-8QwikZ4rMLwZ52BG7YuIVBwi6ypIGKFXYgflQ4PT-GthgrifMhJNSTLsrxWO6uOK9SmhL5SDYL-mGJucp_JNF4kafcirBiMiRjiRGoppvAR3_FQA1U/s200/kod.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5159047058022776434&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;Wherein you are a total ninja badass capable of turning anything around you into a weapon in your arsenal of tricks you can use to solve your customer&#39;s problems!</description><link>http://pragma-tech.blogspot.com/2008/01/what-movie-plot-is-your-product-support.html</link><author>noreply@blogger.com (Scott Walker)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9-gaImFHhwD1oW6A2DMH1ALDvZw5-gTYhj4E0DqyC8-YkUJONc0XPDwspsylZCbtDn_YlWGe_iRteXizxGKOXJL0-Pp0iGFG2xUCZbxYWX69nxYTfl5puE08oQx2zCjhv7ROR4RLb-Xg/s72-c/westley.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3114382043962780956.post-6954296788571862315</guid><pubDate>Thu, 10 Jan 2008 21:53:00 +0000</pubDate><atom:updated>2008-01-10T17:11:33.763-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">codemash</category><category domain="http://www.blogger.com/atom/ns#">rock band</category><title>Codemash 2008 Highlights</title><description>Thankfully I work for a &lt;a href=&quot;http://www.tdci.com/&quot;&gt;company&lt;/a&gt; that believes in continuous learning and improvement and was lucky enough to have them sponsor my trip to &lt;a href=&quot;http://www.codemash.org/&quot;&gt;Codemash&lt;/a&gt; 2008. Along with all the really cool presentations on topics across the gamut of technology, there are tons of other fun activities to participate.&lt;br /&gt;&lt;br /&gt;If pictures are worth a thousand words, then here are two thousand words to describe the highlight of my experience thus far:&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYax2ijf-ZgNTSqwmmPoiSvau4BSqU0P9i1kisrXfrn27dXa_2C07IwFwAhL_dOX5wu5DOA8QW5AI7DAJBolARFmtKEIBPclDrS_wwjr7hg5iT44eePNYrbTjnj2ec_kX77HCm85DN8fE/s1600-h/Codemash+2008+-+001.jpg&quot;&gt;&lt;img style=&quot;margin: 0pt 10px 10px 0pt; cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYax2ijf-ZgNTSqwmmPoiSvau4BSqU0P9i1kisrXfrn27dXa_2C07IwFwAhL_dOX5wu5DOA8QW5AI7DAJBolARFmtKEIBPclDrS_wwjr7hg5iT44eePNYrbTjnj2ec_kX77HCm85DN8fE/s320/Codemash+2008+-+001.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5153972463949235282&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhULysj8hEWF33YF0qef4z4B5BcL4sqI2d6mVsG0Yr6lAXXszDEjOX0tRlUsFt0n-upcMpvkUOcpq72PJ5OHhki46owUK2hVEiiEuH5z4GGpnsrv68ts_vXjr2Em_JWTWoh6pXo7TZEliY/s1600-h/Codemash+2008+-+002.jpg&quot;&gt;&lt;img style=&quot;margin: 0pt 10px 10px 0pt; cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhULysj8hEWF33YF0qef4z4B5BcL4sqI2d6mVsG0Yr6lAXXszDEjOX0tRlUsFt0n-upcMpvkUOcpq72PJ5OHhki46owUK2hVEiiEuH5z4GGpnsrv68ts_vXjr2Em_JWTWoh6pXo7TZEliY/s320/Codemash+2008+-+002.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5153972472539169890&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;For those of you not &quot;in the know&quot; that&#39;s none other than &lt;a href=&quot;http://www.hanselman.com/blog/&quot;&gt;Mr. Hansleman&lt;/a&gt; himself rocking out with me on some &lt;a href=&quot;http://www.rockband.com/&quot;&gt;Rock Band&lt;/a&gt; for the 360.</description><link>http://pragma-tech.blogspot.com/2008/01/codemash-2008-highlights.html</link><author>noreply@blogger.com (Scott Walker)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYax2ijf-ZgNTSqwmmPoiSvau4BSqU0P9i1kisrXfrn27dXa_2C07IwFwAhL_dOX5wu5DOA8QW5AI7DAJBolARFmtKEIBPclDrS_wwjr7hg5iT44eePNYrbTjnj2ec_kX77HCm85DN8fE/s72-c/Codemash+2008+-+001.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3114382043962780956.post-4432322391091517717</guid><pubDate>Fri, 01 Jun 2007 14:51:00 +0000</pubDate><atom:updated>2007-06-01T10:51:43.925-04:00</atom:updated><title>Less Code, But More Ways To Write It?</title><description>&lt;p&gt;I would say that I have to agree with &lt;a href=&quot;http://www.codinghorror.com&quot;&gt;Jeff Atwood&lt;/a&gt;&#39;s recent &lt;a href=&quot;http://www.codinghorror.com/blog/archives/000878.html&quot;&gt;blog post&lt;/a&gt;&amp;nbsp;about writing less code. Too often we fall into the trap of creating overly complex solutions to problems, when all that added complexity is completely unnecessary and furthermore just causes problems down the road. I see this as much more of a problem when you&#39;re not doing TDD then when you are, as you have the urge to attempt to solve every wacky edge case that might occur without thinking through if those edge cases are worth handling.&lt;/p&gt; &lt;p&gt;At the same time as &lt;a href=&quot;http://www.lhotka.net/weblog&quot;&gt;Rocky Lhotka&lt;/a&gt;&amp;nbsp;so eloquently &lt;a href=&quot;http://www.lhotka.net/weblog/ALackOfEnthusiasmInTheMicrosoftWorld.aspx&quot;&gt;pointed out&lt;/a&gt; and as I have blogged about in the past, we&#39;ve got more new things coming out of Microsoft to be excited about then at any time before. So how can we reconcile writing less code while at the same time having many more tools to write code in?&amp;nbsp; Any thoughts?&lt;/p&gt;</description><link>http://pragma-tech.blogspot.com/2007/06/less-code-but-more-ways-to-write-it.html</link><author>noreply@blogger.com (Scott Walker)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3114382043962780956.post-5547601434318332375</guid><pubDate>Sun, 15 Apr 2007 21:07:00 +0000</pubDate><atom:updated>2007-04-15T17:13:56.150-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Microsoft</category><title>Why it&#39;s A Good Time to be a Microsoft Developer</title><description>I was doing my usual daily check of what interesting new ideas all the creative people on my blogroll are coming up with when I came across an &lt;a href=&quot;http://knowledge.wharton.upenn.edu/article.cfm;jsessionid=a83047cdaa2083f157e4?articleid=1698&amp;CFID=9107310&amp;amp;CFTOKEN=92908806&amp;jsessionid=a83047cdaa2083f157e4&quot;&gt;interview&lt;/a&gt; with &lt;a href=&quot;http://rayozzie.spaces.live.com/&quot;&gt;Ray Ozzie&lt;/a&gt;, Chief Software Architect for Microsoft. I didn&#39;t know much about the man until reading this piece, but I can tell you that from now on I&#39;ll be listening to see what it is he has to say. There were some really great questions in this interview, and some even greater answers!&lt;br /&gt;&lt;br /&gt;Aside from all of the really cool stuff coming out of MS right now, with this guy at the healm I envision only more great things to come that will allow us to write great apps for our customers. If at the end of the day that&#39;s not why you&#39;re here then you&#39;re in it for all the wrong reasons.</description><link>http://pragma-tech.blogspot.com/2007/04/why-its-good-time-to-be-microsoft.html</link><author>noreply@blogger.com (Scott Walker)</author><thr:total>0</thr:total></item></channel></rss>