<?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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Codeulate.</title>
	
	<link>http://codeulate.com</link>
	<description />
	<lastBuildDate>Fri, 10 May 2013 20:17:50 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/Codeulate" /><feedburner:info uri="codeulate" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>How I’d Improve The CFP Process</title>
		<link>http://feedproxy.google.com/~r/Codeulate/~3/l0MW1_Z8Ty4/</link>
		<comments>http://codeulate.com/2013/05/how-id-improve-the-cfp-process/#comments</comments>
		<pubDate>Sat, 04 May 2013 07:50:45 +0000</pubDate>
		<dc:creator>Ben Orenstein</dc:creator>
				<category><![CDATA[general]]></category>

		<guid isPermaLink="false">http://codeulate.com/?p=455</guid>
		<description><![CDATA[If I were running a conference, here&#8217;s how I&#8217;d approach the talk selection process: Skip the call for proposals entirely. Advise those interested in speaking to prepare a video of the first three minutes of their talk. Conference organizers do a first pass on the videos to weed out the weakest submissions. All registered attendees [...]]]></description>
				<content:encoded><![CDATA[<p>If I were running a conference, here&#8217;s how I&#8217;d approach the talk selection process:</p>
<ol>
<li>Skip the call for proposals entirely.</li>
<li>Advise those interested in speaking to prepare a video of the first three minutes of their talk.</li>
<li>Conference organizers do a first pass on the videos to weed out the weakest submissions.</li>
<li>All registered attendees are asked to vote on the remaining videos.</li>
<li>After votes are tabulated, the top N speakers are offered the chance to present their full talk at the conference.</li>
<li>Speakers that didn&#8217;t make the cut can choose to run small breakout groups after the main event.</li>
</ol>
<p>I think this approach is superior to the standard CFP process for the following reasons:</p>
<ol>
<li>It allows for the evaluation of speakers on their speaking, rather than their ability to write a proposal. Imagine your results if you hired someone based solely on the writing quality of their cover letter. You&#8217;d end up with a strong writer, but would likely discover that writing skills and day-to-day job performance are only somewhat correlated. So it goes with talk proposals. Conference organizers sometimes accept intriguing proposals only to discover that the speaker does not have the ability to present a compelling talk on that topic.</li>
<li>It lets the audience choose the topics that will be covered at the conference. Each year, conference organizers must guess which subjects will be most useful to their attendees. Why guess when you can collect just-in-time data?</li>
<li>It is relatively unbiased against new speakers. In the normal CFP process, inexperienced presenters are often edged out by their better-known peers (particularly if they are friends of the organizers). It requires a leap of faith to accept a rookie&#8217;s talk without any proof that they&#8217;ll do it justice. Under my system, new and experienced speakers alike must both prove they&#8217;re prepared to do a great job.</li>
<li>It leverages the wisdom of the crowd. It seems likely that 300 attendees in aggregate will make more informed decisions than a small handful of already overworked organizers.</li>
<li>It&#8217;s easier on those running the conference. Organizationally, certainly; but also socially. If the talks at a conference are of poor quality, it&#8217;s natural to blame the organizers. But if the attendees as a group selected the speakers, they are more likely to empathize with the difficulty of predicting speaking success. Moreover, the attendees would likely be biased to consider the speakers to be better quality than they were, rather than face the cognitive dissonance of having chosen bad speakers.</li>
</ol>
<p>Possible drawbacks of this approach include the following:</p>
<ol>
<li>It may be harder to market a conference with no pre-announced speakers. LessConf can sell out without telling anyone who will speak, but this seems to be an exception. Perhaps my approach would pair well with choosing a few anchor speakers who are guaranteed slots. This retains most of the advantages above while ensuring that organizers have some big names to announce.</li>
<li>It&#8217;s unlikely to address a lack of diversity amongst speakers. Organizers must often work to ensure that minority groups are sufficiently represented in the final list of selected speakers. Like the first issue, this could be addressed by having a small group of (diverse) pre-selected speakers.</li>
</ol>
<p>What say you, conference organizers? Any interest in giving this a shot? Have I missed any potential drawbacks?</p>
<p><em>Note: I made some significant changes to my proposed process based on feedback from the commenters below. Thanks to all of you for the ideas!</em></p>
<img src="http://feeds.feedburner.com/~r/Codeulate/~4/l0MW1_Z8Ty4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://codeulate.com/2013/05/how-id-improve-the-cfp-process/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		<feedburner:origLink>http://codeulate.com/2013/05/how-id-improve-the-cfp-process/</feedburner:origLink></item>
		<item>
		<title>A criticism of DHH’s post on Dependency Injection</title>
		<link>http://feedproxy.google.com/~r/Codeulate/~3/3zmaOyjjrx0/</link>
		<comments>http://codeulate.com/2013/01/a-criticism-of-dhhs-post-on-dependency-injection/#comments</comments>
		<pubDate>Sun, 06 Jan 2013 18:40:59 +0000</pubDate>
		<dc:creator>Ben Orenstein</dc:creator>
				<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://codeulate.com/?p=441</guid>
		<description><![CDATA[DHH&#8217;s latest post on DI is bad writing and thinking, and I&#8217;m concerned about its effects on the Ruby community. Through much trial and error, I&#8217;ve learned that every programming concept has advantages and disadvantages; nothing is purely good or bad. Global data can be good. Reducing duplication can add the cost indirection. To present [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://david.heinemeierhansson.com/2012/dependency-injection-is-not-a-virtue.html">DHH&#8217;s latest post on DI</a> is bad writing and thinking, and I&#8217;m concerned about its effects on the Ruby community.</p>
<p>Through much trial and error, I&#8217;ve learned that every programming concept has advantages and disadvantages; nothing is purely good or bad. Global data can be good. Reducing duplication can add the cost indirection. To present anything as purely one or the other tends to be the realm of novices who haven&#8217;t yet grasped the subtleties involved. Worthwhile discussion of programming ideas takes a fairly neutral view, and focuses on tradeoffs.</p>
<p>The problem with David&#8217;s post is that it does the opposite. Here&#8217;s his coverage of the benefits of dependency injection:</p>
<blockquote><p>&#8220;As has unfortunately happened with a variety of patterns that originate from rigid languages like Java, Dependency Injection has spread and been advocated as a cross-language best practice on trumped up benefits of flexibility and malleability. If your code never knows exactly who it&#8217;s talking to, it can talk to anyone! Testing stubs, mocks, and future collaborators. Hogwash.&#8221;</p></blockquote>
<p>This is not analysis, it&#8217;s wholesale dismissal of the points that don&#8217;t match his opinion. This would get you a D in a freshman analytical writing class.</p>
<p>Later:</p>
<blockquote><p>&#8220;Of course, this runs counter to another Java-derived principle to only mock types you own. Combine that with an affinity of dependency injection and the simplest thing that could possibly work is no longer not just good enough, it&#8217;s disgusting. It violates the doctrine that has been so carefully assembled.&#8221;</p></blockquote>
<p>Ah, the ol&#8217; switcheroo. The OTHER side has been indoctrinated and refuses to examine the tradeoffs it&#8217;s making. Unlike us, the enlightened, who know that the other guys are wrong, and need not discuss their arguments.</p>
<p>There&#8217;s plenty of bad writing on the internet, and I don&#8217;t usually consider it worth the time to call it out. But David is a tremendously influential character in the Ruby world, and I&#8217;m concerned that this dysfunctional approach to discussion will prove contagious. It&#8217;s particularly dangerous for newcomers, for whom a rule they can always follow seems like a life raft in a sea of uncertainty. Sadly, it will do them more harm than good.</p>
<p>I hope David continues to share his thoughts about Ruby. When an experienced and successful programmer speaks, I&#8217;ll always listen. But I&#8217;d love to see this faulty means of discussion deprecated, extracted to a gem, and then removed entirely.</p>
<img src="http://feeds.feedburner.com/~r/Codeulate/~4/3zmaOyjjrx0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://codeulate.com/2013/01/a-criticism-of-dhhs-post-on-dependency-injection/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		<feedburner:origLink>http://codeulate.com/2013/01/a-criticism-of-dhhs-post-on-dependency-injection/</feedburner:origLink></item>
		<item>
		<title>Depend Upon Abstractions</title>
		<link>http://feedproxy.google.com/~r/Codeulate/~3/wTyHpAo1uDk/</link>
		<comments>http://codeulate.com/2012/07/depend-upon-abstractions/#comments</comments>
		<pubDate>Mon, 02 Jul 2012 23:25:04 +0000</pubDate>
		<dc:creator>Ben Orenstein</dc:creator>
				<category><![CDATA[coding]]></category>

		<guid isPermaLink="false">http://codeulate.com/?p=430</guid>
		<description><![CDATA[One nice piece of advice for designing flexible programs is depend upon abstractions, not implementations. This is the idea behind the extract class refactoring. You package up some set of data and functionality, and only allow clients to interact with it through a public API. The class&#8217;s internal workings are intentionally hidden. This tends to [...]]]></description>
				<content:encoded><![CDATA[<p>One nice piece of advice for designing flexible programs is <strong>depend upon abstractions, not implementations</strong>.</p>
<p>This is the idea behind the <a href="http://www.refactoring.com/catalog/extractClass.html">extract class refactoring</a>. You package up some set of data and functionality, and only allow clients to interact with it through a public API. The class&#8217;s internal workings are intentionally hidden.</p>
<p>This tends to lead to flexible designs because implementation details can be changed without affecting any of the calling code. Changes are kept to just one file, which makes them easier, and ease of change is the best test for good design.</p>
<p>Most programmers are at least somewhat familiar with this idea. However, it&#8217;s easy to forget it when you start working with outside libraries or services.</p>
<p>Here&#8217;s a paraphrased example from a Rails app I reviewed recently. This app uses the braintree gem to charge users, create subscriptions, and refund money.</p>
<div class="codecolorer-container ruby vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:500px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#008000; font-style:italic;"># Gemfile</span><br />
gem <span style="color:#996600;">'braintree'</span></div></div>
<div class="codecolorer-container ruby vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:500px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#008000; font-style:italic;"># app/models/user.rb</span><br />
<span style="color:#9966CC; font-weight:bold;">class</span> User<br />
&nbsp; SUBSCRIPTION_AMOUNT = <span style="color:#006666;">10</span>.<span style="color:#9900CC;">to_money</span><br />
<br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">def</span> charge_for_subscription<br />
&nbsp; &nbsp; Braintree.<span style="color:#9900CC;">charge</span><span style="color:#006600; font-weight:bold;">&#40;</span>SUBSCRIPTION_AMOUNT<span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
<br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">def</span> create_as_customer<br />
&nbsp; &nbsp; Braintree.<span style="color:#9900CC;">create_customer</span><span style="color:#006600; font-weight:bold;">&#40;</span>user.<span style="color:#9900CC;">name</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></div>
<div class="codecolorer-container ruby vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:500px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#008000; font-style:italic;"># app/models/refund.rb</span><br />
<span style="color:#9966CC; font-weight:bold;">class</span> Refund<br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">def</span> process!<br />
&nbsp; &nbsp; Braintree.<span style="color:#9900CC;">refund</span><span style="color:#006600; font-weight:bold;">&#40;</span>order.<span style="color:#9900CC;">amount</span>, user.<span style="color:#9900CC;">braintree_id</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></div>
<p>Just because we&#8217;re calling methods in another class does not mean we&#8217;re programming against an abstraction. It&#8217;s certainly better than making raw HTTP calls to Braintree, but our choice of vendor and gem used are implementation details that have leaked into our business logic. </p>
<p>With calls to Braintree littered throughout, switching to another vendor will require the editing and re-testing of many files. We&#8217;ve fallen short of the ideal we described above, where one change requires edits only in one place.</p>
<p>Fortunately, the fix is quite easy: a simple wrapper.</p>
<div class="codecolorer-container ruby vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:500px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#008000; font-style:italic;"># app/models/user.rb</span><br />
<span style="color:#9966CC; font-weight:bold;">class</span> User<br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">def</span> charge_for_subscription<br />
&nbsp; &nbsp; PaymentGateway.<span style="color:#9900CC;">charge_for_subscription</span><br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
<br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">def</span> create_as_customer<br />
&nbsp; &nbsp; PaymentGateway.<span style="color:#9900CC;">create_customer</span><span style="color:#006600; font-weight:bold;">&#40;</span>user.<span style="color:#9900CC;">name</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></div>
<div class="codecolorer-container ruby vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:500px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#008000; font-style:italic;"># app/models/refund.rb</span><br />
<span style="color:#9966CC; font-weight:bold;">class</span> Refund<br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">def</span> process!<br />
&nbsp; &nbsp; PaymentGateway.<span style="color:#9900CC;">refund</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF; font-weight:bold;">self</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></div>
<div class="codecolorer-container ruby vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:500px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#008000; font-style:italic;"># New file: lib/payment_gateway.rb</span><br />
<span style="color:#9966CC; font-weight:bold;">class</span> PaymentGateway<br />
<br />
&nbsp; SUBSCRIPTION_AMOUNT = <span style="color:#006666;">10</span>.<span style="color:#9900CC;">to_money</span><br />
<br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">def</span> charge_for_subscription<br />
&nbsp; &nbsp; Braintree.<span style="color:#9900CC;">charge</span><span style="color:#006600; font-weight:bold;">&#40;</span>SUBSCRIPTION_AMOUNT<span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
<br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">def</span> create_customer<span style="color:#006600; font-weight:bold;">&#40;</span>customer_name<span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; &nbsp; Braintree.<span style="color:#9900CC;">create_customer</span><span style="color:#006600; font-weight:bold;">&#40;</span>customer_name<span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
<br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">def</span> refund<span style="color:#006600; font-weight:bold;">&#40;</span>refund<span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; &nbsp; Braintree.<span style="color:#9900CC;">refund</span><span style="color:#006600; font-weight:bold;">&#40;</span>refund.<span style="color:#9900CC;">order_amount</span>, refund.<span style="color:#9900CC;">user_braintree_id</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></div>
<p>Another good name for the new class would be PaymentGatewayAdapter, as it&#8217;s an example of <a href="http://en.wikipedia.org/wiki/Adapter_pattern">the adapter pattern</a>.</p>
<p>This code is only subtley different, but yields significant benefits:</p>
<ol>
<li>Switching from Braintree to another vendor now requires edits to only one file. If this change is somewhat likely, this benefit alone probably justifies the refactoring.</li>
<li>If Braintree changes its public API, we again have only one class to edit.</li>
<li>Testing has become easier. PaymentGateway gives us what some people call &#8216;seams&#8217;: a place where components join together where we can easily stub behavior. Before, unit tests required stubbing Braintree&#8217;s code. Upgrading the gem could potentially break many tests. Now, we can stub our own methods, which is safer.</li>
<li>We can use method names that better match our problem domain. A small win, but a pleasant one.</li>
<li>We can change the parameters that PaymentGateway&#8217;s methods expect, such as we did in PaymentGateway#refund.</li>
<li>We have a better home for constants like SUBSCRIPTION_AMOUNT and similar data.</li>
</ol>
<p>The only downside I can think of for this code is that it adds a bit of indirection. You&#8217;ll have to jump through one additional file to found out how customer charging is implemented. However, the wrapper is very thin, so I don&#8217;t think this cost is large.</p>
<p>It&#8217;s easy to accidentally find yourself depending on implementation details. External libraries and services are frequently sources of this, and warrant extra suspicion. Implementations that have a decent likelikhood of change should always be wrapped in sanitary fashion.</p>
<img src="http://feeds.feedburner.com/~r/Codeulate/~4/wTyHpAo1uDk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://codeulate.com/2012/07/depend-upon-abstractions/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://codeulate.com/2012/07/depend-upon-abstractions/</feedburner:origLink></item>
		<item>
		<title>Close Your Fucking Laptop</title>
		<link>http://feedproxy.google.com/~r/Codeulate/~3/IfIjs8VvsJw/</link>
		<comments>http://codeulate.com/2012/06/close-your-fucking-laptop/#comments</comments>
		<pubDate>Sat, 30 Jun 2012 14:29:52 +0000</pubDate>
		<dc:creator>Ben Orenstein</dc:creator>
				<category><![CDATA[general]]></category>

		<guid isPermaLink="false">http://codeulate.com/?p=427</guid>
		<description><![CDATA[Dear conference attendees everywhere, If you&#8217;ve decided to attend a conference talk, here&#8217;s a piece of etiquette that seems to have been left out of programmer finishing school: when the speaker approaches the podium, you have an important job: close your fucking laptop and listen. I can&#8217;t count the number of times I&#8217;ve seen people [...]]]></description>
				<content:encoded><![CDATA[<p>Dear conference attendees everywhere,</p>
<p>If you&#8217;ve decided to attend a conference talk, here&#8217;s a piece of etiquette that seems to have been left out of programmer finishing school: when the speaker approaches the podium, you have an important job: close your fucking laptop and listen.</p>
<p>I can&#8217;t count the number of times I&#8217;ve seen people writing code during a talk. Writing code! You are not a badass multi-tasking motherfucker. You are a rude, not-paying-attention, asshole. You are disrespecting the speaker&#8217;s effort and distracting those around you. If you&#8217;re just looking for a place to get work done, go sit outside, or even in your hotel room.</p>
<p>The exception to this rule is when you find yourself stuck in terrible talks. I always, always close my laptop when a speaker begins. I give them my full attention and hope to be entertained and informed. Unfortunately, most speakers quickly reveal that they are not prepared to do either. Their talk is obviously underprepared or presented without energy and passion.</p>
<p>In these cases, I unabashedly open my laptop and turn my attention to something more useful. An underprepared speaker disrespects his audience, and looking out on a sea of glowing white apples is his just reward.</p>
<p><em>UPDATE</em>: The wiser voices of commenters below have swayed me. Being rude in response to rudeness is still wrong. In the future, I&#8217;ll vote with my feet and simply leave bad talks.</p>
<img src="http://feeds.feedburner.com/~r/Codeulate/~4/IfIjs8VvsJw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://codeulate.com/2012/06/close-your-fucking-laptop/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		<feedburner:origLink>http://codeulate.com/2012/06/close-your-fucking-laptop/</feedburner:origLink></item>
		<item>
		<title>Just closed more funding? My condolences.</title>
		<link>http://feedproxy.google.com/~r/Codeulate/~3/PG-JsQdMxUo/</link>
		<comments>http://codeulate.com/2011/10/my-condolences/#comments</comments>
		<pubDate>Mon, 03 Oct 2011 04:12:10 +0000</pubDate>
		<dc:creator>Ben Orenstein</dc:creator>
				<category><![CDATA[general]]></category>

		<guid isPermaLink="false">http://codeulate.com/?p=393</guid>
		<description><![CDATA[When a popular company announces a new round of funding, the Hacker News comment threads are usually overwhelmingly congratulatory. This attitude is horribly misguided. In my eyes, announcing post-seed funding is a BAD thing, and should be close to a PR disaster. The HN threads should be full of condolences. Here&#8217;s why. The company hasn&#8217;t [...]]]></description>
				<content:encoded><![CDATA[<p>When a popular company announces a new round of funding, the Hacker News comment threads are usually overwhelmingly congratulatory. This attitude is horribly misguided. In my eyes, announcing post-seed funding is a BAD thing, and should be close to a PR disaster. The HN threads should be full of condolences. Here&#8217;s why.</p>
<h2>The company hasn&#8217;t figured out how to pay its bills</h2>
<p>At the end of the day, a company exists to make money. Every round of funding (past, maybe, a seed round) is an admission that you still haven&#8217;t figured out a business model that will keep the damn lights on. Every startup should want each round of funding to be its last.</p>
<h2>The founders have ceded control</h2>
<p>Companies in very strong positions are sometimes able to take funding without losing much control of the company, but this is rare. In general, founders are turning over substantial control to professional gamblers with horrible succes rates. A VC will never love your company like you do; he&#8217;s there only to get paid. This will forever taint your relationship.</p>
<h2>Part of the company was sold prematurely</h2>
<p>People seem to forget that &#8220;getting funded&#8221; really means &#8220;selling part of the store&#8221;. If you think your company is going to be worth more in the future, why are you selling part of it now?</p>
<p>Here&#8217;s an announcement I&#8217;d love to congratulate: <em>&#8220;we&#8217;ve recently reached profitability and know we can keep the lights on. We think we can make even more money in the future, so we&#8217;re going to hang on to as much precious equity as we can. Offers for outside funding are flattering but unnecessary.&#8221;</em></p>
<img src="http://feeds.feedburner.com/~r/Codeulate/~4/PG-JsQdMxUo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://codeulate.com/2011/10/my-condolences/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://codeulate.com/2011/10/my-condolences/</feedburner:origLink></item>
		<item>
		<title>Don’t get blocked</title>
		<link>http://feedproxy.google.com/~r/Codeulate/~3/JCA8v42gi2w/</link>
		<comments>http://codeulate.com/2011/09/dont-get-blocked/#comments</comments>
		<pubDate>Tue, 27 Sep 2011 03:35:19 +0000</pubDate>
		<dc:creator>Ben Orenstein</dc:creator>
				<category><![CDATA[coding]]></category>

		<guid isPermaLink="false">http://codeulate.com/?p=390</guid>
		<description><![CDATA[Every day at our stand-up, each person shares what they did the day before, what they plan to do today, and, critically, whether or not they&#8217;re blocked. Blocked is a crappy place to be. It means you&#8217;re trying to get something done but can&#8217;t. Current velocity: zero. I&#8217;ve noticed something about programmers I admire: they&#8217;re [...]]]></description>
				<content:encoded><![CDATA[<p>Every day at our stand-up, each person shares what they did the day before, what they plan to do today, and, critically, whether or not they&#8217;re blocked.</p>
<p>Blocked is a crappy place to be. It means you&#8217;re trying to get something done but can&#8217;t. Current velocity: zero.</p>
<p>I&#8217;ve noticed something about programmers I admire: they&#8217;re extremely good at not getting blocked. </p>
<p>Some time ago I spent three days trying to get a feature working. I was blocked, and bad. Finally, I took a break and went to work on something else. The next day at standup, a colleague mentioned implementing that same feature, and then then going on to do two more tasks with the other half of his day. Incredulous, I asked him how he solved the problem I&#8217;d run into. He happily admitted he hadn&#8217;t. He&#8217;d run into that problem, spent a half hour on it, and then changed direction.</p>
<p>Me: got blocked, pounded on the barrier. Great programmer: got blocked, tried something else that worked and moved on.</p>
<p>Like most programmers, I have an strong desire to solve problems. Put some broken code in front of me and I&#8217;ll wrestle with it &#8217;til it works. There&#8217;s lots to do but I&#8217;ve got to start by fixing this problem.</p>
<p>The best programmers I know have a different mantra: don&#8217;t get blocked. They&#8217;re focused on moving things forward, not getting bogged down making everything perfect. They&#8217;ll duck and weave, leaping over obstacles or tunneling beneath them. They like problems too, but they like something else even more: shipping.</p>
<p>Don&#8217;t get blocked.</p>
<img src="http://feeds.feedburner.com/~r/Codeulate/~4/JCA8v42gi2w" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://codeulate.com/2011/09/dont-get-blocked/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		<feedburner:origLink>http://codeulate.com/2011/09/dont-get-blocked/</feedburner:origLink></item>
		<item>
		<title>Programmer Resumes are Deprecated</title>
		<link>http://feedproxy.google.com/~r/Codeulate/~3/J1klpoAlhFg/</link>
		<comments>http://codeulate.com/2011/06/programmer-resumes-are-deprecated/#comments</comments>
		<pubDate>Tue, 14 Jun 2011 05:24:22 +0000</pubDate>
		<dc:creator>Ben Orenstein</dc:creator>
				<category><![CDATA[coding]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://codeulate.com/?p=377</guid>
		<description><![CDATA[First, some exciting news: after a thorough (but enjoyable!) interview process, I&#8217;ve accepted a position at thoughtbot in Boston and will begin in a few weeks. I can&#8217;t wait to get started. The interviews themselves will make great fodder for future posts, but I realized a startling fact the other day: I never once sent [...]]]></description>
				<content:encoded><![CDATA[<p>First, some exciting news: after a thorough (but enjoyable!) interview process, I&#8217;ve accepted a position at <a href="http://www.thoughtbot.com">thoughtbot</a> in Boston and will begin in a few weeks. I can&#8217;t wait to get started.</p>
<p>The interviews themselves will make great fodder for future posts, but I realized a startling fact the other day: I never once sent anyone at thoughtbot a resume.</p>
<p>Moreover, I was never asked about schools, degrees, nor much about my past experience. My &#8220;resume&#8221; took the form of links to this blog, some open source contributions, and access to a couple private github repos of Rails apps I&#8217;d built. </p>
<p>This experience confirms an idea that I&#8217;m glad to see gaining ground lately: resumes are deprecated. Code is king. Oh, and connections help a lot too.</p>
<p>A year ago I wrote that it was possible to <a href="http://codeulate.com/2010/06/land-a-rails-job-with-no-experience/">land a Rails job with no experience</a>, provided you had a portfolio application, some code on Github, and attended Ruby meetups to network. Some people were skeptical, but it was exactly those things that got me my first Rails job. Now, years later, the same set of things got me in the door at thoughtbot: code, more code, and the recommendation of thoughtbotter <a href="http://dancroak.com/">Dan Croak</a>, who I got to know during the &#8217;09 Rails Rumble (yet more coding!)</p>
<p>I&#8217;m starting to think this really is the secret sauce for professional programming success, regardless of experience level. Get some code out there for people to see, and get yourself out there to meet awesome programmers you might want to work with someday. Leave the bullshitty bullet points to the MBAs.</p>
<img src="http://feeds.feedburner.com/~r/Codeulate/~4/J1klpoAlhFg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://codeulate.com/2011/06/programmer-resumes-are-deprecated/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		<feedburner:origLink>http://codeulate.com/2011/06/programmer-resumes-are-deprecated/</feedburner:origLink></item>
		<item>
		<title>Let’s read some Rails code: with_options</title>
		<link>http://feedproxy.google.com/~r/Codeulate/~3/Rmta8S4fpNs/</link>
		<comments>http://codeulate.com/2011/06/dry-up-your-rails-code-with_options/#comments</comments>
		<pubDate>Sun, 05 Jun 2011 07:35:41 +0000</pubDate>
		<dc:creator>Ben Orenstein</dc:creator>
				<category><![CDATA[general]]></category>

		<guid isPermaLink="false">http://codeulate.com/?p=358</guid>
		<description><![CDATA[Did you know you can refactor this: # Duplicated :dependent =&#62; :destroy option. class Account &#60; ActiveRecord::Base &#160; has_many :customers, :dependent =&#62; :destroy &#160; has_many :products, &#160;:dependent =&#62; :destroy &#160; has_many :invoices, &#160;:dependent =&#62; :destroy &#160; has_many :expenses, &#160;:dependent =&#62; :destroy end into this? # Nice and DRY! class Account &#60; ActiveRecord::Base &#160; with_options :dependent [...]]]></description>
				<content:encoded><![CDATA[<p>Did you know you can refactor this:</p>
<div class="codecolorer-container ruby vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:500px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#008000; font-style:italic;"># Duplicated :dependent =&gt; :destroy option.</span><br />
<span style="color:#9966CC; font-weight:bold;">class</span> Account <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span><br />
&nbsp; has_many <span style="color:#ff3333; font-weight:bold;">:customers</span>, <span style="color:#ff3333; font-weight:bold;">:dependent</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:destroy</span><br />
&nbsp; has_many <span style="color:#ff3333; font-weight:bold;">:products</span>, &nbsp;<span style="color:#ff3333; font-weight:bold;">:dependent</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:destroy</span><br />
&nbsp; has_many <span style="color:#ff3333; font-weight:bold;">:invoices</span>, &nbsp;<span style="color:#ff3333; font-weight:bold;">:dependent</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:destroy</span><br />
&nbsp; has_many <span style="color:#ff3333; font-weight:bold;">:expenses</span>, &nbsp;<span style="color:#ff3333; font-weight:bold;">:dependent</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:destroy</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></div>
<p>into this?</p>
<div class="codecolorer-container ruby vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:500px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#008000; font-style:italic;"># Nice and DRY!</span><br />
<span style="color:#9966CC; font-weight:bold;">class</span> Account <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span><br />
&nbsp; with_options <span style="color:#ff3333; font-weight:bold;">:dependent</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:destroy</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>assoc<span style="color:#006600; font-weight:bold;">|</span><br />
&nbsp; &nbsp; assoc.<span style="color:#9900CC;">has_many</span> <span style="color:#ff3333; font-weight:bold;">:customers</span><br />
&nbsp; &nbsp; assoc.<span style="color:#9900CC;">has_many</span> <span style="color:#ff3333; font-weight:bold;">:products</span><br />
&nbsp; &nbsp; assoc.<span style="color:#9900CC;">has_many</span> <span style="color:#ff3333; font-weight:bold;">:invoices</span><br />
&nbsp; &nbsp; assoc.<span style="color:#9900CC;">has_many</span> <span style="color:#ff3333; font-weight:bold;">:expenses</span><br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></div>
<p>The with_options method is a really cool chunk of code that lets you DRY up duplication that sometimes appear when passing the same options to a series of methods.</p>
<p>But the point of this post is <strong>how it works behind the scenes</strong>, so check out this 11-minute code walkthrough:</p>
<p><iframe width="640" height="375" src="http://www.youtube.com/embed/OBOl9fFuILk?hd=1"  allowfullscreen></iframe></p>
<p>By the way, this is an excerpt of a longer screencast I&#8217;m working on about ActiveSupport internals. If you&#8217;d like to be notified when the full screencast is released, <a href="http://codeulatescreencasts.wufoo.com/forms/want-an-email-when-the-screencast-is-released/">drop your email in this form</a>. (One email, ever.)</p>
<p>You can also <a href="http://www.codeulatescreencasts.com">check out the other Rails-related screencasts I&#8217;ve already done</a>.</p>
<img src="http://feeds.feedburner.com/~r/Codeulate/~4/Rmta8S4fpNs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://codeulate.com/2011/06/dry-up-your-rails-code-with_options/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://codeulate.com/2011/06/dry-up-your-rails-code-with_options/</feedburner:origLink></item>
		<item>
		<title>Video: write code faster — expert-level vim</title>
		<link>http://feedproxy.google.com/~r/Codeulate/~3/K_cgxC2zcmA/</link>
		<comments>http://codeulate.com/2011/05/video-write-code-faster-expert-level-vim/#comments</comments>
		<pubDate>Mon, 30 May 2011 23:40:12 +0000</pubDate>
		<dc:creator>Ben Orenstein</dc:creator>
				<category><![CDATA[general]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[vim]]></category>

		<guid isPermaLink="false">http://codeulate.com/?p=355</guid>
		<description><![CDATA[In May of 2010 I gave a one-hour talk to the Boston Ruby Group titled &#8216;Write Code Faster: Expert-level Vim&#8217;. I&#8217;d volunteered to give it as a test-run before delivering the same talk at RailsConf a month later. Little did I know, someone recorded the Boston.rb talk and it recently surfaced on the presentations page. [...]]]></description>
				<content:encoded><![CDATA[<p>In May of 2010 I gave a one-hour talk to the Boston Ruby Group titled &#8216;Write Code Faster: Expert-level Vim&#8217;.</p>
<p>I&#8217;d volunteered to give it as a test-run before delivering the same talk at RailsConf a month later.</p>
<p>Little did I know, someone recorded the Boston.rb talk and it recently surfaced on <a href="http://bostonrb.org/presentations">the presentations page</a>.</p>
<p>If the title sounds interesting, <a href="http://bostonrb.org/presentations/25">go watch the talk!</a></p>
<img src="http://feeds.feedburner.com/~r/Codeulate/~4/K_cgxC2zcmA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://codeulate.com/2011/05/video-write-code-faster-expert-level-vim/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://codeulate.com/2011/05/video-write-code-faster-expert-level-vim/</feedburner:origLink></item>
		<item>
		<title>Let’s read some Rails code: OrderedOptions</title>
		<link>http://feedproxy.google.com/~r/Codeulate/~3/Sl22Ae-diIw/</link>
		<comments>http://codeulate.com/2011/05/lets-read-some-rails-code-orderedoptions/#comments</comments>
		<pubDate>Sat, 28 May 2011 23:55:12 +0000</pubDate>
		<dc:creator>Ben Orenstein</dc:creator>
				<category><![CDATA[general]]></category>

		<guid isPermaLink="false">http://codeulate.com/?p=345</guid>
		<description><![CDATA[Curious about Rails&#8217; internals? In the screencast below, I take you on a 5-minute tour of the OrderedOptions and InheritedOptions classes in ActiveSupport. Check it out for a code-level tour of an interesting bit of Rails. By the way, this is an excerpt of a longer screencast I&#8217;m creating of guided tour through the best [...]]]></description>
				<content:encoded><![CDATA[<p>Curious about Rails&#8217; internals? In the screencast below, I take you on a 5-minute tour of the OrderedOptions and InheritedOptions classes in ActiveSupport. Check it out for a code-level tour of an interesting bit of Rails.</p>
<p>By the way, this is an excerpt of a longer screencast I&#8217;m creating of guided tour through the best parts of the Rails source. If you&#8217;d like to be notified when the full screencast is released, <a href="http://codeulatescreencasts.wufoo.com/forms/want-an-email-when-the-screencast-is-released/">drop your email in this form</a>. (One email, ever.)</p>
<p><iframe width="640" height="349" src="http://www.youtube.com/embed/PVkJR2wBEBM" frameborder="0" allowfullscreen></iframe></p>
<p>UPDATE: Youtube&#8217;s compression isn&#8217;t looking so hot, so if you prefer, you can <a href="http://downloads.codeulatescreencasts.com/ordered_options.mov">download the high quality version here</a>. (43MB)</p>
<img src="http://feeds.feedburner.com/~r/Codeulate/~4/Sl22Ae-diIw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://codeulate.com/2011/05/lets-read-some-rails-code-orderedoptions/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
<enclosure url="http://downloads.codeulatescreencasts.com/ordered_options.mov" length="45555357" type="video/quicktime" />
		<feedburner:origLink>http://codeulate.com/2011/05/lets-read-some-rails-code-orderedoptions/</feedburner:origLink></item>
	</channel>
</rss>
