<?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:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0"><channel><title><![CDATA[Coding Horror]]></title><description><![CDATA[programming and human factors]]></description><link>https://blog.codinghorror.com/</link><generator>Ghost 0.11</generator><lastBuildDate>Tue, 18 Jul 2017 22:45:00 GMT</lastBuildDate><ttl>60</ttl><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/codinghorror" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="codinghorror" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">codinghorror</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">https://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="https://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2Fcodinghorror" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2Fcodinghorror" 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 xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.bloglines.com/sub/http://feeds.feedburner.com/codinghorror" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fcodinghorror" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.live.com/?add=http%3A%2F%2Ffeeds.feedburner.com%2Fcodinghorror" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><item><title><![CDATA[Hacker, Hack Thyself]]></title><description><![CDATA[<p>We've read so many sad stories about communities that were fatally compromised or destroyed due to security exploits. We took that lesson to heart when we founded the <a href="https://discourse.org">Discourse</a> project; we endeavor to build open source software that is secure and safe for communities by default, even if there are</p>]]></description><link>https://blog.codinghorror.com/hacker-hack-thyself/</link><guid isPermaLink="false">52f3ff95-3eb8-46b8-a428-de0ba3cf6186</guid><dc:creator><![CDATA[Jeff Atwood]]></dc:creator><pubDate>Fri, 02 Jun 2017 08:11:16 GMT</pubDate><content:encoded><![CDATA[<p>We've read so many sad stories about communities that were fatally compromised or destroyed due to security exploits. We took that lesson to heart when we founded the <a href="https://discourse.org">Discourse</a> project; we endeavor to build open source software that is secure and safe for communities by default, even if there are thousands, or millions, of them out there.</p>

<p>However, we also value <em>portability</em>, the ability to get your data into and out of Discourse at will. This is why Discourse, unlike other forum software, defaults to a Creative Commons license. As a basic user on any Discourse you can easily export and download all your posts right from your user page.</p>

<p><img src="https://blog.codinghorror.com/content/images/2017/06/discourse-download-all.png" alt="Discourse Download All Posts"></p>

<p>As a site owner, you can easily back up and restore your entire site database from the admin panel, right in your web browser. Automated weekly backups are set up for you out of the box, too. I'm not <a href="https://blog.codinghorror.com/international-backup-awareness-day/">the world's foremost expert on backups</a> for nothing, man!</p>

<p><img src="https://blog.codinghorror.com/content/images/2017/06/discourse-backups.png" alt="Discourse database backup download"></p>

<p>Over the years, we've learned that balancing security and data portability can be tricky.  You bet your sweet ASCII a <strong>full database download</strong> is what hackers start working toward the minute they gain any kind of foothold in your system. It's the ultimate prize.</p>

<p>To mitigate this threat, we've slowly tightened restrictions around Discourse backups in various ways:</p>

<ul>
<li><p>Administrators have a minimum password length of 15 characters.</p></li>
<li><p>Both backup creation and backup download administrator actions are formally logged.</p></li>
<li><p>Backup download tokens are single use and emailed to the address of the administrator, to confirm that user has full control over the email address.</p></li>
</ul>

<p>The name of the security game is defense in depth, so all these hardening steps help &hellip; but we still need to <strong>assume that Internet Bad Guys will somehow get a copy of your database</strong>. And then what? Well, what's in the database?</p>

<ul>
<li><p>Identity cookies</p>

<p>Cookies are, of course, how the browser can tell who you are. Cookies are usually stored as hashes, rather than the actual cookie value, so having the hash doesn't let you impersonate the target user. Furthermore, most modern web frameworks rapidly cycle cookies, so they are only valid for a brief 10 to 15 minute window anyway.</p></li>
<li><p>Email addresses</p>

<p>Although users have reason to be concerned about their emails being exposed, very few people treat their email address as anything particularly precious these days.</p></li>
<li><p>All posts and topic content</p>

<p>Let's assume for the sake of argument that this is a fully public site and nobody was posting anything particularly sensitive there. So we're not worried, at least for now, about trade secrets or other privileged information being revealed, since they were all public posts anyway. If we were, that's a whole other blog post I can write at a later date.</p></li>
<li><p>Password hashes</p>

<p>What's left is <strong>the password hashes</strong>. And that's &hellip; <a href="https://blog.codinghorror.com/speed-hashing/">a serious problem indeed</a>.</p></li>
</ul>

<p>Now that the attacker has your database, they can crack your password hashes with <a href="https://blog.codinghorror.com/your-password-is-too-damn-short/">large scale offline attacks</a>, using the full resources of any cloud they can afford. And once they've cracked a particular password hash, <strong>they can log in as that user &hellip; forever</strong>. Or at least until that user changes their password.</p>

<blockquote>
  <p>⚠️ That's why, if you know (or even suspect!) your database was exposed, the very first thing you should do is reset everyone's password.</p>
</blockquote>

<p><img src="https://blog.codinghorror.com/content/images/2017/06/discourse-db-password-hashes.png" alt="Discourse database password hashes"></p>

<p>But what if you <em>don't</em> know? Should you preemptively reset everyone's password every 30 days, like the world's worst bigco IT departments? That's downright user hostile, and leads to serious pathologies of its own. The reality is that you probably <em>won't</em> know when your database has been exposed, at least not until it's too late to do anything about it. So it's crucial to slow the attackers down, to give yourself time to deal with it and respond.</p>

<p>Thus, the only real protection you can offer your users is just how resistant to attack your stored password hashes are. There are two factors that go into password hash strength:</p>

<ol>
<li><p><strong>The hashing algorithm</strong>. As slow as possible, and ideally designed to be <em>especially</em> slow on GPUs for reasons that will become painfully obvious about 5 paragraphs from now.</p></li>
<li><p><strong>The work factor</strong> or <strong>number of iterations</strong>. Set this as high as possible, without opening yourself up to a possible denial of service attack. </p></li>
</ol>

<p>I've seen guidance that said you should set the overall work factor high enough that hashing a password takes at least 8ms on the target platform. It turns out <a href="https://samsaffron.com/">Sam Saffron</a>, one of my Discourse co-founders, made a good call back in 2013 when he selected the NIST recommendation of <strong>PBKDF2-HMAC-SHA256</strong> and <strong>64k iterations</strong>. We measured, and that indeed takes roughly 8ms using our existing Ruby login code on our current (fairly high end, Skylake 4.0 Ghz) servers.</p>

<p>But that was 4 years ago. Exactly how secure are our password hashes in the database today? Or 4 years from now, or 10 years from now? We're building open source software for the long haul, and we need to be sure we are making reasonable decisions that protect everyone. So in the spirit of <a href="https://blog.codinghorror.com/designing-for-evil/">designing for evil</a>, it's time to put on our Darth Helmet and play the bad guy &ndash; <strong>let's crack our own hashes!</strong></p>

<p><img src="https://blog.codinghorror.com/content/images/2017/06/dark-helmet.jpg" alt=""></p>

<p>We're gonna use the biggest, baddest single GPU out there at the moment, <a href="https://gist.github.com/epixoip/a83d38f412b4737e99bbef804a270c40#gistcomment-2060753">the GTX 1080 Ti</a>. As a point of reference, for PBKDF2-HMAC-SHA256 the 1080 achieves 1180 kH/s, whereas the 1080 Ti achieves 1640 kH/s. In a <em>single</em> video card generation the attack hash rate has increased nearly 40 percent. Ponder that.</p>

<p>First, a tiny hello world test to see if things are working. I downloaded <a href="https://hashcat.net/hashcat/">hashcat</a>. I logged into our demo at try.discourse.org and created a new account with the password <code>0234567890</code>; I checked the database, and this generated the following values in the hash and salt database columns for that new user:</p>

<blockquote>
  <p>hash <br>
  <code>93LlpbKZKficWfV9jjQNOSp39MT0pDPtYx7/gBLl5jw=</code> <br>
  salt <br>
  <code>ZWVhZWQ4YjZmODU4Mzc0M2E2ZDRlNjBkNjY3YzE2ODA=</code></p>
</blockquote>

<p>Hashcat requires the following input file format: one line per hash, with the hash type, number of iterations, salt and hash (base64 encoded) separated by colons:</p>

<pre><code>type   iter  salt                                         hash  
sha256:64000:ZWVhZWQ4YjZmODU4Mzc0M2E2ZDRlNjBkNjY3YzE2ODA=:93LlpbKZKficWfV9jjQNOSp39MT0pDPtYx7/gBLl5jw=  
</code></pre>

<p>Let's hashcat it up and see if it works:</p>

<p><code>./h64 -a 3 -m 10900 .\one-hash.txt 0234567?d?d?d</code></p>

<p>Note that this is an intentionally tiny amount of work, it's only guessing three digits. And sure enough, we cracked it fast! See the password there on the end? We got it.</p>

<p><code>sha256:64000:ZWVhZWQ4YjZmODU4Mzc0M2E2ZDRlNjBkNjY3YzE2ODA=:93LlpbKZKficWfV9jjQNOSp39MT0pDPtYx7/gBLl5jw=:0234567890</code></p>

<p>Now that we know it works, let's get down to business. But we'll start easy. How long does it take to brute force attack <strong>the easiest possible Discourse password, 8 numbers</strong> &ndash; that's "only" 10<sup>8</sup> combinations, a little over one hundred million.</p>

<pre><code>Hash.Type........: PBKDF2-HMAC-SHA256  
Time.Estimated...: Fri Jun 02 00:15:37 2017 (1 hour, 0 mins)  
Guess.Mask.......: ?d?d?d?d?d?d?d?d [8]  
</code></pre>

<p>Even with a top of the line GPU that's &hellip; OK, I guess. Remember this is just one hash we're testing against, so you'd need one hour per row (user) in the table. And I have more bad news for you: Discourse hasn't allowed 8 character passwords for <a href="https://blog.codinghorror.com/your-password-is-too-damn-short/">quite some time now</a>. How long does it take if we try longer numeric passwords?</p>

<pre><code>?d?d?d?d?d?d?d?d?d [9]
Fri Jun 02 10:34:42 2017 (11 hours, 18 mins)

?d?d?d?d?d?d?d?d?d?d [10]
Tue Jun 06 17:25:19 2017 (4 days, 18 hours)

?d?d?d?d?d?d?d?d?d?d?d [11]
Mon Jul 17 23:26:06 2017 (46 days, 0 hours)

?d?d?d?d?d?d?d?d?d?d?d?d [12]
Tue Jul 31 23:58:30 2018 (1 year, 60 days)  
</code></pre>

<p>But all digit passwords are easy mode, for babies! How about some <em>real</em> passwords that use at least lowercase letters, or lowercase + uppercase + digits?</p>

<pre><code>Guess.Mask.......: ?l?l?l?l?l?l?l?l [8]  
Time.Estimated...: Mon Sep 04 10:06:00 2017 (94 days, 10 hours)

Guess.Mask.......: ?1?1?1?1?1?1?1?1 [8] (-1 = ?l?u?d)  
Time.Estimated...: Sun Aug 02 09:29:48 2020 (3 years, 61 days)  
</code></pre>

<p>A brute force try-every-single-letter-and-number attack is not looking so hot for us at this point, even with a high end GPU. But what if we divided the number by <strong>eight</strong> &hellip; <a href="https://gist.github.com/epixoip/a83d38f412b4737e99bbef804a270c40">by putting eight video cards in a single machine?</a> That's well within the reach of a small business budget or a wealthy individual. Unfortunately, dividing 38 months by 8 isn't such a dramatic reduction in the time to attack. Instead, let's talk about nation state attacks where they have the budget to throw <em>thousands</em> of these GPUs at the problem (1.1 days), maybe even <em>tens of thousands</em> (2.7 hours), then &hellip; yes. Even allowing for 10 character password minimums, you are in serious trouble at that point.</p>

<p><img src="https://blog.codinghorror.com/content/images/2017/06/8-gpu-cracking-rig.jpg" alt=""></p>

<p>If we want Discourse to be nation state attack resistant, clearly we'll need to do better. Hashcat has a handy benchmark mode, and <a href="https://docs.google.com/spreadsheets/d/1iwoMR5TBYAZ5eiSphkIQfIEfbrVvWW_tKwS4L1cYlaI/pubhtml?gid=0&amp;single=true">here's a sorted list of the strongest (slowest) hashes that Hashcat knows about</a> benchmarked on a rig with 8 Nvidia GTX 1080 GPUs. Of the things I recognize on that list, <strong>bcrypt</strong>, <strong>scrypt</strong> and <strong>PBKDF2-HMAC-SHA512</strong> stand out. </p>

<p>My quick hashcat results gave me some confidence that we weren't doing anything terribly wrong with the Discourse password hashes stored in the database. But I wanted to be <em>completely sure</em>, so I hired someone with a background in security and penetration testing to, under a signed NDA, try cracking the password hashes of two live and very popular Discourse sites <a href="https://discourse.org/customers">we currently host</a>.</p>

<blockquote>
  <p>I was provided two sets of password hashes from two different Discourse communities, containing 5,909 and 6,088 hashes respectively. Both used the PBKDF2-HMAC-SHA256 algorithm with a work factor of 64k. Using hashcat, my Nvidia GTX 1080 Ti GPU generated these hashes at a rate of ~27,000/sec.</p>
  
  <p>Common to all discourse communities are various password requirements:</p>
  
  <ul>
  <li>All users must have a minimum password length of 10 characters.</li>
  <li>All administrators must have a minimum password length of 15 characters.</li>
  <li>Users cannot use any password matching a blacklist of the 10,000 most commonly used passwords.</li>
  <li>Users can choose to create a username and password or use various third party authentication mechanisms (Google, Facebook, Twitter, etc). If this option is selected, a secure random 32 character password is autogenerated. It is not possible to know whether any given password is human entered, or autogenerated.</li>
  </ul>
  
  <p>Using common password lists and masks, I cracked 39 of the 11,997 hashes in about three weeks, 25 from the ████████ community and 14 from the ████████ community. </p>
</blockquote>

<p>This is a security researcher who commonly runs these kinds of audits, so all of the attacks used <strong>wordlists</strong>, along with known effective patterns and <a href="https://hashcat.net/wiki/doku.php?id=mask_attack">masks</a> derived from the researcher's previous password cracking experience, instead of raw brute force. That recovered the following passwords (and one duplicate):</p>

<table>  
<tr>  
<td>  
<code>007007bond</code><br>  
<code>123password</code><br>  
<code>1qaz2wsx3e</code><br>  
<code>A3eilm2s2y</code><br>  
<code>Alexander12</code><br>  
<code>alexander18</code><br>  
<code>belladonna2</code><br>  
<code>Charlie123</code><br>  
<code>Chocolate1</code><br>  
<code>christopher8</code><br>  
<code>Elizabeth1</code><br>  
<code>Enterprise01</code><br>  
<code>Freedom123</code><br>  
<code>greengrass123</code><br>  
<code>hellothere01</code><br>  
<code>I123456789</code><br>  
<code>Iamawesome</code><br>  
<code>khristopher</code><br>  
<code>l1ghthouse</code><br>  
</td>  
<td>  
<code>l3tm3innow</code><br>  
<code>Neversaynever</code><br>  
<code>password1235</code><br>  
<code>pittsburgh1</code><br>  
<code>Playstation2</code><br>  
<code>Playstation3</code><br>  
<code>Qwerty1234</code><br>  
<code>Qwertyuiop1</code><br>  
<code>qwertyuiop1234567890</code><br>  
<code>Spartan117</code><br>  
<code>springfield0</code><br>  
<code>Starcraft2</code><br>  
<code>strawberry1</code><br>  
<code>Summertime</code><br>  
<code>Testing123</code><br>  
<code>testing1234</code><br>  
<code>thecakeisalie02</code><br>  
<code>Thirteen13</code><br>  
<code>Welcome123</code><br>  
</td>  
</tr>  
</table>

<p>If we multiply this effort by 8, and double the amount of time allowed, it's conceivable that a <em>very</em> motivated attacker, or <a href="https://arstechnica.com/security/2013/10/how-the-bible-and-youtube-are-fueling-the-next-frontier-of-password-cracking/">one with a sophisticated set of wordlists and masks</a>, could eventually recover 39 &times; 16 = 624 passwords, or about <strong>five percent</strong> of the total users. That's reasonable, but higher than I would like. We absolutely plan to add a hash type table in future versions of Discourse, so we can switch to an even more secure (read: <a href="http://www.pxdojo.net/2015/08/what-i-learned-from-cracking-4000.html">much slower</a>) password hashing scheme in the next year or two.</p>

<pre><code>bcrypt $2*$, Blowfish (Unix)  
  20273 H/s

scrypt  
  886.5 kH/s

PBKDF2-HMAC-SHA512  
  542.6 kH/s 

PBKDF2-HMAC-SHA256  
 1646.7 kH/s 
</code></pre>

<p>After this exercise, I now have a much deeper understanding of our worst case security scenario, a database compromise combined with a professional offline password hashing attack. I can also more confidently recommend and stand behind our engineering work in making Discourse secure for everyone. So if, like me, you're not entirely sure you are doing things securely, it's time to put those assumptions to the test. Don't wait around for hackers to attack you &mdash; <strong>hacker, hack thyself!</strong></p>

