From coding bootcamp graduate to building distributed databases
richardartoul.medium.com
richardartoul.medium.com
I came out of a Hack Reactor and started pumping out React code for a small startup. After about 6 months, I was bored and decided to take some Bradfield courses just like this article recommends and the experience has been invaluable. Seeing how some "black boxes" work in details has been super illuminating and helpful at times. The core concepts and even just the code I was exposed to moved the needle in terms of my progress quite a bit and also showed me other areas of software engineering I didn't know existed when I got started.
What makes them better than the online MOOC courses at Stanford, MIT, etc?
I thought I was making strides. I've taken two BradfieldCS courses and have had some personal mentoring from Myles even before Bradfield was born.
If the original question asker is reading this thread, I can lend some more insight having done MOOCs and Bradfield.
First off, Oz and Myles are behind teachyourselfcs.com, one exceptional and concise site which their curriculum is sort of based off of. Oz is also the author behind, "You Are Not Google" that was HUGELY popular on here a couple years back.
The thing that Oz and Myles brought was their incredible enthusiasm coupled with their passion for mathematics and computer science. They were practitioners teaching at it from a practitioner's perspective with the goal of providing another practitioner the CS most applicable to their jobs. These courses were in-person in San Francisco for a while (but no longer). Look up either Myles or Oz on Twitter and you'll notice that they're very much still engaged in technical conversations and the computer science and how to teach it today.
The one thing I always always took away from the teachyourselfcs.com site is the section under, "Why learn computer science?"
> There are 2 types of software engineer: those who understand computer science well enough to do challenging, innovative work, and those who just get by because they’re familiar with a few high level tools.
> Both call themselves software engineers, and both tend to earn similar salaries in their early careers. But Type 1 engineers progress toward more fulfilling and well-remunerated work over time, whether that’s valuable commercial work or breakthrough open-source projects, technical leadership or high-quality individual contributions.
I have an inkling that Richie, right here, is EXACTLY what they were talking about when drafting this. This blog post exemplifies this.
I've learned so much from the both of them, but I can honestly say, Richie, if you're reading this, this was a f*ckin' gem! Would love to grab coffee with you some time once the pandemic's over.
Why's that comical? If you have something interesting to say, go for it! Even if you don't, there's no harm in applying.
Most people are way more interesting than they think they are.
Based on my own experience, I'd say that you can always start out by speaking at local user groups or Meetups, build a resume of talks you've given, then apply to smaller / regional conferences, do a few of those, and ... well, that's where I stopped. All Things Open is the most prominent event I've presented at. But the point is, bootstrap and work your up the ladder.
Look at the whole thing holistically too: blogging, putting content on Youtube, open source projects, etc, all go towards building your overall image and presence "out there".
Most of the suggestions I see for potential side projects are for some kind of consumer-facing (web/mobile/desktop) app - probably because most people in this context are prioritising the potential of generating side income, but this sounds more like what the author calls "plumbing" style backend/API work rather than something that would develop fundamental CS skills.
So, any ideas? I've seen https://github.com/danistefanovic/build-your-own-x which is a great collection of ideas all based on piercing an abstraction by building your own version of lower-level tools. Are there any other categories of side project that someone who wants to move technically deeper than a full-stack web app would do well to consider?
Nand2tetris is pretty awesome if you don’t already have strong CS fundamentals and feel like you “know how computers work”. If you had a good C.S education though you may not get much out of it.
Here is a cool one I worked on awhile ago when I wanted to learn more about foundationDB: https://github.com/richardartoul/tsdb-layer
A long time ago I wanted to learn about regular expression engines so I wrote a tiny one: https://github.com/richardartoul/regex-engine
I built this with some friends a few years ago: https://hyperdash.io/ (building the backend for this was a good learning experience and I learned a lot about writing multi threaded software making the python SDK).
Those are just some examples to give you an idea, but to be honest it’s hard to give a good answer because side projects are deeply personal.
It takes serious discipline and motivation to spend your nights and weekends writing code when that’s how you spend your working hours as well, so it’s really gonna be about what motivates you and will keep you engaged while also gaining “high leverage” skills (anything fundamental in the realm of networking, compilers, databases, data structures, etc. basically anything that’s not just another language or framework)
For context I studied biochemistry in college with the intention of being pre-med and that is how I did all my studying, creating notes and flash cards for rote memorization because memorizing trivia is what’s required to succeed in that path, but I think it’s the wrong approach for furthering your education as a software engineer.
I still take notes today sometimes (because the act of writing helps me absorb information), but I’d never go as far as making flash cards.
When you’re studying this stuff I think the goal is more like, learn about what’s “out there” so you know enough to recognize that there is a thing whose details you should look up when needed.
Let me put it this way, if you read a textbook cover to cover on operating systems you won’t (and don’t need) to remember every little detail of the data structures and algorithms involved. But studying it once means you’ll never forget that they exist or what the difference between a thread and process is, and the remaining details are always a short lookup away when you need them!
If you do want to go really deep on a topic than my recommendation would be read about it / study it first, then go implement something in that area (even if it’s just a toy) if you want to make sure you really understand it.
It's a spaced repetition flash card program. If you just want flash cards, you use quizlet.
For context I studied biochemistry in college with the intention of being pre-med and that is how I did all my studying, creating notes and flash cards for rote memorization because memorizing trivia is what’s required to succeed in that path, but I think it’s the wrong approach for furthering your education as a software engineer.
Understanding is always preferable to pure brute force memorization. For one thing, going through flash cards will be much faster, easier, and less frustrating.
If you don't understand a concept, it's going to create leeches, which suck up study time.
I still take notes today sometimes (because the act of writing helps me absorb information), but I’d never go as far as making flash cards.
It helps you absorb information and convert it to knowledge, yes. But decay of knowledge is a thing. Flash cards are just the format. What it allows you to do is formulate questions or prompts which allow you to practice active recall. Active recall of information is one of the gold standard for studying.
If you do want to go really deep on a topic than my recommendation would be read about it / study it first, then go implement something in that area (even if it’s just a toy) if you want to make sure you really understand it.
Simply reading is one of the poorest strategy for learning. Active recall is much better. I agree that implementation and actual practice of skill is a good use of time, which might fall under the category of active recall.
Anyway, I am still trying to find how anki fit in my overall system for learning programming / software engineering. One of the thing I lacked is technical vocabularies for describing what I am seeing or doing, which I think anki can help with a lot.
Some people has success with it, but not for me. I suspect that it has to do something with the low density of cards/notes I added to anki.
That said, I still have basically the same opinions you do when it comes to when it comes to using it for most programming skills. Others have a different perspective, though: https://www.semicolonandsons.com/episode/how-to-learn-to-cod...
Thanks for sharing those examples. I guess the common thread here is to work on _building_ things that exist at lower levels of abstraction, rather than just knowing how to use them as a black box. I guess most project ideas that satisfy that criteria would teach some fundamental skills too.
For me, I started building programming languages (and standard libraries) years ago as personal challenge and to learn more about how various languages work. Later on that branched into emulation (x86/amd64, armv8/aarch64) and more recently databases. (You can find these kinds of projects on my github).
Before that when I was more focused on web tech, I'd build clones of React or Bootstrap or Flask to increase my understanding there.
It helped being surrounded by people with a lot more experience than I so I'd keep being in a situation where I knew nothing about some field and wanted to not be embarrassingly naïve :D so I'd try to build something from scratch to learn it.
It doesn't always work out! An example of a topic I haven't yet been able to get into is the TCP/IP stack. I got somewhere into the IP layer on top of userland raw sockets but TCP complexity and may poor C skills failed me as the algorithms needed for tracking state came up.
Thanks for the examples. I'd never even think of being able to build my own programming language, or clone of Flask - which I guess is the point, I shouldn't treat these things like black boxes :)
Does the author or anyone have any other free/affordable alternatives for BradfieldCS? teachyourselfcs is the only one I can think of which I'm following currently.
One nitpick, the part about comparing possible startup comp in a unicorn exit and as a senior eng at Facebook over an 8 year period is missing the possible tax benefits of the startup comp. Facebook comp will be taxed as ordinary income as the stock is granted as RSUs (basically 40 - 50% in the US in the $500k/year bracket depending on the state you live in), whereas the majority of a $10 million windfall from being an early employee at a startup that exits after 8 years would likely result in at least half of the tax burden if you did it right and the options were ISOs. With a 4 year standard vesting schedule, the majority of options would have vested far before the startup was a unicorn, and the tax burden at time of option exercise may be very low. Assuming then a long term capital gains rate of 15% at time of sale, the comparison to Facebook comp over the same timeline is about 4x in favor of the startup rather than the 2x the article proposed.
As the author says, though, the startup route is exceedingly risky and very highly likely not to come out ahead.
Thanks for pointing this out!
There’s a heavy twin push to find more sources of revenue and to increase taxes on cap gains specifically, so I don’t know that I’d bank on capital gains taxes continuing to stay low long enough to take advantage of them. All taxes on $10M exits are going up; cap gains probably faster than income.
Regarding the rate - LTCG depends on ordinary income level. The 2020 rate for someone earning $150k was 15%, so the $10 million exit in the author’s example would be taxed accordingly. Unless I’m missing something here?
Capital gains "count" towards your AGI, so if you have $10M in capital gains and $150K in wage income and nothing else, your AGI is $10,150,000 and your LTCG are taxed at 23.8% (20% + 3.8% surtax).
Let me explain. I didn’t study CS in college, but I did stud CE, a relatively related field. When I started working as a programmer, I immediately felt that there were some fundamentals I was missing, so I’ve spent a lot of time reading in my spare time to fill in some of those gaps.
There seems to be a trend where someone switches careers, and glorifies the fact that they don’t have a CS background. Why dismiss the history of the field that you’re in? Not everyone has a PhD in CS, but there has been some incredibly important work done in the field, work that we all stand on the shoulders of. Is this an ego thing? It’s hard to be humble and admit that you have a lot of things to learn, so instead you resent the field and blame it for being arrogant?
- linear algebra (transformation matrices and inverses primarily)
- calculus
- approximation methods to get “good enough/fast enough” solutions to the Chinese Postman Problem and the Traveling Salesman Problem
- a self-derived plane sweep algorithm for doing something special with a ton of planar polygons
The only conclusion that I’ve come up with so far is that it either varies dramatically by which industries you’re developing software for, or other organizations have people with specialized skill sets that work out the broad strike solutions to these types of problems before getting the software teams to build the production versions of them.
I completely agree with your last paragraph. I am a backend engineer, a job that at its core involves creating and fixing CRUD apps, and writing relatively simple business code. No matter how exciting people try to make it seem.
Maybe if you're building UI-heavy stuff, there's less theory required there?
Some of us realized we wanted to work in this field too late after we had already gotten an undergraduate degree in something else. A big part of the message in my post was that C.S education is important and encourages people to find ways to fill in that missing knowledge one way or another (although I don’t usually encourage going back to get another 4 year degree formally because I think there are faster ways these days that don’t involve losing 4 years of income.)
There was no intention to brag about my lack of education here and I think if you asked most people I work with they’d probably be surprised to know I don’t have a C.S degree.
I know the title is a bit click baitey, but it’s just a hook to get people to read what I think is a lot of practical advice for getting their career to where they want it to be.
I was just making a general comment on the topic. I agree with everything you've said.
I don’t think it’s an ego thing so much as a belief in the power of the rags to riches bootstrapping story arc. In our field, that story is totally doable.
On the “opposing side”, I do see every so often someone without a CS background set out to do something that boils down after not too many simplifications to “First, I’ll solve the general halting problem and then build on that to do task XYZ. Simple!”
But the trend of fetishizing the “bootcamp fairytale” you're seeing is the bootcamps marketing themselves submarine style.
(I am not accusing this author/article of submarine marketing. But swapping the head/subhead would have been more informative and less clickbaity)