<?xml version="1.0" encoding="UTF-8" standalone="no"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><description></description><title>Ben Kamens - building things, mostly software</title><generator>Tumblr (3.0; @bjk5)</generator><link>https://bjk5.com/</link><item><title>Spring&amp;rsquo;s 3rd Act</title><description>&lt;p&gt;I am proud to share that Spring’s AI R&amp;amp;D platform was acquired by a major biotech leader in the Bay Area, where it is giving AI superpowers to many brilliant scientists. &lt;a href="https://x.com/kamens/status/1896629274205143500"&gt;Read on&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;This blog is archived. Find me at &lt;a href="https://benkamens.com/"&gt;benkamens.com&lt;/a&gt;&lt;/p&gt;</description><link>https://bjk5.com/post/782932600176181248</link><guid>https://bjk5.com/post/782932600176181248</guid><pubDate>Wed, 07 May 2025 17:05:12 -0700</pubDate></item><item><title>Announcing Spring Discovery</title><description>&lt;p&gt;I&amp;rsquo;m proud to announce our team, funding, and ambitious mission at &lt;a href="https://www.springdisc.com"&gt;Spring Discovery&lt;/a&gt;. We&amp;rsquo;re fighting back against the diseases of old age by accelerating the discovery of anti-aging therapies.&lt;/p&gt;

&lt;p class="center"&gt;&lt;img class="shadowless" style="width:40%" src="https://64.media.tumblr.com/753f23e384f01548280e0ed05dd9cd48/tumblr_inline_p51swpBXcP1qde7uz_540.png" data-orig-height="500" data-orig-width="1000"/&gt;&lt;/p&gt;

&lt;blockquote&gt;Why do therapies focused on aging present such a profound opportunity? Because aging is the single greatest risk factor for the most detrimental diseases on Earth — cardiovascular disease, neurodegenerative disease, pulmonary disease, cancer, muscle wasting, and more — and drugs that slow the biological damage accumulated while aging have the potential to reduce the incidences of these diseases, possibly simultaneously.&lt;/blockquote&gt;

&lt;p&gt;— &lt;a href="https://medium.com/spring-discovery/accelerating-the-discovery-of-therapies-for-aging-and-its-related-diseases-7c6a2109189f"&gt;More about our approach&lt;/a&gt; and &lt;a href="http://wsj.com/articles/spring-discovery-brings-machine-learning-to-longevity-sector-1519648200"&gt;our launch announcement&lt;/a&gt;.&lt;/p&gt;</description><link>https://bjk5.com/post/171506227001</link><guid>https://bjk5.com/post/171506227001</guid><pubDate>Sat, 03 Mar 2018 20:12:11 -0800</pubDate></item><item><title>Thankful and lucky to have helped build Khan Academy</title><description>&lt;p&gt;In early 2010 I saw &lt;a href="https://en.wikipedia.org/wiki/Sal_Khan"&gt;Sal Khan&lt;/a&gt; doing something inspiring. He had been diligently posting educational video after educational video on YouTube for &lt;em&gt;years&lt;/em&gt; (&amp;ldquo;secret to overnight success&amp;hellip;&amp;rdquo;) and was starting to get a real response from thousands of learners around the world.

&lt;/p&gt;&lt;p&gt;I looked at &lt;a href="http://static.tumblr.com/9hgswys/Lrzoaa5el/ka-2010.png"&gt;the website at the time&lt;/a&gt;, thought I might be able to help, and sent him an email asking if I could.&lt;/p&gt;

&lt;p&gt;I now consider myself &lt;strong&gt;unreasonably&lt;/strong&gt; lucky to have spent the last 6 years riding the consequences of that email.&lt;/p&gt;

&lt;p&gt;I volunteered until Sal turned Khan Academy into a real, more-than-one-person company, at which point I joined as our first engineer. I felt deep pride in using the engineering and management lessons I&amp;rsquo;d learned from &lt;a href="http://joelonsoftware.com/"&gt;Joel&lt;/a&gt; and &lt;a href="http://fogcreek.com/"&gt;Fog Creek&lt;/a&gt; to build a team pointed at KA&amp;rsquo;s epic mission: &lt;em&gt;&amp;ldquo;A free, world-class education for anyone, anywhere.&amp;rdquo;&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;Now we&amp;rsquo;re a company of ~120 people. And that group has been steadily adding momentum to the pursuit of our mission, increasing Khan Academy&amp;rsquo;s impact a little here and a lot there&amp;hellip;making me thankful while I just try to hold on:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;We serve over 10M active learners monthly (37M+ registered students, 1.5M+ registered educators).&lt;/li&gt;

&lt;li&gt;We&amp;rsquo;ve made thousands and thousands of educational videos, articles, and interactive exercises available for free to all learners (forever). Either by creating &amp;lsquo;em ourselves or &lt;a href="http://www.geek.com/geek-cetera/khan-academy-teams-up-with-pixar-to-teach-how-math-makes-movies-1632405/"&gt;partnering with exciting folks like Pixar&lt;/a&gt; and &lt;a href="https://www.khanacademy.org/humanities/world-history/crashcourse-worldhistory"&gt;Crash Course&lt;/a&gt;.&lt;/li&gt;

&lt;li&gt;All the content&amp;rsquo;s available in &lt;a href="https://es.khanacademy.org/"&gt;many&lt;/a&gt; &lt;a href="https://pt.khanacademy.org/"&gt;different&lt;/a&gt; &lt;a href="https://tr.khanacademy.org/"&gt;languages&lt;/a&gt; across &lt;a href="https://play.google.com/store/apps/details?id=org.khanacademy.android&amp;amp;hl=en"&gt;many&lt;/a&gt; &lt;a href="https://itunes.apple.com/us/app/khan-academy-you-can-learn/id469863705?mt=8"&gt;devices&lt;/a&gt;. And we&amp;rsquo;re aiming at &lt;a href="http://yourstory.com/2016/05/khan-academy/"&gt;larger and larger learner populations&lt;/a&gt; next.&lt;/li&gt;

&lt;li&gt;We partnered with College Board to provide free, official SAT test prep, and &lt;a href="https://www.collegeboard.org/releases/2016/One-Year-Since-Launch-SAT-Khan-Academy-Leveling-Playing-Field"&gt;within one year there&amp;rsquo;s been a 19% drop in the number of students who paid for SAT prep&lt;/a&gt;.&lt;/li&gt;

&lt;li&gt;&lt;a href="http://www.forbes.com/sites/schoolboard/2016/05/10/if-you-want-to-improve-education-you-need-to-unscale-it/#7fbd1f68351e"&gt;64% of &lt;em&gt;first-generation&lt;/em&gt; students at top universities said that Khan Academy played a meaningful role in their education&lt;/a&gt; (survey by an independent group).&lt;/li&gt;

&lt;/ul&gt;&lt;p&gt;(And while far more wishy-washy, my personal favorite signal of Khan Academy&amp;rsquo;s impact is the fact that every single day we receive &lt;a href="https://www.khanacademy.org/stories"&gt;stories like these about how access to a free education changed users&amp;rsquo; lives&lt;/a&gt;. They are many. And meaningful. It&amp;rsquo;s actually hard not to become numb to them internally, which is a phenomenon we fight against.)

&lt;/p&gt;&lt;p&gt;I never would&amp;rsquo;ve guessed half the above in 2010. &lt;strong&gt;This team&lt;/strong&gt; has taught me many lessons, none more important than the fact that when a small group of people are willing to square up together against an epic problem, they can make a huge difference.&lt;/p&gt;

&lt;p&gt;I bold mentions of &lt;strong&gt;this team&lt;/strong&gt; because it&amp;rsquo;s taken a special group to accomplish the above. I&amp;rsquo;m not responsible for most of it, and KA&amp;rsquo;s highest impact is yet to come. But rest assured I&amp;rsquo;ll be the dude bragging that &amp;ldquo;at least I didn&amp;rsquo;t screw it all up in the early days&amp;rdquo; until I croak — the opportunity to play a small part alongside &lt;strong&gt;this team&lt;/strong&gt; is a lifelong gift.&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;m off to a new mission, a personal connection of mine. By the numbers, it&amp;rsquo;s unlikely I&amp;rsquo;ll ever even approach the same level of world impact I got to have here.&lt;/p&gt;

&lt;p&gt;But I&amp;rsquo;m gonna take a crack at a problem that&amp;rsquo;s important to me, and I&amp;rsquo;ll be wielding lessons learned from building Khan Academy — most importantly the fact that small groups &lt;em&gt;can&lt;/em&gt; square up, together, and make big dents in epic problems.&lt;/p&gt;</description><link>https://bjk5.com/post/147398152966</link><guid>https://bjk5.com/post/147398152966</guid><pubDate>Thu, 14 Jul 2016 08:41:38 -0700</pubDate></item><item><title>Khan Academy’s Engineering Principles</title><description>&lt;blockquote&gt;You know those super-frustrating movie scenes where the entire plotline is driven by some sort of completely avoidable communication failure?
&lt;br/&gt;&lt;br/&gt;
Where if the two characters WOULD JUST FRIGGIN&amp;rsquo; TALK TO EACH OTHER, the whole shebang could&amp;rsquo;ve been avoided? And you, you poor shmuck in the audience, just have to sit there and watch the author jump through all sorts of hoops to justify why these two otherwise-humanesque characters seem to be woefully incapable of talking like humans?
&lt;br/&gt;&lt;br/&gt;
The &amp;ldquo;&lt;a href="http://tvtropes.org/pmwiki/pmwiki.php/Main/PoorCommunicationKills"&gt;communication failure&lt;/a&gt;&amp;rdquo; trope seems super contrived when I&amp;rsquo;m watching a movie. But when playing my role as part of a growing company, I&amp;rsquo;m part of an intricate system that&amp;rsquo;s constantly creating communication failures just as epic and just as avoidable.
&lt;/blockquote&gt;

&lt;p&gt;Somewhere along the way to becoming a 40+ person engineering org, writing down our principles felt like the healthy thing to do to help innoculate against communication failure.&lt;/p&gt;

&lt;p&gt;The effort&amp;rsquo;s paid off for us many times over. &lt;a href="http://engineering.khanacademy.org/posts/engineering-principles.htm"&gt;We&amp;rsquo;re sharing our principles and more on our engineering blog&lt;/a&gt; with the hope of helping someone else.&lt;/p&gt;</description><link>https://bjk5.com/post/145520537826</link><guid>https://bjk5.com/post/145520537826</guid><pubDate>Mon, 06 Jun 2016 12:49:28 -0700</pubDate></item><item><title>Margaret Hamilton and the First Men on the Moon</title><description>&lt;p&gt;&lt;a href="http://www.firstmenonthemoon.com/"&gt;First Men on the Moon&lt;/a&gt; is one of my favorite little educational resources. It&amp;rsquo;s the closest I&amp;rsquo;ve ever felt to being part of the Apollo 11 moon landing. They took the actual video filmed outside the window of the lunar module, the audio recorded between astronauts and mission control, and a bunch of data about the landing itself — including Armstrong&amp;rsquo;s heartrate over time — and synced it all together into a sweet interactive experience.&lt;/p&gt;

&lt;p&gt;Looks something like this, &amp;lsquo;cept on the site you hear everything and can scrub back'n'forth from descent to &amp;ldquo;The Eagle has Landed!&amp;rdquo;&lt;/p&gt;

&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/Pdxnglk48/apollo.gif"/&gt;&lt;/p&gt;

&lt;p&gt;Playing w/ this site is how I learned about a software glitch that almost botched the whole thing. Neil Armstrong is a couple minutes from touching down when he says &amp;ldquo;program alarm&amp;rdquo; so calmly you could almost miss it amid the chatter. Goes something like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;pre&gt;Armstrong: "Program alarm."

[4 seconds, unrelated chatter]

Armstrong: "It's a 1202."

Aldrin: "1202."

[16 seconds of silence]

Armstrong (now with urgency in his voice): "Give us a reading on the 1202 program alarm."

Mission control: "Roger. We got...we're go on that alarm."
&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;And on the Mission Control loop in Houston — the one the astronauts can&amp;rsquo;t hear — they say:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;Steve Bales: "If it doesn't reoccur, we'll be go."&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="http://www.firstmenonthemoon.com/"&gt;Go listen to it&lt;/a&gt;! For those of you who haven&amp;rsquo;t spent your lives in software, let me translate from Super Professional NASA Speak™ into ordinary developer chat for you:&lt;/p&gt;

&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/u96nglhob/screen_shot_2014-12-14_at_3.07.29_pm.png"/&gt;&lt;/p&gt;

&lt;p&gt;This is obviously a silly caricature. NASA are professionals. But I read about this event after listening to the audio. Turns out there&amp;rsquo;s a bit of truth here — when that 1202 error first showed up, there was a lot of confusion. Only &lt;a href="http://en.wikipedia.org/wiki/Jack_Garman#1202"&gt;one person&lt;/a&gt;, thanks to a previous simulator failure, happened to have a hand-scribbled list of various possible program alarms and was able to suggest that it was safe to keep going. The alarm would pop up three more times before landing.&lt;/p&gt;

&lt;p&gt;It&amp;rsquo;s always been one of my favorite moon-landing stories — almost aborting right at the very end.&lt;/p&gt;

&lt;p&gt;So I was really happy to learn about the programmer behind this success: &lt;a href="http://en.wikipedia.org/wiki/Margaret_Hamilton_(scientist)"&gt;Margaret Hamilton&lt;/a&gt;. I&amp;rsquo;d never heard her name until &lt;a href="http://www.reddit.com/r/todayilearned/comments/2oskna/til_that_preventing_an_abort_of_the_apollo_11/"&gt;a recent reddit thread&lt;/a&gt; and &lt;a href="https://news.ycombinator.com/item?id=8735912"&gt;a followup on hacker news&lt;/a&gt;.&lt;/p&gt;

&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/tjxnglj7h/mhh-apollo_ii.jpg"/&gt;&lt;/p&gt;

&lt;p&gt;Turns out she&amp;rsquo;s not only responsible for this alarm not ruining the mission but &lt;strong&gt;she actually coined the term 'software engineering&amp;rsquo;&lt;/strong&gt;. &lt;a href="https://news.ycombinator.com/item?id=8737533"&gt;Apparently she spent a lot of time arguing for software safety checks&lt;/a&gt; that prevented astronauts from accidentally doing the wrong thing, despite being regularly assured that this code wouldn&amp;rsquo;t be worth its weight because professional astronauts don&amp;rsquo;t accidentally do the wrong thing.&lt;/p&gt;

&lt;p&gt;In Apollo 11&amp;rsquo;s case, a switch in the lunar landing module was set in the wrong position, causing its computer to process data from two radars instead of just the one pointed at the moon. This was too much to process, so Hamilton&amp;rsquo;s system began (impressively) dropping its low priority tasks in order to have enough CPU to properly handle the critical lunar surface radar input. Wasn&amp;rsquo;t a software glitch at all — quite the opposite. A graceful handling of a critical situation.&lt;/p&gt;

&lt;p&gt;Rest is history. &lt;a href="http://firstmenonthemoon.com"&gt;Enjoy it for yourself&lt;/a&gt;, and be sure to thank Margaret when Neil gets to ignore those scary-sounding alarms.&lt;/p&gt;</description><link>https://bjk5.com/post/105219626426</link><guid>https://bjk5.com/post/105219626426</guid><pubDate>Sun, 14 Dec 2014 16:08:00 -0800</pubDate></item><item><title>A book hiding in a gist</title><description>&lt;p&gt;A while back — after leaving Heroku — Adam Wiggins left this little note on twitter:&lt;/p&gt;

&lt;blockquote class="twitter-tweet" lang="en"&gt;&lt;p&gt;My Heroku values: &lt;a href="https://t.co/IqFDFF4gUj"&gt;https://t.co/IqFDFF4gUj&lt;/a&gt;&lt;/p&gt;— Adam Wiggins (@hirodusk) &lt;a href="https://twitter.com/hirodusk/status/340608200653033472"&gt;May 31, 2013&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src="//platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;