<table>  
<tr><td class="welovecodinghorror">[advertisement] At Stack Overflow, we put developers first. We already help you find answers to your tough coding questions; now let us help you <a href="http://careers.stackoverflow.com" rel="nofollow">find your next job</a>.</td></tr>  
</table>  ]]></content:encoded></item><item><title><![CDATA[Thunderbolting Your Video Card]]></title><description><![CDATA[<p>When I wrote about <a href="https://blog.codinghorror.com/the-golden-age-of-x86-gaming/">The Golden Age of x86 Gaming</a>, I <em>implied</em> that, in the future, it might be an interesting, albeit expensive, idea to upgrade your video card via an external Thunderbolt 3 enclosure.</p>

<p><img src="https://blog.codinghorror.com/content/images/2017/03/skull-canyon-nuc-with-razer-core.jpg" alt=""></p>

<p>I'm here to report that <strong>the future is now</strong>.</p>

<p>Yes, that's right, I paid $500</p>]]></description><link>https://blog.codinghorror.com/thunderbolting-your-video-card/</link><guid isPermaLink="false">ec3b39db-f337-48f9-ad85-71679eaf0cef</guid><dc:creator><![CDATA[Jeff Atwood]]></dc:creator><pubDate>Fri, 24 Mar 2017 09:08:37 GMT</pubDate><content:encoded><![CDATA[<p>When I wrote about <a href="https://blog.codinghorror.com/the-golden-age-of-x86-gaming/">The Golden Age of x86 Gaming</a>, I <em>implied</em> that, in the future, it might be an interesting, albeit expensive, idea to upgrade your video card via an external Thunderbolt 3 enclosure.</p>

<p><img src="https://blog.codinghorror.com/content/images/2017/03/skull-canyon-nuc-with-razer-core.jpg" alt=""></p>

<p>I'm here to report that <strong>the future is now</strong>.</p>

<p>Yes, that's right, I paid $500 for <a href="https://www.razerzone.com/store/razer-core">an external Thunderbolt 3 enclosure</a> to fit a $600 video card, all to enable a plug-in upgrade of a GPU on a <a href="https://blog.codinghorror.com/the-golden-age-of-x86-gaming/">Skull Canyon NUC</a> that itself cost around $1000 fully built. I know, it sounds crazy, and &hellip; OK fine, I won't argue with you. It's crazy.</p>

<p>This matters mostly because of 4k, aka 2160p, aka 3840 &times; 2160, aka <strong>Ultra HD</strong>. </p>

<p><img src="https://blog.codinghorror.com/content/images/2015/08/common-hd-resolutions-compared.png" alt="4k compared to 1080p"></p>

<p>Plain old regular HD, aka 1080p, aka 1920 &times; 1080, is one quarter the size of 4k, and &frac14; the work. By today's GPU standards HD is pretty much <em>easy mode</em> these days. It's not even interesting. No offense to console fans, or anything.</p>

<p>Late in 2016, I got a <a href="https://www.amazon.com/gp/product/B01CDD4J58/?tag=codihorr-20">4k OLED display</a> and it &hellip; kind of blew my mind. I have never seen blacks so black, colors so vivid, on a display so thin. It made my previous 2008 era Panasonic plasma set look lame. It's so good that I'm now a little angry that every display that my eyes touch isn't OLED already. I even got into nerd fights over it, and to be honest, I'd still throw down for OLED. It is legitimately <em>that good</em>. Come at me, bro.</p>

<p>Don't believe me? Well, guess which display in the below picture is OLED? Go on, guess:</p>

<p><a href="http://www.consumerreports.org/lcd-led-oled-tvs/2016-LG-4K-oled-tvs/"><img src="https://blog.codinghorror.com/content/images/2017/03/CptX7RCVYAAKNOP.jpg" alt="Guess which screen is OLED?" title=""></a></p>

<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr"><a href="https://twitter.com/andrewbstiles">@andrewbstiles</a> if it was physically possible to have sex with this TV I.. uh.. I&#39;d take it on long, romantic walks</p>&mdash; Jeff Atwood (@codinghorror) <a href="https://twitter.com/codinghorror/status/764304493483663361">August 13, 2016</a></blockquote>  

<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<p>There's a reason every site that reviews TVs had to recalibrate their results when <a href="http://thewirecutter.com/reviews/best-tv/">they reviewed the 2016 OLED sets</a>.</p>

<blockquote>
  <p>In my extended review at Reference Home Theater, I call it “the best looking TV I’ve ever reviewed.” But we aren’t alone in loving the E6. Vincent Teoh at HDTVtest writes, “We’re not even going to qualify the following endorsement: if you can afford it, this is the TV to buy.” Rtings.com gave <a href="https://www.amazon.com/gp/product/B01CDD4J58/?tag=codihorr-20">the E6 OLED</a> the highest score of any TV the site has ever tested. Reviewed.com awarded it a 9.9 out of 10, with only the LG G6 OLED (which offers the same image but better styling and sound for $2,000 more) coming out ahead.</p>
</blockquote>

<p>But I digress. </p>

<p>Playing games at 1080p in my living room was already possible. But now that I have an incredible 4k display in the living room, it's a whole other level of difficulty. Not just twice as hard &ndash; and remember current consoles <em>barely</em> manage to eke out 1080p at 30fps in most games &ndash; but <strong>four times as hard</strong>. That's where external GPU power comes in.</p>

<p><img src="https://blog.codinghorror.com/content/images/2017/03/razer-core-with-gpu.jpg" alt=""></p>

<p>The cool technology underpinning all of this is <strong>Thunderbolt 3</strong>. The thunderbolt cable bundled with the Razer Core is rather &hellip; diminutive. There's <a href="https://blog.startech.com/post/thunderbolt-3-the-basics/">a reason for this</a>. </p>

<blockquote>
  <p><strong>Is there a maximum cable length for Thunderbolt 3 technology?</strong></p>
  
  <p>Thunderbolt 3 passive cables have maximum lengths. </p>
  
  <ul>
  <li>0.5m TB 3 (40Gbps)</li>
  <li>1.0m TB 3 (20Gbps)</li>
  <li>2.0m TB 3 (20Gbps)</li>
  </ul>
  
  <p>In the future we will offer active cables which will provide 40Gbps of bandwidth at longer lengths.</p>
</blockquote>

<p>40Gbps is, for the record, an <em>insane</em> amount of bandwidth. Let's use our rule of thumb based on ultra common gigabit ethernet, that 1 gigabit = 120 megabytes/second, and we arrive at <strong>4.8 gigabytes/second</strong>. Zow.</p>

<p>That's more than enough bandwidth to run even the highest of high end video cards, but it is not without overhead. There's <a href="http://www.ultrabookreview.com/10761-razer-core-review/">a mild performance hit</a> for running the card externally, on the order of <strong>15%</strong>. There's also a further performance hit of 10% if you are in "loopback" mode on a laptop where you don't <em>have</em> an external display, so the video frames have to be shuttled back from the GPU to the internal laptop display.</p>

<p>This may look like a gamer-only thing, but surprisingly, it isn't. What you get is the general purpose ability to attach <strong>any PCI express card</strong> to any computer with a <strong>Thunderbolt 3</strong> port and, for the most part, it just works!</p>

<p>Linus breaks it down and answers all your most difficult questions: </p>

<iframe width="560" height="315" src="https://www.youtube.com/embed/2D79GsrEqe4" frameborder="0" allowfullscreen></iframe>

<p>Please watch the above video closely if you're actually interested in this stuff; it is essential. I'll add some caveats of my own after working with the Razer Core for a while:</p>

<ul>
<li><p>Make sure the video card you plan to put into the Razer Core is not too tall, or too wide. You can tell if a card is going to be too tall by looking at pictures of the mounting rear bracket. If the card extends significantly above the standard rear mounting bracket, it won't fit. If the card takes more than 2 slots in width, it also won't fit, but this is more rare. Depth (length) is rarely an issue.</p></li>
<li><p>There are four fans in the Razer Core and although it is <em>reasonably</em> quiet, it's not super silent or anything. You may want to <a href="http://forum.notebookreview.com/threads/razer-core-disassembly-fan-location-guide.802000/">mod the fans</a>. The Razer Core is a remarkably simple device, internally, it's really just a power supply, some Thunderbolt 3 bridge logic, and a PCI express slot. I agree with Linus that the #1 area Razer could improve in the future, beyond generally getting the price down, is to use fewer and larger fans that run quieter.</p></li>
<li><p>If you're putting a heavy hitter GPU in the Razer Core, I'd try to avoid blower style cards (the ones that exhaust heat from the rear) in favor of those that cool with large fans blowing down and around the card. Dissipating 150w+ is no mean feat and you'll definitely need to keep the enclosure in open air &hellip; and of course within 0.5 meters of the computer it's connected to.</p></li>
<li><p>There is no visible external power switch on the Razer Core. It doesn't power on until you connect a TB3 cable to it. I was totally not expecting that. But once connected, it powers up and the Windows 10 Thunderbolt 3 drivers kick in and ask you to authorize the device, which I did (always authorize). Then it spun a bit, detected the new GPU, and suddenly I had multiple graphics card active on the same computer. I also installed the latest Nvidia drivers just to make sure everything was ship shape.</p></li>
<li><p>It's kinda ... <em>weird</em> having multiple GPUs simultaneously active. I wanted to make the Razer Core display the only display, but you can't really turn off the built in GPU &ndash; you can select "only use display 2", that's all. I got into several weird states where windows were opening on the other display and I had to mess around a fair bit to get things locked down to just one display. You may want to consider whether you have both "displays" connected for troubleshooting, or not.</p></li>
</ul>

<p>And then, there I am, playing Lego Marvel in splitscreen co-op at glorious 3840 &times; 2160 UltraHD resolution on an amazing OLED display with my son. It is <em>incredible</em>.</p>

<p><img src="https://blog.codinghorror.com/content/images/2017/03/lego-marvel-4k.jpg" alt=""></p>

<p>Beyond the technical "because I could", I am <strong>wildly optimistic about the future of external Thunderbolt 3 expansion boxes</strong>, and here's why:</p>

<ul>
<li><p>The main expense and bottleneck in any stonking gaming rig is, by <em>far</em>, the GPU. It's also the item you are most likely to need to replace a year or two from now.</p></li>
<li><p>The CPU and memory speeds available today are so comically fast that any device with a low-end i3-7100 for $120 will make zero difference in real world gaming at 1080p or higher &hellip; if you're OK with 30fps minimum. If you bump up to $200, you can get a quad-core i5-7500 that guarantees you 60fps minimum everywhere.</p></li>
<li><p>If you prefer a small system or a laptop, an external GPU makes it so much more flexible. Because CPU and memory speeds are already so fast, 99.9% of the time your bottleneck is the GPU, and almost <strong>any small device you can buy with a Thunderbolt 3 port can now magically transform into a potent gaming rig with a single plug</strong>. Thunderbolt 3 may be a bit cutting edge today, but more and more devices are shipping with Thunderbolt 3. Within a few years, I predict TB3 ports will be as common as USB3 ports.</p></li>
<li><p>A general purpose external PCI express enclosure will be usable for a very long time. My last <em>seven</em> video card upgrades were plug and play PCI Express cards that would have worked fine in any computer I've built in the last ten years.</p></li>
<li><p>External GPUs are not meaningfully bottlenecked by Thunderbolt 3 bandwidth; the impact is 15%  to 25%, and perhaps even less over time as drivers and implementations mature. While Thunderbolt 3 has "only" PCI Express x4 bandwidth, many benchmarkers have noted that GPUs moving from PCI Express x16 to x8 has <a href="https://www.pugetsystems.com/labs/articles/Impact-of-PCI-E-Speed-on-Gaming-Performance-518/">almost no effect on performance</a>. And there's always Thunderbolt 4 on the horizon.</p></li>
</ul>

<p>The future, as they say, is already here &ndash; it's just not evenly distributed.</p>

<p>I am painfully aware that <strong>costs need to come down</strong>. Way, <em>way</em> down. The <a href="https://www.razerzone.com/store/razer-core">$499 Razer Core</a> is well made, on the vanguard of what's possible, a harbinger of the future, and fantastically enough, it does <em>even more</em> than what it says on the tin. But it's not exactly <em>affordable</em>.</p>

<p>I would absolutely love to see a modest, dedicated $200 external Thunderbolt 3 box that included an inexpensive current-gen GPU. This would <em>clobber</em> any onboard GPU on the planet. Let's compare my Skull Canyon NUC, which has Intel's <a href="http://www.notebookcheck.net/Intel-Iris-Pro-Graphics-580.160664.0.html">fastest ever, PS4 class embedded GPU</a>, with the modest $150 <a href="http://www.notebookcheck.com/NVIDIA-GeForce-GTX-1050-Ti-Desktop.181030.0.html">GeForce GTX 1050 Ti</a>:</p>

<table width="300px">  
<tr>  
<td colspan="2"><b>1920 &times; 1080 high detail</b></td>  
</tr>  
<tr>  
<td>Bioshock Infinite</td><td>15 → 79 fps</td>  
</tr>  
<tr>  
<td>Rise of the Tomb Raider</td><td>12 → 49 fps</td>  
</tr>  
<tr>  
<td>Overwatch</td><td>43 → 114 fps</td>  
</tr>  
</table>

<p>As predicted, that's a 3x-5x stompdown. Mac users lamenting their general lack of upgradeability, hear me: <em>this sort of box is exactly what you want and need</em>. Imagine if Apple was to embrace upgrading their laptops and all-in-one systems via Thunderbolt 3.</p>

<p><img src="https://blog.codinghorror.com/content/images/2017/03/razer-core-and-razer-laptop.jpg" alt=""></p>

<p>I know, I know. It's a stretch. But a man can dream &hellip; of externally upgradeable GPUs. That are too expensive, sure, but they are here, right now, today. They'll only get cheaper over time.</p>

<table>  
<tr><td class="welovecodinghorror">  
[advertisement] <a href="http://careers.stackoverflow.com" rel="nofollow">Find a better job the Stack Overflow way</a> - what you need when you need it, no spam, and no scams.
</td></tr>  
</table>  ]]></content:encoded></item><item><title><![CDATA[Password Rules Are Bullshit]]></title><description><![CDATA[<p>Of the many, many, <em>many</em> <a href="https://blog.codinghorror.com/the-dirty-truth-about-web-passwords/">bad things about passwords</a>, you know what the worst is? Password rules. </p>

<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">If we don&#39;t solve the password problem for users in my lifetime I am gonna haunt you from beyond the grave as a ghost <a href="http://t.co/Tf9EnwgoZv">pic.twitter.com/Tf9EnwgoZv</a></p>&mdash; Jeff Atwood</blockquote>]]></description><link>https://blog.codinghorror.com/password-rules-are-bullshit/</link><guid isPermaLink="false">6bbbc02f-8e2e-4f41-af6b-7fd74b643b16</guid><dc:creator><![CDATA[Jeff Atwood]]></dc:creator><pubDate>Fri, 10 Mar 2017 11:16:26 GMT</pubDate><content:encoded><![CDATA[<p>Of the many, many, <em>many</em> <a href="https://blog.codinghorror.com/the-dirty-truth-about-web-passwords/">bad things about passwords</a>, you know what the worst is? Password rules. </p>

<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">If we don&#39;t solve the password problem for users in my lifetime I am gonna haunt you from beyond the grave as a ghost <a href="http://t.co/Tf9EnwgoZv">pic.twitter.com/Tf9EnwgoZv</a></p>&mdash; Jeff Atwood (@codinghorror) <a href="https://twitter.com/codinghorror/status/631238409269309440">August 11, 2015</a></blockquote>  

<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<p>Let this pledge be duly noted on the permanent record of the Internet. I don't know if there's an afterlife, but I'll be finding out soon enough, and I plan to go out <em>mad as hell</em>.</p>

<p>The world is absolutely awash in terrible password rules:</p>

<ul>
<li><a href="https://github.com/duffn/dumb-password-rules">Dumb Password Rules</a></li>
<li><a href="http://badpasswordpolicies.tumblr.com/">Bad Password Policies</a></li>
<li><a href="http://password-shaming.tumblr.com/">Password Requirements Shaming</a></li>
</ul>

<p>But I don't need to tell you this. The more likely you are to use a truly random password generation tool, like us über-geeks are supposed to, the more likely you have suffered mightily &ndash; and daily &ndash; under this regime.</p>

<p>Have you seen the classic XKCD <a href="https://xkcd.com/936/">about passwords</a>? </p>

<p><img src="https://blog.codinghorror.com/content/images/2017/03/password_strength.png" alt="To anyone who understands information theory and security and is in an infuriating argument with someone who does not (possibly involving mixed case), I sincerely apologize."></p>

<p>We <a href="https://security.stackexchange.com/questions/6095/xkcd-936-short-complex-password-or-long-dictionary-passphrase">can certainly debate</a> whether "correct horse battery staple" is a viable password strategy or not, but the argument here is mostly that <em>length matters</em>.</p>

<p><img src="https://blog.codinghorror.com/content/images/2017/03/twss.jpg" alt="That's What She Said"></p>

<p>No, seriously, it does. I'll go so far as to say <a href="https://blog.codinghorror.com/your-password-is-too-damn-short/">your password is too damn short</a>. These days, given the state of cloud computing and GPU password hash cracking, any password of 8 characters or less is perilously close to <em>no password at all</em>.</p>

<p>So then perhaps we have one rule, that <strong>passwords must not be short</strong>. A long password is much more likely to be secure than a short one &hellip; right?</p>

<p>What about this four character password?</p>

<h1 id="">✅🐎🔋🖇️</h1>

<p>What about this eight character password?</p>

<h1 id="">正确马电池订书钉</h1>

<p>Or this (hypothetical, but all too real) seven character password?</p>

<h1>ش导พิ한<img src="https://blog.codinghorror.com/content/images/2017/06/klingon-char.png" width="35" height="42" alt="" style="display:inline; vertical-align:middle">✌︎🚖</h1>

<blockquote class="twitter-tweet" data-conversation="none" data-lang="en"><p lang="en" dir="ltr"><a href="https://twitter.com/codinghorror">@codinghorror</a> I&#39;m sorry but your password must contain 1 char each from: Arabic, Chinese, Thai, Korean, Klingon, Wingdings and an emoji</p>&mdash; Finley Creative (@FinleyCreative) <a href="https://twitter.com/FinleyCreative/status/705349059217784833">March 3, 2016</a></blockquote>  

<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<p>You may also be surprised, if you paste the above four Unicode emojis into your favorite login dialog (go ahead &ndash; try it), to discover that it &hellip; <em>isn't</em> in fact four characters.</p>

<p><img src="https://blog.codinghorror.com/content/images/2017/03/discourse-login-emoji-password.png" alt=""></p>

<p>Oh dear. </p>

<pre><code>"💩".length === 2
</code></pre>

<p>Our old pal Unicode <a href="http://blog.jonnew.com/posts/poo-dot-length-equals-two">strikes again</a>.</p>

<p>As it turns out, even the simple rule that "your password must be of reasonable length" &hellip; ain't necessarily so. Particularly if we stop thinking like <a href="https://blog.codinghorror.com/the-ugly-american-programmer/">Ugly ASCII Americans</a>.</p>

<p>And what of those nice, long passwords? Are they <em>always</em> secure? </p>

<pre><code>aaaaaaaaaaaaaaaaaaa
0123456789012345689
passwordpassword
usernamepassword
</code></pre>

<p>Of course not, because <em>have you met any users lately?</em> </p>

<p><img src="https://blog.codinghorror.com/content/images/2017/03/incorrect-password.jpg" alt="I changed all my passwords to " incorrect""=""></p>

<p>They consistently ruin every piece of software I've ever written. Yes, yes, I know you, Mr. or Ms. über-geek, know <em>all</em> about the concept of entropy. But expressing your love of entropy as terrible, idiosyncratic password rules &hellip;</p>

<ul>
<li>must contain uppercase</li>
<li>must contain lowercase</li>
<li>must contain a number</li>
<li>must contain a special character</li>
</ul>

<p>&hellip; is a spectacular failure of imagination in a world of Unicode and Emoji.</p>

<p>As we built <a href="https://discourse.org">Discourse</a>, I discovered that <a href="https://blog.codinghorror.com/the-god-login/">the login dialog was a remarkably complex piece of software</a>, despite its surface simplicity. The primary password rule we used was also the simplest one: <strong>length</strong>. Since I wrote that, we've already increased our minimum password default length from 8 to 10 characters. And if you happen to be an admin or moderator, we decided the minimum has to be even more, <strong>15</strong> characters.</p>

<p>I also advocated <strong>checking passwords against the 100,000 most common passwords</strong>. If you look at <a href="https://blog.keepersecurity.com/2017/01/13/most-common-passwords-of-2016-research-study/">10 million passwords from data breaches in 2016</a>, you'll find the top 25 most used passwords are:</p>

<table width="320px">  
<tr>  
<td style="vertical-align:top">  
<code>123456</code><br>  
<code>123456789</code><br>  
<code>qwerty</code><br>  
<code>12345678</code><br>  
<code>111111</code><br>  
<code>1234567890</code><br>  
<code>1234567</code><br>  
<code>password</code><br>  
<code>123123</code><br>  
<code>987654321</code><br>  
<code>qwertyuiop</code><br>  
<code>mynoob</code><br>  
</td>  
<td style="vertical-align:top">  
<code>123321</code><br>  
<code>666666</code><br>  
<code>18atcskd2w</code><br>  
<code>7777777</code><br>  
<code>1q2w3e4r</code><br>  
<code>654321</code><br>  
<code>555555</code><br>  
<code>3rjs1la7qe</code><br>  
<code>google</code><br>  
<code>1q2w3e4r5t</code><br>  
<code>123qwe</code><br>  
<code>zxcvbnm</code><br>  
<code>1q2w3e</code><br>  
</td>  
</tr>  
</table>

<p>Even this data betrays some ASCII-centrism. The numbers are the same in any culture I suppose, but I find it hard to believe the average Chinese person will ever choose the passwords "password", "quertyuiop", or "mynoob". So this list <em>has</em> to be customizable, localizable.</p>

<p>(One interesting idea is to search for common shorter password matches inside longer passwords, but I think this would cause too many false positives.)</p>

<p>If you examine the data, this also turns into an argument in favor of password length. Note that only 5 of the top 25 passwords are 10 characters, so if we require 10 character passwords, we've already reduced our exposure to the most common passwords by 80%. I saw this originally when I <a href="https://github.com/danielmiessler/SecLists/tree/master/Passwords">gathered millions and millions of leaked passwords for Discourse research</a>, then filtered the list down to just those passwords reflecting our new minimum requirement of 10 characters or more.</p>

<p><img src="https://blog.codinghorror.com/content/images/2017/03/top-million-common-passwords-by-length.png" alt=""></p>

<p>It suddenly became a <em>tiny</em> list. (If you've done similar common password research, please do share your results in the comments.)</p>

<p>I'd like to offer the following common sense advice to my fellow developers:</p>

<h4 id="1passwordrulesarebullshit">1. Password rules are bullshit</h4>

<ul>
<li>They don't work.</li>
<li>They heavily penalize your ideal audience, people that use real random password generators. Hey guess what, that password randomly <em>didn't</em> have a number or symbol in it. I just double checked my math textbook, and yep, it's possible. I'm pretty sure.</li>
<li>They frustrate average users, who then become uncooperative and use "creative" workarounds that make their passwords <em>less</em> secure.</li>
<li>They are often wrong, in the sense that the rules chosen are grossly incomplete and/or insane, per the many shaming links I've shared above.</li>
<li>Seriously, for the <em>love of God</em>, stop with this arbitrary password rule nonsense already. If you won't take my word for it, read <a href="https://nakedsecurity.sophos.com/2016/08/18/nists-new-password-rules-what-you-need-to-know/">this 2016 NIST password rules recommendation</a>. It's right there, "no composition rules". However, I do see one error, it should have said "no <em>bullshit</em> composition rules". </li>
</ul>

<h4 id="2enforceaminimum_unicode_passwordlength">2. Enforce a minimum <em>Unicode</em> password length</h4>

<p>One rule is at least easy to remember, understand, and enforce. This is the proverbial one rule to bring them all, and in the darkness bind them.</p>

<p><img src="https://blog.codinghorror.com/content/images/2017/03/one-donut-to-bind-them-all.jpg" alt=""></p>

<ul>
<li>It's simple. Users can count. Most of them, anyway.</li>
<li>It works. The data <em>shows us</em> it works; just download any common password list of your choice and group by password length.</li>
<li>The math doesn't lie. All other things being equal, a longer password <em>will</em> be more random &ndash; and thus more secure &ndash; than a short password.</li>
<li>Accept that even this one rule isn't inviolate. A minimum password length of 6 on a Chinese site <em>might</em> be perfectly reasonable. A 20 character password <em>can</em> be ridiculously insecure.</li>
<li>If you don't allow (almost) every single unicode character in the password input field, you are probably doing it wrong.</li>
<li>It's a bit of an implementation detail, but make sure <em>maximum</em> password length is reasonable as well. </li>
</ul>

<h4 id="3checkforcommonpasswords">3. Check for common passwords</h4>

<p>As I've already noted, the definition of "common" depends on your audience, and language, but it is a terrible disservice to users when you let them choose passwords that exist in the list of 10k, 100k, or million most common known passwords from data breaches. There's <em>no question</em> that a hacker will submit these common passwords in a hack attempt &ndash; and it's shocking how far you can get, even with aggressive password attempt rate limiting, using <a href="https://xato.net/10-000-top-passwords-6d6380716fe0">just the 1,000 most common passwords</a>.</p>

<ul>
<li>1.6% have a password from the top 10 passwords</li>
<li>4.4% have a password from the top 100 passwords</li>
<li>9.7% have a password from the top 500 passwords</li>
<li>13.2% have a password from the top 1,000 passwords</li>
<li>30% have a password from the top 10,000 passwords</li>
</ul>

<p>Lucky you, there are millions and millions of real breached password lists out there to sift through. It is sort of fun to do data forensics, because these aren't hypothetical synthetic Jack the Ripper password rules some bored programmer dreamed up, these are <em>real</em> passwords used by <em>real</em> users.</p>

<p>Do the research. Collect the data. Protect your users from themselves.</p>

<h4 id="4checkforbasicentropy">4. Check for basic entropy</h4>

<p>No need to get fancy here; pick the measure of entropy that satisfies you deep in the truthiness of your gut. But remember you have to be able to <em>explain</em> it to users when they fail the check, too.</p>

<p><a href="http://www.digifail.com/software/spectra.shtml"><img src="https://blog.codinghorror.com/content/images/2017/03/entropy2.png" alt="entropy visualized" title=""></a></p>

<p>I had a bit of a sad when I realized that we  were perfectly fine with users selecting a 10 character password that was literally "aaaaaaaaaa". In my opinion, the simplest way to do this is to ensure that there are at least (x) unique characters out of (y) total characters. And that's what we do as of the current beta version of Discourse. But I'd love your ideas in the comments, too. The simpler and clearer the better!</p>

<h4 id="5checkforspecialcasepasswords">5. Check for special case passwords</h4>

<p>I'm embarrassed to admit that when building the Discourse login, <a href="https://blog.codinghorror.com/the-god-login/">as I discussed in The God Login</a>, we missed two common cases that you really <em>have</em> to block:</p>

<ul>
<li>password equal to username</li>
<li>password equal to email address</li>
</ul>

<p>🤦 If you are using Discourse versions earlier than 1.4, I'm so sorry and <em>please upgrade immediately</em>. </p>

<p>Similarly, you might also want to block other special cases like </p>

<ul>
<li>password equal to URL or domain of website</li>
<li>password equal to app name</li>
</ul>

<p>In short, try to think outside the password input box, like a user would.</p>

<blockquote>
  <p>🔔 <strong>Clarification</strong></p>
  
  <p>A few people have interpreted this post as "all the <em>other</em> password rules are bullshit, except these four I will now list." That's not what I'm trying to say here.</p>
  
  <p>The idea is to focus on the one understandable, simple, practical, works-in-real-life-in-every-situation rule: <strong>length</strong>. Users can enter (almost) anything, in proper Unicode, <em>provided it's long enough</em>. That's the <strong>one rule to bind them all</strong> that we need to teach users: length!</p>
  
  <p>Items #3 through #5 are more like genie-special-exception checks, a <a href="https://www.youtube.com/watch?v=Bwic3hJ4q1A">you can't wish for infinite wishes</a> kind of thing. It doesn't need to be discussed up front because it <em>should</em> be really rare. Yes, you must stop users from having comically bad passwords that equal their username, or <code>aaaaaaaaaaa</code> or <code>0123456789</code>, but only as post-entry checks, not as rules that need to be explained in advance.</p>
  
  <p>So TL;DR: one rule. Length. Enter whatever you want, just make sure it's long enough to be a reasonable password.</p>
</blockquote>

<table>  
<tr><td class="welovecodinghorror">  
[advertisement] Building out your tech team? <a href="http://careers.stackoverflow.com/products" rel="nofollow">Stack Overflow Careers</a> helps you hire from the largest community for programmers on the planet. We built our site with developers like you in mind.
</td></tr>  
</table>]]></content:encoded></item><item><title><![CDATA[I'm Loyal to Nothing Except the Dream]]></title><description><![CDATA[<p>There is much I take for granted in my life, and the normal functioning of American government is one of those things. In my 46 years, I've lived under nine different presidents. The first I remember is Carter. I've voted in every presidential election since 1992, but I do not</p>]]></description><link>https://blog.codinghorror.com/im-loyal-to-nothing-except-the-dream/</link><guid isPermaLink="false">3e7721bb-f407-4566-8a49-056d7b889870</guid><dc:creator><![CDATA[Jeff Atwood]]></dc:creator><pubDate>Mon, 30 Jan 2017 09:19:56 GMT</pubDate><content:encoded><![CDATA[<p>There is much I take for granted in my life, and the normal functioning of American government is one of those things. In my 46 years, I've lived under nine different presidents. The first I remember is Carter. I've voted in every presidential election since 1992, but I do not consider myself a Democrat, or a Republican. I vote based on leadership &ndash; above all, leadership &ndash; and issues.</p>

<p>In my 14 years of blogging, I've never written a political blog post. I haven't needed to. </p>

<p>Until now.</p>

<p>It is quite clear <strong>something has become deeply unglued in the state of American politics.</strong></p>

<ul>
<li><p>The nuclear doomsday clock was <a href="http://www.reuters.com/article/us-science-doomsdayclock-idUSKBN15A2JJ">just moved as close to midnight</a> as it has been in 64 years. </p></li>
<li><p>America was downgraded from a <a href="http://www.cnbc.com/2017/01/25/us-is-no-longer-a-full-democracy-eiu-warns.html">Democracy to a Flawed Democracy</a>.</p></li>
</ul>

<p>As of 2017, the United States, through a sequence of highly improbable events, managed to elect an extremely controversial president.</p>

<p><img src="https://blog.codinghorror.com/content/images/2017/01/voting-in-2016-presidential-election.png" alt=""></p>

<p>A president with <a href="http://fortune.com/2017/01/29/donald-trump-approval-rating-gallup/">historically low approval ratings</a>, elected on a platform many considered <a href="https://www.theguardian.com/technology/2016/oct/31/peter-thiel-defends-donald-trump-muslim-ban-mexico-wall">too extreme to even be taken literally</a>:</p>

<blockquote>
  <p>Asked about Trump’s statements proposing the construction of a wall on the US-Mexico border and a ban on all Muslims entering the country, Thiel suggested that Trump supporters do not actually endorse those policies.</p>
  
  <p>“I don’t support a religious test. I certainly don’t support the specific language that Trump has used in every instance,” he said. “But I think one thing that should be distinguished here is that the media is always taking Trump literally. It never takes him seriously, but it always takes him literally.”</p>
  
  <p>The billionaire went on to define how he believes the average Trump supporter interprets the candidate’s statements. “I think a lot of voters who vote for Trump take Trump seriously but not literally, so when they hear things like the Muslim comment or the wall comment their question is not, ‘Are you going to build a wall like the Great Wall of China?’ or, you know, ‘How exactly are you going to enforce these tests?’ What they hear is we’re going to have a saner, more sensible immigration policy.”</p>
</blockquote>

<p>A little over a week into the new presidency, it is obvious that <strong>Trump meant every word of what he said.</strong> He will <a href="https://www.nytimes.com/2017/01/26/world/mexicos-president-cancels-meeting-with-trump-over-wall.html">build a US-Mexico wall</a>. And he signed an executive order that <em>literally</em>, not figuratively, <a href="http://www.cnn.com/2017/01/28/politics/donald-trump-executive-order-immigration-reaction/">banned Muslims from entering the US</a> &mdash; even if they held valid green cards.</p>

<p>As I said, I vote on policies, and <strong>as an American, I reject these two policies.</strong> Our Mexican neighbors are not an evil to be kept out with a wall, but an ally to be cherished. One of my <a href="https://en.wikipedia.org/wiki/Miguel_de_Icaza">favorite people</a> is a Mexican immigrant. Mexican culture is ingrained deeply into America and we are all better for it. The history of America is the history of immigrants seeking religious freedom from persecution, finding a new life in the land of opportunity. Imagine the bravery it takes to leave everything behind, your relatives, your home, your <em>whole life as you know it</em>, to take your entire family on a five thousand mile journey to another country on nothing more than the promise of a dream. I've never done that, though my great-great grandparents did. Muslim immigrants are <a href="https://www.buzzfeed.com/sarahmathews/how-to-get-your-green-card-in-america?utm_term=.lsbOAjkpl#.vjXYP1qbQ">more American than I will ever be</a>, and I am incredibly proud to have them here, as fellow Americans.</p>

<p><a href="http://www.snopes.com/superman-1950-poster-diversity/"><img src="https://blog.codinghorror.com/content/images/2017/01/help-keep-your-school-all-american.jpg" alt="Help Keep Your School All American!"></a></p>

<p>Trump is the first president in 40 years to <a href="http://money.cnn.com/2017/01/23/news/economy/donald-trump-tax-returns/">refuse to release</a> his tax returns in office. He has also refused to <a href="http://www.npr.org/sections/thetwo-way/2017/01/12/509421108/u-s-ethics-official-trumps-divestiture-is-hard-pricy-and-essential">divest himself</a> from his dizzying array of businesses across the globe, which present financial conflicts of interest. All of this, plus the hasty way he is ramrodding his campaign plans through on executive orders, with little or no forethought to how it would work &ndash; or if it would work at all &ndash; speaks to <strong>how negligent and dangerous Trump is as the leader of the free world.</strong> I want to reiterate that I don't care about party; I'd be absolutely over the moon with President Romney or President McCain, or any other rational form of leadership at this point.</p>

<p>It is unclear to me how we got where we are today. But echoes of this appeal to nationalism <a href="https://www.washingtonpost.com/world/europe/in-poland-a-window-on-what-happens-when-populists-come-to-power/2016/12/18/083577e8-c203-11e6-92e8-c07f4f671da4_story.html?utm_term=.31b3ca7bd3e6">in Poland</a>, and <a href="https://www.washingtonpost.com/posteverything/wp/2017/01/27/in-venezuela-we-couldnt-stop-chavez-dont-make-the-same-mistakes-we-did/?utm_term=.b8a94d3760b2">in Venezula</a>, offer clues. We brought <a href="https://bbs.boingboing.net/t/when-youre-accustomed-to-privilege-equality-feels-like-oppression/81995">fact checkers to a culture war</a> &hellip; and we lost. During the election campaign, I was strongly reminded of Frank Miller's 1986 Nuke story arc, which I read in Daredevil as a teenager &mdash; the seductive appeal of unbridled nationalism bleeding across the page in stark primary colors.</p>

<p><a href="https://www.amazon.com/dp/0785134816/?tag=codihorr-20"><img src="https://blog.codinghorror.com/content/images/2017/01/daredevil-233-page.png" alt="Daredevil issue 233, page excerpt" title=""></a></p>

<p>Nuke is a self-destructive form of <a href="https://library.ucsd.edu/dc/search?f%5Bcollection_sim%5D%5B%5D=Dr.+Seuss+Political+Cartoons&amp;f%5Bobject_type_sim%5D%5B%5D=image&amp;f%5Bsubject_topic_sim%5D%5B%5D=War+and+domestic+issues--America+first">America First nationalism</a> that, for whatever reasons, won the presidency through dark subvocalized whispers, and is now playing out in horrifying policy form. But we are not now a different country; we remain <em>the very same country that elected Reagan and Obama.</em> We lead the free world. And we do it by taking the higher moral ground, choosing to do what is <em>right</em> before doing what is expedient.</p>

<iframe width="560" height="315" src="https://www.youtube.com/embed/mUkv_jPgTeg" frameborder="0" allowfullscreen></iframe>

<p>I exercised my rights as a American citizen and I voted, yes. But <strong>I mostly ignored government beyond voting</strong>. I assumed that the wheels of American government would turn, and reasonable decisions would be made by reasonable people. Some I would agree with, others I would not agree with, but I could generally trust that the arc of American history inexorably bends toward justice, towards freedom, toward equality. Towards the things that make up the underlying American dream that this country is based on.</p>

<p>This is no longer the case.</p>

<p>I truly believe we are at an unprecedented time in American history, in uncharted territory. I have benefited from democracy passively, without trying at all, for 46 years. I now understand that the next four years is perhaps <a href="http://fusion.net/story/379938/comic-trump-election-protest-civil-rights-movement-memphis/">the most important time to be an activist in the United States since the civil rights movement</a>. <strong>I am ready to do the work.</strong></p>

<ul>
<li><p>I have never once in my life called my representatives in congress. That will change. I will be calling and writing my representatives regularly, using <a href="https://5calls.org/"><strong>tools like 5 Calls</strong></a> to do so.</p></li>
<li><p>I will strongly support, advocate for, and advertise any technical tools on web or smartphone that help Americans have their voices heard by their representatives, even if it takes faxing to do so. Build these tools. <em>Make them amazing</em>.</p></li>
<li><p>I am subscribing to support essential investigative journalism such as the <a href="https://www.nytimes.com/subscriptions/Multiproduct/lp8HYKU.html">New York Times</a>, <a href="https://myaccount2.latimes.com/dsssubscribe.aspx">Los Angeles Times</a>, and <a href="https://subscribe.washingtonpost.com/">Washington Post</a>.</p></li>
<li><p>I have set up large monthly donations to the <a href="https://www.aclu.org/">ACLU</a> which is doing critical work in fighting governmental abuse under the current regime.</p></li>
<li><p>I have set up monthly donations to independent journalism such as <a href="https://www.propublica.org/donate/">ProPublica</a> and <a href="http://www.npr.org/stations/">NPR</a>.</p></li>
<li><p>I have set up monthly donations to agencies that fight for vulnerable groups, such as <a href="https://www.plannedparenthood.org/">Planned Parenthood</a>, <a href="https://www.reproductiverights.org/">Center for Reproductive Rights</a>, <a href="https://refugeerights.org/">Refugee Rights</a>, <a href="http://www.naacp.org/">NAACP</a>, <a href="http://www.maldef.org/">MALDEF</a>, <a href="http://www.thetrevorproject.org/">the Trevor Project</a>, and so on.</p></li>
<li><p>I wish to see the formation of a third political party in the United States, led by those who are willing to speak truth to power like <a href="https://www.evanmcmullin.com/">Evan McMullin</a>. It is shameful how many elected representatives will not speak out. Those who do: trust me, we're watching and taking notes. And we will be bringing all our friends and audiences to bear to help you win. </p></li>
<li><p>I will be watching closely to see which representatives rubber-stamp harmful policies and appointees, and I will vote against them across the ticket, on every single ticket I can vote on.</p></li>
<li><p>I will actively support all efforts to make the <a href="https://en.wikipedia.org/wiki/National_Popular_Vote_Interstate_Compact">National Popular Vote Interstate Compact</a> happen, to reform the electoral college.</p></li>
<li><p>To the extent that my schedule allows, I will participate in protests to combat policies that I believe are harmful to Americans.</p></li>
<li><p>I am not quite at a place in my life where I'd consider running for office, but I will be, eventually. To the extent that <a href="https://stackoverflow.blog/2010/12/stack-exchange-moderator-elections-begin/">any Stack Overflow user can be elected a moderator</a>, I could be elected into office, locally, in the house, even the senate. Has anyone asked Joel Spolsky if he'd be willing to run for office? Because I'd be hard pressed to come up with someone I trust more than my old business partner Joel to do the right thing. I would vote for him so hard I'd break the damn voting machine.</p></li>
</ul>

<p>I want to pay back this great country for everything it has done for me in my life, and carry the dream forward, not just selfishly for myself and my children, but for everyone's children, and our children's children. I do not mean <a href="http://progressive.org/dispatches/howard-zinn-s-july-4-wisdom-stands-test-time/">the hollow promises of American nationalism</a> &hellip;</p>

<blockquote>
  <p>We would do well to renounce nationalism and all its symbols: its flags, its pledges of allegiance, its anthems, its insistence in song that God must single out America to be blessed.</p>
  
  <p>Is not nationalism—that devotion to a flag, an anthem, a boundary so fierce it engenders mass murder—one of the great evils of our time, along with racism, along with religious hatred?</p>
  
  <p>These ways of thinking—cultivated, nurtured, indoctrinated from childhood on— have been useful to those in power, and deadly for those out of power.</p>
</blockquote>

<p>&hellip; but the enduring values of freedom, justice, and equality that this nation was founded on. <strong>I pledge my allegiance to the American dream, and the American people</strong> &ndash; not to the nation, <em>never</em> to the nation.</p>

<p><a href="https://www.amazon.com/dp/0785134816/?tag=codihorr-20"><img src="https://blog.codinghorror.com/content/images/2017/01/daredevil-233-page-loyal-to-nothing-except-the-dream.png" alt="Daredevil issue 233, page excerpt" title=""></a></p>

<p>I apologize that it's taken me 46 years to wake up and realize that some things, like the American dream, aren't guaranteed. There will come a time where you <em>have</em> to stand up and fight for them, for democracy to work. I will.</p>

<p>Will you?</p>

<table>  
<tr><td class="welovecodinghorror">  
[advertisement] At Stack Overflow, we help developers learn, share, and grow. Whether you’re looking for your next dream job or looking to build out your team, <a href="http://careers.stackoverflow.com" rel="nofollow">we've got your back</a>.
</td></tr>  
</table>]]></content:encoded></item><item><title><![CDATA[An Inferno on the Head of a Pin]]></title><description><![CDATA[<p>Today's processors contain <a href="https://blog.codinghorror.com/moores-law-in-practical-terms/">billions of</a> heat-generating transistors in an ever shrinking space. The power budget might go from:</p>

<ul>
<li>1000 watts on a specialized server</li>
<li>100 watts on desktops</li>
<li>30 watts on laptops</li>
<li>5 watts on tablets </li>
<li>1 or 2 watts on a phone</li>
<li>100 milliwatts on an <a href="http://www.anandtech.com/show/8702/ingenic-launches-newton2-mips-based-iot-and-wearables-solution">embedded system</a></li>
</ul>

<p>That's</p>]]></description><link>https://blog.codinghorror.com/an-inferno-on-the-head-of-a-pin/</link><guid isPermaLink="false">67502fe9-cebb-431f-8260-55cb878ded67</guid><dc:creator><![CDATA[Jeff Atwood]]></dc:creator><pubDate>Tue, 17 Jan 2017 11:37:18 GMT</pubDate><content:encoded><![CDATA[<p>Today's processors contain <a href="https://blog.codinghorror.com/moores-law-in-practical-terms/">billions of</a> heat-generating transistors in an ever shrinking space. The power budget might go from:</p>

<ul>
<li>1000 watts on a specialized server</li>
<li>100 watts on desktops</li>
<li>30 watts on laptops</li>
<li>5 watts on tablets </li>
<li>1 or 2 watts on a phone</li>
<li>100 milliwatts on an <a href="http://www.anandtech.com/show/8702/ingenic-launches-newton2-mips-based-iot-and-wearables-solution">embedded system</a></li>
</ul>

<p>That's <s>three</s> four orders of magnitude. Modern CPU design is <strong>the delicate art of placing an inferno on the head of a pin.</strong></p>

<p>Look at the original 1993 Pentium compared to the 20th anniversary Pentium:</p>

<table cellpadding="4" cellspacing="4" class="reformat-mobile">  
<tr>  
<td style="vertical-align:top">  
<img src="https://blog.codinghorror.com/content/images/2017/01/intel-pentium-66.jpg" width="260px" alt="Intel Pentium 66">  
</td>  
<td style="vertical-align:top">  
1993<br>  
Pentium<br>  
66 Mhz<br>  
16kb L1<br>  
<b>3.2 million</b> transistors<br>  
</td>  
</tr>

<tr>  
<td style="vertical-align:top">  
<img src="https://blog.codinghorror.com/content/images/2017/01/intel-pentium-g2358-20th-anniversary.jpg" width="260px" alt="Intel Pentium G3258 20th Anniversary Edition">  
</td>  
<td style="vertical-align:top">  
2014<br>  
Pentium G3258<br>  
3.2 Ghz &times; 2 cores<br>  
128kb L1, 512kb L2, 3MB L3<br>  
<b>1.4 billion</b> transistors  
</td>  
</tr>  
</table>

<p>I remember cooling the early CPUs with simple heatsinks; no fan. Those days are long gone.</p>

<p>A roomy desktop computer affords cooling opportunities (and thus a watt budget) that a laptop or tablet could only dream of. How often will you be at peak load? For most computers, the answer is "rarely". The smaller the space, the higher the required performance, the more &hellip; challenging your situation gets.</p>

<p><img src="https://blog.codinghorror.com/content/images/2017/01/challenge-accepted-barney.gif" alt=""></p>

<p>Sometimes, <a href="https://blog.codinghorror.com/to-ecc-or-not-to-ecc/">I build servers</a>. </p>

<blockquote>
  <p></p><p>Inspired by Google and their use of cheap, commodity x86 hardware to scale on top of the open source Linux OS, I also <a href="http://blog.codinghorror.com/building-servers-for-fun-and-prof-ok-maybe-just-for-fun/">built our own servers</a>. When I get stressed out, when I feel the world weighing heavy on my shoulders and I don't know where to turn &hellip; <em>I build servers</em>. It's therapeutic. </p>
</blockquote>

<p>Servers are one of those situations where you <em>may</em> be at full CPU load more often than not. I prefer to build <a href="http://www.computerhope.com/jargon/num/1u.htm">1U servers</a> which is the smallest rack mountable unit, at 1.75" total height.</p>

<p><img src="https://blog.codinghorror.com/content/images/2017/01/1u-servers.jpg" alt=""></p>

<p>You get plenty of cores on a die these days,  so I build single CPU servers. One reason is price; the other reason is that clock speed declines proportionally to the number of cores on a die (this is for the Broadwell Xeon V4 series):</p>

<table style="width:300px">  
<tr><td></td><td>cores</td><td>GHz</td><td></td></tr>  
<tr><td>E5-1630</td><td>4</td><td>3.7</td><td>$406</td></tr>  
<tr><td>E5-1650</td><td>6</td><td>3.6</td><td>$617</td></tr>  
<tr><td>E5-1680</td><td>8</td><td>3.4</td><td>$1723</td></tr>  
<tr><td>E5-2680</td><td>12</td><td>2.4</td><td>$1745</td></tr>  
<tr><td>E5-2690</td><td>14</td><td>2.6</td><td>$2090</td></tr>  
<tr><td>E5-2697</td><td>18</td><td>2.3</td><td>$2702</td></tr>  
</table>

<p>Yes, there are server CPUs with even more cores, but if you have to ask how much they cost, you <em>definitely</em> can't afford them &hellip; and they're clocked even slower. <a href="https://discourse.org">What we do</a> is serviced better by a smaller number of super fast cores than a larger number of slow cores, anyway.</p>

<p>With that in mind, consider these two Intel Xeon server CPUs:</p>

<ul>
<li><a href="http://ark.intel.com/products/82764/Intel-Xeon-Processor-E5-1630-v3-10M-Cache-3_70-GHz">E5-1630 V3</a> (4 core, 3.7 - 3.8 Ghz)</li>
<li><a href="http://ark.intel.com/products/82765/Intel-Xeon-Processor-E5-1650-v3-15M-Cache-3_50-GHz">E5-1650 V3</a> (6 core, 3.5 - 3.8 Ghz)</li>
</ul>

<p>As you can see from the official Intel product pages for each processor, they both have a TDP heat budget of <strong>140 watts</strong>. I'm scanning the specs, thinking maybe this is an OK tradeoff.</p>

<p><img src="https://blog.codinghorror.com/content/images/2017/01/thought-bubble-more-cores.png" alt=""></p>

<p>Unfortunately, here's what I actually measured with <a href="https://blog.codinghorror.com/why-estimate-when-you-can-measure/">my trusty Kill-a-Watt</a> for each server build as I performed <a href="https://blog.codinghorror.com/is-your-computer-stable/">my standard stability testing</a>, with completely identical parts except for the CPU:</p>

<ul>
<li>E5-1630: 40w idle, 170w mprime</li>
<li>E5-1650: 55w idle, <strong>250w</strong> mprime</li>
</ul>

<p>I am here to tell you that Intel's TDP figure of 140 watts for the 6 core version of this CPU is a <em>terrible, scurrilous lie!</em></p>

<p>This caused a bit of a problem for me as our standard 1U server build now <strong>overheats, alarms, and throttles with the 6 core CPU</strong> &mdash; whereas the 4 core CPU was just fine. Hey Intel! From my home in California, <a href="https://www.penny-arcade.com/comic/2002/07/22">I stab at thee!</a></p>

<p>But, you know.. </p>

<p><img src="https://blog.codinghorror.com/content/images/2017/01/challenge-accepted.gif" alt=""></p>

<h4 id="betterheatsink">Better Heatsink</h4>

<p>The 1.75" maximum height of the 1U server form factor doesn't leave a lot of room for creative cooling of a CPU. But you <em>can</em> switch from an Aluminum cooler to a Copper one.</p>

<p><img src="https://blog.codinghorror.com/content/images/2017/01/1u-heatsink-copper-vs-alu.jpg" alt=""></p>

<p>Copper is significantly more expensive, plus heavier and harder to work with, so it's generally easier to throw an ever-larger mass of aluminum at the cooling problem when you can. But when space is a constraint, as it is with a 1U server, copper dissipates more heat <a href="http://www.ecnmag.com/article/2010/04/comparing-impact-different-heat-sink-materials-cooling-performance">in the same form factor</a>.</p>

<p>The famous "Ninja" CPU cooler <a href="http://www.silentpcreview.com/article805-page2.html">came in identical copper and aluminum versions</a> so we can compare apples to apples:</p>

<ul>
<li>Aluminum Ninja &mdash; 24C rise over ambient</li>
<li>Copper Ninja &mdash; 17C rise over ambient</li>
</ul>

<p>You can scale the load and the resulting watts of heat by spinning up MPrime threads for the exact number of cores you want to "activate", so that's how I tested:</p>

<ul>
<li>Aluminum heatsink &mdash; stable at 170w (mprime threads=4), but heat warnings with 190w (mprime threads=5)</li>
<li>Copper heatsink &mdash; stable at 190w (mprime threads=5) but heat warnings with 230w (mprime threads=6)</li>
</ul>

<p>Each run has to be overnight to be considered successful.  This helped, noticeably. But we need more.</p>

<h4 id="betterthermalinterface">Better Thermal Interface</h4>

<p>When it comes to server builds, I stick with the pre-applied grey thermal interface pad that comes on the heatsinks. But out of boredom and a desire to experiment, I &hellip;</p>

<ul>
<li>Removed the copper heatsink.</li>
<li>Used isopropyl alcohol to clean both CPU and heatsink.</li>
<li>Applied fancy "Ceramique" thermal compound I have on hand, <a href="https://www.pugetsystems.com/labs/articles/Thermal-Paste-Application-Techniques-170/">using an X shape pattern</a>.</li>
</ul>

<p><img src="https://blog.codinghorror.com/content/images/2017/01/applying-thermal-paste.jpg" alt=""></p>

<p>I wasn't expecting any change at all, but to my surprise with the new TIM applied <strong>it took 5x longer to reach throttle temps</strong> with mprime threads=6. Before, it would thermally throttle within a minute of launching the test, and after it took ~10 minutes to reach that same throttle temp. The difference was noticeable. </p>

<p>That's a surprisingly good outcome, and it tells us the default grey goop that comes pre-installed on heatsinks is ... not great. Per <a href="http://skinneelabs.com/2011-thermal-paste-review-comparison/3/">this 2011 test</a>, the difference between worst and best thermal compounds is 4.3&deg;C.</p>

<p>But as Dan once bravely noted <a href="http://www.dansdata.com/goop.htm">while testing Vegemite as a thermal interface material</a>:</p>

<blockquote>
  <p>If your PC's so marginal that a CPU running three or four degrees Celsius warmer will crash it [or, for modern CPUs, cause the processor to auto-throttle itself and substantially reduce system performance], the solution is not to try to edge away from the precipice with better thermal compound. It's to make a big change to the cooling system, or just lower the darn clock speed.</p>
</blockquote>

<p>An improved thermal interface just gets you there <em>faster</em> (or slower); it doesn't address the underlying problem. So we're not done here.</p>

<h4 id="ductedairflow">Ducted Airflow</h4>

<p>Most, but not all, of the SuperMicro cases I've used have included a basic fan duct / shroud that lays across the central fans and the system. Given that the case fans are pretty much directly in front of the CPU anyway, I've included the shroud in the builds out of a sense of completeness more than any conviction that it was doing anything for the cooling performance.</p>

<p>This particular server case, though, did <em>not</em> include a fan duct. I didn't think much about it at the time, but considering the heat stress this 6-core CPU and its 250 watt heat generation was putting on our 1U build, I decided I should build a quick duct out of card stock and test it out.</p>

<p><img src="https://blog.codinghorror.com/content/images/2017/01/server-duct-testing.jpg" alt=""></p>

<p>(I know, I know, it's a super janky duct! But I was prototyping!)</p>

<p>Sure enough, this duct, combined with the previous heatsink and TIM changes, enabled the server to <strong>remain stable overnight with a full MPrime run of 12 threads.</strong></p>

<p><img src="https://blog.codinghorror.com/content/images/2017/01/chuck_norris_approves.gif" alt=""></p>

<p>I think we've certainly demonstrated the surprising (to me, at least) value of fan shrouds. But before we get too excited, let's consider one last thing.</p>

<h4 id="definecpuload">Define "CPU Load"</h4>

<p>Sometimes you get so involved with solving the problem at hand that you forget to consider whether you are, in fact, solving the <em>right</em> problem.</p>

<p>In these tests, we defined 100% CPU load using MPrime. Some people claim MPrime is more of a <a href="https://en.wikipedia.org/wiki/Power_virus">power virus</a> than a real load test, because it exerts so much heat pressure on the CPUs. I initially dismissed these claims since I've used MPrime (and its Windows cousin, Prime95) for almost 20 years to test CPU stability, and it's never let me down.</p>

<p>But I <a href="http://www.overclock.net/t/1510388/haswell-e-overclock-leaderboard-owners-club/2390#post_22900116">did more research</a> and I found that MPrime, since 2011, uses <strong>AVX2</strong> instructions extensively on newer Intel CPUs:</p>

<blockquote>
  <p>The newer versions of Prime load in a way that they are only safe to run at near stock settings. The server processors actually downclock when AVX2 is detected to retain their TDP rating. On the desktop we're free to play and the thing most people don't know is how much current these routines can generate. It can be lethal for a CPU to see that level of current for prolonged periods.</p>
  
  <p>&hellip;</p>
  
  <p>That's why most stress test programs alternate between different data pattern types. Depending on how effective the rotation is, and how well that pattern causes issues for the system timing margin, it will, or will not, catch potential for instability. So it's wise not to hang one's hat on a single test type. </p>
</blockquote>

<p>This explains why I saw such a large discrepancy between other CPU load programs like BurnP6 and MPrime.</p>

<p>MPrime does an amazing job of generating the type of CPU load that causes maximum heat pressure. But unless your servers regularly chew through <a href="http://superuser.com/questions/981466/in-prime95-why-do-small-ffts-generate-the-most-heat-despite-cpu-at-100-for-al/981477#981477">zillions of especially power-hungry AVX2 instructions</a> this may be completely unrepresentative of any real world load your server would <em>actually see</em>.</p>

<h4 id="yourownpersonalinferno">Your Own Personal Inferno</h4>

<p>Was this overkill? Probably. Even with the aluminum heatsink, no change to thermal interface material, and zero ducting, we'd probably see no throttling under normal use in our server rack. But I wanted to be <em>sure</em>. Completely sure.</p>

<p>Is this extreme? Putting 140 TDP of CPU heat in a 1U server? Not really. Nick at Stack Overflow told me they just put two 22 core, 145W TDP Xeon 2699v4 CPUs <em>and</em> four 300W TDP GPUs in a single Dell C4130 1U server. I'd sure hate to be in the room when those fans spin up. I'm also a little afraid to find out what happens if you run MPrime plus full GPU load on that box.</p>

<p>Servers are an admittedly rare example of big CPU performance heat and size tradeoffs, one of the few left. It is fun to play at the extremes, but the SoC inside your phone makes the same tradeoffs on a smaller scale. <strong>Tiny infernos in our pockets</strong>, each and every one.</p>

<table>  
<tr><td class="welovecodinghorror">[advertisement] At Stack Overflow, we put developers first. We already help you find answers to your tough coding questions; now let us help you <a href="http://careers.stackoverflow.com" rel="nofollow">find your next job</a>.</td></tr>  
</table>]]></content:encoded></item><item><title><![CDATA[Let's Encrypt Everything]]></title><description><![CDATA[<p>I'll admit <a href="https://blog.codinghorror.com/should-all-web-traffic-be-encrypted/">I was late</a> to the HTTPS party.</p>

<p><a href="https://letsencrypt.org"><img src="https://blog.codinghorror.com/content/images/2016/11/lets-encrypt-security-details.png" alt="" title=""></a></p>

<p>But post Snowden, and particularly after the result of the last election here in the US, it's clear that <strong>everything on the web should be encrypted by default</strong>.</p>

<p>Why?</p>

<ol>
<li><p>You have <a href="https://blog.codinghorror.com/an-inalienable-right-to-privacy/">an unalienable right to privacy</a>, both in the real world</p></li></ol>]]></description><link>https://blog.codinghorror.com/lets-encrypt-everything/</link><guid isPermaLink="false">8f785109-e761-4081-8690-14c2e7d1b247</guid><dc:creator><![CDATA[Jeff Atwood]]></dc:creator><pubDate>Wed, 23 Nov 2016 00:03:31 GMT</pubDate><content:encoded><![CDATA[<p>I'll admit <a href="https://blog.codinghorror.com/should-all-web-traffic-be-encrypted/">I was late</a> to the HTTPS party.</p>

<p><a href="https://letsencrypt.org"><img src="https://blog.codinghorror.com/content/images/2016/11/lets-encrypt-security-details.png" alt="" title=""></a></p>

<p>But post Snowden, and particularly after the result of the last election here in the US, it's clear that <strong>everything on the web should be encrypted by default</strong>.</p>

<p>Why?</p>

<ol>
<li><p>You have <a href="https://blog.codinghorror.com/an-inalienable-right-to-privacy/">an unalienable right to privacy</a>, both in the real world and online. And <strong>without HTTPS you have zero online privacy</strong> &ndash; from anyone else on your WiFi, from your network provider, from website operators, from large companies, from the government.</p></li>
<li><p><strong>The performance penalty of HTTPS is gone</strong>, in fact, HTTPS arguably <a href="http://blog.httpwatch.com/2015/01/16/a-simple-performance-comparison-of-https-spdy-and-http2/">performs <em>better</em> than HTTP on modern devices</a>.</p></li>
<li><p><strong>Using HTTPS means nobody can tamper with the content in your web browser.</strong> This was a bit of an abstract concern five years ago, but these days, there are more and more instances of upstream providers actively mucking with the data that passes through their pipes. For example, if Comcast detects you have a copyright strike, they'll <a href="http://arstechnica.com/tech-policy/2013/02/heres-what-an-actual-six-strikes-copyright-alert-looks-like/">insert banners into your web content</a> &hellip; <em>all</em> your web content! And that's what the good guy scenario looks like &ndash; or at least a corporation trying to follow the rules. Imagine what it looks like when someone, or some large company, decides the rules don't apply to them?</p></li>
</ol>

<p>So, how do you as an end user "use" encryption on the web? Mostly, you lobby for the websites you use regularly to adopt it. And it's working. In the last year, the use of HTTPS by default on websites <a href="https://snyk.io/blog/https-breaking-through/">has doubled</a>.</p>

<p><img src="https://blog.codinghorror.com/content/images/2016/11/https-share-top-500k-sites.png" alt=""></p>

<p>Browsers can help, too. By January 2017, Google Chrome will show this alert in the UI when a login or credit card form is displayed on an unencrypted connection:</p>

<p><img src="https://blog.codinghorror.com/content/images/2016/11/chrome-insecure.jpg" alt=""></p>

<p>Additionally, Google is throwing their considerable weight behind this effort by <a href="https://webmasters.googleblog.com/2014/08/https-as-ranking-signal.html">ranking non-encrypted websites lower in search results</a>.</p>

<p>But there's another essential part required for encryption to work on <em>any</em> websites &ndash; <strong>the HTTPS certificate</strong>. Historically these certificates have been <a href="https://blog.codinghorror.com/digital-certificates-do-they-work/">issued by certificate authorities</a>, and they were at least $30 per year per website, sometimes hundreds of dollars per year. Without that required cash each year, without the SSL certificate that you must re-purchase every year in perpetuity &ndash; you can't encrypt <em>anything</em>.</p>

<p>That is, until <a href="https://letsencrypt.org/">Let's Encrypt</a> arrived on the scene.</p>

<p><a href="https://letsencrypt.org/"><img src="https://blog.codinghorror.com/content/images/2016/11/lets-encrypt-banner.jpg" alt="" title=""></a></p>

<p>Let's Encrypt is a 501.3(c)(3) non-profit organization supported by the Linux Foundation. They've been in beta for about a year now, and to my knowledge they are the only reliable, official free source of SSL certificates that has ever existed.</p>

<p>However, <strong>because Let's Encrypt is a non-profit organization</strong>, not owned by any company that must make a profit from each SSL certificate they issue, they <a href="https://www.generosity.com/community-fundraising/make-a-more-secure-web-with-let-s-encrypt">need our support</a>:</p>

<iframe width="560" height="315" src="https://www.youtube.com/embed/SmOWzKLTODA" frameborder="0" allowfullscreen></iframe>

<p>As a company, we've donated a <a href="https://community.letsencrypt.org/">Discourse hosted support community</a>, and a cash amount that represents how much we would have paid in a year to one of the existing for-profit certificate authorities to set up HTTPS for all the <a href="https://discourse.org">Discourse</a> websites we host.</p>

<p>I urge you to do the same:</p>

<ul>
<li><p>Estimate how much you would have paid for any free SSL certificates you obtained from Let's Encrypt, and <a href="https://letsencrypt.org/donate/">please donate that amount</a> to Let's Encrypt.</p></li>
<li><p>If you work for a large company, urge them to <a href="https://letsencrypt.org/become-a-sponsor/">sponsor Let's Encrypt</a> as a fundamental cornerstone of a safe web.</p></li>
</ul>

<p>If you believe in an unalienable right to privacy on the Internet for every citizen in every nation, <em>please</em> support Let's Encrypt. </p>

<table>  
<tr><td class="welovecodinghorror">  
[advertisement] <a href="http://careers.stackoverflow.com" rel="nofollow">Find a better job the Stack Overflow way</a> - what you need when you need it, no spam, and no scams.
</td></tr>  
</table>]]></content:encoded></item><item><title><![CDATA[Your Digital Pinball Machine]]></title><description><![CDATA[<p>I've had something of an obsession with digital pinball for <a href="https://blog.codinghorror.com/pc-pinball-sims/">years</a> now. That recently culminated in me buying <a href="http://virtuapin.net/index.php?main_page=product_info&amp;products_id=92">a Virtuapin Mini</a>.</p>

<p><a href="http://virtuapin.net/index.php?main_page=product_info&amp;products_id=92"><img src="https://blog.codinghorror.com/content/images/2016/11/virtuapin-mini-screens.jpg" alt="" title=""></a></p>

<p>OK, yes, it's an extravagance. There's no question. But in my defense, it is a minor extravagance relative to a real pinball machine. </p>

<p><img src="https://blog.codinghorror.com/content/images/2016/11/virtuapin-mini-vs-real-pinball.jpg" alt=""></p>

<p>The mini is much smaller than</p>]]></description><link>https://blog.codinghorror.com/your-digital-pinball-machine/</link><guid isPermaLink="false">38dc7251-9ad2-4665-b179-7b5a34fc10c8</guid><dc:creator><![CDATA[Jeff Atwood]]></dc:creator><pubDate>Wed, 02 Nov 2016 20:01:47 GMT</pubDate><content:encoded><![CDATA[<p>I've had something of an obsession with digital pinball for <a href="https://blog.codinghorror.com/pc-pinball-sims/">years</a> now. That recently culminated in me buying <a href="http://virtuapin.net/index.php?main_page=product_info&amp;products_id=92">a Virtuapin Mini</a>.</p>

