Launch HN: CodeCrafters (YC S22) – Practice writing complex software (codecrafters.io)
For example, if you did our Git course, you’d learn how Git internally stores file data by building an implementation of Git that can clone a GitHub repo. If you did our SQLite course, you’d end up with a SQLite implementation that can read a valid SQLite database file, and retrieve data by performing an index / full-table scan on it. The projects you’ll build are always end to end compatible with the official spec. Given the same input, your program would behave the same way the official one would.
We’re different in the developer education segment in 3 main ways:
First, we cater to people with programming experience. There are tons of introductory “learn to code” resources out there, but surprisingly little once you get past the basics. Good programmers want to get better and to develop in areas where they’re not strong yet, and that’s what we help with.
Second, the coursework involves writing actual code instead of consuming videos. You handle concurrency, develop statecharts, traverse B-trees, etc. While we test against a fixed spec, you’re welcome to try different approaches. E.g in our Redis course, you could implement handling concurrent clients either using threads, or using an event loop.
Third, instead of coding in the browser, you build these projects in your local dev environment. We create repositories for you to work out of, and you git push to run tests. The actual code can be written in your editor of choice (VSCode, JetBrains, Emacs, etc).
This last point in particular—our git-based workflow—is something customers repeatedly tell us they enjoy. We run our own git servers, and have server-side post commit hooks configured to run tests on every push. These post-commit hooks also send back logs to users, with colors to indicate pass/fail, errors, etc. Our feedback cycle for popular languages like Go, Python, JS often takes ~2.5sec (including pushing code, running tests, and streaming back results), faster than even regular GitHub pushes. We do this by executing code within firecracker VMs and caching aggressively wherever possible.
As open source contributors, we’ve always been interested in the internals of software we use day-to-day. When Paul became an Engineering Manager for a team of 12, he decided to conduct in-person “Build your own Redis” workshops as a way to engage his team and help build skills. He had a mini-curriculum, a physical leaderboard for scorekeeping, and a Slack channel for discussing solutions. Participants loved it and wanted more. With CodeCrafters, we’ve essentially built an expanded version of that workshop experience on a website—for engineers and teams that want to challenge themselves, dive deeper, and grow.
We’ve learned how much hunger there is for a skill-building path that’s structured, fun, and focused on cool, well-known projects with serious technical dimensions. Jumping straight into the deep end as an open-source contributor has always been an option, but it’s daunting, if not intimidating. It can take a long time to get oriented in a major codebase, and mentorship isn’t always available. There’s a need for an intermediate approach with lessons that build technical expertise, and that’s what we’re supplying.
So far, we’ve seen developers and teams use CodeCrafters to learn the internals of complex software, master programming languages, onboard devs in a new language, and even as a continuous team-bonding activity.
If you’re a developer, we’d love for you to try CodeCrafters. Most customers expense the subscription through their learning / professional development budgets. If you need help convincing your manager, feel free to email m...
208 comments
[ 4.4 ms ] story [ 275 ms ] threadWhich course intrigues you most? :)
Maybe you have a small trial project for each language which you support, allowing for a quick evaluation with real results?
Good suggestion regarding having trial projects for every language, we'll consider that.
The trial is available on all plans, so no need to ask the wife!
In the absence of leetcode-style challenges, what do your current take-home assignments look like? Do they test for skills specific to your domain, or are they agnostic?
You can link a custom repo to it, pretty amazing experience all around.
At the moment it looks like there's git, redis, docker and sqlite as challenges (that have varying support for different languages) with a regex parser, http server, shell, bittorrent client, and react up as future candidates, if I've read the site correctly.
Today it takes us ~2 weeks to build the "core" parts of a challenge (planning, stage instructions, tester etc). From then on, the changes are incremental (adding support for more languages, better hints/instructions, getting experts to provide feedback on solutions etc).
Hard to say how much time the incremental changes take because they’re done over a span of months, but it’s definitely work. At times our community pitches in to add language support: https://github.com/codecrafters-io/languages
Paul also did a series of tweets when we were building the SQLite challenge if you’d like to see what the challenge-building process is like: https://twitter.com/RohitPaulK/status/1421517393780740100
The kind of experienced engineers you are targeting are also the people capable of doing this kind of learning on their own. But if someone’s employer is paying for it then it helps expedite the learning because of the guided process you guys provide.
When we first started out, we didn't pay any attention to guidance at all, and instead focused entirely on the "challenge" aspect. At that time, it was less common for early career engineers to try out the product.
We've evolved a bit since, and now it's common for us to also see early career professionals, support engineers at devtool companies, bootcamp grads, etc. From time to time, we come across Engineering Managers who'll do our modules as a way to "stay in touch" with programming (and picking up a new language they'd been itching to learn — e.g Rust).
We're probably not suitable for someone new to programming, but otherwise all other levels are welcome and find value.
One of the things we also hear frequently is: "I don't know what to build"
So I would prefer a per project pricing. And a trial that doesn't require credit card.
Awesome idea! I'd love to contribute somehow.
For example, we're now starting to introduce source code walkthroughs. Here's one going over how the Redis event loop is implemented — https://app.codecrafters.io/walkthroughs/redis-event-loop.
So as you build out your Redis project, you can study in parallel how the official source does it, learn some cool facts, and overall spend more time developing fluency with the Redis docs.
One of the ways you could contribute is adding language support. If one of our courses doesn't support one of the languages you work with, you can add support for it here — https://github.com/codecrafters-io/languages.
Some use-cases we've heard from customers:
1. Onboarding oneself into a new language (for experienced engineers, learning syntax is relatively straightforward — it's the idioms, standard libraries, etc that they need exposure to)
2. Team Hackathon / general engagement — Our company leaderboard and Slack app (available to teams) offers an element of "friendly challenge" and collaboration, and teams seem to enjoy that as a way to learn new skills together. Developers are naturally curious people — so more opportunities to bond over ideas, approaches, facts, are always appreciated.
3. Prepping towards roles in platform engineering — either as general skill development for confidence, or interview prep
A general point I would make.
In education: cost is a barrier of entry - a smaller ask might yield far more results from people in disadvantaged situations able to scrabble up ladder. A rising tide raises all ships.
You are doing work creating the material and course work - I'm not saying release stuff for free. but $80/mo is something to bat an eye at for a lot of people that would otherwise be interested in this.
I would price it at $40-60, with maybe an intro month at $20. the $60 price point is a video game: which fits in my mind as roughly the value you seem to be offering per month. but I don't actually know how much time each course takes - thus the range from $40-60.
that's just my two cents.
Just my $0.02.
FTFY
I think they're targeting professional developers with self-training/learning budgets. I'd be totally down for this if my company were willing to pay the time and subscription cost. I'd certainly rather do this than some F-tier shite about Agile or whatever.
They were 4 years into their job, and felt that their job was mostly cobbling together a bunch of frameworks. Nothing wrong with that, but they constantly had the itch of not knowing how the pieces really tie together.
Their next goal is to explore platform engineering roles, which involves work that is one level lower in the stack.
Our current target is professional developers and teams with learning budgets.
Here are some reasons why experienced engineers have found value (the first expensed it, the second didn't):
1. One customer manages the Redis team at an infra company, and they used CodeCrafters as a starting point to get up-to-speed on Redis internals — to be able to do their job better. We ended up getting feedback from them on areas we could dive deeper on, to be useful to platform engineers in general.
2. A Distinguished Engineer at a Fortune 500 had built a database product before, and wanted to pick up a new language (Java, if I remember right). So they did our course because they preferred the "learning by doing" approach, and existing resources felt a bit too "hello world / todo-app"-ish.
I've touched on the topic a little more here: https://news.ycombinator.com/item?id=32345899
A free community is going to have more lurkers that aren't engaged, aren't committed, and may post one thing if they even post at all, before slithering away. Drive-by-comments would be more common. It would not add value, it would be like most of the rest of the public Internet.
Additionally, you might have missed this from the OP:
> First, we cater to people with programming experience. There are tons of introductory “learn to code” resources out there, but surprisingly little once you get past the basics. Good programmers want to get better and to develop in areas where they’re not strong yet, and that’s what we help with.
The subscription model is a bit annoying, though, I'd prefer to spend a bit more to get lifetime access to sets of tutorials so that you can come back to it at any time in the future. The future upsell would be new tutorials sold to existing users. And it'd be nice to be able to buy it sliced either by language or by target. Most likely someone is learning Python so then they want to buy the Python set of courses, then they come back later and they're learning Go so they buy the Go set of courses, etc.
> a compilation of well-written, step-by-step guides for re-creating our favorite technologies from scratch
Until a few months back, we were focused solely on the "challenge" aspect of the product. Based on customer feedback, we've been making new features available that offer more guidance when you're stuck — a 2min preview is available on this demo video — https://codecrafters.io/videos/demo.
1. We show you expert-vetted code approaches for different languages in each stage, and also explain the interesting / difficult parts in the approach.
2. For further inspiration & knowledge, we now also include source walkthroughs for many of the stages, which link to how the official implementation does it. Here's one for Redis, which explains how the PING command is implemented (stage 2 of Redis). https://app.codecrafters.io/walkthroughs/redis-ping-command
That said, I agree with most everyone's assessment that the price-point is a bit too high.
Is providing different pricing schemes for companies/hobbyists/students something you're looking into?
Our long-term intention is indeed to be able to help anyone who's interested to learn and grow regardless of their financial situation.
We also realise that not everyone has access to a learning budget. As an early-stage company, our pricing reflects what our current target audience is comfortable paying, and is also a test for long-term sustainability. Over time, we hope to be able to overcome pricing-related hurdles and enable broader access.
Looks cool though, I will likely try this out.
What languages are supported? Are the tests language agnostic, or is the coursework specific to a subset of languages? I see reference to Rust, Go, Python and JS...but am unsure if this would be useful for something like Clojure, where I can produce JS, JVM or compiled code, that could be tested against, but wouldn't expect an imperative pseudo-code explanation of an algorithm to be helpful for explaining a functional solution.
As a 2-person team, we're prioritising making a complete experience for Go, Python & JS for starters (our most popular languages).
So far, our tests are language agnostic. Our testers are written in Go (they’re open source, example: https://github.com/codecrafters-io/redis-tester). The testers interact with user code by testing for observable behaviour - exit codes, stdout/stderr, files written etc.
Although the testers are language-agnostic, a lot of the educational “content” is language-specific. We emit language-specific hints in stages where appropriate, and have expert solutions that are language-specific. A lot of this is new, so we might not have coverage across all challenges - this will improve over time.
Does that help explain our setup a little better?
For example, why is Rust in Beta while Go isn't despite having the same number of stages? I'm assuming the determination is made based on something else, but do you go into what that is?
Rust is probably the language I'm most interested in using your site to learn and it currently has as many stages completed as Go (according to your tracks page), but you didn't mention it in your list of priority languages. Are stages user-contributed? Is that why Rust has more stages than Python or JS?
Is there anything that would stop a user from using any language without major impediments or hurdles?
Sorry for all the questions. I've just been really excited about seeing this platform develop!
You might also enjoy checking out our OSS repo where any one can contribute language support. We prioritise supporting different languages based on user demand, but if you want to get your hands on a particular language right away, we accept PRs from the community. https://github.com/codecrafters-io/languages
They probably have one guy at a company and add it, based on a survey/form where people could in theory lie about where they work or add previous positions if they're unemployed. Note the companies aren't subscribers, an 'engineer' from that company is a subscriber.
For some companies on that list, we do have more than one engineer subscribing, and for in many cases we've spoken to them to learn about their motivations and feedback. We also have a Private Leaderboards feature for teams.
In the past few months, a nice small win for Paul and I is what we like to call the "Slack Share Effect".
It's when one of our users shares CodeCrafters within their company Slack, and then we notice multiple new users that work at the same company. When we get in touch with them, I always enjoy asking "how did the OP describe CodeCrafters on Slack?" and 100% of the time, I discover that customers do a better job describing CodeCrafters than we ourselves could. It's also how we uncover use-cases :)
The logos highlight companies where our customers (the engineers) work. Since we're early stage, so far it's more common for engineers to discover CodeCrafters, sign up by themselves, and expense it to their company. That might explain why you can't find information about subscription on the intranet.
We also do have cases where we work with companies to land team subscriptions, so if you'd be interested for us to engage with your company, feel free to drop me a note — sarup@codecrafters.io, and I'd love to help. It might be that the person you couldn't locate has moved on from the company, but I don't have a good explanation for why you couldn't find them on LinkedIn :-D If you emailed me, I could ask them and find out for you (for references, etc) — for most listed on the website, I've been in contact with them :)
If you look them up, you'd get a sense for their background / role, etc :)
https://news.ycombinator.com/item?id=32351531
I’d happily pay a few hundred dollars and have access to it years later.
Like the way we bought books and software CDs a while back. You buy, you own it.
Not everything needs to be a subscription unless it is a truly recurring service where every month there is value add.
We have a pricing page — https://codecrafters.io/pricing, and do have it linked on our menu and footer. Would that help?
Re: subscription payments, only our Monthly plan is a recurring subscription, the 3 Months / 1 Year plans are one-time payments. A "lifetime access" plan isn't sustainable for us at the moment since we need to keep servers (including test runners) up and running.
> What new courses should we add?
The courses you have already are good, but are quite low-level. To broaden the applicability perhaps you could also try something like "build a REST API that matches this OpenAPI schema" (getting persistence working properly could be an interesting challenge). Going further, I wonder if it's possible to do a course like "build a web app that does X" (Realworld or TODOMVC are possible values of X), using browser automation to test. This is probably very hard without manual review. (Scoped broadly enough, this could be solved with a server-rendered framework or a client-side framework.) Common engineering/craftsmanship problems here are authentication, persistence, navigation, performance tuning, perhaps log-wiring, etc.
More generally, I'm wondering if there is a good open-source option as a competitor / baseline comparison? As others have noted, Leetcode is one common source of study exercises, but it's quite annoying to work with as you need to submit code in the browser rather than using your IDE. I'd love to see a repo with exhaustive test cases for the things you're building; for example low-level algorithmic exercises like "exhaustive tests for binary search tree" or higher-level "build a git client" like CodeCrafters offers. Being able to step-debug through failing test cases is always going to be more realistic training than the Leetcode workflow.
Our testers are all OSS. Here's our git tester for example — https://github.com/codecrafters-io/git-tester.
Others can be found on our GitHub org. https://github.com/codecrafters-io
We need to do a better job of exposing links to testers in our in-app UI — good feedback!
Your format seems awesome but the languages you offer all seem really backend/devops focused.
This also satisfies the itch to learn a new language by building something really interesting, and not just another Todo app.
In the early days, we'd find folks sign up to do CodeCrafters because they had a "niche" job that involved knowing Redis or Docker internals (typically platform engineers at infra companies).
However, we saw that there were a set of engineers that would do all of our courses, then do redo some of them in different languages. We initially thought that to be strange (why re-learn the internals once you've already done it) — and they clarified they were in fact looking to pick up a new language.
Possibly my favorite customer call till date is a final year college student who didn't know what Redis was, had experience with C but none in Java — and within a few weeks times, he had learnt about what Redis was (and a bunch of backend concepts while he was at it), then it's internals, while learning Java at the same time
Perhaps for other languages which don't have a Rustlings equivalent, maybe you could add something like that for beginners as well as your more complex challenges. If I were to rewrite Redis to learn Rust, that probably would have been too complicated a project, but having a guided beginner course before the complex projects makes more sense to me.
Please give it a try once more?
One concern I have is that it looks like you're having people rebuild Unix command line tools. Tools which have a tendency to look at the world in one particular way. Unfortunately, that way is not very good to users. I'm really concerned about how many different programming courses, from boot camps to graduate level CS courses, push this narrow view of programming. I'd like to see some more variety in the ways that programming is taught. Have you considered bringing in projects that have graphical user interfaces or that use different paradigms than those espoused by Unix?
That's on the cards (e.g we have Build your own React on the pipeline). There are unique challenges to making that experience predictable, so we're focusing on the "console-based" projects for now. There's also often a "subjective" nature when reviewing/testing UI so we need to think through the ideal feedback workflow for courses with frontend components.
That said, I do wanna highlight that these courses do cover a lot of ground. I look forward to your feedback once you manage to get your hands on it!
Ack! No! I mean native applications written in styles other than the prevailing Unix way of writing native applications. It can be any other form, just something that's well written but not using Unix-isms.
https://app.codecrafters.io/tracks — full list here!
Here's an example of a real user's page, who's in-progress: https://codecrafters.io/users/jaredpalmer
And some examples of "completed" users: https://codecrafters.io/users/eyalfoni https://codecrafters.io/users/byarr
Do these help? Please feel free to drop me a brief note (sarup@codecrafters.io) and I'll be happy to help you write a compelling case for PD and also explore certificates.
I just renewed my CPR/First Aid they took a photo and added it to my profile with the expiration date. And it was my name and the date literally scribbled on cardstock.
It might be pedant but even a simple PDF with name, date, and subject taken would probably satisfy HR. They are rigidly loose like that.
edit: Oh, no. It just isn't accessible from my company's network for some reason.