&lt;p&gt;I normally don&amp;rsquo;t just &amp;ldquo;reblog&amp;rdquo; someone&amp;rsquo;s work, but &lt;a href="https://gist.github.com/adamwiggins/5687294"&gt;this humble little gist&lt;/a&gt; just packs so much wisdom so tight. Anyone building a product team will love the quick read.&lt;/p&gt;

&lt;p&gt;Me? I find myself re-skimming these gems every few months. &amp;ldquo;&lt;a href="https://gist.github.com/adamwiggins/5687294#make-it-real"&gt;Make it real&lt;/a&gt;.&amp;rdquo; &amp;ldquo;&lt;a href="https://gist.github.com/adamwiggins/5687294#ship-it"&gt;Ship it&lt;/a&gt;.&amp;rdquo; &amp;ldquo;&lt;a href="https://gist.github.com/adamwiggins/5687294#do-it-with-style"&gt;Do it with style&lt;/a&gt;. &amp;rdquo;&lt;a href="https://gist.github.com/adamwiggins/5687294#own-up-to-failure"&gt;Own up to failure&lt;/a&gt;.&amp;ldquo; &amp;rdquo;&lt;a href="https://gist.github.com/adamwiggins/5687294#write-well"&gt;Write well&lt;/a&gt;.&amp;ldquo; I like keeping these in mind while we build our team at Khan Academy.&lt;/p&gt;

&lt;p&gt;Each little bit in that gist could easily be its own blog post. Altogether there&amp;rsquo;s a great book hiding.&lt;/p&gt;</description><link>https://bjk5.com/post/104568822661</link><guid>https://bjk5.com/post/104568822661</guid><pubDate>Sun, 07 Dec 2014 02:12:00 -0800</pubDate></item><item><title>KA Lite</title><description>&lt;p&gt;Choosing what to work on is one of the hardest things we do at Khan Academy. Saying no&amp;rsquo;s hard for everyone, but it sure does feel tough when the person you&amp;rsquo;re saying no to is some earnest child trying to learn.&lt;/p&gt;

&lt;p&gt;Two of the hardest no&amp;rsquo;s we&amp;rsquo;ve ever said were aimed at students who couldn&amp;rsquo;t speak English and students who don&amp;rsquo;t have access to the internet.&lt;/p&gt;

&lt;p&gt;For a long time we said no to internationalization. i18n is &lt;em&gt;hard&lt;/em&gt;. Especially when you have more content than all the Harry Potter books combined, much of it in video form. We were a small team. With a core product to figure out and without the time to make it work in other languages. We&amp;rsquo;d hear cries from all over: &amp;ldquo;my daughter needs help but doesn&amp;rsquo;t speak English,&amp;rdquo; &amp;ldquo;my students are dying to use KA but can&amp;rsquo;t navigate the site,&amp;rdquo; &amp;ldquo;we&amp;rsquo;ll translate everything &lt;em&gt;for&lt;/em&gt; you, just please tell us how!&amp;rdquo; We always knew we&amp;rsquo;d bite the bullet one day, but for a long time we just had to say no, no, no.&lt;/p&gt;

&lt;p&gt;At some point the chips fell into place. And now the whole shebang&amp;rsquo;s available in &lt;a href="https://es.khanacademy.org/"&gt;Spanish&lt;/a&gt;, &lt;a href="https://fr.khanacademy.org/"&gt;French&lt;/a&gt;, &lt;a href="https://tr.khanacademy.org/"&gt;Turkish&lt;/a&gt;, &lt;a href="https://pt.khanacademy.org/"&gt;Portuguese&lt;/a&gt;, and &lt;a href="http://international.khanacademy.org/"&gt;soon many others&lt;/a&gt;. Looking at those pages makes me proud. The thought of not-just-English-speakers getting access to free educational content reminds me why we&amp;rsquo;re doing what we&amp;rsquo;re doing.&lt;/p&gt;

&lt;p class="center"&gt;&lt;img class="small" src="http://static.tumblr.com/9hgswys/XMCnem1p2/10401543_285389658298877_30119221_n.jpg"/&gt;&lt;br/&gt;&lt;em&gt;&amp;ldquo;No.&amp;rdquo;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Unfortunately, those without internet are in a different ship altogether. Despite the fact that any student w/out internet is probably also a student most in need of free educational resources, we simply can&amp;rsquo;t yet focus on &lt;em&gt;that&lt;/em&gt; Ridiculously Hard Problem.&lt;/p&gt;

&lt;p&gt;Enter &lt;a href="http://jamiealexandre.com/about/"&gt;Jamie Alexandre&lt;/a&gt;, a Summer 2012 intern at Khan Academy. During &lt;a href="http://bjk5.com/post/26810034751/how-we-ran-the-first-khan-academy-healthy-hackathon"&gt;our first ever hackathon&lt;/a&gt; Jamie hacked a Raspberry Pi to run a modified version of KA entirely on cheap components without needing any access to the internet. Fast forward a few months, and next thing we know he tells us he&amp;rsquo;s started his own non-profit, &lt;a href="https://learningequality.org/ka-lite/"&gt;the Foundation for Learning Equality&lt;/a&gt;, dedicated to bringing their own custom version of KA&amp;rsquo;s platform (&amp;ldquo;KA Lite&amp;rdquo;) and other online educational resources to everybody — especially those offline.&lt;/p&gt;

&lt;p&gt;I love this story for about a million and twenty reasons. Selfishly it&amp;rsquo;s just so cool to see an incredible and entirely separate organization spring out of our internship. Non-selfishly, &lt;a href="https://www.youtube.com/watch?v=nFlmmV90u8w&amp;amp;hd=1"&gt;KA Lite has now been installed in over 120 countries&lt;/a&gt;, giving access to students, teachers, and even inmates who don&amp;rsquo;t get internet and all that comes with it.&lt;/p&gt;

&lt;p class="center"&gt;&lt;iframe width="560" height="315" src="//www.youtube.com/embed/nFlmmV90u8w" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;/p&gt;

&lt;p&gt;Internally we still think the best way Khan Academy itself can improve access for those without internet is to build the best educational product and content we can — doing so will motivate others to help us reach everyone one day. But it sure is a lot easier to say no to kids without internet when Jamie and his crew are tackling the problem in their own way.&lt;/p&gt;

&lt;p&gt;Thanks for all you do, KA Lite. Please come back and visit for our next healthy hackathon!&lt;/p&gt;

&lt;p class="center"&gt;&lt;img class="small" src="http://static.tumblr.com/9hgswys/HAxnem1se/10611061_1539358616283943_881697414_n.jpg"/&gt;&lt;/p&gt;</description><link>https://bjk5.com/post/101915851596</link><guid>https://bjk5.com/post/101915851596</guid><pubDate>Thu, 06 Nov 2014 01:17:00 -0800</pubDate></item><item><title>Going over the top</title><description>&lt;p&gt;When &lt;a href="http://blog.andymatuschak.org/post/90426060477/chasing-the-illustrated-primer"&gt;Andy recently decided to join Khan Academy&lt;/a&gt;, he emailed us &lt;a href="https://github.com/andymatuschak/Khan-Academy-Offer-Acceptance-Toy"&gt;a secretive app&lt;/a&gt; and said to run it on an iPad. When we did we found a fun little toy — if the device was angled in just the right way and the little knobs were in just the right position, the words &amp;ldquo;I accept&amp;rdquo; playfully emblazoned themselves on the screen. It was such a cool way to join the team.&lt;/p&gt;

&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/r1An95ok8/accept.gif"/&gt;&lt;/p&gt;

&lt;p&gt;Point is, he could&amp;rsquo;ve just emailed us his signed offer letter and the team would&amp;rsquo;ve been thrilled. Honestly he could&amp;rsquo;ve used however many hours he spent on that app to get &amp;ldquo;real work&amp;rdquo; done or find a great pizza spot. Nobody would&amp;rsquo;ve thought twice.&lt;/p&gt;

&lt;p&gt;When we recently ran the third Khan Academy Healthy Hackathon,  I announced it with a ridiculous Doctor Seuss poem (copied below in case you haven&amp;rsquo;t rolled your eyes today). I also took the time to make &lt;a href="http://healthyhackathon.khanacademy.org/"&gt;a whole little single-page site&lt;/a&gt; dedicated to introducing the hackathon.&lt;/p&gt;

&lt;p class="center"&gt;&lt;a href="http://healthyhackathon.khanacademy.org"&gt;&lt;img src="http://static.tumblr.com/9hgswys/CfDn95nmv/screen_shot_2014-07-23_at_1.01.23_am.png"/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Point is, all of that was completely unnecessary. Our hackathon was internal only and a quick email to team@khanacademy.org would&amp;rsquo;ve saved hours. There were at least twenty-seven better ways I could&amp;rsquo;ve been spending my time.&lt;/p&gt;

&lt;p&gt;But if every single person made every single decision based only on what&amp;rsquo;s most valuable at that exact moment, we&amp;rsquo;d always be fighting fires.&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;ve come to appreciate how important it is for an organization to make it safe for folks to go over the top. To express themselves by taking an ordinary task — one that you might think isn&amp;rsquo;t important — and investing so much passion into it that people say, &amp;ldquo;that&amp;rsquo;s &lt;em&gt;nuts&lt;/em&gt;.&amp;rdquo; I wanna work with more of those nuts. And I wanna help build a team that embraces &amp;lsquo;em.&lt;/p&gt;

&lt;br/&gt;&lt;hr style="margin-left:33%;width:33%;"&gt;&lt;br/&gt;

&lt;pre&gt;&lt;em&gt;You have hacks in your head
But never the time
The last thing you need
Is to be reading a rhyme.

But lo and behold, an opportunity rises
To hack hacks and make makes and prize all sorts of prizes.
It's the third time around and a chance for some firsts
Hackathon Healthy Academy Khan — now read that reversed.

Some hacks will work well
They'll change lots of lives
We'll ship 'em bug-free
And exchange five high-fives.

Except when they don't.
Because, sometimes, they won't.

I'm afraid that some hacks
Might not even ship
That's ok! Time for fun!
Hack make build, let 'er rip.&lt;/em&gt;&lt;/pre&gt;</description><link>https://bjk5.com/post/92617394126</link><guid>https://bjk5.com/post/92617394126</guid><pubDate>Wed, 23 Jul 2014 01:27:00 -0700</pubDate></item><item><title>Three minute quiz: App Engine datastore performance</title><description>&lt;p&gt;As somebody now spending all his time in NoSQL land, my brain perked up when working through &lt;a href="http://use-the-index-luke.com/blog/2014-02/results-three-minutes-sql-performance-quiz"&gt;The Three Minute SQL Performance Quiz&lt;/a&gt;. It was a blast from the past for me, a chance to remember all the little ins'n'outs of SQL performance from a quaint old time when I used to be able to write &lt;code&gt;JOIN&lt;/code&gt; statements.&lt;/p&gt;

&lt;p&gt;So I thought it&amp;rsquo;d be fun to develop a similar performance challenge for this new NoSQL life of mine. Since we use App Engine at Khan Academy, we&amp;rsquo;ll focus on the App Engine datastore. Proceed.&lt;/p&gt;

&lt;style&gt;
.quiz-container {
  padding: 30px 0;
}

.quiz-header {
  text-align: center;
}

.quiz-hr {
  margin: 10px 0;
}

.quiz-table {
  width: 100%;
  margin-bottom: 20px;
}

.quiz-table td {
  vertical-align: top;
  width: 50%;
}

.quiz-table tr.context {
  font-weight: bold;
}

.quiz-table tr.additional-context td {
  padding-top: 10px;
}

.quiz-controls {
  text-align: center;
}

.quiz-answer {
  display: none;
}

.Post .PostBody a.btn {
    width: 315px;
	border-radius: 4px;
	-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.08);
	-moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.08);
	  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.08);
	color: #fff;
	display: inline-block;
	font-family: Arial, Helvetica, sans-serif;
	font-size: 14px;
	padding: 8px 16px;
	text-decoration: none;
	text-shadow: 0 1px 1px rgba(0, 0, 0, 0.075);
	
	-webkit-transition: background-color 0.1s linear;
	-moz-transition: background-color 0.1s linear;
	-o-transition: background-color 0.1s linear;
	  transition: background-color 0.1s linear;	
}

	.Post .PostBody a.btn:hover {
		cursor: pointer;
	}

	.btn-blue {
		background-color: rgb( 51, 102, 204 );
		border: 1px solid rgb( 44, 91, 104 );	
	}
	
		.btn-blue:hover {
			background-color: rgb( 58, 131, 213 );	
		}
		
		.btn-blue:active {
			background-color: rgb( 42, 91, 191 );	
		}
		
	.btn-primary {
		background-color: rgb( 74, 61, 117 );
		border: 1px solid rgb( 44, 37, 59 );
	}
	
		.btn-primary:hover {
			background-color: rgb( 92, 76, 131 );	
		}
		
		.btn-primary:active {
			background-color: rgb( 54, 44, 87 );	
		}
	
	.btn-red {
		background-color: rgb( 207, 56, 91 );
		border: 1px solid rgb( 187, 40, 74 );
	}
	
		.btn-red:hover {
			background-color: rgb( 227, 77, 130 );
		}
		
		.btn-red:active {
			background-color: rgb( 187, 40, 74 );
		}
	
	.btn-green {
		background-color: rgb( 43, 153, 91 );
		border: 1px solid rgb( 33, 126, 74 );
	}
	
		.btn-green:hover {
			background-color: rgb( 75, 183, 141 );
		}
		
		.btn-green:active {
			background-color: rgb( 33, 126, 74 );
		}
&lt;/style&gt;

&lt;div class="quiz-container"&gt;
&lt;h1 class="quiz-header"&gt;Question 1&lt;/h1&gt;&lt;hr class="quiz-hr"&gt;
&lt;table class="quiz-table"&gt;
&lt;tr class="context"&gt;&lt;td class="left"&gt;Query&lt;/td&gt;&lt;td&gt;Model&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="left"&gt;
&lt;pre&gt;&lt;code&gt;Monkey.all().filter(
    "genus IN",
    ["Ateles", "Cebus", "Aotus"]
  ).fetch(10)&lt;/code&gt;&lt;/pre&gt;
&lt;/td&gt;&lt;td&gt;
&lt;pre&gt;&lt;code&gt;class Monkey(db.Model):
  genus = db.StringProperty(
    indexed=True)&lt;/code&gt;&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;p class="quiz-controls"&gt;
&lt;a href="#" class="btn btn-primary" data-correct="yuppers"&gt;Hold on there — a major improvement is possible&lt;/a&gt; &lt;em&gt;or&lt;/em&gt;
&lt;a href="#" class="btn btn-green"&gt;All looks good to me — don&amp;rsquo;t go changin&amp;rsquo; a thang&lt;/a&gt;
&lt;/p&gt;

&lt;div class="quiz-answer"&gt;
&lt;p&gt;
&lt;strong class="right-wrong"&gt;You&amp;rsquo;re right!&lt;/strong&gt; Queries that use the &lt;code&gt;IN&lt;/code&gt; operator may &lt;em&gt;look&lt;/em&gt; like a single query, but they actually run multiple queries behind the scenes, one for each item in the list. That means if you ran the above query, opened &lt;a href="https://developers.google.com/appengine/docs/python/tools/appstats"&gt;Appstats&lt;/a&gt;, and looked at this request&amp;rsquo;s profile, you&amp;rsquo;d see this:&lt;/p&gt;

&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/Y91n1wjvt/queries.png"/&gt;&lt;/p&gt;
&lt;p&gt;&amp;hellip;and that&amp;rsquo;s not ideal if you really care about this request&amp;rsquo;s performance. The requests are running asynchronously and overlap as much as possible — which is great — but you&amp;rsquo;re still running three requests and increasing the likelihood that one of &amp;lsquo;em will slow you down.&lt;/p&gt;