<p><a href="http://virtuapin.net/index.php?main_page=product_info&amp;products_id=92"><img src="https://blog.codinghorror.com/content/images/2016/11/virtuapin-mini-screens.jpg" alt="" title=""></a></p>

<p>OK, yes, it's an extravagance. There's no question. But in my defense, it is a minor extravagance relative to a real pinball machine. </p>

<p><img src="https://blog.codinghorror.com/content/images/2016/11/virtuapin-mini-vs-real-pinball.jpg" alt=""></p>

<p>The mini is much smaller than a normal pinball machine, so it's easier to move around, takes up less space, and is less expensive. Plus <strong>you can emulate every pinball machine, ever!</strong> The <a href="http://virtuapin.net/index.php?main_page=product_info&amp;products_id=92">Virtuapin Mini</a> is a custom $3k build centered around three screens:</p>

<ul>
<li>27" main playfield (HDMI)</li>
<li>23" backglass (DVI)</li>
<li>8" digital matrix (USB LCD)</li>
</ul>

<p>Most of the magic is in those screens, and whether the pinball sim in question allows you to arrange the three screens in its advanced settings, usually by enabling a "cabinet" mode.</p>

<p><img src="https://blog.codinghorror.com/content/images/2016/11/virtuapin-three-monitors-size-and-position.png" alt=""></p>

