<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>yergler.net</title>
	
	<link>http://yergler.net</link>
	<description>Because eventually I'll be right. Theoretically.</description>
	<lastBuildDate>Wed, 23 May 2012 01:10:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<feedburner:info uri="yerglernet-tloa" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://yergler.net/blog/feed/" /><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://yergler.net/blog/feed/" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://www.plusmo.com/add?url=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://plusmo.com/res/graphics/fbplusmo.gif">Subscribe with Plusmo</feedburner:feedFlare><feedburner:feedFlare href="http://www.thefreedictionary.com/_/hp/AddRSS.aspx?http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://img.tfd.com/hp/addToTheFreeDictionary.gif">Subscribe with The Free Dictionary</feedburner:feedFlare><feedburner:feedFlare href="http://www.bitty.com/manual/?contenttype=rssfeed&amp;contentvalue=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://www.bitty.com/img/bittychicklet_91x17.gif">Subscribe with Bitty Browser</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsalloy.com/?rss=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://www.newsalloy.com/subrss3.gif">Subscribe with NewsAlloy</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><feedburner:feedFlare href="http://mix.excite.eu/add?feedurl=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://image.excite.co.uk/mix/addtomix.gif">Subscribe with Excite MIX</feedburner:feedFlare><feedburner:feedFlare href="http://download.attensa.com/app/get_attensa.html?feedurl=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://www.attensa.com/blogs/attensa/WindowsLiveWriter/BadgeredintoBadges_10C02/attensa_feed_button5.gif">Subscribe with Attensa for Outlook</feedburner:feedFlare><feedburner:feedFlare href="http://www.webwag.com/wwgthis.php?url=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://www.webwag.com/images/wwgthis.gif">Subscribe with Webwag</feedburner:feedFlare><feedburner:feedFlare href="http://www.podcastready.com/oneclick_bookmark.php?url=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://www.podcastready.com/images/podcastready_button.gif">Subscribe with Podcast Ready</feedburner:feedFlare><feedburner:feedFlare href="http://www.flurry.com/pushRssFeed.do?r=fb&amp;url=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://www.flurry.com/images/flurry_rss_logo2.gif">Subscribe with Flurry</feedburner:feedFlare><feedburner:feedFlare href="http://www.wikio.com/subscribe?url=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://www.wikio.com/shared/img/add2wikio.gif">Subscribe with Wikio</feedburner:feedFlare><feedburner:feedFlare href="http://www.dailyrotation.com/index.php?feed=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://www.dailyrotation.com/rss-dr2.gif">Subscribe with Daily Rotation</feedburner:feedFlare><item>
		<title>Advice for the New Guy</title>
		<link>http://feedproxy.google.com/~r/yerglernet-tloa/~3/qI3q1pATn8A/</link>
		<comments>http://yergler.net/blog/2012/05/22/advice-for-the-new-guy/#comments</comments>
		<pubDate>Wed, 23 May 2012 01:10:20 +0000</pubDate>
		<dc:creator>Nathan Yergler</dc:creator>
				<category><![CDATA[engineering]]></category>

		<guid isPermaLink="false">http://yergler.net/?p=2118</guid>
		<description><![CDATA[We have three people joining the team at Eventbrite in the next month, and we&#8217;ve been talking about how to &#8220;indoctrinate&#8221; them in the Eventbrite Way. This isn&#8217;t &#8220;how to program&#8221; or &#8220;how to engineer&#8221;, it&#8217;s &#8220;how to work well with the established team&#8221; and &#8220;where to look for dragons, hang nails, paper cuts, and [...]]]></description>
			<content:encoded><![CDATA[<p>We have three people joining the team at Eventbrite in the next month, and we&#8217;ve been talking about how to &#8220;indoctrinate&#8221; them in the Eventbrite Way. This isn&#8217;t &#8220;how to program&#8221; or &#8220;how to engineer&#8221;, it&#8217;s &#8220;how to work well with the established team&#8221; and &#8220;where to look for dragons, hang nails, paper cuts, and worse&#8221;.</p>
<p>Today, though, one of them emailed me, asking for what he should be studying and reading up on in the weeks before he joins us. He was planning to brush up on his Python and Django, but he was looking for suggestions. I thought about this a bit, and told him this:</p>
<p>First, rest up. Take a nap, or a walk around the park. Look at the grass and check out the breeze. Yes, really. It&#8217;s easy to wear yourself out in this line of work, and the first few weeks in particular are going to be challenging. You&#8217;ll be working different mental muscles that you were previously, and you&#8217;ll be meeting lots of new people. That takes a lot of energy. And it&#8217;ll be easier if you&#8217;re well rested.</p>
<p>When you wake up from your nap, if you still feel like doing preparatory work, here are a few suggestions:</p>
<p>One: Know what text editor you love and make sure your skills at using it are well honed.</p>
<p>You&#8217;ll be spending a lot of time in your editor, knowing it back and forth is a good thing. When I came to Eventbrite, I got to stop managing and write more code. And I realized that all the things that had been merely Emacs annoyances were suddenly really important to fix. I took the tutorial (<code>M-x tutorial</code>, natch), which actually was super helpful even though I&#8217;d been using it for years. </p>
<p>In particular, if you&#8217;re coming straight out of college, you&#8217;ll be working with more files at one time than you probably have in the past. Knowing how to find something in a file (and not necessarily knowing what file it&#8217;s in) will be useful. (And again, if you&#8217;re using Emacs, <code>grep-find</code> is your friend.)</p>
<p>[NB: If you want a longer treatise of why your editor matters, read <a href="https://en.wikipedia.org/wiki/The_Pragmatic_Programmer">The Pragmatic Programmer</a>.]</p>
<p>Two: git.</p>
<p>We&#8217;ll give you some basic training on git if needed (and on how we use it here), but knowing the basics will put you ahead. If you want a reference, you could do worse than Chapters 1-3 of <a href="http://git-scm.com/book">Pro Git</a>. Remember: it&#8217;s not a set of files, it&#8217;s a graph of changes.</p>
<p>Three: Read some code</p>
<p>You&#8217;ll spend as much time reading code as you do writing it, if not more. Find a project and read it until you understand how it works. Better yet, find a project that&#8217;s a little, ahem, imperfect. A few suggestions based on things I&#8217;ve worked on recently-ish:</p>
<ul>
<li><a href="https://github.com/nyergler/hieroglyph">Hieroglyph</a> (Follow your nose down into Sphinx and figure out how <code>.. noslides:</code> works.)</li>
<li><a href="http://mediagoblin.org/">MediaGoblin</a> (How is meddleware used? How&#8217;s it different than Django&#8217;s middleware?)</li>
<li><a href="http://openhatch.org">OpenHatch</a> (How would you take the new mission framework and make it work for things like the SVN mission?)</li>
</ul>
<p>Really, just practice reading code.</p>
<p>And four, explore the poetry of Billy Collins, a former poet laureate. I suggest the CC-licensed album of him reading his own work, <a href="http://archive.org/details/BillyCollinsTheBestCigarette">The Best Cigarette</a>. Specifically &#8220;Another Reason I Don&#8217;t Keep a Gun In The House&#8221;, &#8220;Marginalia&#8221;, and &#8220;The Best Cigarette&#8221;.  Maybe it&#8217;s just me, but listening to Collins calms me down and puts me in that space where I can be calm, creative, and make great software.</p>
<p>So there you have it, my advice for the new guy. If I had to sum it up, it&#8217;s &#8220;tools and skills, not technologies&#8221;. And poetry.</p>
<img src="http://feeds.feedburner.com/~r/yerglernet-tloa/~4/qI3q1pATn8A" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://yergler.net/blog/2012/05/22/advice-for-the-new-guy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://yergler.net/blog/2012/05/22/advice-for-the-new-guy/</feedburner:origLink></item>
		<item>
		<title>New Foundations</title>
		<link>http://feedproxy.google.com/~r/yerglernet-tloa/~3/6Q_u0CiB9yA/</link>
		<comments>http://yergler.net/blog/2012/05/16/new-foundations/#comments</comments>
		<pubDate>Thu, 17 May 2012 06:13:57 +0000</pubDate>
		<dc:creator>Nathan Yergler</dc:creator>
				<category><![CDATA[engineering]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[talks]]></category>

		<guid isPermaLink="false">http://yergler.net/?p=2073</guid>
		<description><![CDATA[I&#8217;ve written a little about how I think about technical debt, and what it means to live with it. I want to talk about some technical debt at Creative Commons, and how we handled it the wrong way. A project we thought would take a couple months stretched into years, and in the end never [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve written a little about how I think about technical debt, and what it means to live with it. I want to talk about some technical debt at Creative Commons, and how we handled it the wrong way. A project we thought would take a couple months stretched into years, and in the end never fulfilled the promise we thought it had. And it was supposed to be a straight-forward project.</p>
<p>One of the things people don&#8217;t always know about Creative Commons is that there was a large technical component undergirding the licenses. Every license was prepared for three audiences (in talks, this is where I call them disjoint, in a lame attempt at humor): humans (the license &#8220;deed&#8221;), lawyers (the legal text), and machines. The output for machines was an RDF model of the license: it&#8217;s permissions, requirements, and prohibitions. In 2008 we had a technical all hands meeting where the tech team came to the San Francisco office for a week. At that time porting (preparing a license for a new legal jurisdiction and translating the web tools) was in full swing, and as we talked about what the pain points were, launching these new jurisdictions came up as a major source of pain. As we started drawing the model of how things worked on the site, I arrived at the following diagram.</p>
<p><a href="http://www.flickr.com/photos/nathan_y/2347987536/" title="The Present by Nathan Y, on Flickr"><img src="http://farm3.staticflickr.com/2297/2347987536_5515b1f963.jpg" width="500" height="375" alt="The Present"></a></p>
<p>We had at least three different &#8220;products&#8221; &#8212; the license chooser, the API for 3rd parties, and the prepared licenses (deeds and RDF). And for hysterical and historical reasons, they didn&#8217;t really use the same information. Well, they did at a certain level: they all used the same translation files, but after that all bets were off. We had the &#8220;questions&#8221; used for selecting a license modeled as an XSLT transformation (why? don&#8217;t remember; wish I knew what we were thinking when we did that), but the transformation needed to have localized content, so we would generate a new XSLT document from a ZPT template (yes, really) when we updated the translations. The license RDF was stored as static files for performance, but there was increasing pressure to provide localized data there, too, which was going to cause a world of hurt. And the chooser had a thin wrapper, cc.license, around the XSLT. Except when it went directly to the XSLT for special cases.</p>
<p>If you look in the upper right hand corner, you&#8217;ll see something labeled &#8220;cc.licenze&#8221;. This was a prototype library I had written when adding support for CC0 to the site. The idea was this: We claim that the RDF is the technical model for our legal tools. If that&#8217;s true, can we put enough information in it to drive the entire process, and have a single source of information? After launching CC0, signs pointed to yes. We set out to build a glorious future.</p>
<p><a href="http://www.flickr.com/photos/nathan_y/2347986388/" title="The Glorious Future by Nathan Y, on Flickr"><img src="http://farm4.staticflickr.com/3267/2347986388_dd1c466a5e.jpg" width="500" height="375" alt="The Glorious Future"></a></p>
<p>We&#8217;d build a single wrapper around our RDF and use it everywhere. We&#8217;d update one thing when we launched a new jurisdiction, and all the changes would flow to all parts of the site. It sounded amazing. The thing is, we were talking about moving our core infrastructure &#8212; our house &#8212; to a new foundation, but that foundation wasn&#8217;t built yet. We hadn&#8217;t really even figured out if it&#8217;d support the house or not.</p>
<p>Undeterred, an engineer set out to start building out &#8220;cc.licenze&#8221;, filling in the gaps I&#8217;d left to make it do all the things that licenses need that CC0 does not. And he got most of the work done, and then he left. So the work languished while we focused on continuing to ship new jurisdictions and do everything an understaffed technical team has to deal with.</p>
<p>The problem isn&#8217;t that we wanted to improve our underlying infrastructure, or that we wanted a coherent and consistent model. Those are the right goals. The problem was trying to build an entirely new foundation, with similar but not exactly the same APIs as the original one, and thinking we were going to slip it in. Starting this project today, I&#8217;d look at the three ways we were doing things, find the one that had the least debt, and rebase the other services/products onto it. By choosing one currently in use, any improvements made (either by rebasing or fixing bugs) would show immediate benefit. There&#8217;s immediate, tangible benefit to going from three ways to do something to two, and from two to one. Once everything uses the same foundation, there&#8217;s only one thing to rebuild and replace, not three, and we probably have a better idea about *everything* it needs to do.</p>
<p>To successfully live with technical debt, this is the sort of maneuver you often have to use. I think of this as Lateral Refactoring: you&#8217;re not  refactoring to the API/design you want to wind up with, you&#8217;re tacking along an orthogonal axis until you&#8217;re at the point where you can start moving forward again. By doing this you can realize some benefit sooner, and continue shipping new features and bug fixes.</p>
<img src="http://feeds.feedburner.com/~r/yerglernet-tloa/~4/6Q_u0CiB9yA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://yergler.net/blog/2012/05/16/new-foundations/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://yergler.net/blog/2012/05/16/new-foundations/</feedburner:origLink></item>
		<item>
		<title>Living With It</title>
		<link>http://feedproxy.google.com/~r/yerglernet-tloa/~3/vVNs7hT2D5Y/</link>
		<comments>http://yergler.net/blog/2012/05/15/living-with-it/#comments</comments>
		<pubDate>Wed, 16 May 2012 04:32:00 +0000</pubDate>
		<dc:creator>Nathan Yergler</dc:creator>
				<category><![CDATA[engineering]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[talks]]></category>

		<guid isPermaLink="false">http://yergler.net/?p=2085</guid>
		<description><![CDATA[So now that I&#8217;ve talked about what I think of when I say &#8220;technical debt&#8221;, I want to dig in on the other half of the title, &#8220;Living With It&#8221;. What does it mean to *live* with technical debt? I want to be clear: it does not mean simply accepting or ignoring it. I&#8217;m certain [...]]]></description>
			<content:encoded><![CDATA[<p>So now that I&#8217;ve talked about what I think of when I say &#8220;technical debt&#8221;, I want to dig in on the other half of the title, &#8220;Living With It&#8221;. What does it mean to *live* with technical debt? I want to be clear: it does not mean simply accepting or ignoring it. I&#8217;m certain that&#8217;s the wrong way to build long-lived, robust software. When we encounter technical debt, or something that feels hard, I think there are a few common, understandable, and dangerous reactions. These roughly fall into the categories of &#8220;I can do better&#8221;, &#8220;One more won&#8217;t hurt&#8221;, and &#8220;I can&#8217;t go on.&#8221;</p>
<p>When some engineers &#8212; even good (but not great) ones &#8212; encounter technical debt, their reaction may be &#8220;I can do better&#8221;. That is, &#8220;Oh, this is terrible, I can&#8217;t possibly work with code like *this*, I&#8217;ll rewrite this part of the system, and then I can get around to what I came here to do.&#8221; Rewriting or refactoring debt away may be the right decision, but this statement contains unspoken assumptions that better code is more important than new features or bug fixes for users. This is where the paradox of living with technical debt first shows itself: living with technical debt does not mean accepting it, but it also doesn&#8217;t mean fixing it. Right now. The business, the organization, has to make decisions about what&#8217;s most important. (Engineers need input into those decisions, and the business needs to respect that input, or the best engineers will go elsewhere, where their input will be respected.) It&#8217;s up to the business to decide &#8220;can we go dark for n days/weeks/months.&#8221; Sometimes the answer may be yes, and we&#8217;re free to improve the code with abandon. I think that&#8217;s a rare situation. More often the answer is &#8220;no&#8221;, so we need to live with the debt and develop strategies for improving it (more on that later).</p>
<p>Another reaction that I think is all too common is &#8220;I guess one more won&#8217;t hurt&#8221;. That is, &#8220;Well, we&#8217;re stupid is these five places, what&#8217;s one more?&#8221; Living with technical debt does not mean you continue to incur it. If anything, it&#8217;s essential to stop running up the tab. This requires rigor and strength of will, not just on the part of the engineer working on the code, but on her peers. The team needs to decide that incurring additional debt is not acceptable: you can maintain or you can improve, but you can&#8217;t backslide. The danger of &#8220;one more won&#8217;t hurt&#8221; is that the problem spreads: you build new features that repeat past mistakes, instead of providing a model for future work. </p>
<p>Finally, sometimes we look at code and think, &#8220;I can&#8217;t go on&#8221;. I find that those are the time it&#8217;s helpful to step away from a project, take a break, come back after a good night&#8217;s sleep. You don&#8217;t always have that luxury, but feelings of despair rarely coincide with my best work. I&#8217;ve observed that indulging in the first two ways of thinking &#8212; &#8220;I can do better&#8221; and &#8220;One more won&#8217;t hurt&#8221; &#8212; often leads to the final one &#8212; &#8220;I can&#8217;t go on&#8221;. &#8220;One more won&#8217;t hurt&#8221; just digs a deeper and deeper hole, until you can&#8217;t see your way out, and &#8220;I can do better&#8221; often leaves you with a piece of &#8220;perfect&#8221; code that doesn&#8217;t quite fit into the rest of the system, leaving you to shims and scotch tape, the very things you started out trying to avoid. </p>
<p>In &#8220;Good to Great&#8221;, Jim Collins writes about characteristics that separate good companies from great ones. One of the principles he identifies is &#8220;Confront the brutal facts, but never lose faith.&#8221; In other words, it does no good to pretend that your code (company in his case) is something that it isn&#8217;t. Collins talks about meeting Admiral Stockdale, and asking him, &#8220;Who didn&#8217;t make it out?&#8221; &#8220;Oh, that&#8217;s easy &#8212; the optimists.&#8221; Stockdale explains that the optimists were routinely disappointed, and eventually lost faith. &#8220;I can&#8217;t go on.&#8221; Collins quotes Stockdale as saying, &#8220;You must never confuse faith that you will prevail in the end &#8212; which you can never afford to lose &#8212; with the discipline to confront the most brutal facts of your current reality, whatever they might be.&#8221; Technical debt may be a far cry from Stockdale&#8217;s situation, but the principle holds as the heart of truly living with technical debt: we must confront things as they are, not as we wish they were. And we must believe that we can make things better, that we know where we&#8217;re going.</p>
<img src="http://feeds.feedburner.com/~r/yerglernet-tloa/~4/vVNs7hT2D5Y" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://yergler.net/blog/2012/05/15/living-with-it/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://yergler.net/blog/2012/05/15/living-with-it/</feedburner:origLink></item>
		<item>
		<title>Living With Technical Debt, Part One</title>
		<link>http://feedproxy.google.com/~r/yerglernet-tloa/~3/LaUGYI5DWdw/</link>
		<comments>http://yergler.net/blog/2012/05/14/living-with-technical-debt-part-one/#comments</comments>
		<pubDate>Tue, 15 May 2012 04:29:05 +0000</pubDate>
		<dc:creator>Nathan Yergler</dc:creator>
				<category><![CDATA[engineering]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[talks]]></category>

		<guid isPermaLink="false">http://yergler.net/?p=2080</guid>
		<description><![CDATA[I&#8217;m speaking at Velocity next month on &#8220;Living with Technical Debt&#8221;. Like any mature codebase, our software at Eventbrite has technical debt. Like any project with rapidly shifting priorities, the code we built at Creative Commons had technical debt. It&#8217;s only in the last year or so that I&#8217;ve really come to see that and [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m speaking at <a href="http://velocityconf.com/velocity2012">Velocity</a> next month on <a href="http://velocityconf.com/velocity2012/public/schedule/detail/23703">&#8220;Living with Technical Debt&#8221;</a>. Like any mature codebase, our software at <a href="http://www.eventbrite.com/">Eventbrite</a> has technical debt. Like any project with rapidly shifting priorities, the <a href="http://code.creativecommons.org/">code</a> we built at <a href="http://creativecommons.org/">Creative Commons</a> had technical debt. It&#8217;s only in the last year or so that I&#8217;ve really come to see that and start to think about how one navigates technical debt. So there are a lot of ideas floating around in my head about what I want to talk about. This post (probably the first of several) is me trying to get those ideas out of my head and into text, so I can go about organizing my talk. Not everything in here is going to make it into the final talk, and I expect that whatever does will be re-organized and re-synthesized.</p>
<p>I don&#8217;t think it&#8217;s unreasonable to start with what I mean by &#8220;technical debt&#8221;. &#8220;Technical Debt&#8221; is a euphemism, usually trotted out when we&#8217;re talking about something we don&#8217;t like about software or systems. I say &#8220;don&#8217;t like&#8221; as if the label is undeserved: it&#8217;s not always clear when someone says &#8220;technical debt&#8221; if they&#8217;re talking about code that&#8217;s obviously difficult to work with, or just makes a different set of choices than they would have made. One definition I&#8217;ve been thinking about is this: technical debt is some aspect of your system that increases the cognitive overhead of understanding, improving, and maintaining it. It&#8217;s possible there should be a clause added about &#8220;for the majority of developers&#8221;, too: I know there&#8217;s code I&#8217;ve written that absolutely minimizes cognitive overhead for <em>me</em>, but the things I&#8217;m used to, idiomatic Nathan, makes it harder for someone else to come and fix a bug or add functionality.</p>
<p>By speaking about technical debt in terms of cognitive overhead, we can start to detach ourselves from the situation emotionally. It&#8217;s pretty easy to become emotionally involved with the code we write. And usually that&#8217;s a good thing: it&#8217;s important for me to work on things that feel important, things that I feel like I can leave my mark on. I&#8217;d like to posit, however, that it&#8217;s possible to become emotionally co-dependent with your code. That may sound like a strange idea, so let me explain: whenever something I create becomes a proxy for my self &#8212; my individuality, my self worth &#8212; it is nearly impossible for me to see problems with it. It is nearly impossible for me to hear anything but glowing praise. And when I do hear glowing praise, it&#8217;s never enough. I&#8217;ve observed two different effects of these feelings. First, I start treating situations like a zero sum game: it&#8217;s not enough to succeed, others must fail. It&#8217;s not hard to see how this would lead to hypersensitivity and hypercriticality at the same time. Second, I don&#8217;t make smart decisions: I make them based on my feelings rather than on reality. I don&#8217;t know why this would be any less true of code than it is of other endeavors. So to really see technical debt in our systems, we need to detach ourselves emotionally: it&#8217;s not about who&#8217;s at fault, it&#8217;s about how we make it better. </p>
<p>(There&#8217;s a whole other topic around team building here; I&#8217;m going to assume for the purposes of this discussion that you have the people you want on your team, either because they&#8217;re operating at the level you need them to, or because you believe they can grow to that level.)</p>
<p>So what are some ways your system can add to the cognitive overhead needed to understand it? I can think of a few: inconsistency, duplication, and lack of cohesion all immediately come to mind. These all make it difficult for an engineer to understand, maintain, and improve a system. More on that later.</p>
<img src="http://feeds.feedburner.com/~r/yerglernet-tloa/~4/LaUGYI5DWdw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://yergler.net/blog/2012/05/14/living-with-technical-debt-part-one/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://yergler.net/blog/2012/05/14/living-with-technical-debt-part-one/</feedburner:origLink></item>
		<item>
		<title>Some thoughts on Mastery</title>
		<link>http://feedproxy.google.com/~r/yerglernet-tloa/~3/mJ7shvoE19s/</link>
		<comments>http://yergler.net/blog/2012/05/13/mastery/#comments</comments>
		<pubDate>Mon, 14 May 2012 02:28:15 +0000</pubDate>
		<dc:creator>Nathan Yergler</dc:creator>
				<category><![CDATA[practice]]></category>

		<guid isPermaLink="false">http://yergler.net/?p=2072</guid>
		<description><![CDATA[A few years ago I decided to take a writing class at City College of San Francisco. The class was creative non-fiction, memoir writing. I went into it expecting that it would be fun, but not difficult. When it came time to write my first assignment, I found that it actually was in fact more [...]]]></description>
			<content:encoded><![CDATA[<p>A few years ago I decided to take a writing class at City College of San Francisco. The class was creative non-fiction, memoir writing. I went into it expecting that it would be fun, but not difficult. When it came time to write my first assignment, I found that it actually was in fact more challenging than I expected. But I told myself to keep my butt in the chair, and keep writing. I completed the assignment and turned it in on a Thursday. The instructor handed our graded assignments back face down at the end of class on Tuesday. I kept mine face down as I walked out of the building, looking at it when I finally got to the street. &#8220;A&#8221;, followed by glowing and positive comments. I  called my best friend and left him voicemail: &#8220;I just got my first assignment back, and I got an A!&#8221; I reported breathlessly. He later told me, &#8220;I don&#8217;t think I&#8217;ve ever heard you giggle before listening to that message.&#8221; In my mind I was already a writer. No, a Writer: capital &#8220;W&#8221;. I was going to go forward from that assignment and only get better, only have success, unleashing my heretofore undiscovered talent on the world. But that wasn&#8217;t the case. When I sat down to write the second assignment the next evening (&#8220;oh, I&#8217;ll just sit down and this will flow out of me; I know what I want to write about, how long can it take to just type it?&#8221;), nothing came out. Well, some words came out, but it was pretty clear they weren&#8217;t what I imagined. The words on the page were a pale reflection of the idea in my head. I struggled for a couple of hours before calling it a night. And I did not get an &#8220;A&#8221; on the second assignment. </p>
<p>I was reminded of this incident recently, thinking about why sometimes things feel like they flow and I stay with it, and sometimes they don&#8217;t and I put it down. I had a long flight and had brought a book with me: &#8220;Mastery: The Keys to Success and Long-term Fulfillment&#8221;, by George Leonard. A colleague had recommended it to me as we talked about what it means to have mastery of something (in the case of our conversation, software engineering). It&#8217;s a short book, about 150 pages, and easy to read. The core thing I took away from it was that mastery is about pursuing a path for its own sake, not for the sake of a grade or a title. The path to mastery involves seeking instruction, practice, surrendering your ego, being intentional about what you want, and pushing yourself just past the edge of what&#8217;s comfortable or obvious. I think the most interesting thing about reading Mastery was how it crystallized other things I&#8217;ve been thinking about or reading since taking that writing class.</p>
<p>Julia Cameron, in The Artist&#8217;s Way, talks about &#8220;morning pages&#8221;: getting up and writing three pages, even if all you write is &#8220;I don&#8217;t know what to write&#8221;. Surrendering the idea of a polished product, practicing putting pen to paper, pushing yourself.</p>
<p>Annie Lamott, in &#8220;Bird by Bird&#8221;, talks about &#8220;shitty first drafts&#8221;: again, surrendering the idea of a polished product, of genius, and committing yourself to work.</p>
<p>And my print-making mentor, Katie Gilmartin, reminding me gently that Picasso didn&#8217;t make just one bull: he created the image again and again, practicing, improving his technique. In telling me that she reminds me that it&#8217;s not only acceptable to repeat yourself, it&#8217;s desirable. </p>
<p>Finally, when we interview engineering candidates, one of the things we look for is what they&#8217;re doing outside of their job. Some members of the team look for outside technical projects: are they interested in the field and in learning more about new things. That&#8217;s great, but I tend to look for &#8220;what are they making&#8221;. It might be software, it might be paintings, it might be improv. After reading &#8220;Mastery&#8221;, I think that I&#8217;m looking for a practice. Looking for something they&#8217;re doing just because they love it, not because they&#8217;re going to get paid, recognized, etc.</p>
<p>I think the path to mastery is the path of having a practice. What do I do again and again, not because I&#8217;m going to get an &#8220;A&#8221;, but because I love it and it feeds me.</p>
<img src="http://feeds.feedburner.com/~r/yerglernet-tloa/~4/mJ7shvoE19s" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://yergler.net/blog/2012/05/13/mastery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://yergler.net/blog/2012/05/13/mastery/</feedburner:origLink></item>
		<item>
		<title>Korea Travelogue</title>
		<link>http://feedproxy.google.com/~r/yerglernet-tloa/~3/3UoPaDVZt_8/</link>
		<comments>http://yergler.net/blog/2012/04/28/korea-travelogue/#comments</comments>
		<pubDate>Sun, 29 Apr 2012 02:55:02 +0000</pubDate>
		<dc:creator>Nathan Yergler</dc:creator>
				<category><![CDATA[travel]]></category>
		<category><![CDATA[korea]]></category>
		<category><![CDATA[seoul]]></category>

		<guid isPermaLink="false">http://yergler.net/?p=2058</guid>
		<description><![CDATA[I arrived home in San Francisco five hours ago from my first ever trip to Asia. Somehow with all the traveling I did while working for CC, I never made it to Asia or Australia. So R and I decided to spend our vacation this spring in Seoul. Because I want to write some things [...]]]></description>
			<content:encoded><![CDATA[<p>I arrived home in San Francisco five hours ago from my first ever trip to Asia. Somehow with all the traveling I did while working for CC, I never made it to Asia or Australia. So R and I decided to spend our vacation this spring in Seoul. Because I want to write some things down (and because I agreed to do this <a href="http://iron-blogger-sf.com/">Iron Blogger</a> thing but haven&#8217;t yet, and because my alternative is replacing my blog software, which I&#8217;m definitely too jet-lagged to do), here are three highlights of the trip.</p>
<p>The center of our week was a day spent in the <a href="http://en.wikipedia.org/wiki/Korean_Demilitarized_Zone">DMZ</a>. I have to start with this because I still feel the most uncertain about it. We arranged a day long tour of both the DMZ and the <a href="http://en.wikipedia.org/wiki/Joint_Security_Area">Joint Security Area (JSA)</a>. Going into it I had some trepidation: was it going to feel light and airy and unserious? Was the fact that two countries are basically at war going to be glossed over? What does it mean that I&#8217;m touring (literally, a tourist) a space set aside by an armistice agreement? I suspect the last question is something I&#8217;ll write about more at length, but here&#8217;s the high level: the JSA tour was terrifying (to me; R didn&#8217;t seem to have the psychological reaction quite to the degree I did). The ID checks, the barbed wire, and seeing the North Korean soldiers observing us with binoculars as we walked along the <a href="http://en.wikipedia.org/wiki/Military_Demarcation_Line">MDL</a> was not light, was not airy, and definitely did not gloss over the fact two countries are at war. Part of this was Laura, our excellent guide for the morning. As we rode the bus north from Seoul, she sagely pointed out, &#8220;1,000,000 land mines! You stay with group today!&#8221; And then she looked <em>directly at me</em>. The afternoon tour of the &#8220;DMZ&#8221; &#8212; Dorasan Observatory, <a href="http://en.wikipedia.org/wiki/Dorasan_Station">Dorasan Station</a>, and the <a href="http://en.wikipedia.org/wiki/Third_Tunnel_of_Aggression">3rd Infiltration Tunnel</a> &#8212; was less compelling, perhaps because it was raining, but probably because we only had something like 20 minutes at each stop. It didn&#8217;t help that the afternoon guide, Justin, wasn&#8217;t operating at anywhere near Laura&#8217;s level. I should note that every stop on the tour has a gift shop. Some of them sell products cultivated in the DMZ (ginseng, rice, soy beans &#8212; chocolate covered and not), and some sell truly strange souvenirs (see: a plastic axe, which seems <a href="http://en.wikipedia.org/wiki/Axe_murder_incident">in questionable taste</a>). The presence of gift shops did nothing to help me understand how I feel about touring a (theoretically) hostile line.</p>
<p>Another highlight for me was visiting the <a href="http://en.wikipedia.org/wiki/Bongeunsa">Bongeunsa Temple</a> and <a href="http://en.wikipedia.org/wiki/Gyeongbokgung">Gyeongbokgung Palace</a>. (R would insist I point out &#8220;gung&#8221; means &#8220;palace&#8221;, so I just wrote &#8220;Gyeongbok Palace Palace&#8221;, but the ticket says &#8220;Gyeongbokgung Palace&#8221;, so I&#8217;m sticking that.) These are two very different places; I&#8217;m grouping them together because they evoked similar feelings for me. Bongeunsa was an easy walk from our hotel (and the Samseong Station, if you&#8217;re going to check it out), and yielded some really relaxing time wandering the grounds, listening to the chanting, and smelling the trees. Gyeongbokgung, on the other hand, was closed the first time we tried to go, and when we finally went near closing time Thursday, there were lots of people wandering the grounds. Gyeongbokgung is actually like a park, with many buildings enclosed in it. You can look at the architecture, walk around a pond, or explore the nooks and crannies. Like the temple, this had a really meditative feel to me, and we took lots of interesting pictures.</p>
<p>The last day we hit up <a href="http://www.dragonhillspa.com/">Dragon Hill Spa &#038; Resort</a>. Apparently the largest in Seoul (Korea?), I signed up for the &#8220;gold package&#8221; &#8212; body scrub, steam massage, oil acupressure, leg massage, muscle massage, facial massage, head acupressure, and, of course, shampoo. Quite possibly the best &#8361;110,000 I spent all week. The &#8220;scrub&#8221; felt like it used a scouring pad, but as I lay there afterward waiting for round two, my skin felt tingly and awake. The acupressure and &#8220;massage&#8221; were intense: every muscle in my body was pounded, slapped, pulled, and kneaded, and then for good measure the joints holding them together were stretched and twisted. I would say I walked away feeling renewed and refreshed, but I&#8217;m not sure I really &#8220;walked&#8221; so much as &#8220;oozed&#8221;. We went back to the hotel that evening and slept incredibly well. And when the soreness finally fade, I&#8217;m sure I&#8217;ll feel even better.</p>
<p>Other things we did, which I may write more about at a later date: Kimchi Field Museum (yes, really), Deoksugung Palace (to, ahem, further the &#8220;gung&#8221; discussion above, this one is really confusing: the ticket says &#8220;Deoksugung Palace&#8221;, which the brochure says &#8220;Deoksu Palace&#8221;), cat and dog cafes (cafes where you can play with cats or dogs while enjoying your beverage of choice), open air markets, random shopping, and great food.</p>
<img src="http://feeds.feedburner.com/~r/yerglernet-tloa/~4/3UoPaDVZt_8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://yergler.net/blog/2012/04/28/korea-travelogue/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://yergler.net/blog/2012/04/28/korea-travelogue/</feedburner:origLink></item>
		<item>
		<title>hieroglyph: Easy, Beautiful Slides with Restructured Text</title>
		<link>http://feedproxy.google.com/~r/yerglernet-tloa/~3/aZdFD6GrlxQ/</link>
		<comments>http://yergler.net/blog/2012/03/13/hieroglyph/#comments</comments>
		<pubDate>Wed, 14 Mar 2012 05:31:16 +0000</pubDate>
		<dc:creator>Nathan Yergler</dc:creator>
				<category><![CDATA[projects]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[rst]]></category>
		<category><![CDATA[slides]]></category>
		<category><![CDATA[sphinx]]></category>

		<guid isPermaLink="false">http://yergler.net/?p=2028</guid>
		<description><![CDATA[I was happy to have my talk proposal accepted for PyCon this year, and happy with the feedback I received on my talk (Django Forms Deep Dive). But as I was putting my talk together the distracting question was not, &#8220;what should I say&#8221;, but &#8220;what should I say it with&#8221;. As a mentor once [...]]]></description>
			<content:encoded><![CDATA[<p>I was happy to have my talk proposal accepted for <a href="https://us.pycon.org/2012/">PyCon</a> this year, and happy with the feedback I received on my talk (<a href="https://us.pycon.org/2012/schedule/presentation/420/">Django Forms Deep Dive</a>). But as I was putting my talk together the distracting question was not, &#8220;what should I say&#8221;, but &#8220;what should I say it with&#8221;. As a mentor once pointed out, &#8220;it&#8217;s more fun to write programs to help you write programs than it is to write programs.&#8221; The corollary I found over the past couple weeks: &#8220;it&#8217;s more fun to write programs to help you write slides than it is to write slides.&#8221;</p>
<p><a href="http://yergler.net/media/2012/03/Screen-Shot-2012-03-14-at-8.49.28-AM.png"><img src="/media/2012/03/Screen-Shot-2012-03-14-at-8.49.28-AM-300x187.png" alt="" title="hieroglyph slides" width="300" height="187" class="aligncenter size-medium wp-image-2052" /></a></p>
<p>I was putting together notes using <a href="http://docutils.sourceforge.net/">reStructured Text</a> and kept thinking that it&#8217;d be nice to generate both slides and longer written documentation from the same source. I&#8217;ve used docutils&#8217; <a href="http://docutils.sourceforge.net/docs/user/slide-shows.html">S5 generator</a> in the past, but was looking for something a little more polished looking. Something like the <a href="http://code.google.com/p/html5slides/">HTML5 Slides</a>. </p>
<p><a href="http://yergler.net/media/2012/03/Screenshot_2012-03-14-08-47-22.png"><img src="/media/2012/03/Screenshot_2012-03-14-08-47-22-168x300.png" alt="" title="Mobile hieroglyph" width="168" height="300" class="alignright size-medium wp-image-2053" /></a>So I wrote a <a href="http://yergler.net/projects/hieroglyph/"><strong>hieroglyph</strong></a>, a <a href="http://sphinx.pocoo.org/">Sphinx</a> builder for generating HTML5 Slides. I presented <strong>hieroglyph</strong> at the Sunday morning lightning talks at PyCon: you can see the <a href="http://yergler.net/projects/hieroglyph/slides/">slides</a>, the <a href="https://github.com/nyergler/hieroglyph/blob/master/docs/index.rst">reStructured Text source</a>, as well as the <a href="http://yergler.net/projects/hieroglyph/">HTML documentation</a> generated from the same source.</p>
<p>I&#8217;m really happy with the output &#8212; it looks great in the browser, projects well, and because I&#8217;m using the html5slides CSS, looks great on mobile devices, too. I&#8217;m even happier that I&#8217;m able to work on my content in plain text. You can find the source <a href="https://github.com/nyergler/hieroglyph">on github</a>.</p>
<img src="http://feeds.feedburner.com/~r/yerglernet-tloa/~4/aZdFD6GrlxQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://yergler.net/blog/2012/03/13/hieroglyph/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://yergler.net/blog/2012/03/13/hieroglyph/</feedburner:origLink></item>
		<item>
		<title>The OOT Killer</title>
		<link>http://feedproxy.google.com/~r/yerglernet-tloa/~3/m_vsBDduCAg/</link>
		<comments>http://yergler.net/blog/2011/12/04/the-oot-killer/#comments</comments>
		<pubDate>Mon, 05 Dec 2011 05:43:00 +0000</pubDate>
		<dc:creator>Nathan Yergler</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[commitment]]></category>
		<category><![CDATA[practice]]></category>

		<guid isPermaLink="false">http://yergler.net/?p=2020</guid>
		<description><![CDATA[Recently I have been suffering from the delusion that making more commitments will make me more able to achieve them. My first reaction to reading Asheeh&#8217;s reflections on commitments: &#8220;Yes, and I wish I&#8217;d learned that about ten years earlier than I did.&#8221; And then I remember that it&#8217;s not something you learn once; tending [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Recently I have been suffering from the delusion that making more commitments will make me more able to achieve them.
</p></blockquote>
<p>My first reaction to reading <a href="http://www.asheesh.org/note/debian/oot-killer.html">Asheeh&#8217;s reflections on commitments</a>: &#8220;Yes, and I wish I&#8217;d learned that about ten years earlier than I did.&#8221; And then I remember that it&#8217;s not something you learn once; tending to your committments &#8212; and making them with care &#8212; is a life-long practice. Practicing is hard, but it&#8217;s preferrable to encountering the OOT killer.</p>
<img src="http://feeds.feedburner.com/~r/yerglernet-tloa/~4/m_vsBDduCAg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://yergler.net/blog/2011/12/04/the-oot-killer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://yergler.net/blog/2011/12/04/the-oot-killer/</feedburner:origLink></item>
		<item>
		<title>Updating el-get and getelget.el</title>
		<link>http://feedproxy.google.com/~r/yerglernet-tloa/~3/LMMmK-EbsNA/</link>
		<comments>http://yergler.net/blog/2011/09/26/getelget-update/#comments</comments>
		<pubDate>Mon, 26 Sep 2011 16:59:24 +0000</pubDate>
		<dc:creator>Nathan Yergler</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[tools]]></category>
		<category><![CDATA[emacs el-get getelget]]></category>

		<guid isPermaLink="false">http://yergler.net/?p=1989</guid>
		<description><![CDATA[Last week one of my Emacs using colleagues asked me how I managed my Emacs packages and configuration. Naturally I pointed him to el-get and my getelget.el bootstrap script. I&#8217;ve been happily managing my Emacs installation over the past five months using el-get and a private git repository for my configuration. However when I tried [...]]]></description>
			<content:encoded><![CDATA[<p>Last week one of my Emacs using colleagues asked me how I managed my Emacs packages and configuration. Naturally I pointed him to <a title="el-get at github.com" href="https://github.com/dimitri/el-get">el-get</a> and my <a title="Managing my Emacs packages with el-get" href="http://yergler.net/blog/2011/04/19/managing-my-emacs-packages-with-el-get/">getelget.el bootstrap script</a>. I&#8217;ve been happily managing my Emacs installation over the past five months using el-get and a private git repository for my configuration. However when I tried to square my <code>.emacs.d/init.el</code> with the current el-get documentation, I got a little confused; el-get is now better at bootstrapping itself from within your Emacs configuration. When my colleague read this and asked why he might want <code>getelget.el</code>, my response was&#8230; well, lackluster; this is an attempt to document that a littler better.)</p>
<p>Last night I decided to do a little clean-up on my Emacs configuration, and see if I could get rid of getelget.el. The <a href="https://github.com/dimitri/el-get/blob/master/README.asciidoc">documentation for el-get</a> is great, so I started there. What I quickly realized is that the included el-get bootstrap mechanism is great if you want to ensure el-get is installed and then use <code>el-get-install</code>, <code>el-get-remove</code>, etc to manage your packages. But if you define your package list in you config file, it&#8217;s not quite enough. Specifically, when you first bootstrap your configuration, you want to defer calling <code>(elget 'sync)</code> until you&#8217;ve bootstrapped el-get. And on future runs, you want to go ahead and install any new packages that have been added to your list.</p>
<p>Luckily el-get has added support for hooks, which makes life a little easier. The new <code>getelget.el</code> (available <a href="http://yergler.net/projects/2011/getelget-201109.el" title="getelget.el source code">here</a>) looks something like this:</p>
<pre><code>
;; getelget - el-get boostrap script
;;
;; Checks to see if el-get has been checked out, and bootstraps it if
;; it has not. After bootstrapping, calls el-get to load specified
;; packages.
;;
;; el-get-packages should be defined before including this file. Any
;; definitions from el-get-sources will be appended to el-get-packages.
;;
;; Written in 2011 by Nathan R. Yergler <nathan@yergler.net>
;;
;; To the extent possible under law, the person who associated CC0 with
;; getelget has waived all copyright and related or neighboring rights
;; to getelget.
;;
;; You should have received a copy of the CC0 legalcode along with this
;; work.  If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.

;; add a hook listener for post-install el-get
(defun post-install-hook (pkg)
  ;; after installing el-get, load the local package list
  (if (string-equal pkg "el-get")
      (el-get 'sync
              (append el-get-packages
                      (mapcar 'el-get-source-name el-get-sources)))))
(add-hook 'el-get-post-install-hooks 'post-install-hook)

;; add the el-get directory to the load path
(add-to-list 'load-path
             (concat (file-name-as-directory user-emacs-directory)
                     (file-name-as-directory "el-get")
                     "el-get"))

;; try to require el-get
(if (eq (require 'el-get nil t) nil)

    ;; urp, need to bootstrap
    (url-retrieve
     "https://raw.github.com/dimitri/el-get/master/el-get-install.el"
     (lambda (s)
         (end-of-buffer)
         (eval-print-last-sexp)))

    ;; successfully required el-get, load the packages!
    (post-install-hook "el-get")
</code></pre>
<p>el-get also <a href="http://tapoueh.org/blog/2011/09/16-el-get-3.1.html">recommends</a> splitting your package definitions from your local source recipes (which can themselves extend an included recipe). So getelget.el now expects you&#8217;ve defined two lists: <code>el-get-packages</code>, a list of packages to install from recipes, and <code>el-get-sources</code>, your local source list. </p>
<p>For example, I define a local recipe for <a href="https://github.com/magit/magit">magit</a> that binds a key to <code>magit-status</code> and enables spell checking and fill mode for commit message editing:</p>
<pre><code>
(setq el-get-sources
      '((:name magit
               :after (lambda ()
                        (global-set-key "\C-x\r\r" 'magit-status)

                        ;; Enable spell checking, fill for log editing
                        (add-hook 'magit-log-edit-mode-hook
                                  (lambda()
                                    (auto-fill-mode 1)
                                    (flyspell-mode 1)))))
        ))
</code></pre>
<p>And my <code>el-get-packages</code> list is just a list of packages I&#8217;m installing from the included el-get recipes.</p>
<pre><code>
(setq el-get-packages
       '(el-get
         google-maps
         color-theme
         python-mode
         virtualenv
         php-mode-improved
         xml-rpc-el
         js2-mode
         org2blog))
</code></pre>
<p>Everything listed in both lists will be installed.</p>
<p>YMMV, FWIW, ZOMG, BBQ, etc.</p>
<img src="http://feeds.feedburner.com/~r/yerglernet-tloa/~4/LMMmK-EbsNA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://yergler.net/blog/2011/09/26/getelget-update/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://yergler.net/blog/2011/09/26/getelget-update/</feedburner:origLink></item>
		<item>
		<title>super(self.__class__, self) # end of the line for subclassing</title>
		<link>http://feedproxy.google.com/~r/yerglernet-tloa/~3/D0gyLwkSYTU/</link>
		<comments>http://yergler.net/blog/2011/07/04/super-self/#comments</comments>
		<pubDate>Tue, 05 Jul 2011 03:44:23 +0000</pubDate>
		<dc:creator>Nathan Yergler</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[super]]></category>

		<guid isPermaLink="false">http://yergler.net/?p=1990</guid>
		<description><![CDATA[I&#8217;ve learned (and remembered) a lot in the past two months as I&#8217;ve gotten back to coding as my primary job. One thing that I guess I never quite internalized before is how super works. I have been bitten by code that looks something like the following a few times in the past month: class [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve learned (and remembered) a lot in the past two months as I&#8217;ve gotten back to coding as my primary job. One thing that I guess I never quite internalized before is how <code>super</code> works. I have been bitten by code that looks something like the following a few times in the past month:</p>
<pre><code>
class A(object):
    def __init__(self):
        super(self.__class__, self).__init__()

class B(A):
    def __init__(self):
        super(B, self).__init__()
</code></pre>
<p>The surprise comes when I try to use my sub-class, <code>B</code>. Instantiating <code>B()</code> blows up the stack with: </p>
<p><code>RuntimeError: maximum recursion depth exceeded while calling a Python object</code>.</p>
<p>What? </p>
<p>According to the <a href="http://docs.python.org/library/functions.html#super">Python 2.7.2 standard library documentation</a>, <code>super</code> &#8220;return[s] a proxy object that delegates method calls to a parent or sibling class of type.&#8221; So in the case of single inheritance, it delegates access to the super class, it does not return an instance of the super class. In the example above, this means that when you instantiate B, the follow happens:</p>
<ol>
<li>enter <code>B.__init__()</code></li>
<li>call <code>super</code> on B and call <code>__init__</code> on the proxy object</li>
<li>enter <code>A.__init__()</code></li>
<li>call <code>super</code> on <code>self.__class__</code> and call <code>__init__</code> on the proxy object</li>
</ol>
<p>The problem is that when we get to step four, <code>self</code> still refers to our instance of <code>B</code>, so calling <code>super</code> points back to <code>A</code> again. In technical terms: Ka-bloom.</p>
<p><strong>TL;DR:</strong> <code>super(self.__class__, self)</code> may look like a neat trick, but it&#8217;s the end of the line for sub-classing.</p>
<p><strong>Further reading:</strong> Raymond Hettinger&#8217;s excellent <a href="http://rhettinger.wordpress.com/2011/05/26/super-considered-super/">blog post on super</a> provides a great overview of <code>super</code> and shows off the improved Python 3 syntax, which removes the need to write the class name as part of the <code>super</code> statement. I was really pleased to find the Python standard library documentation links directly to it.</p>
<img src="http://feeds.feedburner.com/~r/yerglernet-tloa/~4/D0gyLwkSYTU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://yergler.net/blog/2011/07/04/super-self/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://yergler.net/blog/2011/07/04/super-self/</feedburner:origLink></item>
	</channel>
</rss>