&lt;p&gt;If you want this to be blazing fast, you almost certainly want to denormalize this set membership into a property that can be queried without an &lt;code&gt;IN&lt;/code&gt; operator. Perhaps you&amp;rsquo;d add something like &lt;code&gt;is_in_favorite_genus = db.BooleanProperty(indexed=True)&lt;/code&gt; to &lt;code&gt;Monkey&lt;/code&gt;, set that property to True if the genus is one you&amp;rsquo;re interested in, and then change your query to &lt;code&gt;Monkey.all().filter("is_in_favorite_genus =", True)&lt;/code&gt;. That&amp;rsquo;d be a significant improvement — especially if your &lt;code&gt;IN&lt;/code&gt; list contained many items. That&amp;rsquo;s &lt;a href="http://bjk5.com/post/54202245691/the-app-engine-way"&gt;the App Engine way&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;div class="quiz-container"&gt;
&lt;h1 class="quiz-header"&gt;Question 2&lt;/h1&gt;&lt;hr class="quiz-hr"&gt;
&lt;table class="quiz-table"&gt;
&lt;tr class="context"&gt;&lt;td class="left"&gt;Query&lt;/td&gt;&lt;td&gt;Model&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="left"&gt;
&lt;pre&gt;&lt;code&gt;Monkey.all().filter(
    "unique_name =",
    "bob_the_monkey"
  ).get()&lt;/code&gt;&lt;/pre&gt;
&lt;/td&gt;&lt;td&gt;
&lt;pre&gt;&lt;code&gt;class Monkey(db.Model):
  unique_name = db.StringProperty(
    indexed=True)&lt;/code&gt;&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;p class="quiz-controls"&gt;
&lt;a href="#" class="btn btn-primary" data-correct="yuppers"&gt;Hold on there — a major improvement is possible&lt;/a&gt; &lt;em&gt;or&lt;/em&gt;
&lt;a href="#" class="btn btn-green"&gt;All looks good to me — don&amp;rsquo;t go changin&amp;rsquo; a thang&lt;/a&gt;
&lt;/p&gt;

&lt;div class="quiz-answer"&gt;
&lt;p&gt;
&lt;strong class="right-wrong"&gt;You&amp;rsquo;re right!&lt;/strong&gt; If you&amp;rsquo;re loading a single entity using a unique identifier, queries aren&amp;rsquo;t as fast as loading by key or key name. There are multiple ways to load an entity by key that we won&amp;rsquo;t get into here — just know that if you have unique identifiers for your models, you should strongly consider constructing your entities using the unique identifier as part of your model&amp;rsquo;s key name — &lt;code&gt;Monkey(key_name="bob_the_monkey", **kwds)&lt;/code&gt; — so you can quickly retrieve it later: &lt;code&gt;db.get_by_key_name("bob_the_monkey")&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If you&amp;rsquo;re curious why this is faster than a query, it makes sense if you&amp;rsquo;re willing to swallow the gross oversimplification that a query is just quickly looking up the key in an index and then fetching the entity using the key. If you&amp;rsquo;ve already got the key, why query?&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;div class="quiz-container"&gt;
&lt;h1 class="quiz-header"&gt;Question 3&lt;/h1&gt;&lt;hr class="quiz-hr"&gt;
&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/qmsn1yg4o/71833c488b8e11e3bd251258f3959ba0_7.jpg"/&gt;&lt;/p&gt;

&lt;p class="quiz-controls"&gt;
&lt;a href="#" class="btn btn-primary" data-correct="yuppers"&gt;One of the coolest dogs ever&lt;/a&gt; &lt;em&gt;or&lt;/em&gt;
&lt;a href="#" class="btn btn-green"&gt;Meh, she&amp;rsquo;s so-so&lt;/a&gt;
&lt;/p&gt;

&lt;div class="quiz-answer"&gt;
&lt;p&gt;
&lt;strong class="right-wrong"&gt;You&amp;rsquo;re right!&lt;/strong&gt; Shouldn&amp;rsquo;t need explainin&amp;rsquo;.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;



&lt;div class="quiz-container"&gt;
&lt;h1 class="quiz-header"&gt;Question 4&lt;/h1&gt;&lt;hr class="quiz-hr"&gt;
&lt;table class="quiz-table"&gt;
&lt;tr class="context"&gt;&lt;td class="left"&gt;Putting an entity&lt;/td&gt;&lt;td&gt;Model&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="left"&gt;
&lt;pre&gt;&lt;code&gt;m = Monkey(
    name="Bob the Monkey",
    favorite_color="blue",
    favorite_food="pizza",
    worst_enemy="honey_badger"
  )

m.put()&lt;/code&gt;&lt;/pre&gt;
&lt;/td&gt;&lt;td&gt;
&lt;pre&gt;&lt;code&gt;class Monkey(db.Model):
  name = db.StringProperty()
  favorite_color = db.StringProperty()
  favorite_food = db.StringProperty()
  worst_enemy = db.StringProperty()&lt;/code&gt;&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;p class="quiz-controls"&gt;
&lt;a href="#" class="btn btn-primary" data-correct="yuppers"&gt;Hold on there — a major improvement is possible&lt;/a&gt; &lt;em&gt;or&lt;/em&gt;
&lt;a href="#" class="btn btn-green"&gt;All looks good to me — don&amp;rsquo;t go changin&amp;rsquo; a thang&lt;/a&gt;
&lt;/p&gt;

&lt;div class="quiz-answer"&gt;
&lt;p&gt;
&lt;strong class="right-wrong"&gt;You&amp;rsquo;re right!&lt;/strong&gt; Kinda. It depends how you&amp;rsquo;re querying this entity. All of the datastore properties on &lt;code&gt;Monkey&lt;/code&gt; are indexed by default, and that means every time you &lt;code&gt;put()&lt;/code&gt; a &lt;code&gt;Monkey&lt;/code&gt;, you&amp;rsquo;re spending time writing new values to all of those indexes.&lt;/p&gt;

&lt;p&gt;Now, if you need to be able to run queries to find &lt;code&gt;Monkey&lt;/code&gt;s based on their &lt;code&gt;favorite_color&lt;/code&gt;, &lt;code&gt;favorite_food&lt;/code&gt;, &lt;code&gt;worst_enemy&lt;/code&gt;, and so on — then you&amp;rsquo;re doing the right thing. You need the indexes to be able to query them. If your code base is anything like Khan Academy&amp;rsquo;s used to be, however, you may have tons of properties w/ automatic indexes that never, ever need to be queried. We fixed this by using &lt;code&gt;db.StringProperty(indexed=False)&lt;/code&gt; in these cases (and writing a linter that requires us to explicitly specify &lt;code&gt;indexed=True|False&lt;/code&gt; for every datastore property).&lt;/p&gt;

&lt;p&gt;Write speed may not matter for your app, but if it does you can speed up writes by not wasting time writing to indexes you don&amp;rsquo;t need.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;div class="quiz-container"&gt;
&lt;h1 class="quiz-header"&gt;Question 5&lt;/h1&gt;&lt;hr class="quiz-hr"&gt;
&lt;table class="quiz-table"&gt;
&lt;tr class="context"&gt;&lt;td class="left"&gt;Query&lt;/td&gt;&lt;td&gt;Model&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="left"&gt;
&lt;pre&gt;&lt;code&gt;query = Monkey.all()
query.filter("name =", "bob")
query.filter("zoo =", "Manhattan")
query.filter("hats &amp;gt;", 5)
query.get()
&lt;/code&gt;&lt;/pre&gt;
&lt;/td&gt;&lt;td&gt;
&lt;pre&gt;&lt;code&gt;class Monkey(db.Model):
  name = db.StringProperty(indexed=True)
  zoo = db.StringProperty(indexed=True)
  hats = db.IntegerProperty(indexed=True)&lt;/code&gt;&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;p class="quiz-controls"&gt;
&lt;a href="#" class="btn btn-primary" data-correct="yuppers"&gt;Hold on there — a major improvement is possible&lt;/a&gt; &lt;em&gt;or&lt;/em&gt;
&lt;a href="#" class="btn btn-green"&gt;All looks good to me — don&amp;rsquo;t go changin&amp;rsquo; a thang&lt;/a&gt;
&lt;/p&gt;

&lt;div class="quiz-answer"&gt;
&lt;p&gt;
&lt;strong class="right-wrong"&gt;You&amp;rsquo;re right!&lt;/strong&gt; This query will work. And when you first start out and only have a couple hundred &lt;code&gt;Monkey&lt;/code&gt;s, it&amp;rsquo;ll be blazing fast. But as your family of &lt;code&gt;Monkey&lt;/code&gt;s grows, you may find yourself with a Very Serious™ performance issue. Why? You have all of the properties indexed, you&amp;rsquo;re only asking for a single entity&amp;hellip;what&amp;rsquo;s the problem?&lt;/p&gt;

&lt;p&gt;You don&amp;rsquo;t have a perfect index defined. Without an index that perfectly covers all of the properties involved in the query&amp;rsquo;s filters, here&amp;rsquo;s what App Engine has to do when you ask it to fetch a single entity: start querying the datastore for, say, Monkeys with name == &amp;ldquo;Bob&amp;rdquo;, retrieving them from the datastore, and filtering through them to find any with zoo == &amp;ldquo;Manhattan&amp;rdquo; and at least 5 hats. That&amp;rsquo;s not what you want, and it looks like this in Appstats:&lt;/p&gt;

&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/k9bn1yegl/screen_shot_2014-03-05_at_12.05.56_am.png"/&gt;&lt;/p&gt;

&lt;p&gt;That&amp;rsquo;s a disaster. &lt;a href="https://developers.google.com/appengine/articles/indexselection"&gt;Depending on the shape of your data&lt;/a&gt;, &lt;strong&gt;you could spend hundreds of RPCs just returning a single entity&lt;/strong&gt; from the datastore. You want App Engine to query the datastore for &amp;ldquo;Monkeys named Bob in the Manhattan zoo who own at least 5 hats&amp;rdquo; in one swift, single blow — it should only need one RPC. And it&amp;rsquo;ll do exactly this if you have a perfect index. You&amp;rsquo;ll need an entry in &lt;code&gt;index.yaml&lt;/code&gt;, something like:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;- kind: Monkey
  properties:
  - name: name
  - name: zoo
  - name: hats
&lt;/code&gt;
&lt;/pre&gt;

&lt;p&gt;If you aren&amp;rsquo;t careful and don&amp;rsquo;t keep an eye to make sure that your important queries have indices that perfectly cover 'em, you could have a piece of code that runs snappy one day and, months later when your datastore fills up with &lt;code&gt;Monkey&lt;/code&gt;s, it&amp;rsquo;ll suddenly take 5+ seconds to return a single entity. We&amp;rsquo;ve experienced this at Khan Academy more than once. It&amp;rsquo;s public enemy number one due to how easy it is to not notice the problem at first and then encounter brutal performance problems later.&lt;/p&gt;

&lt;/div&gt;&lt;/div&gt;



&lt;div class="quiz-container"&gt;
&lt;h1 class="quiz-header"&gt;Question 6&lt;/h1&gt;&lt;hr class="quiz-hr"&gt;
&lt;table class="quiz-table"&gt;
&lt;tr class="context"&gt;&lt;td class="left"&gt;Query&lt;/td&gt;&lt;td&gt;Model&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="left"&gt;
&lt;pre&gt;&lt;code&gt;query = Monkey.all()
query.filter("name =", "bob")
query.filter("zoo =", "Manhattan")
query.filter("hats &amp;gt;", 5)
query.get()
&lt;/code&gt;&lt;/pre&gt;
&lt;/td&gt;&lt;td&gt;
&lt;pre&gt;&lt;code&gt;class Animal(db.PolyModel):
  name = db.StringProperty(indexed=True)
  zoo = db.StringProperty(indexed=True)

class Monkey(Animal):
  hats = db.IntegerProperty(indexed=True)&lt;/code&gt;&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr class="context additional-context"&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt;index.yaml&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="left"&gt; &lt;/td&gt;&lt;td&gt;
&lt;pre&gt;&lt;code&gt;- kind: Animal
  properties:
  - name: name
  - name: zoo
  - name: hats&lt;/code&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;p class="quiz-controls"&gt;
&lt;a href="#" class="btn btn-primary" data-correct="yuppers"&gt;Hold on there — a major improvement is possible&lt;/a&gt; &lt;em&gt;or&lt;/em&gt;
&lt;a href="#" class="btn btn-green"&gt;All looks good to me — don&amp;rsquo;t go changin&amp;rsquo; a thang&lt;/a&gt;
&lt;/p&gt;

&lt;div class="quiz-answer"&gt;
&lt;p&gt;
&lt;strong class="right-wrong"&gt;You&amp;rsquo;re right!&lt;/strong&gt; What now?! You&amp;rsquo;ve got your perfect index on all the queried properties! Well, not really.&lt;/p&gt;

&lt;p&gt;This&amp;rsquo;ll suffer from the exact same Very Serious™ performance issue from Question 5. By using PolyModel and querying specifically for &lt;code&gt;Monkey&lt;/code&gt;s — not just any old &lt;code&gt;Animal&lt;/code&gt; — you&amp;rsquo;re implicitly adding another filter to your query. This filter will use PolyModel&amp;rsquo;s built-in special property, &lt;code&gt;class&lt;/code&gt;, to only return Monkey results. If you don&amp;rsquo;t have an index that covers all filtered properties including &lt;code&gt;class&lt;/code&gt;, you ain&amp;rsquo;t go no perfect index.

&lt;/p&gt;&lt;pre&gt;&lt;code&gt;- kind: Animal
  properties:
  - name: class
  - name: name
  - name: zoo
  - name: hats&lt;/code&gt;
&lt;/pre&gt;

&lt;/div&gt;&lt;/div&gt;

&lt;hr style="margin-left:33%;width:33%;"&gt;&lt;br/&gt;&lt;br/&gt;

&lt;p&gt;That&amp;rsquo;s it, you&amp;rsquo;re done! I could keep going, but by now you&amp;rsquo;ve spotted a trend in the answers and I&amp;rsquo;m pretty sure we&amp;rsquo;re past the 3-minute mark.&lt;/p&gt;

&lt;p&gt;If you want more or have other interesting quiz questions I&amp;rsquo;d love to know. And if you geek out on perf work like me, &lt;a href="http://khanacademy.org/careers"&gt;you know what to do&lt;/a&gt;.&lt;/p&gt;

&lt;script&gt;
$(".quiz-controls a").click(function(e) {
  e.preventDefault();
  $(this)
    .closest(".quiz-controls")
      .slideUp("fast")
    .closest(".quiz-container")
      .find(".quiz-answer")
        .slideDown("fast");

  var correct = !!$(this).attr("data-correct");
  $(this).closest(".quiz-container").find(".right-wrong").text(
    correct ? "You're right!" : "Wrong — read up.");
});
&lt;/script&gt;</description><link>https://bjk5.com/post/78634742389</link><guid>https://bjk5.com/post/78634742389</guid><pubDate>Wed, 05 Mar 2014 00:47:00 -0800</pubDate></item><item><title>Email transparency at Khan Academy</title><description>&lt;p&gt;Whenever we mention that almost all Khan Academy email is visible to everybody on the team, people always wanna know more.&lt;/p&gt;

&lt;p&gt;The idea is &lt;a href="https://stripe.com/blog/email-transparency"&gt;unapologetically copied from Stripe&lt;/a&gt;. Whether they originally came up with it or not &lt;strike&gt;I dunno&lt;/strike&gt; (edit: &lt;a href="https://twitter.com/thegdb/status/418548136663998465"&gt;they did&lt;/a&gt;). We certainly didn&amp;rsquo;t. But by now we&amp;rsquo;ve added enough of our own little tweaks to warrant contributing back. Here&amp;rsquo;s the how and why of &amp;ldquo;radical email transparency&amp;rdquo; at Khan.&lt;/p&gt;

&lt;h1&gt;How we got started&lt;/h1&gt;

&lt;ul&gt;&lt;li&gt;Step 1) Read &lt;a href="https://stripe.com/blog/email-transparency"&gt;Stripe&amp;rsquo;s post&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Step 2) Get forwarded Stripe&amp;rsquo;s post by at least 3 other devs within a couple days.&lt;/li&gt;
&lt;li&gt;Step 3) Implement a super hacky version of Stripe&amp;rsquo;s post&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;That all happened ~10 months ago. &lt;strong&gt;I&amp;rsquo;d absolutely do it again&lt;/strong&gt;. I&amp;rsquo;m not gonna list all the ways this is different than Stripe&amp;rsquo;s — our system is just a bit simpler/smaller/stupider.&lt;/p&gt;