<p>Let me give you an internal tour. Open the front coin door and detach the two internal nuts for the front bolts, which are finger tight. Then remove the metal lockdown bar and slide the tempered glass out.</p>

<p><img src="https://blog.codinghorror.com/content/images/2016/11/virtuapin-mini-lockdown-bar.jpg" alt=""></p>

<p>The most uniquely pinball item in the case is right at the front. This <a href="http://virtuapin.net/index.php?main_page=product_info&amp;cPath=8&amp;products_id=105">Digital Plunger Kit</a> connects the 8 buttons (2 on each side, 3 on the front, 1 on the bottom) and includes an <strong>analog tilt sensor</strong> and <strong>analog plunger sensor</strong>. All of which shows up as a standard game controller in Windows.</p>

<p><img src="https://blog.codinghorror.com/content/images/2016/11/virtuapin-mini-control-board-1.jpg" alt=""></p>

<p>On the left front side, the audio amplifier and left buttons.</p>

<p><img src="https://blog.codinghorror.com/content/images/2016/11/virtuapin-mini-left-front.jpg" alt=""></p>

<p>On the right front side, the digital plunger and right buttons.</p>

<p><img src="https://blog.codinghorror.com/content/images/2016/11/virtuapin-mini-right-front.jpg" alt=""></p>

<p>The 27" playfield monitor is mounted using a clever rod assembly to the standard VESA mount on the back, so we can easily rotate it up to work on the inside as needed.</p>

<p><img src="https://blog.codinghorror.com/content/images/2016/11/virtuapin-mini-monitor-raised.jpg" alt=""></p>

<p>To remove the playfield, disconnect the power cord and the HDMI connector. Then lift it up and out, and you now have complete access to the interior.</p>

<p><img src="https://blog.codinghorror.com/content/images/2016/11/virtuapin-mini-interior.jpg" alt=""></p>

<p>Notice the large down-firing subwoofer mounted in the middle of the body, as well as the ventilation holes. The PC "case" is just a back panel, and the power strip is <a href="https://www.amazon.com/dp/B000P1QJXQ/?tag=codihorr-20">the Smart Strip kind</a> where it auto-powers everything based on the PC being powered on or off. The actual power switch is on the bottom front right of the case.</p>

<p><img src="https://blog.codinghorror.com/content/images/2016/11/virtuapin-mini-backglass-speakers.jpg" alt=""></p>

<p><img src="https://blog.codinghorror.com/content/images/2016/11/virtuapin-mini-playfield.jpg" alt=""></p>

<p>Powering it up and getting all three screens configured in the pinball sim of your choice results in &hellip; <em>magic</em>.</p>

<iframe width="560" height="315" src="https://www.youtube.com/embed/7TpqHAU9oxk" frameborder="0" allowfullscreen></iframe>

<p>It is a <strong>thoroughly professional build</strong>, as you'd expect from a company that has been building these pinball rigs for the last decade. It uses real wood (not MDF), tempered glass, and authentic metal pinball parts throughout.</p>

<p>I was truly impressed by the build quality of this machine. Paul of Virtuapin said they're on roughly version four of the machine and it shows. It's over 100 pounds fully assembled and arrives on a shipping pallet. I can only imagine how heavy the full size version would be!</p>

<p>That said, I do have some tweaks I recommend:</p>

<ul>
<li><p><strong>Make <em>absolutely sure</em> you get <a href="https://blog.codinghorror.com/the-ips-lcd-revolution/">an IPS panel</a> as your 27" playfield monitor</strong>. As arrived, mine had a TN panel and while it was playable if you stood directly in front of the machine, playfield visibility was pretty dire outside that narrow range. I dropped in the <a href="https://www.amazon.com/dp/B00KYCSRSG/?tag=codihorr-20">BenQ GW2765HT</a> to replace the GL2760H that was in there, and I was golden. If you plan to order, I would definitely talk to Paul at VirtuaPin and specify that you want this IPS display even if it costs a little more. The 23" backglass monitor is also TN but the viewing angles are reasonable-ish in that orientation and the backglass is mostly for decoration anyway.</p></li>
<li><p>The improved display has a 1440p resolution compared to the 1080p originally shipped, so you might want to upgrade from the GeForce 750 Ti video card to the <a href="https://www.amazon.com/dp/B01MF7EQJZ/?tag=codihorr-20">just-released 1050 Ti</a>. This is not strictly required, as I found the 750 Ti an excellent performer even at the higher resolution, but I plan to play only fully 3D pinball sims and the 1050 Ti <a href="http://www.pcworld.com/article/3134528/components-graphics/nvidia-geforce-gtx-1050-and-gtx-1050-ti-review-the-new-budget-gaming-champions.html">gets excellent reviews</a> for $140, so I went for it.</p></li>
<li><p>Internally everything is exceptionally well laid out, the only very minor improvement I'd recommend is connecting the rear exhaust fan to the motherboard header so its fan speed can be dynamically controlled by the computer rather than being at full power all the time.</p></li>
<li><p>On the <a href="http://virtuapin.net/index.php?main_page=product_info&amp;products_id=92">Virtuapin website order form</a> the PC they provide sounds quite outdated, but don't sweat it: I picked the lowest options thinking I would have to replace it all, and they shipped me a Haswell based quad-core PC with 8GB RAM and a 256GB SSD, even though those options weren't even on the order form.</p></li>
</ul>

<p>I realize $3k (plus palletized shipping) is a lot of money, but I estimate it would cost you at <em>least</em> $1500 in parts to build this machine, plus a month of personal labor. Provided you get the IPS playfield monitor, this is a solidly constructed "real" pinball machine, and if you're into digital pinball like I am, it's an absolute <em>joy</em> to play and a good deal for what you actually get. As Ferris Bueller once said:</p>

<iframe width="560" height="315" src="https://www.youtube.com/embed/0wALArd2rvo" frameborder="0" allowfullscreen></iframe>

<p>If you'd like to experiment with this and don't have three grand burning a hole in your pocket, 90% of digital pinball simulation is <strong>a widescreen display in portrait mode</strong>. Rotate one of your monitors, add another monitor if you're feeling extra fancy, and give it a go.</p>

<p><img src="https://blog.codinghorror.com/content/images/2016/11/pinball-with-rotated-monitor.jpg" alt=""></p>

<p>As for software, most people talk about <a href="https://en.wikipedia.org/wiki/Visual_Pinball">Visual Pinball</a> for these machines, and it works. But the combination of janky hacked-together 2D bitmap technology used in the gameplay, and the fact that all those designs are ripoffs that pay nothing in licensing back to the original pinball manufacturers really bothers me.</p>

<p>I prefer <a href="http://store.steampowered.com/app/238260/">Pinball Arcade</a> in DirectX 11 mode, which is <a href="https://imgur.com/a/vPQvh">downright beautiful</a>, easily (and legally!) obtainable via Steam and offers a stable of 60+ incredible officially licensed classic pinball tables to choose from, all meticulously recreated in high resolution 3D with excellent physics.</p>

<p><a href="https://imgur.com/a/vPQvh"><img src="https://blog.codinghorror.com/content/images/2016/11/visual-pinball-dx9-vs-dx11.jpg" alt="" title=""></a></p>

<p>As for getting pinball simulations running on your three monitor setup, if you're lucky the game will have a <strong>cabinet mode</strong> you can turn on. Unfortunately, this can be weird due to &hellip; licensing issues. Apparently building a pinball sim on the computer requires entirely different licensing than placing it inside a full-blown pinball cabinet.</p>

<p><a href="http://store.steampowered.com/app/238260/"><strong>Pinball Arcade</strong></a> has a <a href="http://pinballarcadefans.com/showthread.php/10199-DOWNLOAD-Pinball-Arcade-Free-Camera-Mod">nifty camera hack</a> someone built that lets you position three cameras as needed to get the three displays. You will also need the excellent <a href="http://www.x360ce.com/">x360ce program</a> to dynamically map joystick events and buttons to a simulated Xbox 360 controller.</p>

<p><a href="http://store.steampowered.com/app/226980/"><strong>Pinball FX2</strong></a> added a cabinet mode about a year ago, but turning it on requires a special code and you have to send them a picture of your cabinet (!) to get that code. I did, and the cabinet mode works great; just enter your code, specify the coordinates of each screen in the settings and you are good to go. While these tables definitely have arcadey physics, I find them great fun and there are a ton to choose from. </p>

<p><img src="https://blog.codinghorror.com/content/images/2016/11/virtapin-mini-portal-2.JPG" alt=""></p>

<p><a href="http://store.steampowered.com/app/287900/"><strong>Pro Pinball Timeshock Ultra</strong></a> is unique because it's originally from 1997 and was one of the first "simulation" level pinball games. The current rebooted version is still pre-rendered graphics rather than 3D, but the client downloads the necessary gigabytes of pre-rendered content at your exact screen resolution and it looks amazing.</p>

<p><img src="https://blog.codinghorror.com/content/images/2016/11/pro-pinball-timeshock-ultra-4k-1.jpg" alt=""></p>

<p>Timeshock has explicit cabinet support in the settings and via command line tweaks. Also, in cabinet mode, when choosing table view, you want the bottom left one. Trust me on this! It supports maximum height for portrait cabinet mode.</p>

<p><img src="https://blog.codinghorror.com/content/images/2016/11/pro-pinball-timeshock-best-cabinet-view.jpg" alt=""></p>

<p>Position each window as necessary, then enable fullscreen for each one and it'll snap to the monitor you placed it on. It's "only" one table, but arguably the most classic of all pinball sims. I sincerely hope they continue to reboot the rest of the Pro Pinball series, including Big Race USA which is my favorite.</p>

<p>I've always loved pinball machines, even though they struggled to keep up with digital arcade games. In some ways I view my current project, <a href="https://discourse.org">Discourse</a>, as a similarly analog experience attempting to bridge the gap to the modern digital world:</p>

<blockquote>
  <p>The fantastic 60 minute documentary <a href="http://www.tilt-movie.com/">Tilt: The Battle to Save Pinball</a> has so many parallels with what we're trying to do for forum software.</p>
</blockquote>

<iframe width="560" height="315" src="https://www.youtube.com/embed/JIolBJwH9p0" frameborder="0" allowfullscreen></iframe>

<blockquote>
  <p>Pinball is threatened by Video Games, in the same way that Forums are threatened by Facebook and Twitter and Tumblr and Snapchat. They're considered old and archaic technology. They've stopped being sexy and interesting relative to what else is available.</p>
  
  <p>Pinball was forced to reinvent itself several times throughout the years, from mechanical, to solid state, to computerized. And the defining characteristic of each "era" of pinball is that the new tables, once you played them, made all the previous pinball games seem immediately obsolete because of all the new technology.</p>
  
  <p>The <a href="https://en.wikipedia.org/wiki/Pinball_2000">Pinball 2000</a> project was an attempt to invent the next generation of pinball machines:</p>
</blockquote>

<iframe width="560" height="315" src="https://www.youtube.com/embed/Vt0OARfqeks" frameborder="0" allowfullscreen></iframe>

<blockquote>
  <blockquote>
    <p>It wasn't a new feature, a new hardware set, it was everything new. We have to get everything right. We thought that we had reinvented the wheel. And in many respects, we had.</p>
  </blockquote>
  
  <p>This is exactly what we want to do with <a href="https://discourse.org">Discourse</a> &ndash; build a forum experience so advanced that playing will make all previous forum software seem immediately obsolete. </p>
  
  <p>Discourse aims to save forums and make them relevant and useful to a whole new generation.</p>
</blockquote>

<p>So if I seem a little more nostalgic than most about pinball, perhaps a little <em>too</em> nostalgic at times, <a href="https://blog.codinghorror.com/the-only-truly-failed-project/">maybe that's why</a>. </p>

<table>  
<tr><td class="welovecodinghorror">  
[advertisement] Building out your tech team? <a href="http://careers.stackoverflow.com/products" rel="nofollow">Stack Overflow Careers</a> helps you hire from the largest community for programmers on the planet. We built our site with developers like you in mind.
</td></tr>  
</table>]]></content:encoded></item><item><title><![CDATA[Can Software Make You Less Racist?]]></title><description><![CDATA[<p>I don't think we computer geeks appreciate how profoundly the rise of the smartphone, and Facebook, has changed the Internet audience. It's something that really only happened in <strong>the last five years</strong>, as smartphones and data plans dropped radically in price and became accessible &ndash; and addictive &ndash; to huge</p>]]></description><link>https://blog.codinghorror.com/can-software-make-you-less-racist/</link><guid isPermaLink="false">76729083-688d-4f6f-b701-44328f63e63d</guid><dc:creator><![CDATA[Jeff Atwood]]></dc:creator><pubDate>Thu, 25 Aug 2016 07:52:37 GMT</pubDate><content:encoded><![CDATA[<p>I don't think we computer geeks appreciate how profoundly the rise of the smartphone, and Facebook, has changed the Internet audience. It's something that really only happened in <strong>the last five years</strong>, as smartphones and data plans dropped radically in price and became accessible &ndash; and addictive &ndash; to huge segments of the population.</p>

<p>People may have regularly <em>used</em> computers in 2007, sure, but that is a very different thing than having your computer in your pocket, 24/7, with you every step of every day, fully integrated into your life. As Jerry Seinfeld noted in 2014:</p>

<iframe width="560" height="315" src="https://www.youtube.com/embed/xR1ckgXN8G0" frameborder="0" allowfullscreen></iframe>

<blockquote>
  <p>But I know you got your phone. Everybody here's got their phone. There's not one person here who doesn't have it. You better have it &hellip; you gotta have it. Because there is no <em>safety</em>, there is no <em>comfort</em>, there is no <em>security</em> for you in this life any more &hellip; unless when you're walking down the street you can feel a <em>hard rectangle in your pants</em>.</p>
</blockquote>

<p>It's an addiction that is new to millions &ndash; but eerily familiar to us.</p>

<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">From &quot;only nerds will use the Internet&quot; to &quot;everyone stares at their smartphones all day long!&quot; in 20 years. Not bad, team :-).</p>&mdash; Marc Andreessen (@pmarca) <a href="https://twitter.com/pmarca/status/556161530455023617">January 16, 2015</a></blockquote>  

<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<p>The good news is that, at this moment, every human being is far more connected to their fellow humans than any human has ever been in the entirety of recorded history.</p>

<p>Spoiler alert: that's also the bad news. </p>

<p><a href="https://nextdoor.com/">Nextdoor</a> is a Facebook-alike focused on specific neighborhoods. The idea is that you and everyone else on your block would join, and you can privately discuss local events, block parties, and generally hang out like neighbors do. It's a good idea, and my wife started using it a fair amount in the last few years. We feel more connected to our neighbors through the service. But one unfortunate thing you'll find out when using Nextdoor is that <strong>your neighbors are probably a <em>little bit racist</em>.</strong></p>

<p>I don't use Nextdoor myself, but I remember Betsy specifically complaining about the casual racism she saw there, and I've also seen it mentioned several times on Twitter by people I follow. They're <a href="http://www.eastbayexpress.com/oakland/racial-profiling-via-nextdoorcom/Content?oid=4526919">not the only ones</a>. It became so epidemic that Nextdoor got a reputation for being a <a href="http://fusion.net/story/106341/nextdoor-the-social-network-for-neighbors-is-becoming-a-home-for-racial-profiling/">racial profiling hub</a>. Which is obviously not good.</p>

<p>Social networking historically trends young, with the early adopters. Facebook launched as a site for college students. But as those networks grow, they inevitably age. They begin to include older people. And those older people will, statistically speaking, be more racist. I apologize if this sounds ageist, but let me ask you something: do you consider your parents a little racist? I will personally admit that <strong>one of my parents is definitely someone I would label a little bit racist</strong>. It's &hellip; not awesome.  </p>

<p><a href="http://theoatmeal.com/comics/gay_marriage"><img src="https://blog.codinghorror.com/content/images/2016/08/gay_marriage.png" alt="" title=""></a></p>

<p>The older the person, the more likely they are to have these "old fashioned" notions that the mere presence of differently-colored people on your block is inherently suspicious, and marriage should <a href="http://en.wikipedia.org/wiki/Public_opinion_of_same-sex_marriage_in_the_United_States#By_age">probably be defined as between a man and a woman</a>.  </p>

<blockquote>
  <p>In one meta-analysis by Jeffrey Lax and Justin Phillips of Columbia University, a majority of 18–29 year old Americans in 38 states support same sex marriage while in only 6 states do less than 45% of 18–29 year olds support same-sex marriage. At the same time not a single state shows support for same-sex marriage greater than 35% amongst those 64 and older</p>
