<?xml version="1.0" encoding="UTF-8"?> <rss
version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
><channel><title>penitent, turbulent, multiplex! &#187; Software</title> <atom:link href="http://mikedebo.ca/category/software/feed/" rel="self" type="application/rss+xml" /><link>http://mikedebo.ca</link> <description>Michael (debo) DiBernardo&#039;s blog.</description> <lastBuildDate>Thu, 06 Oct 2011 15:31:26 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.0.1</generator> <item><title>Drag and drop behavior for Silverlight apps in SketchFlow</title><link>http://mikedebo.ca/2009/10/21/drag-and-drop-behavior-for-silverlight-apps-in-sketchflow/</link> <comments>http://mikedebo.ca/2009/10/21/drag-and-drop-behavior-for-silverlight-apps-in-sketchflow/#comments</comments> <pubDate>Wed, 21 Oct 2009 16:38:17 +0000</pubDate> <dc:creator>Debo</dc:creator> <category><![CDATA[Software]]></category><guid
isPermaLink="false">http://mikedebo.ca/?p=140</guid> <description><![CDATA[I&#8217;ve been using the ExpressionBlend 3 SketchFlow trial lately to drum up some Silverlight prototypes. If you&#8217;ve seen the videos for SketchFlow, you probably noticed the little bit where he attached a DragDrop behaviour to a listbox and poof! Everything worked! Well, that was a bit of smoke and mirrors. That behaviour doesn&#8217;t ship directly [...]]]></description> <content:encoded><![CDATA[<p>I&#8217;ve been using the ExpressionBlend 3 SketchFlow trial lately to drum up some Silverlight prototypes. If you&#8217;ve seen the <a
href="http://videos.visitmix.com/MIX09/c01f">videos for SketchFlow</a>, you probably noticed the little bit where he attached a DragDrop behaviour to a listbox and poof! Everything worked!</p><p>Well, that was a bit of smoke and mirrors. That behaviour doesn&#8217;t ship directly with SketchFlow at all. You can find it in the Snowboarding sample application and drag it into your project directly if you want, but that only works for WPF prototypes.</p><p>After hacking around a bunch of things that I would consider bugs in the Silverlight 3.0 SDK, I managed to port this behaviour to Silverlight. So, if you want to drag and drop items between listboxes in your Silverlight SketchFlow app, this one is for you.</p><p>Get it here: <a
href="/files/SketchFlow/SilverlightDragDropCopyItem.cs">SilverlightDragDropCopyItem.cs</a></p><p>You just have to drag it into the [blah]Screens folder of your project, and it will show up under Assets -> Behaviors.</p> ]]></content:encoded> <wfw:commentRss>http://mikedebo.ca/2009/10/21/drag-and-drop-behavior-for-silverlight-apps-in-sketchflow/feed/</wfw:commentRss> <slash:comments>5</slash:comments> </item> <item><title>Published in ACM Crossroads</title><link>http://mikedebo.ca/2009/09/28/published-in-acm-crossroads/</link> <comments>http://mikedebo.ca/2009/09/28/published-in-acm-crossroads/#comments</comments> <pubDate>Mon, 28 Sep 2009 16:16:30 +0000</pubDate> <dc:creator>Debo</dc:creator> <category><![CDATA[Happenings]]></category> <category><![CDATA[Software]]></category><guid
isPermaLink="false">http://mikedebo.ca/?p=136</guid> <description><![CDATA[The article that I mentioned in my last post has been published in the Fall 2009 issue of ACM Crossroads: http://mags.acm.org/crossroads/2009fall You can jump to it by clicking on the &#8220;Career Advice: &#8230;&#8221; link on the front cover. Unfortunately, I no longer have a print subscription to Crossroads, so I won&#8217;t get to see my [...]]]></description> <content:encoded><![CDATA[<p>The article that I mentioned in my last post has been published in the Fall 2009 issue of ACM Crossroads:</p><p><a
href="http://mags.acm.org/crossroads/2009fall">http://mags.acm.org/crossroads/2009fall</a></p><p>You can jump to it by clicking on the &#8220;Career Advice: &#8230;&#8221; link on the front cover. Unfortunately, I no longer have a print subscription to Crossroads, so I won&#8217;t get to see my work on paper. But I know it&#8217;s out there <img
src='http://mikedebo.ca/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p><p>Now to start working on the next one&#8230;</p> ]]></content:encoded> <wfw:commentRss>http://mikedebo.ca/2009/09/28/published-in-acm-crossroads/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>It worked.</title><link>http://mikedebo.ca/2009/08/19/it-worked/</link> <comments>http://mikedebo.ca/2009/08/19/it-worked/#comments</comments> <pubDate>Wed, 19 Aug 2009 20:49:12 +0000</pubDate> <dc:creator>Debo</dc:creator> <category><![CDATA[Happenings]]></category> <category><![CDATA[Software]]></category><guid
isPermaLink="false">http://mikedebo.ca/2009/08/19/it-worked/</guid> <description><![CDATA[I am apparently going to have an article published in the fall edition of magazine which I will leave unnamed until the issue is actually released. I don&#8217;t want to jinx it. I think I&#8217;m going to work on the powerlifting article next. I also had a bit of inspiration at the 2009 Toronto Code [...]]]></description> <content:encoded><![CDATA[<p>I am apparently going to have an article published in the fall edition of magazine which I will leave unnamed until the issue is actually released. I don&#8217;t want to jinx it.</p><p>I think I&#8217;m going to work on the powerlifting article next. I also had a bit of inspiration at the 2009 Toronto Code retreat, where I threw together a solution to Conway&#8217;s Game of Life using signal processing primitives from SICP (unfold, map, reduce, etc) in Python. I should probably write that up as well.</p><p>Finally, I&#8217;ve been putting a lot of my spare effort into a script for a videogame&#8230; so looks like the writing bug has hit for realz. It&#8217;ll probably get even worse when the sun disappears and I stop spending so much time on the beach.</p> ]]></content:encoded> <wfw:commentRss>http://mikedebo.ca/2009/08/19/it-worked/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Lesson 6: Be a knowledge archaeologist</title><link>http://mikedebo.ca/2009/04/16/lesson-6-be-a-knowledge-archaeologist/</link> <comments>http://mikedebo.ca/2009/04/16/lesson-6-be-a-knowledge-archaeologist/#comments</comments> <pubDate>Thu, 16 Apr 2009 14:24:49 +0000</pubDate> <dc:creator>Debo</dc:creator> <category><![CDATA[Software]]></category> <category><![CDATA[Software-shorts]]></category> <category><![CDATA[Thoughts]]></category> <category><![CDATA[torcampblog]]></category><guid
isPermaLink="false">http://mikedebo.ca/2009/04/?y%/lesson-6-be-a-knowledge-archaeologist/</guid> <description><![CDATA[In day-to-day conversation with other developers, a lot of points of debate tend to surface fairly often. A handful that I&#8217;ve run into recently: XML should/shouldn&#8217;t be used as a data storage format The best/most maintainable way to approach concurrency for performance is X The best/most maintainable way to approach concurrency for responsiveness is X [...]]]></description> <content:encoded><![CDATA[<p>In day-to-day conversation with other developers, a lot of points of debate tend to surface fairly often. A handful that I&#8217;ve run into recently:</p><ol><li>XML should/shouldn&#8217;t be used as a data storage format</li><li>The best/most maintainable way to approach concurrency for performance is X</li><li>The best/most maintainable way to approach concurrency for responsiveness is X</li><li>Object-oriented programming is better than / worse than / the same thing as functional/straightline programming</li></ol><p>And so on.</p><p>One of the few things that graduate school taught me is that a lot of problems that identify as &#8220;new&#8221; have actually been treated rather thoroughly somewhere back in the annals of time. It&#8217;s somewhat embarassing to have to learn this lesson as a software engineer, I think, since we&#8217;re a pretty young field as far as intellectual disciplines go.</p><p>I suspect that our ignorance of the past is because a lot of the good discussions surrounding them are in the primary literature, which for some reason tends to bring out a stubborn streak in many of the practitioners I know. I think that by suggesting articles from academic journals, some might feel that I&#8217;m being snooty, stuck up, or otherwise just showing off my education. I haven&#8217;t quite figured that one out yet. But it happens.</p><p>However, I feel like people are missing out. There&#8217;s some really good stuff out there. For example:</p><ul><li>To address point 1, the aptly-named Michael Stonebraker wrote a <a
href="http://mitpress.mit.edu/books/chapters/0262693143chapm1.pdf">great paper</a> on why XML is a terrible data storage format. (Thanks to Rachel Pottinger, my data management professor and supervisor.)</li><li>When researching point 2, I came across a bunch of wild algorithms from the early 80s for parallelizing problems that appear inherently sequential, like searching linked lists. These were written for the Lisp machines, which had hundreds of 1-bit &#8220;processors&#8221;.</li><li>When talking about point 3 in an operating systems course, we read a pair of papers (<a
href="http://www.cs.ubc.ca/~norm/508/2007W1/ouster95threadsbad.pdf">here</a> and <a
href="http://www.cs.ubc.ca/~norm/508/2007W1/vonbehren03eventsbad.pdf">here</a>)that each put forth reasons why events or threads were more appropriate for this task.</li><li>Point 4 has been discussed cogently in some very old books, many of which I babble about incessantly (the Structure and Interpretation of Computer Programs, and Object-Oriented Software Construction).</li></ul><p>It seems counterintuitive to me that so many current problems could have been so well addressed such a long time ago, but I guess it&#8217;s the nature of academia to predict (or invent) problems long before they actually become a pain point. The result of this is summed up nicely by Michael Stonebraker in the paper I linked above:</p><blockquote><p> Most current researchers were not around for many of the previous eras, and have limited (if any) understanding of what was previously learned. There is an old adage that he who does not understand history is condemned to repeat it. By presenting &#8216;ancient history&#8217;, we hope to allow future researchers to avoid replaying history.</p></blockquote> ]]></content:encoded> <wfw:commentRss>http://mikedebo.ca/2009/04/16/lesson-6-be-a-knowledge-archaeologist/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Lesson 5: Seek mentors and mentees</title><link>http://mikedebo.ca/2009/03/17/lesson-5-seek-mentors-and-mentees/</link> <comments>http://mikedebo.ca/2009/03/17/lesson-5-seek-mentors-and-mentees/#comments</comments> <pubDate>Tue, 17 Mar 2009 13:51:38 +0000</pubDate> <dc:creator>Debo</dc:creator> <category><![CDATA[Software]]></category> <category><![CDATA[Software-shorts]]></category> <category><![CDATA[Thoughts]]></category> <category><![CDATA[torcampblog]]></category><guid
isPermaLink="false">http://mikedebo.ca/2009/03/17/lesson-5-seek-mentors-and-mentees/</guid> <description><![CDATA[I think this one goes without saying in almost any discipline. Having a mentor &#8212; someone who is wiser than you in some aspect of what you are doing, and hearing out their suggestions &#8212; will always stretch your brain. Of course, it can take a while to find someone you click with and who [...]]]></description> <content:encoded><![CDATA[<p>I think this one goes without saying in almost any discipline. Having a mentor &#8212; someone who is wiser than you in some aspect of what you are doing, and hearing out their suggestions &#8212; will always stretch your brain. Of course, it can take a while to find someone you click with and who also has the time for you.</p><p>While you&#8217;re hunting for a mentor, you can get the next-best thing by reading the writings and the code of &#8220;famous&#8221; software engineers. Books like <em>Programmers at Work</em> and <em>Beautiful Code</em> are great for this sort of thing. And tons of very clever people write open-source software that you can peruse.</p><p>While seeking a mentor is a somewhat obvious way to improve, inverting that relationship by looking for a mentee &#8212; even when you&#8217;re very green yourself &#8212; is, in my opinion, a great way to improve as well. Einstein&#8217;s old adage of &#8220;You do not understand something unless you can explain it to a six-year-old&#8221; comes into play here.</p><p>I&#8217;ve had quite a few opportunities to teach intro-level computer science and software engineering courses, and these experiences clarified a whole bunch of things for me in a hurry. As I sought explanations and examples that would click well with an entire class, I started to learn what methods of organizing programs in the small would communicate well across a broad audience. I try to carry those lessons over into &#8220;real-world&#8221; projects, so that other developers can (hopefully) make the appropriate modifications to work I&#8217;ve done regardless of their skill level.</p><p>Plus, working with people who are just starting their journey is refreshing. Their optimism and the breadth of (often strange) approaches that they take to problems that to us are old hat is a lot of fun.</p><p>So, get out there! Give, take, interact. Humans are the interesting part of this craft, after all.</p> ]]></content:encoded> <wfw:commentRss>http://mikedebo.ca/2009/03/17/lesson-5-seek-mentors-and-mentees/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>More progress on SICP</title><link>http://mikedebo.ca/2009/03/10/more-progress-on-sicp/</link> <comments>http://mikedebo.ca/2009/03/10/more-progress-on-sicp/#comments</comments> <pubDate>Tue, 10 Mar 2009 21:08:22 +0000</pubDate> <dc:creator>Debo</dc:creator> <category><![CDATA[Books]]></category> <category><![CDATA[Software]]></category> <category><![CDATA[Thoughts]]></category><guid
isPermaLink="false">http://mikedebo.ca/2009/03/10/more-progress-on-sicp/</guid> <description><![CDATA[I&#8217;ve worked my way through roughly 30 more exercises in SICP, and decided it was time to clean house. The exercises to these solutions and supporting libraries have been posted on the SICP project page. The exercises in this chapter are interesting because they are so varied. They don&#8217;t really get more difficult, they just [...]]]></description> <content:encoded><![CDATA[<p>I&#8217;ve worked my way through roughly 30 more exercises in SICP, and decided it was time to clean house. The exercises to these solutions and supporting libraries have been posted on the <a
href="/projects/sicp/">SICP project page</a>.</p><p>The exercises in this chapter are interesting because they are so varied. They don&#8217;t really get more difficult, they just exercise a whole grab bag of different things that the authors are trying to show you. (The ones that the authors warn you are challenging are usually suffixed by &#8220;The answer to this would be worth a Ph.D/Turing prize/etc&#8221;. I haven&#8217;t been attempting those ones.)</p><p>Enjoy.</p> ]]></content:encoded> <wfw:commentRss>http://mikedebo.ca/2009/03/10/more-progress-on-sicp/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Lesson 4: Have a learning plan</title><link>http://mikedebo.ca/2009/02/24/lesson-4-have-a-learning-plan/</link> <comments>http://mikedebo.ca/2009/02/24/lesson-4-have-a-learning-plan/#comments</comments> <pubDate>Tue, 24 Feb 2009 14:50:49 +0000</pubDate> <dc:creator>Debo</dc:creator> <category><![CDATA[Software]]></category> <category><![CDATA[Software-shorts]]></category> <category><![CDATA[Thoughts]]></category> <category><![CDATA[torcampblog]]></category><guid
isPermaLink="false">http://mikedebo.ca/2009/02/24/lesson-4-have-a-learning-plan/</guid> <description><![CDATA[This should go without saying, but it&#8217;s surprising how long I went without actually doing it. A few years ago, I read Code Complete, which I&#8217;ve talked about at length here before. One of the first things that impressed me about that book was that it laid out a very precise reading plan that all [...]]]></description> <content:encoded><![CDATA[<p>This should go without saying, but it&#8217;s surprising how long I went without actually doing it.</p><p>A few years ago, I read <em>Code Complete</em>, which I&#8217;ve talked about at length here before. One of the first things that impressed me about that book was that it laid out a very precise reading plan that all newcomers to McConnell&#8217; company had to follow.</p><p>Until that point, I&#8217;d mostly picked up new books and tried new techniques whenever I felt like it. If I heard of some reference or thought of some activity that would be beneficial to my learning (e.g. reading book X, or doing programming exercise Y) I would jot it down in a looong to-do list, and hope to get to it eventually.</p><p>After I saw McConnell&#8217;s suggested reading list, I went back to my own bucket of learning items and loosely organized them into a sequence. I also defined what it would take to actually get the desired benefit out of each activity. For books, this meant anything from skimming the text to doing all of the exercises contained therein. For extended exercises or activities, I gave a bit of thought to the scope that would be required to actually learn anything from the attempt.</p><p>This has ultimately resulted in me getting more out of the time I spend learning about my craft. For example, I&#8217;d previously read the Structure and Interpretation of Computer Programs. It only took me a week, but I&#8217;d be hard-pressed to tell you anything about the last four chapters of the book.</p><p>I then read it again, about a year later. This time it took me significantly longer to finish, but I hadn&#8217;t retained much of it. I decided that, in order for this activity to be worthwhile, I&#8217;d have to do a significant portion of the exercises in the book.</p><p>So now I&#8217;ve been working on SICP for about a year, and I&#8217;m not even halfway done the work I believe I will have to do in order to consider myself done with it. Yes, that&#8217;s a very long time. But, the value I get from each session is much higher than it would be if I was just skimming the same material. That is, every time I sit down with SICP and a stack of paper, I come away an hour or two later feeling a whole lot wiser than when I sat down.</p><p>I feel that the few hours that it took me to organize my list of &#8220;things I&#8217;d like to learn about&#8221; into a loosely annotated and ordered plan has helped me a lot. Hopefully it might help you as well.</p> ]]></content:encoded> <wfw:commentRss>http://mikedebo.ca/2009/02/24/lesson-4-have-a-learning-plan/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Lesson 3: Think beyond OO</title><link>http://mikedebo.ca/2009/02/02/lesson-3-think-beyond-oo/</link> <comments>http://mikedebo.ca/2009/02/02/lesson-3-think-beyond-oo/#comments</comments> <pubDate>Mon, 02 Feb 2009 19:37:39 +0000</pubDate> <dc:creator>Debo</dc:creator> <category><![CDATA[Software]]></category> <category><![CDATA[Software-shorts]]></category> <category><![CDATA[Thoughts]]></category> <category><![CDATA[torcampblog]]></category><guid
isPermaLink="false">http://mikedebo.ca/2009/02/02/lesson-3-think-beyond-oo/</guid> <description><![CDATA[When your average software developer goes to break a subsystem or module into implementable pieces, generally her first instinct is to think &#8220;What are the classes and behaviours in my problem domain?&#8221; Whether you&#8217;re driving this design with TDD, or taking a more top-down approach, this question tends to be the linchpin of the design. [...]]]></description> <content:encoded><![CDATA[<p>When your average software developer goes to break a subsystem or module into implementable pieces, generally her first instinct is to think &#8220;What are the classes and behaviours in my problem domain?&#8221; Whether you&#8217;re driving this design with TDD, or taking a more top-down approach, this question tends to be the linchpin of the design.</p><p>This is unsurprising. Object-orientation is (ostensibly) taught to most of us in school as the one-true-way of doing things. It&#8217;s rare to find people who do not equivocate software-design-in-the-small to object-oriented design.</p><p>A couple of years ago, I decided that I wanted to learn &#8220;functional programming&#8221;. My first serious attempt was in OCaml. However, once the wheels hit the ground, I felt like I had returned to highschool. At that time, I knew the syntax and vocabulary surrounding objects, but I had no idea how I was supposed to use them.</p><p>So, I reasoned, I needed to learn how to design functional programs. I needed to learn &#8220;functional design&#8221;, for lack of a better term.</p><p>After a bit of consideration, I remembered that there are a lot of very famous universities that teach the basics of program design using Scheme. (This is also true for OCaml, but the Scheme ones are arguably more famous <img
src='http://mikedebo.ca/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> .) This was perfect &#8212; I needed to learn how to design programs all over again, in a &#8220;functional style&#8221;. So, why not go back to basics? And thus did I seek out MIT&#8217;s CS1 old-style curriculum and the Wizard Book &#8212; also known as <em>The Structure and Interpretation of Computer Programs</em> (SICP). (They&#8217;ve since switched to Python, I think. I imagine the spirit is the same.)</p><p>You may notice that I&#8217;ve been putting &#8220;functional design&#8221; and &#8220;functional style&#8221; in quotations. The reason for this is that I quickly discovered that such things do not actually exist.</p><p>Let me explain.</p><p>The fundamental exploration that jumped out at me in SICP was this: Let&#8217;s say you have a programming model that supports first-class functions, and does a pretty good job of supporting immutable data. What reasonable methods of designing and implementing programs can we arrive at using this model?</p><p>And the answers are legion. A program can be viewed as a mathematical function. It can be viewed as a signal-processing device over finite sequences of discrete signal elements. It can be viewed as a signal-processing device over <em>infinite</em> sequences of discrete signal elements. It can be viewed as a processor of a domain-specific language. And so on.</p><p>What SICP really shows you is a variety of methods that you can use to design programs-in-the-small, with object orientation being only one of them. So now, when I&#8217;m working on a new chunk of some big project, I find myself thinking not &#8220;where are the objects&#8221;, but instead &#8220;what happens if I view this problem as, say, a signal processing problem?&#8221; Even more importantly, when I read someone else&#8217;s code, I can ask myself the same thing.</p><p>The reflex of explicitly asking myself this question when faced with a new design problem really helps to understand it from multiple angles, and to identify the things that are going to be the hardest to model or extend in any feasible design. And that lets me focus on clearing up the things that matter.</p><p>I won&#8217;t pretend to be a master of any design-in-the-small methodology. However, I&#8217;m now aware of a whole set of possibilities that I was once largely ignorant of, and this knowledge helps me in a bunch of little ways every day.</p> ]]></content:encoded> <wfw:commentRss>http://mikedebo.ca/2009/02/02/lesson-3-think-beyond-oo/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Lesson 2: Watch for runaway analogies</title><link>http://mikedebo.ca/2009/01/26/lesson-2-watch-for-runaway-analogies/</link> <comments>http://mikedebo.ca/2009/01/26/lesson-2-watch-for-runaway-analogies/#comments</comments> <pubDate>Mon, 26 Jan 2009 21:28:56 +0000</pubDate> <dc:creator>Debo</dc:creator> <category><![CDATA[Software]]></category> <category><![CDATA[Software-shorts]]></category> <category><![CDATA[Thoughts]]></category> <category><![CDATA[torcampblog]]></category><guid
isPermaLink="false">http://mikedebo.ca/2009/01/26/lesson-2-watch-for-runaway-analogies/</guid> <description><![CDATA[In the last short, I used several analogies. I likened the craft of a software developer to that of a contract artist, or a shoemaker. Analogies are useful things. When I have the pleasure of sitting down with a group of people who are really excited about what they do, and who are discussing a [...]]]></description> <content:encoded><![CDATA[<p>In the last short, I used several analogies. I likened the craft of a software developer to that of a contract artist, or a shoemaker.</p><p>Analogies are useful things. When I have the pleasure of sitting down with a group of people who are really excited about what they do, and who are discussing a very challenging problem, what happens almost immediately is that someone will draw an analogy to help the discussion move forward.</p><p>This definitely gets the conversation moving. It&#8217;s the direction that is the rub. It&#8217;s really easy to let an analogy run wild, to the point that it gives you almost no insight on the problem you were initially trying to understand.</p><p>As an example: Just the other day, I was at a great lunch meeting where the discussion was centered around software testing. Someone mentioned that developers often write software with the assumption that the user is usually going to do things in a very predictable fashion, and that &#8216;weird&#8217; cases are exactly that &#8212; weird. In this sense, the developer is living with the same set of assumptions as a traditional performance artist, where interactions are scripted, and mess-ups are assumed to be few and far-between.</p><p>It was mentioned that perhaps a better mindset would be that of the improv performer, where the fundamental assumption is that everything is going to be unexpected. The analogy was a good one &#8212; it clarified that there were two sets of axioms we could be working against, and perhaps that one of them was more appropriate than the other.</p><p>Within twenty minutes, we were talking about this one time that someone had been to a play where the lights had gone out, and the crew decided finish the performance by candlelight. The analogy had run amok. We were certainly still having a stimulating conversation, and possibly there was a lot of value in what was being said. But we&#8217;d completely lost the original point.</p><p>Usually when I&#8217;m involved in a conversation that is centered around an analogy, I try to bind the concepts within it to concepts in the topic that we&#8217;re actually trying to understand. When I hear a lot of those threads breaking, that&#8217;s how I know the analogy is taking on a life of its own.</p><p>Why do I think this is so important to being a good developer? I have two reasons. The first: When I encounter software that I think is particularly pleasant to work with, it is because the high-level metaphors that are being used to describe things are obvious and are used consistently throughout the product. If you look at a lot of patterns in software design, they&#8217;re essentially dressed-up analogies. (A &#8220;bridge&#8221; is sort of like a physical bridge because etc&#8230; an adapter is sort of like a power adapter because etc&#8230;)</p><p>The second is that I&#8217;ve observed that many smart people that I like to learn from tend to use analogies heavily. I don&#8217;t often get a lot of time with those people. And so, to really make sure that I&#8217;m getting the most out of my time with them, I like to carefully monitor the evolution of their analogies. After all, I can spend my afternoon talking about botched performances with pretty much anyone, really <img
src='http://mikedebo.ca/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p><p>(Steve McConnell does a good job of dissecting several analogies used to describe software development as a whole in his massive <em>Code Complete, 2nd edition</em>. I can&#8217;t say that I particularly like the one he finally arrives at (&#8220;it&#8217;s like construction&#8221;), but at least he is thorough in itemizing the components of the analogy that work, and the ones that don&#8217;t quite mesh well. It&#8217;s that sort of exploration that really helps you understand the original problem, in my opinion.)</p> ]]></content:encoded> <wfw:commentRss>http://mikedebo.ca/2009/01/26/lesson-2-watch-for-runaway-analogies/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Lesson 1: Treat work as craft</title><link>http://mikedebo.ca/2009/01/19/lesson-1-treat-work-as-craft/</link> <comments>http://mikedebo.ca/2009/01/19/lesson-1-treat-work-as-craft/#comments</comments> <pubDate>Mon, 19 Jan 2009 19:16:29 +0000</pubDate> <dc:creator>Debo</dc:creator> <category><![CDATA[Software]]></category> <category><![CDATA[Software-shorts]]></category> <category><![CDATA[Thoughts]]></category> <category><![CDATA[torcampblog]]></category><guid
isPermaLink="false">http://mikedebo.ca/2009/01/19/lesson-1-treat-work-as-craft/</guid> <description><![CDATA[If you&#8217;re getting paid to write software, then it&#8217;s pretty likely that the majority of the people around you understand you to be an engineer. That is, it&#8217;s your job to understand and create a practical solution to a stated problem. I struggled with this for a while. This makes it really easy to cut [...]]]></description> <content:encoded><![CDATA[<p>If you&#8217;re getting paid to write software, then it&#8217;s pretty likely that the majority of the people around you understand you to be an engineer. That is, it&#8217;s your job to understand and create a practical solution to a stated problem.</p><p>I struggled with this for a while. This makes it really easy to cut corners. It makes it really easy to think of your job not as a craft, but as a requirement that just needs to be fulfilled as cheaply as possible. At least, that&#8217;s what it does for me.</p><p>I&#8217;ve managed to reconcile this within myself by the analogy of the contract artist. While in Italy, I read and heard countless stories about great works of art that were commissioned by the state. These works had very real and often very challenging engineering requirements that had to be met. And yet, there were myriad details that went into the creation of those works that had nothing to do with explicitly fulfilling the requirement, but that essentially gave each work its own life.</p><p>That&#8217;s how I think about what I do. And if you look around, there are a ton of other professions that are essentially the same. A cobbler just has to fix your shoes, but it&#8217;s the material he uses, the lessons he has learned, the attention to detail that he takes, that affects how well the job is done &#8212; even if it&#8217;s in the details that only another cobbler would notice.</p><p>When I worked in a restaurant as a teen, I learned that being called a &#8216;shoemaker&#8217; was an insult. It meant you&#8217;d paid no attention to what you were doing. Now, years later, I see &#8216;shoemaker&#8217; as kindred spirit.</p> ]]></content:encoded> <wfw:commentRss>http://mikedebo.ca/2009/01/19/lesson-1-treat-work-as-craft/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Software shorts</title><link>http://mikedebo.ca/2009/01/19/software-shorts/</link> <comments>http://mikedebo.ca/2009/01/19/software-shorts/#comments</comments> <pubDate>Mon, 19 Jan 2009 19:15:49 +0000</pubDate> <dc:creator>Debo</dc:creator> <category><![CDATA[Software]]></category> <category><![CDATA[Software-shorts]]></category> <category><![CDATA[Thoughts]]></category> <category><![CDATA[torcampblog]]></category><guid
isPermaLink="false">http://mikedebo.ca/2009/01/19/software-shorts/</guid> <description><![CDATA[Recently, I&#8217;ve been re-evaluating a lot of the lessons I&#8217;ve learned about what I do. The sheer number of the sorts of things I&#8217;d picked up along the way thus far sort of astonished me. Anyways, I&#8217;ve decided to start fleshing out these ideas by writing them out in short-form. I&#8217;m calling them &#8220;software-shorts&#8221;, and [...]]]></description> <content:encoded><![CDATA[<p>Recently, I&#8217;ve been re-evaluating a lot of the lessons I&#8217;ve learned about what I do. The sheer number of the sorts of things I&#8217;d picked up along the way thus far sort of astonished me.</p><p>Anyways, I&#8217;ve decided to start fleshing out these ideas by writing them out in short-form. I&#8217;m calling them &#8220;software-shorts&#8221;, and the first one is going to be posted in about 2 minutes.</p> ]]></content:encoded> <wfw:commentRss>http://mikedebo.ca/2009/01/19/software-shorts/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>More Scheme</title><link>http://mikedebo.ca/2008/11/18/more-scheme/</link> <comments>http://mikedebo.ca/2008/11/18/more-scheme/#comments</comments> <pubDate>Wed, 19 Nov 2008 03:48:47 +0000</pubDate> <dc:creator>Debo</dc:creator> <category><![CDATA[Software]]></category><guid
isPermaLink="false">http://mikedebo.ca/2008/11/18/more-scheme/</guid> <description><![CDATA[Super exciting stuff here, folks. I added solutions to more exercises from chapter 2 of SICP to the SICP page (at right). Whenever I start agonizing at how long it takes me to get through projects like this, I am reminded of Peter Norvig&#8217;s essay Teach Yourself Programming in 10 Years. Damn these epic journeys.]]></description> <content:encoded><![CDATA[<p>Super exciting stuff here, folks. I added solutions to more exercises from chapter 2 of SICP to the SICP page (at right).</p><p>Whenever I start agonizing at how long it takes me to get through projects like this, I am reminded of Peter Norvig&#8217;s essay <a
href="http://norvig.com/21-days.html">Teach Yourself Programming in 10 Years</a>. Damn these epic journeys.</p> ]]></content:encoded> <wfw:commentRss>http://mikedebo.ca/2008/11/18/more-scheme/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>The crooked schemer</title><link>http://mikedebo.ca/2008/11/02/the-crooked-schemer/</link> <comments>http://mikedebo.ca/2008/11/02/the-crooked-schemer/#comments</comments> <pubDate>Mon, 03 Nov 2008 04:03:53 +0000</pubDate> <dc:creator>Debo</dc:creator> <category><![CDATA[Software]]></category><guid
isPermaLink="false">http://mikedebo.ca/2008/11/02/the-crooked-schemer/</guid> <description><![CDATA[I&#8217;ve been trying to teach myself the ins and outs of functional programming for what seems like forever now. A couple years back I came across the Structure and Interpretation of Computer Programs, and knew immediately that I&#8217;d get a lot out of doing all the exercises related to that book. Recently I&#8217;ve actually been [...]]]></description> <content:encoded><![CDATA[<p>I&#8217;ve been trying to teach myself the ins and outs of functional programming for what seems like forever now. A couple years back I came across the Structure and Interpretation of Computer Programs, and knew immediately that I&#8217;d get a lot out of doing all the exercises related to that book.</p><p>Recently I&#8217;ve actually been applying myself (no pun intended) to the exercises and assignments that come along with the free online distribution of the book. This sometimes necessitates some minor porting efforts, because the book and materials were written for MIT Scheme, and I&#8217;m using PLT/mzscheme with DrScheme since I&#8217;m too feeble to learn emacs at this point in time. (Every time I punch a keychord to do anything significant in emacs, I expect to hear it shout &#8220;HADOKEN&#8221; or something as Ryu would in response to my comparatively-less-complex controller gyrations in Street Fighter.)</p><p>Anyhow, I&#8217;m dumping all my SICP related stuff on a project page, in case your day is going so badly that perusing a neophyte&#8217;s Scheme code appears preferable to what you are doing. That page is right <a
href="/projects/sicp">here</a>.</p> ]]></content:encoded> <wfw:commentRss>http://mikedebo.ca/2008/11/02/the-crooked-schemer/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Notes on Working effectively with legacy code, by Michael Feathers</title><link>http://mikedebo.ca/2008/09/03/notes-on-working-effectively-with-legacy-code-by-michael-feathers/</link> <comments>http://mikedebo.ca/2008/09/03/notes-on-working-effectively-with-legacy-code-by-michael-feathers/#comments</comments> <pubDate>Thu, 04 Sep 2008 01:35:05 +0000</pubDate> <dc:creator>Debo</dc:creator> <category><![CDATA[Books]]></category> <category><![CDATA[Software]]></category><guid
isPermaLink="false">http://mikedebo.ca/2008/09/03/notes-on-working-effectively-with-legacy-code-by-michael-feathers/</guid> <description><![CDATA[Most of the projects that I&#8217;ve been paid for thus far have involved working with a substantial amount of what I would gently term &#8220;other people&#8217;s code&#8221;. I&#8217;ve also jumped into these projects at a stage where those involved have started to use the terms &#8220;technical debt&#8221;, &#8220;refactoring&#8221;, and even &#8220;re-engineering&#8221; with increasing frequency. It&#8217;s [...]]]></description> <content:encoded><![CDATA[<p>Most of the projects that I&#8217;ve been paid for thus far have involved working with a substantial amount of what I would gently term &#8220;other people&#8217;s code&#8221;.  I&#8217;ve also jumped into these projects at a stage where those involved have started to use the terms &#8220;technical debt&#8221;, &#8220;refactoring&#8221;, and even &#8220;re-engineering&#8221; with increasing frequency.</p><p>It&#8217;s challenging to work with code that has a history, but I find it to be a lot of fun. (From a 30000 foot view, that is &#8212; at any given time when I&#8217;m in the thick of it, you will hear me cursing under my breath just like anyone else would be.) I&#8217;ve developed my own little arsenal of techniques that I use to get things done in such an environment. (The most useful one is to always remind myself that this is software that has been _successful_, and that it has intrinsic worth, even if I am working in a particularly hacky corner of it.)</p><p>Anyhow, a few months ago it occurred to me that it would be great to have a book about this sort of thing; about the mindset you should be in when working with old code, the techniques you can use to mitigate the complexity, etc. It didn&#8217;t take much poking around to discover Michael Feathers&#8217; book, and I&#8217;m glad I did. This is, in my opinion, one of those books that anyone in a software-related field should read.</p><p>While I picked up quite a few little tips from Feathers&#8217; book, there were three major contributions that I considered to be the main ones:</p><ol><li> The definition of &#8216;legacy code&#8217; as &#8216;code that is not under test&#8217;. By casting the problem of maintaining an older system in this light, Feathers moves the problem from the realm of genericity (our code is hard to work with and we need to do something) to the realm of specificity (our code is hard to work with, so we need to find ways to get it under test.) This gives you a specific problem to attack.</li><li> The identification of the &#8220;seam&#8221; as the primary concern in a legacy system. A seam is defined as any point in the system where one component may be stubbed out or otherwise decoupled so that you can test an interacting component in isolation. This focus on seams essentially turns your &#8220;testing quest&#8221; into one of decoupling components from one another, which is (in the opinions of many people much smarter than I) perhaps the most critical precondition for keeping a system maintainable.</li><li> The simple fact that Feathers has obviously been in the trenches himself many times, and that he speaks of the experience not with despair, but with acceptance and even mild amusement. While many software engineers I know would bemoan the idea that the status quo of system development should be a gradual decay towards unmaintainability, it&#8217;s pretty obvious that it happens and that this is a thing that all of us will one day have to deal with, as inevitably as death, taxes, and all that sort of thing. Having a respected individual in the field talk about it so frankly is, well, downright <em>comforting</em>, and I find it helpful to recall that I am not alone when stuck trying to disentangle some particularly heinous code-rot.</li></ol><p>I could go on, but there&#8217;s little need. In summary: I strongly recommend <em>Working Effectively with Legacy Code</em>. This is the sort of book that I intend to read not just once, but once every couple of years or so to keep the lessons fresh in my mind.</p> ]]></content:encoded> <wfw:commentRss>http://mikedebo.ca/2008/09/03/notes-on-working-effectively-with-legacy-code-by-michael-feathers/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Setting up CruiseControl.NET web dashboard on IIS 6.0</title><link>http://mikedebo.ca/2008/08/26/setting-up-cruisecontrolnet-web-dashboard-on-iis-60/</link> <comments>http://mikedebo.ca/2008/08/26/setting-up-cruisecontrolnet-web-dashboard-on-iis-60/#comments</comments> <pubDate>Tue, 26 Aug 2008 13:00:50 +0000</pubDate> <dc:creator>Debo</dc:creator> <category><![CDATA[Software]]></category><guid
isPermaLink="false">http://mikedebo.ca/2008/08/26/setting-up-cruisecontrolnet-web-dashboard-on-iis-60/</guid> <description><![CDATA[I ran into a few gotchas trying to do this today, so I&#8217;m jotting them down here. The instructions on the ThoughtWorks site are a tad sparse, although the installer is ostensibily _supposed_ to set up the dashboard for you. I had no such luck. Some things they don&#8217;t tell you: In IIS Manager, you [...]]]></description> <content:encoded><![CDATA[<p>I ran into a few gotchas trying to do this today, so I&#8217;m jotting them down here. The instructions on the ThoughtWorks site are a tad sparse, although the installer is ostensibily _supposed_ to set up the dashboard for you. I had no such luck.</p><p>Some things they don&#8217;t tell you:</p><p>In IIS Manager, you will probably have to:</p><ol><li>Click <code>Web Service Extensions</code>, allow things that look like they should be allowed (ASP, for one thing). I also had to add an extension for ASP.NET v2.0.50727 that linked to the same ISAPI file that they tell you to add in the configuration of the virtual directory in the ThoughtWorks instructions.</li><li>Once I did that, the dashboard would at least start to render, but then it would crash while trying to write to some obscure equivalent of <code>/tmp/</code> in the Microsoft Framework directory. I just right-clicked on that directory, selected <code>Security</code>, cursed at how useless the resulting dialog was, and then set the group <code>IIS_WPG</code> to have write permissions to the directory.</li></ol><p>Happy CruiseControlling.</p><p>P.S. Thanks to Jimmy for channeling my rage and providing helpful hints here and there. Probably would have taken me a couple hours longer to bang these out if he hadn&#8217;t been online.</p> ]]></content:encoded> <wfw:commentRss>http://mikedebo.ca/2008/08/26/setting-up-cruisecontrolnet-web-dashboard-on-iis-60/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> </channel> </rss>
<!-- This site's performance optimized by W3 Total Cache. Dramatically improve the speed and reliability of your blog!

Learn more about our WordPress Plugins: http://www.w3-edge.com/wordpress-plugins/

Minified using disk
Page Caching using disk (enhanced) (user agent is rejected)
Database Caching 15/26 queries in 0.006 seconds using disk

Served from: unique.bihira.com @ 2012-05-19 02:16:36 -->