&lt;h1&gt;How our hacky version works&lt;/h1&gt;

&lt;p&gt;Every team has two email addresses: one for team members and one for the team&amp;rsquo;s &amp;ldquo;blackhole.&amp;rdquo; &lt;code&gt;analytics-team@khanacademy.org&lt;/code&gt; and &lt;code&gt;analytics-blackhole@khanacademy.org&lt;/code&gt;.&lt;/p&gt;

&lt;figure class="tmblr-full" data-orig-height="300" data-orig-width="300" data-orig-src="https://64.media.tumblr.com/06d4bb1520ebea6d92966d28a9d5f9d2/tumblr_inline_myqtx96AJn1qde7uz.png"&gt;&lt;img style="width:300px;" class="rightInset" align="right" src="https://64.media.tumblr.com/06d4bb1520ebea6d92966d28a9d5f9d2/tumblr_inline_p8dy6jsCpO1qde7uz_540.png" data-orig-height="300" data-orig-width="300" data-orig-src="https://64.media.tumblr.com/06d4bb1520ebea6d92966d28a9d5f9d2/tumblr_inline_myqtx96AJn1qde7uz.png"/&gt;&lt;/figure&gt;&lt;p style="margin-left:25px;text-indent:-25px;"&gt;&lt;strong&gt;The &lt;code&gt;-team@&lt;/code&gt; address is for emailing all members of the team.&lt;/strong&gt;&lt;br/&gt;
    When you send email to &lt;code&gt;analytics-team@&lt;/code&gt;, you expect everyone on the analytics team to read it.&lt;br/&gt;
    Subscribing to &lt;code&gt;analytics-team@&lt;/code&gt; means analytics-related email will land in your priority inbox as soon as it&amp;rsquo;s sent, and you&amp;rsquo;re expected to read it.&lt;/p&gt;

&lt;p style="margin-left:25px;text-indent:-25px;"&gt;&lt;strong&gt;The &lt;code&gt;-blackhole@&lt;/code&gt; address is for anything else that has anything to do with analytics.&lt;/strong&gt;&lt;br/&gt;
    When you &lt;code&gt;CC:analytics-blackhole@&lt;/code&gt;, you don&amp;rsquo;t expect subscribers to immediately read it.&lt;br/&gt;
    Subscribing to &lt;code&gt;analytics-blackhole@&lt;/code&gt; means you&amp;rsquo;ll receive analytics-related email, but it&amp;rsquo;ll get filtered out of your inbox and you&amp;rsquo;re not expected to read it unless you feel like it.&lt;/p&gt;

&lt;p&gt;There&amp;rsquo;re two additional catch-all lists for the entire dev team: &lt;code&gt;dev-team@&lt;/code&gt; and &lt;code&gt;dev-blackhole@&lt;/code&gt;. So we currently have ~24 lists. &lt;code&gt;dev-team@&lt;/code&gt;, &lt;code&gt;dev-blackhole@&lt;/code&gt;, &lt;code&gt;analytics-team@&lt;/code&gt;, &lt;code&gt;analytics-blackhole@&lt;/code&gt;, &lt;code&gt;mobile-team@&lt;/code&gt;, &lt;code&gt;mobile-blackhole@&lt;/code&gt;, &lt;code&gt;i18n-team@&lt;/code&gt;, &lt;code&gt;i18n-blackhole@&lt;/code&gt;, &amp;hellip;&lt;/p&gt;

&lt;p&gt;Anybody in the org can join any of these email lists. &lt;code&gt;analytics-team@&lt;/code&gt; is usually just team members, but &lt;code&gt;analytics-blackhole@&lt;/code&gt; has all sorts of lookie-loo subscribers who&amp;rsquo;re interested in analytics happenings.&lt;/p&gt;

&lt;p&gt;All email to &lt;code&gt;analytics-team@&lt;/code&gt; gets forwarded to &lt;code&gt;analytics-blackhole@&lt;/code&gt;, so lookie-loo &lt;code&gt;-blackhole@&lt;/code&gt; subscribers will get updates sent to &lt;code&gt;-team@&lt;/code&gt; automatically.&lt;/p&gt;

&lt;p&gt;When you receive an email via a &lt;code&gt;-blackhole@&lt;/code&gt; list, it is automatically tagged as &lt;code&gt;blackhole&lt;/code&gt; and filtered out of your inbox.&lt;/p&gt;

&lt;p&gt;If an email is directly addressed &lt;code&gt;TO:you@&lt;/code&gt; or &lt;code&gt;TO:your-team@&lt;/code&gt;, it&amp;rsquo;ll stay in your inbox regardless of any &lt;code&gt;CC:-blackhole@&lt;/code&gt;.&lt;/p&gt;

&lt;p class="center"&gt;&lt;figure class="tmblr-full" data-orig-height="375" data-orig-width="500" data-orig-src="https://64.media.tumblr.com/ba07819285e37a0605feef4f119e7c91/tumblr_inline_myqs23S43F1qde7uz.png"&gt;&lt;img src="https://64.media.tumblr.com/dd1f278eec29476d1406dd3e65f5ccce/tumblr_inline_p8dy6jaDJe1qde7uz_540.png" data-orig-height="375" data-orig-width="500" data-orig-src="https://64.media.tumblr.com/ba07819285e37a0605feef4f119e7c91/tumblr_inline_myqs23S43F1qde7uz.png"/&gt;&lt;/figure&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best practice when sending email&lt;/strong&gt;: unless you have good reason not to, CC &lt;code&gt;dev-blackhole@&lt;/code&gt; or any of the other &lt;code&gt;-blackhole@&lt;/code&gt; lists.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best practice when reading email&lt;/strong&gt;: read the emails in your blackhole on your own schedule, if and when you want.&lt;/p&gt;

&lt;p&gt;Between these buckets and best practices we have the tools we need to make the contents of any email open to anyone interested without burying ourselves in a deadly deluge.&lt;/p&gt;

&lt;h1&gt;Example emails&lt;/h1&gt;

&lt;ul&gt;&lt;li&gt;&lt;a href="http://derandomized.com/"&gt;Jace&lt;/a&gt; emails Ms. Monkey (an analytics teammate of his) about a new experiment being run. &lt;code&gt;TO:msmonkey@&lt;/code&gt;, &lt;code&gt;CC:analytics-blackhole@&lt;/code&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href="http://arguingwithalgorithms.blogspot.com/"&gt;Tom&lt;/a&gt; emails the internationalization team about a change that may affect the way usage statistics are calculated for non-English users. &lt;code&gt;TO:i18n-team@&lt;/code&gt;, &lt;code&gt;CC:analytics-blackhole@&lt;/code&gt;&lt;/li&gt;

&lt;li&gt;I email Mr. Gorilla asking when he&amp;rsquo;d like to demo his latest work for the company. &lt;code&gt;TO:mrgorilla@&lt;/code&gt;, &lt;code&gt;CC:dev-blackhole@&lt;/code&gt;&lt;/li&gt;

&lt;li&gt;Craig emails the infrastructure team with a summary of upcoming priorities. &lt;code&gt;TO:infrastructure-team@&lt;/code&gt;&lt;/li&gt;

&lt;li&gt;I email &lt;a href="http://missmarcialee.com"&gt;Marcia&lt;/a&gt; about a personal career matter that shouldn&amp;rsquo;t involve others. &lt;code&gt;TO:marcia@&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;h1&gt;How it&amp;rsquo;s technically implemented&lt;/h1&gt;

&lt;p&gt;Google Groups &amp;lsquo;n&amp;rsquo; Gmail filters. You&amp;rsquo;re about to see how hacky the rabbit hole goes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Google Groups&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Each team gets their own &lt;code&gt;-team@&lt;/code&gt; and &lt;code&gt;-blackhole@&lt;/code&gt; groups.&lt;/li&gt;
    &lt;li&gt;Each &lt;code&gt;-blackhole@&lt;/code&gt; group is a member of its respective &lt;code&gt;-team@&lt;/code&gt; group.&lt;/li&gt;
    &lt;li&gt;Group settings:
        &lt;ul style="margin-bottom:0"&gt;&lt;li&gt;Permissions | &amp;ldquo;Who can join this group?&amp;rdquo; ==&amp;gt; &amp;ldquo;Anyone in the organization&amp;rdquo;&lt;/li&gt;
            &lt;li&gt;Description includes &amp;ldquo;(email-transparency)&amp;rdquo;&lt;/li&gt;
            &lt;li&gt;Information | Directory | Check &amp;ldquo;List this group in the directory&amp;rdquo;&lt;/li&gt;
        &lt;/ul&gt;&lt;/li&gt;
    &lt;li&gt;We setup a short URL to a google groups search for &amp;ldquo;(email-transparency)&amp;rdquo; — now anybody can go to &lt;a href="http://www.khanacademy.org/r/email-transparency"&gt;khanacademy.org/r/email-transparency&lt;/a&gt; and subscribe to whatever lists they want.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Gmail Filters&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Everybody has the following filters. Our setup doc has 'em exported to xml, which everybody imports via Gmail | Settings | Filters | Import filters.
        &lt;ul style="margin-bottom:0"&gt;&lt;li&gt;Matches: to:(*-blackhole.khanacademy.org)&lt;br/&gt;
            Do this: Apply label &amp;ldquo;blackhole&amp;rdquo;
            &lt;/li&gt;
            &lt;li&gt;Matches: from:(-me) to:(*-blackhole.khanacademy.org -me -*-team.khanacademy.org)&lt;br/&gt;
            Do this: Skip Inbox&lt;/li&gt;
        &lt;/ul&gt;&lt;/li&gt;
    &lt;li&gt;Now emails received via blackhole lists are labeled and filtered out of your inbox unless they were addressed to you or your team.&lt;/li&gt;
&lt;/ul&gt;&lt;h1&gt;Why I&amp;rsquo;m happy&lt;/h1&gt;

&lt;p&gt;This experiment pushed my personal comfort zone at first — &amp;ldquo;wait, is it really ok for everyone to see this?&amp;rdquo; — but I feel great about an email culture that&amp;rsquo;s &lt;a href="http://blog.pamelafox.org/2013/08/communication-at-khan-academy-open-by.html"&gt;open by default&lt;/a&gt; and wouldn&amp;rsquo;t wanna go back.&lt;/p&gt;

&lt;p&gt;Trusting devs to subscribe to whatever content they find helpful makes me happy. Trusting everyone to not waste time reading email that&amp;rsquo;s unimportant for them has worked out. We&amp;rsquo;ve seen a lot of value from &lt;code&gt;-blackhole@&lt;/code&gt; subscribers getting news they wouldn&amp;rsquo;t otherwise have seen.&lt;/p&gt;

&lt;p&gt;You know those moments right before you send an email when you sit there and type names into CC, then delete 'em, then re-type 'em, all because you&amp;rsquo;re trying to figure out who cares? That&amp;rsquo;s gone. It&amp;rsquo;s up to the subscribers. Just send it to the critical people and CC a blackhole list. Fewer email decisions.&lt;/p&gt;

&lt;p&gt;You know those once-in-a-while emails that&amp;rsquo;re full of insight? Bullet-point priority breakdowns and strong opinions and team schedule updates? Sometimes they&amp;rsquo;re only read by one or two people, maybe because the author doesn&amp;rsquo;t feel comfortable blasting &lt;code&gt;all@company.com&lt;/code&gt;. That&amp;rsquo;s just silly. I like 'em in an open, searchable spot. Blackholes are perfect.&lt;/p&gt;

&lt;p class="center"&gt;&lt;figure class="tmblr-full" data-orig-height="397" data-orig-width="500" data-orig-src="https://64.media.tumblr.com/90fc41d5e3ab0ddbf87891013fad4ebd/tumblr_inline_myqseevdF01qde7uz.jpg"&gt;&lt;img src="https://64.media.tumblr.com/7f8eb65e45de63016df9d4766c5c910b/tumblr_inline_p8dy6kmqTU1qde7uz_540.jpg" data-orig-height="397" data-orig-width="500" data-orig-src="https://64.media.tumblr.com/90fc41d5e3ab0ddbf87891013fad4ebd/tumblr_inline_myqseevdF01qde7uz.jpg"/&gt;&lt;/figure&gt;&lt;/p&gt;

&lt;p&gt;You know how your inbox is already overloaded and the last thing you want is more email? No problem, don&amp;rsquo;t subscribe. Or only subscribe to &lt;code&gt;-blackhole@&lt;/code&gt; lists and only skim 'em once in a blue moon. I do the latter.&lt;/p&gt;

&lt;p&gt;You know how you keep saying you want to keep your team as flat as possible for as long as possible? Avoiding titles is one thing, sure. But flattening communication — trusted access for everybody — is huge.&lt;/p&gt;

&lt;p&gt;Openness and trust has been a big part of Khan Academy&amp;rsquo;s dev team since the start. This experiment kinda fit right in.&lt;/p&gt;

&lt;h1&gt;Why I&amp;rsquo;m not so happy&lt;/h1&gt;

&lt;p&gt;Our biggest problem, by far, comes from imperfections in the gmail filter setup. Filters have no way of knowing which lists you&amp;rsquo;re subscribed to, so if somebody sends an email to &lt;code&gt;analytics-team@&lt;/code&gt; and &lt;code&gt;dev-blackhole@&lt;/code&gt; and you receive the email, we don&amp;rsquo;t know if it should stay in your inbox or not. You may&amp;rsquo;ve received it via the blackhole list, but if you&amp;rsquo;re subscribed to analytics-team it shouldn&amp;rsquo;t disappear to the blackhole.&lt;/p&gt;

&lt;p&gt;Right now we err on the side of safety by not removing anything from your inbox if it was sent to a &lt;code&gt;-team@&lt;/code&gt; address, but this means some messages that should be in your blackhole are not. Stripe has tried to work around this via &lt;a href="https://github.com/antifuchs/gmail-britta"&gt;a library to automatically generate complicated gmail filter combinations&lt;/a&gt;, but that doesn&amp;rsquo;t feel quite right for us. It&amp;rsquo;s a bit complicated for newcomers to use, and it requires reconfiguring your filters every time you join or unjoin a new list.&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;m sure there are tools out there that could solve this — probably by abandoning google groups altogether. Ideas welcome.&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;m also not in love with the google groups UX that lets people find/join/unjoin lists: &lt;a href="http://www.khanacademy.org/r/email-transparency"&gt;khanacademy.org/r/email-transparency&lt;/a&gt;. No question there are tools that&amp;rsquo;d handle this use case better. Supposedly Stripe built a custom interface on the Groups API.つ ◕_◕ ༽つ giff open source plz!&lt;/p&gt;

&lt;h1&gt;Anybody else on this train?&lt;/h1&gt;

&lt;p&gt;Have others experimented w/ email transparency? We won&amp;rsquo;t go back. But as you now know our setup is far from perfect. Would be interested in learning from others.&lt;/p&gt;</description><link>https://bjk5.com/post/71887196490</link><guid>https://bjk5.com/post/71887196490</guid><pubDate>Wed, 01 Jan 2014 14:15:00 -0800</pubDate></item><item><title>The most common feedback we give dev interns</title><description>&lt;p&gt;I&amp;rsquo;ve been lucky to see ~70 interns pass through the dev teams at Khan Academy and Fog Creek. If you know me you know how much I enjoy internships. Infinitely better than an interview, enough time to get meaningful work done, a chance to sit side-by-side for months, and interns see real personal and career growth (not to mention compensation).&lt;/p&gt;

&lt;p&gt;And we&amp;rsquo;ve been lucky, talent-wise. Age be-damned, we always wind up learning from our young bloods and wishing some would never leave. But &lt;a href="http://bjk5.com/post/45981136553/the-absolute-minimum-every-khan-academy-developer"&gt;we also invest a lot of energy mentoring them&lt;/a&gt;, and I&amp;rsquo;d like to share the two pieces of feedback that&amp;rsquo;re most often in our mentors&amp;rsquo; mouths. Figured this&amp;rsquo;d be useful to future interns anywhere.&lt;/p&gt;

&lt;h1&gt;1. Write code with your code reviewer in mind&lt;/h1&gt;