</blockquote>

<p>The idea that regressive social opinions correlate with age isn't an opinion; it's <a href="http://en.wikipedia.org/wiki/Public_opinion_of_same-sex_marriage_in_the_United_States#By_age">a statistical fact</a>.  </p>

<blockquote>
  <p>Support for same-sex marriage in the U.S.</p>

<pre><code>18 - 29 years old    65%
30 - 49 years old    54%
50 - 64 years old    45%
65+ years old        39%
</code></pre>
</blockquote>

<p>Are there progressive septuagenarians? Sure there are. But not many.</p>

<p>To me, failure to support same-sex marriage is as inconceivable as failing to support interracial marriage. Which was <em>not</em> that long ago, to the tune of the late 60s and early 70s. If you want some truly hair-raising reading, <a href="http://en.wikipedia.org/wiki/Loving_v._Virginia">try Loving v. Virginia on for size</a>. Because Virginia <a href="http://www.virginia.org/virginiaisforlovers/">is for lovers</a>. Just not those kind of lovers, 49 years ago. In the interests of full disclosure, I am 45 years old, and I graduated from the University of Virginia.</p>

<p>With Nextdoor, you're more connected with your neighbors than ever before. But through that connection you may also find out some regressive things about your neighbors that you'd never have discovered in years of the traditional daily routine of polite waves, hellos from the driveway, and casual sidewalk conversations. </p>

<p>To their immense credit, rather than accepting this status quo, Nextdoor did what any self-respecting computer geek would do: they <strong>changed their software</strong>. Now, when you attempt to post about a crime or suspicious activity &hellip;</p>

<p><img src="https://blog.codinghorror.com/content/images/2016/08/nextdoor-race-1.png" alt=""></p>

<p><img src="https://blog.codinghorror.com/content/images/2016/08/nextdoor-race-2.png" alt=""></p>

<p>&hellip; you get <a href="https://blog.codinghorror.com/the-just-in-time-theory/">smart, just in time nudges</a> to think less about race, and more about <em>behavior</em>.</p>

<p>The results were <a href="https://www.buzzfeed.com/carolineodonovan/nextdoor-rolls-out-product-fix-it-hopes-will-stem-racial-pro">striking</a>:</p>

<blockquote>
  <p>Nextdoor claims this new multi-step system has, so far, reduced instances of racial profiling by 75%. It’s also decreased considerably the number of notes about crime and safety. During testing, the number of crime and safety issue reports abandoned before being published rose by 50%. “It’s a fairly significant dropoff,” said Tolia, “but we believe that, for Nextdoor, quality is more important than quantity.”</p>
</blockquote>

<p>I'm a huge fan of designing software to help nudge people, at <em>exactly the right time</em>, to <a href="https://blog.codinghorror.com/what-if-we-could-weaponize-empathy/">be their better selves</a>. And this is a textbook example of doing it right.</p>

<p>Would using Nextdoor and encountering these dialogs make my aforementioned parent a little bit less racist? Probably not. But I like to think they would stop for at least a moment and <strong>consider the importance of focusing on the <em>behavior</em> that is problematic, rather than the individual person</strong>. This is a philosophy I promoted on Stack Overflow, I continue to promote with Discourse, and I reinforce daily with our three kids. You never, ever judge someone by what they look like. Consider <em>what they do</em> instead. </p>

<p>If you were getting excited about the prospect of validating <a href="https://en.wikipedia.org/wiki/Betteridge%27s_law_of_headlines">Betteridge's Law</a> yet again, I'm sorry to disappoint you. I truly do believe software, properly designed software, can not only help us <a href="https://blog.codinghorror.com/civilized-discourse-construction-kit/">be more civil to each other</a>, but can also help people &ndash; maybe even people you love &ndash; <em>behave</em> a bit less like racists online. </p>

<table>  
<tr><td class="welovecodinghorror">  
[advertisement] At Stack Overflow, we help developers learn, share, and grow. Whether you’re looking for your next dream job or looking to build out your team, <a href="http://careers.stackoverflow.com" rel="nofollow">we've got your back</a>.
</td></tr>  
</table>]]></content:encoded></item><item><title><![CDATA[The Raspberry Pi Has Revolutionized Emulation]]></title><description><![CDATA[<p>Every geek goes through a phase where they discover emulation. It's practically a <a href="https://blog.codinghorror.com/rediscovering-arcade-nostalgia/">rite of passage</a>.</p>

<blockquote>
  <p>I think I spent most of my childhood &ndash; and a large part of my life as a young adult &ndash; <b>desperately wishing I was in a video game arcade.</b> When I finally obtained</p></blockquote>]]></description><link>https://blog.codinghorror.com/the-raspberry-pi-has-revolutionized-emulation/</link><guid isPermaLink="false">3d34ef60-a2a4-46e7-b134-236ca0653afb</guid><dc:creator><![CDATA[Jeff Atwood]]></dc:creator><pubDate>Sun, 24 Jul 2016 22:12:40 GMT</pubDate><content:encoded><![CDATA[<p>Every geek goes through a phase where they discover emulation. It's practically a <a href="https://blog.codinghorror.com/rediscovering-arcade-nostalgia/">rite of passage</a>.</p>

<blockquote>
  <p>I think I spent most of my childhood &ndash; and a large part of my life as a young adult &ndash; <b>desperately wishing I was in a video game arcade.</b> When I finally obtained my driver's license, my first thought wasn't about the girls I would take on dates, or the road trips I'd take with my friends. Sadly, no. I was thrilled that I could drive myself to the arcade any time I wanted. </p>
</blockquote>

<p>My two arcade emulator builds in 2005 satisfied my itch thoroughly. I recently took my son Henry to the <a href="http://www.caextreme.org/">California Extreme expo</a>, which features almost every significant pinball and arcade game ever made, live and in person and real. He enjoyed it so much that I found myself again yearning to share that part of our history with my kids &ndash; in a suitably emulated, arcade form factor.</p>

<p>Down, down the rabbit hole I went again:</p>

<p><a href="http://www.hybridarcades.com/"><img src="https://blog.codinghorror.com/content/images/2016/08/bartop-ebay.jpg" alt="" title=""></a></p>

<p><a href="https://www.arcademinis.com/sunshop/index.php?l=product_detail&amp;p=60"><img src="https://blog.codinghorror.com/content/images/2016/07/bartop-vertical-jamma.jpg" alt="" title=""></a></p>

<p><a href="https://shop.pimoroni.com/collections/picade-and-arcade/products/picade"><img src="https://blog.codinghorror.com/content/images/2016/07/picade.jpg" alt="" title=""></a></p>

<p><a href="http://forum.arcadecontrols.com/index.php?topic=122366.0"><img src="https://blog.codinghorror.com/content/images/2016/07/bartop-bubble-bobble.jpg" alt="" title=""></a></p>

<p><img src="https://blog.codinghorror.com/content/images/2016/07/bartop-cocktail.jpg" alt=""></p>

<p>I discovered that emulation builds are so much <em>cheaper and easier</em> now than they were when I last attempted this a decade ago. Here's why:</p>

<ol>
<li><p><strong>The ascendance of <a href="https://www.raspberrypi.org/">Raspberry Pi</a> has single-handedly revolutionized the emulation scene.</strong> The Pi is now on <a href="https://www.raspberrypi.org/products/raspberry-pi-3-model-b/">version 3</a>, which adds critical WiFi and Bluetooth functionality on top of additional speed. It's fast enough to emulate N64 and PSX and Dreamcast reasonably, all for a whopping $35. Just download the <a href="https://retropie.org.uk/">RetroPie bootable OS</a> on a $10 32GB SD card, slot it into your Pi, and &hellip; well, basically you're done. The distribution comes with some free games on it. Add additional ROMs and game images to taste.</p></li>
<li><p><strong>Chinese all-in-one JAMMA cards</strong> are available everywhere for about $90. <a href="https://www.youtube.com/watch?v=ctN60cYTRdI">Pandora's Box is one "brand"</a>. These things are are an entire 60-in-1 to 600-in-1 arcade on a board, with an ARM CPU and built-in ROMs and everything &hellip; probably completely illegal and unlicensed, of course. You could buy some old broken down husk of an arcade game cabinet, anything at all as long as it's a <a href="https://en.wikipedia.org/wiki/Japan_Amusement_Machine_and_Marketing_Association#Connector_standards">JAMMA compatible arcade game</a> &ndash; a standard introduced in 1985 &ndash; with working monitor and controls. Plug this replacement JAMMA box in, and bam: you now have your own virtual arcade. Or you could build or buy a new JAMMA compatible cabinet; there are hundreds out there to choose from.</p></li>
<li><p><strong>Cheap, quality IPS arcade size LCDs</strong>. The CRTs I used in 2005 may have been truer to old arcade games, but they were a giant pain to work with. They're enormous, heavy, and require a lot of power. Viewing angle and speed of refresh are rather critical for arcade machines, and both are largely solved problems for LCDs at this point, which are light, easy to work with, and sip power for $100 or less.</p></li>
</ol>

<p>Add all that up &ndash; it's not like the price of MDF or arcade buttons and joysticks has changed substantially in the last decade &ndash; and what we have today is a console and arcade emulation wonderland! If you'd like to go down this rabbit hole with me, bear in mind that I've just started, but I do have some specific recommendations.</p>

<p><strong>Get a Raspberry Pi starter kit.</strong> I recommend <a href="http://www.amazon.com/dp/B01D92SSX6/?tag=codihorr-20">this particular starter kit</a>, which includes the essentials: a clear case, heatsinks &ndash; you definitely want small heatsinks on your 3, as it dissipate <a href="http://www.pidramble.com/wiki/benchmarks/power-consumption">almost 4 watts</a> under full load &ndash; and a suitable power adapter. That's $50.</p>

<p><a href="http://www.amazon.com/dp/B01D92SSX6/?tag=codihorr-20"><img src="https://blog.codinghorror.com/content/images/2016/07/raspberry-pi-port-diagram.jpg" alt="" title=""></a></p>

<p><strong>Get a quality SD card.</strong> The primary "drive" on your Pi will be the SD card, so make it a quality one. Based on <a href="http://www.pidramble.com/wiki/benchmarks/microsd-cards">these excellent benchmarks</a>, I recommend the <a href="http://www.amazon.com/dp/B013CP5HCK/?tag=codihorr-20">Sandisk Extreme 32GB</a> or <a href="http://www.amazon.com/dp/B00WR4IJBE/?tag=codihorr-20">Samsung Evo+ 32GB</a> models for best price to peformance ratio. That'll be $15, tops.</p>

<p><strong>Download and install the bootable RetroPie image on your SD card.</strong> It's amazing how far this project has come since 2013, it is now about as close to plug and play as it gets for free, open source software. The install is, <a href="https://github.com/retropie/retropie-setup/wiki/First-Installation">dare I say &hellip; "easy"?</a></p>

<iframe width="560" height="315" src="https://www.youtube.com/embed/xvYX_7iRRI0" frameborder="0" allowfullscreen></iframe>

<p><strong>Decide how much you want to build.</strong> At this point you have a fully functioning emulation brain for well under $100 which is capable of playing literally <em>every significant console and arcade game created prior to 1997</em>. Your 1985 self is probably drunk with power. It is kinda awesome. Stop doing the Safety Dance for a moment and ask yourself these questions:</p>

<ul>
<li><p>What <strong>controls</strong> do you plan to plug in via the USB ports? This will depend heavily on which games you want to play. Beyond the absolute basics of joystick and two buttons, there are Nintendo 64 games (think analog stick(s) required), driving games, spinner and trackball games, multiplayer games, yoke control games (think Star Wars), virtual gun games, and so on.</p></li>
<li><p>What <strong>display</strong> to you plan to plug in via the HDMI port? You could go with a tiny screen and build a handheld emulator, the Pi is certainly small enough. Or you could have no display at all, and jack in via HDMI to any nearby display for whatever gaming jamboree might befall you and your friends. I will say that, for whatever size you build, <em>more display is better</em>. Absolutely go as big as you can in the allowed form factor, though the Pi won't effectively use much more than a 1080p display maximum.</p></li>
<li><p>How much <strong>space</strong> do you want to dedicate to the box? Will it be portable? You could go anywhere from ultra-minimalist &ndash; a control box you can plug into any HDMI screen with a wireless controller &ndash; to a giant 40" widescreen stand up arcade machine with room for four players.</p></li>
<li><p>What's your <strong>budget</strong>? We've only spent under $100 at this point, and great screens and new controllers aren't a whole lot more, but sometimes you want to build from spare parts you have lying around, if you can.</p></li>
<li><p>Do you have the <strong>time</strong> and inclination to build this from parts? Or do you prefer to buy it pre-built?</p></li>
</ul>

<p>These are all your calls to make. You can get some ideas from the pictures I posted at the top of this blog post, or search the web for "Raspberry Pi Arcade" for <a href="http://www.slothygeek.com/6-raspberry-pi-arcade-projects-step-by-step-tutorials/">lots of other ideas</a>.</p>

<p>As a reasonable all-purpose starting point, I recommend <a href="http://www.retrobuiltgames.com/diy-kits-shop/porta-pi-arcade-wood-kit-10-hd/">the Build-Your-Own-Arcade kits</a> from Retro Built Games. From $330 for full kit, to $90 for just the wood case.</p>

<p><img src="https://blog.codinghorror.com/content/images/2016/07/retrobuiltgames-diy-pi-arcade.jpg" alt=""></p>

<p>You could also buy <a href="http://www.amazon.com/dp/B00WAY9848/?tag=codihorr-20">the arcade controls alone</a> for $75, and build out (or buy) a case to put them in.</p>

<p><img src="https://blog.codinghorror.com/content/images/2016/07/arcade-controls-for-pi.jpg" alt=""></p>

<p><img src="https://blog.codinghorror.com/content/images/2016/07/arcade-controls-mdf-case.jpg" alt=""></p>

<p>My "mainstream" recommendation is <strong>a bartop arcade</strong>. It uses a common LCD panel size in the typical horizontal orientation, it's reasonably space efficient and somewhat portable, while still being comfortably large enough for a nice big screen with large speakers gameplay experience, and it supports two players if that's what you want. That'll be about $100 to $300 depending on options.</p>

<p><img src="https://blog.codinghorror.com/content/images/2016/07/bartop-arcade-kit.jpg" alt=""></p>

<p>I remember spending well over $1,500 to build <a href="https://blog.codinghorror.com/rediscovering-arcade-nostalgia/">my old arcade cabinets</a>. I'm excited that it's no longer necessary to invest that much time, effort or money to successfully revisit our arcade past.</p>

<p>Thanks largely to the <a href="http://www.amazon.com/dp/B01D92SSX6/?tag=codihorr-20">Raspberry Pi 3</a> and the <a href="https://retropie.org.uk/">RetroPie project</a>, this is now a simple Maker project you can (and should!) take on in a weekend with a friend or family. For a budget of $100 to $300 &ndash; maybe $500 if you want to get <em>extra</em> fancy &ndash; you can have a pretty great classic arcade and classic console emulation experience. That's way better than I was doing in 2005, even adjusting for inflation.</p>

<table>  
<tr><td class="welovecodinghorror">[advertisement] At Stack Overflow, we put developers first. We already help you find answers to your tough coding questions; now let us help you <a href="http://careers.stackoverflow.com" rel="nofollow">find your next job</a>.</td></tr>  
</table>]]></content:encoded></item><item><title><![CDATA[The Golden Age of x86 Gaming]]></title><description><![CDATA[<p>I've been happy with <a href="https://blog.codinghorror.com/the-2016-htpc-build/">my 2016 HTPC</a>, but the situation has changed, largely because of something I mentioned in passing back in November:</p>

<blockquote>
  <p>The Xbox One and PS4 are <a href="http://www.extremetech.com/gaming/156273-xbox-720-vs-ps4-vs-pc-how-the-hardware-specs-compare">effectively plain old PCs</a>, built on:</p>
  
  <ul>
  <li>Intel Atom class (aka slow) AMD 8-core x86 CPU</li>
  <li>8 GB RAM</li>
  <li>AMD Radeon 77xx</li></ul></blockquote>]]></description><link>https://blog.codinghorror.com/the-golden-age-of-x86-gaming/</link><guid isPermaLink="false">853472d9-e870-4a63-b54d-3bc417830a12</guid><dc:creator><![CDATA[Jeff Atwood]]></dc:creator><pubDate>Fri, 20 May 2016 22:05:59 GMT</pubDate><content:encoded><![CDATA[<p>I've been happy with <a href="https://blog.codinghorror.com/the-2016-htpc-build/">my 2016 HTPC</a>, but the situation has changed, largely because of something I mentioned in passing back in November:</p>

<blockquote>
  <p>The Xbox One and PS4 are <a href="http://www.extremetech.com/gaming/156273-xbox-720-vs-ps4-vs-pc-how-the-hardware-specs-compare">effectively plain old PCs</a>, built on:</p>
  
  <ul>
  <li>Intel Atom class (aka slow) AMD 8-core x86 CPU</li>
  <li>8 GB RAM</li>
  <li>AMD Radeon 77xx / 78xx GPUs</li>
  <li>cheap commodity 512GB or 1TB hard drives (not SSDs)</li>
  </ul>
  
  <p>The <strong>golden age of x86 gaming</strong> is well upon us. That's why the future of PC gaming is looking brighter every day. We can see it coming true in the solid GPU and idle power improvements in Skylake, riding the inevitable wave of x86 becoming the dominant kind of (non mobile, anyway) gaming for the forseeable future.</p>
</blockquote>

<p>And then, the bombshell. It is <a href="http://arstechnica.com/gaming/2016/04/ps4k-neo-details-specs-revealed-rumours/">all but announced</a> that Sony will be upgrading the PS4 this year, no more than three years after it was first introduced &hellip; <strong>just like you would upgrade a PC.</strong></p>

<blockquote>
  <p>Sony may be tight-lipped for now, but it's looking increasingly likely that the company will release an updated version of the PlayStation 4 later this year. So far, the rumoured console has gone under the moniker PS4K or PS4.5, but a new report from gaming site GiantBomb suggests that the codename for the console is "NEO," and it even provides hardware specs for the PlayStation 4's improved CPU, GPU, and higher bandwidth memory.</p>
  
  <ul>
  <li>CPU: 1.6 &rarr; 2.1 Ghz CPU </li>
  <li>GPU: 18 CUs @ 800Mhz &rarr; 36 CUs @ 911Mhz</li>
  <li>RAM: 8GB DDR5 176 GB/s &rarr; 218 GB/s</li>
  </ul>
</blockquote>

<p>In PC enthusiast parlance, you might say Sony just slotted in a new video card, a faster CPU, and slightly higher speed RAM.</p>

<p><a href="http://acommonblog.com/2011/09/the-golden-age-logo-design/"><img src="https://blog.codinghorror.com/content/images/2016/05/goldenage-logo.jpg" alt="" title=""></a></p>

<p>This is old hat for PCs, but to release a new, faster model that is perfectly backwards compatible is almost unprecedented in the console world. I have to wonder if this is partially due to <a href="https://blog.codinghorror.com/i-tried-vr-and-it-was-just-ok/">the intense performance pressure of VR</a>, but whatever the reason, I applaud Sony for taking this step. It's a giant leap towards consoles being more like PCs, and <strong>another sign that the golden age of x86 is really and truly here.</strong></p>

<p>I hate to break this to PS4 enthusiasts, but as big of an upgrade as that is &ndash; and it really is &ndash; it's still nowhere <em>near</em> enough power to drive modern games at 4k. Nvidia's <a href="http://arstechnica.com/gadgets/2016/05/nvidia-gtx-1080-review/">latest and greatest 1080 GTX</a> can only sometimes manage 30fps at 4k. The increase in required GPU power when going from 1080p to 4k is so vast that even the PC "cost is no object" folks who will happily pay $600 for a video card and $1000 for the rest of their box have some difficulty getting there today. Stuffing all that into a $299 box for the masses is going to take quite a few more years.</p>

<p><a href="https://blog.codinghorror.com/our-brave-new-world-of-4k-displays/"><img src="https://blog.codinghorror.com/content/images/2016/05/4k-vs-1080p-1.png" alt="" title=""></a></p>

<p>Still, I like the idea of the PS4 Neo so much that I'm considering buying it myself.  I strongly support this sea change in console upgradeability, even though I swore I'd stick with the Xbox One this generation. To be honest, my Xbox One has been a disappointment to me. I bought the "Elite" edition because it had a hybrid 1TB drive, and then added a 512GB USB 3.0 SSD to the thing and painstakingly moved all my games over to that, and it is <em>still</em> appallingly slow to boot, to log in, to page through the UI, to load games. It's also noisy under load and sounds like a broken down air conditioner even when in low power, background mode. The Xbox One experience is way too often drudgery and random errors instead of the gaming fun it's supposed to be. Although I do unabashedly love the new controller, I feel like the Xbox One is, overall, a worse gaming experience than the Xbox 360 was. And that's sad.</p>

<p>Or maybe I'm just spoiled by PC performance, and the relatively crippled flavor of PC you get in these $399 console boxes. If all evidence points to the golden age of x86 being upon us, why not double down on x86 in the living room? Heck, while I'm at it &hellip; why not <em>triple down?</em></p>

<p><a href="http://www.amazon.com/dp/B01DJ9XS52/?tag=codihorr-20"><img src="https://blog.codinghorror.com/content/images/2016/05/skull-canyon-nuc-case-top.jpg" alt="" title=""></a></p>

<p>This, my friends, is what tripling down on x86 in the living room looks like.</p>

<p>It's <a href="http://www.amazon.com/dp/B01DJ9XS52/?tag=codihorr-20">Intel's latest Skull Canyon NUC</a>. What does that acronym stand for? Too embarrassing to explain. Let's just pretend it means "tiny awesome x86 PC". What's significant about this box is it contains <strong>the first on-die GPU Intel has ever shipped that can legitimately be considered console class</strong>.</p>

<p><a href="http://www.amazon.com/dp/B01DJ9XS52/?tag=codihorr-20"><img src="https://blog.codinghorror.com/content/images/2016/05/skull-canyon-nuc-front-and-back-ports-1.jpg" alt="" title=""></a></p>

<p>It's <a href="http://www.amazon.com/dp/B01DJ9XS52/?tag=codihorr-20">not cheap at $579</a>, but this tiny box bristles with cutting edge x86 tech:</p>

<ul>
<li>Quad-core i7-6770HQ CPU (2.6 Ghz / 3.5 Ghz)</li>
<li>Iris Pro Graphics 580 GPU with 128MB eDRAM</li>
<li>Up to 32GB DDR4-2666 RAM</li>
<li>Dual M.2 PCI x4 SSD slots</li>
<li>802.11ac WiFi / Bluetooth / Gigabit Ethernet</li>
<li>Thunderbolt 3 / USB 3.1 gen 2 Type-C port</li>
<li>Four USB 3.0 ports</li>
<li>HDMI 2.0, mini-DP 1.2 video out</li>
<li>SDXC (UHS-I) card reader</li>
<li>Infrared sensor</li>
<li>3.5mm combo digital / optical out port</li>
<li>3.5mm headphone jack</li>
</ul>

<p>All impressive, but the most remarkable items are the GPU and the Thunderbolt 3 port. Putting together a HTPC that can kick an Xbox One's butt as a gaming box is now as simple as adding these three items together:</p>

<ol>
<li><a href="http://www.amazon.com/dp/B01DJ9XS52/?tag=codihorr-20">Intel NUC kit NUC6i7KYK</a> $579  </li>
<li><a href="http://www.amazon.com/dp/B014R8JWEA/?tag=codihorr-20">16GB DDR4-2400</a> $75  </li>
<li><a href="http://www.amazon.com/dp/B01639694M/?tag=codihorr-20">Samsung 950 Pro NVMe M.2 (512GB)</a> $317</li>
</ol>

<p>Ok, fine, it's a cool <strong>$970</strong> plus tax compared to $399 for one of those console x86 boxes. But did I mention it has <em>skulls</em> on it? <em>Skulls!</em></p>

<p>The CPU and disk performance on offer here are hilariously far beyond what's available on current consoles: </p>

<ul>
<li><p>Disk performance of the two internal PCIe 3.0 4x M.2 slots, assuming you choose a proper NVMe drive as you should, is measured in not megabytes per second but <a href="http://www.anandtech.com/show/10303/choosing-the-right-ssd-for-a-skylakeu-system/2"><em>gigabytes</em> per second.</a> Meanwhile consoles lumber on with, at best, hybrid drives.</p></li>
<li><p>The Jaguar class AMD x86 cores in the Xbox One and PS4 are about the same as the <a href="http://anandtech.com/show/7314/intel-baytrail-preview-intel-atom-z3770-tested/2">AMD A4-5000 reviewed here</a>; those benchmarks indicate a modern Core i7 will be about <a href="http://www.anandtech.com/show/7003/the-haswell-review-intel-core-i74770k-i54560k-tested/6">four times faster</a>.</p></li>
</ul>

