<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description></description><title>Ben Kamens</title><generator>Tumblr (3.0; @bjk5)</generator><link>http://bjk5.com/</link><item><title>You must stop coding, you must keep coding</title><description>&lt;p&gt;&lt;a href="http://www.khanacademy.org/about/the-team"&gt;Our dev team&lt;/a&gt;&amp;#8217;s grown to twenty-three and when the summer intern zenith hits we&amp;#8217;ll be — this is weird to type — &lt;em&gt;forty&lt;/em&gt; for a few frightening days.&lt;/p&gt;

&lt;p&gt;My biggest personal challenge now, by far: How do you stay connected to a product amidst all this scary &lt;strong&gt;m͓͇̘̗a̴̹̠̜̝͖̘n̩͙̘͙̫ͅa̬͙̖̬͍̦͔g͓̼͈͇̙i̪̺̘̙̻͘n͕̠̰̦̗g̗&lt;/strong&gt;? Do you &lt;a href="http://www.joelonsoftware.com/articles/fog0000000339.html"&gt;launch the damn editor&lt;/a&gt;? Write a single line of code?&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve been trying to squeeze every last bit of advice out of &lt;a href="http://www.randsinrepose.com/archives/2007/02/07/technicality.html"&gt;role-models&lt;/a&gt; &lt;a href="http://stackoverflow.com/users/91687/david-fullerton"&gt;I&lt;/a&gt; &lt;a href="http://adam.heroku.com/past/2011/4/28/scaling_a_development_team/"&gt;respect&lt;/a&gt;. I&amp;#8217;m seeking stories from folks who&amp;#8217;ve successfully navigated these waters. From personally writing tons of code in v1 to scaling and managing teams who then receive profuse apologies for all those v1 hacks. If this is you, plz send tips.&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;re the various mentor voices in my head so far.&lt;/p&gt;

&lt;blockquote&gt;&lt;div&gt;You must &lt;strong&gt;stop coding&lt;/strong&gt;. But you &lt;strong&gt;must not stop coding&lt;/strong&gt;. &lt;strong&gt;Stay very connected&lt;/strong&gt; to your product. Make mockups and decisions and docs. &lt;strong&gt;Scale&lt;/strong&gt; your team. Intimately &lt;strong&gt;know your tech&lt;/strong&gt; and your tools. &lt;strong&gt;Don&amp;#8217;t get out-of-date&lt;/strong&gt;. &lt;strong&gt;&lt;em&gt;Be&lt;/em&gt; a coder&lt;/strong&gt;, but &lt;strong&gt;don&amp;#8217;t waste time &lt;em&gt;in&lt;/em&gt; the code&lt;/strong&gt;.&lt;br/&gt;&lt;br/&gt;You absolutely without a doubt need to keep coding, but under no circumstances should you be &lt;em&gt;coding&lt;/em&gt;.&lt;/div&gt;&lt;/blockquote&gt;

&lt;p&gt;Got it. ✔ Chhhheck!&lt;/p&gt;

&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/mc0mn2a4c/photo.jpg" alt="image"/&gt;&lt;/p&gt;

&lt;p&gt;As confusing as that seems, there is solid agreement for how a technical manager should spend, say, 85% of her time. Scaling, recruiting, empowering, refining some teams&amp;#8217; focus, blah blah blah BLAH we&amp;#8217;ve all heard it. Everybody agrees.&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s the other 15% of the day that&amp;#8217;s up for debate. This is that short bit of time when you do &lt;em&gt;something&lt;/em&gt; creative that magically keeps you tied to your product and on top of your tech stack and immunized against pointy-haired-boss disease. Some suggest mockups, some suggest small production bug fixes, some suggest adding unit tests, some suggest writing code that you never intend to check in.&lt;/p&gt;

&lt;h1&gt;Being a coder without &lt;em&gt;coding&lt;/em&gt;&lt;/h1&gt;&lt;br/&gt;&lt;p&gt;There&amp;#8217;s leeway here, so for anybody else who&amp;#8217;s trying to figure it out, here&amp;#8217;s how I&amp;#8217;ve chosen to spend &lt;a href="http://bjk5.com/post/35488799286/a-maker-managers-schedule"&gt;my intentionally non-managerial time&lt;/a&gt;.&lt;/p&gt;

&lt;img class="rightInset" style="float:right; width:300px;" src="http://static.tumblr.com/9hgswys/jHJmn2aay/photo__1_.jpg" alt="image"/&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Fixing small bugs for various teams.&lt;/strong&gt; From a performance tweak to fixing a x-browser bug. &lt;em&gt;Small&lt;/em&gt;, maybe 1 hour of work. I see the code, I make sure my dev tools are up-to-date, I ship, I communicate what I fixed. In and out. I can lightly connect with multiple teams this way.&lt;br/&gt;&lt;br/&gt;&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Pairing with somebody for 1 or 2 hours a week.&lt;/strong&gt; I work with a developer who&amp;#8217;s extremely effective at making use of my time if I give it to him. I put a block on our calendars, show up at his desk, and do exactly what he tells me to do. His project moves a bit faster, he steals whatever codebase knowledge I have left from earlier days, and I get to make a difference in our product by following his lead. I don&amp;#8217;t personally think this would work if I showed up at just anybody&amp;#8217;s desk. He&amp;#8217;s unique, I&amp;#8217;m lucky.&lt;br/&gt;&lt;br/&gt;&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Asking teams to send 1-4 hour dev tasks my way.&lt;/strong&gt; I&amp;#8217;d normally assume that this would overload me and I&amp;#8217;d have to turn everybody down, but I&amp;#8217;m actually still waiting on these tasks. *wink*.&lt;br/&gt;&lt;br/&gt;&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Participating in hackathons.&lt;/strong&gt; I am excited to run another &lt;a href="http://bjk5.com/post/26810034751/how-we-ran-the-first-khan-academy-healthy-hackathon"&gt;healthy hackathon&lt;/a&gt; this summer just so I can drop my managerial hat, hide in a corner, and hack.&lt;br/&gt;&lt;br/&gt;&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Using the weekends.&lt;/strong&gt; This is a dirty secret. Little management needs to happen on weekends, so I use some free time to hack. Controversial and not a great tip to give everyone, but it&amp;#8217;s important to me.&lt;br/&gt;&lt;br/&gt;&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Shutting myself away for a few days and coding a small feature.&lt;/strong&gt; Last time I did this? Months ago. Last time I did this without feeling that I&amp;#8217;d shirked more important duties? Over a year ago. I no longer think it&amp;#8217;s wise. &amp;#8220;You must stop coding.&amp;#8221;&lt;/li&gt;
&lt;/ul&gt;&lt;h1&gt;As confused as me?&lt;/h1&gt;&lt;br/&gt;&lt;p&gt;&lt;a href="http://www.randsinrepose.com/archives/2007/02/07/technicality.html"&gt;Rands&amp;#8217; Technicality&lt;/a&gt; is the authoritative piece on this search for maker/manager balance. He opens with &amp;#8220;&lt;em&gt;Stop coding.&lt;/em&gt;&amp;#8221; By the end he commands, &amp;#8220;&lt;em&gt;Don’t stop developing.&lt;/em&gt;&amp;#8221;&lt;/p&gt;

&lt;p&gt;What&amp;#8217;s clear is these waters are murky. Any good technical manager must go through the difficult transition from coding to spending almost their entire day empowering smarter teammates. But how you maintain that certain &lt;em&gt;je ne sais quoi&lt;/em&gt; that separates you from the non-technical manager you never want to be is a pretty personal choice.&lt;/p&gt;

&lt;p&gt;Me? I have to &lt;a href="http://www.joelonsoftware.com/articles/fog0000000339.html"&gt;launch the damn editor&lt;/a&gt;. Just for 30 minutes. Not to code, but to code a single line.&lt;/p&gt;</description><link>http://bjk5.com/post/50847975319</link><guid>http://bjk5.com/post/50847975319</guid><pubDate>Sun, 19 May 2013 13:31:00 -0700</pubDate></item><item><title>The Absolute Minimum Every Khan Academy Developer Absolutely, Positively Must Know About Mentoring Interns</title><description>&lt;p&gt;Heard a bit of an interview with Dick Costolo while driving home. He was telling the story of why he started his &amp;#8220;Managing at Twitter&amp;#8221; course that he personally teaches to all new managers. It went something like so:&lt;/p&gt;

&lt;blockquote&gt;&lt;div&gt;An engineer came up to me who had recently switched from one Twitter dev team to another.&lt;br/&gt;&lt;br/&gt;He said, &amp;#8220;My old manager used to hold 1:1 meetings with me. My new one doesn&amp;#8217;t believe in them. Which is it? Should I be having 1:1 meetings with my manager at Twitter?&amp;#8221;&lt;/div&gt;&lt;/blockquote&gt;

&lt;p&gt;Supposedly this kicked off a wave of realizations in Dick&amp;#8217;s head about all the inconsistencies in Twitter&amp;#8217;s management styles. He wanted to fix the problem, started his &amp;#8220;Managing at Twitter&amp;#8221; course, and you&amp;#8217;d have to ask some manager at Twitter what happened next because how the hell would I know if it&amp;#8217;s working.&lt;/p&gt;

&lt;blockquote class="twitter-tweet tw-align-center"&gt;&lt;p&gt;Working on v1.1 of &amp;#8220;Managing at Twitter&amp;#8221; that I teach to managers at Twitter. - thought it would end up being a 2hr class &amp;amp; it&amp;#8217;s 6 hours.&lt;/p&gt;    &lt;div&gt;&lt;a href="https://twitter.com/dickc/status/135437863285297153"&gt;November 12, 2011&lt;/a&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;br/&gt;&lt;script src="//platform.twitter.com/widgets.js" charset="utf-8" type="text/javascript"&gt;&lt;/script&gt;&lt;p&gt;The story did strike a chord with me. As Khan Academy&amp;#8217;s pool of new mentors grows while interns simultaneously flood in the door (13 confirmed so far this summer, &lt;a href="http://khanacademy.org/careers/interns"&gt;join up&lt;/a&gt;), it feels healthy to head off any mentorship inconsistencies at the pass.&lt;/p&gt;

&lt;p&gt;I want simple and uncharacteristically terse guidelines for Khan Academy mentors. Here goes.&lt;/p&gt;

&lt;img class="rightInset" style="width:230px;height:475px; float: right;" src="http://static.tumblr.com/9hgswys/x5Nmk20gj/photo.jpg" alt="image"/&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Explicitly say &amp;#8220;I&amp;#8217;m your mentor, I&amp;#8217;m here to help&amp;#8221; on the first day.&lt;/strong&gt;&lt;br/&gt;
Don&amp;#8217;t have to use those words, but you get the picture. Leave no doubt about what your intern should do if they&amp;#8217;re stuck.&lt;br/&gt;&lt;br/&gt;&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Hold weekly 1:1s.&lt;/strong&gt;&lt;br/&gt;
A 12-14 week internship flies by. These 1:1s are our best checkpoints for getting feedback, giving mentorship, and making sure interns are getting what they want out of the summer.&lt;br/&gt;&lt;br/&gt;&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Have small, well-defined projects ready on day one.&lt;/strong&gt;&lt;br/&gt;
If interns can ship on day one, great. We&amp;#8217;ve done it before, we&amp;#8217;ll do it again. Well-defined starter projects are the bread&amp;#8217;n&amp;#8217;butter of team onboarding.&lt;br/&gt;&lt;br/&gt;&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Set aside time in the first two days to explain your team&amp;#8217;s higher purpose.&lt;/strong&gt;&lt;br/&gt;
Your team has a big goal for the summer. Bring interns into the fold. They should see the bird&amp;#8217;s-eye view of your group&amp;#8217;s projects and priorities. If we hired right, they&amp;#8217;re smarter than us and will surprise us w/ new ideas.&lt;br/&gt;&lt;br/&gt;&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Set code review expectations.&lt;/strong&gt;&lt;br/&gt;&lt;a href="https://sites.google.com/a/khanacademy.org/forge/for-developers/code-review-policy"&gt;We care about reviews&lt;/a&gt; and &lt;a href="http://bjk5.com/post/3994859683/code-reviews-as-relationship-builders-a-few-tips"&gt;the relationships they build&lt;/a&gt;. Three simple steps: tell them their first reviews will be brutal, it&amp;#8217;s nothing to be concerned about. Review their code. Ask them to review yours.&lt;br/&gt;&lt;br/&gt;&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Require sharing.&lt;/strong&gt;&lt;br/&gt;
Schedule team-wide demos for your interns. Encourage blogging. We err on the side of being overly communicative.&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;Mentorship is nuanced, and the above is purposefully far from exhaustive. If we&amp;#8217;re gonna have &lt;a href="http://bjk5.com/post/23266999170/how-intern-mentorship-works-at-khan-academy"&gt;the same old shockingly high expectations for mentorship quality&lt;/a&gt; that we had when we were a much smaller team (we do!). we&amp;#8217;ll need to keep building artifacts like the above for our growing team (we just did!).&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://sites.google.com/a/khanacademy.org/forge/for-developers/mentoring-product-interns-1"&gt;team&amp;#8217;s official living document is here&lt;/a&gt;. I&amp;#8217;m sure it&amp;#8217;ll change soon enough. I&amp;#8217;m just blogging Version 1 because we like to share. And apologies to &lt;a href="http://www.joelonsoftware.com/articles/Unicode.html"&gt;Joel&lt;/a&gt; for ripping off his title.&lt;/p&gt;</description><link>http://bjk5.com/post/45981136553</link><guid>http://bjk5.com/post/45981136553</guid><pubDate>Fri, 22 Mar 2013 02:13:00 -0700</pubDate></item><item><title>Breaking down Amazon's mega dropdown</title><description>&lt;p&gt;
The hover effects on Amazon&amp;#8217;s big &amp;#8216;ole &amp;#8220;Shop by Department&amp;#8221; mega dropdown are super fast. Look&amp;#8217;it how quick each submenu fills in as your mouse moves down the list:
&lt;/p&gt;

&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/qpkmj8bye/amazon-fast-2.gif" alt="image"/&gt;&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s instant. I got &lt;a href="http://xkcd.com/356/"&gt;nerd sniped&lt;/a&gt; by this. Most dropdown menus have to include &lt;a href="http://www.mackido.com/Interface/hysteresis.html"&gt;a bit of a delay&lt;/a&gt; when activating submenus. Here&amp;#8217;s an old Khan Academy dropdown as an example:&lt;/p&gt;

&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/8tymj8c2r/old.gif" alt="image"/&gt;&lt;/p&gt;

&lt;p&gt;See the delay? You need that, because otherwise when you try to move your mouse from the main menu to the submenu, the submenu will disappear out from under you like some sort of sick, unwinnable game of whack-a-mole. Enjoy this example from bootstrap&amp;#8217;s dropdown menus:&lt;/p&gt;

&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/iU1mj8c6y/bootstrap-bug.gif" alt="image"/&gt;&lt;br/&gt;&lt;em&gt;I love bootstrap, don&amp;#8217;t get it twisted. Just a good example of submenu frustration.&lt;/em&gt;&lt;/p&gt;&lt;br/&gt;&lt;h1&gt;How did Amazon get away without using a delay?&lt;/h1&gt;&lt;br/&gt;&lt;p&gt;It&amp;#8217;s easy to move the cursor from Amazon&amp;#8217;s main dropdown to its submenus. You won&amp;#8217;t run into the bootstrap bug. They get away with this by detecting the direction of the cursor&amp;#8217;s path.&lt;/p&gt;

&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/vogmj8fh4/screen_shot_2013-03-06_at_1.17.35_am.png" alt="image"/&gt;&lt;br/&gt;&lt;em&gt;If the cursor moves into the blue triangle the currently displayed submenu will stay open for just a bit longer.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;At every position of the cursor you can picture a triangle between the current mouse position and the upper and lower right corners of the dropdown menu. If the next mouse position is within that triangle, the user is probably moving their cursor into the currently displayed submenu. Amazon uses this for a nice effect. As long as the cursor stays within that blue triangle the current submenu will stay open. It doesn&amp;#8217;t matter if the cursor hovers over &amp;#8220;Appstore for Android&amp;#8221; momentarily &amp;#8212; the user is probably heading toward &amp;#8220;Learn more about Cloud Drive.&amp;#8221;&lt;/p&gt;

&lt;p&gt;And if the cursor goes outside of the blue triangle, they instantly switch the submenu, giving it a really responsive feel.&lt;/p&gt;

&lt;p&gt;So if you&amp;#8217;re as geeky as me and think something this trivial is cool, I made a jQuery plugin that fires events when detecting this sort of directional menu aiming: &lt;a href="https://github.com/kamens/jQuery-menu-aim"&gt;jQuery-menu-aim&lt;/a&gt;. We&amp;#8217;re using it in the new Khan Academy &amp;#8220;Learn&amp;#8221; menu:&lt;/p&gt;

&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/iNYmj8gfd/new-full.gif" alt="image"/&gt;&lt;/p&gt;

&lt;p&gt;I think it feels snappy. I&amp;#8217;m not ashamed to copy Amazon. I&amp;#8217;m sure this problem was solved years and years ago, forgotten, rediscovered, solved again, forgotten, rediscovered, solved again.&lt;/p&gt;

&lt;p&gt;If anyone else on the planet ends up finding a use for &lt;a href="https://github.com/kamens/jQuery-menu-aim"&gt;jQuery-menu-aim&lt;/a&gt;, I&amp;#8217;d be grateful to know what you think.&lt;/p&gt;