&lt;p&gt;We love &lt;a href="http://bjk5.com/post/18441794352/required-code-reviews"&gt;code reviews&lt;/a&gt;. I&amp;rsquo;m kinda tempted to setup a picture frame on each intern&amp;rsquo;s desk, with a photo of their code reviewer kindly smiling at them and &amp;ldquo;Be nice to your reviewer!&amp;rdquo; written along the bottom of the frame in fancy cursive font.&lt;/p&gt;

&lt;p class="center"&gt;&lt;figure class="tmblr-full" data-orig-height="404" data-orig-width="430" data-orig-src="http://static.tumblr.com/9hgswys/yfimyl7xf/rev.png"&gt;&lt;img src="https://64.media.tumblr.com/09a04e8d1d7cf091e8dab9f64e05b4c0/tumblr_inline_p8dy6jywvv1qde7uz_540.png" data-orig-height="404" data-orig-width="430" data-orig-src="http://static.tumblr.com/9hgswys/yfimyl7xf/rev.png"/&gt;&lt;/figure&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Avoid dumping massive blobs of code on folks&lt;/strong&gt;. You&amp;rsquo;re probably hyper-productive as an intern with nothing else to do but write code. Don&amp;rsquo;t quietly assemble a big bomb of code over 5 days and then drop it on your poor, unsuspecting team lead. Granular checkin points — &lt;a href="http://arguingwithalgorithms.blogspot.com/2013/03/coding-for-review.html"&gt;one conceptual change per commit&lt;/a&gt; — give your code reviewers a chance to engage easily and offer feedback as you go along.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use TODOs liberally&lt;/strong&gt;. &lt;code&gt;TODO(intern bob): transition to new API once backfill is done&lt;/code&gt; gives your reviewer a sneak peek inside your head. You won&amp;rsquo;t be able to do everything you want in every changeset, especially if you&amp;rsquo;re focused on shipping and following our advice for granular commits. So throw these suckers around with pride — heck, one of our past interns wrote &lt;a href="https://github.com/sbirch/todo"&gt;a script that generates a TODO leaderboard&lt;/a&gt; from our codebase.&lt;/p&gt;

&lt;h1&gt;2. Talk about what you&amp;rsquo;re doing and how you&amp;rsquo;re gonna do it&lt;/h1&gt;

&lt;p&gt;After all those interns, I can count on half a hand the number who talked too much about what they were building.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your work does not need to be complete to be worth sharing.&lt;/strong&gt; Bums like me put a lot of effort into building communication channels for the team. Use them. At Khan we&amp;rsquo;ve got hipchat, &lt;a href="https://stripe.com/blog/email-transparency"&gt;transparent emails&lt;/a&gt;, weekly demo opportunities, dogfood days&amp;hellip;all just &lt;em&gt;begging&lt;/em&gt; for interns to post sketches, screenshots, design docs, and prototypes. &lt;a href="http://missmarcialee.com"&gt;The best communicators I know&lt;/a&gt; consistently face their fears by posting works-in-progress before being asked to do so (and clearly stating that more is on the way).&lt;/p&gt;

&lt;p class="center"&gt;&lt;figure class="tmblr-full" data-orig-height="430" data-orig-width="430" data-orig-src="https://64.media.tumblr.com/1d88b8ea6c920bdfdbdc3f3ba60a8f96/tumblr_inline_myl7bbIExL1qde7uz.jpg"&gt;&lt;img src="https://64.media.tumblr.com/1d88b8ea6c920bdfdbdc3f3ba60a8f96/tumblr_inline_p8dy6kF7hQ1qde7uz_540.jpg" data-orig-height="430" data-orig-width="430" data-orig-src="https://64.media.tumblr.com/1d88b8ea6c920bdfdbdc3f3ba60a8f96/tumblr_inline_myl7bbIExL1qde7uz.jpg"/&gt;&lt;/figure&gt;&lt;br/&gt;&lt;em&gt;An excellent communicator&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;By the way, you&amp;rsquo;re not bragging about what you&amp;rsquo;ve done to &amp;ldquo;take credit&amp;rdquo; in some ugly political fashion. &lt;em&gt;It&amp;rsquo;s part of your job&lt;/em&gt; to brag, to make sure your team knows your progress and what direction you&amp;rsquo;re heading.&lt;/p&gt;

&lt;h1&gt;The myth of the genius programmer&lt;/h1&gt;

&lt;p&gt;That&amp;rsquo;s a short list, I know. I wanted to title this post &amp;ldquo;You&amp;rsquo;ll Never Believe These Two Simple Tips That&amp;rsquo;ll Make You a More Valuable Intern,&amp;rdquo; but then I would&amp;rsquo;ve had to throw myself out a window and I&amp;rsquo;m pretty excited to see how 2014 turns out.&lt;/p&gt;

&lt;p&gt;The truth is both of these pieces of feedback are about dispelling the myth of the genius programmer. &lt;a href="https://twitter.com/therealfitz/"&gt;Brian Fitzpatrick&lt;/a&gt; stopped by Khan Academy a while back to shed some light on this:&lt;/p&gt;

&lt;blockquote&gt;The ultimate geek fantasy is to go off into your cave and work and type and code and then shock the world with your brilliant new invention. You know, it&amp;rsquo;s a desire to be seen as a genius by your peers.
&lt;/blockquote&gt;

&lt;p&gt;The fantasy — the &lt;em&gt;myth&lt;/em&gt; that feverishly creating while all alone is genius — hits all of us, especially interns coming right out of school. It&amp;rsquo;s certainly lodged somewhere deep inside me. But &lt;a href="http://www.youtube.com/watch?v=0SARbwvhupQ"&gt;Fitz and Ben know&lt;/a&gt; that only emerging from your cave when you&amp;rsquo;ve discovered perfection is insecurity, not genius. &lt;strong&gt;It&amp;rsquo;s what makes us accumulate huge unreviewed swaths of code and clam up when we should be sharing our progress.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The best programmers I know brave their imperfections. They limit themselves to granular changes that others can understand and constantly talk about whatever they&amp;rsquo;re doing. And that&amp;rsquo;s why we give interns the above advice. If you can somehow show up and apply your talents in this same way &lt;em&gt;right out of school&lt;/em&gt;, you&amp;rsquo;re probably gonna be seen as a genius.&lt;/p&gt;

&lt;hr style="margin-left:33%;width:33%;"&gt;&lt;p&gt;We&amp;rsquo;re still accepting &lt;a href="https://www.khanacademy.org/careers/interns"&gt;applications for our next class of Khan Academy interns&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Due props to &lt;a href="http://arguingwithalgorithms.blogspot.com/"&gt;Tom Yedwab&lt;/a&gt; and all other mentors who directly or indirectly contributed.&lt;/em&gt;&lt;/p&gt;</description><link>https://bjk5.com/post/71559049069</link><guid>https://bjk5.com/post/71559049069</guid><pubDate>Sun, 29 Dec 2013 13:59:00 -0800</pubDate></item><item><title>"Shipping beats perfection" explained</title><description>&lt;p&gt;When we sat down to write Khan Academy&amp;rsquo;s company values in 2010, &amp;ldquo;shipping beats perfection&amp;rdquo; flew out of Sal&amp;rsquo;s mouth before our butts hit the chairs.&lt;/p&gt;

&lt;p&gt;It&amp;rsquo;s almost 3 years later. I have one-on-ones with teammates new and old who wanna talk more about what &amp;ldquo;shipping beats perfection&amp;rdquo; means. When outsiders happen across &lt;a href="https://sites.google.com/a/khanacademy.org/forge/for-developers"&gt;our development principles&lt;/a&gt;, &amp;ldquo;shipping beats perfection&amp;rdquo; becomes a lightning rod for anything from &lt;a href="http://37signals.com/svn/posts/3582-shipping-beats-perfection-be-open-share"&gt;compliments and respect&lt;/a&gt; to &lt;a href="http://www.reddit.com/r/programming/comments/1iikud/shipping_beats_perfection_khan_academys_3_rules/"&gt;accusations and fury&lt;/a&gt;. Our internal chat bot, &lt;a href="https://github.com/Khan/culture-cow"&gt;the culture cow&lt;/a&gt;, drops &amp;ldquo;shipping beats perfection&amp;rdquo; as occasional chat room reminders (between MOOs).&lt;/p&gt;

&lt;p class="center"&gt;&lt;img class="small" src="http://static.tumblr.com/9hgswys/MVtmsudvx/screen_shot_2013-09-08_at_10.04.09_pm.png"/&gt;&lt;/p&gt;

&lt;p&gt;At some point along the way when the phrase passed between my ears for the N&lt;sup&gt;N&lt;/sup&gt;th time, my brain started believing it was invented by Google or Facebook (nope, that&amp;rsquo;s &amp;ldquo;move fast, break things&amp;rdquo;) or some other big boy with so much success that small fish like us just naturally start repeating whatever they say.&lt;/p&gt;

&lt;p&gt;But now that I sit down to explain it, I&amp;rsquo;m googling for &lt;a href="https://www.google.com/search?q=%22shipping+beats+perfection%22+-khan"&gt;&amp;ldquo;shipping beats perfection&amp;rdquo; -khan&lt;/a&gt; and not finding much. And while I love its simplicity, &amp;ldquo;shipping beats perfection&amp;rdquo; contains subtlety in need of explanation.&lt;/p&gt;

&lt;h1&gt;We&amp;rsquo;re willing to be embarrassed about what we &lt;em&gt;haven&amp;rsquo;t&lt;/em&gt; done&amp;hellip;&lt;/h1&gt;

&lt;p&gt;We&amp;rsquo;re willing to be &lt;a href="http://bjk5.com/post/1565259760/its-ok-to-be-embarrassed-about-what-your-product"&gt;embarrassed about the things we haven&amp;rsquo;t done yet&lt;/a&gt;. Did you know &lt;a href="https://itunes.apple.com/us/app/khan-academy/id469863705?mt=8"&gt;our mobile app&lt;/a&gt; only offers video viewing, not the rest of our interactive platform? Did you know we don&amp;rsquo;t yet completely cover loops in &lt;a href="https://www.khanacademy.org/cs/programming"&gt;our programming tutorials and challenges&lt;/a&gt;? Did you know we don&amp;rsquo;t have fully immersive simulations for &lt;a href="https://www.khanacademy.org/science/physics"&gt;teaching students physics&lt;/a&gt;?&lt;/p&gt;

&lt;p class="center"&gt;&lt;img class="small" src="http://static.tumblr.com/9hgswys/0RMmsud1u/b73958de126811e3b2aa22000aeb0f9e_7.jpg"/&gt;&lt;/p&gt;
&lt;p&gt;Well, that&amp;rsquo;s all true, and quite embarrassing&amp;hellip;for now. Would we go back in time to delay our mobile app&amp;rsquo;s launch until we figured out how to support the entire Khan Academy platform in an app? Absolutely not. Would we go back and undo &lt;a href="http://ejohn.org/blog/introducing-khan-cs/"&gt;the launch of Khan Academy programming&lt;/a&gt; because it doesn&amp;rsquo;t yet contain all of the content it &lt;em&gt;really&lt;/em&gt; needs to? Absolutely not. &lt;/p&gt;

&lt;p&gt;Is this the right philosophy for all products? Absolutely not. But educational content is so badly needed right now, and students are so hungry, that it&amp;rsquo;d be vain of us to think satisfying our own hunger for perfection is worth more than students&amp;rsquo; needs. We&amp;rsquo;ll get to the complete mobile app. We&amp;rsquo;ll get to better coverage of computer programming content. Maybe we&amp;rsquo;ll even get to a fully immersive physics simulation. One day.&lt;/p&gt;

&lt;h1&gt;&amp;hellip;but not willing to be embarrassed about what we have done.&lt;/h1&gt;

&lt;p&gt;&amp;ldquo;Shipping beats perfection&amp;rdquo; doesn&amp;rsquo;t mean we should ship something we&amp;rsquo;re embarrassed of. Far from it. Would we ever put out physics content that felt crappy or didn&amp;rsquo;t help students learn? Absolutely not. Would we ever push out a mobile app with a frustrating video viewing experience? Absolutely not.&lt;/p&gt;

&lt;p&gt;That would be embarrassment over what we &lt;em&gt;have&lt;/em&gt; built. We don&amp;rsquo;t ship that.&lt;/p&gt;

&lt;p class="center"&gt;&lt;img class="small" src="http://static.tumblr.com/9hgswys/abjmsud52/8cbf34bc180211e3932d22000a9e5ae0_7.jpg"/&gt;&lt;/p&gt;

&lt;blockquote&gt;I&amp;rsquo;m not taking advice from anybody who says &amp;lsquo;shipping beats perfection&amp;rsquo;&amp;hellip;makes no sense anyway you slice it&amp;hellip;stability, cache issues, etc.&lt;br/&gt;&lt;br/&gt;— &lt;a href="http://www.reddit.com/r/programming/comments/1iikud/shipping_beats_perfection_khan_academys_3_rules/cb527cp"&gt;Concerned Redditor&lt;/a&gt;&lt;/blockquote&gt;

&lt;p&gt;Concerned Redditor, you need not worry your pretty little karma-filled head. We &lt;a href="http://mattfaus.com/2013/06/auditing-datastore-operations-on-google-appengine/"&gt;work&lt;/a&gt; &lt;a href="http://bjk5.com/post/6944602865/google-app-engine-mini-profiler"&gt;hard&lt;/a&gt; for &lt;a href="http://benalpert.com/2013/06/09/using-react-to-speed-up-khan-academy.html"&gt;performance&lt;/a&gt; and &lt;a href="http://bjk5.com/post/54202245691/the-app-engine-way"&gt;stability&lt;/a&gt;, and, well, I don&amp;rsquo;t even know why I&amp;rsquo;m defending us against this statement because &amp;ldquo;shipping beats perfection&amp;rdquo; doesn&amp;rsquo;t in any way mean &amp;ldquo;ship crappy code.&amp;rdquo;&lt;/p&gt;

&lt;h1&gt;Wait, what? &amp;ldquo;Shipping beats perfection&amp;rdquo; can play nice w/ high code quality?&lt;/h1&gt;

&lt;p&gt;We &lt;a href="https://sites.google.com/a/khanacademy.org/forge/for-developers/code-review-policy#TOC-What-makes-for-a-successful-code-review-"&gt;code review literally every change&lt;/a&gt; and demand clear, understandable code. We docstring almost everything. Unit tests are popping up everywhere. If a code reviewer is confused by anything, she can simply say, &amp;ldquo;I&amp;rsquo;m having trouble understanding this part,&amp;rdquo; and it&amp;rsquo;s on the coder&amp;rsquo;s head to fix their code or documentation so things are clearer for future readers.&lt;/p&gt;

&lt;p&gt;Perfection? Far from it. We can only afford this level of quality and still &lt;a href="http://www.khanacademy.org/about/blog/post/58354379257/introducing-the-learning-dashboard"&gt;ship like crazy&lt;/a&gt; because we&amp;rsquo;re willing to be embarrassed about plenty of other things we haven&amp;rsquo;t gotten to yet.&lt;/p&gt;

&lt;h1&gt;Bring out the strawman&lt;/h1&gt;

&lt;p&gt;Try this on for size.&lt;/p&gt;

&lt;p&gt;You&amp;rsquo;re assigned the task of adding a brand new data report for teachers who need to know more about what their students have learned. No doubt in your mind, the report is going to be &lt;em&gt;huge&lt;/em&gt; for them. Plus, you just did a &lt;a href="http://www.designstaff.org/articles/product-design-sprint-day-2-diverge-2012-10-26.html" title="Jason, your link goes here"&gt;design sprint&lt;/a&gt;, so you think you know exactly what needs building and how long it should take.&lt;/p&gt;

&lt;p&gt;You crack your knuckles and wryly smile as you&amp;rsquo;re about to fire up your editor and do what you do best.&lt;/p&gt;

&lt;p class="center"&gt;&lt;img class="small" src="http://static.tumblr.com/9hgswys/Ax7msud6q/ac409e9a16a711e38bf722000a1f92f7_7.jpg"/&gt;&lt;/p&gt;