<p>But most importantly, <a href="http://nucblog.net/2016/05/skull-canyon-nuc-review-conclusion/">its GPU performance is on par with current consoles</a>. NUC blog measured <strong>41fps average</strong> in Battlefield 4 at 1080p and medium settings. Digging through old benchmarks I find plenty of pages where a Radeon 78xx or 77xx series video card, the closest analog to what's in the XBox One and PS4, achieves a <a href="http://www.bit-tech.net/hardware/graphics/2013/11/27/battlefield-4-performance-analysis/3">similar result in Battlefield 4</a>:</p>

<p><img src="https://blog.codinghorror.com/content/images/2016/05/radeon-77xx-perf-bf4-1080p-medium.png" alt=""></p>

<p>I personally benchmarked GRID 2 at 720p (high detail) on all three of the last HTPC models I owned:</p>

<table width="320px">  
<tr>  
<td></td><td>Max</td><td>Min</td><td>Avg  
</td></tr>  
<tr>  
<td>i3-4130T, HD 4400</td><td>32</td><td>21</td><td>27  
</td></tr>  
<tr>  
<td>i3-6100T, HD 530</td><td>50</td><td>32</td><td>39  
</td></tr>  
<tr>  
<td>i7-6770HQ, Iris Pro 580</td><td>96</td><td>59</td><td>78  
</td></tr>  
</table>

<p>When I up the resolution to 1080p, I get <strong>59fps average</strong>, 38 min, 71 max. Checking with <a href="http://www.notebookcheck.net/Computer-Games-on-Laptop-Graphics-Cards.13849.0.html">Notebookcheck's exhaustive benchmark database</a>, that is closest to the AMD R7 250, a rebranded Radeon 7770.</p>

<p>What we have here is legitimately the first on-die GPU that can compete with a low-end discrete video card from AMD or Nvidia. Granted, an older one, one you could buy for about $80 today, but one that is certainly equivalent to what's in the Xbox One and PS4 <em>right now</em>. This is a real first for Intel, and it probably won't be the last time, considering that on-die GPU performance increases have massively outpaced CPU performance increases for the last 5 years.</p>

<p>As for power usage, I was pleasantly surprised to measure that this box idles at <b>15w</b> at the Windows Desktop doing nothing, and drops to <b>13w</b> when the display sleeps. Considering the best idle numbers I've measured are from the <a href="https://blog.codinghorror.com/the-scooter-computer/">Scooter Computer at 7w</a> and <a href="https://blog.codinghorror.com/the-2016-htpc-build/">my previous HTPC build at 10w</a>, that's not bad at all! Under full game load, it's more like 70 to 80 watts, and in typical light use, 20 to 30 watts. It's the idle number that matters the most, as that represents the typical state of the box. And compared to <a href="http://www.extremetech.com/gaming/182829-new-report-slams-xbox-one-and-ps4-power-consumption-inefficiencies-still-abound">the 75 watts a console uses even when idling at the dashboard</a>, it's no contest.</p>

<p>Of course, 4k video playback is no problem, though 10-bit 4K video <a href="http://jell.yfish.us/">may be a stretch</a>. If that's not enough &mdash; if you dream bigger than medium detail 1080p gameplay &mdash; the presence of a Thunderbolt 3 port on this little box means you can, at considerable expense, use <strong>any external GPU of your choice</strong>.</p>

<p><img src="https://blog.codinghorror.com/content/images/2016/05/razer-core-external-GPU.jpg" alt=""></p>

<p>That's the <a href="http://www.razerzone.com/store/razer-core">Razer Core external graphics dock</a>, and it's $499 all by itself, but it opens up an entire world of upgrading your GPU to whatever the heck you want, as long as your x86 computer has a Thunderbolt 3 port. And it really works! In fact, here's a video of it working live with this exact configuration:</p>

<iframe width="560" height="315" src="https://www.youtube.com/embed/BUxP1Uwp7so" frameborder="0" allowfullscreen></iframe>

<p>Zero games are meaningfully CPU limited today; the disk and CPU performance of this Skull Canyon NUC is already so vastly far ahead of current x86 consoles, even the PS4 Neo that's about to be introduced. So being able to replace the one piece that needs to be the most replaceable is huge. Down the road you can add the latest, greatest GPU model whenever you want, just by plugging it in!</p>

<p>The only downside of using such a small box as my HTPC is that my two 2.5" 2TB media drives become external USB 3.0 enclosures, and I am limited by the 4 USB ports. So it's a little &hellip; cable-y in there. But I've come to terms with that, and its tiny size is an acceptable tradeoff for all the cable and dongle overhead.</p>

<p><img src="https://blog.codinghorror.com/content/images/2016/05/skull-canyon-with-razer-core-external.jpg" alt=""></p>

<p>I still remember how shocked I was <a href="https://blog.codinghorror.com/x86-uber-alles/">when Apple switched to x86 back in 2005</a>. I was also surprised to discover just how thoroughly both the PS4 and Xbox One embraced x86 in 2013. Add in the current furor over VR, plus the PS4 Neo opening new console upgrade paths, and the future of x86 as a gaming platform is rapidly approaching supernova.</p>

<p>If you want to experience what console gaming will be like in 10 years, invest in a <a href="http://www.amazon.com/dp/B01DJ9XS52/?tag=codihorr-20">Skull Canyon NUC</a> and an external Thunderbolt 3 graphics dock today. <strong>If we are in a golden age of x86 gaming, this configuration is its logical endpoint.</strong></p>

<table>  
<tr><td class="welovecodinghorror">  
[advertisement] <a href="http://careers.stackoverflow.com" rel="nofollow">Find a better job the Stack Overflow way</a> - what you need when you need it, no spam, and no scams.
</td></tr>  
</table>]]></content:encoded></item><item><title><![CDATA[Your Own Personal WiFi Storage]]></title><description><![CDATA[<p>Our kids have reached the age &ndash; at ages 4, 4, and 7 respectively &ndash; that taking longer trips with them is now possible without everyone losing what's left of their sanity in the process. But we still have the same problem on multiple hour trips, whether it's in a</p>]]></description><link>https://blog.codinghorror.com/your-own-personal-wifi-storage/</link><guid isPermaLink="false">708fb957-56e2-48d9-ae55-a8bbbc883fcc</guid><dc:creator><![CDATA[Jeff Atwood]]></dc:creator><pubDate>Sat, 07 May 2016 06:42:23 GMT</pubDate><content:encoded><![CDATA[<p>Our kids have reached the age &ndash; at ages 4, 4, and 7 respectively &ndash; that taking longer trips with them is now possible without everyone losing what's left of their sanity in the process. But we still have the same problem on multiple hour trips, whether it's in a car, or on a plane &ndash; how do we bring enough stuff to keep the kids entertained without carting 5 pounds of books and equipment along, per person? And if we agree, like most parents, that <a href="https://twitter.com/jimgaffigan/status/649355348013395968">the iPad is the general answer to this question</a>, how do I get enough local media downloaded and installed on each of their iPads before the trip starts? And do I need 128GB iPads, because those are kind of expensive?</p>

<p>We clearly have a media sharing problem. I asked on Twitter and quite a number of people recommended the <a href="http://www.amazon.com/dp/B00RVIGY1I/?tag=codihorr-20">HooToo HT-TM05 TripMate Titan</a> at $40. I took their advice, and they were right &ndash; <strong>this little device is amazing!</strong></p>

<p><a href="http://www.amazon.com/dp/B00RVIGY1I/?tag=codihorr-20"><img src="https://blog.codinghorror.com/content/images/2016/05/HT-TM05.jpg" alt="" title=""></a></p>

<ul>
<li>10400mAh External Battery</li>
<li>WiFi USB 3.0 media sharing device</li>
<li>Wired-to-WiFi converter</li>
<li>WiFi-to-WiFi bridge to share a single paid connection </li>
</ul>

<p>The value of the last two points is debatable depending on your situation, but the utility of the first two is <em>huge!</em> Plus the large built in battery means it can act as a self-powered WiFi hotspot for 10+ hours. All this for <a href="http://www.amazon.com/dp/B00RVIGY1I/?tag=codihorr-20">only forty bucks!</a></p>

<p>It's a very simple device. It has exactly <strong>one button</strong> on the top:</p>

<ul>
<li>Hold the button down for 5+ seconds to power on or off.</li>
<li>Tap the button to see the current battery level, represented as 1-4 white LEDs.</li>
<li>The blue LED will change to green if connected to another WiFi or wired network.</li>
</ul>

<p>Once you <a href="http://www.amazon.com/dp/B00RVIGY1I/?tag=codihorr-20">get yours</a>, just hold down the button to power it on, let it fully boot, and connect to the new <code>TripMateSith</code> WiFi network. As to why it's called that, I suspect it has to do with the color scheme of the device and this guy.</p>

<p><img src="https://blog.codinghorror.com/content/images/2016/05/darth-maul.jpg" alt=""></p>

<p>I am guessing licensing issues forced them to pick the 'real' name of TripMate Titan, but wirelessly, it's known as <code>TripMateSith-XXXX</code>. Connect to that. The default password is <code>11111111</code> (that's eight ones).</p>

<p><img src="https://blog.codinghorror.com/content/images/2016/05/wifi-browser-hootoo-titan.png" width="320px"></p>

<p>Once connected, navigate to <code>10.10.10.254</code> in your browser. Username is <code>admin</code>, no password. </p>

<p><img src="https://blog.codinghorror.com/content/images/2016/05/hootoo-initial-connect.png" width="320px"></p>

<p>This interface is totally smartphone compatible, for the record, but I recommend you do this from a desktop or laptop since we need to upgrade the firmware immediately. As received, the device has firmware 2.000.022 and you'll definitely want to <a href="http://www.hootoo.com/downloads-HT-TM05.html">upgrade to the latest firmware</a> right away:</p>

<ul>
<li>Make sure a small USB storage device is attached &ndash; it needs local scratch disk space to upgrade.</li>
<li>You'd think putting the firmware on a USB storage device and inserting said USB storage device into the HooToo would work, and I agree that's logical, but &hellip; you'd be wrong. </li>
<li>Connect from a laptop or desktop, then visit the Settings, Firmware page and upload the firmware file from there. (I couldn't figure out any way to upgrade firmware from a phone, at least not on iOS.)</li>
</ul>

<h4 id="storage">Storage</h4>

<p>For this particular use, so we can attach the storage, leave it attached forever, and kinda-sorta pretend it is all one device, I recommend a <a href="http://www.amazon.com/dp/B01BGTG2A0/?tag=codihorr-20">tiny $32 128GB USB 3.0 drive</a>. It's not a barn-burner, but it's fast enough for its diminutive size.</p>

<p><a href="http://www.amazon.com/dp/B01BGTG2A0/?tag=codihorr-20"><img src="https://blog.codinghorror.com/content/images/2016/05/sandisk-fit-128gb.jpg" width="320px"></a></p>

<p>In the past, <a href="http://blog.codinghorror.com/a-ssd-in-your-pocket/">I've recommended very fast USB 3.0 drives</a>, but I think that time is coming to an end. If you need something larger than 128GB, you could carry a USB 3.0 enclosure with a traditional inexpensive 2.5" HD, but the combination of travel and spinning hard drives makes me nervous. Not to mention the extra power consumption. Instead, I recommend one of the new, budget compact M.2 SSDs in a USB 3.0 enclosure:</p>

<ul>
<li><a href="http://www.amazon.com/dp/B00TGIW1XG/?tag=codihorr-20">500GB M.2 2280 SATA SSD</a> ($150)</li>
<li><a href="http://www.amazon.com/dp/B019NNEA2I/?tag=codihorr-20">M.2 SATA to USB 3.0 Enclosure</a> ($23)</li>
</ul>

<p><a href="http://www.amazon.com/dp/B01BO4L3MY/?tag=codihorr-20"><img src="https://blog.codinghorror.com/content/images/2016/05/usb-3-sata-m2-enclosure-1.jpg" width="600px"></a></p>

<p>They run absolute <em>circles</em> around large USB flash drives in performance! The larger the drive, believe me, the more you need to care about this, like say you need to quickly copy a bunch of reasonably new media for the kids to enjoy before you go catch that plane.</p>

<p>Anyway, once you get this storage plugged into the HooToo it will automatically <strong>set up a DLNA share</strong> for you:</p>

<p><img src="https://blog.codinghorror.com/content/images/2017/01/hootoo-auto-dlna-share.jpg" width="320px"></p>

<p>However, you must explicitly move the files and folders into the Share folder created by the HooToo to browse them via DLNA.</p>

<p>In theory you could do this directly to the filesystem on the USB drive, but since we're already <em>there</em>, I found it was just as easy to use the built in Explorer tool in the web browser, linked from the HooToo homepage:</p>

<p><img src="https://blog.codinghorror.com/content/images/2017/01/hootoo-add-dlna-share-folders-1.jpg" width="320px"></p>

<ul>
<li>Select the files and folders you want to move</li>
<li>Tap the wrench icon, then Cut</li>
<li>Tap to enter the Share folder</li>
<li>Tap the wrench icon, then Paste </li>
</ul>

<p>Anyway, once you get the folders and files you want into the <strong>Share</strong> folder, you're good to go for DLNA!</p>

<h4 id="settingsandwifi">Settings and WiFi</h4>

<p>Let's continue setting up our HooToo Tripmate Titan. In the web interface, under Settings, Network Settings, these are the essentials:</p>

<ul>
<li><p>In Host Name, first <strong>set the device name to something short and friendly</strong>. You will be typing this later on every device you attach to it. I used <code>van</code> and <code>airplane</code> for mine, since that's where we plan to use them.</p></li>
<li><p>In Wi-Fi and LAN</p>

<ul><li><p>pick <strong>a simple WiFi password</strong>, because you'll need to tell people to type this in when they connect, or type it in for them. I'd keep it simple. High security is not needed here.</p></li>
<li><p>set the <a href="http://www.extremetech.com/computing/179344-how-to-boost-your-wifi-speed-by-choosing-the-right-channel">WiFi channel to either 1, 6, or 11</a> so you are not crowding around other channels.</p></li>
<li><p>set security to <a href="http://security.stackexchange.com/questions/23627/strength-of-wep-wpa-and-wpa-2-psk">WPA2-PSK only</a>. No need to support old, insecure connection types.</p></li></ul></li>
</ul>

<p>There's more here, if you want to bridge wired or wirelessly, but this will get you started.</p>

<h4 id="ios">iOS</h4>

<p><font color="red">Update:</font> since I originally wrote this, I've switched to <a href="https://firecore.com/infuse">the Infuse app</a>. It's fantastic for media consumption, and although it is a little expensive at $9, there's a reason: it supports <em>tons</em> of different audio and file formats, including the ones that your iPhone and iPad don't understand, including Dolby and so on.</p>

<p>Infuse supports the <a href="http://www.techhive.com/article/2020825/how-to-get-started-with-dlna.html">DLNA standard</a> built into the HooToo. So all you have to do is connect to the HooToo's wireless network, press the add files plus button at upper right, and connect to the one that automatically appears &mdash; in this case, <strong>DLNA-Van</strong>, there at the bottom.</p>

<p><img src="https://blog.codinghorror.com/content/images/2017/01/infuse-add-files-dlna-hootoo.png" width="320px"></p>

<p>With DLNA, <strong>no login is required!</strong> Once connected, you can scan through videos easily, with rather nice thumbnail and summary support.</p>

<p><img src="https://blog.codinghorror.com/content/images/2017/01/infuse-dlna-browse-videos-hootoo.jpg" width="320px"></p>

<p>For more than just media, you can also use the <a href="https://itunes.apple.com/us/app/fileexplorer/id499470113?mt=8">File Explorer app</a> for iOS (or similar). See the instructions below for Windows, as the process is very similar.</p>

<h4 id="windowsmac">Windows / Mac</h4>

<p>Connect to the HooToo's WiFi network, then type in the name of the device (mine's called <code>van</code>) in Explorer or the File Run dialog, prefixed by <code>\\</code>.</p>

<p><img src="https://blog.codinghorror.com/content/images/2016/05/Screenshot--17-.png" width="480px"></p>

<p>The default user accounts are <code>admin</code> and <code>guest</code> with no passwords, unless you set one up. Admin lets you write files; guest does not.</p>

<p><img src="https://blog.codinghorror.com/content/images/2016/05/Screenshot--18-.png" width="480px"></p>

<p>Once you connect you'll see the default file share for the USB device and can begin browsing the files at <code>UsbDisk1_Volume1</code>. </p>

<p><img src="https://blog.codinghorror.com/content/images/2016/05/Screenshot--19-.png" width="480px"></p>

<p>I also figured out how to browse the HooToo filesystem from a Mac as well:</p>

<ul>
<li>Connect to the HooToo's WiFi network</li>
<li>Open a Finder Window</li>
<li>On the "Go" menu select "Connect to Server..."</li>
<li>Enter the HooToo device name, e.g. <code>van</code></li>
<li>When prompted enter admin or guest credentials</li>
</ul>

<h4 id="caveats">Caveats</h4>

<p>For some reason, with a USB 3.0 flash drive attached, the battery slowly drains even when powered off. So you'll want to remove any flash drive when the HooToo is powered off for extended periods. I have no idea why this happens, but I was definitely able to reproduce the behavior. Kind of annoying since my whole goal was to have "one" device, but oh well.</p>

<p>This isn't a <a href="http://www.howtogeek.com/252261/how-to-set-up-plex-and-watch-your-movies-on-any-device/">fancy, glitzy Plex based system</a>, it's a basic DLNA share. Devices that have previously connected to this WiFi network will definitely connect to it when no other WiFi networks are available, like say, when you're in a van driving to Legoland, or on a plane flying to visit your grandparents. You will still have to train people to launch <a href="https://firecore.com/infuse">the Infuse app</a>, and the right device name to look for...</p>

<p><img src="https://blog.codinghorror.com/content/images/2017/01/infuse-dlna-select-server.jpg" width="320px"></p>

<p>... or, if you're on a desktop / laptop, create a desktop link to the proper share.</p>

<p>But in my book, simple is good. The <a href="http://www.amazon.com/dp/B00RVIGY1I/?tag=codihorr-20">HooToo HT-TM05 TripMate</a> plus a <a href="http://www.amazon.com/dp/B01BGTG2A0/?tag=codihorr-20">small 128GB flash drive</a>  is an easy, flexible way to wirelessly share large media files across a ton of devices for less than 75 bucks total, and it comes with a large, convenient rechargeable battery. </p>

<iframe width="560" height="315" src="https://www.youtube.com/embed/jv_jkju_iZg?start=95" frameborder="0" allowfullscreen></iframe>

<p>I think one of these will live, with its charger cable and a flash drive chock full of awesome media, permanently inside our van for the kids. Remember, <strong>no matter where you go, there your &hellip; files &hellip; are.</strong></p>

<table>  
<tr><td class="welovecodinghorror">  
[advertisement] Building out your tech team? <a href="http://careers.stackoverflow.com/products" rel="nofollow">Stack Overflow Careers</a> helps you hire from the largest community for programmers on the planet. We built our site with developers like you in mind.
</td></tr>  
</table>]]></content:encoded></item><item><title><![CDATA[They Have To Be Monsters]]></title><description><![CDATA[<p>Since I started working on Discourse, I spend a lot of time thinking about how software can encourage and nudge people to be more empathetic online. That's why it's troubling to read articles <a href="https://medium.com/@stephaniewittelswachs/the-end-of-empathy-5d8383b066d3">like this one</a>:</p>

<blockquote>
  <p>My brother’s 32nd birthday is today. It’s an especially emotional day for</p></blockquote>]]></description><link>https://blog.codinghorror.com/they-have-to-be-monsters/</link><guid isPermaLink="false">61da2fa6-6508-4e8d-ae45-096add451ce3</guid><dc:creator><![CDATA[Jeff Atwood]]></dc:creator><pubDate>Fri, 29 Apr 2016 21:47:53 GMT</pubDate><content:encoded><![CDATA[<p>Since I started working on Discourse, I spend a lot of time thinking about how software can encourage and nudge people to be more empathetic online. That's why it's troubling to read articles <a href="https://medium.com/@stephaniewittelswachs/the-end-of-empathy-5d8383b066d3">like this one</a>:</p>

<blockquote>
  <p>My brother’s 32nd birthday is today. It’s an especially emotional day for his family because he’s not alive for it.</p>
  
  <p>He died of a heroin overdose last February.
  This year is even harder than the last. I started weeping at midnight and eventually cried myself to sleep. Today’s symptoms include explosions of sporadic sobbing and an insurmountable feeling of emptiness. My mom posted a gut-wrenching comment on my brother’s Facebook page about the unfairness of it all. Her baby should be here, not gone. “Where is the God that is making us all so sad?” she asked.  </p>
  
  <p>In response, someone — a stranger/(I assume) another human being — commented with one word: “Junkie.”</p>
</blockquote>

<p>The interaction may seem a bit strange and out of context until you realize that this is the Facebook page of a person who was somewhat famous, who <a href="http://variety.com/2015/tv/news/parks-and-recreation-producer-dead-harris-wittels-1201437460/">produced the excellent show Parks and Recreation</a>. Not that this forgives the behavior in any way, of course, but it does explain why strangers would wander by and make observations.</p>

<p>There is deep truth in the old idea that people are able to say these things <strong>because they are looking at a screen full of words</strong>, not directly at the face of the person they're about to say a terrible thing to. That one level of abstraction the Internet allows, typing, which is so immensely powerful in so many other contexts &hellip;</p>

<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">“falling in love, breaking into a bank, bringing down the govt…they all look the same right now: they look like typing” <a href="https://twitter.com/PennyRed">@PennyRed</a> <a href="https://twitter.com/hashtag/TtW16?src=hash">#TtW16</a> <a href="https://twitter.com/hashtag/k3?src=hash">#k3</a></p>&mdash; whitney erin boesel (@weboesel) <a href="https://twitter.com/weboesel/status/721477628465704960">April 16, 2016</a></blockquote>  

<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<p>&hellip; has some crippling emotional consequences.</p>

<p>As an exercise in empathy, try to imagine saying some of the terrible things people typed to each other online to a real person sitting directly in front of you. Or don't imagine, and <a href="http://www.esquire.com/sports/videos/a44351/female-sports-reporters-mean-tweets/">just watch this video</a>.</p>

<iframe width="560" height="315" src="https://www.youtube.com/embed/9tU-D-m2JY8" frameborder="0" allowfullscreen></iframe>

<p>I challenge you to watch the entirety of that video. I couldn't do it. This is the second time I've tried, and I had to turn it off not even 2 minutes in because I couldn't take it any more.</p>

<p>It's no coincidence that these are comments directed at women. Over the last few years I have come to understand how, as a straight white man, I have the privilege of being immune from most of this kind of treatment. But others are not so fortunate. The Guardian analyzed 70 million comments and found that <a href="https://www.theguardian.com/technology/2016/apr/12/the-dark-side-of-guardian-comments">online abuse is heaped disproportionately on women, people of color, and people of different sexual orientation</a>.</p>

<p><img src="https://blog.codinghorror.com/content/images/2016/04/men-vs-women-comments-blocked.png" alt=""></p>

<blockquote>
  <p>And avalanches happen easily online. Anonymity disinhibits people, making some of them more likely to be abusive. Mobs can form quickly: once one abusive comment is posted, others will often pile in, competing to see who can be the most cruel. This abuse can move across platforms at great speed – from Twitter, to Facebook, to blogposts – and it can be viewed on multiple devices – the desktop at work, the mobile phone at home. To the person targeted, it can feel like the perpetrator is everywhere: at home, in the office, on the bus, in the street.</p>
</blockquote>

<p>I've only had a little taste of this treatment, once. The sense of being "under siege" &ndash; a constant barrage of vitriol and judgment pouring your way every day, every hour &ndash; was palpable. It was not pleasant. It absolutely affected my state of mind. Someone remarked in the comments that ultimately it did not matter, because as a white man I could walk away from the whole situation any time. And they were right. I began to appreciate what it would feel like when you <em>can't</em> walk away, when this harassment follows you around everywhere you go online, and you never really know when the next incident will occur, or exactly what shape it will take.</p>

<p>Imagine the feeling of being constantly on edge like that, every day. What happens to your state of mind when walking away isn't an option? It gave me great pause.</p>

<p><a href="http://www.brickartist.com/"><img src="https://blog.codinghorror.com/content/images/2016/04/the-lego-scream.jpg" alt="The Scream by Nathan Sawaya" title=""></a></p>

<p>I admired the way Stephanie Wittels Wachs actually <em>engaged</em> with the person who left that awful comment. This is a man who has two children of his own, and should be no stranger to the kind of pain involved in a child's death. And yet he felt the need to post the word "Junkie" in reply to a mother's anguish over losing her child to drug addiction. </p>

<blockquote>
  <p>Isn’t this what empathy is? Putting myself in someone else’s shoes with the knowledge and awareness that I, too, am human and, therefore, susceptible to this tragedy or any number of tragedies along the way?</p>
</blockquote>

<p>Most would simply delete the comment, block the user, and walk away. Totally defensible. But she didn't. She takes the time and effort to attempt to understand this person who is abusing her mother, to reach them, to connect, to <strong>demonstrate the very empathy this man appears incapable of</strong>.</p>