&lt;hr style="margin-left:33%;width:33%;"&gt;&lt;br/&gt;&lt;p&gt;&lt;em&gt;Thanks go to &lt;a href="http://benalpert.com/"&gt;Ben Alpert&lt;/a&gt; for helping me understand the linear algebra / cross-product magic Amazon uses to detect movement inside the &amp;#8220;blue triangle.&amp;#8221; I ended up going w/ &lt;a href="https://github.com/kamens/jQuery-menu-aim/blob/master/jquery.menu-aim.js#L215-L242"&gt;a cruder slope-based approach&lt;/a&gt;, mostly b/c I&amp;#8217;ve lost all intuitive understanding of linear algebra. Sad. Need to watch more KA videos.&lt;/em&gt;&lt;/p&gt;</description><link>http://bjk5.com/post/44698559168</link><guid>http://bjk5.com/post/44698559168</guid><pubDate>Wed, 06 Mar 2013 02:08:17 -0800</pubDate></item><item><title>Meritocracy and Discrimination in Tech</title><description>&lt;p&gt;I&amp;#8217;ve been the jerk who denies a candidate their hopes for an internship hundreds of times. That&amp;#8217;s not a point of pride – just a consequence of helping build eight (nine?) classes of interns at two small companies that both happen to receive up to 500 intern applications every month.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve obsessed over finding ways to build internship classes full of the best developers in an industry where the phrase &amp;#8220;best developers&amp;#8221; is so overused it&amp;#8217;s become meaningless. In all cases, the male:female ratio has been exactly what you&amp;#8217;d expect in tech.&lt;/p&gt;

&lt;p&gt;So when Jessica penned &lt;a href="http://life.khanacademy.org/post/43028679096/girls-girls-girls"&gt;her post the other day&lt;/a&gt; celebrating the fact that Khan Academy&amp;#8217;s inbound Summer &amp;#8216;13 class &lt;em&gt;somehow&lt;/em&gt; has twice the number of females as males, I smiled big. Even though we all knew it wouldn&amp;#8217;t last as acceptances come in (it already hasn&amp;#8217;t held), our team enjoyed a brief moment basking in the future that we (and all educators around the world) hope to build: &lt;a href="http://futurewomanintech.com/"&gt;a world in which being a female developer ceases to be a novelty&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s the top-voted comment on her post:&lt;/p&gt;
&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/vG4mibv7a/screen_shot_2013-02-16_at_10.02.42_am.png" alt="image"/&gt;&lt;/p&gt;

&lt;p&gt;Here are some selected comments from sharing it on Facebook:&lt;/p&gt;
&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/nsDmibv86/screen_shot_2013-02-16_at_10.19.59_am.png" alt="image"/&gt;&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s John Resig on Twitter&amp;#8217;s equally frustrating if less-accusatory response:&lt;/p&gt;

&lt;blockquote class="twitter-tweet tw-align-center"&gt;&lt;p&gt;Some really disappointing replies to my last tweet about Khan Academy&amp;#8217;s improved female:male ratio. &lt;a href="http://t.co/OFxMCmfp" title="http://imgur.com/tnmgl7B"&gt;imgur.com/tnmgl7B&lt;/a&gt;&lt;/p&gt;    &lt;div&gt;&lt;a href="https://twitter.com/jeresig/status/301833037979729920"&gt;February 13, 2013&lt;/a&gt;&lt;/div&gt;&lt;/blockquote&gt;
    &lt;script src="//platform.twitter.com/widgets.js" charset="utf-8" type="text/javascript"&gt;&lt;/script&gt;&lt;p&gt;As the person who stands at the end of our hiring process&amp;#8217;s pipeline, I find &amp;#8220;Mark&amp;#8220;&amp;#8216;s idea that we&amp;#8217;re sacrificing quality to fill some quota &lt;em&gt;merely&lt;/em&gt; very insulting. If I were one of the women who has successfully navigated our brutal interview process, I&amp;#8217;d be &lt;em&gt;furious&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;It doesn&amp;#8217;t help to be an industry obsessed with meritocracy if the first reaction to an altered status quo is that OUR MERITOCRACY MUST BE BROKEN, SOUND THE ALARMS. That&amp;#8217;s an a-hole old-timer&amp;#8217;s club.&lt;/p&gt;

&lt;p&gt;We should celebrate shifts we see in the historically depressing numbers of women in tech, especially when validated by rigorously competitive hiring environments. Why celebrate if we&amp;#8217;re aiming for perfect equality? Because we&amp;#8217;re not there yet and should encourage change we want to see.&lt;/p&gt;

&lt;hr style="width:33%;margin-left:33%"&gt;&lt;br/&gt;&lt;img src="http://static.tumblr.com/9hgswys/hYemibxd5/photo.jpg" class="rightInset" style="margin-top:10px; float: right;" alt="image"/&gt;&lt;p&gt;As I was pacing around our company parking lot trying to decide whether or not to curse in this post I kept thinking about the &lt;a href="http://news.ycombinator.com/item?id=5087572"&gt;hubbub raised when a 14-year-old posted his iPhone juggling game on Hacker News&lt;/a&gt;. He told the community his age. Because of that, he was met with accusations of &amp;#8220;emotional manipulation&amp;#8221; and &amp;#8220;why can&amp;#8217;t we leave age/sex/race out of it all.&amp;#8221;&lt;/p&gt;

&lt;p&gt;It requires a dangerously simple view of the world to decide that we don&amp;#8217;t want to encourage a 14-year-old who&amp;#8217;s pushing his limits by building mobile apps because we&amp;#8217;re scared of risking our oh-so-perfect meritocracy.&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s not a meritocracy until all 14-year-olds know that they can build mobile apps. It&amp;#8217;s not a meritocracy until we don&amp;#8217;t have one gender wondering if tech companies are just stomping grounds for another.&lt;/p&gt;

&lt;p&gt;So we&amp;#8217;ll continue encouraging females, children, and just about anybody to get into tech by celebrating milestones along the way. To those this threatens – oh.&lt;/p&gt;</description><link>http://bjk5.com/post/43249906199</link><guid>http://bjk5.com/post/43249906199</guid><pubDate>Sat, 16 Feb 2013 12:23:00 -0800</pubDate></item><item><title>Hacking at a nonprofit is just like its counterpart</title><description>&lt;p&gt;&lt;a href="http://online.wsj.com/article/SB10001424127887323829504578270381504454200.html"&gt;Paul Graham claims nonprofit startups are similar to their counterparts&lt;/a&gt;. As soon as I read the headline I realized I&amp;#8217;ve been answering a different version of this question in every recruiting conversation I&amp;#8217;ve had for the past two years:&lt;/p&gt;

&lt;blockquote&gt;&lt;div&gt;&amp;#8220;What&amp;#8217;s it like to be a hacker at a nonprofit?&amp;#8221;&lt;/div&gt;&lt;/blockquote&gt;

&lt;p&gt;I&amp;#8217;ll answer candidly based on my stories on each side of the profit divide. I won&amp;#8217;t claim objectivity. I hope to prove &lt;strong&gt;this is the wrong question to be asking. Great companies share qualities far more important than 501(c)(3)-ness.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;For-profit story: joined Fog Creek when there were ~4 employees*. Was there for 5+ years until it hit ~35-40**.&lt;/li&gt;
&lt;li&gt;Nonprofit story: joined Khan Academy when Sal&amp;#8217;s solo act suddenly became a &amp;#8220;real&amp;#8221; 5-person company. Now 2+ years later we&amp;#8217;re ~40.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Judging by the questions I get asked by candidates, many would think the for-profit vs. nonprofit issue makes for a striking difference in these otherwise comparable stories.&lt;/p&gt;

&lt;p&gt;Truth is both journeys have been eerily similar. I&amp;#8217;ll spell out the specifics.&lt;/p&gt;

&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/WG1mhm0q1/fleet2.jpg" alt="image"/&gt;&lt;br/&gt;&lt;em&gt;Real stick extends far beyond camera frame.&lt;/em&gt;&lt;/p&gt;
&lt;h1&gt;The basically identicals&lt;/h1&gt;&lt;br/&gt;&lt;p&gt;
&lt;strong&gt;1. Day to day&lt;/strong&gt;, you&amp;#8217;d never be able to tell a difference. Walk in every day, hack on products, hack on the dev team and its culture, hack on recruiting, battle &lt;a href="http://bjk5.com/post/35488799286/a-maker-managers-schedule"&gt;the hybrid maker-manager schedule&lt;/a&gt;, walk out. Realize I forgot my keys. Walk back in.
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Technical challenges&lt;/strong&gt; don&amp;#8217;t care about your corporate structure. I&amp;#8217;ve been stumped at both companies more times than I care to admit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Speed and autonomy is celebrated&lt;/strong&gt;, &lt;strong&gt;red tape and bureaucracy is reviled.&lt;/strong&gt; The image of a political, slow (or at least &lt;em&gt;less fast&lt;/em&gt;) organization is one of the most typical FUDs thrown at nonprofits. I can&amp;#8217;t speak for other orgs, but I can guarantee that with the right people at the helm, &amp;#8220;nonprofit&amp;#8221;&amp;#160;!= &amp;#8220;slow&amp;#8221;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Recruiting with a capital R&lt;/strong&gt; is a cultural cornerstone at both Khan and Fog Creek. Some assume nonprofits wouldn&amp;#8217;t approach recruiting with the same fervor and dedication as their counterparts. &lt;a href="http://www.khanacademy.org/about/the-team"&gt;Not so.&lt;/a&gt; I learned everything I know from much wiser coworkers at Fog Creek, and I consider my current team a once-in-a-lifetime experience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Compensation&lt;/strong&gt; could be at the top of this list of similarities, but I don&amp;#8217;t like to emphasize it. If you think working at a nonprofit means you can&amp;#8217;t command highly competitive comp, you&amp;#8217;re just wrong.&lt;/p&gt;

&lt;h1&gt;The mentionable differences&lt;/h1&gt;&lt;br/&gt;&lt;p&gt;&lt;strong&gt;1. The lottery ticket&lt;/strong&gt; doesn&amp;#8217;t exist at Khan Academy. Nobody&amp;#8217;s getting filthy rich off an exit, and we know it. This is perhaps the most obvious distinction when compared to for-profit startups where nobody&amp;#8217;s getting filthy rich and they don&amp;#8217;t know it. I keed, I keed!&lt;br/&gt;&lt;br/&gt;If you &lt;em&gt;need&lt;/em&gt; to have that lottery ticket, a nonprofit may not be for you. &lt;br/&gt;&lt;br/&gt;Of course, my Fog Creek experience isn&amp;#8217;t very differentiating when it comes to the typical startup lottery ticket. It&amp;#8217;s entirely bootstrapped by principled and generous founders who&amp;#8217;ve set up a company that immediately shares success instead of pinning hopes on an exit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Mission is baked in&lt;/strong&gt; at nonprofits. It&amp;#8217;s easy to think of a for-profit startup that pivots left and right in an attempt to find traction. For better or worse, it&amp;#8217;s harder to imagine a nonprofit completely abandoning its founding mission.&lt;br/&gt;&lt;br/&gt;

Once again, &amp;#8220;Fog Creek-vs-Khan&amp;#8221; isn&amp;#8217;t very interesting here. Great companies will have meaningful missions whether they&amp;#8217;re for-profit or not. &lt;a href="http://www.fogcreek.com/about.html"&gt;Fog Creek is on a mission&lt;/a&gt;. Google certainly has one. I wish Stack Exchange would &lt;a href="http://stackexchange.com/"&gt;answer all the world&amp;#8217;s questions&lt;/a&gt; faster. There&amp;#8217;s nothing about 501(c)(3) status that dictates whether or not each teammate shows up every day aimed at the same epic purpose.

&lt;br/&gt;&lt;br/&gt;But there is something unique about bold nonprofit &lt;a href="https://www.khanacademy.org/about"&gt;causes like Khan&amp;#8217;s&lt;/a&gt; or &lt;a href="https://watsi.org/about"&gt;Watsi&amp;#8217;s&lt;/a&gt; that makes it highly likely you&amp;#8217;ll find mission-driven culture lurking in every corner of the company. Sal ends our weekly company meetings by reminding us &lt;a href="http://www.forbes.com/sites/kerryadolan/2013/01/14/carlos-slims-foundation-puts-its-weight-behind-khan-academy/"&gt;what Carlos Slim told him&lt;/a&gt; about our product&amp;#8217;s future possibilities: &amp;#8220;Billions of people are waiting.&amp;#8221;&lt;/p&gt;

&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/lYNmhm0sx/fleet1.jpg" alt="image"/&gt;&lt;br/&gt;&lt;em&gt;Epic mission: sleep 90% of day&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;The right questions to ask&lt;/h1&gt;&lt;br/&gt;&lt;p&gt;So I completely agree with Paul Graham. &lt;strong&gt;&amp;#8220;Nonprofit or for-profit?&amp;#8221;&lt;/strong&gt; is not a very useful question for a hacker trying to decide between two teams.&lt;/p&gt;

&lt;p&gt;Far more relevant:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;Is the company built by founders and backers who will do whatever is necessary to gather the best team?
&lt;/li&gt;
&lt;li&gt;Will you be challenged by talented coworkers and given room to show what you can do?
&lt;/li&gt;
&lt;li&gt;Are you working on a product you genuinely care about?&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;I&amp;#8217;m only one data point. But in my experience, answering yes to all three of these questions will leave you feeling incredibly lucky, regardless of the corporate label.&lt;/p&gt;

&lt;hr style="width:33%;margin-left:33%"&gt;&lt;br/&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;*&lt;/strong&gt;Standard &amp;#8220;depends how you count&amp;#8221; rule applies here.&lt;br/&gt;&lt;strong&gt;**&lt;/strong&gt;My memory sucks. Please correct me if this number is off, some Creeker w/ a better noggin.&lt;br/&gt;&lt;br/&gt;
Thx &lt;a href="http://shipordie.com/"&gt;@jason&lt;/a&gt; for the read-through and tips.&lt;/em&gt;&lt;/p&gt;</description><link>http://bjk5.com/post/42128135345</link><guid>http://bjk5.com/post/42128135345</guid><pubDate>Sat, 02 Feb 2013 13:13:00 -0800</pubDate></item><item><title>Pending queues and loading requests on App Engine</title><description>&lt;p&gt;
Sometimes it feels like we&amp;#8217;re playing a rousing of guess&amp;#8217;n&amp;#8217;check when &lt;a href="https://developers.google.com/appengine/docs/adminconsole/performancesettings"&gt;adjusting our App Engine performance settings&lt;/a&gt;. The request scheduler is a &lt;em&gt;bit&lt;/em&gt; of a black box, so it can be hard to know which knobs we should twist and how far.&lt;/p&gt;

&lt;p&gt;But there are two really straightforward signs any App Engine dev should watch out for. Both are a big red flag signaling a configuration not optimized for performance:
&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;requests are spending &lt;strong style="color:red;"&gt;lots of time in the pending queue&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;requests are often &lt;strong style="color:red;"&gt;causing new instances to be created&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;h1&gt;The dreaded pending queue&lt;/h1&gt;&lt;br/&gt;&lt;p&gt;
You can identify whether or not your requests are wasting time in the pending queue by looking at &lt;a href="http://blog.notdot.net/2011/06/Demystifying-the-App-Engine-request-logs"&gt;your request logs&lt;/a&gt; and spotting high &lt;code&gt;pending_ms&lt;/code&gt; values. Here&amp;#8217;s an example:
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;98.235.99.108 - - [16/Jan/2013:16:03:12 -0800]&lt;br/&gt;
"POST /api/v1/user/exercises/distributive_property/problems/1/attempt HTTP/1.1"&lt;br/&gt;200 2558 - "Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20100101 Firefox/17.0"&lt;br/&gt;"www.khanacademy.org" ms=877 cpu_ms=649 cpm_usd=0.000000 &lt;strong&gt;pending_ms=195&lt;/strong&gt; &lt;br/&gt;instance=00c61b117c17e24c3f547df294a7e3c9882e9704
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If you see lots of that, it&amp;#8217;s probably a sign that you don&amp;#8217;t have enough instances running to serve your traffic. The symptom is that requests are getting queued up behind other requests, waiting for other requests to finish before even starting to run your code. Hence the &lt;code&gt;pending_ms&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The causes are trickier to spot. If you think you&amp;#8217;ve already optimized your &lt;a href="https://developers.google.com/appengine/docs/adminconsole/performancesettings"&gt;number of idle instances and pending latency settings&lt;/a&gt; you may want to focus on making your loading requests faster. If App Engine thinks it takes a really long time for a new instance to load your app&amp;#8217;s code on the first request, it may be less willing to give you that new instance when a request comes in. Have fun tapping your toe while &lt;code&gt;pending_ms&lt;/code&gt; ticks up. You should also be aware of any requests that are abnormally slow and consider moving them to backends or &lt;a href="http://bjk5.com/post/7796556212/fast-and-slow-queues-on-app-engine"&gt;specific task queues&lt;/a&gt;. Otherwise App Engine might queue up some normal request like a user loading your homepage (&amp;#8220;I swear, it&amp;#8217;s usually so fast!&amp;#8221;) right behind some long-running bruiser of an API call. And all of a sudden your user is waiting an extra 500 millis just to get out of the pending queue before your homepage can even start to be served.&lt;/p&gt;

&lt;h1&gt;Loading requests&lt;/h1&gt;&lt;br/&gt;&lt;p&gt;Loading requests can be an equally bad sign. You want your instances to stay up and stay healthy for as long as possible. They should be serving thousands and thousands of requests before needing to be recycled. Otherwise your users just sit around on their butts waiting for App Engine instances to reload all that beautiful code you&amp;#8217;ve spent so much time writing.&lt;/p&gt;

&lt;p&gt;These requests are spotted via &lt;code&gt;loading_request=1&lt;/code&gt; in your request logs. They&amp;#8217;re going to be slow, so you don&amp;#8217;t want to see &amp;#8216;em much.&lt;/p&gt;