&lt;p&gt;You crack open javascript/coach-reports/reports.js and can&amp;rsquo;t believe what you see. What is all this old cruft? Your new report would be soooooo much easier if the data was just bundled up a bit differently. Plus the logic for these other reports is real messy. If you take a couple weeks right now, you could clean things up, and then knocking out your new report will be a &lt;em&gt;breeze&lt;/em&gt; a coupl'a days later.&lt;/p&gt;

&lt;p&gt;What&amp;rsquo;s the right move here? Refactor everything and fix it, even though you&amp;rsquo;ll lose a couple weeks at first? &lt;a href="http://www.fraustollc.com/blog/shit_code/"&gt;Curse crappy code like a sailor&lt;/a&gt; and just hack the new report right on top?&lt;/p&gt;

&lt;p&gt;Spoiler alert: we don&amp;rsquo;t have enough information to answer. How badly do teachers need this? When? Is the &amp;ldquo;cruft&amp;rdquo; a bunch of edge cases that really do matter and shouldn&amp;rsquo;t be thrown away willy-nilly? Is it really old code genuinely in need of replacement?&lt;/p&gt;

&lt;p&gt;Every coder faces this demon. The good ones take a step back, ask the above questions, and choose appropriately for each situation. The bad ones dogmatically believe &amp;ldquo;any code I&amp;rsquo;m around must be perfect&amp;rdquo; or, equally as bad, &amp;ldquo;just ship it.&amp;rdquo;&lt;/p&gt;

&lt;h1&gt;Leave it better&lt;/h1&gt;

&lt;p&gt;You won&amp;rsquo;t always know the answer, so here&amp;rsquo;s something for your toolbelt: &amp;ldquo;leave it better.&amp;rdquo; Can you liberally add TODOs around the old code, explaining what you will do to fix the situation soon, write your new code such that it demonstrates the new pattern you proudly suggest, and at the same time solve the pressing problem for teachers?.&lt;/p&gt;

&lt;p&gt;If so, you left it better. You didn&amp;rsquo;t delay teachers&amp;rsquo; needs for two weeks due to a refactor. You didn&amp;rsquo;t write lots of new code that you&amp;rsquo;re embarrassed of. Sure, &lt;a href="http://bjk5.com/post/2954631955/messy-solutions-work-just-as-well"&gt;you may need one messy hack&lt;/a&gt; to link your new pattern to the old code. That&amp;rsquo;s ok, you did so for a reason — for learners — and you added a helpful TODO and a Trello card just to be sure you&amp;rsquo;ll get back to it. Sure, you&amp;rsquo;re embarrassed that you didn&amp;rsquo;t do the full refactor yet. That&amp;rsquo;s ok, it&amp;rsquo;s the type of embarrassment — we just haven&amp;rsquo;t done the work yet — that we&amp;rsquo;re ok with.&lt;/p&gt;

&lt;p class="center"&gt;&lt;img class="small" src="http://static.tumblr.com/9hgswys/KnEmsud8l/5cbb41a8141e11e3948222000a1f9307_7.jpg"/&gt;&lt;/p&gt;

&lt;p&gt;If you&amp;rsquo;re the type who can&amp;rsquo;t &amp;ldquo;just&amp;rdquo; leave it better but must make code perfect, then you&amp;rsquo;re satisfying your own needs instead of learners&amp;rsquo;. You&amp;rsquo;re violating &amp;ldquo;shipping beats perfection.&amp;rdquo;&lt;/p&gt;

&lt;h1&gt;A story to end on&lt;/h1&gt;

&lt;p&gt;We&amp;rsquo;ve seen videos of Spanish-speaking students in South America using Khan Academy to learn math. If a UX guru walked into one of these classrooms in Peru and sat down next to a student, here&amp;rsquo;s what they&amp;rsquo;d report back:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Spanish-speaking student goes to &lt;a href="http://www.khanacademy.org"&gt;www.khanacademy.org&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Student sees a bunch of text in English but clicks around enough to find the math problem she&amp;rsquo;s trying to practice.&lt;/li&gt;
&lt;li&gt;Student &lt;em&gt;selects all of the text in the math problem, then opens another tab, goes to Google translate, pastes the text in, and reads the Spanish translation of the math problem&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Student returns to the tab w/ Khan Academy open, writes her answer, gets the problem right.&lt;/li&gt;
&lt;li&gt;Student, seemingly unaware of the usability disaster they&amp;rsquo;ve just been tortured by, turns to UX guru and smiles blissfully, thrilled by her success. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And then at this point the UX guru&amp;rsquo;s head would a-splode.&lt;/p&gt;

&lt;p&gt;We&amp;rsquo;ve seen videos of this happening (minus head a-splosion). Many of us have felt &lt;em&gt;deep&lt;/em&gt; embarrassment in the past over our lack of translated versions of Khan Academy. But shipping beats perfection. For a long time we weren&amp;rsquo;t ready to tackle translations. We had to swallow our embarrassment and move forward with the English platform.&lt;/p&gt;

&lt;p class="center"&gt;&lt;img class="small" src="http://static.tumblr.com/9hgswys/L7Gmsudb2/afc4e67c15e711e3ab6722000a1fb853_7.jpg"/&gt;&lt;/p&gt;

&lt;p&gt;So should we be satisfied? Absolutely not. In about a week, &lt;a href="http://es-es.khanacademy.org"&gt;a fully internationalized Spanish version of Khan Academy&lt;/a&gt; will be out of alpha. Will it be perfect? Far from it. Will 100% of our content translated? Absolutely not. Is our internationalization code free of TODOs and &lt;a href="http://bjk5.com/post/2954631955/messy-solutions-work-just-as-well"&gt;the occasional messy hack&lt;/a&gt;? Absolutely not.&lt;/p&gt;

&lt;p&gt;Will our internationalization work leave our students, our product, our code quality, and hopefully our world in a better place than before? &lt;em&gt;Absolutely.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You only have to watch one Spanish-speaking student joyfully use an English-only math resource to realize that high code quality and perfect UIs don&amp;rsquo;t matter for their own sake. They matter when they make a difference for learners. So we leave things better every day, are willing to be embarrassed about what we haven&amp;rsquo;t done, take pride in what we have, and ship great educational content to everybody as fast as we can.&lt;/p&gt;

&lt;p&gt;Shipping beats perfection.&lt;/p&gt;

&lt;p class="center"&gt;&lt;img class="small" src="http://static.tumblr.com/9hgswys/KaGmsude0/1c56e49a150a11e3bf2822000a1d1fd7_7.jpg"/&gt;&lt;/p&gt;</description><link>https://bjk5.com/post/60760280107</link><guid>https://bjk5.com/post/60760280107</guid><pubDate>Mon, 09 Sep 2013 09:25:00 -0700</pubDate></item><item><title>"Our team needs more people"</title><description>&lt;p&gt;You know those puzzles with the matchsticks? Where you have some shape made out of &amp;lsquo;em and then you remove one and somehow, magically, you&amp;rsquo;re supposed to reform the original shape with one less matchstick?&lt;/p&gt;

&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/FRims3m1q/m0090_v.jpg"/&gt;&lt;br/&gt;&lt;em&gt;&amp;ldquo;Remove one matchstick and rearrange the rest to reform the original shape.&amp;rdquo;&lt;br/&gt;(It&amp;rsquo;s a joke, it won&amp;rsquo;t work, don&amp;rsquo;t get nerd sniped.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That&amp;rsquo;s the image that fills my brain when I try to make sure the right people are working on the right teams.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://adam.heroku.com/past/2011/4/28/scaling_a_development_team/"&gt;As a dev team scales&lt;/a&gt; it crosses the specialization barrier and forms internal teams. And every once in a rare while, for one reason or another, those teams need to be shifted around without disturbing the bigger picture.&lt;/p&gt;

&lt;p&gt;Maybe a bunch of interns just left and certain teams are short-handed. Maybe somebody needs a team switch for their own personal sanity. Maybe &lt;a href="https://es-es.khanacademy.org/"&gt;a project that&amp;rsquo;d only been in the backs of your minds for the last two years&lt;/a&gt; is suddenly injected with a fever pitch of support, and you need to get things moving quickly on this difficult, previously unstaffed challenge or be remembered as the chump who was unwilling to disturb your oh-so-perfect team breakdown to make room for something new and far more important.&lt;/p&gt;

&lt;p&gt;Doesn&amp;rsquo;t really matter how — it happens. It&amp;rsquo;s happening at Khan Academy right&amp;hellip;wait for it&amp;hellip;NOW due to &lt;a href="https://www.khanacademy.org/about/our-interns"&gt;our talented interns&lt;/a&gt; so rudely leaving us to finish school or something.&lt;/p&gt;

&lt;p&gt;As we consider our priorities, I&amp;rsquo;ve heard the following from &lt;em&gt;no less than 6 different teams&lt;/em&gt;:&lt;/p&gt;

&lt;blockquote&gt;We&amp;rsquo;re pretty stretched at the moment. Given how critical we are for the mission, our team needs more people.&lt;/blockquote&gt;

&lt;img src="http://static.tumblr.com/9hgswys/Lbwms3mjd/fleet.png" style="width:375px;" class="rightInset" align="right"/&gt;

&lt;p&gt;For the first one or two, I was pretty optimistic. We could make a small change, help their team, and maintain the big picture. I was always kinda good at those matchstick puzzles.&lt;/p&gt;

&lt;p&gt;Around request four or five I realized that the puzzle&amp;rsquo;s impossible. Need moar matchsticks. There&amp;rsquo;s no way we can give all the support we want to all the teams.&lt;/p&gt;

&lt;p&gt;One terrible response to this would be to start growing so quickly that we abandon our hiring principles. That won&amp;rsquo;t be happening. We could also decide to have fewer teams slash do less stuff — a principle I almost always argue for — but Khan Academy has done a very good job recently defining our core mission and focusing on what matters. We don&amp;rsquo;t want to do any less.&lt;/p&gt;

&lt;p&gt;Hence my conundrum. I was pacing around inside our office, then outside our office, then outside other people&amp;rsquo;s offices. At some point my pacing was interrupted by a lucky 1-on-1 with Craig. I bored him with my matchstick saga and he started laughing. He shared:&lt;/p&gt;

&lt;blockquote&gt;Eric Schmidt always said that if one of your teams isn&amp;rsquo;t asking for more people, something&amp;rsquo;s wrong. Teams should be able to do ~90% of what they want — not enough people to do everything, but not so few that they&amp;rsquo;re working unhealthily.&lt;/blockquote&gt;

&lt;p&gt;Relief washed over me in an awesome wave. It&amp;rsquo;s hard to listen to a team asking for help and not immediately help. Hearing that those asks are expected in a culture as respected as Google&amp;rsquo;s made me feel much better about Khan Academy&amp;rsquo;s current team breakdown.&lt;/p&gt;

&lt;hr style="margin-left:33%;width:33%;"&gt;

&lt;em&gt;&lt;a href="http://adam.heroku.com/past/2011/4/28/scaling_a_development_team/"&gt;Adam Wiggins&amp;rsquo;s guide&lt;/a&gt; to scaling a dev team has been a go-to article for me at many points, but none more so than when first splitting into specialized teams and weathering the associated storm.&lt;/em&gt;</description><link>https://bjk5.com/post/59319615738</link><guid>https://bjk5.com/post/59319615738</guid><pubDate>Sun, 25 Aug 2013 11:43:00 -0700</pubDate></item><item><title>Team culture for free</title><description>&lt;p&gt;The other day I was talking to &lt;a href="https://twitter.com/df07"&gt;David&lt;/a&gt;, learning whatever I could about how he works his VPEngineering magic over at &lt;a href="http://stackexchange.com/"&gt;Stack Exchange&lt;/a&gt;. Technical interviews came up. He was interested in new types of interview questions, not just the standard difficult programming challenges. He put it something like this:&lt;/p&gt;

&lt;blockquote&gt;We kinda get the whole &amp;ldquo;devs who can solve really hard technical problems&amp;rdquo; thing for free. We just hire the top Stack Overflow users.&lt;/blockquote&gt;

&lt;p&gt;Tough luck, I know.&lt;/p&gt;

&lt;h1&gt;Money for nothing and your devs for free&lt;/h1&gt;

&lt;p&gt;Stack&amp;rsquo;s entire company is built around surfacing experts who offer great answers to hard questions. It&amp;rsquo;s only natural their own dev team will have first pick from — and deep insight into — &lt;a href="http://stackoverflow.com/users?tab=reputation&amp;amp;filter=all"&gt;a pool of hard problem solvers&lt;/a&gt; they&amp;rsquo;ve been obsessively building since day one. I don&amp;rsquo;t know if I&amp;rsquo;d call that &amp;ldquo;free&amp;rdquo; (probably actually costs millions of dollars), but it&amp;rsquo;s enviable.

&lt;/p&gt;&lt;p&gt;It&amp;rsquo;s team culture — extremely valuable culture — that just sorta &lt;em&gt;falls out&lt;/em&gt; of their mission.&lt;/p&gt;

&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/czVmrbvzf/night-goes-on.png"/&gt;&lt;br/&gt;&lt;em&gt;&amp;ldquo;No, wait wait. I&amp;rsquo;m being serious for a second. I really love you guys.&amp;rdquo;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That had me thinking when our discussion shifted to encouraging a culture of employee growth.&lt;/p&gt;

&lt;h1&gt;Growth mindset for Khan Academy developers&lt;/h1&gt;

&lt;p&gt;At Khan, our entire company is obsessively focused on helping students grow. Compassion for students who don&amp;rsquo;t know how to divide decimals &lt;em&gt;yet&lt;/em&gt;. Belief that a kid struggling near the bottom of the class can soon be at the top if given the right mentoring. Embodiment of a &lt;a href="http://mindsetonline.com/whatisit/about/index.html"&gt;growth mindset&lt;/a&gt;, the idea that talent is not simply fixed but can be developed through hard work.&lt;/p&gt;

&lt;p&gt;We try to build this growth mindset into our product — and hopefully our users — all day e'ry day. It&amp;rsquo;s only natural we&amp;rsquo;d bring the same attitude into our team&amp;rsquo;s inner workings.&lt;/p&gt;

&lt;p&gt;I think we do a uniquely good job growing our own developers. I&amp;rsquo;ve noticed this growth in certain individuals since starting at KA (personally seen &lt;a href="http://en.wikipedia.org/wiki/Impostor_syndrome"&gt;the impostor syndrome&lt;/a&gt; banished from a talented developer&amp;rsquo;s head at least three times). But it was really drilled into me during the 1-on-1 talks I just had with each of this summer&amp;rsquo;s interns. They &lt;em&gt;raved&lt;/em&gt; about how much they&amp;rsquo;re learning, and not just technically. I attribute this to the growth-focused attitudes of their mentors.&lt;/p&gt;

&lt;p&gt;This enviable culture — extremely valuable culture — has just sorta &lt;em&gt;fallen out&lt;/em&gt; of our mission.&lt;/p&gt;

&lt;p&gt;I feel proud that we&amp;rsquo;re becoming a place that turns good devs into great devs and great devs into &lt;a href="http://www.randsinrepose.com/archives/2005/03/20/free_electron.html"&gt;free electrons&lt;/a&gt;. But I should probably just feel lucky, because this attitude has been sewn into Khan Academy from the get-go.&lt;/p&gt;

&lt;hr style="margin-left:33%;width:33%;"&gt;

&lt;p&gt;&lt;em&gt;You should probably &lt;a href="https://www.khanacademy.org/careers/interns"&gt;apply for a Khan Academy internship&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</description><link>https://bjk5.com/post/57899463280</link><guid>https://bjk5.com/post/57899463280</guid><pubDate>Sat, 10 Aug 2013 12:07:00 -0700</pubDate></item><item><title>How we ran the second Khan Academy Healthy Hackathon</title><description>&lt;p&gt;I heard from a number of people who got value out of last year&amp;rsquo;s &amp;ldquo;&lt;a href="http://bjk5.com/post/26810034751/how-we-ran-the-first-khan-academy-healthy-hackathon"&gt;How We Hackathon&lt;/a&gt;&amp;rdquo; post (that number, for those curious, is &amp;lsquo;3&amp;rsquo;). Here goes round two.&lt;/p&gt;