<p>Consider the related story of Lenny Pozner, who lost a child at Sandy Hook, and became <a href="https://www.washingtonpost.com/news/grade-point/wp/2016/01/13/the-father-of-a-boy-killed-at-sandy-hook-gets-death-threats-from-people-who-say-the-shooting-was-a-hoax/">the target of groups who believe the event was a hoax</a>, and similarly selflessly devotes much of his time to refuting and countering these bizarre claims.</p>

<blockquote>
  <p>Tracy’s alleged harassment was hardly the first, Pozner said. There’s a whole network of people who believe the media reported a mass shooting that never happened, he said, that the tragedy was an elaborate hoax designed to increase support for gun control. Pozner said he gets ugly comments often on social media, such as, “Eventually you’ll be tried for your crimes of treason against the people,” “… I won’t be satisfied until the caksets are opened…” and “How much money did you get for faking all of this?”</p>
</blockquote>

<p>It's easy to practice empathy when you limit it to people that are easy to empathize with &ndash; the downtrodden, the undeserving victims. But <strong>it is another matter entirely to empathize with those that hate, harangue, and intentionally make other people's lives miserable</strong>. If you can do this, you are a far better person than me. I struggle with it. But my hat is off to you. There's no better way to teach empathy than to practice it, in the most difficult situations.</p>

<p>In individual cases, reaching out and really trying to empathize with people you disagree with or dislike can work, even people who happen to be lifelong members of hate organizations, <a href="http://www.newyorker.com/magazine/2015/11/23/conversion-via-twitter-westboro-baptist-church-megan-phelps-roper">as in the remarkable story of Megan Phelps-Roper</a>:</p>

<blockquote>
  <p>As a member of the Westboro Baptist Church, in Topeka, Kansas, Phelps-Roper believed that AIDS was a curse sent by God. She believed that all manner of other tragedies—war, natural disaster, mass shootings—were warnings from God to a doomed nation, and that it was her duty to spread the news of His righteous judgments. To protest the increasing acceptance of homosexuality in America, the Westboro Baptist Church picketed the funerals of gay men who died of AIDS and of soldiers killed in Iraq and Afghanistan. Members held signs with slogans like “GOD HATES FAGS” and “THANK GOD FOR DEAD SOLDIERS,” and the outrage that their efforts attracted had turned the small church, which had fewer than a hundred members, into a global symbol of hatred.</p>
</blockquote>

<p>Perhaps one of the greatest failings of the Internet is <a href="https://medium.com/@jeremypreacher/emotional-labor-and-diversity-in-community-management-eb3a4985d71a#.2ei4skfxv">the breakdown in cost of emotional labor</a>.</p>

<blockquote>
  <p>First we’ll reframe the problem: the real issue is not Problem Child’s opinions &ndash; he can have whatever opinions he wants. The issue is that he’s doing zero emotional labor &ndash; he’s not thinking about his audience or his effect on people at all. (Possibly, he’s just really bad at modeling other people’s responses &ndash; the outcome is the same whether he lacks the will or lacks the skill.) But to be a good community member, he <em>needs</em> to consider his audience. </p>
</blockquote>

<p>True empathy means reaching out and engaging in a loving way with everyone, even those that are hurtful, hateful, or spiteful. But on the Internet, can you do it every day, multiple times a day, across hundreds of people? Is this a reasonable thing to ask of someone? Is it even <em>possible</em>, short of sainthood?</p>

<p>The question remains: <strong>why would people post such hateful things</strong> in the first place? Why reply "Junkie" to a mother's anguish? Why ask the father of a murdered child to publicly prove his child's death was not a hoax? Why tweet "Thank God for AIDS!"</p>

<p>Unfortunately, I think I know the answer to this question, and you're not going to like it. </p>

<p><a href="http://www.webtoons.com/en/comedy/bluechair/ep-59-busy-work/viewer?title_no=199&amp;episode_no=61"><img src="https://blog.codinghorror.com/content/images/2016/04/dont-let-the-existential-dread.jpg" alt="Busy-Work by Shen, owlturd.com" title=""></a></p>

<p>I don't like it. I don't want it. But I know.</p>

<p>I have laid some heavy stuff on you in this post, and for that, I apologize. I think the weight of what I'm trying to communicate here requires it. I have to warn you that the next article I'm about to link is far heavier than anything I have posted above, maybe the heaviest thing I've ever posted. It's about the legal quandary presented in the tragic cases of children who died because their parents accidentally left them strapped into carseats, and it won a much deserved pulitzer. It is also <a href="https://www.washingtonpost.com/lifestyle/magazine/fatal-distraction-forgetting-a-child-in-thebackseat-of-a-car-is-a-horrifying-mistake-is-it-a-crime/2014/06/16/8ae0fe3a-f580-11e3-a3a5-42be35962a52_story.html">one of the most harrowing things I have ever read</a>.</p>

<blockquote>
  <p>Ed Hickling believes he knows why. Hickling is a clinical psychologist from Albany, N.Y., who has studied the effects of fatal auto accidents on the drivers who survive them. He says these people are often judged with disproportionate harshness by the public, even when it was clearly an accident, and even when it was indisputably not their fault.</p>
  
  <p>Humans, Hickling said, have a fundamental need to create and maintain a narrative for their lives in which the universe is not implacable and heartless, that terrible things do not happen at random, and that catastrophe can be avoided if you are vigilant and responsible.</p>
  
  <p>In hyperthermia cases, he believes, the parents are demonized for much the same reasons. “We are vulnerable, but we don’t want to be reminded of that. We want to believe that the world is understandable and controllable and unthreatening, that if we follow the rules, we’ll be okay. <strong>So, when this kind of thing happens to other people, we need to put them in a different category from us. We don’t want to resemble them, and the fact that we might is too terrifying to deal with. So, they have to be monsters.</strong>”</p>
</blockquote>

<p>This man left the junkie comment because he is afraid. He is afraid his own children could become drug addicts. He is afraid his children, through no fault of his, through no fault of anyone at all, could die at 30. When presented with real, tangible evidence of the pain and grief a mother feels at the drug related death of her own child, and the reality that it could happen to anyone, it became so overwhelming that it was too much for him to bear.</p>

<p>Those "Sandy Hook Truthers" harass the father of a victim because they are afraid. They are afraid their own children could be viciously gunned down in cold blood any day of the week, bullets tearing their way through the bodies of the teachers standing in front of them, desperately trying to protect them from being murdered. They can't do anything to protect their children from this, and in fact there's <em>nothing any of us can do</em> to protect our children from being murdered at random, at school any day of the week, at the whim of any mentally unstable individual with access to an assault rifle. That's the harsh reality.</p>

<p>When faced with the abyss of pain and grief that parents feel over the loss of their children, due to utter random chance in a world they can't control, they could never control, maybe none of us can <em>ever</em> control, the overwhelming sense of existential dread is simply too much to bear. So <strong><em>they have to be monsters</em></strong>. They must be.</p>

<p>And we will fight these monsters, tooth and nail, raging in our hatred, so we can forget our pain, at least for a while.</p>

<blockquote>
  <p>After Lyn Balfour’s acquittal, this comment appeared on the Charlottesville News Web site:</p>
  
  <p>“If she had too many things on her mind then she should have kept her legs closed and not had any kids. They should lock her in a car during a hot day and see what happens.”</p>
</blockquote>

<p>I imagine the suffering that these parents are already going through, reading these words that another human being typed to them, just <em>typed</em>, and something breaks inside me. I can't process it. But rather than pitting ourselves against each other out of fear, recognize that the monster who posted this terrible thing is me. It's you. It's all of us.</p>

<p>The weight of seeing through the fear and beyond the monster to simply discover <em>yourself</em> is often too terrible for many people to bear. In a world of heavy things, it's the heaviest there is. </p>

<table>  
<tr><td class="welovecodinghorror">  
[advertisement] At Stack Overflow, we help developers learn, share, and grow. Whether you’re looking for your next dream job or looking to build out your team, <a href="http://careers.stackoverflow.com" rel="nofollow">we've got your back</a>.
</td></tr>  
</table>]]></content:encoded></item><item><title><![CDATA[Here's The Programming Game You Never Asked For]]></title><description><![CDATA[<p>You know what's universally regarded as un-fun by most programmers? Writing <a href="https://en.wikipedia.org/wiki/Assembly_language">assembly language code</a>.</p>

<p><img src="https://blog.codinghorror.com/content/images/2016/04/assembly-language.png" alt=""></p>

<p>As Steve McConnell <a href="http://www.amazon.com/dp/0735619670/?tag=codihorr-20">said back in 1994</a>:</p>

<blockquote>
  <p>Programmers working with high-level languages achieve better productivity and quality than those working with lower-level languages. Languages such as C++, Java, Smalltalk, and Visual Basic have been credited with</p></blockquote>]]></description><link>https://blog.codinghorror.com/heres-the-programming-game-you-never-asked-for/</link><guid isPermaLink="false">fd0fdff9-caa5-470f-a8d2-ed99b340e3f8</guid><dc:creator><![CDATA[Jeff Atwood]]></dc:creator><pubDate>Fri, 15 Apr 2016 09:48:18 GMT</pubDate><content:encoded><![CDATA[<p>You know what's universally regarded as un-fun by most programmers? Writing <a href="https://en.wikipedia.org/wiki/Assembly_language">assembly language code</a>.</p>

<p><img src="https://blog.codinghorror.com/content/images/2016/04/assembly-language.png" alt=""></p>

<p>As Steve McConnell <a href="http://www.amazon.com/dp/0735619670/?tag=codihorr-20">said back in 1994</a>:</p>

<blockquote>
  <p>Programmers working with high-level languages achieve better productivity and quality than those working with lower-level languages. Languages such as C++, Java, Smalltalk, and Visual Basic have been credited with improving productivity, reliability, simplicity, and comprehensibility by factors of 5 to 15 over low-level languages such as assembly and C. <strong>You save time when you don't need to have an awards ceremony every time a C statement does what it's supposed to.</strong></p>
</blockquote>

<p>Assembly is a language where, for performance reasons, every individual command is communicated in excruciating low level detail directly to the CPU. As we've gone from fast CPUs, to faster CPUs, to multiple absurdly fast CPU cores on the same die, to "gee, we kinda stopped caring about CPU performance altogether five years ago", there hasn't been much need for the kind of hand-tuned performance you get from assembly. Sure, there are <a href="http://blog.codinghorror.com/i-happen-to-like-heroic-coding/">the occasional heroics</a>, and they are amazing, but in terms of Getting Stuff Done, assembly has been well off the radar of mainstream programming for probably twenty years now, and for good reason.</p>

<p>So who in their right mind would take up tedious assembly programming today? Yeah, nobody. But wait! What if I told you your Uncle Randy had just died and left behind this mysterious old computer, <a href="http://www.zachtronics.com/tis-100/">the TIS-100?</a></p>

<p><img src="https://blog.codinghorror.com/content/images/2016/04/aunt-doris-note-tis-100.jpg" alt=""></p>

<p>And what if I also told you the only way to figure out what that TIS-100 computer was used for &ndash; and what good old Uncle Randy was up to &ndash; was to read a (blessedly short 14 page) photocopied reference manual and fix its corrupted boot sequence &hellip; <em>using assembly language?</em></p>

<p><a href="http://www.zachtronics.com/tis-100/"><img src="https://blog.codinghorror.com/content/images/2016/04/tis-100-level-one.png" alt="" title=""></a></p>

<p>Well now, by God, it's time to learn us some assembly and get to the bottom of this mystery, isn't it? As its <a href="http://www.zachtronics.com/">creator</a> notes, <strong>this is the assembly language programming game you never asked for!</strong></p>

<p>I was surprised to discover my co-founder <a href="https://eviltrout.com/">Robin Ward</a> liked TIS-100 so much that he not only played the game (presumably to completion) but wrote <a href="https://github.com/eviltrout/tis-100">a TIS-100 emulator in C</a>. This is apparently the kind of thing he does for fun, in his free time, when he's not already working full time with us programming <a href="http://www.discourse.org">Discourse</a>. Programmers gotta &hellip; program.</p>

<p>Of course there's a long history of programming games. What makes TIS-100 unique is the way it fetishizes assembly programming, while most programming games take it a bit easier on you by easing you in with general concepts and simpler abstractions. But even "simple" programming games can be quite difficult. Consider one of my favorites on the Apple II, <a href="https://en.wikipedia.org/wiki/Rocky%27s_Boots">Rocky's Boots</a>, and its sequel, Robot Odyssey. <a href="http://blog.codinghorror.com/programming-4-fun/">I loved this game</a>, but in true programming fashion it was so difficult that <a href="http://www.slate.com/articles/technology/bitwise/2014/01/robot_odyssey_the_hardest_computer_game_of_all_time.html">finishing it in any meaningful sense was basically impossible</a>:</p>

<blockquote>
  <p>Let me say: Any kid who completes this game while still a kid (I know only one, who also is one of the smartest programmers I’ve ever met) is guaranteed a career as a software engineer. Hell, any adult who can complete this game should go into engineering. <strong>Robot Odyssey is the hardest damn “educational” game ever made.</strong> It is also a stunning technical achievement, and one of the most innovative games of the Apple IIe era.</p>
  
  <p><img src="https://blog.codinghorror.com/content/images/2016/04/robot-odyssey.png" alt="" title=""></p>
  
  <p>Visionary, absurdly difficult games such as this gain cult followings. It is the game I remember most from my childhood. It is the game I love (and despise) the most, because it was the hardest, the most complex, the most challenging. The world it presented was like being exposed to Plato’s forms, a secret, nonphysical realm of pure ideas and logic. The challenge of the game—and it was one serious challenge—was to understand that other world. Programmer Thomas Foote had just started college when he picked up the game: “I swore to myself,” he told me, “that as God is my witness, I would finish this game before I finished college. I managed to do it, but just barely.”</p>
</blockquote>

<p>I was happy dinking around with a few robots that did a few things, got stuck, and moved on to other games. I got a little turned off by the way it treated programming as electrical engineering; messing around with a ton of AND OR and NOT gates was just not my jam. I was already <a href="http://blog.codinghorror.com/everything-i-needed-to-know-about-programming-i-learned-from-basic/">cutting my teeth on BASIC by that point</a> and I sensed a level of mastery was necessary here that I probably didn't have and I wasn't sure I even <em>wanted</em>.</p>

<p><img src="https://blog.codinghorror.com/content/images/2016/04/robot-odyssey-chip.png" alt=""></p>

<p>I'll take a COBOL code listing over <em>that</em> monstrosity any day of the week. Perhaps Robot Odyssey was so hard because, in the end, it was a bare metal CPU programming simulation, like TIS-100.</p>

<p>A more gentle example of a modern programming game is Tomorrow Corporation's excellent <a href="http://tomorrowcorporation.com/humanresourcemachine">Human Resource Machine</a>.</p>

<iframe width="560" height="315" src="https://www.youtube.com/embed/428R_oEjGGI" frameborder="0" allowfullscreen></iframe>

<p>It has exactly the irreverent sense of humor you'd expect from the studio that built World of Goo and Little Inferno, both excellent and highly recommendable games in their own right. If you've ever wanted to find out if someone is truly interested in programming, recommend this game to them and see. It starts with only 2 instructions and slowly widens to include 11. Corporate drudgery has never been so &hellip; er, fun?</p>

<p>I'm thinking about this because I believe there's a strong connection between programming games and being a talented software engineer. It's that essential sense of <em>play</em>, the idea that you're experimenting with this stuff because you enjoy it, and you bend it to your will out of the sheer joy of creation more than anything else. As I <a href="http://blog.codinghorror.com/programming-love-it-or-leave-it/">once said</a>:</p>

<blockquote>
  <p>Joel implied that good programmers love programming so much they'd do it for <em>no pay at all</em>. I won't go quite that far, but I will note that the best programmers I've known have all had a <strong>lifelong passion for what they do</strong>. There's no way a minor economic blip would ever convince them they should do anything else. No way. No how.</p>
</blockquote>

<p>I'd rather sit a potential hire in front of Human Resource Machine and time how long it takes them to work through a few levels than <a href="http://blog.codinghorror.com/why-cant-programmers-program/">have them solve FizzBuzz for me</a> on a whiteboard. Is this interview about demonstrating competency in a certain technical skill that's worth a certain amount of money, or showing me how you can <em>improvise and have fun?</em></p>

<p>That's why I was so excited when Patrick, Thomas, and Erin founded <a href="https://www.starfighters.io/">Starfighter</a>.</p>

<p><a href="https://www.starfighters.io/"><img src="https://blog.codinghorror.com/content/images/2016/04/starfighter-logo.png" alt="" title=""></a></p>

<p>If you want to know how competent a programmer is, give them a real-ish simulation of a real-ish system to hack against and experiment with &ndash; and see how far they get. In security parlance, this is known <a href="https://www.defcon.org/html/links/dc-ctf.html">as a CTF</a>, as popularized by Defcon. But it's rarely extended to programming, until now. Their first simulation is <a href="https://www.stockfighter.io/">StockFighter</a>.</p>

<p>Participants are given:</p>

<ul>
<li>An interactive trading blotter interface</li>
<li>A real, functioning set of limit-order-book venues</li>
<li>A carefully documented JSON HTTP API, with an API explorer</li>
<li>A series of programming missions.</li>
</ul>

<p>Participants are asked to:</p>

<ul>
<li>Implement programmatic trading against a real exchange in a thickly traded market.</li>
<li>Execute block-shopping trading strategies.</li>
<li>Implement electronic market makers.</li>
<li>Pull off an elaborate HFT trading heist.</li>
</ul>

<p>This is a <em>seriously</em> next level hiring strategy, far beyond anything else I've seen out there. It's so next level that to be honest, I got really jealous reading about it, because <strong>I've felt for a long time that Stack Overflow should be doing yearly programming game events exactly like this</strong>, with special one-time badges obtainable only by completing certain levels on that particular year. Stack Overflow is <a href="http://blog.codinghorror.com/for-a-bit-of-colored-ribbon/">already a sort of game</a>, but people would go <em>nuts</em> for a yearly programming game event. Absolutely <em>bonkers</em>.</p>

<p>I know we've talked about <a href="http://blog.codinghorror.com/we-hire-the-best-just-like-everyone-else/">giving lip service to the idea of hiring the best</a>, but if that's <em>really</em> what you want to do, the best programmers I've ever known have excelled at exactly the situation that Starfighter simulates &mdash; live troubleshooting and reverse engineering of an existing system, even to the point of <a href="http://blog.codinghorror.com/why-isnt-my-encryption-encrypting/">finding rare exploits</a>. </p>

<p><img src="https://blog.codinghorror.com/content/images/2016/04/stockfighter-hardware.jpg" alt=""></p>

<p>Consider the dedication of this participant who built <a href="https://discuss.starfighters.io/t/wireless-handheld-build-done/4985?u=codinghorror">a complete wireless trading device</a> for StockFighter. Was it necessary? Was it practical? No. <strong>It's the programming game we never asked for.</strong> But here we are, regardless.</p>

<p>An arbitrary programming game, particularly one that goes to great lengths to simulate a fictional system, is a wonderful expression of the inherent joy in <em>playing</em> and <em>experimenting</em> with code. If I could find them, I'd gladly hire a dozen people just like that any day, and set them loose on our very real programming project.</p>

<table>  
<tr><td class="welovecodinghorror">[advertisement] At Stack Overflow, we put developers first. We already help you find answers to your tough coding questions; now let us help you <a href="http://careers.stackoverflow.com" rel="nofollow">find your next job</a>.</td></tr>  
</table>]]></content:encoded></item><item><title><![CDATA[Thanks For Ruining Another Game Forever, Computers]]></title><description><![CDATA[<p>In 2006, after <a href="http://blog.codinghorror.com/chess-computer-v-human/">visiting the Computer History Museum's exhibit on Chess</a>, I opined:</p>

<blockquote>
  <p>We may have reached an inflection point. The problem space of chess is so astonishingly large that incremental increases in hardware speed and algorithms are unlikely to result in meaningful gains from here on out.</p>
</blockquote>

<p>So. About</p>]]></description><link>https://blog.codinghorror.com/thanks-for-ruining-another-game-forever-computers/</link><guid isPermaLink="false">42ef9ce8-9e98-4741-bf61-fc0402be18d2</guid><dc:creator><![CDATA[Jeff Atwood]]></dc:creator><pubDate>Fri, 25 Mar 2016 22:29:41 GMT</pubDate><content:encoded><![CDATA[<p>In 2006, after <a href="http://blog.codinghorror.com/chess-computer-v-human/">visiting the Computer History Museum's exhibit on Chess</a>, I opined:</p>

<blockquote>
  <p>We may have reached an inflection point. The problem space of chess is so astonishingly large that incremental increases in hardware speed and algorithms are unlikely to result in meaningful gains from here on out.</p>
</blockquote>

<p>So. About that. Turns out I was kinda &hellip; <em>totally completely wrong</em>. The number of possible moves, or "problem space", of Chess is indeed astonishingly large, estimated to be 10<sup>50</sup>:</p>

<blockquote>
  <p>100,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000</p>
</blockquote>

<iframe width="420" height="315" src="https://www.youtube.com/embed/iSnAiXKU7h8" frameborder="0" allowfullscreen></iframe>

<p><a href="https://en.wikipedia.org/wiki/Deep_Blue_(chess_computer)">Deep Blue</a> was interesting because it forecast a particular kind of future, a future where <strong>specialized hardware enabled brute force attack of the enormous chess problem space</strong>, as its purpose built chess hardware outperformed general purpose CPUs of the day by <em>many</em> orders of magnitude. How many orders of magnitude? In the heady days of 1997, Deep Blue could evaluate <strong>200 million chess positions per second</strong>. And that was enough to defeat Kasparov, the highest ever ranked human player &ndash; until <a href="https://en.wikipedia.org/wiki/Comparison_of_top_chess_players_throughout_history">2014</a> at least. Even though one of its best moves was <a href="http://www.wired.com/2012/09/deep-blue-computer-bug/">the result of a bug</a>.</p>

<blockquote>
  <p>200,000,000</p>
</blockquote>

<p>In 2006, about ten years later, according to the <a href="http://www.chess.com/download/view/fritz-12-benchmark">Fritz Chess benchmark</a>, my PC could evaluate only 4.5 million chess positions per second.</p>

<blockquote>
  <p>4,500,000</p>
</blockquote>

<p>Today, about twenty years later, that very same benchmark says my PC can evaluate a mere 17.2 million chess positions per second.</p>

<blockquote>
  <p>17,200,000</p>
</blockquote>

<p>Ten years, four times faster. Not bad! Part of that is I went from dual to quad core, and these chess calculations scale almost linearly with the number of cores. An eight core CPU, no longer particularly exotic, could probably achieve ~28 million on this benchmark today.</p>

<blockquote>
  <p>28,000,000</p>
</blockquote>

<p>I am not sure the scaling is exactly linear, but it's fair to say that even now, <em>twenty years later</em>, a modern 8 core CPU is still about an order of magnitude slower at the brute force task of evaluating chess positions than what Deep Blue's specialized chess hardware achieved in 1997.</p>

<p>But here's the thing: none of that speedy brute forcing matters today. Greatly improved chess programs running on mere <em>handheld devices</em> can perform <a href="https://en.wikipedia.org/wiki/Human%E2%80%93computer_chess_matches#Pocket_Fritz_4_.282009.29">beyond grandmaster level</a>. </p>

<blockquote>
  <p>In 2009 a chess engine running on slower hardware, a 528 MHz HTC Touch HD mobile phone running Pocket Fritz 4 reached the grandmaster level &ndash; it won a category 6 tournament with a performance rating of 2898. <strong>Pocket Fritz 4 searches fewer than 20,000 positions per second. This is in contrast to supercomputers such as Deep Blue that searched 200 million positions per second.</strong></p>
</blockquote>

<p>As far as chess goes, despite what I so optimistically thought in 2006, it's been <em>game over</em> for humans for quite a few years now. The best computer chess programs, vastly more efficient than Deep Blue, combined with modern CPUs which are now finally within an order of magnitude of what Deep Blue's specialized chess hardware could deliver, play at levels way beyond what humans can achieve.</p>

<p><strong>Chess: ruined forever.</strong> Thanks, computers. You jerks.</p>

<p>Despite this resounding defeat, there was still hope for humans in the game of Go. The number of possible moves, or "problem space", of Go is estimated to be 10<sup>170</sup>:</p>

<blockquote>
  <p>1,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000</p>
</blockquote>

<p>Remember that Chess had a mere <em>fifty</em> zeroes there? Go has <a href="https://en.wikipedia.org/wiki/Go_and_mathematics">more possible moves than there are <strong>atoms in the universe</strong></a>.</p>

<p>Wrap your face around that one.</p>

<p><img src="https://blog.codinghorror.com/content/images/2016/03/go-game.jpg" alt=""></p>

<p>Deep Blue was a statement about the inevitability of <em>eventually</em> being able to brute force your way around a difficult problem with the constant wind of <a href="http://blog.codinghorror.com/moores-law-in-practical-terms/">Moore's Law</a> at your back. If Chess is the quintessential European game, Go is the quintessential Asian game. Go requires a completely different strategy. Go means wrestling with a problem that is essentially <a href="http://ai-depot.com/LogicGames/Go-Complexity.html">impossible for computers to solve in any traditional way</a>.</p>