&lt;p&gt;If you&amp;#8217;re seeing an abnormally high amount of &lt;code&gt;loading_request=1&lt;/code&gt;&amp;#8217;s given how much traffic you serve, chances are that you&amp;#8217;ve also been noticing bigger problems. This could be a sign that your requests are timing out or simply crashing when a new instance starts up. This&amp;#8217;ll cause App Engine to kill the instance being loaded, which causes another loading request to be fired for the next request, which&amp;#8230;well, you get the point. You might also have memory leaks that are causing instances to get shut down after serving just a few requests. Bottom line is something is causing your instances to thrash off and on too often.&lt;/p&gt;

&lt;h1&gt;Spot these problems with the mini profiler&lt;/h1&gt;&lt;br/&gt;&lt;p&gt;As of today, you can spot both of these problems when browsing around your site if you&amp;#8217;re using the &lt;a href="http://github.com/kamens/gae_mini_profiler"&gt;App Engine Mini Profiler&lt;/a&gt;. If you&amp;#8217;re wondering why a request is slow, open up the profiler and take a gander:&lt;/p&gt;

&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/4nUmgteqx/screen_shot_2013-01-17_at_11.55.43_pm.png"/&gt;&lt;/p&gt;

&lt;p&gt;You should, of course, still keep track of aggregate &lt;code&gt;pending_ms&lt;/code&gt; and &lt;code&gt;loading_request&lt;/code&gt; appearances via your request logs. The mini profiler just makes it easy for you to take a glance at the current request&amp;#8217;s health.&lt;/p&gt;</description><link>http://bjk5.com/post/40833194761</link><guid>http://bjk5.com/post/40833194761</guid><pubDate>Fri, 18 Jan 2013 01:44:00 -0800</pubDate></item><item><title>A sampling profiler for App Engine</title><description>&lt;p&gt;I&amp;#8217;d been getting a bit frustrated trying to figure out where time was being spent during a few of Khan Academy&amp;#8217;s longer running requests. &lt;a href="https://github.com/kamens/gae_mini_profiler"&gt;App Engine Mini Profiler&lt;/a&gt; usually works great, but these specific requests seemed to be spending a lot of time serializing objects into JSON representations. JSON serialization, by its nature, involves tons and tons of nested function calls. Anathema to an instrumented CPU profiler like &lt;a href="http://docs.python.org/2/library/profile.html"&gt;the Python profiling tool&lt;/a&gt; included in Mini Profiler. So I added a simple sampling tool.&lt;/p&gt;

&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/Kicmglpld/photoa.jpg"/&gt;&lt;br/&gt;&lt;em&gt;I am Fleetwood, the new star of this blog.&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;The problem with instrumented profilers&lt;/h1&gt;&lt;br/&gt;&lt;p&gt;The ugly problem w/ instrumented profilers is they overestimate how much time is spent in frequently called functions or those with deep call stacks. Since &amp;#8220;instrumenting&amp;#8221; your code basically means turning this&amp;#8230;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def monkey_print(s):
    print("ooh ooh aah %s ahh" % s)

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;#8230;into this&amp;#8230;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def monkey_print(s):
    profiler.start_timing("monkey_print")
    print("ooh ooh aah %s ahh" % s)
    profiler.stop_timing("monkey_print")

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;#8230;you can imagine how all those calls to &lt;code&gt;profiler.start_timing&lt;/code&gt; and &lt;code&gt;profiler.stop_timing&lt;/code&gt; will add a &lt;strong&gt;lot&lt;/strong&gt; of unexpected overhead if your code happens to &lt;code&gt;monkey_print&lt;/code&gt; thousands of times.&lt;/p&gt;

&lt;p&gt;This subtle problem can make it really, really frustrating to figure out where time&amp;#8217;s being spent in your program. Even after years I&amp;#8217;m still often tricked into chasing mirages. When you look at the output of a request that includes thousands and thousands of deeply nested function calls, you can never really trust how much time was actually spent in those functions.&lt;/p&gt;

&lt;h1&gt;How sampling helps&lt;/h1&gt;&lt;br/&gt;&lt;p&gt;Sampling profilers have always been around to tackle this problem. They work by periodically halting your program, grabbing the stack trace of whatever code happens to be currently running, and then letting your code go on its merry way.&lt;/p&gt;

&lt;p&gt;By doing this enough and combining the sampled stack traces, these profilers do a pretty good job answering &amp;#8220;Where is time being spent in my program?&amp;#8221; by periodically asking the question, &amp;#8220;Well, what is your program doing &lt;em&gt;right now&lt;/em&gt;?&amp;#8221;&lt;/p&gt;

&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/J9Gmglpnu/photob.jpg"/&gt;&lt;br/&gt;&lt;em&gt;I&amp;#8217;m a really nervous car rider.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Right around the time when I started to think I&amp;#8217;d trade my kingdom for a sampling profiler that works on App Engine, I stumbled across &lt;a href="http://stackoverflow.com/users/23771/mike-dunlavey"&gt;a Stack Overflow user&lt;/a&gt; who&amp;#8217;s been on &lt;a href="http://stackoverflow.com/questions/375913/what-can-i-use-to-profile-c-code-in-linux/378024#378024"&gt;a bit of&lt;/a&gt; &lt;a href="http://stackoverflow.com/questions/1777556/alternatives-to-gprof/1779343#1779343"&gt;a personal crusade&lt;/a&gt; &lt;a href="http://stackoverflow.com/questions/4387895/if-profiler-is-not-the-answer-what-other-choices-do-we-have/4390868#4390868"&gt;to get people to embrace&lt;/a&gt; a very simple form of profiling: smashing Ctrl+C at random points to halt your running program, then examining the resulting call stack.&lt;/p&gt;

&lt;p&gt;He persuasively argues that even &lt;em&gt;manually&lt;/em&gt; gathering a small number of call stack samples in this way does a great job answering the most important profiling question, &amp;#8220;Where is time being spent?&amp;#8221;&lt;/p&gt;

&lt;p&gt;I figured, well, if &lt;em&gt;that&amp;#8217;s&lt;/em&gt; true, then to get some interesting App Engine performance info we might not need a fully-featured, built-by-the-pros sampling profiler. We only need something that can briefly inspect the call stack of the currently running request.&lt;/p&gt;