&lt;p&gt;Just like before, our hackathons&amp;rsquo; defining characteristics are: &lt;strong&gt;act like a healthy hacker&lt;/strong&gt;, &lt;strong&gt;&amp;ldquo;hacking&amp;rdquo; means creating (not just coding)&lt;/strong&gt;, and &lt;strong&gt;everyone demos&lt;/strong&gt;. Those looking for more details and a strong sedative can read my email below for more.&lt;/p&gt;

&lt;h1&gt;&lt;code&gt;diff last_year this_year&lt;/code&gt;&lt;/h1&gt;

&lt;img align="right" class="rightInset small" src="http://static.tumblr.com/9hgswys/JnEmqbsip/4b05c6b4f1ae11e2984222000ae801ef_7.jpg"/&gt;

&lt;ul&gt;
&lt;li&gt;
We stretched the hackathon over the whole weekend this time. Friday 4pm to Sunday 4pm instead of ending on Saturday. Teams just needed more time to hack.
&lt;/li&gt;

&lt;li&gt;We had more Roaming Hackers™ helping out anyone in need of advice. Was even more important this time 'round since we were lucky to have visitors from the &lt;a href="http://jamiealexandre.com/blog/2012/12/12/ka-lite-offline-khan-academy/"&gt;KA Lite&lt;/a&gt; team.
&lt;/li&gt;

&lt;li&gt;
Instead of judges choosing winners, &lt;a href="http://missmarcialee.com"&gt;Marcia&lt;/a&gt; had the wise idea of giving everybody who demos one ticket to a raffle along with 3 extra tickets they must award to teams or persons behind especially impressive projects. I think this scheme went really well. It highly rewarded deserving hackers while giving everyone a chance to win. It left me feeling &lt;em&gt;much&lt;/em&gt; better than last year&amp;rsquo;s judging.
&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;What was built?&lt;/h1&gt;

&lt;p&gt;From video lessons of hand-&lt;strike&gt;assembling&lt;/strike&gt;soldering a working computer to multiplayer math games to drastic improvements to Khan Academy&amp;rsquo;s internationalization pipeline to proofs of concept that we had, weeks ago, decided were problems so difficult we couldn&amp;rsquo;t tackle 'em for another 6 months&amp;hellip;I can&amp;rsquo;t simply summarize what I just saw demo&amp;rsquo;d a few hours ago. I&amp;rsquo;ll be blogging about my project, so here&amp;rsquo;s where I &lt;em&gt;&lt;small&gt;ever so subtly&lt;/small&gt;&lt;/em&gt; encourage others to do the same.&lt;/p&gt;

&lt;p&gt;The amount of value — value that&amp;rsquo;ll make its way to real students — created since 4pm Friday has humbled and energized me. Thank you to everyone involved.&lt;/p&gt;

&lt;h1&gt;Wanna run a hackathon of your own?&lt;/h1&gt;

&lt;p&gt;Feel free to borrow liberally from our planning communiqué:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;To: all@khanacademy.org&lt;/em&gt;&lt;br/&gt;
&lt;em&gt;Subject: Oh, the Features You&amp;rsquo;ll Hack!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You&amp;rsquo;ve heard all the whispers,&lt;br/&gt;
The rumors are true.&lt;br/&gt;
Two weekends from now,&lt;br/&gt;
Healthy Hackathon Part Deux.&lt;br/&gt;&lt;br/&gt;

You&amp;rsquo;ll think up some hacks. Consider the code.&lt;br/&gt;
About some you will say, &amp;ldquo;App Engine can&amp;rsquo;t handle that load.&amp;rdquo;&lt;br/&gt;
With your head full of brains and your scripts full of TODOs,&lt;br/&gt;
you&amp;rsquo;ve come to build what you want, to ship what you choose.&lt;br/&gt;
&lt;/p&gt;

&lt;p&gt;[Cue epic music.]&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;♤✌☭☂♘ (The Second) Khan Academy Healthy Hackathon. 7/19 - 7/21. ♘☂☭✌♤&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I wasn&amp;rsquo;t here last year. WTF is a hackathon?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A chance to get together with teammates and build absolutely anything you want that&amp;rsquo;s connected to KA. You don&amp;rsquo;t have to be a coder! This is open to the entire company. We&amp;rsquo;re all about making, not just coding — and it doesn&amp;rsquo;t matter how wild or crazy your idea is.&lt;/p&gt;

&lt;p&gt;Time to start letting your brain wander.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But WTF are we hacking on?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Anything related to KA. Below is a grabbag of examples, but the best ideas will come from you. Some of the following actually shipped last year.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Make the next level of &lt;a href="https://www.khanacademy.org/cs/tic-tac-toe-ception/1676336506"&gt;Tic-tac-toe-ception&lt;/a&gt;. &amp;ldquo;We need to go deeper.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Create your own tutorial full of videos and interactive content for learning sign language.&lt;/li&gt;
&lt;li&gt;Build a brand new exercise tool that teaches students how to read music, then release it on &lt;a href="http://www.khanacademy.org/labs"&gt;www.khanacademy.org/labs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Write a blog post about what you do at KA.&lt;/li&gt;
&lt;li&gt;Master hive enough 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 your first perseus or interactive math exercise.&lt;/li&gt;
&lt;li&gt;Release a widget that lets anyone add Khan Academy profile flair to their sites/blogs. Then blog about it.&lt;/li&gt;
&lt;li&gt;Learn any programming language you want by creating a wrapper for our API in said language. &lt;a href="http://torso.me/chicken"&gt;Chicken chicken chicken&lt;/a&gt; counts.&lt;/li&gt;
&lt;li&gt;Add an API to our CS platform that lets users play sounds.&lt;/li&gt;
&lt;li&gt;Add a banner to the top of every KA page that reads, &amp;ldquo;A personal appeal from Salman Khan&amp;rdquo; (spoiler: this was done last year).&lt;/li&gt;
&lt;li&gt;&lt;a href="http://benalpert.com/2012/08/24/what-i-did-at-khan-academy-2012.html#hackathon"&gt;Ship a new careers page to the live site and a new build script that we&amp;rsquo;ve always wanted and a new embedded calculator for exercise users.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://media.tumblr.com/tumblr_m6v3d5FEXx1qhsyf1.png"&gt;Design a sweet team t-shirt&lt;/a&gt; and get it printed for everyone before the first night ends.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;hellip;or whatever. Here&amp;rsquo;s &lt;a href="https://trello.com/board/khan-academy-healthy-hackathon/4fed76fc065593df077466de"&gt;last year&amp;rsquo;s board&lt;/a&gt; full of ideas, things that were demo&amp;rsquo;d, and stuff that was shipped.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Just WTF is so different about our hackathon?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s not just for coders. Draw a mural on our walls. Fill in a spreadsheet. Moderate our discussion boards. Write a KA song. As long as you&amp;rsquo;re creating something that you can show off to the rest of the group, you&amp;rsquo;re hacking and you&amp;rsquo;re in.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s healthy. We reject the whole red bull, 3am, alcohol-powered images of hackathons. We invest in employees for the long-term. We&amp;rsquo;ll eat well and get sleep.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;K. WTF am I supposed to do before Friday?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add your ideas to &lt;a href="https://trello.com/board/healthy-hackathon-part-deux/51d4dc53cd3806ef480007d7"&gt;the Trello board&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Commit to an idea if you&amp;rsquo;re sold.&lt;/li&gt;
&lt;li&gt;Start lobbying others to join your team. We humbly suggest using this as a chance to work with people you don&amp;rsquo;t work with every day.&lt;/li&gt;
&lt;li&gt;Do not start hacking yet. Emily. Cheater.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;WTF happened last year?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Well, for one, a shocking amount of cool stuff was built. For two, we wished we had a bit more time. So this one&amp;rsquo;s extended. For three, we needed another roaming hacker* or two to help out teams in need. If you&amp;rsquo;re interested in helping, please let me know.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who TF is invited?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;KA employees, past KA interns (lookin&amp;rsquo; at you, David), and the whole KA Lite team.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WTF. Tell me more.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rules&lt;/strong&gt;&lt;/p&gt;
&lt;ul&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;rsquo;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;/ul&gt;

&lt;p&gt;&lt;strong&gt;Schedule&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;4:00pm Friday the 19th: Start. Our office. We&amp;rsquo;ll kick off by letting idea owners pitch others in an attempt to get help.&lt;/li&gt;
&lt;li&gt;11:45pm Friday: Everyone kicked out, doors locked. Get a healthy night&amp;rsquo;s sleep or we&amp;rsquo;ll steal your computers.&lt;/li&gt;
&lt;li&gt;9:30am Saturday: Doors reopen.&lt;/li&gt;
&lt;li&gt;11:45pm Saturday: Kicked out, doors locked.&lt;/li&gt;
&lt;li&gt;9:30am Sunday: Doors reopen.&lt;/li&gt;
&lt;li&gt;4:00pm Sunday: Pencils down. Keyboards disconnected. Every team will demo — expect for the whole thing to end around 6.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Eats&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Dinner Friday night, lunch and dinner Saturday, and lunch Sunday. All included. Plus snackies the whole time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Teams&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We highly encourage hackers to work in teams, but try to keep team size limited to 3 or 4.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prizes&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Judging rules will be shared when the hackathon starts. Prizes include at least one [redacted] and one [redacted]. Maybe two or there [redacted]s.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do I have to attend? This is my weekend. FOR THE LOVE OF THE GODS LEAVE ME ALONE.&lt;/strong&gt;&lt;/p&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;/p&gt;

&lt;p&gt;&lt;strong&gt;Ben, WTF, do you really only send emails all day?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes. But not during the hackathon. Not. during. the. hackathon.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;-Ben&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;* Last year Alpert was our &amp;ldquo;roaming hacker.&amp;rdquo; He went from team to team helping anybody who needed helping. Without him things probably would&amp;rsquo;ve devolved into a lord of the flies type situation, and quick. We need more roaming hackers this year. Email me.&lt;/p&gt;
&lt;/blockquote&gt;</description><link>https://bjk5.com/post/56123354891</link><guid>https://bjk5.com/post/56123354891</guid><pubDate>Sun, 21 Jul 2013 22:56:00 -0700</pubDate></item><item><title>The App Engine Way</title><description>&lt;img class="rightInset small" align="right" src="http://static.tumblr.com/9hgswys/XiCmp67nf/photo.jpg"/&gt;

&lt;p&gt;The phrase &amp;ldquo;the App Engine way&amp;rdquo; is muttered around our office and wielded in &lt;a href="http://bjk5.com/post/3994859683/code-reviews-as-relationship-builders-a-few-tips"&gt;our code reviews&lt;/a&gt;. As in, &amp;ldquo;Yeah, I know it&amp;rsquo;s counterintuitive, but that&amp;rsquo;s the App Engine way.&amp;rdquo;&lt;/p&gt;

&lt;p&gt;It boils down to two principles about structuring data:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Denormalize&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Do lots of work when writing to make reads fast&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These aren&amp;rsquo;t obvious. It won&amp;rsquo;t be obvious to folks from SQL land that App Engine&amp;rsquo;s performance is tied so tightly to these ideas. It won&amp;rsquo;t be obvious that, since &lt;code&gt;JOIN&lt;/code&gt;s don&amp;rsquo;t exist, it&amp;rsquo;s really easy to write a bunch of code that &lt;code&gt;1) loads a Monkey entity, 2) looks at Monkey.zoo_id, then 3) queries for the monkey's Zoo&lt;/code&gt;&amp;hellip;and that that&amp;rsquo;s bad.&lt;/p&gt;

&lt;p&gt;So we use &amp;ldquo;the App Engine way&amp;rdquo; to remind ourselves of these fuzzy guidelines and spread &amp;lsquo;em to newcomers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Denormalize your data&lt;/strong&gt; — as in your Notification models should have all the data necessary to render themselves. They shouldn&amp;rsquo;t just point to the thing that triggered a notification. As in whenever you&amp;rsquo;re sitting around wishing you could just &lt;code&gt;JOIN Zoo ON Zoo.id = Monkey.zoo_id&lt;/code&gt; you should actually be storing all of &lt;code&gt;Zoo&lt;/code&gt;&amp;rsquo;s properties on each and every &lt;code&gt;Monkey&lt;/code&gt;. Got billions of &lt;code&gt;Monkeys&lt;/code&gt;? Who cares, copy the &lt;code&gt;Zoo&lt;/code&gt; data a billion times. &amp;ldquo;Storage is cheap&amp;rdquo; and all that.

&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Do lots of work on write to make reads fast&lt;/strong&gt; — as in your &lt;code&gt;Post&lt;/code&gt; models should have their &lt;code&gt;reply_count&lt;/code&gt; and &lt;code&gt;vote_count&lt;/code&gt; and &lt;code&gt;flag_count&lt;/code&gt; and &lt;code&gt;monkey_count&lt;/code&gt; stored as properties on the Post itself. As in they should be updated every time a new &lt;code&gt;reply&lt;/code&gt;, &lt;code&gt;vote&lt;/code&gt;, &lt;code&gt;flag&lt;/code&gt;, or &lt;code&gt;monkey&lt;/code&gt; is brought into this wonderful world. As in any time you&amp;rsquo;re sitting around googling for App Engine&amp;rsquo;s version of &lt;code&gt;SUM()&lt;/code&gt;, &lt;code&gt;COUNT()&lt;/code&gt;, and &lt;code&gt;AVG()&lt;/code&gt;, realize you should just be updating these aggregates every time they&amp;rsquo;re modified. As in whenever you write to a &lt;code&gt;Zoo&lt;/code&gt; entity, kick off a task to update all denormalized copies on your &lt;code&gt;Monkeys&lt;/code&gt;. Who cares if writes are a bit slower? This makes reads blazing fast.&lt;/p&gt;

&lt;p class="center"&gt;&lt;img src="http://static.tumblr.com/9hgswys/ucImp66ye/queries.png"/&gt;&lt;br/&gt;&lt;em&gt;Use &lt;a href="http://bjk5.com/post/6944602865/google-app-engine-mini-profiler"&gt;the mini profiler&lt;/a&gt; or &lt;a href="https://developers.google.com/appengine/docs/python/tools/appstats"&gt;appstats&lt;/a&gt; to see a waterfall graph for your data-loading RPCs.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A simple rule of thumb&lt;/strong&gt; for knowing when you&amp;rsquo;re done:&lt;/p&gt;

&lt;blockquote&gt;If you really care about performance, you should be able to create all of the data queries for an &lt;em&gt;entire&lt;/em&gt; web request &lt;em&gt;just&lt;/em&gt; from incoming GET/POST data and the currently logged-in user&amp;rsquo;s properties — no query-to-get-the-data-for-another-query allowed.&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;This is the price of entry&lt;/strong&gt; for access to one big, enormous, whopper of a benefit: you get &lt;a href="https://developers.google.com/appengine/docs/python/datastore/#Comparison_with_Traditional_Databases"&gt;a datastore with consistent read/write performance no matter how big your data set becomes&lt;/a&gt;. Have a query that returns 10 items from a set of 10,000? Relax knowing that after your company blows up in 6 months, you&amp;rsquo;ll get the exact same speed when pulling 10 items from a set of 10,000,000,000.&lt;/p&gt;</description><link>https://bjk5.com/post/54202245691</link><guid>https://bjk5.com/post/54202245691</guid><pubDate>Sat, 29 Jun 2013 13:16:00 -0700</pubDate></item><item><title>Getting your team to adopt new technology</title><description>&lt;p&gt;Recently two Khan Academy devs dropped into our team chat and said they were gonna use &lt;a href="http://facebook.github.io/react/"&gt;React&lt;/a&gt; to write a new feature. They even hinted that we may want to adopt it product-wide.&lt;/p&gt;

&lt;blockquote&gt;&amp;ldquo;The library is only a week old. It&amp;rsquo;s a brand new way of thinking about things. We&amp;rsquo;re the first to use it outside of Facebook. Heck, even the React devs were surprised to hear we&amp;rsquo;re using this in production!!!&amp;rdquo;&lt;/blockquote&gt;