<blockquote>
  <p>A simple material evaluation for chess works well &ndash; each type of piece is given a value, and each player receives a score depending on his/her remaining pieces. The player with the higher score is deemed to be 'winning' at that stage of the game. </p>
  
  <p>However, Chess programmers innocently asking Go players for an evaluation function would be met with disbelief! No such simple evaluation exists. Since there is only a single type of piece, only the number each player has on the board could be used for a simple material heuristic, and there is almost no discernible correlation between the number of stones on the board and what the end result of the game will be.</p>
</blockquote>

<p>Analysis of a problem this hard, with brute force completely off the table, is colloquially called "AI", though that term is a bit of a stretch to me. I prefer to think of it as building systems that can learn from experience, aka <a href="https://en.wikipedia.org/wiki/Machine_learning">machine learning</a>. Here's a talk which covers DeepMind learning to play classic Atari 2600 videogames. (Jump to the 10 minute mark to see what I mean.)</p>

<iframe width="560" height="315" src="https://www.youtube.com/embed/rbsqaJwpu6A" frameborder="0" allowfullscreen></iframe>

<p>As impressive as this is &ndash; and it truly is &ndash; bear in mind that games as simple as Pac-Man still remain far beyond the grasp of Deep Mind. But what happens when you point a system like that at the game of Go?</p>

<p>DeepMind built a system, <a href="https://en.wikipedia.org/wiki/AlphaGo">AlphaGo</a>, designed to see how far they could get with those approaches in the game of Go. AlphaGo recently played one of the best Go players in the world, Lee Sedol, and <a href="https://en.wikipedia.org/wiki/AlphaGo_versus_Lee_Sedol">defeated him in a stunning 4-1 display</a>. Being the optimist that I am, I guessed that DeepMind would win one or two games, but a near total rout like this? Incredible. <strong>In the space of just 20 years, computers went from barely beating the best humans at Chess, with a problem space of 10<sup>50</sup>, to definitively beating the best humans at Go, with a problem space of 10<sup>170</sup>.</strong> How did this happen? </p>

<p>Well, a few things happened, but one unsung hero in this transformation is the humble video card, or GPU. </p>

<p><img src="https://blog.codinghorror.com/content/images/2016/03/asus-380x-front.jpg" alt=""></p>

<p>Consider this breakdown of <a href="https://en.m.wikipedia.org/wiki/FLOPS#Hardware_costs">the cost of floating point operations</a> over time, measured in <strong>dollars per gigaflop</strong>:</p>

<table style="width:320px">  
<tr><td>1961</td><td>$8,300,000,000</td><td>  
</td></tr><tr><td>1984</td><td>$42,780,000</td><td>  
</td></tr><tr><td>1997</td><td>$42,000</td><td>  
</td></tr><tr><td>2000</td><td>$1,300</td><td>  
</td></tr><tr><td>2003</td><td>$100</td><td>  
</td></tr><tr><td>2007</td><td>$52</td><td>  
</td></tr><tr><td>2011</td><td>$1.80</td><td>  
</td></tr><tr><td>2012</td><td>$0.73</td><td>  
</td></tr><tr><td>2013</td><td>$0.22</td><td>  
</td></tr><tr><td>2015</td><td>$0.08</td><td>  
</td></tr></table>

<p>What's not clear in this table is that after 2007, <strong>all the big advances in FLOPS came from gaming video cards</strong> designed for high speed real time 3D rendering, and as an incredibly beneficial side effect, they also turn out to be <a href="https://blogs.nvidia.com/blog/2016/01/12/accelerating-ai-artificial-intelligence-gpus/">crazily fast at machine learning tasks</a>.</p>

<blockquote>
  <p>The Google Brain project had just achieved amazing results — it learned to recognize cats and people by watching movies on YouTube. But it required 2,000 CPUs in servers powered and cooled in one of Google’s giant data centers. Few have computers of this scale. Enter NVIDIA and the GPU. Bryan Catanzaro in NVIDIA Research teamed with Andrew Ng’s team at Stanford to use GPUs for deep learning. As it turned out, 12 NVIDIA GPUs could deliver the deep-learning performance of 2,000 CPUs.</p>
</blockquote>

<p>Let's consider a related case of highly parallel computation. How much faster is a GPU at <a href="http://blog.codinghorror.com/speed-hashing/">password hashing</a>?</p>

<table cellpadding="2" cellspacing="2" style="width:300px">  
<tr><td>Radeon 7970</td><td align="right">8213.6 M c/s</td></tr>  
<tr><td>6-core AMD CPU</td><td align="right">52.9 M c/s</td></tr>  
</table>

<p>Only <strong>155 times faster</strong> right out of the gate. No big deal. On top of that, CPU performance has largely stalled in the last decade. While more and more cores are placed on each die, which is great when the problems are parallelizable &ndash; as they definitely are in this case &ndash; the actual performance improvement of any individual core over the last 5 to 10 years is rather modest.</p>

<p><strong>But GPUs are still doubling in performance every few years</strong>. Consider password hash cracking expressed in the rate of <a href="http://www.crackingservice.com/?q=node/20">hashes per second</a>:</p>

<table style="width:320px">  
<tr><td>GTX 295</td><td>2009</td><td>25k</td></tr>  
<tr><td>GTX 690</td><td>2012</td><td>54k</td></tr>  
<tr><td>GTX 780 Ti</td><td>2013</td><td>100k</td></tr>  
<tr><td>GTX 980 Ti</td><td>2015</td><td>240k</td></tr>  
</table>

<p>The latter video card is the one in my machine right now. It's likely the next major revision from Nvidia, due later this year, will <a href="http://wccftech.com/nvidia-pascal-gpu-gtc-2015/">double these rates again</a>. </p>

<p>(While I'm at it, I'd like to emphasize how much it sucks to be an 8 character password in today's world. <strong>If your password is only 8 characters, that's perilously close to no password at all.</strong> That's also why why <a href="http://blog.codinghorror.com/your-password-is-too-damn-short/">your password is (probably) too damn short</a>. In fact, we just raised the <em>minimum</em> allowed password length on <a href="http://www.discourse.org">Discourse</a> to 10 characters, because annoying password complexity rules are much less effective in reality than <a href="http://arstechnica.com/security/2013/06/password-complexity-rules-more-annoying-less-effective-than-length-ones/">simply requiring longer passwords</a>.)</p>

<p><a href="https://www.tastehit.com/blog/google-deepmind-alphago-how-it-works/">Distributed AlphaGo</a> used 1202 CPUs and <strong>176 GPUs</strong>. While that doesn't sound like much, consider that as we've seen, each GPU can be up to 150 times faster at processing these kinds of highly parallel datasets &mdash; so those 176 GPUs were the equivalent of adding ~26,400 CPUs to the task. Or more!</p>

<p>Even if you don't care about video games, they happen to have a profound accidental impact on machine learning improvements. <strong>Every time you see a new video card release, don't think "slightly nicer looking games" think "wow, hash cracking and AI just got 2&times; faster &hellip; again!"</strong></p>

<p>I'm certainly not making the same mistake I did when looking at Chess in 2006. (And in my defense, I totally did not see the era of GPUs as essential machine learning aids coming, even though I am a gamer.) If AlphaGo was intimidating today, having soundly beaten the best human Go player in the world, it'll be no contest after a few more years of GPUs doubling and redoubling their speeds again. </p>

<p>AlphaGo, broadly speaking, is the culmination of two very important trends in computing:</p>

<ol>
<li><p>Huge increases in parallel processing power driven by consumer GPUs and videogames, which started in 2007. So if you're a gamer, congratulations! You're part of the problem-slash-solution.</p></li>
<li><p>We're beginning to build sophisticated (and combined) algorithmic approaches for entirely new problem spaces that are far too vast to even begin being solved by brute force methods alone. And these approaches clearly work, insofar as they mastered one of the hardest games in the world, one that many thought humans would never be defeated in.</p></li>
</ol>

<p>Great. <a href="http://www.newyorker.com/tech/elements/in-the-age-of-google-deepmind-do-the-young-go-prodigies-of-asia-have-a-future">Another game ruined forever by computers</a>. Jerks.</p>

<p>Based on our experience with Chess, and now Go, we know that computers will continue to beat us at virtually every game we play, in the same way that dolphins will always swim faster than we do. But what if that very same human mind was capable of not only building the dolphin, but continually refining it until they arrived at the <a href="http://jacquesmattheij.com/another-way-of-looking-at-lee-sedol-vs-alphago">world's fastest minnow</a>? Where Deep Blue was the more or less inevitable end result of brute force computation, AlphaGo is the beginning of a whole new era of sophisticated problem solving against far more enormous problems. <strong>AlphaGo's victory is not a defeat of the human mind, but its greatest triumph.</strong></p>

<p>(If you'd like to learn more about the powerful intersection of sophisticated machine learning algorithms and your GPU, read <a href="https://www.tastehit.com/blog/google-deepmind-alphago-how-it-works/">this excellent summary of AlphaGo</a> and then <a href="https://github.com/kuz/DeepMind-Atari-Deep-Q-Learner">download the DeepMind Atari learner</a> and try it yourself.)</p>

<table>  
<tr><td class="welovecodinghorror">  
[advertisement] <a href="http://careers.stackoverflow.com" rel="nofollow">Find a better job the Stack Overflow way</a> - what you need when you need it, no spam, and no scams.
</td></tr>  
</table>]]></content:encoded></item><item><title><![CDATA[We Hire the Best, Just Like Everyone Else]]></title><description><![CDATA[<p>One of the most common pieces of advice you'll get as a startup is this:</p>

<blockquote>
  <p><strong>Only hire the best.</strong> The quality of the people that work at your company will be one of the biggest factors in your success &ndash; or failure.</p>
</blockquote>

<p>I've heard this advice over and over and</p>]]></description><link>https://blog.codinghorror.com/we-hire-the-best-just-like-everyone-else/</link><guid isPermaLink="false">0021de52-3433-4795-bcea-ac469b44e36c</guid><dc:creator><![CDATA[Jeff Atwood]]></dc:creator><pubDate>Fri, 04 Mar 2016 12:17:58 GMT</pubDate><content:encoded><![CDATA[<p>One of the most common pieces of advice you'll get as a startup is this:</p>

<blockquote>
  <p><strong>Only hire the best.</strong> The quality of the people that work at your company will be one of the biggest factors in your success &ndash; or failure.</p>
</blockquote>

<p>I've heard this advice over and over and over at startup events, to the point that I got a little sick of hearing it. It's not wrong. Putting aside the fact that every single other startup in the world who heard this same advice before you is already out there frantically doing everything they can to hire all the best people out from under you and everyone else, it is superficially true. A company staffed by a bunch of people who don't care about their work and aren't good at their jobs isn't exactly poised for success. But in a room full of people giving advice to startups, nobody wants to talk about the elephant in that room:</p>

<blockquote>
  <p>It doesn't matter how good the people are at your company when you happen to be working on the wrong problem, at the wrong time, using the wrong approach.</p>
</blockquote>

<p>Most startups, statistically speaking, <a href="http://fortune.com/2014/09/25/why-startups-fail-according-to-their-founders/">are going to fail</a>.</p>

<p><a href="https://www.cbinsights.com/blog/startup-failure-post-mortem/"><img src="https://blog.codinghorror.com/content/images/2016/03/top-20-reasons-startups-fail.png" alt="" title=""></a></p>

<p>And they will fail regardless of whether they hired "the best" due to circumstances largely beyond their control. So in that context does maximizing for the best possible hires really make sense?</p>

<p>Given the risks, I think maybe "hire the nuttiest risk junkie adrenaline addicted has-ideas-so-crazy-they-will-never-work people you can find" might actually be more practical startup advice. (Actually, now that I think about it, if that describes you, and you have serious Linux, Ruby, and JavaScript chops, perhaps you should email me.)</p>

<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">I told that person the same thing I tell all prospective job candidates: &quot;come with me if you want to live&quot;</p>&mdash; Jeff Atwood (@codinghorror) <a href="https://twitter.com/codinghorror/status/602375505694720000">May 24, 2015</a></blockquote>  

<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<p>Okay, the goal is to increase your <em>chance</em> of success, <s>however small it may be</s>, therefore you should strive to hire the best. Seems reasonable, even noble in its way. But this pursuit of the best unfortunately comes with a serious dark side. Can anyone even tell me what "best" is? By what metrics? Judged by which results? How do we measure this? Who among us is suitable to judge others as the best at &hellip; what, exactly? Best is an extreme. Not pretty good, not very good, not excellent, but aiming for the crème de la crème, <a href="http://www.joelonsoftware.com/articles/HighNotes.html">the top 1% in the industry</a>.</p>

<blockquote>
  <p>The real trouble with using a lot of mediocre programmers instead of a couple of good ones is that no matter how long they work, they never produce something as good as what the great programmers can produce.</p>
</blockquote>

<p>Pursuit of this extreme means <strong>hiring anyone less than the best becomes unacceptable, even harmful</strong>:</p>

<blockquote>
  <p>In the Macintosh Division, we had a saying, “A players hire A players; B players hire C players” – meaning that great people hire great people. On the other hand, mediocre people hire candidates who are not as good as they are, so they can feel superior to them. (If you start down this slippery slope, you’ll soon end up with Z players; this is called The Bozo Explosion. It is followed by The Layoff.) &mdash; <a href="http://guykawasaki.com/the_art_of_recr-2/">Guy Kawasaki</a></p>
</blockquote>

<!-- -->

<blockquote>
  <p>There is an opportunity cost to keeping someone when you could do better. At a startup, that opportunity cost may be the difference between success and failure. Do you give less than full effort to make your enterprise a success? As an entrepreneur, you sweat blood to succeed. Shouldn’t you have a team that performs like you do? Every person you hire who is not a top player is like having a leak in the hull. Eventually you will sink. &mdash; <a href="http://venturebeat.com/2013/02/06/why-hiring-b-players-will-kill-your-startup/">Jon Soberg</a></p>
</blockquote>

<!-- -->

<blockquote>
  <p>Why am I so hardnosed about this? It’s because it is much, <em>much</em> better to reject a good candidate than to accept a bad candidate. A bad candidate will cost a lot of money and effort and waste other people’s time fixing all their bugs. Firing someone you hired by mistake can take months and be nightmarishly difficult, especially if they decide to be litigious about it. In some situations it may be completely impossible to fire anyone. Bad employees demoralize the good employees. And they might be bad programmers but really nice people or maybe they <em>really need this job</em>, so you can’t bear to fire them, or you can’t fire them without pissing everybody off, or whatever. It’s just a bad scene. </p>
  
  <p>On the other hand, if you reject a good candidate, I mean, I guess in some existential sense an injustice has been done, but, hey, if they’re so smart, don’t worry, they’ll get <em>lots</em> of good job offers. Don’t be afraid that you’re going to reject too many people and you won’t be able to find anyone to hire. During the interview, it’s not your problem. Of course, it’s important to seek out good candidates. But once you’re actually interviewing someone, pretend that you’ve got 900 more people lined up outside the door. Don’t lower your standards no matter how hard it seems to find those great candidates. &mdash; <a href="http://www.joelonsoftware.com/articles/GuerrillaInterviewing3.html">Joel Spolsky</a></p>
</blockquote>

<p>I don't mean to be critical of anyone I've quoted. I love Joel, we founded Stack Overflow together, and his advice about interviewing and hiring <a href="http://www.amazon.com/Smart-Gets-Things-Done-Technical/dp/1590598385/?tag=codihorr-20">remains some of the best in the industry</a>. It's hardly unique to express these sort of opinions in the software and startup field. I could have cited two dozen different articles and treatises about hiring that say the exact same thing: aim high and set out to hire the best, or <em>don't bother</em>.</p>

<p><img src="https://blog.codinghorror.com/content/images/2016/03/How-do-you-avoid-a-bad-hire.jpeg" alt=""></p>

<p>This risk of hiring not-the-best is so severe, so existential a crisis to the very survival of your company or startup, the hiring process has to become highly selective, even arduous. <strong>It is better to reject a good applicant <em>every single time</em> than accidentally accept one single mediocre applicant.</strong> If the interview process produces literally anything other than unequivocal "Oh my God, this person is unbelievably talented, we have to hire them", from every single person they interviewed with, right down the line, then it's an automatic NO HIRE. Every time.</p>

<p>This level of strictness always made me uncomfortable. I'm not going to lie, it starts with my own selfishness. I'm pretty sure I wouldn't get hired at big, famous companies with legendarily difficult technical interview processes because, you know, <em>they only hire the best</em>. I don't think I am one of the best. More like <a href="http://blog.codinghorror.com/who-needs-talent-when-you-have-intensity/">cranky, tenacious, and outspoken</a>, to the point that I wake up most days not even wanting to work with myself.</p>

<p>If your hiring attitude is that it's better to be possibly wrong a hundred times so you can be absolutely right one time, you're going to be primed to throw away a lot of candidates on pretty thin evidence.</p>

<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">Before cofounding GitHub I applied for an engineering job at Yahoo and didn’t get it. Don’t let other people discourage you.</p>&mdash; Chris Wanstrath (@defunkt) <a href="https://twitter.com/defunkt/status/469607846527520768">May 22, 2014</a></blockquote>  

<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">I&#39;ve been twitter following the careers of people we interviewed but passed on at my last gig.<br><br>Turns out we were almost always wrong.</p>&mdash; Trek Glowacki (@trek) <a href="https://twitter.com/trek/status/692116840940716032">January 26, 2016</a></blockquote>  

<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<p>Perhaps worst of all, if the interview process is predicated on zero doubt, total confidence &hellip; maybe this candidate doesn't feel right because they don't look like you, dress like you, think like you, speak like you, or come from a similar background as you? Are you <strong>accidentally maximizing for hidden bias?</strong></p>

<p>One of the best programmers I ever worked with was Susan Warren, an ex-Microsoft engineer who taught me about the <a href="https://web.archive.org/web/20051101203600/http://weblogs.asp.net/swarren/archive/2004/04/26/120366.aspx">People Like Us problem</a>, way back in 2004:</p>

<blockquote>
  <p>I think there is a real issue around diversity in technology (and most other places in life).  I tend to think of it as the PLU problem.  Folk (including MVPs) tend to connect best with folks most like them ("People Like Us").  In this case, male MVPs pick other men to become MVPs.  It's just human nature.</p>
  
  <p>As one reply notes, diversity is good.  I'd go as far as to say it's awesome, amazing, priceless.  But it's hard to get to -- the classic chicken and egg problem -- if you rely on your natural tendencies alone.  In that case, if you want more female MVPs to be invited you need more female MVPs.  If you want more Asian-American MVPs to be invited you need more Asian-American MVPs, etc.  And the (cheap) way to break a new group in is via quotas.</p>
  
  <p>IMO, building diversity via quotas is bad because they are unfair.  Educating folks on why diversity is awesome and how to build it is the right way to go, but also far more costly.</p>
</blockquote>

<p>Susan was (and is) amazing. I learned so much working under her, and a big part of what made her awesome was that she was very much Not Like Me. But how could I have appreciated that before meeting her? The fact is that as human beings, we tend to prefer what's comfortable, and what's most comfortable of all is &hellip; well, People Like Us. The effect can be shocking because it's so subtle, so unconscious &ndash; and yet, surprisingly strong:</p>

<ul>
<li><p>Baseball cards held by a black hand consistently sold for <a href="https://www.washingtonpost.com/news/wonk/wp/2015/12/11/whites-earn-more-than-blacks-even-on-ebay/">twenty percent less</a> than those held by a white hand.</p></li>
<li><p>Using screens to hide the identity of auditioning musicians increased women's probability of advancing from preliminary orchestra auditions <a href="http://www.nber.org/papers/w5903">by fifty percent</a>.</p></li>
<li><p>Denver police officers and community members were shown rapidly displayed photos of black and white men, some holding guns, some holding harmless objects like wallets, and asked to press either the "Shoot" or "Don't Shoot" button as fast as they could for each image. Both the police and community members were <a href="http://www.motherjones.com/politics/2014/11/science-of-racism-prejudice">three times more likely to shoot black men</a>.</p></li>
</ul>

<p>It's not intentional, it's never intentional. That's the problem. I think our industry needs to shed this old idea that it's OK, even <em>encouraged</em> to turn away technical candidates for anything less than absolute 100% confidence at every step of the interview process. Because when you do, <strong>you are accidentally optimizing for implicit bias</strong>. Even as a white guy who probably fulfills every stereotype you can think of about programmers, and who is in fact <a href="https://twitter.com/codinghorror/status/644616067847880705">wearing an "I Rock at Basic" t-shirt</a> while writing this very blog post*, that's what has always bothered me about it, more than the strictness. If you care at all about diversity in programming and tech, on any level, this hiring approach is not doing anyone any favors, and hasn't been. For years.</p>

<p>I know what you're thinking.</p>

<blockquote>
  <p>Fine, Jeff, if you're so smart, and "hiring the best" isn't the right strategy for startups, and maybe even harmful to our field as a whole, what <em>should</em> be doing? </p>
</blockquote>

<p>Well, I don't know, exactly. I may be the wrong person to ask because <a href="http://firstround.com/review/Heres-Why-Youre-Not-Hiring-the-Best-and-the-Brightest/">I'm also a big believer in <em>geographic</em> diversity on top of everything else</a>. Here's what the composition of the current Discourse team looks like:</p>

<p><img src="https://blog.codinghorror.com/content/images/2016/03/discourse-team-timezones.png" alt=""></p>

<p>I would argue, quite strongly and at some length, that if you want better diversity in the field, perhaps a good starting point is <strong>not demanding that all your employees live within a tiny 30 mile radius of San Francisco or Palo Alto.</strong> There's a whole wide world of Internet out there, full of amazing programmers at every level of talent and ability. Maybe broaden your horizons a little, even stretch said horizons outside the United States, <a href="https://ma.tt/2014/12/how-paul-graham-is-wrong/">if you can imagine such a thing</a>.</p>

<p>I know hiring people is difficult, even with the very best of intentions and under ideal conditions, so I don't mean to trivialize the challenge. I've recommended plenty of things in the past, a smorgasboard of approaches to try or leave on the table as you see fit:</p>

<ul>
<li><a href="http://blog.codinghorror.com/on-interviewing-programmers/">On Interviewing Programmers</a></li>
<li><a href="http://blog.codinghorror.com/the-nonprogramming-programmer/">The Non-Programming Programmer</a></li>
<li><a href="http://blog.codinghorror.com/how-to-hire-a-programmer/">How to Hire a Programmer</a></li>
<li><a href="http://blog.codinghorror.com/the-years-of-experience-myth/">The years of experience myth</a></li>
</ul>

<p>&hellip; but the one thing I keep coming back to, that I believe has enduring value in almost all situations, is <a href="https://hbr.org/2014/04/the-ceo-of-automattic-on-holding-auditions-to-build-a-strong-team">the audition project</a>:</p>

<blockquote>
  <p>The most significant shift we’ve made is requiring every final candidate to work with us for three to eight weeks on a contract basis. Candidates do real tasks alongside the people they would actually be working with if they had the job. They can work at night or on weekends, so they don’t have to leave their current jobs; most spend 10 to 20 hours a week working with Automattic, although that’s flexible. (Some people take a week’s vacation in order to focus on the tryout, which is another viable option.) The goal is not to have them finish a product or do a set amount of work; it’s to allow us to quickly and efficiently assess whether this would be a mutually beneficial relationship. They can size up Automattic while we evaluate them. </p>
</blockquote>

<p>What I like about audition projects:</p>

<ul>
<li>It's real, practical work.</li>
<li>They get paid. (Ask yourself who gets "paid" for a series of intensive interviews that lasts multiple days? Certainly not the candidate.)</li>
<li>It's healthy to structure your work so that small projects like this can be taken on by outsiders. If you can't onboard a potential hire, you probably can't onboard a new hire very well either.</li>
<li>Interviews, no matter how much effort you put into them, are so hit and miss that the only way to figure out if someone is <em>really</em> going to work in a given position is to <strong>actually work with them.</strong></li>
</ul>

<p>Every company says they want to hire the best. Anyone who tells you they know how to do that is either lying to you or to themselves. But I can tell you this: the companies that really <em>do</em> hire the best people in the world certainly don't accomplish that by hiring from the same tired playbook every other company in Silicon Valley uses.</p>

<p>Try different approaches. Expand your horizons. Look beyond People Like Us and imagine what the world of programming could look like in 10, 20 or even 50 years &ndash; and help us move there by hiring to make it so.</p>

<p>* And for the record, <a href="http://blog.codinghorror.com/everything-i-needed-to-know-about-programming-i-learned-from-basic/">I really do rock at BASIC</a>.</p>

<table>  
<tr><td class="welovecodinghorror">  
[advertisement] Building out your tech team? <a href="http://careers.stackoverflow.com/products" rel="nofollow">Stack Overflow Careers</a> helps you hire from the largest community for programmers on the planet. We built our site with developers like you in mind.
</td></tr>  
</table>]]></content:encoded></item></channel></rss>
