Khan Academy's engineering team writes about its tech stack, including Go, Kotlin, React Native, and Google App Engine.
HN commenters recommend it for App Engine and React topics, cite the Go rewrite post, and mention it in hiring threads.
> It's been found that resource concatenation is still more efficient http://engineering.khanacademy.org/posts/js-packaging-http2....*
for a page with 2.4MB of JS spread over 296 files.
And, notably, the article doesn't advocate for serving individual files in the first place, but instead says that some level of grouping is likely advantageous, but http2 gives new opportunities which will need to be explored, like grouping by level of churn in libraries or by units of functionality
> And 'building for http2' seems to be advocating hashes in filenames without neccesarily walking the dependencies
I believe you misread. They use a shallow tree in their scout js file; all of the resources a page will need are declared there and nothing is loaded in succession.
> Manifest files are a bad idea, except perhaps for instructing webservers to tell browsers to preemptively download files. AFAIK there isn't a standard for this yet so a manifest doesn't solve the problem
I'm not sure what this means. The manifest is generated by the build process. There is no standard for dependency manifests, sure, but there's no reason you can't whip a reasonable one up that a simple server module could understand if you wanted to add push support. Eventually the cow paths will be paved and we'll come up with a more standardized approach (or approaches) to that kind of manifest.
Khan Academy | Mountain View, CA or REMOTE | full-time and internships
We're a small, non-profit tech startup bringing a free, world-class education to anyone, anywhere.
Millions of people use our free educational platform to learn every month. The testimonials at https://www.khanacademy.org/stories will give you a feel for just how intense an impact Khan Academy has on the lives of folks in all sorts of varied situations.
We face intense technical challenges in providing access to our educational content (everything from videos to interactive content) to students across the world, in and out of classrooms, in all the most important languages. We use our data to personalize students' learning and continually improve our educational content + the tools we provide content creators. And we need more help.
We've made some great hires off HN and would love to make more (especially if you're a designer or Android dev, wink wink, we're investing heavily: http://engineering.khanacademy.org/posts/starting-android.htm)
Best way to apply is at https://www.khanacademy.org/careers, but if you email me w/ a subject line that mentions 'monkeys' somewhere I'm partial to those, too. ben@...
Khan Academy | Mountain View, CA and REMOTE USA/CANADA | Senior Backend / Fullstack | https://khanacademy.org/careers
We're a non-profit with a mission to provide a free, world-class education to anyone, anywhere. It's a big mission that we're taking on step by step. While we want anyone to be able to get a great education independently, we've been focusing a lot on trying to help teachers working in their classrooms (and a lot of teachers and parents are using Khan away from their classrooms right now!)
Our site has been built on Python 2 and Google App Engine for its first 10 years of existence. We're now in the midst of a rebuild in Go (still on App Engine).[1] Parts of that new Go-based infrastructure are already running in production.
To say that this is an exciting time for us would be an understatement, I think, but we continue to have working sustainably as an engineering principle. (Our principles are available publicly[2].)
[1]: http://engineering.khanacademy.org/posts/goliath.htm
[2]: https://docs.google.com/presentation/d/1ZQ-HTuH38L8sf4ZObfJNlESpzYIPAP6QFe30qOqE8DA/edit?usp=sharing
It's been found that resource concatenation is still more efficient http://engineering.khanacademy.org/posts/js-packaging-http2.htm
And 'building for http2' seems to be advocating hashes in filenames without neccesarily walking the dependencies, which can have cache problems http://holloway.nz/r/hashes-in-filenames/
ES6 imports are static (you can't use JS to dynamically include a file) so this means transitive dependencies need to be resolved at build time, not by using a manifest file which resolves paths clientside. This also applies to (eg) SVGs that reference JPEGs because you probably don't want JS involved there either. Manifest files are a bad idea, except perhaps for instructing webservers to tell browsers to preemptively download files. AFAIK there isn't a standard for this yet so a manifest doesn't solve the problem.
Ps. I've got a gulp build for http2-style packing and I'll release it on my github in a few weeks (same account as my username)
That is the theory. The real world however can be very messy. More than two years ago Khan Academy measured how this would work for them - http://engineering.khanacademy.org/posts/js-packaging-http2.htm - here was their summary:
> The reality is not so rosy. Due to degraded compression performance, the size of the data download with individual source files ends up being higher than with packages, despite having achieved 'no wasted bytes'. Likewise, the promised download efficiency has yet to show up in the wild, at least for us. It seems that, for the moment at least, JavaScript packaging is here to stay.
My personal experience has been you have to confirm the theory of how HTTP/2 related changes will perform with actual measurements. I've seen some pages get faster in HTTP/2 by no longer bundling, and in other cases seen then become slower. So far the only way to know for sure is to measure the result.
Khan Academy uses Python [1], Google App Engine [2], React.js [3] and recently Go [4] among other languages [5].
They have used Backbone.js [6] and experimented with other programming languages like Kotlin [7].
Read their engineering blog [8] and you will know more and maybe learn a few things.
[1] http://engineering.khanacademy.org/posts/python-refactor-1.htm
[2] http://engineering.khanacademy.org/posts/transaction-safety.htm
[3] http://engineering.khanacademy.org/posts/upgrade-buttons-links.htm
[4] http://engineering.khanacademy.org/posts/goliath.htm
[5] https://github.com/khan/
[6] http://engineering.khanacademy.org/posts/upgrade-buttons-links.htm
[7] http://engineering.khanacademy.org/posts/kotlin-adoption.htm
[8] http://engineering.khanacademy.org/