<?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>Michael DiBernardo</title>
	<atom:link href="http://mikedebo.ca/feed/" rel="self" type="application/rss+xml" />
	<link>http://mikedebo.ca</link>
	<description>I&#039;ve got a flying machine!</description>
	<lastBuildDate>Thu, 28 Mar 2013 10:49:36 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4.2</generator>
		<item>
		<title>3 Mistakes I&#8217;ve Made When Starting Up (and will probably make again)</title>
		<link>http://mikedebo.ca/3-mistakes-ive-made-when-starting-up-and-will-probably-make-again/</link>
		<comments>http://mikedebo.ca/3-mistakes-ive-made-when-starting-up-and-will-probably-make-again/#comments</comments>
		<pubDate>Thu, 28 Mar 2013 10:49:36 +0000</pubDate>
		<dc:creator>mikedebo</dc:creator>
				<category><![CDATA[Posts]]></category>

		<guid isPermaLink="false">http://mikedebo.ca/?p=50</guid>
		<description><![CDATA[I have the privilege of meeting a lot of highly effective people who are early in their career, and in the process of joining a new company or team. One of the most interesting parts of this experience is watching them make the same mistakes that I&#8217;ve made when I&#8217;ve been in the same sitation [...]]]></description>
			<content:encoded><![CDATA[<p>I have the privilege of meeting a lot of highly effective people who are early in their career, and in the process of joining a new company or team. One of the most interesting parts of this experience is watching them make the same mistakes that I&#8217;ve made when I&#8217;ve been in the same sitation before.</p>
<p>Here are the top three that seem to jump out at me the most often:</p>
<p><strong>Conforming to the average schedule of the team</strong></p>
<p>I&#8217;m naturally a morning person; if I haven&#8217;t started on something productive by 6:30am, it&#8217;s going to be a bad day for me. As a general rule, I like to have my most important work done by 11am.</p>
<p>Some of the most unproductive times in my life have been when I let myself be dragged into the work schedule followed by the rest of my team. I definitely think it&#8217;s important to have 3-4 hours of overlap in working hours, but I often see people new to the game sitting around on their laptops &#8220;reading articles&#8221; way past when their brain has shut down and they don&#8217;t want to be the first to leave. </p>
<p>I learned to fight that urge. I still lose the battle once in a while, though, and I always pay for it the next day.</p>
<p><strong>Refusing to set boundaries</strong></p>
<p>When you first start on a new project or join a new team, there is a period of time where you&#8217;re learning what everyone else&#8217;s working habits are. It&#8217;s tempting to be &#8220;on call&#8221; all the time during this period. This can mean allowing interruptions at any time, or being connected to email / IM from the moment you wake up until the moment you go to sleep. </p>
<p>It&#8217;s also very easy for this &#8220;adjustment period&#8221; to stretch onwards into infinity.</p>
<p>This is another thing that has been disastrous for me in the past. I&#8217;ve actually found the inability to set &#8220;do not disturb&#8221; times during the day to be even worse for me than staying having to stay connected all night, since the former often necessitates the latter. </p>
<p>I&#8217;ve also found that certain personalities won&#8217;t ever respect these boundaries. It took me a while to accept that this is <em>my</em> problem, not theirs, in the sense that trying to change someone like that is going to be a fruitless battle. I&#8217;ve had this behaviour crop up in supervisors, clients, etc., and I&#8217;ve had to develop strategies in each case for dealing effectively with such people. This is a whole topic on its own, though, so I&#8217;ll leave this one for another time.</p>
<p><strong>Trying to change things too drastically, too soon</strong></p>
<p>Here&#8217;s a scenario I see pretty often: Let&#8217;s say you&#8217;re an engineer who has had the opportunity to learn the best engineering practices from your previous job experience at places like Facebook, Google, Twitter, etc. You decide to join a smaller company with maybe 10 engineers on the team where you can &#8220;make a greater contribution.&#8221; </p>
<p>So you sit down on the first day, check out the code, and build it&#8230; only to find that the build is a manual, 7 step process. All the &#8220;unit tests&#8221; are broken, but still take 16 minutes to run. You take a deep breath, go to your first scrum meeting&#8230; which drags on for over an hour. </p>
<p>And so on.</p>
<p>If you&#8217;re especially optimistic, your first instinct might be one of elation. &#8220;I have so much I can help them with!&#8221; you may think. And it&#8217;s true; there probably is a lot you can help them with. </p>
<p>But not right now.</p>
<p>Unless you&#8217;ve been specifically tasked with the job of &#8220;fixing things&#8221;, take your time with it. Get to know your teammates first. Go for coffee or lunch with them; learn about their lives as human beings first, and as coworkers second. My general rule of thumb is that I&#8217;ll know I&#8217;m in a position to tentatively suggest real changes to someone when I can first comfortably call them an asshat and not get in trouble for it.</p>
<p>I&#8217;m sure there have been exceptions to this rule in the past, but I personally haven&#8217;t witnessed any. Trust has to come before change. If only I&#8217;d learned this a decade ago, I could have my past teammates and myself a lot of unnecessary angst.</p>
<p>I know I&#8217;ve made these mistakes before, and I&#8217;ll probably make them again. But at least next time around, I&#8217;ll recognize when it&#8217;s happening. </p>
]]></content:encoded>
			<wfw:commentRss>http://mikedebo.ca/3-mistakes-ive-made-when-starting-up-and-will-probably-make-again/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Python&#8217;s Optional Parameters and the Perfidy of the Human Spirit</title>
		<link>http://mikedebo.ca/pythons-optional-parameters-and-the-perfidy-of-the-human-spirit/</link>
		<comments>http://mikedebo.ca/pythons-optional-parameters-and-the-perfidy-of-the-human-spirit/#comments</comments>
		<pubDate>Wed, 13 Mar 2013 11:20:21 +0000</pubDate>
		<dc:creator>mikedebo</dc:creator>
				<category><![CDATA[Posts]]></category>

		<guid isPermaLink="false">http://mikedebo.ca/?p=42</guid>
		<description><![CDATA[I wanted to briefly comment on something I&#8217;ve observed myself doing that I consider to be an antipattern. Let&#8217;s say I&#8217;m knee-deep in that swampy mire known as Someone Else&#8217;s Code. I&#8217;m working on a search service that has this API: class SearchService(object): def search(self, query): # Mega complicated stuff follows. I need to change [...]]]></description>
			<content:encoded><![CDATA[<p>I wanted to briefly comment on something I&#8217;ve observed myself doing that I consider to be an antipattern.</p>
<p>Let&#8217;s say I&#8217;m knee-deep in that swampy mire known as Someone Else&#8217;s Code. I&#8217;m working on a search service that has this API:</p>
<pre>
class SearchService(object):
    def search(self, query):
    # Mega complicated stuff follows.
</pre>
<p>I need to change this method to be aware of the content-type of the media it returns.</p>
<p>OK, let&#8217;s go see how often this thing is used.</p>
<pre>
~$ ack search_service.search
<.. SPEW of 86 distinct invocations of this service method>
</pre>
<p>Awesome.</p>
<p>I pick one of those service calls and crack open open the relevant buffer:</p>
<pre>
def viewThatHasNoContentTypeInfoWhatsoever(request, query):
    context.search_service.search(query)
</pre>
<p>Even better &#8212; now I have to figure out how I&#8217;m going to get the content-type information I need to the service I&#8217;m calling here. </p>
<p>And there are 86 more of these to go.</p>
<p>So now I&#8217;m sitting here thinking that the job I initially thought was going to take 5 minutes is probably going to take much longer. </p>
<p>So what are my options?</p>
<ol>
<li>Make <code>content_type</code> a required arg on the search method and just deal with the upstream changes.</li>
<li>Refactor the parameter list to search to take a <code>SearchParams</code> object that encapsulates the parameters that are required for a search.</li>
<li>Create a different, content-type-aware method on <code>SearchService</code>, since this is a conceptually different search, and use that instead.</li>
</ol>
<p>1 and 2 both require changes to all 86 call sites, but at least 2 is a bit more future-proof. 3 just seems like it&#8217;s asking for an explosion in combinatorial complexity on that service interface.</p>
<p>This is generally the point where I begin to consider option 4, which is to make <code>content_type</code> a keyword arg with a reasonable default. </p>
<p>Great, right? This is a &#8220;minimally disruptive change&#8221; &#8212; I&#8217;m guaranteed not to break any client code, which is good because our test coverage is low and I&#8217;m not confident that I&#8217;ve even found all the relevant call sites.</p>
<p>The biggest problem I have with this is that it&#8217;s a terrible idea. </p>
<p>If this feature was being designed for the first time right now, I&#8217;d probably decide there there is no &#8220;reasonable default&#8221; for <code>content_type</code> at all, and I&#8217;m thus fragmenting the interface to the call at the intersection of version n-1 and version n. </p>
<p>New developers on the team aren&#8217;t necessarily going to be aware of the entire release history of the project, and so seeing <code>media_type</code> as an optional parameter will suggest to them that this is just a minor detail of the interface, where it is actually just as important as the querystring itself is.</p>
<p>I wonder &#8212; do you ever catch yourself being similarly lazy? I feel like this technique might actually be a good first step in getting hooks into legacy code for some preliminary unit testing before elevating the parameter to first-class status and making the upstream changes, but that&#8217;s only valid if you&#8217;re committed to making those changes in the first place.</p>
<p>In the meantime, I&#8217;ve forced myself to assess my motives carefully each time I add an optional kwarg to a function or method in Python. (Constant vigilance!)</p>
]]></content:encoded>
			<wfw:commentRss>http://mikedebo.ca/pythons-optional-parameters-and-the-perfidy-of-the-human-spirit/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Why It&#8217;s Hard To Learn About Domain-Driven Design (or any other kind of design, for that matter)</title>
		<link>http://mikedebo.ca/why-its-hard-to-learn-about-domain-driven-design-or-any-other-kind-of-design-for-that-matter/</link>
		<comments>http://mikedebo.ca/why-its-hard-to-learn-about-domain-driven-design-or-any-other-kind-of-design-for-that-matter/#comments</comments>
		<pubDate>Thu, 07 Mar 2013 20:44:55 +0000</pubDate>
		<dc:creator>mikedebo</dc:creator>
				<category><![CDATA[Posts]]></category>

		<guid isPermaLink="false">http://mikedebo.ca/?p=36</guid>
		<description><![CDATA[I&#8217;ve recently been revisiting the books I read on Domain Driven Design a few years back when I was just getting my feet wet with the literature in that area. (These two are my favorites so far.) In the first couple of chapters of the canonical DDD book, Eric Evans opines that developers are often [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve recently been revisiting the books I read on Domain Driven Design a few years back when I was just getting my feet wet with the literature in that area. (<a href="http://www.amazon.ca/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215">These</a> <a href="http://www.amazon.ca/Applying-Domain-Driven-Design-Patterns-Examples/dp/0321268202">two</a> are my favorites so far.) </p>
<p>In the first couple of chapters of the canonical DDD book, Eric Evans opines that developers are often very happy to tinker with a new technology, a new design pattern, or a new process, but they are usually unwilling to invest effort into the actual business of modelling the core concepts of the problem domain itself.  </p>
<p>He continues by talking about how projects where even a few of the developers were not invested in this process meant that the effort was largely wasted, and that productivity stayed more or less constant despite the enormous effort poured into the modeling process by the rest of the folks there.</p>
<p>This isn&#8217;t particularly surprising to me; there are a variety of reasons I can see as to why your average developer would be more excited about adopting a new library to make cloud deployments easier, or adding a new code review process or the like to their dev teams repertoire of practices:</p>
<ul>
<li>There exists a lot of documentation and material that one can learn independently from.</li>
<li>The effects are seen pretty much immediately (whether for good or for bad).</li>
<li>Credit from the organization can generally be traced to the originator of<br />
the practice </li>
<li>It&#8217;s a unit of work that can be done on e.g. lunch breaks, spare time, on<br />
the transit ride home, etc. </li>
</ul>
<p>Building a rich domain model, on the other hand, bears very few of these favorable characteristics. Why not?</p>
<ul>
<li>Practicing it independently is not all that helpful, as a domain model is<br />
only provably robust when a variety of developers and domain experts can use it<br />
to improve communication and productivity in the team. </li>
<li>You rarely see the payoff until the middle-to-late stages of the project,<br />
and it does generally slow things down at the beginning.</li>
<li>Because buy-in from the team is required to make it effective, there is<br />
rarely going to be a single person who is going to get the credit for the<br />
initiative, and so the risk/reward is diluted across the team.</li>
<li>It takes long, concerted bouts of practice to get good at it (preferably in<br />
the presence of people who have done it well before.)</li>
</ul>
<p>As I was thinking about this in the context of Evans&#8217; book, I realized that these difficulties prevent experience reports on DDD from being communicated effectively in the developer community at large. In addition to my involvement in PyCon Canada, I have also been involved in a variety of meetup groups in Toronto, San Francisco, and Vancouver that are focused on code quality and best practices (e.g. Code Retreat, Agile/XP groups, clean coding groups, etc.) And yet, I don&#8217;t think I&#8217;ve ever heard a talk on how a team switched from Approach X to development into a tight focus on creating a rich domain model, and what the subsequent consequences were.</p>
<p>Again, one can imagine a variety of reasons as to why this would be the case. </p>
<ul>
<li>There are probably relatively few developers who have even had this experience before. (Evans was possibly the first to write a book on it, and even he only had 3-4 examples to show off in the first few chapters. Half of them were failures.)</li>
<li>Some prior experience with the domain itself is required to benefit from the discussion, which necessitates a significant introductory component (which has the potential to be boring.)</li>
<li>Since the benefit of DDD is generally seen in the long run, the speaker would have to condense an enormous window of experience into a single talk.</LI>
<li>The amount of work it would take to address the topic properly (choosing the appropriate level of depth for each part of the discussion) is daunting.</li>
<li>Many people with real-world experience in this space are prevented from talking about it due to NDAs, etc.</li>
</ul>
<p>Nonetheless, this is the sort of talk that I would love to see attempted more<br />
often at any general technical conference. The closest that I think we get are<br />
focused refactoring sessions <a href="http://lanyrd.com/2013/rubyconf-australia/sccfhd/">like this recent (awesome-sounding) talk from RubyConf AU</a>. </p>
<p>I am going to play with creating some &#8216;artificial&#8217; DDD scenarios that are in problem domains that are more likely to be familiar to developers, much like Vaughn Vernon did in <a href="http://www.informit.com/articles/article.aspx?p=2023702">his recent book</a>. </p>
<p>In the interim, if anyone out there has seen an effective talk or presentation on a project that used (or better yet, was refactored to focus on) a rich domain model, I would love to see it!</p>
]]></content:encoded>
			<wfw:commentRss>http://mikedebo.ca/why-its-hard-to-learn-about-domain-driven-design-or-any-other-kind-of-design-for-that-matter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Conquering Network Resentment</title>
		<link>http://mikedebo.ca/conquering-network-resentment/</link>
		<comments>http://mikedebo.ca/conquering-network-resentment/#comments</comments>
		<pubDate>Fri, 01 Mar 2013 12:28:02 +0000</pubDate>
		<dc:creator>mikedebo</dc:creator>
				<category><![CDATA[Posts]]></category>

		<guid isPermaLink="false">http://mikedebo.ca/?p=33</guid>
		<description><![CDATA[&#8220;One of the symptoms of an approaching nervous breakdown is the belief that one&#8217;s work is terribly important.&#8221; Bertrand Russell One commonly-discussed habit of successful people is having successful friends. Indeed, having a network of people who are all kicking ass is a very effective way of realizing that most limits are self-imposed and can [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p> &#8220;One of the symptoms of an approaching nervous breakdown is the belief that one&#8217;s work is terribly important.&#8221;<br />
<footer>Bertrand Russell</footer>
</blockquote>
<p>One commonly-discussed habit of successful people is having successful friends.  Indeed, having a network of people who are all kicking ass is a very effective way of realizing that most limits are self-imposed and can be a consistent source of inspiration.</p>
<p>However, there are times where I&#8217;ve found this influence to be of more harm than good; Sometimes knowing that my friends or colleagues are (seemingly) miles ahead of me can be a source of anxiety. And I&#8217;m not just talking about common jealousy either &#8212; I&#8217;m referring more to an overwhelming feeling that I am falling further and further behind.</p>
<p>I find this happens to me when:</p>
<ol>
<li>I&#8217;m in between &#8220;next big things&#8221; and considering what to do next. (i.e. I do not currently have a mission.)</li>
<li>Ironically, after a minor success of my own &#8212; it&#8217;s all too easy to look at the successes of others and feel like what I&#8217;m doing is insignificant.</li>
</ol>
<p>This is one of the stupidest and most counterproductive habits that I&#8217;ve encountered in myself, but I still often fall prey to it. Between the influence of my friends&#8217; own success stories, the constant bombardment of &#8220;dream big&#8221; messages feeding in from Facebook and Twitter, and the media deluge of startups going gangbusters, it&#8217;s very easy to feel like I&#8217;m marching to the frenzied beat of someone else&#8217;s drum. </p>
<p>In an ideal world, one would always be inspired and happy that one&#8217;s peers are doing so well. However, we are all human, and fear and jealousy have been hot topics since the very dawn of literature. (Go back and read the Epic of Gilgamesh sometime &#8212; compare him to your average startup CEO and you&#8217;ll probably find they have very similar neuroses.)</p>
<p>The thing is, I don&#8217;t <em>want</em> to feel this way. So, like with any other negative habit, I&#8217;ve practiced some ways of training myself out of it. Here are some techniques I&#8217;ve found to be effective:</p>
<ul>
<li>Disconnect. Pick a strategic hour (or longer) and detach yourself from the internet. In the absence of other signals, my own to come through a lot stronger.</li>
<li>Live in the present. Go outside, go for a walk, just focus on what is happening around you. Look at the trees, watch what other people are doing, imagine what their lives are like. Immerse yourself in the everyday details of life. If you find your mind racing to other people, the future, the past, anything that&#8217;s not your immediate environment &#8212; smile, take a deep breath, and refocus on the present moment.</li>
<li>Think of the origin of the universe. (Seriously.) Think about the fact that, many billions of years ago, the universe exploded outwards for some reason we cannot fathom (or perhaps no reason at all), and that it somehow evolved to the point that your life is now possible. Remember how small you are. Remember that, if your mission fails, it&#8217;s not going to alter the course of the universe for the worse. You are doing what you&#8217;re doing for <em>your own edification</em>. Detach your self-worth from your list of accomplishments, and see your work instead as a vehicle for self-fulfillment &#8212; not guilt.</li>
<li>Try to reframe your feelings of inadequacy into feelings of friendly competition. If you know you have a friend who is making 3x more money than you or has a greater influence than you do and it&#8217;s bothering you, think to yourself &#8220;I&#8217;m totally going to beat her at this, and then we&#8217;ll share a laugh when I do.&#8221; Maybe even call the person up and tell them so in a joking manner.</li>
<li>Do something unusual. If you have a television show or a favorite band or a workout or something that you always lean on in times of stress, do something else instead. Listen to some acid jazz, read some gothic pagan literature, go out and swim or play football or do some other physical activity that you never do. The initial feeling of discomfort and then the subsequent buzz of learning a new thing can really help bring your positive focus back.</li>
<li>Be honest. If you catch yourself in a moment of weakness and your reaction is to go post something inanely inspiring on Facebook (&#8220;Life is amazing and the universe is made of pink sparkles that turn into money trees when they hit the ground!&#8221;), think about how much value that message is actually adding to the lives of people who are possibly feeling the same way as you. Go have a quick, in-person conversation with a friend about something totally unrelated to your immediate feelings of inadequacy. Talk about something abstractly interesting or just catch up on life. </li>
<li>Remember that all of your friends are probably feeling the same way. Think about stupid that is. Commit yourself to not adding to the stupidity by breaking the cycle yourself.</li>
</ul>
<p>I consider myself very lucky to have so many ambitious and admirable people in my universe; I don&#8217;t want feelings of negativity to detract from even one moment of my relationships with them. These are some of the techniques I&#8217;ve found that have helped me meet that goal, and I hope they&#8217;ll help you too.  </p>
]]></content:encoded>
			<wfw:commentRss>http://mikedebo.ca/conquering-network-resentment/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Review of &#8220;Service Design Patterns&#8221; by Robert Daigneau</title>
		<link>http://mikedebo.ca/review-of-service-design-patterns-by-robert-daigneau/</link>
		<comments>http://mikedebo.ca/review-of-service-design-patterns-by-robert-daigneau/#comments</comments>
		<pubDate>Tue, 19 Feb 2013 23:38:14 +0000</pubDate>
		<dc:creator>mikedebo</dc:creator>
				<category><![CDATA[Posts]]></category>

		<guid isPermaLink="false">http://mikedebo.ca/?p=25</guid>
		<description><![CDATA[I&#8217;ve recently been reading through Martin Fowler&#8217;s Signature Series of books, published through Addison-Wesley. I like curated collections like these because they save me the work of assembling high-level curricula on my own, and it sounds like Fowler actually read these books before recommending them, which is a definite plus. I just finished tackling the [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve recently been reading through Martin Fowler&#8217;s <a href="http://martinfowler.com/books/">Signature Series</a> of books, published through Addison-Wesley. I like curated collections like these because they save me the work of assembling high-level curricula on my own, and it sounds like Fowler actually read these books before recommending them, which is a definite plus.</p>
<p>I just finished tackling the first book in the series, &#8220;Service Design Patterns,&#8221; by Robert Daigneau. (They should have prepended the word &#8216;Web&#8217; to the title, in my opinion, as &#8216;service&#8217; is a very general term.)</p>
<p>I enjoyed the book, but the signal-to-noise ratio was a bit low for my taste. I found the most useful contribution to be the classification of web service endpoint design &#8220;styles&#8221; into three major types:</p>
<p><strong>RPC API:</strong> A remote interface that is designed as a procedure which takes multiple typed arguments. (e.g. <code>GetInvoiceList(customerID, startDate, endDate, phaseOfTheMoon)</code>). </p>
<p>This one is easy for newbies to understand, and amenable to implementation via code generation. Tends to produce very flat, grab-baggy APIs and service contracts are easily broken if you have to e.g. change the parameter list to a call.</p>
<p><strong>Message API:</strong> Similar to RPC API, except that each endpoint receives a single typed parameter that encapsulates all of the parameters to the call in a &#8220;message&#8221; or &#8220;document&#8221;. This gives you a bit more flexibility in how the service contract evolves, because the message classes themselves can be versioned and routed to the correct handler by the endpoint based on this version. (Google&#8217;s <a href="http://code.google.com/p/protobuf/">protocol buffers</a> are used as the primary example of this.)</p>
<p>For example:</p>
<pre>
service Invoice(InvoiceRequest)

message InvoiceRequest {
	version = 1.0
	startDate  = ...
}
</pre>
<p><strong>Resource API:</strong> This is what most newbies to the field will encounter as their first example of a web service API these days, which is potentially unfortunate because it is the most complex. The resources (nouns) of your system are exposed via dedicated urls, and you retrieve or manipulate these nouns via verbs that are represented by HTTP methods like GET, PUT, DELETE, etc. </p>
<p>I found this classification (and the short history in chapter 1 that motivates it) to be very clarifying, and I lived through the evolutionary process that created each of these styles. If you are early in your software engineering career and a RESTful API is the first example you ever see of a web service API, I don&#8217;t think it will be obvious to you why the rest of the world decided this was a good engineering practice (pun intended). The historical discussion and subsequent classification of web service style APIs gives one a clear list of general possibilities to consider when consuming or creating a web service API, and is thus good reading in my opinion.</p>
<p>The rest of the book is devoted to enumerating specific design patterns that can be used in the implementation of each service API &#8220;style&#8221;, and then shows how to implement it in a common Java or .NET framework. </p>
<p>The thing is, the <em>implementation</em> of these patterns is really quite simple. I think it would have been much better to discuss a concrete example of a <em>requirement</em> that would motivate the use of the pattern instead, since that discussion would be much more resistant to change than boilerplate code.</p>
<p>Slightly &#8220;advanced&#8221; topics like service registration and discovery are discussed here as well, but I don&#8217;t think I&#8217;ve ever met anyone who was confused (or thrilled) by the idea of a service registry.</p>
<p>My conclusion: I&#8217;m definitely glad I read the first two chapters. The rest of it was educational in parts but had a very low signal-to-noise ratio. If you see a copy on someone&#8217;s shelf, do yourself a favor and read the first ~50 pages or so &#8212; or even better, recommend it to a new CS grad or junior dev. </p>
]]></content:encoded>
			<wfw:commentRss>http://mikedebo.ca/review-of-service-design-patterns-by-robert-daigneau/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Toronto Global Day of Coderetreat 2012</title>
		<link>http://mikedebo.ca/toronto-global-day-of-coderetreat-2012/</link>
		<comments>http://mikedebo.ca/toronto-global-day-of-coderetreat-2012/#comments</comments>
		<pubDate>Tue, 11 Dec 2012 16:06:35 +0000</pubDate>
		<dc:creator>mikedebo</dc:creator>
				<category><![CDATA[Posts]]></category>

		<guid isPermaLink="false">http://mikedebo.ca/?p=16</guid>
		<description><![CDATA[My first coderetreat experience was in 2009. I became involved in the Software Craftsmanship community through an effort called the Wandering Book, in which a little Moleskine journal was physically mailed from member to member so that we could write out our ideas about the current state of maturity in the field, and where we [...]]]></description>
			<content:encoded><![CDATA[<p>My first coderetreat experience was in 2009. I became involved in the <a href="http://scna.softwarecraftsmanship.org/">Software Craftsmanship</a> community through an effort called the <a href="http://programmingtour.blogspot.ca/2009/07/wandering-book.html">Wandering Book</a>, in which a little Moleskine journal was physically mailed from member to member so that we could write out our ideas about the current state of maturity in the field, and where we were headed in the future. (I often wonder what happened to that book.)</p>
<p>At the time, there was a crazy fellow named <a href="http://coreyhaines.com/">Corey Haines</a> on the mailing list who was traveling from city to city, from software company to software company, never staying in one place for very long. He called himself a &#8220;software journeyman&#8221;, and was on a quest to improve his own skills by working with as many people and organizations as he could. </p>
<p>Early in 2009, <a href="http://www.jbrains.ca/">J.B. Rainsberger</a> posted to the newsgroup stating that he and Corey would be coming to Toronto, and asking if anyone would be interested in organizing a <a href="http://coderetreat.org">Coderetreat</a> for them to facilitate. Not having any idea what a Coderetreat was, I thought it would be a good idea to immediately agree to organize one. For the sake of brevity, I&#8217;ll say that it went off without a hitch, and I was a convert. </p>
<p>By 2011, Coderetreat had become a global phenomenon. In celebration of this, over 1800 developers worldwide held 94 Coderetreats on the same day, which was appropriately titled the <a href="http://globalday.coderetreat.org/">Global Day of Coderetreat</a>. Corey himself defied the constraints of time and space to facilitate_two_ Coderetreats on the Global Day, starting out in Sydney Australia and then flying to Honolulu, Hawaii to wrap up the day. </p>
<p>I was absent for most of this growth period, being knee-deep in startup-land from 2010 onwards. In 2012, however, I decided to get back into the Coderetreat habit.  I organized a couple of events in Waterloo, and discovered the <a href="http://www.meetup.com/Toronto-Code-Retreat/">Toronto Coderetreat Meetup</a> organized by <a href="http://tazsingh.com">Taz Singh</a> and <a href="http://kylehodgson.com/">Kyle Hodgson</a>. I was reading up on all the recent happenings on http://coderetreat.org when I discovered that the Global Day of Coderetreat was being held again, and I knew that I had to get involved.</p>
<p>Thus did ~70 Toronto developers converge on the <a href="http://polarmobile.com">Polar Mobile</a> offices on Saturday, December 8th to practice their craft at GDCR 2012. The basic structure of coderetreat is simple: the day is split into several 45 minute sessions. In each session, participants select a partner and work together on a single problem, which is usually <a href="http://en.wikipedia.org/wiki/Conway's_Game_of_Life">Conway&#8217;s Game of Life</a>. The focus, however, is not on <em>solving</em> the problem; rather, the goal is to promote learning by attempting the problem using a variety of different techniques or constraints. </p>
<p>Since developers tend to be very goal-focused individuals, there is an additional technique we use to ensure that everyone is starting afresh every session: At the end of each 45-minute segment, you must <em>throw away</em> the code you have just written.  </p>
<p>This simple structure &#8212; working in 45-minute sessions, in pairs, and throwing away the code each time &#8212; opens up all sorts of interesting possibilties for learning. I saw one pair attempt to solve the problem using Excel, for example.  Several other pairs worked under some suggested constraints, such as &#8220;don&#8217;t use conditionals,&#8221; or &#8220;no getters and setters&#8221;. Our entire group attempted the &#8220;evil mute&#8221; constraint in the fourth session of the day, where you aren&#8217;t allowed to talk to your partner at all. </p>
<p>It was inspiring (and hilarious) to read the tweets throughout the day from coderetreats running all over the globe. However, while the global aspect of GDCR is exciting, it is the <em>local</em> effect on our community that I find the most exciting. Several of our attendees left GDCR 2012 saying that they were going to organize coderetreats internally at their own organizations as soon as they got to the office on Monday, and that to me is the very best part of all of this. </p>
<p>Of course, none of this would have been possible without the support of our facilitators and sponsors. We had a couple of very experienced facilitators as well as a few newbies, and they did a fantastic job in challenging participants to work outside of their comfort zone and learn new things:</p>
<ul>
<li><a href="http://valuablecode.com/">Alistair McKinnell</a>, who I met at my very first code retreat in 2009</li>
<li><a href="http://tazsingh.com">Taz Singh</a>, co-organizer of the Toronto Coderetreat meetup</li>
<li><a href="http://www.danntoliver.com/">Dann Toliver</a>, of <a href="http://bentobox.net/">Bento Box</a> and <a href="http://bentomiso.com/">Bento Miso</a> fame</li>
<li><a href="http://siraj.berhan.ca/">Siraj Berhan</a>, XP coach and Agile champion</li>
<li><a href="http://shradhagaikwad.com/">Shradha Gaikwad</a>, a budding entrepeneur and Pythonista</li>
</ul>
<p>You can&#8217;t host this many developers for a whole day without some financial support, and we couldn&#8217;t have asked for better sponsors than <a href="https://www.guidewire.com/">Guidewire</a> and <a href="http://polarmobile.com">Polar Mobile</a>. Guidewire provided the funding for coffee and lunch, and Polar Mobile gave us access to their incredible office space. We had almost 70 people in there and it felt like we could have easily fit twice that number!</p>
<p>My favorite thing about our sponors is that they didn&#8217;t just get involved financially &#8212; they both had developers there on the ground participating in the event! Guidewire developers have been attending coderetreat since the very early days, while Polar is new and enthusiastic arrival to the coderetreat scene. I am looking forward to seeing more of both of them at future events!</p>
<p>As it stands so far, it looks like we were one head short of being the biggest code retreat in the world at GDCR 2012 (edged out slightly by our inexhaustible Romanian comrades). Let&#8217;s see if we claim that honor at GDCR 2013, shall we?</p>
]]></content:encoded>
			<wfw:commentRss>http://mikedebo.ca/toronto-global-day-of-coderetreat-2012/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>tplreminder</title>
		<link>http://mikedebo.ca/tplreminder/</link>
		<comments>http://mikedebo.ca/tplreminder/#comments</comments>
		<pubDate>Wed, 28 Nov 2012 20:02:38 +0000</pubDate>
		<dc:creator>mikedebo</dc:creator>
				<category><![CDATA[Posts]]></category>

		<guid isPermaLink="false">http://blogtest.debo.webfactional.com/?p=11</guid>
		<description><![CDATA[A few weeks ago &#8212; in the midst of PyCon Canada planning no less &#8212; my girlfriend complained about the Toronto Public Library&#8217;s policy of only emailing you after your books are overdue. Having experienced this anguish firsthand before, I threw together a something to fix it. I really like attacking random problems like these [...]]]></description>
			<content:encoded><![CDATA[<p>A few weeks ago &#8212; in the midst of PyCon Canada planning no less &#8212; my girlfriend complained about the Toronto Public Library&#8217;s policy of only emailing you <em>after</em> your books are overdue. Having experienced this anguish firsthand before, I <a href="https://tplreminder.mikedebo.ca">threw together a something to fix it</a>.</p>
<p>I really like attacking random problems like these because I never know what I&#8217;m going to learn by doing it. In this project, I specifically took myself out of my comfort zone by abandoning my usual way of doing things. Normally, I&#8217;ll take a <a href="http://en.wikipedia.org/wiki/Domain-driven_design">domain-driven design approach to things</a>, where I try my best to seperate infrastructure from core domain logic.</p>
<p>In cases like this one where there isn&#8217;t much of a &#8220;domain&#8221; to speak of, though, this has the potential to be overkill. That&#8217;s why I decided to experiment with going entirely in the opposite direction. I used the framework (specifically the ORM) as if it were some ubiquitous thing, ready to be used anywhere. (Which it is, of course; and therein lies its power and its greatest threat.) If I was in a view function and I needed to pull some data, I just did it right there instead of pushing that functionality behind a service layer.</p>
<p>I actually made it all the way to the end by doing things this way before I started to feel really uncomfortable and confused with the whole thing, even for a project this small. One of the benefits of practicing a technique over and over again is that you establish an Everything In Its Right Place habit where you never really have to think about where something should go. When you abandon that recipe or method, it sort of simulates the feeling you get when multiple people are working on the system without sharing a consistent metaphor of how it works. That is, you&#8217;re constantly confused. So, right near the end, I caved and pushed a bunch of stuff behind a service layer, <a href="https://github.com/MichaelDiBernardo/tplreminder/blob/a5f492de34b5c142c2decdb6146e80b9af6e144d/tpl_base/tplreminder/settings_local.py.default#L81">using a hacky barebones dependency injection trick I like to play in Django</a>.</p>
<p>The one concession I made to the framework was to keep some infrastructure-specific stuff in behaviors on the domain objects themselves. I did this because I find in invasive frameworks like Django, there is a tendency to want to give an object a responsibility (e.g. &#8220;tell me what your absolute url is&#8221;) that should really be behind a service layer by virtue of that behaviour relying on the infrastructure (in the case, calling Django&#8217;s url reverse function, for example). I wanted to see how it felt to give into this tendency, given that you&#8217;re already binding your model objects to the framework in Django through inheritance anyways. It certainly made things a bit more convenient. I learned that there are middle grounds of abstraction you can take that will make the organization of a framework-reliant project a bit easier, without going for the whole hog and allowing you to swap things out at will.</p>
<p>For the non-programmers in the audience, I hope you find this thing useful. But even if you don&#8217;t, I still had fun building it.</p>
]]></content:encoded>
			<wfw:commentRss>http://mikedebo.ca/tplreminder/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Welcome</title>
		<link>http://mikedebo.ca/welcome/</link>
		<comments>http://mikedebo.ca/welcome/#comments</comments>
		<pubDate>Fri, 02 Nov 2012 20:20:22 +0000</pubDate>
		<dc:creator>mikedebo</dc:creator>
				<category><![CDATA[Posts]]></category>

		<guid isPermaLink="false">http://blogtest.debo.webfactional.com/?p=7</guid>
		<description><![CDATA[Hello there. I&#8217;m swamped with co-organizing PyCon Canada right now, but I will be back in December with an article series I&#8217;ve been meaning to write for a long time. I&#8217;ll see you all in a couple of weeks!]]></description>
			<content:encoded><![CDATA[<p>Hello there.</p>
<p>I&#8217;m swamped with co-organizing <a href="http://pycon.ca">PyCon Canada</a> right now, but I will be back in December with an article series I&#8217;ve been meaning to write for a long time.</p>
<p>I&#8217;ll see you all in a couple of weeks!</p>
]]></content:encoded>
			<wfw:commentRss>http://mikedebo.ca/welcome/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