&lt;h1&gt;Sampling App Engine&lt;/h1&gt;&lt;br/&gt;&lt;p&gt;Unburdened by worries of perfection, the hacks began. Stack Overflow taught me &lt;a href="http://stackoverflow.com/questions/132058/showing-the-stack-trace-from-a-running-python-application/2569696#2569696"&gt;how to inspect the stack of all running Python threads&lt;/a&gt;. &lt;a href="http://benalpert.com/"&gt;Alpert&lt;/a&gt; gave me the tip of spawning a separate thread to periodically perform these stack inspections (since &lt;a href="http://docs.python.org/2/library/signal.html"&gt;the signal library&lt;/a&gt; that I&amp;#8217;d prefer to use is off-limits in App Engine).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/kamens/gae_mini_profiler/blob/master/sampling_profiler.py"&gt;A little duck tape here and some apologetic comments there&lt;/a&gt;, and a simple sampling profiler for App Engine was born.&lt;/p&gt;

&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/ghrmglozr/screen_shot_2013-01-13_at_9.40.31_pm.png"/&gt;&lt;br/&gt;&lt;em&gt;Here it is. Far from perfect, needs more work, but we&amp;#8217;re learning from it already.&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;Give it a shot&lt;/h1&gt;&lt;br/&gt;&lt;p&gt;The sampling profiler is bundled into App Engine Mini Profiler along w/ the instrumented profiler and RPC statistics it already included. &lt;a href="https://github.com/kamens/gae_mini_profiler"&gt;Profile your App Engine app&lt;/a&gt; and let me know how it goes. Or &lt;a href="http://mini-profiler.appspot.com/"&gt;try the (intentionally slow) demo here&lt;/a&gt; (just click the little profile link in the upper left corner).&lt;/p&gt;

&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/S45mglpq3/photoc.jpg"/&gt;&lt;br/&gt;&lt;em&gt;A trail of zebras in my wake.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;P.S. We&amp;#8217;ve been getting in the habit of giving thanks at the end of Khan Academy company meetings. Whenever I talk about the mini profiler I&amp;#8217;d like to send thanks to the Stack Exchange team for their inspiration. If you&amp;#8217;re on .NET or Ruby, stop wasting time and &lt;a href="http://miniprofiler.com/"&gt;check out their original&lt;/a&gt;. Given the timing of recent events, I&amp;#8217;d also like to send our team&amp;#8217;s thanks to Aaron Swartz, the brilliant creator of &lt;a href="http://webpy.org/"&gt;web.py&lt;/a&gt;, which inspired the design of &lt;a href="https://developers.google.com/appengine/docs/python/tools/webapp/"&gt;App Engine&amp;#8217;s webapp&lt;/a&gt;, which, in turn, helps power Khan Academy.&lt;/p&gt;</description><link>http://bjk5.com/post/40502423653</link><guid>http://bjk5.com/post/40502423653</guid><pubDate>Sun, 13 Jan 2013 22:08:18 -0800</pubDate></item><item><title>"I don't understand"</title><description>&lt;p&gt;I&amp;#8217;ve noticed that the most mature and accomplished developers I&amp;#8217;ve worked with are also those who most frequently say &amp;#8220;I don&amp;#8217;t understand&amp;#8221; when they&amp;#8217;re listening to a technical explanation. This has been the case with coworkers both &lt;a href="https://twitter.com/BrettKiefer"&gt;at Fog Creek&lt;/a&gt; and &lt;a href="http://allthingsd.com/20120209/googles-very-first-employee-craig-silverstein-technically-no-3-leaving/"&gt;at Khan Academy&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In one way, it&amp;#8217;s counterintuitive. Shouldn&amp;#8217;t the senior devs already know everything? But it makes a lot of sense. Those who are most secure in their own abilities are the most comfortable to admit when they haven&amp;#8217;t fully wrapped their minds around something. Newer devs assume that their confusion is their own fault. They don&amp;#8217;t want to interrupt others due to their own perceived shortcomings.&lt;/p&gt;

&lt;p&gt;New devs should try to really &lt;em&gt;get&lt;/em&gt; just how common it is to not fully understand a technical problem. Most tech stacks have crossed the threshold of one person being able to hold the entire codebase in their head, especially at companies that are hiring. And once that threshold&amp;#8217;s crossed, you&amp;#8217;ll start hearing from people about the new javascript rendering framework or the latest mapreduce pipeline or a bug in the deploy script or a proposal for a new caching pattern, and a little voice in your head is going to start saying, &amp;#8220;Wait&amp;#8230;I don&amp;#8217;t get it.&amp;#8221;&lt;/p&gt;

&lt;p&gt;&amp;#8220;I don&amp;#8217;t understand&amp;#8221; is the perfect response. You&amp;#8217;re not insulting anybody. You&amp;#8217;re not showing weakness. You&amp;#8217;re building a culture of respect for how smart everybody is, because you know that after a few minutes of explanation you &lt;em&gt;will&lt;/em&gt; get it.&lt;/p&gt;&lt;p&gt;Either that or you&amp;#8217;ll find a bug. I like to think of &amp;#8220;I don&amp;#8217;t understand&amp;#8221; as a kind of reverse &lt;a href="http://en.wikipedia.org/wiki/Rubber_duck_debugging"&gt;rubber ducking.&lt;/a&gt; Except in this version, the duck comes alive and quacks and stomps and &amp;#8220;I don&amp;#8217;t understand&amp;#8221;s all over your keyboard while forcing you to explain various things.&lt;/p&gt;

&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/PRZmf5clz/rubberduck01.jpeg"/&gt;&lt;br/&gt;&lt;em&gt;&amp;#8220;I&amp;#8230;don&amp;#8217;t understand.&amp;#8221;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s most said by the best, decades after they&amp;#8217;ve become a master. We newer devs should follow their lead and get rid of any stigma associated with those words.&lt;/p&gt;</description><link>http://bjk5.com/post/38101106878</link><guid>http://bjk5.com/post/38101106878</guid><pubDate>Sun, 16 Dec 2012 15:19:00 -0800</pubDate></item><item><title>Dangers of using memcache counters for a/b tests </title><description>&lt;p&gt;We ran into a hairy problem with our &lt;a href="http://github.com/kamens/gae_bingo"&gt;App Engine A/B testing framework&lt;/a&gt; a few months ago. It&amp;#8217;s a problem unique to those relying on memcache to increment counters with statistical meaning in a shared resource environment like App Engine.&lt;/p&gt;

&lt;p&gt;Since there are more live-action teenage mutant ninja turtle films than people who fit that bill (sorry, &lt;a href="https://groups.google.com/d/msg/google-appengine/lde4HQSAHdE/zl52pDB9PxMJ"&gt;one person on the internet&lt;/a&gt;, I know you matter), this is more a story about an interesting problem than a service post.&lt;/p&gt;

&lt;h1&gt;The symptoms&lt;/h1&gt;&lt;br/&gt;&lt;p&gt;Some of our A/B tests started looking a little&amp;#8230;surprising. &amp;#8220;500+ users mastered Dividing Decimals in 20 problems or less, and 200+ users mastered it in 30 problems or less,&amp;#8221; our dashboard claimed. Hmmm. Impossible, inconsistent results like that started popping up all over. I had that awful feeling you get in your gut when you square yourself to the possibility that the metrics you&amp;#8217;ve been using to make decisions are straight-up broken. Trust in our A/B experiment results plummeted.&lt;/p&gt;

&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/YFVme2jng/pressure.png"/&gt;&lt;br/&gt;&lt;em&gt;Not ideal.&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;The problem&lt;/h1&gt;&lt;br/&gt;&lt;p&gt;Our A/B framework uses &lt;a href="https://developers.google.com/appengine/docs/python/memcache/usingmemcache"&gt;memcache&lt;/a&gt; as the fastest way to increment its internal counters every time somebody new participates in an experiment or triggers a conversion. For example, when a new user first comes to our &lt;a href="http://www.khanacademy.org/math/algebra/solving-linear-equations-and-inequalities/e/one_step_equation_intuition"&gt;exercise that helps build intuition for one step equations&lt;/a&gt;, they may be handed one of two alternatives for each problem they encounter. A counter (&lt;code&gt;alternative_A_participants&lt;/code&gt;) is incremented accordingly. Another counter keeping track of conversions (&lt;code&gt;alternative_A_conversions&lt;/code&gt;) is incremented similarly when we think they&amp;#8217;ve mastered the skill. This is how we keep track of our A/B alternatives and their relative performances.&lt;/p&gt;

&lt;p&gt;Now, there are two properties of these counters that aren&amp;#8217;t negotiable. They must be &lt;strong&gt;fast&lt;/strong&gt;, because A/B testing shouldn&amp;#8217;t degrade performance for users. And they must be &lt;strong&gt;atomic&lt;/strong&gt;, because otherwise we&amp;#8217;d lose tons of data when we get hundreds or thousands of new participants per second, say during &lt;a href="http://bjk5.com/post/30813320623/what-traffic-from-60-minutes-looks-like"&gt;traffic events&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In App Engine land, memcache is the clear winner when in need of a fast, atomic counter. You could build a &lt;a href="https://developers.google.com/appengine/articles/sharding_counters"&gt;sharded datastore counter&lt;/a&gt; for atomicity, but you&amp;#8217;ll sacrifice speed because the datastore can&amp;#8217;t keep up with memcache. You could try something like &lt;a href="http://eng.pulse.me/introducing-livecount/"&gt;kicking off a task queue for every increment&lt;/a&gt;, but you may quickly breed a single user&amp;#8217;s HTTP request into 5 separate requests for your instances to swallow. &lt;a href="http://redis.io/commands/incr"&gt;Other tools exist&lt;/a&gt;, of course, but they aren&amp;#8217;t available in App Engine.&lt;/p&gt;

&lt;p&gt;Turns out &lt;code&gt;memcache.incr&lt;/code&gt; is hard to beat.&lt;/p&gt;

&lt;p&gt;The astute among you are already concerned. &amp;#8220;&lt;a href="http://www.sparklewise.com/do-not-use-memcache-as-a-data-store/"&gt;Memcache shouldn&amp;#8217;t be used to store data you can&amp;#8217;t afford to lose&lt;/a&gt;,&amp;#8221; you chide, &amp;#8220;&lt;a href="http://stackoverflow.com/questions/13119203/using-memcached-to-store-session-data-is-it-safe"&gt;you never know when memcache will decide to evict your data&lt;/a&gt;&amp;#8221;. True. In a situation like this, you have to be constantly running a process that persists data from memcache into something more permanent, like the App Engine datastore. We do. But you still don&amp;#8217;t have any guarantee that a malevolent memcache won&amp;#8217;t evict unsaved data before it gets persisted. So you also have to be willing to occasionally lose some data to bad luck. We are.&lt;/p&gt;

&lt;p&gt;We knew that we&amp;#8217;d occasionally lose count of an experiment&amp;#8217;s participant or two or three or twenty. This is a relatively rare problem we&amp;#8217;re willing to swallow. &lt;em&gt;Assuming there is no statistical bias in memcache&amp;#8217;s tendency to evict the counter for &lt;code&gt;alternative_A_conversions&lt;/code&gt; vs. the counter for &lt;code&gt;alternative_B_conversions&lt;/code&gt;&lt;/em&gt;, we felt comfortable comparing an experiment&amp;#8217;s alternatives and making meaningful decisions.&lt;/p&gt;

&lt;p&gt;That assumption was way off. Think about the problem that a PaaS like App Engine has to solve when offering memcache to all its applications. They can&amp;#8217;t just run one big, honkin&amp;#8217; instance of memcache on one bigger, honkin&amp;#8217;er machine somewhere. They have to distribute their load across multiple completely independent instances of memcache. Which means when you call &lt;code&gt;memcache.incr(key)&lt;/code&gt;, a value could be incremented on one of any number of different App Engine memcache instances&amp;#8230;and the instance chosen depends on a hash of the key being incremented.&lt;/p&gt;

&lt;p&gt;In simpler words, &lt;code&gt;memcache.incr("alternative_A_conversions")&lt;/code&gt; stores its counter on a different machine than &lt;code&gt;memcache.incr("alternative_B_conversions")&lt;/code&gt;. Since memcache is a service App Engine shares among all its applications, it&amp;#8217;s highly likely for one memcache machine to be under considerably different memory pressure than another.&lt;/p&gt;

&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/Zujme2k3l/hash.png"/&gt;&lt;br/&gt;&lt;em&gt;&lt;a href="http://www.streak.com/"&gt;Streak&lt;/a&gt; and &lt;a href="https://www.pulse.me/"&gt;Pulse&lt;/a&gt; are two heavy App Engine users with whom we&amp;#8217;ve probably shared memcache space.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Long story short? Some memcache keys (&lt;code&gt;alternative_A_conversions&lt;/code&gt;) can survive in memcache for 10 minutes before being evicted, giving our background persistence task plenty of time to run. Others (&lt;code&gt;alternative_B_conversions&lt;/code&gt;) may only last 10 seconds under high pressure. This behavior is consistent for each key&amp;#8230;creating a statistical bias that favors one A/B alternative over another by repeatedly evicting only one of the key&amp;#8217;s counters before we have a chance to persist its data.&lt;/p&gt;

&lt;h1&gt;The solution&lt;/h1&gt;&lt;br/&gt;&lt;p&gt;What to do? We could switch away from memcache for our counters, but as mentioned above the alternatives aren&amp;#8217;t great. We could give up on our realtime dashboard for A/B results, stop worrying about atomic counters entirely, log events for every participant and conversion, and periodically analyze our A/B alternatives offline. This may be the future for us, but we&amp;#8217;ve been pressed for time (pretty sure we&amp;#8217;re unique in that respect) and hoped for a quicker fix.&lt;/p&gt;

&lt;p&gt;We had one hack available to us thanks to App Engine&amp;#8217;s treatment of the namespace parameter available in all memcache calls. If you provide a namespace in your call to &lt;code&gt;memcache.incr&lt;/code&gt;, App Engine would use that namespace to determine which memcache instance to send the value to, *not* the key. This meant we could keep all keys for an experiment in a single memcache instance, which would remove the statistically biased eviction patterns. While I&amp;#8217;m normally a lover of such simple solutions, we heard this would soon be changing, and even identically-namespace&amp;#8217;d keys would be spread among multiple instances in coming weeks. No go.&lt;/p&gt;

&lt;p&gt;Luckily, Google&amp;#8217;s &lt;a href="https://twitter.com/fredsa"&gt;Fred Sauer&lt;/a&gt; is brilliant and had a better idea. He suggested using bit offsets to store multiple counters&amp;#8217; values within a single memcache key. Since memcache.incr&amp;#8217;s ints have 64 bits, we could split them up into 4&amp;#160;16-bit counters, each one counting up to a maximum of 2^16-1=65,535 before needing to be persisted over to the datastore.&lt;/p&gt;

&lt;p&gt;This ended up working beautifully. Each time we want to increment &lt;code&gt;alternative_A_conversions&lt;/code&gt;, we grab the memcache value stored by key &lt;code&gt;all_conversions&lt;/code&gt; and increment the counter stored in bit positions 0-15. When we want to increment &lt;code&gt;alternative_B_conversions&lt;/code&gt;, we grab the exact same memcache key and increment the counter in bit positions 16-31.&lt;/p&gt;

&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/uncme2kan/shift.png"/&gt;&lt;br/&gt;&lt;em&gt;Even the most trivial bit twiddling makes web devs like me feel all hardcore. It&amp;#8217;s a little sad.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Using a single memcache key for all of an experiment&amp;#8217;s counters means we never have to worry about statistical bias in eviction policies affecting our ability to compare alternatives A and B. If one of an experiment&amp;#8217;s counters is evicted at an unfortunate time, they all are.&lt;/p&gt;

&lt;p&gt;Our A/B experiment data has looked consistent since this change, and trust in the framework is largely restored. Hats off once again to Fred and the App Engine team.&lt;/p&gt;</description><link>http://bjk5.com/post/36567537399</link><guid>http://bjk5.com/post/36567537399</guid><pubDate>Sun, 25 Nov 2012 19:31:19 -0800</pubDate></item><item><title>Khan Academy Internship, Summer '12</title><description>&lt;p&gt;&lt;em&gt;Teaser: we&amp;#8217;re full steam ahead hiring for the summer &amp;#8216;13 class of interns. &lt;a href="http://www.khanacademy.org/careers"&gt;Apply.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;hr style="width:33%;margin-left:33%"&gt;&lt;br/&gt;&lt;p&gt;We had fifteen interns this summer and around that many full-timers.&lt;/p&gt;

&lt;p&gt;It&amp;#8217;d be silly for me to try to write a summary of what was accomplished. That task was doable &lt;a href="http://bjk5.com/post/8826207372/khan-academy-internship-summer-11"&gt;last summer&lt;/a&gt; and &lt;a href="http://bjk5.com/post/15500332273/khan-academy-internship-fall-11"&gt;fall&lt;/a&gt;, but this time too much was built. If I made a list of it all, I&amp;#8217;d ramble even worse than normal.&lt;/p&gt;

&lt;p&gt;Luckily, some interns took up the mantle (minus the rambling). If you&amp;#8217;re here to get a feel for the type of work done by a Khan Academy intern, you can&amp;#8217;t do better than &lt;a href="http://dylanv.org/2012/09/14/the-khan-academy-internship-experience/"&gt;Dylan Vassallo&amp;#8217;s&lt;/a&gt;, &lt;a href="http://benalpert.com/2012/08/24/what-i-did-at-khan-academy-2012.html"&gt;Ben Alpert&amp;#8217;s&lt;/a&gt;, &lt;a href="http://jamie-wong.com/2012/08/22/what-i-did-at-khan-academy/"&gt;Jamie Wong&amp;#8217;s&lt;/a&gt;, &lt;a href="http://www.omarrizwan.com/post/30879895958/what-the-heck-did-omar-do-with-his-summer-or-khan"&gt;Omar Rizwan&amp;#8217;s&lt;/a&gt;, and &lt;a href="http://ankitahuja.com/blog/2012/08/27/summer-at-khan-academy/"&gt;Ankit Ahuja&amp;#8217;s&lt;/a&gt; firsthand summaries. From launching a brand new way to explore computer science (&lt;em&gt;*cough*&lt;/em&gt;alongside John Resig&lt;em&gt;*cough*&lt;/em&gt;) to shoring up our backend infrastructure (&lt;em&gt;*cough*&lt;/em&gt;alongside Craig Silverstein&lt;em&gt;*cough*&lt;/em&gt;), these posts give a taste of how our interns spent their time (not apologizing for namedropping, sorry, it&amp;#8217;s relevant).&lt;/p&gt;

&lt;p&gt;But just a taste.&lt;/p&gt;

&lt;p&gt;So before things gets any foggier in my head, I&amp;#8217;ll share the summer themes that stick out most for me.&lt;/p&gt;

&lt;h1&gt;Theme #1 from the summer: did things? Don&amp;#8217;t forget to tell people&lt;/h1&gt;&lt;br/&gt;&lt;p&gt;I prefer to just tell people to &amp;#8220;BRAG!!!&amp;#8221; so often they think I&amp;#8217;m more repetitive than Inigo Montoya, but I suppose &amp;#8220;&lt;a href="http://carl.flax.ie/dothingstellpeople.html"&gt;do things, tell people&lt;/a&gt;&amp;#8221; does have a less abrasive ring to it.&lt;/p&gt;

&lt;p&gt;The intern posts linked above create immense value&amp;#8230;for Khan Academy, for wide-eyed future KA candidates, and &lt;em&gt;especially&lt;/em&gt; for the careers of their authors (Alpert and Vassallo are already full-timers, though, so mitts off). They&amp;#8217;re one of my absolute favorite parts of every internship.&lt;/p&gt;

&lt;p&gt;But they don&amp;#8217;t tell the full story.&lt;/p&gt;

&lt;p&gt;On the issue of gender, they actually warp it. &lt;strong&gt;Four of our fifteen interns were female&lt;/strong&gt;, and they each made serious dents in the world. Heck, &lt;a href="http://cakefordinner.com/"&gt;Jessica Liu&lt;/a&gt; single-handedly created an entire library of computer science content which is now teaching hundreds of thousands of learners. It was the most gender-balanced group of interns I&amp;#8217;ve ever worked with, and I&amp;#8217;m more than convinced this is a big reason why it was also one of the best.&lt;/p&gt;

&lt;p&gt;Just one example of a story easily lost. It&amp;#8217;s important enough to let stand on its own.&lt;/p&gt;

&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/DiEmdqrix/screen_shot_2012-11-19_at_7.41.54_am.png"/&gt;&lt;br/&gt;&lt;em&gt;The &lt;a href="http://www.khanacademy.org/about/blog/post/35798906477/computer-science-spin-offs"&gt;top student-created spin-offs&lt;/a&gt; of Jessica&amp;#8217;s Nyan Cat program&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Far more important stories go untold than boring stories are shared. My rambling blog may often be on the wrong side of that battle, but hopefully you and your team won&amp;#8217;t be. We use dedicated intern demo days, hipchat rooms for the purpose of sharing screenshots, and &amp;#8220;You Killed My Father, Prepare to Die&amp;#8221;-like persistence when encouraging interns to share.&lt;/p&gt;

&lt;h1&gt;Theme #2: always more mentorship&lt;/h1&gt;&lt;br/&gt;&lt;p&gt;I haven&amp;#8217;t met an intern yet who complained, &amp;#8220;I&amp;#8217;m getting a little tired of all the mentorship around here.&amp;#8221; I hope I do one day. No matter how much &lt;a href="http://bjk5.com/post/23266999170/how-intern-mentorship-works-at-khan-academy"&gt;we focus on mentorship&lt;/a&gt;, it requires constant, conscious effort. Making sure all mentors are communicating well. Making sure interns are having a consistent code review experience. Making sure ownership is being handed out. Trying to learn from any and every frustration voiced by a previous summer&amp;#8217;s intern. It&amp;#8217;s a full-time job for every dev on our team, and they already have full-time jobs.&lt;/p&gt;

&lt;p&gt;But it&amp;#8217;s worth it. See below. You can bet we&amp;#8217;ll be gathering next summer to discuss how to be even better mentors.&lt;/p&gt;

&lt;h1&gt;Theme #3: shipping is good for what ails ya&amp;#8217;&lt;/h1&gt;&lt;br/&gt;&lt;p&gt;Our interns ship to real users. Whether it&amp;#8217;s from deploying quick fixes on day one or sprinting all summer for a splashy launch in August, they will have the unmistakable feeling earned by sending their creations off into the world.&lt;/p&gt;

&lt;p&gt;I honestly believe this is one of our biggest competitive advantages when recruiting. One of the most talented interns I&amp;#8217;ve ever worked with told me about his previous internship&amp;#8217;s code &amp;#8212; it&amp;#8217;s &lt;em&gt;still&lt;/em&gt; rotting in source control somewhere. The first week of his summer, he told me that wouldn&amp;#8217;t be happening again. I have immense respect for that.&lt;/p&gt;

&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/tZHmdq5ml/mini-greenland_kayak_wooden_boat_school.jpeg"/&gt;&lt;br/&gt;&lt;em&gt;&lt;strike&gt;Want.&lt;/strike&gt;Need.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;There was another intern, one we lost in a recruiting battle to a big company. He emailed me a week after he started, full of regret, after being shoved away in a corner to work on some internal-only documentation tool. What a waste.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve seen frustrations of all varieties melt away when a dev, full of pride, pushes a new piece of work out to hordes of hungry users. It&amp;#8217;s cathartic and a capstone experience in any real-world development effort. To not include it in an internship is a crime.&lt;/p&gt;

&lt;p&gt;Our team can proudly say we nailed this theme this summer.&lt;/p&gt;

&lt;h1&gt;We&amp;#8217;re all in again&lt;/h1&gt;&lt;br/&gt;&lt;p&gt;Most tech leads or managers that I talk to think a 1:1 ratio of full-timers to interns is simply too crazy. Maybe.&lt;/p&gt;

&lt;p&gt;One thing we know for sure? Working with interns blows the normal interview process right out of the water. As &lt;a href="http://desmondbrand.com/"&gt;Desmond&lt;/a&gt; so rightly pointed out recently, if you&amp;#8217;ve ever had an argument about whether or not to give an intern a full-time offer after &lt;em&gt;three months&lt;/em&gt; of working side-by-side with them, you&amp;#8217;ve really gotta question the effectiveness of your normal, oh-so-vaunted five-hour interview process.&lt;/p&gt;

&lt;p&gt;And it&amp;#8217;s well understood now that the best devs are only on the job market two, maybe three times in their lives. One of those is right out of college. For long-term recruiting health, you can&amp;#8217;t beat internships. The new full-timers joining our team from the class of summer &amp;#8216;12 are a testament to that.&lt;/p&gt;

&lt;p&gt;Punchline? We&amp;#8217;re hiring up again for next summer. We&amp;#8217;ll be even better prepared and accomplish even more than last time. If you&amp;#8217;ve read this far and want to be a part, &lt;a href="http://www.khanacademy.org/careers"&gt;apply for an internship&lt;/a&gt; and include &amp;#8220;I read Kamens&amp;#8217;s blog, and the monkey swings at midnight&amp;#8221; — you may squeak through resume reviews a tad faster.&lt;/p&gt;</description><link>http://bjk5.com/post/36067210182</link><guid>http://bjk5.com/post/36067210182</guid><pubDate>Mon, 19 Nov 2012 07:32:00 -0800</pubDate></item><item><title>A maker-manager's schedule</title><description>&lt;p&gt;Paul Graham&amp;#8217;s &lt;a href="http://www.paulgraham.com/makersschedule.html"&gt;Maker&amp;#8217;s Schedule, Manager&amp;#8217;s Schedule&lt;/a&gt; meant a lot to me. It meant a lot to &lt;a href="http://42floors.com/blog/posts/hardcore-makers-schedule"&gt;anybody&lt;/a&gt; &lt;a href="http://parislemon.com/post/29015277529/makers-schedule-managers-schedule"&gt;who&amp;#8217;s ever&lt;/a&gt; &lt;a href="http://aligorith.blogspot.com/2012/10/makers-schedule-vs-managers-schedule.html"&gt;been inexplicably frustrated&lt;/a&gt; by a kind-hearted coworker interrupting them, or felt like an ass for turning down a request to grab a 20 minute coffee with an acquiantance.&lt;/p&gt;

&lt;p&gt;It meant a lot because it explained the frustration. It justified (as much as can be justified) the ass-like behavior. And it did so by drawing a clean line between people who need &lt;em&gt;completely interruption-free&lt;/em&gt; schedules (makers) and those who context switch from one block of work to the next (managers).&lt;/p&gt;

&lt;p&gt;Truth is, though, that in the startup world we&amp;#8217;ll be forced to straddle that line. For many makers and managers, the separation won&amp;#8217;t be so clean. Understanding how to navigate a hybrid maker-manager&amp;#8217;s schedule can be critical for personal and product success.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ask a maker and a manager for something that&amp;#8217;ll only take twenty minutes out of each of their days (easy part). Then peer into their souls (slightly harder part) and watch the decision they&amp;#8217;re trying to make.&lt;/strong&gt;&lt;/p&gt;

&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/05Rmdaw9e/screen_shot_2012-11-10_at_6.04.09_pm.png"/&gt;&lt;br/&gt;&lt;em&gt;This email was sent to both Ben the manager and Ben the maker,&lt;br/&gt;who are two completely different people. For science.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ben the manager&amp;#8217;s thoughts after receiving this email:&lt;/strong&gt; this person seems really interesting and nice. Would it be possible to fit this into any of my free time slots? Hmm.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ben the maker&amp;#8217;s thoughts after receiving the same email:&lt;/strong&gt; this person seems really interesting and nice. Should I sacrifice half of a day&amp;#8217;s productivity by meeting them or be a rude ass by saying no? Harumph.&lt;/p&gt;

&lt;p&gt;Ok, cool. This explained a lot. For years, I had been rude to people I love without understanding why (I&amp;#8217;m still rude but at least I know why). I thought they were just refusing to see how important a lack of interruption was to me&amp;#8230;even when their request only took a measly 30 minutes out of an otherwise clear schedule. &lt;strong&gt;&lt;em&gt;I was a maker!&lt;/em&gt;&lt;/strong&gt; And not everybody intuitively understood the implications! I emailed the article to my mom and my girlfriend and apologized for snapping in the past.&lt;/p&gt;

&lt;p&gt;Fast forward to today. By fate or free will or some sort of sick cosmic joke, I&amp;#8217;ve spent the last 5 years trying to become a good manager. Trying to make myself always interruptable, always focused on empowering others, always thinking twice before going off on my lonesome to build something. Like many makers breaking managerial, I&amp;#8217;ve been challenged. And at the end of the day, most challenges for a maker-turned-manager boil down to the loss of a maker&amp;#8217;s schedule.&lt;/p&gt;

&lt;img src="http://static.tumblr.com/9hgswys/Bkvmdav0s/door.jpeg" align="left" class="leftInset"/&gt;&lt;p&gt;Far as I can tell, there are three doors to choose from if you&amp;#8217;re a maker becoming a manager:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Door #1: Embrace it.&lt;/strong&gt; Completely give up the maker&amp;#8217;s schedule and the idea that you need to personally make to be valuable. &lt;em&gt;Know&lt;/em&gt;, deep down in your heart, that all of your time is now best spent empowering others. I know plenty of people who have been able to do this, and I admire them greatly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Door #2: Flit between the two.&lt;/strong&gt; Your schedule is now maker-manager. Convince yourself that it&amp;#8217;s more important to help somebody else than to build on your own (cuz it is), but still try to build because that&amp;#8217;s what you love. I&amp;#8217;ve been peering behind this door for quite a while now. The path is rife with confusion. You simultaneously value yourself by what you personally get done and your willingness to &lt;em&gt;not&lt;/em&gt; get things done while empowering others. That&amp;#8217;s inconsistent and possibly frustrating, but not necessarily wrong or unnavigable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Door #3: Be the mythical perfect maker-manager.&lt;/strong&gt; This door only exists in my dreams. If somebody can tell me more about finding time to reach peak creativity while also being an always-available and aware manager, consider this blog post my way of begging.&lt;/p&gt;

&lt;p&gt;Door #1 doesn&amp;#8217;t work for me. I have trouble sleeping if I haven&amp;#8217;t personally created in some way, even if it&amp;#8217;s a tiny bug fix or blog post. I cannot manage well if I become too disconnected from the product. These may be managerial limitations of mine, but so be it. It&amp;#8217;s in my bones. I applaud those who open this door, but I&amp;#8217;m most at home&amp;#8230;most myself&amp;#8230;when finding a balance between maker and manager.&lt;/p&gt;

&lt;p&gt;And since I seem to have lost the keys for Door #3, I&amp;#8217;m gonna share survival tips for those passing through #2.&lt;/p&gt;

&lt;hr style="width:33%;margin-left:33%"&gt;&lt;br/&gt;&lt;h1&gt;A Maker-Manager&amp;#8217;s Survival Tips&lt;/h1&gt;&lt;br/&gt;&lt;p&gt;&lt;a href="http://isbengrumpy.com"&gt;Grumpy like me&lt;/a&gt; when the scales start tipping past 90% manager?&lt;/p&gt;

&lt;h1&gt;1. There is a difference between being willing to be interrupted at any time and letting your schedule be entirely controlled by others.&lt;/h1&gt;&lt;br/&gt;&lt;p&gt;It&amp;#8217;s taken me years to start to understand this. Always saying yes to, &amp;#8220;Hey Ben, I need some help&amp;#8221; is not the same as always saying yes to, &amp;#8220;Can we talk at 3pm on Thursday?&amp;#8221; You can&amp;#8217;t dismiss the former and still call yourself a great manager. You can reschedule the latter for a different day and still be great.&lt;/p&gt;

&lt;p&gt;You can take control of your schedule and preemptively block out time for making. I&amp;#8217;ve recently gotten better at this (only took a few years). It&amp;#8217;s transformed my schedule from this:&lt;/p&gt;

&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/slzmdatfa/random.png"/&gt;&lt;/p&gt;

&lt;p&gt;&amp;#8230;into this:&lt;/p&gt;

&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/tDzmdatg0/blocked.png"/&gt;.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m still 100% interruptable during maker hours. I&amp;#8217;ll still drop everything if anybody else on the team needs something from me to be more productive. But I&amp;#8217;ve preemptively stopped scheduled 1:1s, recruiting interviews, product meetings, and anything else that would&amp;#8217;ve shocked me out of &lt;a href="http://www.randsinrepose.com/archives/2006/07/10/a_nerd_in_a_cave.html"&gt;the coding zone&lt;/a&gt; for a precious bit each week.&lt;/p&gt;

&lt;h1&gt;2. There is a difference between 4 free hours at the start of my day and 4 free hours at the end of my day.&lt;/h1&gt;&lt;br/&gt;&lt;p&gt;Any maker hours I schedule are deliberately pressed up against the end of the day.&lt;/p&gt;

&lt;p&gt;Think about how long it&amp;#8217;ll take to make whatever it is you&amp;#8217;re aching to make next. Say you estimate 3 hours. What are the odds it&amp;#8217;ll take exactly 3 hours? 4 hours? How about 5 or 6? If things go very wrong, could it possibly take a week? There&amp;#8217;s a distribution of possible time needed, and while it&amp;#8217;d be no shock if that 3 hour task took 6 hours, there&amp;#8217;s no way it&amp;#8217;ll take &lt;em&gt;0&lt;/em&gt; hours. The distribution is biased in favor of being late. While rare cases may require a week, no case can take a &lt;em&gt;negative&lt;/em&gt; week. This is a big reason &lt;a href="http://www.joelonsoftware.com/items/2007/10/26.html"&gt;why software is late so often&lt;/a&gt; and being early is a rarity. But that&amp;#8217;s another blog post. As my dad used to say, &amp;#8220;Everything takes longer than you think.&amp;#8221;&lt;/p&gt;

&lt;img align="right" class="rightInset" src="http://static.tumblr.com/9hgswys/xO3mdaukt/tddtl.jpeg"/&gt;&lt;p&gt;It&amp;#8217;s also a big reason why I need a wide open schedule for the rest of the day to truly get in the zone. If things go wrong, I might need that extra hour or two to finish up. &lt;em&gt;If I know, in the back of my head, that my block of time definitely ends in four hours&amp;#8230;I&amp;#8217;ll struggle to slip into the zone.&lt;/em&gt;&lt;/p&gt;
  
&lt;p&gt;Call it a weakness. I need to look out over my day&amp;#8217;s schedule and get the same feeling I get when I look at pictures of an infinite pool. Endless possibility. Complete silence from the piece of my brain that pipes up to ask if it&amp;#8217;s time for that meeting. Freedom to, if I wanted, slip into focus and find myself surprised that the clock says 11pm.&lt;/p&gt;

&lt;h1&gt;3. Keep a list of wins waiting to happen so you don&amp;#8217;t have to think when a little bit of maker time rolls around.&lt;/h1&gt;&lt;br/&gt;&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/gjPmdau69/trello.png"/&gt;&lt;/p&gt;

&lt;p&gt;This is my own personal list of things I can probably accomplish in ~half a day. It&amp;#8217;s not our bug list, it&amp;#8217;s not upcoming critical features. It&amp;#8217;s a secret buffet of ready-made maker meals for any time I start getting the shakes.&lt;/p&gt;

&lt;h1&gt;4. Organize and take full advantage of &lt;a href="http://bjk5.com/post/21317611897/step-one-fix-step-two-it"&gt;fixits&lt;/a&gt; and &lt;a href="http://bjk5.com/post/26810034751/how-we-ran-the-first-khan-academy-healthy-hackathon"&gt;hackathons&lt;/a&gt;.&lt;/h1&gt;&lt;br/&gt;&lt;p&gt;When one of our special dev events rolls around, I burn my managerial hat. Judge me if you want, but during fixit days or hackathons I completely disappear in a cave of code and suffer no shame. I prep beforehand so I can hit the ground running. My last fairly significant contribution to the codebase was during our &lt;a href="http://bjk5.com/post/26810034751/how-we-ran-the-first-khan-academy-healthy-hackathon"&gt;healthy hackathon&lt;/a&gt;, and I still happily milk that memory when I need to remind myself of personal creations.&lt;/p&gt;

&lt;p&gt;Tuesday&amp;#8217;s the next &lt;a href="http://bjk5.com/post/21317611897/step-one-fix-step-two-it"&gt;Khan Academy fixit&lt;/a&gt;, and I already can&amp;#8217;t wait to make. It can be difficult to find the groove as a maker-manager, but with a team like Khan Academy&amp;#8217;s, it sure is sweet when you do.&lt;/p&gt;

&lt;p&gt;If you have other tips, I&amp;#8217;m dying to hear &amp;#8216;em.&lt;/p&gt;</description><link>http://bjk5.com/post/35488799286</link><guid>http://bjk5.com/post/35488799286</guid><pubDate>Sun, 11 Nov 2012 08:05:00 -0800</pubDate></item><item><title>What traffic from 60 Minutes looks like</title><description>&lt;p&gt;Yesterday evening Khan Academy was featured on 60 Minutes. It was a rerun.&lt;/p&gt;

&lt;p class="center"&gt;
&lt;iframe width="560" height="315" src="http://www.youtube.com/embed/j7Uwt6lIEO4" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;br/&gt;&lt;em&gt;&lt;a href="https://github.com/beneater"&gt;Ben Eater&lt;/a&gt; recorded our real-time active visitors during the East Coast feed&lt;br/&gt;&amp;#8212; here it is sped up 10x.&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;Last time&lt;/h1&gt;&lt;br/&gt;&lt;p&gt;In March, when &lt;a href="http://www.cbsnews.com/video/watch/?id=7401696n"&gt;the clip&lt;/a&gt; first aired, I had Camtasia open and was recording my view of Google Analytics&amp;#8217; real-time visitor data. I was excited to share a view into the traffic &lt;a href="http://en.wikipedia.org/wiki/Sanjay_Gupta"&gt;Sanjay Gupta&lt;/a&gt; commands when he&amp;#8217;s not neurosurgeoning or professoring. So the segment starts, we see 10k simultaneous visitors&amp;#8230;12k&amp;#8230;20k&amp;#8230;30k&amp;#8230;45k&amp;#8230;50k&amp;#8230;I test a quick load of the homepage&amp;#8230;crash. Try again, crash. Fast forward three fire-fighting hours later, and I would barely remember that I left Camtasia recording the whole thing. I wound up with more video than anyone would ever want of me tabbing around like crazy, trying to help our site scale.
&lt;/p&gt;

&lt;p&gt;We wound up dropping at least 30% of the East Coast feed&amp;#8217;s homepage requests on the floor that night. Rough. We &lt;em&gt;barely&lt;/em&gt; managed to patch things up before the Mountain and Pacific showings.&lt;/p&gt;

&lt;h1&gt;A second chance&lt;/h1&gt;&lt;br/&gt;&lt;p&gt;Needless to say, we were excited when 60 Minutes gave us the heads-up earlier this week that they&amp;#8217;d be running the piece again. We started twisting all the pre-traffic dials we learned about during our struggles last time (tech details are out of scope for this post, lemme know if you&amp;#8217;re interested) and crossed our fingers. Our site has changed a &lt;em&gt;lot&lt;/em&gt; since March, so we were obviously at risk of unknown scaling issues. But more importantly, Craig, &lt;a href="https://twitter.com/chrisklaiber"&gt;Chris&lt;/a&gt;, and &lt;a href="http://dylanv.org/"&gt;Dylan&lt;/a&gt; spent the summer battening down our App Engine hatches with a focus on performance and reliability.&lt;/p&gt;

&lt;p class="center"&gt;&lt;strong&gt;Yesterday&amp;#8217;s requests per second&lt;/strong&gt;&lt;br/&gt;&lt;img src="http://static.tumblr.com/9hgswys/PuVm9roej/reqssec.png"/&gt;&lt;br/&gt;&lt;em&gt;The steepness of this spike isn&amp;#8217;t helped by the fact that this aired on the&lt;br/&gt;Sunday before a holiday, which means the rest of the day had very low traffic.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Things went quite well this time. We were shy of perfect &amp;#8212; right at the peak, we dropped about 500 homepage requests due to a slight problem that we&amp;#8217;ll know how to prepare for next time &amp;#8212; but handled the traffic much, much better than last time. All in all, we saw over 1.2M pageviews from the start of the East Coast feed at ~4:30PM EST to the end of the West Coast feed at ~8PM EST. &lt;strong&gt;That&amp;#8217;s over 1/3 of the pageviews that &lt;a href="http://blog.reddit.com/2012/08/potus-iama-stats.html"&gt;POTUS got on the day of his reddit IAMA&lt;/a&gt; &amp;#8212; a cheap, unfair, &lt;em&gt;ridiculous&lt;/em&gt; comparison since we&amp;#8217;re counting pageviews across our entire site vs. a single reddit post, but, hey, politics aren&amp;#8217;t fair.&lt;/strong&gt; Again, much credit to App Engine and our App Engine team. All I did was yell out &amp;#8220;50K!&amp;#8221; ceremoniously when the concurrent users counter ticked past fun milestones.&lt;/p&gt;

&lt;p class="center"&gt;&lt;strong&gt;Last March&amp;#8217;s Sunday visits:&lt;/strong&gt;&lt;br/&gt;&lt;img src="http://static.tumblr.com/9hgswys/pypm9sd5u/2.png"/&gt;&lt;br/&gt;&lt;em&gt;Our visits peaked much higher during the original airing&amp;#8230;&lt;/em&gt;&lt;/p&gt;

&lt;p class="center"&gt;&lt;strong&gt;Yesterday&amp;#8217;s visits&lt;/strong&gt;&lt;br/&gt;&lt;img src="http://static.tumblr.com/9hgswys/UWIm9sd5c/1.png"/&gt;&lt;br/&gt;&lt;em&gt;&amp;#8230;but the rerun still delivered quite a bit of traffic for us.&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;Putting 60 Minutes in perspective&lt;/h1&gt;&lt;br/&gt;&lt;p&gt;On August 14th we launched our new &lt;a href="http://www.khanacademy.org/cs"&gt;computer science section of Khan Academy&lt;/a&gt;. It was featured by &lt;a href="http://venturebeat.com/2012/08/14/khan-academy-computer-science/"&gt;venturebeat&lt;/a&gt;, &lt;a href="http://techcrunch.com/2012/08/14/khan-academy-launches-the-future-of-computer-science-education/"&gt;Techcrunch&lt;/a&gt;, &lt;a href="http://www.wired.com/geekmom/2012/08/khan-academy-adds-computer-science-courses/"&gt;Wired&lt;/a&gt;, &lt;a href="http://www.forbes.com/sites/natalierobehmed/2012/08/17/forget-comp-sci-101-learn-to-code-with-a-click-of-your-mouse/"&gt;Forbes&lt;/a&gt;, and more. &lt;a href="http://ejohn.org/blog/introducing-khan-cs/"&gt;John&amp;#8217;s blog&lt;/a&gt; hung at the top of Hacker News for almost an entire day, and twitter was exploding with positive feedback. Despite being a massively successful launch, that amount of online press didn&amp;#8217;t come close to the traffic that 60 Minutes has at its fingertips. It&amp;#8217;s not a perfect comparison since John&amp;#8217;s blog likely soaked up a lot of traffic, but it&amp;#8217;s still interesting.&lt;/p&gt;

&lt;p&gt;In fact, looking back over a couple years of Khan Academy traffic, no press event has even remotely approached the original 60 Minutes airing&amp;#8217;s traffic spike. Yesterday&amp;#8217;s rerun and Sal&amp;#8217;s TED talk are the next most interesting events.&lt;/p&gt;</description><link>http://bjk5.com/post/30813320623</link><guid>http://bjk5.com/post/30813320623</guid><pubDate>Mon, 03 Sep 2012 11:47:00 -0700</pubDate></item><item><title>Lessons learned A/B testing with GAE/Bingo</title><description>&lt;p&gt;
Almost a year ago &lt;a href="http://bjk5.com/post/10171483254/a-bingo-split-testing-now-on-app-engine-built-for-khan"&gt;we released a version&lt;/a&gt; of Patrick McKenzie&amp;#8217;s &lt;a href="http://www.bingocardcreator.com/abingo"&gt;A/Bingo&lt;/a&gt;, built for Khan Academy and others in need of an App Engine-optimized split testing tool. It&amp;#8217;s been in constant production use at Khan since then. We&amp;#8217;ve made mistakes, learned lessons, and spent plenty of time scratching our heads pondering results.
&lt;/p&gt;

&lt;p&gt;
Thanks to those lessons, the &lt;a href="https://github.com/kamens/gae_bingo"&gt;current version of GAE/Bingo&lt;/a&gt; is a lot more powerful than it used to be. And I&amp;#8217;m in a sharing mood.
&lt;/p&gt;

&lt;h1&gt;Lesson learned, tool updated: make it trivial to observe many metrics&lt;/h1&gt;&lt;br/&gt;&lt;p&gt;
We use GAE/Bingo to keep an eye on tons of different metrics whenever we&amp;#8217;re testing a change. For KA that means tracking things like exercise problems completed, proficiencies earned in math topics, videos watched, return visits, registrations, and anything else that &lt;a href="http://derandomized.com/"&gt;Jace and his team&lt;/a&gt; decide belong in our collection of core metrics. So it&amp;#8217;s not rare to spot us yelling &amp;#8220;Bingo!&amp;#8221; (A/Bingo&amp;#8217;s cute lingo for an A/B conversion) at all sorts of interesting points throughout our code:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def attempt_problem():
    # Yelling "bingo!" is A/Bingo's cute lingo for a conversion
    gae_bingo.bingo("problem attempt")

    ...

    if earned_proficiency:
        gae_bingo.bingo("new proficiency")

&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;These &lt;code&gt;bingo()&lt;/code&gt;s stick around; we rarely have to change them. That means whenever we run a new experiment, all interesting metrics are tracked independently and automatically with one line of code:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;if gae_bingo.ab_test("&lt;a href="https://twitter.com/jasonrr/status/223463581969162241"&gt;new homepage layout&lt;/a&gt;"):
    # ...try new homepage layout

&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;
&amp;#8230;so we can ship that line of code, put on our lab coats, open up GAE/Bingo&amp;#8217;s dashboard, and start poking around the incoming data. We don&amp;#8217;t have to think about how to track all these conversion metrics every single time we add a new test.
&lt;/p&gt;

&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/OS4m7wkwh/searches.png"/&gt;&lt;br/&gt;&lt;em&gt;Look&amp;#8217;a all those metrics just begging to be clicked on.&lt;br/&gt;If you can&amp;#8217;t tell, this screenshot is our new homepage layout experiment (which happens to toy w/ an emphasis on search).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Of course, we can also choose to specifically track, say, &amp;#8220;proficiencies earned in &lt;a href="http://www.khanacademy.org/math/geometry/basic-geometry/e/solid_geometry"&gt;the Solid Geometry exercise&lt;/a&gt;&amp;#8221; when tweaking hints for solid geometry &amp;#8212; we just add a new &lt;code&gt;bingo()&lt;/code&gt; at the right spot.&lt;/p&gt;

&lt;h1&gt;Lesson learned, tool updated: lean on historical graphs, not stat sig&lt;/h1&gt;&lt;br/&gt;&lt;p&gt;
I&amp;#8217;ve covered this before: &lt;a href="http://bjk5.com/post/12829339471/a-b-testing-still-works-sarcastic-phew"&gt;there are lots of dangers in trusting a single signal of statistic significance sent off from any A/B test, but that doesn&amp;#8217;t mean they don&amp;#8217;t work&lt;/a&gt;. We&amp;#8217;ve learned a buttload (shut up, it&amp;#8217;s a real measurement) more from our data ever since we started snapshotting A/B test results hourly and graphing them next to our framework&amp;#8217;s automatic stat sig analysis. And I&amp;#8217;m sure we&amp;#8217;ve made fewer mistaken snap judgments.
&lt;/p&gt;

&lt;p class="center"&gt;
&lt;img src="http://static.tumblr.com/9hgswys/Gv4m7wm5v/socrates.png"/&gt;&lt;br/&gt;&lt;em&gt;A single &amp;#8220;99% significant&amp;#8221; number doesn&amp;#8217;t really capture the full story of an A/B test.&lt;br/&gt;This particular test is keeping an eye on the effects of &lt;a href="http://www.khanacademy.org/labs/socrates/science/physics/v/slow-sock-on-lubricon-vi#try-it-yourself/q"&gt;asking users an interactive question&lt;/a&gt;&lt;br/&gt;in the middle of watching a video.&lt;/em&gt;
&lt;/p&gt;

&lt;h1&gt;Lesson learned, tool updated: leave a trail of your past experiments&lt;/h1&gt;&lt;br/&gt;&lt;p&gt;
We&amp;#8217;re currently running 9 different A/B tests, each tracking somewhere between 10 and 35 different metrics. That&amp;#8217;s been pretty common for the past few months. A large body of knowledge about our past experiments is accumulating. As our team has grown, it&amp;#8217;s become more and more important to figure out how to easily save and share past test results.
&lt;/p&gt;

&lt;p&gt;
The latest version of GAE/Bingo lets you archive your experiment with notes and, because we like a little spice in our software, a choice of emotional reactions to the outcome. Take a look:
&lt;/p&gt;

&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/exYm7wnbv/archives.png"/&gt;&lt;br/&gt;&lt;em&gt;We like keeping stories of old experiments around, even if the data was confusing.&lt;br/&gt;This particular test was our attempt at encouraging students to use interactive hints when trying to solve difficult problems.&lt;/em&gt;&lt;/p&gt;

&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/NhMm7wnx2/archivelist.png"/&gt;&lt;br/&gt;&lt;em&gt;Our list of archived experiments tells a story about what we&amp;#8217;ve been trying to improve.&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;Lesson still being learned, tool not updated: interpreting results is very hard&lt;/h1&gt;&lt;br/&gt;&lt;p&gt;
&lt;a href="http://glinden.blogspot.com/2012/07/puzzling-outcomes-in-ab-testing.html"&gt;This post about puzzling A/B test results at Microsoft&lt;/a&gt; came at just the right time for us. Anybody running A/B tests should sit down and read it immediately (anybody not running A/B tests has bigger fish to fry).&lt;/p&gt;

&lt;p&gt;Even with all our data, a healthy number of users, and some fancy tools, it can be &lt;em&gt;really&lt;/em&gt; hard to understand what is happening when looking at the results of an A/B test. The linked paper puts it best:&lt;/p&gt;

&lt;blockquote&gt;
&amp;#8230;the devil is in the details and the difference between theory and practice is greater in practice than in theory&amp;#8230;It&amp;#8217;s easy to generate p-values and beautiful 3D graphs of trends over time&amp;#8230;real challenge is in understanding when the results are invalid, not at the sixth decimal place, but before the decimal point&amp;#8230;Generating numbers is easy; generating numbers you should trust is hard!
&lt;/blockquote&gt;

&lt;p&gt;
I&amp;#8217;m ok raising my hand and admitting that we&amp;#8217;ve seen some really confusing numbers from our experiments. We&amp;#8217;ve seen an experiment involving interactive physics videos increase the number of math skill proficiencies earned&amp;#8230;on a completely separate part of our site. We&amp;#8217;ve had a homepage experiment drastically impact user registration numbers&amp;#8230;but the registration effect started 4 days after the experiment began. We tested a &amp;#8220;Send Sal thanks!&amp;#8221; button designed to distract users from adding &amp;#8220;thank you!!!!&amp;#8221; comments under our videos&amp;#8230;and users started leaving more comments. I could go on and on.
&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m even ok raising my hand and admitting that these discrepancies caused our team to run one of those (brilliantly named) A/A tests. It has been very humbling and healthy to compare two identical versions of Khan Academy, watch the results come in, and wonder what stories you&amp;#8217;d be explaining to yourself if these numbers were tied to a real experiment. &lt;strong&gt;If you&amp;#8217;ve ever spent time looking at A/B test results, I cannot recommend running an A/A test highly enough.&lt;/strong&gt; It is a good gut check reminding you what your mind does when interpreting results.&lt;/p&gt;

&lt;p&gt;
Sure, some of these discrepancies are almost certainly caused by bugs in our code. Some are caused by the fact that GAE/Bingo doesn&amp;#8217;t do a good job handling outliers yet, so a single participant can act all crazypants and make our graphs go wonk. &lt;strong&gt;But sometimes it just takes us a long time to figure out what the heck&amp;#8217;s going on.&lt;/strong&gt; I&amp;#8217;m glad Microsoft published their paper admitting the same.
&lt;/p&gt;

&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/vnhm7wpmw/screen_shot_2012-07-28_at_10.25.06_pm.png"/&gt;&lt;/p&gt;

&lt;h1&gt;Grab the tool, start a test, tell us what you learn&lt;/h1&gt;&lt;br/&gt;&lt;p&gt;
Please let me know if you&amp;#8217;ve learned any lessons using &lt;a href="https://github.com/kamens/gae_bingo"&gt;GAE/Bingo&lt;/a&gt; elsewhere. Or if you have tips for improving more. I&amp;#8217;d love to share.
&lt;/p&gt;</description><link>http://bjk5.com/post/28269263789</link><guid>http://bjk5.com/post/28269263789</guid><pubDate>Sun, 29 Jul 2012 09:20:00 -0700</pubDate></item><item><title>How we ran the first Khan Academy Healthy Hackathon</title><description>&lt;p&gt;This weekend was our first hackathon. Despite not knowing WTF we were doing as organizers, I&amp;#8217;m calling it a huge success. The creations demo&amp;#8217;d yesterday blew me away (more to come on that).&lt;/p&gt;

&lt;p&gt;When we started trying to puzzle out the few details that need to be puzzled out when running a tiny, private hackathon, we stole plenty from the &lt;a href="http://news.ycombinator.com/item?id=2240925"&gt;shared&lt;/a&gt; &lt;a href="http://chengsoon.com/2012/06/04/hackathon_no_more.html"&gt;experiences&lt;/a&gt; &lt;a href="http://sehackday.com/"&gt;of&lt;/a&gt; &lt;a href="https://github.com/psobot/sehackday/blob/f443ed25b1975de27c188deb16356562209c9908/app/views/application/_future.html.haml"&gt;others&lt;/a&gt;. Figured I&amp;#8217;d return the favor in hope of somebody stumbling across this post and finding inspiration of their own.&lt;/p&gt;

&lt;p&gt;Since this wasn&amp;#8217;t open to the public, our planning, advertising, and rules were all bundled up into one email. It&amp;#8217;s copied below, but I&amp;#8217;ll start by highlighting the unique parts for you tl;dr&amp;#8217;ers.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Our hackathon was healthy.&lt;/b&gt;&lt;br/&gt;
The whole red bull and no sleep thing (and sometimes alcohol, apparently?) doesn&amp;#8217;t really align with Khan Academy&amp;#8217;s tradition of investing in employees for the long-term. We shared salmon for dinner and ate the best snackies Whole Foods had to offer. We forced everyone to go get sleep at 11:45pm and re-opened the doors at 9:30.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Our definition of &amp;#8220;hack&amp;#8221; was not limited to code.&lt;/b&gt;&lt;br/&gt;&lt;a href="http://lifeatka.tumblr.com/post/26788173247/healthy-hackathon"&gt;Jessica&amp;#8217;s not &amp;#8220;officially&amp;#8221; a dev, but that didn&amp;#8217;t stop her from creating a gorgeous new careers page&lt;/a&gt; and more. Others from outside the dev team were hacking on copy, improving the names of our math exercises, building useful spreadsheets, and generally creating anything they could think of. Involving everyone in the company was the most unique part of this weekend, and multiple devs told me it made the experience for them. &lt;a href="https://sites.google.com/a/khanacademy.org/forge/for-developers"&gt;Anybody can fix anything.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;We had one &amp;#8220;roaming hacker.&amp;#8221;&lt;/b&gt;&lt;br/&gt;&lt;a href="https://plus.google.com/101013822660106280579/posts"&gt;Ben&lt;/a&gt; &lt;a href="http://stackoverflow.com/users/49485/ben-alpert"&gt;Alpert&lt;/a&gt; designated himself the official roaming hacker, ready to teach anyone. He somehow found time between his creations to help almost every other team. After 1.5 internships and a year of working part-time while at CMU, he knows the codebase as well as anybody, and he was always available for interruption (unlike me&amp;#8230;I selfishly seized the opportunity to squirrel away and code). When the bell rang Saturday afternoon, multiple hack teams felt indebted to Ben. Maybe next time we&amp;#8217;ll have two.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Everyone had to demo.&lt;/b&gt;&lt;br/&gt;
Anything hacked together had to be demo&amp;#8217;d to everyone else. &lt;a href="https://sites.google.com/a/khanacademy.org/forge/for-developers"&gt;Share your work.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you&amp;#8217;re actually planning a hackathon soon and looking to get a feel for more of the nitty gritty, our kick-off email follows.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;i&gt;To: all@khanacademy.org&lt;/i&gt;&lt;br/&gt;&lt;i&gt;Subject: W-w-wild and crazy hacks&lt;/i&gt;
&lt;/p&gt;

&lt;p&gt;&lt;b&gt;♤✌☭☂♘ (The First) Khan Academy Healthy Hackathon ♘☂☭✌♤&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;We&amp;#8217;re having our first team hackathon at the start of next weekend. It&amp;#8217;s open and friendly for *everybody* in the company, regardless of whether or not you currently think you&amp;#8217;re a hacker, and kicks off Friday afternoon.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;WTF is a hackathon?&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Have you ever sat quietly at home and thought to yourself, &amp;#8220;I&amp;#8217;d really like to make some even nicer social sharing features, but that&amp;#8217;s never at the top of our todo list.&amp;#8221; No? You&amp;#8217;re not Desmond?&lt;/p&gt;

&lt;p&gt;How about, &amp;#8220;I&amp;#8217;d love to experiment with a simple fact recovery exercise for teaching things like multiplication tables, but it&amp;#8217;s just not critical.&amp;#8221; No, not Jace?&lt;/p&gt;

&lt;p&gt;Maybe, &amp;#8220;I&amp;#8217;d love to make sure all our code has unit tests and docstrings and isn&amp;#8217;t filled with ugly circular references and generally appears to be written by semi-competent professionals.&amp;#8221; K, you&amp;#8217;re not Craig&amp;#8230;&lt;/p&gt;

&lt;p&gt;This first hackathon is a chance to work on absolutely anything you want that&amp;#8217;s connected to Khan Academy. If you have an itch, scratch it. It doesn&amp;#8217;t matter how wild or crazy it is. Hence the Omar Gooding-themed email subject.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;WTF do I make?&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;We just covered that. Anything related to Khan Academy. Here are some possibilities cheesily accentuated with exclamation points:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;Make your first interactive math exercise!&lt;/li&gt;
&lt;li&gt;Use Khan Academy&amp;#8217;s API to integrate with a cool external service like DuckDuckGo via &lt;a href="http://duckduckhack.com"&gt;http://duckduckhack.com&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;Make an exercise that teaches people how to use sign language for &lt;a href="http://www.khanacademy.org/labs"&gt;&lt;a href="http://www.khanacademy.org/labs"&gt;www.khanacademy.org/labs&lt;/a&gt;&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;Run an A/B test or three on the knowledge map to figure out what wording gets people to start the most suggested exercises!&lt;/li&gt;
&lt;li&gt;Drastically change the world in less than a day by building a quick landing page for our translated videos!&lt;/li&gt;
&lt;li&gt;Write a blog post about what you do!&lt;/li&gt;
&lt;li&gt;Analyze our data and try to figure out if users from a specific non-US country have unique usage patterns, then blog about it!&lt;/li&gt;
&lt;li&gt;Make a little widget that influencers can drop on their blogs to link back to their public Khan profiles!&lt;/li&gt;
&lt;li&gt;Learn a new programming language by creating a wrapper for our API in the language of your choosing!&lt;/li&gt;
&lt;li&gt;Create a better blogging system for our team! (props Jessica)&lt;/li&gt;
&lt;li&gt;&amp;#8230;I&amp;#8217;m sure you can think of more that don&amp;#8217;t need the cheesy exclamation points to sound cool. They go here: &lt;a href="https://trello.com/board/khan-academy-healthy-hackathon/4fed76fc065593df077466de"&gt;https://trello.com/board/khan-academy-healthy-hackathon/4fed76fc065593df077466de&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;b&gt;Do I have to know how to code?&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;NO. Hacking is about solving a problem and building anything. It&amp;#8217;s perfectly fine to treat this as a chance to learn (take a crack at an exercise!) or create something other than code. Khan-like videos, exercise specs, blog posts, beautiful whiteboard murals&amp;#8230;as long as you&amp;#8217;re creating something that you can show off to the rest of the group, you&amp;#8217;re hacking and you&amp;#8217;re in.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Ok, so WTF do I do now?&lt;/b&gt;&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;Add your ideas to the Trello board. &lt;a href="https://trello.com/board/khan-academy-healthy-hackathon/4fed76fc065593df077466de"&gt;https://trello.com/board/khan-academy-healthy-hackathon/4fed76fc065593df077466de&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Commit to an idea if you&amp;#8217;re sold.&lt;/li&gt;
&lt;li&gt;Start lobbying others to join your team if you want. Humbly suggest using this as a chance to work with people you don&amp;#8217;t work with every day.&lt;/li&gt;
&lt;li&gt;Prepare to hack with a mixtape or two blaring in the background. Do not start coding yet. David.&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;b&gt;WTF are the rules?&lt;/b&gt;&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;You have to create something connected to Khan Academy.&lt;/li&gt;
&lt;li&gt;You have to demo or show off what you&amp;#8217;ve created at the end of the hackathon.&lt;/li&gt;
&lt;li&gt;You have to act like a healthy hacker (sleep, eat good food).&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;b&gt;Details please.&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;i&gt;Start&lt;/i&gt;&lt;br/&gt;
5:30PM on Friday the 6th. Our office. We&amp;#8217;ll start by letting idea owners pitch to others and try to convince them to help.&lt;/p&gt;

&lt;p&gt;&lt;i&gt;Intermission&lt;/i&gt;&lt;br/&gt;
We will be locking everybody out of the office at 11:45pm on Friday. You will go home and get a healthy night&amp;#8217;s sleep. We will take your computers if necessary. David. Doors reopen at 9:30am on Saturday.&lt;/p&gt;

&lt;p&gt;&lt;i&gt;End&lt;/i&gt;&lt;br/&gt;
Coding stops at 5pm on Saturday. Keyboards will be disconnected. Every team will then demo &amp;#8212; expect to end around 5:30.&lt;/p&gt;

&lt;p&gt;&lt;i&gt;Food&lt;/i&gt;&lt;br/&gt;
Dinner will be provided Friday night and there&amp;#8217;ll be snacks available all day Saturday. Lunch is up to you. Dinner and snacks will have a healthy theme.&lt;/p&gt;

&lt;p&gt;&lt;i&gt;Teams&lt;/i&gt;&lt;br/&gt;
We highly encourage hackers to work in teams, but keep the size limited to 

&lt;/p&gt;&lt;p&gt;&lt;i&gt;Prizes&lt;/i&gt;&lt;br/&gt;
The judging rules are secret, but prizes will include a [redacted], a [redacted], a [redacted], and a [redacted] :). Also one or two other things.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Do I have to attend? This is my weekend. FOR THE LOVE OF THE GODS LEAVE ME ALONE I NEED TIME IN MY ZEN RELAXATION STUDIO.&lt;/b&gt;&lt;/p&gt;

No problem. We believe the weekend is your time, and you should use it without hesitation. This is a completely optional healthy hackathon that just happens to instantly make all attendees ridiculously cool and good-looking. The choice is yours.
&lt;/blockquote&gt;

&lt;p&gt;There &lt;em&gt;will&lt;/em&gt; be a next time. We had a blast. Things I&amp;#8217;d change? &amp;#8230;add another roaming hacker, rethink how prizes are awarded, and consider adding another day to support even more grandiose hacks.&lt;/p&gt;</description><link>http://bjk5.com/post/26810034751</link><guid>http://bjk5.com/post/26810034751</guid><pubDate>Sun, 08 Jul 2012 20:58:00 -0700</pubDate></item><item><title>My Compute Engine Pipe Dream</title><description>&lt;p&gt;
I&amp;#8217;m gonna don my rose-colored glasses and take a look at &lt;a href="http://cloud.google.com/products/compute-engine.html"&gt;Google&amp;#8217;s newly announced Compute Engine&lt;/a&gt;. As the majority of Khan Academy runs on App Engine, I&amp;#8217;m very excited about a specific possibility here.
&lt;/p&gt;

&lt;p&gt;
While I&amp;#8217;m aware of the fact that Compute Engine&amp;#8217;s list of use cases is currently aimed at backend data analysis type stuff, I&amp;#8217;m gonna take a guess and say that it&amp;#8217;s only a matter of time before they add the necessary tools to start serving user-facing web apps.
&lt;/p&gt;

&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/8AJm6i4au/screen_shot_2012-07-01_at_2.40.37_pm.png"/&gt;&lt;em&gt;From &lt;a href="http://cloud.google.com/products/compute-engine.html"&gt;&lt;a href="http://cloud.google.com/products/compute-engine.html"&gt;http://cloud.google.com/products/compute-engine.html&lt;/a&gt;&lt;/a&gt; &amp;#8212;&lt;br/&gt;I doubt someone tripped and typed &amp;#8220;(Initial)&amp;#8221; accidentally.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;
They&amp;#8217;ve already got App Engine pointed squarely at the application problem, so it makes sense to initially roll out Compute Engine without worrying about that use case. However, to &lt;strong&gt;really&lt;/strong&gt; compete with EC2, Google&amp;#8217;ll have to take this next step. App Engine is a great product, but it&amp;#8217;ll never provide the flexibility of access to a virtual machine &amp;#8212; and that&amp;#8217;s the exact need that causes many shops building user-facing apps to choose AWS. Google engineers are smarter than me, and they know this. Unless I&amp;#8217;m way off base, It&amp;#8217;s only a matter of time before Compute Engine steps in.
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Here&amp;#8217;s where things get interesting.&lt;/strong&gt; Google&amp;#8217;s datastore &amp;#8212; the one already in use by App Engine, the one touted as the world&amp;#8217;s largest public nosql datastore &amp;#8212; is unique. Unless I&amp;#8217;m wrong &amp;#8212; and god, I&amp;#8217;d love to be wrong &amp;#8212; there is no datastore solution out there that comes close to its scalability + querying power with such shockingly few management concerns. To put it more precisely: what other datastore, database, nosql, sql, tape drive, or box of chalk can you drop into an application that&amp;#8217;ll permanently persist terabytes of data with thousands of writes per second &lt;em&gt;without forcing you to think long and hard about sharding your data across multiple machines&lt;/em&gt;? You might answer &lt;a href="http://aws.amazon.com/dynamodb/"&gt;Amazon&amp;#8217;s DynamoDB&lt;/a&gt;, which is becoming pretty cool and can handle all the writes, but the queries and indexes enabled by Google&amp;#8217;s datastore are much, much more powerful. I&amp;#8217;m sure Amazon is going to continue adding features to DynamoDB, but right now Google&amp;#8217;s queries win easily.
&lt;/p&gt;

&lt;p&gt;
Our App Engine datastore is currently using 7 terabytes of space. &lt;em&gt;Before writing this blog, the last and only other time I needed to check that number was when I was creating a trivia game out of random Khan Academy facts.&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;
If it&amp;#8217;s not obvious by now, my pipe dream is for Google to combine Compute Engine&amp;#8217;s flexible virtual machines with App Engine&amp;#8217;s ridiculously impressive datastore. It&amp;#8217;d need to be tight, automatic integration, in much the same way the current datastore only requires App Engine developers to include a Python library or two. It&amp;#8217;d need to have latency comparable to App Engine&amp;#8217;s current datastore latency, which presumably means you&amp;#8217;d need a guarantee that your Compute Engine virtual machines have fast connections to all the right datastores.&lt;/p&gt;

&lt;p&gt;I might be talking about science fiction. For all I know, there is some core issue that makes this type of integration a complete nonstarter. But if it ever exists, Amazon will have to play datastore catchup and many shops will have to take a good hard look at Compute Engine when preparing to build an app that needs flexible virtual servers and a powerful, scalable datastore with insultingly low maintenance requirements. We certainly would.
&lt;/p&gt;</description><link>http://bjk5.com/post/26346827037</link><guid>http://bjk5.com/post/26346827037</guid><pubDate>Mon, 02 Jul 2012 07:42:20 -0700</pubDate></item><item><title>App Engine Performance Essentials You'll Certainly Need, Part II</title><description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;Update:&lt;/strong&gt; the bad fetch performance described in this post has been fixed by the ever responsive App Engine team (see comments below). However, this read is still useful and I still recommend using .run instead of .fetch to stay on top of current App Engine best practices.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s kinda cheating to call this Part II of &lt;a href="http://bjk5.com/post/11766098283/app-engine-performance-hacks-youll-probably-never"&gt;App Engine Performace Hacks You&amp;#8217;ll Probably Never Need&lt;/a&gt;, but I recently stumbled across a single tip that anybody in App Engine land will want to know about.&lt;/p&gt;

&lt;h1&gt;Don&amp;#8217;t use &lt;code&gt;&lt;a href="https://developers.google.com/appengine/docs/python/datastore/queryclass#Query_fetch"&gt;fetch()&lt;/a&gt;&lt;/code&gt; for datastore access, it&amp;#8217;s &lt;em&gt;slower&lt;/em&gt; than it used to be&lt;br/&gt;&lt;br/&gt;&lt;/h1&gt;

&lt;p&gt;If you&amp;#8217;ve been on App Engine for a while, you&amp;#8217;re either surprised by that tip or more informed than I was earlier today. Until somewhat recently, it&amp;#8217;s been the case that running:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;for monkey in models.Monkey.all().fetch(500):
    monkey.swing_from_vine()

&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&amp;#8230;would&amp;#8217;ve been much faster than:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;for monkey in models.Monkey.all():
    monkey.swing_from_vine()

&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&amp;#8230;assuming that you have at least a couple hundred Monkeys (who doesn&amp;#8217;t?) and are willing to eat the memory required to hold all Monkeys at once (who wouldn&amp;#8217;t be?). That&amp;#8217;s because &lt;code&gt;all()&lt;/code&gt; returns a query iterator which chunks up its roundtrips to the datastore into a bunch of small trips, while &lt;code&gt;fetch()&lt;/code&gt; (it is hoped) only goes back&amp;#8217;n&amp;#8217;forth once.&lt;/p&gt;

&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/UFCm4gvze/screen_shot_2012-05-23_at_1.02.32_am.png"/&gt;&lt;br/&gt;&lt;em&gt;Most people who once wrote &lt;code&gt;fetch([some big number])&lt;/code&gt; were&lt;br/&gt;trying to avoid RPC performance waterfalls like this. Now it can cause them.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So if you&amp;#8217;re anything like us, your code is probably littered with &lt;code&gt;fetch()&lt;/code&gt; calls all over the place wherever you felt comfortable grabbing a large number of entities and were willing to make a deal w/ the App Engine memory gods to get it done as quickly as possible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This no longer has &lt;em&gt;any&lt;/em&gt; performance benefit unless you use the new &lt;code&gt;batch_size&lt;/code&gt; parameter.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developers.google.com/appengine/docs/python/datastore/queryclass#Query_fetch"&gt;&lt;code&gt;fetch()&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://developers.google.com/appengine/docs/python/datastore/queryclass#Query_run"&gt;&lt;code&gt;run()&lt;/code&gt;&lt;/a&gt; now accept an optional &lt;code&gt;batch_size&lt;/code&gt; parameter, but &lt;code&gt;fetch()&lt;/code&gt;&amp;#8217;s is undocumented. You want something like: &lt;code&gt;fetch(1000, batch_size=1000)&lt;/code&gt; or any reasonable &lt;code&gt;batch_size&lt;/code&gt; for your use case. Without this parameter, &lt;code&gt;fetch()&lt;/code&gt; simply returns &lt;code&gt;list(run(...))&lt;/code&gt; using &lt;code&gt;run()&lt;/code&gt;&amp;#8217;s default parameters, which happen to set a small batch size.&lt;/p&gt;

&lt;p&gt;However, since most people were using &lt;code&gt;fetch()&lt;/code&gt; to get around the batch size issue and don&amp;#8217;t actually need all entities in memory at once, I recommend following the &lt;a href="https://developers.google.com/appengine/docs/python/datastore/queryclass#Query_fetch"&gt;recently updated docs&lt;/a&gt; and always using &lt;code&gt;run()&lt;/code&gt; with a reasonable limit and batch_size:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# A grossly simplified couple of lines from our student reporting code:
for problem in models.Problem.all().run(limit=10000, batch_size=1000):
    problem.add_to_student_report()

&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&amp;#8230;which protects you from unnecessary round trips and still gives you control over the amount of memory you&amp;#8217;re willing to allocate at once. It feels like &lt;code&gt;fetch()&lt;/code&gt; is going the way of the dodo in App Engine land. You can see &lt;a href="http://code.google.com/p/googleappengine/source/diff?spec=svn224&amp;amp;r=224&amp;amp;format=side&amp;amp;path=/trunk/python/google/appengine/ext/db/__init__.py&amp;amp;old_path=/trunk/python/google/appengine/ext/db/__init__.py&amp;amp;old=209"&gt;similar hints dropped into the App Engine codebase&lt;/a&gt; right when their team made the &amp;#8216;ole switcheroo:&lt;/p&gt;

&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/U2qm4gwdk/fetch.png"/&gt;&lt;br/&gt;&lt;em&gt;Critical docstring change right when the implementation switched.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you&amp;#8217;re working in App Engine land, you&amp;#8217;re going to find &lt;a href="https://groups.google.com/group/google-appengine-python/browse_thread/thread/52de7b3137f8e1cb"&gt;countless&lt;/a&gt; &lt;a href="http://stackoverflow.com/questions/264154/google-appengine-how-to-fetch-more-than-1000%0A%0A"&gt;examples&lt;/a&gt; &lt;a href="http://googleappengine.blogspot.com/2009/06/10-things-you-probably-didnt-know-about.html"&gt;all over the web&lt;/a&gt; of people advocating or just using &lt;code&gt;fetch([some big number])&lt;/code&gt;-ish code that directly contradicts the above advice. I&amp;#8217;m gonna go correct &lt;a href="http://stackoverflow.com/questions/4697542/are-query-fetch-and-iteration-effectively-the-same-in-app-engine"&gt;this Stack Overflow question&lt;/a&gt; as soon as I hit Publish. As of this change, all those old pieces of code suffer from the worst of both worlds: high memory requirements and small batch sizes causing lots of roundtrips.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve verified the perf impact on our production server, and just as expected, keeping your roundtrips low can really pay off. While it&amp;#8217;s possible we missed some big announcement somewhere, the fact that we just discovered this means there might be somebody else out there who can benefit.&lt;/p&gt;

&lt;p&gt;If you have any other requests for App Engine performance-related topics to cover, &lt;a href="mailto:kamens@gmail.com"&gt;I&amp;#8217;d love to hear them&lt;/a&gt;.&lt;/p&gt;</description><link>http://bjk5.com/post/23601113262</link><guid>http://bjk5.com/post/23601113262</guid><pubDate>Wed, 23 May 2012 02:05:00 -0700</pubDate></item><item><title>How intern mentorship works at Khan Academy</title><description>&lt;p&gt;Three of our twelve&lt;em&gt;(‽)&lt;/em&gt; summer interns have arrived. It&amp;#8217;s high time I share how we mentor interns before I&amp;#8217;m spending all my time swatting &lt;a href="http://www.amazon.com/Swimmer-Remote-Control-Inflatable-Flying/dp/B005FYEAJ8"&gt;sharks&lt;/a&gt; and &lt;a href="http://www.amazon.com/Syma-S107-S107G-Helicopter-Yellow/dp/B004A8ZRB0/ref=sr_1_2?s=toys-and-games&amp;amp;ie=UTF8&amp;amp;qid=1337304018&amp;amp;sr=1-2"&gt;helicopters&lt;/a&gt; out of the air. These tips also apply to new full-time hires, of course, but for now I&amp;#8217;ve got interns on the brain.&lt;/p&gt;

&lt;h1&gt;1. Make the mentorship relationship explicit&lt;/h1&gt;

&lt;p&gt;At some point in a new employee&amp;#8217;s first day they will hear some variation of the words, &amp;#8220;I&amp;#8217;m your official mentor. As we work through your first few projects together, you can interrupt me any time for any technical question, non-technical question, question about the rules of &lt;a href="http://boardgamegeek.com/boardgame/3955/bang"&gt;Bang!&lt;/a&gt;, or just because you want to order a specific keyboard. Don&amp;#8217;t think twice.&amp;#8221;&lt;/p&gt;

&lt;p&gt;We don&amp;#8217;t throw our interns into a room with 5 people and say &amp;#8220;You&amp;#8217;re surrounded by mentors! LEARN.&amp;#8221; If you&amp;#8217;re &lt;a href="http://www.joelonsoftware.com/articles/HighNotes.html"&gt;hiring right&lt;/a&gt;, they already know how to do that better than you. What they need is awareness of a specific mentor that will unflinchingly act as their outlet for any need, without frustration.&lt;/p&gt;

&lt;p&gt;Good hires will find the right balance between diving into their new codebase to find their own answers and asking you for help. Some may need a little bit of guidance. We&amp;#8217;d rather err on the side of interns asking too many questions (easily correctable) than them being scared or unsure of who to interrupt (unfortunate culture problem).&lt;/p&gt;

&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/uIVm472f6/shark.png"/&gt;&lt;br/&gt;&lt;em&gt;I wish this shark was remote control.&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;2. Code review everything, and have interns do code reviews&lt;/h1&gt;

&lt;p&gt;Gonna keep this short because I&amp;#8217;ve been over this before. &lt;a href="http://bjk5.com/post/3994859683/code-reviews-as-relationship-builders-a-few-tips"&gt;Code reviews form a huge part of our mentor/mentee relationship&lt;/a&gt;. Warning though! I&amp;#8217;ve been bitten in the past when a class of interns wasn&amp;#8217;t code reviewed consistently. If a few interns are getting great code reviews on every checkin and others&amp;#8230;not so much&amp;#8230;, then they&amp;#8217;re going to notice and draw weird conclusions. I&amp;#8217;ve been part of teams that have suffered from this in the past, and I publicly apologize. I&amp;#8217;m less worried about this now that we have &lt;a href="http://bjk5.com/post/18441794352/required-code-reviews"&gt;a simple review all the code policy&lt;/a&gt; at Khan.&lt;/p&gt;

&lt;h1&gt;3. Prep your product pre-arrival&lt;/h1&gt;

&lt;p&gt;The most successful intern projects I&amp;#8217;ve been part of began with &lt;em&gt;months&lt;/em&gt; (no exaggeration) of preparation. At least for Fog Creek and Khan, intern summers are the most suddenly dramatic infusion of horsepower we ever have to absorb. We don&amp;#8217;t want to waste a drop not knowing where we&amp;#8217;re going. You have 9 months every year to stumble around not knowing what you&amp;#8217;re doing&amp;#8230;just get it together for the summer.&lt;/p&gt;

&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/VVLm472u8/success.png"/&gt;&lt;br/&gt;&lt;em&gt;I&amp;#8217;ve been scientifically tracking every intern class and found this to be the most significant variable.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;What do you prep? I&amp;#8217;ve seen a couple things work well:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;If you are planning on using the summer to launch a brand new product or large feature (I recommend this, it&amp;#8217;s a blast), have everything solidified from high-level goals to low-fidelity mockups to code scaffolding.&lt;/li&gt;

&lt;li&gt;If you have a less defined vision but generally want to improve a particular area, set aside a couple weeks of bite-sized projects long before anyone new sets foot inside.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Don&amp;#8217;t worry about overdefining things just yet. This is about making sure people start with a tangible goal to aim for while understanding how that goal fits into your team&amp;#8217;s deeper principles. Smart new hires will have absolutely no trouble stepping outside the bounds of your preparations, &lt;a href="http://bjk5.com/post/8826207372/khan-academy-internship-summer-11"&gt;taking ownership&lt;/a&gt;, and persuading you away from all your stupid assumptions. That&amp;#8217;s exactly what your culture should be encouraging.&lt;/p&gt;

&lt;h1&gt;4. Weekly 1-on-1&amp;#8217;s&lt;/h1&gt;

&lt;p&gt;Our mentors have weekly 1-on-1s with their interns to make sure they&amp;#8217;re learning what they hoped to learn and are working on the types of projects they&amp;#8217;re most passionate about. These days the top interns have tons of opportunity. It&amp;#8217;s a battle for the best, so we make sure Khan interns get the most out of their time. If you think it should be the other way around, you&amp;#8217;re probably already missing out on the best and it&amp;#8217;s highly likely you never started reading this blog in the first place.&lt;/p&gt;

&lt;p&gt;1-on-1&amp;#8217;s can be just a few minutes and may fall back to every other week when appropriate. Just enough to make sure our interns have a chance to self-direct.&lt;/p&gt;

&lt;h1&gt;5. Friday tech talks&lt;/h1&gt;

&lt;p&gt;&amp;#8220;Keep learning&amp;#8221; is on the short list of Khan Academy company values. &lt;a href="http://jamie-wong.com/"&gt;Jamie Wong&lt;/a&gt; started his internship this summer and dropped &lt;a href="https://vimeo.com/41595939"&gt;this tech talk about meteorjs&lt;/a&gt; in the first week. We&amp;#8217;ve had tech talks about fonts (typefaces? styles? ugh I can never remember the politically correct word, I&amp;#8217;m so sorry &lt;a href="http://generic.cx/"&gt;Marcos&lt;/a&gt;), game design, a/b testing, performance, and how Khan Academy is being used in towns without internet connectivity. We&amp;#8217;re inviting cool people like Steve Yegge to teach us about API-centric development. We want to learn more.&lt;/p&gt;

&lt;p&gt;In fact, if you like Khan Academy and want to give us a treat, we&amp;#8217;d love for you to come teach our team something. Email me - &lt;a href="mailto:kamens@gmail.com"&gt;kamens@gmail.com&lt;/a&gt; &amp;#8212; I promise a low-key atmosphere and maybe board games.&lt;/p&gt;</description><link>http://bjk5.com/post/23266999170</link><guid>http://bjk5.com/post/23266999170</guid><pubDate>Thu, 17 May 2012 19:00:00 -0700</pubDate></item><item><title>"Step one? FIX. Step two? IT."</title><description>&lt;blockquote&gt;&amp;#8220;Step three? FIXIT. Now repeat till it is FIXED.&amp;#8221;&lt;/blockquote&gt;

&lt;p&gt;Wise words from &lt;a href="http://www.youtube.com/watch?v=_laaxl1EKqQ"&gt;Kenan&lt;/a&gt;, patron saint of the first Khan Academy fixit.&lt;/p&gt;

&lt;p&gt;Fixit day is just one more in the long list of &lt;a href="http://bjk5.com/post/18441794352/required-code-reviews"&gt;solid dev lessons I&amp;#8217;ve been learning&lt;/a&gt; from the Googlers around here. Since I couldn&amp;#8217;t find a reputable source explaining the fixit culture (who reads the &lt;a href="http://www.nytimes.com/2007/10/21/jobs/21pre.html?_r=1"&gt;NY Times&lt;/a&gt;?), I figured it&amp;#8217;s my duty to share.&lt;/p&gt;

&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/gH5m2o24o/fixit.jpeg"/&gt;&lt;br/&gt;&lt;em&gt;&lt;a href="http://www.youtube.com/watch?v=_laaxl1EKqQ"&gt;Who&amp;#8217;s gonna fix it? They are. Because they broke it.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;What&amp;#8217;s fixit day?&lt;br/&gt;&lt;br/&gt;&lt;/h1&gt;

&lt;img src="http://static.tumblr.com/9hgswys/Yg5m2o2pt/screen_shot_2012-04-18_at_1.44.18_am.png" align="right" class="rightInset" style="margin-left:5px;"/&gt;&lt;blockquote&gt;&amp;#8220;The goal of a fixit is to address niggling concerns that bother you
time and again, but never enough to actually fix them.&amp;#8221;&lt;/blockquote&gt;

&lt;p&gt;That&amp;#8217;s straight from &lt;a href="http://allthingsd.com/20120209/googles-very-first-employee-craig-silverstein-technically-no-3-leaving/"&gt;somebody who has more experience with fixits&lt;/a&gt; than either of us. I prefer to view fixit day as that moment when you finally wake up in the middle of the night with enough consciousness to properly rearrange the blanket (or swipe away the breadcrumb, if you&amp;#8217;re gross like me) that&amp;#8217;s been &lt;em&gt;just barely&lt;/em&gt; interrupting your sleep for the past five hours, but never enough to break you out of your dream. Man that&amp;#8217;s a good feeling. I hate breadcrumbs in bed&amp;#8230;but I also really like cinnamon toast.&lt;/p&gt;

&lt;p&gt;Anyway, our first crack at the whole thing tackled two levels of fixits:&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;
Two teams split up to handle upgrading us to the latest version of &lt;a href="http://documentcloud.github.com/backbone/"&gt;Backbone&lt;/a&gt; and refactoring our code to reduce our circular import problem, respectively. These were both nontrivial tasks that would&amp;#8217;ve been difficult for an individual to get done in the face of a rapidly changing codebase, so they were perfect fixit fodder.&lt;br/&gt;&lt;br/&gt;&lt;/li&gt;

&lt;li&gt;
The rest of us swept away just about any breadcrumb that needed sweeping. Error logs were cleaned up. 404 pages became prettier. Old, unused code was removed. Crashes were fixed. Little CSS bugs were stomped on.
&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;The &amp;#8220;fixedit!&amp;#8221; &lt;a href="http://trello.com"&gt;Trello&lt;/a&gt; column got quite full, fast. And while it&amp;#8217;s easy to &lt;a href="http://rachelbythebay.com/w/2012/02/17/fixit/"&gt;take potshots at fixit day&lt;/a&gt; by claiming that everybody should be fixing this stuff all the time, I was even happier with the team culture inspired by fixit day than with any individual change. Every single person on our team was having fun working on the same thing, and no fix was too &lt;strike&gt;small&lt;/strike&gt; &lt;strike&gt;annoying&lt;/strike&gt; UggggghhhhWhatIsThisBrowserDoing to be undeserving of absolutely anybody&amp;#8217;s attention*. Our first fixit day felt very healthy. It was a little chaotic at the end due to our refactoring ambitions, but they were good ambitions that paid off. The next fixit will be even better. I look forward to it.&lt;/p&gt;

&lt;p&gt;*&lt;a href="http://37signals.com/svn/posts/3163-making-shit-work-is-everyones-job"&gt;Making shit work is everyone&amp;#8217;s job&lt;/a&gt;, unless you&amp;#8217;re &lt;a href="http://bitquabit.com/post/coding-is-priority-number-five/"&gt;the shit umbrella for ever-&lt;/a&gt;&amp;#8230;wait&amp;#8230;nevermind. Too much cursing. This one&amp;#8217;s not gonna get past the censors on the official KA blog.&lt;/p&gt;</description><link>http://bjk5.com/post/21317611897</link><guid>http://bjk5.com/post/21317611897</guid><pubDate>Wed, 18 Apr 2012 01:51:58 -0700</pubDate></item><item><title>Teacher effectiveness ratings, programmers, and Khan Academy's data</title><description>&lt;p&gt;
Today I was doing whatever it is I do when I ran across this link from Joel:
&lt;/p&gt;

&lt;blockquote class="twitter-tweet tw-align-center"&gt;&lt;p&gt;NYC teacher &amp;#8220;effectiveness&amp;#8221; ratings are bogus, and the data prove it &lt;a href="http://t.co/AnCDYtY6" title="http://garyrubinstein.teachforus.org/2012/02/28/analyzing-released-nyc-value-added-data-part-2/"&gt;garyrubinstein.teachforus.org/2012/02/28/ana…&lt;/a&gt;&lt;/p&gt;— Joel Spolsky (@spolsky) &lt;a href="https://twitter.com/spolsky/status/175364445302820864" data-datetime="2012-03-01T23:38:36+00:00"&gt;March 1, 2012&lt;/a&gt;&lt;/blockquote&gt;
&lt;script src="http://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;&lt;p&gt;
&amp;#8230;and my brain started pattern matching. Replace &amp;#8220;NYC teacher&amp;#8221; with &amp;#8220;programmer&amp;#8221; in this tweet, and you&amp;#8217;d be in classic Joel on Software land. After all, one of Joel&amp;#8217;s self-stated missions is to make programmers&amp;#8217; lives better (you can see his efforts played out in both the principles of Fog Creek and Stack Overflow), and he&amp;#8217;s spent plenty of time trying to convince us of &lt;a href="http://www.joelonsoftware.com/news/20020715.html"&gt;the stupidity of using automated metrics to assess programmers&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
Before we go any further, here&amp;#8217;s the gist of the post about NY&amp;#8217;s teacher effectiveness ratings that were recently released to the public: they have major flaws. &lt;a href="http://garyrubinstein.teachforus.org/2012/02/28/analyzing-released-nyc-value-added-data-part-2"&gt;Read the post&lt;/a&gt; — but this chart says a lot:
&lt;/p&gt;

&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/eKam092dc/effectiveness.png"/&gt;&lt;br/&gt;&lt;em&gt;Every point is a teacher that taught the &lt;strong&gt;same subject&lt;/strong&gt; to two different grades in the same year. Think of a middle school teacher handling both 6th and 7th grade math. The x-axis is their effectiveness rating for one of the grades, the y-axis is the other grade.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You don&amp;#8217;t have to stare at the graph long to see a surprising lack of correlation. If you&amp;#8217;re effective at teaching 7th grade math, shouldn&amp;#8217;t you be effective at 6th? Wait. Before you throw effectiveness ratings out the window, &lt;a href="http://garyrubinstein.teachforus.org/2012/02/28/analyzing-released-nyc-value-added-data-part-2/#comment-555465"&gt;read the comment further down the page&lt;/a&gt; that points out the increasing usefulness of the published data as you look across multiple years of teachers&amp;#8217; past. Ok, that makes sense. But still, judging teachers on test score summaries alone is madness. Perhaps they&amp;#8217;re useful feedback when given to teachers appropriately, with caveats, and all? Maybe the ratings need some tweaking?
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;None of this matters if the data is published to the public and uses a single, automated metric to reward or punish teachers.&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
There&amp;#8217;s a good reason &lt;a href="http://www.nytimes.com/2012/02/23/opinion/for-teachers-shame-is-no-solution.html"&gt;Bill Gates tore apart the decision to publish this data&lt;/a&gt;. He knows that a single metric is bound to be not only flawed, but, if used as an incentive system, also destructive to both teachers &lt;em&gt;and&lt;/em&gt; any attempts to improve the metric. His nuanced argument for a system that combines data and highly trained teachers evaluating their peers sounds pretty similar to the belief that highly technical programmers should be the only ones managing other programmers:
&lt;/p&gt;

&lt;blockquote&gt;
But student test scores alone aren’t a sensitive enough measure to gauge effective teaching, nor are they diagnostic enough to identify areas of improvement. Teaching is multifaceted, complex work. A reliable evaluation system must incorporate other measures of effectiveness, like students’ feedback about their teachers and classroom observations by highly trained peer evaluators and principals.&lt;br/&gt;&lt;br/&gt;
— &lt;a href="http://www.nytimes.com/2012/02/23/opinion/for-teachers-shame-is-no-solution.html"&gt;For Teachers, Shame is Not the Solution&lt;/a&gt;
&lt;/blockquote&gt;

&lt;p&gt;
Again, replace &amp;#8220;teachers&amp;#8221; with &amp;#8220;software developers&amp;#8221; up there and you&amp;#8217;ll see Bill Gates is making the same crusade he made for developers — protection from the type of overly simplified management incentives that destroy your ability to focus on the tasks at hand when working in a complex, creative profession.
&lt;/p&gt;

&lt;p&gt;
I was lucky enough to step into professional programming at a time when an exploding number of forward-thinking companies were starting to treat and recruit programmers effectively. I was never promoted or demoted based on the number of bugs I created or lines of code I wrote. But it&amp;#8217;s clear that wasn&amp;#8217;t always the way things worked, and when I was in college I remember &lt;a href="http://joelonsoftware.com/articles/fog0000000070.html"&gt;reading Joel&lt;/a&gt; and &lt;a href="http://www.paulgraham.com/icad.html"&gt;Paul Graham&lt;/a&gt;, who both stood out as Defenders of The Programmer against destructive management.
&lt;/p&gt;

&lt;p&gt;
This is why &lt;strong&gt;we&amp;#8217;d never, ever use Khan Academy data to single-handedly &amp;#8220;rank&amp;#8221; teachers or anything else so ridiculous&lt;/strong&gt;. Khan Academy data (and there&amp;#8217;s a lot of it, we just passed 400 million practice problems done) is to be put in the hands of teachers, &lt;em&gt;for&lt;/em&gt; teachers, as a powerful tool that lets them dive deep into their students&amp;#8217; individual levels of mastery. We aim to empower teachers with the best tools available and believe that the only people assessing them should be highly trained teachers who understand the nuances of their craft and work with them to improve. Sound familiar to you, devs?
&lt;/p&gt;

&lt;p&gt;
I&amp;#8217;ve never been a teacher, but I do know that I&amp;#8217;ll never even consider working for a company that assesses my performance based on a single automated metric. I think I have Microsoft and Google and Joel and Paul Graham and co. to thank for the software world&amp;#8217;s culture of respect for both data and individuals. And now it&amp;#8217;s really cool to see Bill Gates and Joel taking a similar stand in defense of teachers.
&lt;/p&gt;

&lt;p&gt;
Ten bucks says none of the teachers in &lt;a href="http://www.joelonsoftware.com/items/2012/01/13.html"&gt;The Academy for Software Engineering&lt;/a&gt; suffer from a single metric incentive system.
&lt;/p&gt;</description><link>http://bjk5.com/post/18609999923</link><guid>http://bjk5.com/post/18609999923</guid><pubDate>Fri, 02 Mar 2012 08:49:52 -0800</pubDate></item><item><title>Required code reviews</title><description>&lt;p&gt;This is the story of the &lt;a href="http://www.khanacademy.org/about/the-team"&gt;growing Khan Academy team&lt;/a&gt; converting me into a passionate fan of requiring a code review for every single changeset.&lt;/p&gt;

&lt;p&gt;Those who have worked with me know that it&amp;#8217;s a surprising position for me to take. On the spectrum of &amp;#8220;Follows good development practices even if it slows down the product&amp;#8221; to &amp;#8220;Just ship the thing, code doesn&amp;#8217;t matter, only users matter,&amp;#8221; I tend to fall&amp;#8230;right about&amp;#8230;[furiously scribbling]&amp;#8230;here:&lt;/p&gt;

&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/Eijm03fn7/devs2.png"/&gt;&lt;/p&gt;

&lt;p&gt;Even though I&amp;#8217;ve long been a fan of code reviews &lt;a href="http://bjk5.com/post/1468464500/why-are-code-reviews-socially-difficult"&gt;at both Fog Creek and Khan&lt;/a&gt;, I never would&amp;#8217;ve suggested &lt;em&gt;requiring&lt;/em&gt; them for every single changeset, no matter how small. At first glance it appears all &lt;strong&gt;P̝̂R̫͙̼̽ͪ̽̋Ö̝̹̿ͬ́̐̆̈CÈ̝̱S̮̜͙̩̠S̹͍̳̖͍̆̐Y̩̟̥̟̘̺̠ͭͫ̔&lt;/strong&gt;, this is web development, not rocket science, and Hey what if there&amp;#8217;s an emergency and Wait are you serious, you want me to review my single-line change to a trivial &lt;code&gt;#comment&lt;/code&gt;???&lt;/p&gt;

&lt;p&gt;Luckily for everyone, we&amp;#8217;ve been hiring smarter and smarter people at Khan who can save me from myself. (What&amp;#8217;s that theory about smart people and some lake? Lake Okeechobee, I think. With the crocodiles.) We told our team that we&amp;#8217;re requiring code reviews for all pushes a couple weeks ago. Spoiler alert: it&amp;#8217;s not that processy, and even a Just Ship It clown like me is already seeing immense value from the experiment.&lt;/p&gt;

&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/W9wm03e2u/croc.jpg"/&gt;&lt;br/&gt;&lt;em&gt;Croc! No, sorry, wait&amp;#8230;log!&amp;#8230;Or, no! Wait! Sorry&amp;#8230;Croc!&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;What&amp;#8217;s been so great about requiring reviews?&lt;/h1&gt;&lt;br/&gt;&lt;ol&gt;&lt;li&gt;For a team that &lt;a href="http://bjk5.com/post/3994859683/code-reviews-as-relationship-builders-a-few-tips"&gt;values code reviews so highly&lt;/a&gt;, we were missing a lot of them. Turns out there are quite a few excuses you&amp;#8217;ll tell yourself to explain why this changeset doesn&amp;#8217;t need a review. By explicitly setting the expectation, everything&amp;#8217;s much simpler. Just get it reviewed.&lt;br/&gt;&lt;br/&gt;&lt;/li&gt;

&lt;li&gt;Frequent, digestible reviews. By committing frequently and reviewing &lt;em&gt;everything&lt;/em&gt;, we don&amp;#8217;t let features build up to huge, threatening diffs that make your nose bleed like &lt;a href="http://www.rottentomatoes.com/m/chronicle/"&gt;the emo kids from Chronicle&lt;/a&gt;. Any change that makes reviews more enjoyable will amplify &lt;a href="https://sites.google.com/a/khanacademy.org/forge/for-developers/new-developers/getting-familiar-with-the-code/code-review-policy"&gt;all of the other well-understood benefits of code review that we&amp;#8217;ve listed in our public Khan onboarding docs&lt;/a&gt; so I don&amp;#8217;t have to make this sentence any longer by talking about them. Small reviews are just more fun.&lt;br/&gt;&lt;br/&gt;&lt;/li&gt;

&lt;li&gt;Those quick one-line reviews aren&amp;#8217;t actually a problem. They take 30 seconds to review, see #1. If you have a legitimate emergency, push it and get it reviewed later, ain&amp;#8217;t no thang. If I believed for a second that this decision would hurt our ability to Get Things Done, I&amp;#8217;d be fighting it tooth and nail.&lt;br/&gt;&lt;br/&gt;&lt;/li&gt;

&lt;li&gt;In two weeks of doing this, I feel I&amp;#8217;ve improved as a developer more than any other period in recent memory. All props to &lt;a href="http://generic.cx/"&gt;my&lt;/a&gt; &lt;a href="https://plus.google.com/110287455381476170305/posts"&gt;reviewers&lt;/a&gt;, of course, and it probably doesn&amp;#8217;t hurt that I&amp;#8217;m actually writing code for the first time in a while. But&amp;#8230;still.&lt;/li&gt;

&lt;/ol&gt;&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/e2xm03dus/reviews.png"/&gt;&lt;br/&gt;&lt;em&gt;All changesets reviewed.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s not for every group. I&amp;#8217;m not convinced it would&amp;#8217;ve been right when Jason and I were hacking together alone. But requiring code reviews has already made for a better product and a healthier team, two things that I personally care about far more than a healthy codebase. That&amp;#8217;s just a nice side-effect.&lt;/p&gt;

&lt;hr&gt;&lt;br/&gt;&lt;p&gt;P.S. When working on &lt;a href="http://kilnhg.com"&gt;Kiln&lt;/a&gt;, I was adamantly opposed to building code review requirements directly into the source control product. I stand by that belief, and I&amp;#8217;m almost certain the Kiln team still agrees. Reviews should be required by your team&amp;#8217;s dynamics and strongly encouraged by your tooling, not the other way around.&lt;/p&gt;</description><link>http://bjk5.com/post/18441794352</link><guid>http://bjk5.com/post/18441794352</guid><pubDate>Tue, 28 Feb 2012 09:07:35 -0800</pubDate></item></channel></rss>
