<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Enjoy, you're doing it wrong!</title>
	<atom:link href="http://enjoydoingitwrong.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://enjoydoingitwrong.wordpress.com</link>
	<description>Rants of an anymous coder.</description>
	<lastBuildDate>Mon, 14 Dec 2009 06:32:57 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='enjoydoingitwrong.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Enjoy, you're doing it wrong!</title>
		<link>http://enjoydoingitwrong.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://enjoydoingitwrong.wordpress.com/osd.xml" title="Enjoy, you&#039;re doing it wrong!" />
	<atom:link rel='hub' href='http://enjoydoingitwrong.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Joel? Doing it wrong?</title>
		<link>http://enjoydoingitwrong.wordpress.com/2009/12/14/joel-doing-it-wrong/</link>
		<comments>http://enjoydoingitwrong.wordpress.com/2009/12/14/joel-doing-it-wrong/#comments</comments>
		<pubDate>Mon, 14 Dec 2009 06:31:12 +0000</pubDate>
		<dc:creator>enjoydoingitwrong</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://enjoydoingitwrong.wordpress.com/?p=150</guid>
		<description><![CDATA[There has been quite a lot a noise around Joel Spolsky these days. Joel is the author behind the much respected Joel On Software technical blog, and the co-founder of the now famous Stack Overflow. The target of the recent critics (&#8220;Splosky has balls of steel and a brain of feathers&#8220;, &#8220;Joel Inc., Stackoverflow Careers [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=enjoydoingitwrong.wordpress.com&amp;blog=7003335&amp;post=150&amp;subd=enjoydoingitwrong&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>There has been quite a lot a noise around Joel Spolsky these days. Joel is the author behind the much respected <a href="http://www.joelonsoftware.com/">Joel On Software</a> technical blog, and the co-founder of the now famous <a href="http://stackoverflow.com/">Stack Overflow</a>.</p>
<p>The target of the recent critics (<a href="http://gilesbowkett.blogspot.com/2009/12/blogs-are-godless-communist-bullshit.html">&#8220;<em>Splosky has balls of steel and a brain of feathers</em>&#8220;</a>, <a href="http://www.cforcoding.com/2009/12/joel-inc-stackoverflow-careers-and.html">&#8220;<em>Joel Inc., Stackoverflow Careers and Jumping Sharks</em>&#8220;</a>) is mainly his new website, <a href="http://careers.stackoverflow.com/">Careers Stack Overflow</a>: &#8220;<em>Stack Overflow Careers might be a bridge too far</em>, writes William Shields.</p>
<p>Well. As a reader of Joel, and as a fairly successful user of Stack Overflow, I was not really paying attention to the rants. For sure, I disagree with the concept of <em>Careers</em>, and I dislike the way Joel uses his blog to communicate about the site. But I was thinking &#8220;<em>heck, everyone has to make money!</em>&#8220;.</p>
<p>But his <a href="http://www.joelonsoftware.com/items/2009/12/13.html">last blog entry</a> went too far.</p>
<h2>The claim</h2>
<p>Joel shows an interesting histogram, the ratio of Stack Overflow users that have submitted a CV to Careers, in relation to their Stack Overflow reputation:</p>
<p><img src="http://enjoydoingitwrong.files.wordpress.com/2009/12/stackoverflow.png?w=300&#038;h=264" alt="Histogram retrieved from Joel's blog" title="stackoverflow" class="aligncenter size-medium wp-image-157" width="300" height="264"></p>
<p>And Joel comments:</p>
<blockquote><p>The higher someone’s Stack Overflow reputation, the more likely they are to have submitted a CV to Stack Overflow Careers. [...] it somewhat confirms the claim we’re making to employers, which is that <strong>when you search for CVs on Stack Overflow, you are looking at some pretty gosh darn good programmers.</strong> </p></blockquote>
<p><em>Really</em>? Joel, how honest are you with your readers here? </p>
<h2>Debugging that statement</h2>
<p>First, there is the somewhat questionable assertion that users with high reputation on Stack Overflow are &#8220;darn good programmers&#8221;. While this might be true for users with 15K+ reputation, I am not sure the rule still stands for others. And of course, I am not sure I would like to hire someone spending an important part of his work time answering over and over the same questions instead of doing what I&#8217;m paying him for. But let&#8217;s be fair here: why not. For the sake of discussion, we&#8217;ll assume that the higher one&#8217;s Stack Overflow reputation is, the more skilled he is, <em>and</em> the more interesting he is to Joel&#8217;s corporate clients.</p>
<p>Then. &#8220;<em>The higher someone’s Stack Overflow reputation, the more likely they are to have submitted a CV to Stack Overflow Careers.</em>&#8220;. This part is correct, according to Joel&#8217;s stats, and I won&#8217;t question it.</p>
<p>But the conclusion, &#8220;<em>when you search for CVs on Stack Overflow, you are looking at some pretty gosh darn good programmers</em>&#8221; as he puts it, is <strong>somewhat <em>dishonest</em></strong>.</p>
<h2>The relevant statistic</h2>
<p>We want to know how good are the programmers on Careers. Or, how high is really the Stack Overflow reputation of Careers users. Well, let&#8217;s find this!</p>
<p>It is easy to categorize Stack Overflow users by reputation, using the <a href="http://stackoverflow.com/users">/users page</a>, a simple binary search, a pen and a paper. You can approximate Joel&#8217;s stats from his graph. Take your favorite <a href="http://python.org/">language</a>, a <a href="http://home.gna.org/pychart/">plotting library</a>, and <a href="http://snipplr.com/view/24738/analyzing-joel-stats/">here is the code!</a></p>
<p>After some Inkscape prettyfication:</p>
<p><img src="http://enjoydoingitwrong.files.wordpress.com/2009/12/joel.png?w=420&#038;h=296" alt="Repartition of Stack Overflow reputation of careers users" title="careers_repartition" class="aligncenter size-full wp-image-151" width="420" height="296"></p>
<p>Of course this histogram only takes into account Careers users that are Stack Overflow users.</p>
<p>But it looks like when I look at a random CV, I have 40% of chances of stumbling on an user that has 1k to 2k reputation. No offense to you if you have this much rep&#8217; on Stack Overflow, but it is quite meaningless when it comes to recruiting you.</p>
<p>So, pretty gosh darn good programmers? <em>Certainly</em> </p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/enjoydoingitwrong.wordpress.com/150/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/enjoydoingitwrong.wordpress.com/150/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/enjoydoingitwrong.wordpress.com/150/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/enjoydoingitwrong.wordpress.com/150/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/enjoydoingitwrong.wordpress.com/150/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/enjoydoingitwrong.wordpress.com/150/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/enjoydoingitwrong.wordpress.com/150/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/enjoydoingitwrong.wordpress.com/150/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/enjoydoingitwrong.wordpress.com/150/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/enjoydoingitwrong.wordpress.com/150/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/enjoydoingitwrong.wordpress.com/150/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/enjoydoingitwrong.wordpress.com/150/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/enjoydoingitwrong.wordpress.com/150/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/enjoydoingitwrong.wordpress.com/150/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=enjoydoingitwrong.wordpress.com&amp;blog=7003335&amp;post=150&amp;subd=enjoydoingitwrong&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://enjoydoingitwrong.wordpress.com/2009/12/14/joel-doing-it-wrong/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">enjoydoingitwrong</media:title>
		</media:content>

		<media:content url="http://enjoydoingitwrong.files.wordpress.com/2009/12/stackoverflow.png?w=300" medium="image">
			<media:title type="html">stackoverflow</media:title>
		</media:content>

		<media:content url="http://enjoydoingitwrong.files.wordpress.com/2009/12/joel.png" medium="image">
			<media:title type="html">careers_repartition</media:title>
		</media:content>
	</item>
		<item>
		<title>Repeat after me: Unicode is not UTF-\d{1,2}</title>
		<link>http://enjoydoingitwrong.wordpress.com/2009/06/22/unicode-is-not-utf/</link>
		<comments>http://enjoydoingitwrong.wordpress.com/2009/06/22/unicode-is-not-utf/#comments</comments>
		<pubDate>Mon, 22 Jun 2009 05:23:20 +0000</pubDate>
		<dc:creator>enjoydoingitwrong</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://enjoydoingitwrong.wordpress.com/?p=65</guid>
		<description><![CDATA[Stop. Unicode is not UTF-16, Unicode is not UTF-32, and Unicode is not UTF-8. Stop it. This is just plainly wrong. Unicode is a standard, and UTF-(8&#124;16&#124;32) are character encodings that support encoding Unicode data into byte strings. UTF-16 is capable of encoding the whole Unicode repertoire, but UTF-16 is not Unicode, and Unicode is [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=enjoydoingitwrong.wordpress.com&amp;blog=7003335&amp;post=65&amp;subd=enjoydoingitwrong&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Stop. Unicode is not UTF-16, Unicode is not UTF-32, and Unicode is not UTF-8. Stop it.</p>
<p>This is just plainly wrong. Unicode is a standard, and UTF-(8|16|32) are character encodings that support encoding Unicode data into byte strings. UTF-16 is capable of encoding the whole Unicode repertoire, but UTF-16 is not Unicode, and Unicode is not UTF-16.</p>
<p>And no, it&#8217;s not <em>almost the same</em>. It&#8217;s nowhere to be close. Think about it, you take some beginners, and introduce them to programming. After a while they get the pleasure to be introduced to &#8220;Ãœ&#8221; &#8220;Ã¶&#8221; &#8220;?&#8221; and their friends, and it&#8217;s time for them to learn about the huge Unicode monster. You point them to a <a href="http://www.joelonsoftware.com/articles/Unicode.html">great article</a>, wait a bit, and head for a little Q&amp;A session.</p>
<p>Inevitably, you will get strange formulations such as &#8220;I see, I will encode everything to Unicode&#8221;, or &#8220;but how can I tell if this string is Unicode-encoded?&#8221;, or better &#8220;all this time I&#8217;ve been using UTF-8 without knowing that it was in fact Unicode magic?&#8221;. Well, If you think that these approximate formulations are fine, and that you should not correct your beginner programmer, you&#8217;re just doing it wrong.</p>
<p>A byte string cannot be Unicode-encoded. It cannot. You either work with encoded byte strings, or with unicode data (a sequence of code-points). But you can&#8217;t &#8220;Unicode-encode&#8221;, it&#8217;s non-sense.<br />
Similarly you cannot encode a string to Unicode. You cannot. You decode a byte string from a source character set to Unicode data: code-point sequences.</p>
<p>Repeat after me:</p>
<ul>
<li>when transforming data from Unicode to a specific character set, you are <strong>encoding</strong> Unicode codepoints into bytes, according to a specific character encoding that suits your target character set.</li>
<li>when transforming from (byte) strings to Unicode, you are <strong>decoding</strong> your data: if you fail to provide the right character encoding to decode from, you will end up with borked Unicode data.</li>
</ul>
<p>It&#8217;s not &#8220;okay&#8221; to let beginners work with approximate knowledge of the Unicode buzzword. They will eventually get confused, and <strong>you</strong> will end up losing time re-explaining over and over the same things. Approximate formulations reflect approximate knowledge, and you should not let that be. Approximate Unicode knowledge is the blocker, the main reason why <a href="http://stackoverflow.com/questions/979222/why-isnt-everything-we-do-in-unicode">everything we do is not (yet) in Unicode</a>.</p>
<p>Because of these kind of approximations, we had broken Unicode support in Python until Python 3.0, where Unicode data and byte strings were deriving from a common class. Because of these kind of approximations, we have hundreds of beginners not understand the difference between UTF-8 and Unicode, and not understanding why <code>string.encode('utf-8')</code> can throw an error: you see, you just said that it was okay to &#8220;Unicode-encode&#8221;, and that UTF-8 is Unicode, so basically they are trying to &#8220;encode&#8221; strings as&#8230; <em>Unicode</em> and the fact that it fails is just puzzling them because Unicode was supposed to be the magical remedy to all their encoding errors.</p>
<p>Because of these approximations, the .NET property <a href="http://msdn.microsoft.com/en-us/library/system.text.encoding.unicode.aspx"><code>Encoding.Unicode</code></a> is the shortcut for what should be <code>Encoding.UTF16</code>. There are <code>Encoding.UTF8</code>, <code>Encoding.UTF32</code>, and <code>Encoding.ASCII</code>, and in the middle of those&#8230; <code>Encoding.Unicode</code>. How can developers write such wrong things? Unicode is not an Encoding, UTF16 is not Unicode. Just look at the wonderful C# construct <code>Encoding  u16LE = Encoding.Unicode;</code> taken directly from the <a href="http://msdn.microsoft.com/en-us/library/system.text.encoding.unicode.aspx">documentation</a>: congratulations, you are assigning an &#8220;Unicode&#8221; value to to an &#8220;Encoding&#8221; type. Crystal clear.</p>
<p>A good image, perhaps, to explain the fundamental type difference between Unicode and, let&#8217;s say, UTF-16, would be to assimilate Unicode as an Interface, and UTF-16 as a concrete class implementing the Unicode interface. </p>
<p>In one hand, Unicode does not define any implementation: it defines no data representation, only an international unequivocal way to associate a character to a code-point. You could store a list of code-points to represent Unicode data, yes, but doing this forces you to store 4 bytes per character because of the large code-point range. This is rather inefficient, and this is why UTF-* appeared. The whole idea is to map Unicode data to byte strings, choosing yourself the mapping function, so that the resulting representation fits your needs. In a way, you have many different strategies implementing the same interface, depending on your focus: </p>
<ul>
<li>UTF-8 focuses on minimizing the byte size for representation of characters from the ASCII set (variable length representation: each character is represented on 1 to 4 bytes, and ASCII characters all fit on 1 byte). As Joel puts it:<br />
<blockquote><p>&#8220;Look at all those zeros!&#8221; they said, since they were Americans and they were looking at English text which rarely used code points above U+00FF. Also they were liberal hippies in California who wanted to conserve (sneer). If they were Texans they wouldn&#8217;t have minded guzzling twice the number of bytes. But those Californian wimps couldn&#8217;t bear the idea of doubling the amount of storage it took for strings</p></blockquote>
</li>
<li>UTF-32 focuses on exhaustiveness and fixed-length representation, using 4 bytes for all characters. It&#8217;s the most straightforward translation, mapping directly the Unicode code-point to 4 bytes. Obviously, it&#8217;s not very size-efficient.</li>
<li>UTF-16 is a compromise, using 2 bytes most of the time, but expanding to 2 * 2 bytes per character to represent certain characters, those <a href="http://en.wikipedia.org/wiki/Basic_Multilingual_Plane#Supplementary_Multilingual_Plane">not included in the Basic Multilingual Plane (BMP)</a>.</li>
</ul>
<p> I&#8217;m not writing that every developer should know about these details, I&#8217;m just writing that you should know about that very basic interface/implementation difference: Unicode is just an intermediate representation, not an actual encoding. I find it awful that .NET is so misleading here. Also, UTF-(8|16|32) are the most famous &#8220;implementations&#8221;, but there are several other standards, such as <a href="http://en.wikipedia.org/wiki/UTF-EBCDIC">UTF-EBCDIC</a></p>
<p>If you&#8217;re an experienced programmer, please do not allow those approximations. If a code &#8220;guru&#8221; writes those sort of shortcuts, how will behaviors ever change about Unicode? Unicode is not black magic, you just have to be precise, and people will understand. Please use the right words. Over-simplifying concepts is not helping. Thanks.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/enjoydoingitwrong.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/enjoydoingitwrong.wordpress.com/65/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/enjoydoingitwrong.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/enjoydoingitwrong.wordpress.com/65/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/enjoydoingitwrong.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/enjoydoingitwrong.wordpress.com/65/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/enjoydoingitwrong.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/enjoydoingitwrong.wordpress.com/65/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/enjoydoingitwrong.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/enjoydoingitwrong.wordpress.com/65/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/enjoydoingitwrong.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/enjoydoingitwrong.wordpress.com/65/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/enjoydoingitwrong.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/enjoydoingitwrong.wordpress.com/65/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=enjoydoingitwrong.wordpress.com&amp;blog=7003335&amp;post=65&amp;subd=enjoydoingitwrong&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://enjoydoingitwrong.wordpress.com/2009/06/22/unicode-is-not-utf/feed/</wfw:commentRss>
		<slash:comments>24</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">enjoydoingitwrong</media:title>
		</media:content>
	</item>
		<item>
		<title>Mixing tabs and spaces in Python</title>
		<link>http://enjoydoingitwrong.wordpress.com/2009/03/24/mixing-tabs-and-spaces-in-python/</link>
		<comments>http://enjoydoingitwrong.wordpress.com/2009/03/24/mixing-tabs-and-spaces-in-python/#comments</comments>
		<pubDate>Tue, 24 Mar 2009 07:00:29 +0000</pubDate>
		<dc:creator>enjoydoingitwrong</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://enjoydoingitwrong.wordpress.com/?p=28</guid>
		<description><![CDATA[You&#8217;re doing it wrong. Actually, even if you generalize the problem to Mixing tabs and spaces in code, you&#8217;re still doing it wrong. When coding a program, a file in a project, something, you should choose an indentation style, n spaces, or a tabs, and stick to it: The issue here is editor-dependent. Suppose that [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=enjoydoingitwrong.wordpress.com&amp;blog=7003335&amp;post=28&amp;subd=enjoydoingitwrong&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>You&#8217;re doing it wrong.</p>
<p>Actually, even if you generalize the problem to <em>Mixing tabs and spaces in code</em>, you&#8217;re still doing it wrong. When coding a program, a file in a project, something, you should choose an indentation style, n spaces, or a tabs, and stick to it:</p>
<p>The issue here is editor-dependent. Suppose that a coder A creates a program where tabs and spaces are mixed. Because A is not doing everything wrong, he tries to have a properly indented code, and indents identically each code line within a same code block. But the way a tabulation looks depends on the text editor of A: if, let&#8217;s say, his editor renders a tab as 4 spaces, then he will insert multiples of 4 spaces a bit everywhere in his code that will be fulfilling the same indenting role as a tabulation.</p>
<p>And here comes coder B, who uses an editor which renders tabs as 8 spaces&#8230; The code will look broken, you get the picture.</p>
<p>But of course in Python where indentation is a language requirement, it&#8217;s even <strong>worse</strong>. The code not only looks broken, odds are that it <strong>is</strong> broken. Better, if you&#8217;re very lucky, the syntax will still be correct, never raising any <code>Indentation Error</code> at any point in the code,<strong> but</strong> your control flow will be silently broken, functions returning too early, breaking out of loops too early, etc&#8230; <em>Stealthy borked code.</em> Sounds nice, right?</p>
<p>And today looking at the last code commits you notice that yet again, while you were sleeping, some contributor inserted tabs in your project that uses a 4-spaces indenting convention. Damn hippie.</p>
<p>Well, it&#8217;s okay, you got up early today, and you&#8217;re feeling smart, as usual. You&#8217;re going to fix this, to teach that dude a lesson. You quickly hack a small bash one liner that will replace tabs by 4 spaces:</p>
<blockquote><p><code>for file in $(grep -Rl [[:cntrl:]] . | grep "\.py$"); do sed -i 's/^\t/    /g' $file; done</code></p></blockquote>
<p>You run it in your project base repertory, hint at the changes &#8212; it works, I&#8217;m too good! &#8212; and commit/push them, and get back to work. Perfect, right?</p>
<p>Well, days later, when tens of commits piled up, people come to you complaining that this and that feature stopped working. You look at the commits, you see nothing wrong. Naturally, you assume that those punks got the command line arguments wrong, and tell them to try again.</p>
<p>But nothing does it. There&#8217;s a pretty major regression. After a few minutes you understand that this is the well known <em>Stealthy code</em> phenomenum, and take a closer look at the indentations fixes you made a few days ago. And of course <strong>you did it wrong</strong>. Assuming that a tab should be replaced by 4 spaces because your project uses a 4-space convention was a completely wrong supposition. PUNK!</p>
<p>And now you&#8217;re stuck doing painful merges to try to include the recent commits while fixing correctly the indentation issues. If you learned your lesson well &#8212; but chances are that you did not &#8212; you might be considering adding a <code>python -tt</code> <em>à la CruiseControl</em> dictatorial test to automatically reject any incoming patch containing tabs.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/enjoydoingitwrong.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/enjoydoingitwrong.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/enjoydoingitwrong.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/enjoydoingitwrong.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/enjoydoingitwrong.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/enjoydoingitwrong.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/enjoydoingitwrong.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/enjoydoingitwrong.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/enjoydoingitwrong.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/enjoydoingitwrong.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/enjoydoingitwrong.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/enjoydoingitwrong.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/enjoydoingitwrong.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/enjoydoingitwrong.wordpress.com/28/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=enjoydoingitwrong.wordpress.com&amp;blog=7003335&amp;post=28&amp;subd=enjoydoingitwrong&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://enjoydoingitwrong.wordpress.com/2009/03/24/mixing-tabs-and-spaces-in-python/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">enjoydoingitwrong</media:title>
		</media:content>
	</item>
		<item>
		<title>Python.h</title>
		<link>http://enjoydoingitwrong.wordpress.com/2009/03/19/pythonh/</link>
		<comments>http://enjoydoingitwrong.wordpress.com/2009/03/19/pythonh/#comments</comments>
		<pubDate>Thu, 19 Mar 2009 06:54:52 +0000</pubDate>
		<dc:creator>enjoydoingitwrong</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://enjoydoingitwrong.wordpress.com/?p=23</guid>
		<description><![CDATA[ProjectXXX/yyy.c:nn:cc: error: Python.h: No such file or directory Don&#8217;t even start. The source you&#8217;re compiling is probably just fine. You&#8217;re doing it wrong. You probably have python installed, but you do miss the development version and its corresponding headers. Look for python-dev or something, but don&#8217;t even think about complaining to ProjectXXX&#8217; devs.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=enjoydoingitwrong.wordpress.com&amp;blog=7003335&amp;post=23&amp;subd=enjoydoingitwrong&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><code>ProjectXXX/yyy.c:nn:cc: error: Python.h: No such file or directory</code></p>
<p>Don&#8217;t even start. The source you&#8217;re compiling is probably just fine. You&#8217;re doing it wrong.</p>
<p>You probably have python installed, but you do miss the development version and its corresponding headers. Look for python-dev or something, but don&#8217;t even think about complaining to ProjectXXX&#8217; devs.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/enjoydoingitwrong.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/enjoydoingitwrong.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/enjoydoingitwrong.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/enjoydoingitwrong.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/enjoydoingitwrong.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/enjoydoingitwrong.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/enjoydoingitwrong.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/enjoydoingitwrong.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/enjoydoingitwrong.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/enjoydoingitwrong.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/enjoydoingitwrong.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/enjoydoingitwrong.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/enjoydoingitwrong.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/enjoydoingitwrong.wordpress.com/23/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=enjoydoingitwrong.wordpress.com&amp;blog=7003335&amp;post=23&amp;subd=enjoydoingitwrong&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://enjoydoingitwrong.wordpress.com/2009/03/19/pythonh/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">enjoydoingitwrong</media:title>
		</media:content>
	</item>
		<item>
		<title>Well, if you&#8217;re reading this&#8230;</title>
		<link>http://enjoydoingitwrong.wordpress.com/2009/03/18/well-if-youre-reading-this/</link>
		<comments>http://enjoydoingitwrong.wordpress.com/2009/03/18/well-if-youre-reading-this/#comments</comments>
		<pubDate>Wed, 18 Mar 2009 07:24:16 +0000</pubDate>
		<dc:creator>enjoydoingitwrong</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://enjoydoingitwrong.wordpress.com/?p=5</guid>
		<description><![CDATA[You&#8217;re probably doing it wrong. Sorry. Header from dommend, cc-by-nc-sa.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=enjoydoingitwrong.wordpress.com&amp;blog=7003335&amp;post=5&amp;subd=enjoydoingitwrong&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>You&#8217;re probably doing it wrong. Sorry.</p>
<p>Header from <a href="http://www.flickr.com/photos/dommend/3147520247/">dommend</a>, cc-by-nc-sa.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/enjoydoingitwrong.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/enjoydoingitwrong.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/enjoydoingitwrong.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/enjoydoingitwrong.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/enjoydoingitwrong.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/enjoydoingitwrong.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/enjoydoingitwrong.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/enjoydoingitwrong.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/enjoydoingitwrong.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/enjoydoingitwrong.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/enjoydoingitwrong.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/enjoydoingitwrong.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/enjoydoingitwrong.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/enjoydoingitwrong.wordpress.com/5/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=enjoydoingitwrong.wordpress.com&amp;blog=7003335&amp;post=5&amp;subd=enjoydoingitwrong&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://enjoydoingitwrong.wordpress.com/2009/03/18/well-if-youre-reading-this/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">enjoydoingitwrong</media:title>
		</media:content>
	</item>
	</channel>
</rss>