&lt;p&gt;Great. And so my stodgy old brain entered Phase 1.&lt;/p&gt;

&lt;p&gt;Here&amp;rsquo;s a sneak peek for you, brave proposer of new tech, inside the heads of your teammates.&lt;/p&gt;

&lt;h1&gt;The 8 phases your teammates&amp;rsquo; brains go through when you propose a scary tech switch:&lt;/h1&gt;

&lt;figure data-orig-height="555" data-orig-width="267" data-orig-src="http://static.tumblr.com/9hgswys/Xoimow08p/photo.jpg"&gt;&lt;img class="rightInset" style="float:right;width:267px;height:555px;" src="https://64.media.tumblr.com/36bd66a1bd73c47615993a1aea918750/b98fc8d4a7607fda-e3/s540x810/1aaed690f1e073d50fa15bb87848dd7c33998367.jpg" data-orig-height="555" data-orig-width="267" data-orig-src="http://static.tumblr.com/9hgswys/Xoimow08p/photo.jpg"/&gt;&lt;/figure&gt;&lt;ol&gt;&lt;li&gt;Someone in chat is talking about some new thing called &amp;ldquo;React.&amp;rdquo; It&amp;rsquo;s probably used for mapreduces or something. I&amp;rsquo;m hungry, gonna grab dinner.&lt;br/&gt;&lt;br/&gt;&lt;/li&gt;

&lt;li&gt;N/M LOL, the library they&amp;rsquo;re interested in is client-side magic that&amp;rsquo;s only a &lt;em&gt;week&lt;/em&gt; old and would represent an entirely new way of writing our app. Plus it&amp;rsquo;s the weekend. Nothing wrong w/ a little imagination and wishful thinking.&lt;br/&gt;&lt;br/&gt;&lt;/li&gt;

&lt;li&gt;OK I think someone just actually pushed this crazy javascript library to master. Surely you&amp;rsquo;re joking, &lt;a href="https://sophiebits.com/"&gt;Ms. Alpert&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;&lt;/li&gt;

&lt;li&gt;WTF, these people are serious. Don&amp;rsquo;t we have bigger problems to solve? Do we really need to inherit all the issues that come w/ a whole brand new set of client-side coding patterns right now? Time to demand some well-thought-out answers.&lt;br/&gt;&lt;br/&gt;&lt;/li&gt;

&lt;li&gt;BUT but but. I get that you love the library and it&amp;rsquo;s cool and it actually does make a difference for us and our users. But what about our i18n code? But what about our server-side templates? But what about our entire existing codebase? But what about our onboarding process? But have you thought about other alternatives? But why now?&lt;br/&gt;&lt;br/&gt;&lt;/li&gt;

&lt;li&gt;Hmm. I see value here. Lots of devs are affected by this, though — do they know about it? Who&amp;rsquo;s owning this transition? What&amp;rsquo;s the plan for old code? Is there a rule of thumb for new code?&lt;br/&gt;&lt;br/&gt;&lt;/li&gt;

&lt;li&gt;I see the big picture and how the transition might work. Good luck, you&amp;rsquo;re now directly responsible.&lt;br/&gt;&lt;br/&gt;&lt;/li&gt;

&lt;li&gt;I sure am glad I thought of this whole React thing. I am so, so brilliant.&lt;/li&gt;
&lt;/ol&gt;&lt;h1&gt;Now you know what you&amp;rsquo;re up against.&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Your job is to create a wormhole that transports a developer&amp;rsquo;s brain from Phase 1 to Phase 8 and then shove everyone on your team through it.&lt;/strong&gt; Here&amp;rsquo;s how.&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;Know that your proposal is scary, but not because it&amp;rsquo;s new tech. It&amp;rsquo;s scary because of uncertainty about all your old code and habits. So you can&amp;rsquo;t bring somebody to Phase 8 just by selling them on benefits of the new tech. You have to sell how well you&amp;rsquo;ve prepared a transition for your team.&lt;br/&gt;&lt;br/&gt;&lt;/li&gt;

&lt;li&gt;Schedule a plan to help others understand, share your proposal, listen to concerns, and then communicate a decision.&lt;br/&gt;&lt;br/&gt;&lt;/li&gt;

&lt;li&gt;For every word you spend talking about the tech, spend two talking about your transition plans. Trying out the tech on one live feature before you want to suggest it for everybody? Say that. Tell the team exactly when you&amp;rsquo;ll either remove the experimental tech or talk more about team-wide adoption.&lt;br/&gt;&lt;br/&gt;&lt;/li&gt;

&lt;li&gt;When doubters pile on, tell them exactly when you&amp;rsquo;ve scheduled time to discuss more. You&amp;rsquo;re trying to be brilliant and experiment — not the time to be burdened by early doubters. Sidestep them. &amp;ldquo;You&amp;rsquo;re absolutely right, there are a million problems. I&amp;rsquo;m working on a blog post right now to help others understand React, and I already scheduled a tech talk next Friday for us to go over all concerns before any big decision is made.&amp;rdquo;&lt;br/&gt;&lt;br/&gt;&lt;/li&gt;

&lt;li&gt;Stomp down every conceivable objection before others even get a chance to raise their hand. By the time you want to propose a team-wide change you&amp;rsquo;ll have been thinking about this longer than anyone. &lt;b&gt;Show your team that.&lt;/b&gt; Mention every objection upfront. Mention the alternatives you&amp;rsquo;ve considered. Honestly acknowledge pain points. Don&amp;rsquo;t wait for others to do it for you.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;You&amp;rsquo;ll be seen as the clear owner of this decision. Nobody will want to waste their time agonizing over objections because you&amp;rsquo;ve already done that for them and provided answers.&lt;/p&gt;

&lt;p&gt;Exactly how it should be.&lt;/p&gt;

&lt;h1&gt;Imagine you drop into your team&amp;rsquo;s chat one day&amp;hellip;&lt;/h1&gt;

&lt;p&gt;&amp;hellip;and you write this:&lt;/p&gt;

&lt;blockquote&gt;There&amp;rsquo;s a new JS library out called React. It&amp;rsquo;s promising but a bit scary. I&amp;rsquo;m playing with it for my new feature to try to learn more, and I think it&amp;rsquo;s possible we&amp;rsquo;ll want to use it everywhere in the future. Before making a team-wide decision like that, I scheduled a tech talk on Friday for us to discuss. I&amp;rsquo;m writing up a blog post before then that&amp;rsquo;ll teach others about the library and why I chose it. Read it, then bring all your concerns on Friday. I&amp;rsquo;ll have a plan for transitioning old code if we want to move forward, and if we decide this isn&amp;rsquo;t right for us I&amp;rsquo;ll undo my experiment.&lt;/blockquote&gt;

&lt;p&gt;&amp;hellip;well. That&amp;rsquo;s a wormhole capable of transporting even your stodgiest, oldest teammates&amp;rsquo; brains straight to &amp;ldquo;Phase 8: I thought of this and I am so brilliant.&amp;rdquo;&lt;/p&gt;

&lt;h1&gt;That reminds me: look'it our smooth math content editor&lt;/h1&gt;

&lt;p class="center"&gt;&lt;figure class="tmblr-full" data-orig-height="400" data-orig-width="625" data-orig-src="http://static.tumblr.com/9hgswys/7bkmovws6/monkeys.gif?nocache"&gt;&lt;img src="https://64.media.tumblr.com/c90aa21a534c9674b8049d4eeb911b89/b98fc8d4a7607fda-fd/s540x810/25fa3ca99291e8dbfcded3493cb220a0f4c3f0e4.gif" data-orig-height="400" data-orig-width="625" data-orig-src="http://static.tumblr.com/9hgswys/7bkmovws6/monkeys.gif?nocache"/&gt;&lt;/figure&gt;&lt;br/&gt;&lt;em&gt;All the math formatting in this very serious example makes it hard to preview the content as it is being edited.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Our renderer, post-React, is on the left. A typical math editor&amp;rsquo;s preview is on the right. &lt;a href="https://sophiebits.com/2013/06/09/using-react-to-speed-up-khan-academy.html"&gt;Sophie Alpert&lt;/a&gt; and &lt;a href="http://joelburget.com/react/"&gt;Joel Burget&lt;/a&gt; can tell you more about how they&amp;rsquo;re using React to make this so buttery. It&amp;rsquo;s absolutely brilliant. I&amp;rsquo;m just glad I thought of it.&lt;/p&gt;

&lt;hr style="margin-left:33%;width:33%;"&gt;&lt;p&gt;&lt;em&gt;Thanks go to Sophie Alpert for draft-reading and to Fleetwood for bandana-wearing.&lt;/em&gt;&lt;/p&gt;</description><link>https://bjk5.com/post/53742233351</link><guid>https://bjk5.com/post/53742233351</guid><pubDate>Mon, 24 Jun 2013 00:11:00 -0700</pubDate></item><item><title>Public speaking is a chance to make myself uncomfortable</title><description>&lt;p&gt;Giving public talks is one of those few activities (&lt;em&gt;see: flying&lt;/em&gt;) that causes an enormous surge of nervous adrenaline to course through my body.*&lt;/p&gt;

&lt;p&gt;But at the same time I love sharing Khan Academy&amp;rsquo;s work. So I&amp;rsquo;ve been trying to get better. Thankfully, we now have this great &amp;ldquo;grillmasters&amp;rdquo; event in our office where anybody on the team can practice any speech and get constructive feedback from everyone, including &lt;a href="http://www.youtube.com/watch?v=gM95HHI4gLk"&gt;one of the best public speakers around&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here&amp;rsquo;re the highlights of Sal&amp;rsquo;s speaking advice for me so far:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&amp;ldquo;Smile so much people think you&amp;rsquo;re drunk.&amp;rdquo; (later revised to &amp;ldquo;Smile w/ your eyes,&amp;rdquo; presumably after I creeped him out trying to drunkenly smile)&lt;br/&gt;&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Know that you&amp;rsquo;re not wasting anybody&amp;rsquo;s time. The audience wants to be there.&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Heh. Both are big challenges for me, but I put these tips to the test recently while giving &lt;a href="http://bjk5.com/talks/from-data-to-decisions"&gt;a talk about how Khan Academy uses data — with a focus on mistakes we&amp;rsquo;ve made along the way&lt;/a&gt; — and ended up having a blast. If you watch the video you&amp;rsquo;ll see that I fail miserably at the smiling thing. But I&amp;rsquo;m getting a bit better at not speeding through my speech at a million words a minute for fear of wasting somebody&amp;rsquo;s precious time.&lt;/p&gt;

&lt;p&gt;Still a long way to go. But I relish the fact that public speaking gives me a chance to be uncomfortable. Feels healthy.&lt;/p&gt;

&lt;p class="center"&gt;&lt;a href="http://bjk5.com/talks/from-data-to-decisions"&gt;&lt;img src="http://static.tumblr.com/9hgswys/vtMmnsbbv/screen_shot_2013-06-02_at_2.22.45_pm.png"/&gt;&lt;/a&gt;&lt;br/&gt;&lt;em&gt;The video of my dog was &lt;a href="http://bjk5.com/talks/from-data-to-decisions"&gt;the talk&amp;rsquo;s&lt;/a&gt; biggest hit.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In case you&amp;rsquo;re preparing for a talk and in the same boat, I&amp;rsquo;m super grateful for these resources: &lt;a href="http://blog.bufferapp.com/what-happens-to-our-brains-when-we-have-stage-fright-the-science-of-public-speaking"&gt;What happens to our brains when we have stage fright&lt;/a&gt;, &lt;a href="http://zachholman.com/posts/slide-design-for-developers/"&gt;Slide Design for Developers&lt;/a&gt;, and Scott Hanselman&amp;rsquo;s &lt;a href="http://www.speakinghacks.com/"&gt;Speaking Hacks&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Better yet, if you have tips, I&amp;rsquo;m all ears.&lt;/p&gt;

&lt;hr style="width:33%;margin-left:33%"&gt;

&lt;p&gt;&lt;em&gt;* &lt;a href="http://www.hanselman.com/"&gt;Scott Hanselman&lt;/a&gt; is an inspiration in many ways. In this case I&amp;rsquo;m thanking him for his openness about being a type I diabetic — like me. The pre-speech adrenaline I refer to above causes my blood sugar to spike wildly. I only drank water the morning before my last speech, yet my blood sugar shot from ~100 mg/dl to 380+ in the minutes before I went on stage. This can have frustrating effects on your brain and body. Scott&amp;rsquo;s example as a terrific speaker and openness about being diabetic (he&amp;rsquo;s checked his blood sugar &lt;b&gt;on stage&lt;/b&gt; before) helps and inspires me to be more open.&lt;/em&gt;&lt;/p&gt;</description><link>https://bjk5.com/post/52006667768</link><guid>https://bjk5.com/post/52006667768</guid><pubDate>Sun, 02 Jun 2013 15:34:00 -0700</pubDate></item><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;rsquo;s grown to twenty-three and when the summer intern zenith hits we&amp;rsquo;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;rsquo;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;rsquo;m seeking stories from folks who&amp;rsquo;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;rsquo;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;rsquo;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;rsquo;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;rsquo; focus, blah blah blah BLAH we&amp;rsquo;ve all heard it. Everybody agrees.&lt;/p&gt;

&lt;p&gt;It&amp;rsquo;s the other 15% of the day that&amp;rsquo;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;p&gt;There&amp;rsquo;s leeway here, so for anybody else who&amp;rsquo;s trying to figure it out, here&amp;rsquo;s how I&amp;rsquo;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;rsquo;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;rsquo;t personally think this would work if I showed up at just anybody&amp;rsquo;s desk. He&amp;rsquo;s unique, I&amp;rsquo;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;rsquo;d normally assume that this would overload me and I&amp;rsquo;d have to turn everybody down, but I&amp;rsquo;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;rsquo;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;rsquo;d shirked more important duties? Over a year ago. I no longer think it&amp;rsquo;s wise. &amp;ldquo;You must stop coding.&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;As confused as me?&lt;/h1&gt;

&lt;p&gt;&lt;a href="http://www.randsinrepose.com/archives/2007/02/07/technicality.html"&gt;Rands&amp;rsquo; Technicality&lt;/a&gt; is the authoritative piece on this search for maker/manager balance. He opens with &amp;ldquo;&lt;em&gt;Stop coding.&lt;/em&gt;&amp;rdquo; By the end he commands, &amp;ldquo;&lt;em&gt;Don’t stop developing.&lt;/em&gt;&amp;rdquo;&lt;/p&gt;

&lt;p&gt;What&amp;rsquo;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>https://bjk5.com/post/50847975319</link><guid>https://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;ldquo;Managing at Twitter&amp;rdquo; 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;ldquo;My old manager used to hold 1:1 meetings with me. My new one doesn&amp;rsquo;t believe in them. Which is it? Should I be having 1:1 meetings with my manager at Twitter?&amp;rdquo;&lt;/div&gt;&lt;/blockquote&gt;

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

&lt;blockquote class="twitter-tweet tw-align-center"&gt;&lt;p&gt;Working on v1.1 of &amp;ldquo;Managing at Twitter&amp;rdquo; that I teach to managers at Twitter. - thought it would end up being a 2hr class &amp;amp; it&amp;rsquo;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;rsquo;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;ldquo;I&amp;rsquo;m your mentor, I&amp;rsquo;m here to help&amp;rdquo; on the first day.&lt;/strong&gt;&lt;br/&gt;
Don&amp;rsquo;t have to use those words, but you get the picture. Leave no doubt about what your intern should do if they&amp;rsquo;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;rsquo;ve done it before, we&amp;rsquo;ll do it again. Well-defined starter projects are the bread'n'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;rsquo;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;rsquo;s-eye view of your group&amp;rsquo;s projects and priorities. If we hired right, they&amp;rsquo;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;rsquo;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;rsquo;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;rsquo;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;rsquo;s official living document is here&lt;/a&gt;. I&amp;rsquo;m sure it&amp;rsquo;ll change soon enough. I&amp;rsquo;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>https://bjk5.com/post/45981136553</link><guid>https://bjk5.com/post/45981136553</guid><pubDate>Fri, 22 Mar 2013 02:13:00 -0700</pubDate></item></channel></rss>