The author likes to point out how developer career online advice, blogs, rants etc. aren't applicable to low level programming roles, with a patronising tone but they're right nonetheless. Although embedded people will say the same about system guys, TCS researchers about all types of SWEs and so on.
However they seem to be falling into the same pitfalls with the frontend rockstar programmer-influencers; omitting and even undermining the importance of formal computer science education.
Especially if we're talking about getting into non-web development/IT roles, it's quite a lofty goal to expect mastery in programming complex software without some structured curriculum that will help you obtain the fundamentals to do so. And no, Coursera unfortunately won't make the cut most of the time.
Get a degree in Comp. Sci/Comp. Eng or at least some STEM degree and then a Masters. I understand the US-centric view of tertiary education being a risk due to large capital investment but in the rest of the world where it's affordable/free, most would hesitate to hire self-taught developers, even in web development positions.
The degree may not be enough for systems programming competency and this is where advice in the article about open source contribution comes to play, but I'd say it's kind of necessary unless you're some bunniefoo type of brain or idk.
I'm about 20 years into my career as a self-taught software engineer. I mostly work with companies that only hire out of MIT, Cornell, Stanford, Waterloo, etc.
By and large my experience with these graduates is that their awareness of the field does not extend much beyond what they learned in school and what the current hype technology is (today it's ML). If you got enormously lucky, they worked or interned somewhere special and were able to expand their skillset.
Consistently, the absolute best developers I've worked with tend to be self taught and especially people with Computer Music degrees. It turns out that learning DSP is a skill that pays huge dividends elsewhere in this field. I've also worked with CompSci Ph.D.s that can't build their way out of a wet paper bag.
As far as the degree programs go though, Waterloo is excellent. I would even say above the rest. Even MIT. I am consistently impressed with their graduates that I've had the privilege to work with.
And as for my own journey, I have my weak spots. I also tend to read more papers and technical books than most of my peers by a significant margin. I think that's my edge.
This is Survivorship bias in full swing. The only self-taught developers who would get an interview at a top systems lab, would be ones who have far surpassed the achievements of the average MIT/Stanford grad.
The kind of person who'd shine as a self-taught developer, would be on their way to be distinguished engineer if they'd just done a CS degree to go with it. A degree does not kill the energy and initiative that makes for a top-tier self-taught engineer. But, it grounds your foundations, opens doors and lends you much needed prestige. All of these together will put a person on course for exceeding any 'merely self-taught' or 'merely MIT educated' engineer.
Your best self-taught Computer Music hires would likely have been even better if they'd done CS. And if they're good enough to be practically guaranteed 6-figure salaries, then the debt of university education is hardly a risk at all. Hell, they could pay off their debt just from internship-salaries and signing bonuses.
Is there something from a CS program that can't be learned from studying half a dozen books (or maybe a couple more)?
Because that's what "self-taught" means, and unless you can identify the things specifically that can't be practically learned by a determined person without going through a 4 year CS program, you're basically making things up to retrofit to your bias.
I don't know why so many people seem to believe that foundational CS knowledge can only be gained through doing a CS degree. The Internet was built by "computer people", and computer related resources were among the first things to be highly available and easily found on the Internet.
Maybe what you claim are true in a "literal" sense but I doubt it's very useful. Basically what you're saying is that assuming a person's that did not have a CS degree has a CS skill level X, then if they spent 4 more years studying CS they would presumably have a skill level > X. TBH at the highest levels I'm not sure whether this even holds, since once you get to a certain point, the depth of your knowledge and skill has to be complemented with some breadth as well. Often interdisciplinary knowledge brings new insights.
I'm glad you asked me. I happen to have self-learned undergrad level CS myself before moving on to do an ML focused masters. There were a bunch of challenges I had self-learning that were made so much easier during my masters.
For one, self-learning just damn hard. Staying motivated to put in self-guided 8+hours everyday without natural peers, external structure and good external evaluation is just hard. You can sustain it for spurts, like 1 summer or in my case 1 whole year, but it erodes your mental health.
It is never clear when a topic is especially important. I can't go to office hours to clarify certain doubts. I can't take on especially daunting tasks that I could with a group of peers together. Worst is that env setups themselves lead to you getting stuck doing accessory work, instead of focusing on the main topic you do want to learn. Honestly, finding top quality coursework (MIT OCW is gold), assignments and notes was trivial. It was everything else that was really hard.
My self-learning tendencies didn't magically go away when I started my masters. I still leveraged all of them and I still do. But, it did solve a lot of my the challenges that came with being self-guided.
> For one, self-learning just damn hard. Staying motivated to put in self-guided 8+hours everyday without natural peers, external structure and good external evaluation is just hard. You can sustain it for spurts, like 1 summer or in my case 1 whole year, but it erodes your mental health.
Learning for learning's sake, or because you want to get a job as a dev: that I can see being a grind, with motivation being difficult to find.
But if you have a idea for a product, and you want to make it concrete - the motivation is easy. I think most of the self-taught developers I know (myself included) started that way: they wanted to make something, and so they learned how to make software on the fly, while building their thing.
Instead of going to the office for a question you could email/chat online. I would find it harder to study with others for 8 hours a day and less focused.
If we’re using “determined person” as the bar, then someone who commits 4-6 years paying tuition to get a BA or MS CS certainly seems more determined than a self taught person who spent maybe 3 months at a boot camp?
Not saying that it’s fair, college costs too much in the US, and employers overindex on good schools. but I don’t get the argument that a self taught person should be treated equally hiring-wise
The original context was "advice for young programmers", and although I don't think getting a CS degree is top of the priority list, it's at least a important and good thing to have.
But this:
> I don’t get the argument that a self taught person should be treated equally hiring-wise
.. this is a totally different question.
If two candidates performed at the same level in interviews/tests/whatever, and one of them has a CS degree while the other does not, IMHO the proper interpretation is that, assuming that their performance scores in the hiring process reflects candidates' actual abilities, is that the candidate without the CS degree is a better learner (of CS related topics).
Put it another way, if a person who only spent a couple months in boot camp performs on a similar level as a CS graduate in interviews, it really means the former learns at a terrifying speed, and has huge potential. It also helps that many people like you would prefer to pass on the candidate without the formal qualifications, so there's even less competition for the candidate even though they at least have the same level of technical ability.
This line of reasoning depends heavily on whether your interview process can actually gauge the technical ability of the candidates. If it can't, _then_ assuming the one with a CS degree has better skills is more reasonable. But at that point, you might want to fix your hiring processes instead of arguing this point.
Not just the prestige, but the really strong networks you build. It helps you be 'I know a guy who knows a guy' distance from VCs, experts and hiring managers at top labs.
A lot of my close friends went here, and they're able to catch up over phone with people who leave my linkedin requests on 'pending', and this is with folks who've achieved exactly the same as me at the same age.
If your purpose is creating a strong network, becoming a CEO and leveraging relationships later in life you don't go to those schools for computer science. What a waste of an opportunity. Go into business and meet important people. Or go into the arts so you have time to join social clubs.
Going to those places to get a VC to email you more easily is better achieved by getting into an yc or some other incubator.
That's about 16 required classes including Linear Alg., Statistics, A Child's First Programming Class, Data Structures, Discrete Math, Algorithms, Architecture, Operating Systems, plus another 8 of your own favorite upper division electives (CS 340 and above).#,##
Then there's the question of what you mean by "studying". Just reading the books isn't really going to work. That's 50 semester hours---weekly class wall-clock time---and the ol' rule of thumb was 3 hours studying per hour of class time###, for 15 weeks or 3000 hours. But you might be able to do it in less.
So, it's doable, certainly.
A formal degree program has two advantages:
1. Having somebody to advise you on what's important and what's not. Not all of the chapters of SICP are equally meaningful, and having someone who already knows this shit and can say, "pay attention to this chapter, it's important," or "skip those exercises, they're not worth it," or even "forget that section, it's outdated; here's a paper" is quite useful.
2. Feedback. Even if you have the answers to the exercises, having someone to look at your crappy program or broken proof#### and tell you "you are missing this, try that instead" will speed up understanding considerably.
And that's aside from answering questions and making a second pass through some material when you're sitting there staring like you've been hit with a captive bolt gun. It's significantly more efficient to get to understanding than working on it yourself.
And then there's the requirements for things that you would not, yourself, choose: Spanish? !@$&%){ Calculus? Those damn writing requirements? Ethics and leadership? You touch on this yourself: many of the self-taught people I've seen have been depth heavy with little breadth.
Which brings me to another point. Those computer people who built the internet typically already had degrees in physics, math, EE, or something else. And, they also tend to have that depth to breadth problem. (Then there was the afternoon I spent explaining to a former Aerospace Engineer (and quite good programmer) why string = string + character was so slow. And why it wasn't slow on that other implementation.)
# This has actually been dumbed down since I went through in 1986-1990; it used to also include a full class on formal logic, automata theory, and basic electronics. So, hmph. But then I didn't take physics, chemistry, or biology, so yay.
## Stay away from CS 340. It sounds like fun, but it seems to be taught by Warren Hunt...
### Hahahahaha, wheeze... Ah, weekend nights in the computer lab...
Degrees are useful but there's a whole class of things they skip over as well. When I was going to college the state college didn't teach C on a regular basis and we usually had a number of people at my community college since the course was offered there. When I was looking to transfer from community college into state not a single college offered C++(it was during peak Java) and so I didn't attend.
Even then I regularly find that so-called "fundamentals" are missing, the number of times I've had to explain page tables, how the kernel shares memory and other core details is surprising. Everyone drives Big-O notation left/right/center but can't tell what a page fault is or why algorithms with higher complexity wipe the floor with better "ideal" algorithms under actual operating constraints. I've found that engineers who have drive or innate curiosity will poke in those areas but getting a degree doesn't automatically confer that knowledge(or guarantee that it sticks).
Also, if you're getting into systems programming I care about 0% about "prestige", it's a domain that is even more binary(things work or they blow up spectacularly[1]) than some other programming domains. I care that someone understands the fundamentals, can apply reasoning and drive a hypothesis with data more than what college they did/didn't attend.
And those colleges were right. You shouldn’t have a class that teaches C, C++, or Java. You Should have classes that teach embedded programming, operating systems, object oriented programming, and algorithms.
> When I was looking to transfer from community college into state not a single college offered C++(it was during peak Java) and so I didn't attend.
Why is C / C++ education so important?
Personally, What helped my during my studies were type theory, PL, complexity theory, etc. Had I gone into systems development, then my compiler courses would probably be of most value (which are standard curriculum in any CS degree).
If you don't understand C, C++, or one could argue Rust these days you're sitting at an abstraction level much higher than where the "systems" domain tends to be. ABI, cache misses, page tables and memory mapping, restrict, all of that stuff is at an arm's length in a managed language.
One of the best courses I had was taught by Bruce Dawson, it was an entry-level "image processing" course but really it was a tour-de-force on cache hierarchies, modern computer architecture and how to build efficient real-world algorithms and not things that just scored well on the complexity scale. The first assignment was a simple bit-blit, he grabbed a random assignment from the class and in about ~30 minutes walked us through a multi-order-of-magnitude performance improvement with just small adjustments that made the program more cache-aware and also showed how you empirically test for performance improvements instead of doing it in a theoretical manner.
Back when I was in college(which was admittedly a long while back now) those sorts of things just weren't taught and that class was by-and-far an outlier from traditional coursework. My experience has been that even though there's a lot of talk about "fundamentals" in a CS degree it's touched at such a shallow layer that practical application of any of those fundamentals are missing and it doesn't "stick".
I've met all of a handful of people who can tell me what restrict does(much less how to use it), what a cache-aware data structure is or why we care about value types. ABI is just a 3-letter word to a large majority of people because they just don't have to deal with it(but are then oblivious when it blows up, I.E the number of times I've seen STL in what are supposed to be ABI-safe boundaries). That stuff is all foundational at the systems level. I've had much better luck with breaking people of their assumptions(I.E. Big-O) and working up from first-principals of how computer architecture works and structuring systems in such a way that take advantage of that instead of a theoretical ideal.
> If you don't understand C, C++, or one could argue Rust these days you're sitting at an abstraction level much higher than where the "systems" domain tends to be. ABI, cache misses, page tables and memory mapping, restrict, all of that stuff is at an arm's length in a managed language.
To me, this is a bit muddy:
Yes, when doing systems level development, you need to understand the system you are targeting. Not all CPUs have a concept of cache misses or page tables. At my uni this was taught through computer architecture and operating systems classes.
These courses incidentally also included C, though they didn't need to. The reason that did was because they were precedents for the compiler course and prepared the students to understand compilers (I TAed in said courses). Later courses at my uni would be algorithms engineering that taught students how to make, well, cache aware implementations.
Understanding how a given hardware architecture works on how to most efficiently utilise it has nothing to do with C / C++. Many courses at most (European?) universities will happily teach you everything you need to know, but C / C++ are probably not even mentioned in the teaching material.
There are always exceptions, programming for the PS3 was... interesting given the SPUs didn't have any caches, although one could argue they were closer to DSPs with the manual DMA required. I'm not really interested in arguing semantics but more that those languages tend to be what you see modern, battle-tested OSes developed in.
My point is if you're not using C/C++/Rust what are you using that exposes those concepts? Not saying you can't do those things in other languages(I've shipped cache-aware datastructures at scale in Java using ByteBuffers + flatbuffers) however you're having to reach through abstractions and/or other limitations. Say nothing that on most OSes that C tends to be the OS ABI as well.
How do those European (?) universities deal with the difference between theory and practice? I have a hard time imagining how you would understand how to "most efficiently utilize" a given architecture without writing code and trying things out.
The choice of programming language isn’t that important insomuch as Computer Science is not about coding.
Surely using Python to code OS course assignments does not make much sense. But that choice comes naturally with the course in question. Courses about a specific language are set out to become dated from the start.
>The kind of person who'd shine as a self-taught developer, would be on their way to be distinguished engineer if they'd just done a CS degree to go with it.
what makes you think so?
how would those basics of basics of computers and stuff would help you to become distinguished engineer?
self-taught people with huge curiosity are well aware of this stuff because this material is available on the internet freely
Because you have to relearn all the foundational stuff. Algorithmic complexity, invariants or fundamentals of distributed systems may be useless as a junior developer, but once you proceed to more complex stuff it pays off that you have already learnt them, maybe even applied them for an internship.
A self taught person doesn't even know that these things exist unless they also have an excellent mentor at the beginning of their career in the industry. The material may be freely available but it's not stuff that they will consider unless they also have a penchant for boring theory.
Please, I thought somebody will mention some arcane, rare topics that self-taught person may have no opportunity to hear about, but definitely not those really popular topics.
People talk about those 2 all the time, especially in context of interview for big_tech
>A self taught person doesn't even know that these things exist unless they also have an excellent mentor at the beginning of their career in the industry.
You don't need to learn those at your year #0, year #1 or whatever, it heavily depends. But if you worked for e.g 5 years and didnt need those then still nothing prevents you from learning.
Anyway, almost all graduates barely have any proficiency in multithreading, let alone distributed systems.
>The material may be freely available but it's not stuff that they will consider unless they also have a penchant for boring theory.
I thought we were talking about people with drive, with passion, people who are potential candidates for being distinguished engineer, not average person.
Those who value the CS degree and the schooling process most are often those who value the whole idea of "schools of thought". The eager student is a blank slate to be influenced by mentors. These influences pass on a culture of knowledge, an ontology of problems and solutions and ways of thinking about them. Also absorbed are implicit boundaries around what is important vs mundane, what is generalist and what are recognized specialties. The school of though is a community where these outcomes are somewhat stereotyped. The students will react similarly to similar questions or debates, not too disparate from their mentors.
Those who value the auto-didact most are often those who value the individual pursuit of curiosity and idiosyncrasy. The eager student hunts down or pillages knowledge wherever they can find it. In the extreme, the auto-didact is self-mentored. Individual interests and unguided exploration of existing literature builds a personalized ontology of problems and solutions and ways of thinking. The distinction of important vs mundate, as well as specialization, is more idiosyncratic. The auto-didact may belong to a school of thought with one member.
The underlying experience is when these groups meet is almost culture shock. It could lead to great collaboration or to a meltdown, depending on the temperaments of the individuals and their willingness to embrace or interact with the "other"...
> Please, I thought somebody will mention some arcane, rare topics that self-taught person may have no opportunity to hear about, but definitely not those really popular topics.
Agreed. These are it something many “self taught” developers I know have never heard of. For fucks sale with all the complaining about things like leetcode and other interview styles. do you seriously believe self taught people have never heard of these things?
Unfortunately, it seems in recent years “self taught” became synonymous with “some guy who decided to do a bootcamp because he heard there was money in learning to code”.
It is more typical of a self taught developer to complain about fizzbuzz, rather than talk about leetcode.
These are both extremes but still, the average self taught developer is not the one who interviews for big tech exactly because he has never heard about invariants.
> A self taught person doesn't even know that these things exist unless they also have an excellent mentor at the beginning of their career in the industry.
I was perfectly aware of them as a 15-year-old teenager decades ago.
Think of your own situation -- did you learn what you know about JITs by taking formal classes?
And how often do you hear people complaining that "interviewers only care about useless stuff like complexity" and "why wouldn't you be able to look up complexities if you really need them" (which only shows that you don't understand why complexity matters)?
The reality is that these are arcane topics for 99% of the programmers out there and even more of the self taught ones.
> did you learn what you know about JITs by taking formal classes?
No, but JITs or emulators are not fundamental topics.
One example I can give is this: solid knowledge of data structures, together with some theoretical 20-years-old knowledge of query plans and normalization, meant I could understand a database's EXPLAIN output and quickly learn materialized subqueries and denormalization the first time I needed them. Even obsolete knowledge has a core that is still valid, and experience is also about being able to recall it and apply it. If you have done some CS at school, you will be faster at this because you have more dormant concepts that you can recall.
> And how often do you hear people complaining that "interviewers only care about useless stuff like complexity" and "why wouldn't you be able to look up complexities if you really need them" (which only shows that you don't understand why complexity matters)?
Now how the fuck do you complain about something if you’ve never even heard of and “don’t know exists”. No one who’s never heard of algorithmic complexity or invariants aren’t going to complain about them because, perhaps to your amazement, they simply have no idea these things exist. But maybe that concept is a bit too complex for you.
I don't know about you, but I have read both of those assertions way too many times, typically from people that have failed a job interview or from "influencers" ranting about how big O questions are gatekeeping
Yes, I agree. I’ve seen these types of assertions quite a bit myself. However, for someone to write that question, they have to have known that Big-O exists. If they didn’t even know it existed, you wouldn’t see questions like this. Are you being disingenuous, or can you simply not read?
The initial assertion was:
> A self taught person doesn't even know that these things exist
Not “a self taught person doesn’t understand these things”, not “a self taught person doesn’t appreciate the usefulness or application of these things”, or whatever else you’re trying to argue.
The are many, many gigabytes of good information available on the Internet. The problem is that they're mixed in with many, many terabytes of not-so-good information.
Finding out which is which, when left as an exercise to the reader, is not terribly efficient.
The other way to look at it is that this company does not know how to hire people and can barely tell the difference between great self taught programmers and terrible graduates from a school with a good name.
Hey, find me a college with a good CS program that isn't just half-assed IT is disguise, that's accessible to a low class white guy, and I'll ace that Bachelor's program.
There are many others like me who would and could do it, but lack the financial or social resources to put it into action. If I lived in Europe I could have my education paid for.
Your local flagship state-school likely has a fairly rigorous CS program. This is especially true if you engage with the professor and ask for challenging work & deeper clarifications in office hours.
4 years instate tuition is around $15k * 4 = $60k total. That's not cheap, but not that expensive either.
If you are smart enough to end up an excellent software engineer, then you should be able to get decent enough SATs and Grades to get into your local flagship state school.
I will not be taking out a loan to go to school. I have seen too many people fall into the pit of debt, and with the current political climate with the older generation completely comfortable screwing over younger generations with false promises of success, I prefer to be financially solvent when I graduate. If my country cannot do this, then it is a failure compared to Europe.
So, that means either financial aid, or a scholarship. Are there any scholarships for low income white guys? My guess is no, because we are assumed to be on top of society already. I'd be considered an older student too since I'm in my late 30s.
Based on my own cursory search, there are no real opportunities for me to reach higher education without putting myself into potentially life-ending debt. I'm even in a state that's renowned for CS (Washington) and I have not found anything.
In the interest of trying to prove myself wrong, I looked around a little harder, and preferring government sources to any old page. https://wsac.wa.gov/sfa-overview
A lot of programs seem to be targeting mostly high school students or minorities.
It's great that those groups are getting help, but I cannot help feeling left out. Is my desire for education or a better life less valuable or less important because of my identity?
Of the programs listed on that page, I have a chance at maybe two: the State Work Study, or the College Grant. The College Grant seems to look at a lot of variables, so the level of coverage may not be as "free college" as advertised, though I do make less than 200% of federal poverty at present.
The others which advertised helping disadvantaged people seemed more focused on helping women, minorities, and foster children. Fair, of course, but still doesn't seem like they'd be interested in helping someone like me.
It seems like a wonderful environment for non-white, non-male students to get a leg up. Lots of stuff to help them.
I wonder if there's a male outreach program to get enrollment and graduate rates up for men, since they've been falling for at least a decade...
WGU: $6k/semester. Online. If you already know everything in a CS curriculum and have the practical knowledge (e.g. databases, ds&a, calc/discrete, front-end, back-end, OSes, etc.) you can finish in one semester by testing out.
Low income? Go into sales or work in an oil field or go be a lineman for a year. Save $100k, go to school after.
If you live in Washington state, I know you know linemen are in demand.
If you’re able-bodied: this is a viable path. Risky? Yes, but that’s life.
Sadly, I am lacking in higher math so I would need some refresher courses on algebra, geometry, trig, and calc to catch up. I suspect I learned parts of those things "intuitively" so I would prefer to fill those holes in. I've learned a little about sin() and cos() with 2D graphics but a deeper understanding of math I think would propel me further. Is that something WGU could do?
I don't know what a lineman is, but I'm definitely not up to hard labor; recovering from tendonitis I got from a recent agricultural job.
Is electrical easy enough on the body? I've daydreamed about a dual CS/EE but I imagine the grit required for that path is far beyond the resources available to me.
Thanks for the recommendation, though, I'll look at it.
> Are there any scholarships for low income white guys?
You seem to be really focused on this specific "low income white guys" thing, but you are missing forest for the trees.
I cannot speak for every single state in the US, so I will just give one example. Georgia (since I attended college there as a "low class white guy", so i am very familiar with this specific one) has HOPE+Zell Miller scholarships. The former covers 90% of in-state tuition at any public GA college, the latter covers 100%. For the first one, you need a 3.0 GPA, for the other you need 3.3. Both are available to every GA state resident, including "low class white guys". This allowed me to graduate pretty much debt-free from a great school.
I presume a lot of states have some similar scholarships/programs. And that's on top of federal financial aid+other forms of financial assistance.
> You seem to be really focused on this specific "low income white guys" thing, but you are missing forest for the trees.
I realize it comes across that way, but I'm keenly aware that most assistance for college, in the States at least, is highly based on unchangeable traits of each student. It's worth considering that when you are a student who will be unfavored due to those traits. What forest do you think I'm missing? Do you think my sex and ethnicity won't be taken into consideration? It is for other students, why would I be any different? Is it because it's somewhat uncomfortable to talk about a crack in the system where people are assumed to have favor and resources to gain an edge, but in reality don't? If the bias was as strong as is perceived, we wouldn't be having this conversation because I'd have graduated in my 20s.
Everyone deserves an education. We should be more like Europe in actually investing in our people.
I have the opposite experience, though in a different country than yours.
Most people I've met in the industry that did not have a formal education (or an interest in one) would end up scratching the surface and not really dig deeper. The best programmers I know did go to great college programs. Not that the programs made them great programmers, but they acquired a breadth (not depth) of knowledge that prepared them for a lifetime of learning.
Without formal education it's very hard for you to know what you DON'T know. You can go very far in this industry without ever touching a book, giving people the assumption that it's a waste of time. Bootcamps prepare people for work leave it at that, where many people stagnate.
College has quite a few problems, and for some really driven people it's not necessary, but on average it works.
I would say my own experience actually comports with what both of you are saying. Anyone I've worked who self-taught over 20 years ago is damn near universally talented, dedicated, and good at what they do, both because they stuck with it and gained decades worth of experience, and because they loved computing enough before it was trendy to actually care and teach themselves something like this over 20 years ago.
On the other hand, if you're talking about people who decided in the last decade, as tech salaries exploded and other industries dried up, that they could just learn to code without a formal education because everything is on the Internet anyway, they seem to largely be bare-minimum "I understand roughly how a browser works and damn near nothing else about computers and networks and distributed systems" types.
And the quality of a brand-new college grad is almost always lower than a multi-decade veteran, regardless of where they went to school, but that doesn't mean the education was valueless. That doesn't seem like a revelation.
> I also tend to read more papers and technical books
I have only met one self-taught person who reads anything like this. My experience is exactly the opposite. Most self-taught programmers are great at programming and solving business problems, but tend to be less technical and think academic stuff is a waste of time.
Funny. It might be the companies that I've worked for but I tend to find with _all programmers_ is that we're all too often focused on the individual problems at hand and their complications and we fail to recognize them for the simple, well-described academic problems that they actually are. Often there's some self-imposed and pointless complication that prevents us from reducing the problem we're working on and we'd be better off changing the constraints than going down the road we're already on.
The academic stuff is invaluable, but people only get a small nibble of it in their degree programs. That's why I value the knowledge over the education/process.
My argument would be that having the education/degree does not help you correlate the day to day work in the field with what you learned to get that degree. The degree is worth dirt if you can't apply that experience to your job and I think that's the case an above-average amount of the time.
So maybe getting the degree isn't necessarily the best path to get into our industry.
> having the education/degree does not help you correlate the day to day work in the field with what you learned
I also agree with that. The vast majority just aren't interested or did the minimum to pass classes, without really absorbing it.
What I disagree with is the self-taught correlation. The people who can do what you describe overwhelming are academically curious and have degrees.
> maybe getting the degree isn't necessarily the best path
I think you'll find a similar pattern in all fields. I think what's more in question is the ability of education to transform ingrained aptitudes and interests.
In my experience, it's very rare that there is a self-imposed and pointless complication that prevents a real problem being reduced to an academically tractable one, and far more common that there is a second-rate programmer on the team who thinks there is.
I dunno, I’m consistently having to teach PhD folks stuff at FAANG and I didn’t go to college. A lot of them only have a cursory understanding of distributed systems, graph theory, type theory, abstract algebra, compilers, etc.
I really disagree with your point of getting a degree.
Don't get me wrong, I don't personally think that a CS degree is useless (or an engineering one). I hold a masters in chemistry and if I could go back and make it a cs one it would've been better all things considered.
But I think the following:
- getting a degree says very little about how much a person learned or absorbed. So much depends both on the quality of teaching (often low even in ivy league colleges where you're taught by assistants, ugh) and the learner. I've met many engineers with a degree obtained cum laude and they just didn't have fundamentals. They would know everything the day of the exam and have no clue about the topics just few months later. They got the degree to find a job, not because they cared. On the other hand some of the most impressive devs I know where self taught. Even among core Linux contributors plenty do not have any degree.
- internet has nowadays an endless amount of resources, nothing can stop a motivated and disciplined person from getting good at non-natural sciences such as maths and cs.
This wasn't about evaluating whether others are good at something, but about what you should do if you want to become good at systems programming.
For most people, the university is a unique opportunity. You get to spend a few years learning all kinds of interesting things, in an environment designed to support that, without the social pressure to do something that is more productive in the short term. How do you choose to use that opportunity tells a lot about you as a person.
A motivated and disciplined can learn a lot on their own. In most cases, they can learn even more in a university. But not always. Some people are not a good fit to a particular university, and some people are a poor fit to any institutional environment. The latter tend to become an entrepreneurs, as their personalities are not a good fit to being an employee.
> if I could go back and make it a cs one it would've been better all things considered.
I wish there was a better way to go about this. It sucks I wasnt mature enough to take advantage of college or have the foresight to know what I wanted to do with my entire life when I was 17 and started.
Now to get credentials, Im looking at 2-3 years of 30 hours a week of work and thousands of more dollars.
> Now to get credentials, Im looking at 2-3 years of 30 hours a week of work and thousands of more dollars.
Yeah this is my problem. I could get so much more out of education than I probably would have when I was 17, but It’s impossible to work a decent full time job and go back to school. The schedules simply won’t allow it. Part time work pays shit, and I somehow have to afford not only tuition, books, fees, etc., but a cost of living that only gets more and more expensive.
You can trade money for time (or really spread money with time) in this case, but I have no interest in spending 10+ years just to have wasted what left of my “youth” in exchange for an undergraduate degree. Time IMO is more valuable than money, because there’s no chance in hell you can ever get it back.
I’m also not interested in getting a degree just for the sale of having a degree, or even as an economic mobility vehicle. Technically if that’s all you want there are programs out there, but tend to come with too many stipulations for my taste.
I understand it can be tough, but I didn't start my cs degree until I was 31. I'm now 34 and well over half way through. Go to a community
college, then transfer to a state university, they are both cheaper and usually offer evening classes. I was able to work as a full time dev while going to school part time in the evenings, and that's as a (active and involved) single parent. Wfh and virtual classes helps a lot though. Not the fastest way to a degree, but it will get you there.
'Was' because I was laid off in Dec last year and have had a hard time in todays market with only 1.5 years of professional experience. But when I am not working, I just take more classes. Admittedly, I am staying with family, but with that extra support, this is all possible for me. Working full time and taking summer classes, you could finish in 5-6 years.
And yeah, because I truly love cs, and I've certainly learned alot about myself as an adult, I definitely feel like I'm getting more out of this education than I would have if I started out of high school. I'm not just here for the paper, I'm here to learn, but a degree is a nice prospect for a high school drop out. It wasn't the best path to get here, but I have no regrets. Coming from a decade plus of food service work, me and my kiddos prospects are drastically improved, and I feel like I've found my calling.
> not interested in getting a degree just for the sale of having a degree
This thread is about learning stuff that is helpful for the systems programmer. One way to go about getting a degree is to learn as little as you can get away with, but you get the certificate. Another way is to take the opportunity to learn stuff, and a degree course provides structure and resources to help that. The certificate is gravy, knowledge is the protein. The value for money of the second way can be very good. Was for me.
I wouldn't say impossible. In my late 20's I pursued a CS degree from a tough school by utilizing online courses, and taking jobs that had enough flexibility to work around my school schedule. Not easy, but I am at least a counterexample why it isn't impossible. It took me about 1 year longer than I think it would have taken someone who wasn't working, though.
> and taking jobs that had enough flexibility to work around my school schedule.
Where? Most jobs I can think of offhand that offer that sort of flexibility pay a pittance, like barely enough to live, let alone pay for large education expenses on top of that. I suppose you can also find work at night, while doing schooling for the day, but I wonder how the sort of sleep schedule imposed by that will effect you work in both.
I can't really say without exposing my identity in a way I'm not comfortable with, but I took a lot of work at night if I could, and if not, I took flexible jobs like Uber/Lyft that allowed me to make my own hours. My main gig allowed me to reschedule and move stuff around if I had to, which was critical.
I'm not saying it's easy, but especially in today's age with the popularity of online degrees, it's not impossible.
> Coursera unfortunately won't make the cut most of the time.
This is a truly bizarre take... Coursera offers much of the same courses you'd get in a BCS or sometimes also a MCS degree.
Add to this that most colleges are downright awful, with hilariously incompetent professors / TAs... and virtually none really prepares students for working in programming industry, (nobody teaches version control, project management, infrastructure, editing tools, quality control). There's very little a programmer can get from going to college in terms of useful knowledge.
In my opinion, it's better to pick up a few books on some theoretical aspects couple years after you have enough of practical experience with programming in industrial setting. Coursera would help here. College would be hugely problematic due to being a huge time sink (inconvenient and rigid times for lectures, workshops etc.), hugely expensive, and, in most cases, outright lower quality.
Degree is good to show something to HR, especially if you have nothing else to show... other than that? -- not so much.
One thing university can do is help minimize procrastination. If you have financial and socially visible skin in the game you have a reason to show up and do the work as prescribed. I personally find it hard to stick with Coursera courses but never had a problem completing university courses. YMMV
I think it's worth noting that some of the most celebrated programmers have been self-taught – think Aaron Swartz, John Carmack, George Hotz and so on. Among leading academics also, it's not unusual to find those without formal undergraduate degrees in CS. Many come from mathematics backgrounds, including several Turing Award recipients.
In the world of software development, degrees have often held less sway, and I think this trend will only become more pronounced. Too much focus on CS degrees I feel does not account for the inherent nature of the role - and I say this as a CS grad from a top school.
It's a bit self-aggrandizing to make decisions based on comparing yourself to exceptional people, though. It may be that John Carmack didn't need to graduate, but that the average programmer could still benefit from structured learning and a suitable environment.
I have a particular perspective on this: I well into my own career now. I'm presently chief architect at an automaker, and a decent enough systems/embedded programmer - you've probably used some code I've written today at some point. And I didn't even graduate high school.
I've often had a chip on my shoulder about this when I was younger. I am particularly sensitive to "so what school did you go to?" class distinctions when I encounter them. I fully agree people in tech should get a chance to be evaluated regardless of their academical background, and I definitely don't insist on one when I hire.
That said, there's an even mix of great people around me who have spent extensive time in education and academia, and those who have spent none at all. The ones who did rarely regret it, and often found ways to use the environment to its fullest.
I got lucky, too: I fell in with open source instead of, say, online gaming as a teen, and spent my "idle afternoons as a lazy kid" fixing bugs in browser engines and other things that turned out to be useful. Because that online environment was motivating and because I had some fantastic mentors. I'll forever be grateful to my past friend who sent me his yellowed old copy of Wirth's "Algorithms and Data Structures" - with code examples in Modula-2!
IMHO: Forget about exceptionalism, what matters is what you spend your productive hours in the day on and who you do it with. For many their best, easiest way to get something like that in place is likely to attend a university. There are alternatives, but make sure you seek out some version of this.
Gates was also taking upper and graduate level courses as a freshman/sophomore.
And technically, Gates is on an extended sabbatical from Harvard. He took leave to see if this software thing would pan out. If it fails, he still has Harvard as a fallback plan.
Yes, but George Hotz went to CMU after already accomplishing more than many of us might accomplish in our entire careers. So the broader point on pigeonholing still stands.
I agree that for the average programmer, the CS degree still helps, but these outliers remind us that talent can blossom in many ways!
I used to think that too when I was younger a way less experienced. Suffice to say, not so much anymore.
The reason, apart from US which is unique in this in worst possible way, is something else than just pure code hacking skills - these are not that important. What even the crappiest school will teach you way better than no school at all - discipline. Wading through tons of useless topics (at least in my case), its hard to be self-centered primadona.
Real work looks much more like meetings, wading through tons of documentation, accepting mundane tasks since they improve things overall but are not fun at all. Brilliant self-thought people usually require fun and challenging work or they quickly move away, which most work isn't, even in software. I'll take OK disciplined guy over stellar one which needs management babysitting re what I mentioned, any day. YMMV.
But yeah what is actually taught in school, at least in my era, was basically useless at work. The stuff that helped were my projects where I picked/created topics that actually helped me to get better at given area.
I'm not sure school teaches you discipline rather than filter out the people who don't have discipline by making them unable to graduate unless they ingest all the useless crap taught there (together with the useful stuff).
If you can't teach an employee to be more disciplined when you can put their job on the line, I don't know why you'd think that even the crappiest school knows some secret to teaching discipline that you don't.
Of course that means if you're hiring and need somebody with "discipline", maybe hiring a CS grad makes sense. But if my hypothesis is correct, a high school student probably wouldn't benefit from going to university to learn "discipline". Not that I think putting up with crap is something I'd want to actively learn.
However, I'm sure that the ideal (if not the norm) in systems programming companies is that you did finish at least a bachelor's degree. So it's not like you betting against formal education is a good idea.
"Among leading academics also, it's not unusual to find those without formal undergraduate degrees in CS. Many come from mathematics backgrounds, including several Turing Award recipients."
Before 1975, computer science degree programs were pretty thin on the ground. Most of the Turing Award winners have degrees in physics, mathematics, or electrical engineering, which were closely related to CS.
Fortunately, today, you can become interested in CS topics and easily find a CS program without going through one of the other disciplines.
I think it’s a little more complex. Reflecting on a decade ago, my then relatively young PhD advisor, along with many colleagues, came from a myriad of backgrounds – applied math being a standout. And some of them ended up doing really remarkable work - almost everyone has used some work that came out of our lab.
So I think pigeonholing on CS is not a good idea. My stress on achievements was just to underscore this point.
I graduated with a BA in CS (which is no longer available), and am pretty happy to have skipped the chem/bio/physics requirement; those are a lot of work for very little gain as far as I can see. I've gotten much more use out of the formal logic and automata theory classes (which weren't taught by the CS dept.).
> in the rest of the world where it's affordable/free, most would hesitate to hire self-taught developers, even in web development positions.
I live in a country with free education and nobody cares about developer education, if said developer has some experience.
I, myself, dropped university in the last year (it was my mistake at that time, but whatever) and the only real issue it caused in my life is that I can't easily get work permission in Europe (and many other countries) if I would decide to immigrate there. And even then it's possible to compensate lack of degree with work experience, I just don't exactly know how it works, because most of my work so far is kind of "self-employed freelancer", so I have no idea how I would prove my work experience to the visa office.
That said, getting proper education is not a bad thing, it's just not very essential, at least in my experience.
> US-centric view of tertiary education being a risk due to large capital investment
I can't help but think European perception is a little exaggerated here. Yes, the live on campus and party at age 18/19 experience is expensive. But, getting a state school degree on a budget, and maybe a year of community college? You're looking at 10-30k.
The bigger risk is opportunity cost since degrees start later and take longer.
I partied for 5 years and got a masters and that cost me around $20k in loans (Of which zero was tuition, it was basically mostly the rent, books, food, and drinks).
If given the choice I'd do it again of course. Even if what I ended up doing had nothing to do with what I studied I'd do it again. Even if you told me that if had started a developer job at 18 I'd now be making twice what I'm doing today at age 45, still do it.
If you're 45 now, you studied probably in the late 90's?
In many cities today, rent for 4-5 years is going to be 40k. I live in Edinburgh, where we have a large student population. Getting a room here is going to be the guts of £8000/year, before you've eaten anything.
Yes 1998-2003. Rent was sub $200 for most of that time, and tuition/fees $0. This was in a Swedish city of less than 100k people. Same rent now is still under $300-$350 I believe. I actively chose among smaller cities because I had no desire to pay $500/mo in e.g Stockholm as I would then need to work.
The most expensive rent was a flat I shared in 2001 near Glasgow cathedral. About £300pp/mo I think it was (£900for a 3 bedroom).
I lived on around $750/mo of which $300 was a govt grant and the rest was the loan. This felt pretty easy to live on, did not have to work weekends to make that work, though worked summers for some extra money for things like travel.
If I were to do it again I’d definitely do the same: pick a university where I could keep costs such that I could drink on weekends instead of work.
I tried to debunk the notion that university is always an expensive investment and can’t be relatively cheap both in living costs (if in a cheaper city) and tuition.
If you're not 18 and starting from scratch, you can learn these things without getting a degree. The overall point that I agree with is that you shouldn't neglect fundamental knowledge in the field regardless of whether you have formal CS education.
> And no, Coursera unfortunately won't make the cut most of the time.
Some of the best universities in the world have computer science materials online (on Coursera and youtube), I don't get how that's inadequate.
> most would hesitate to hire self-taught developers, even in web development positions.
Not true for experienced candidates. If you have no experience, you rely on your degree to get the first job; and if you don't have a degree, it can be difficult to bootstrap that process but the further you get in time from your education, the less relevant it is.
One of the unhelpful discussions I see online is the suggestion that you may not need to have academic knowledge to be a “developer”. After all, can’t I just watch some React tutorial, code a couple of websites, and be done with it? That usually takes the form of the infamous “In real life never have I have ever inverted a binary tree”.
Well, I did. Many, many times. I implemented binary trees, B-Trees, red-black trees, tries, learned indexes, linked lists. And I am not saying this to brag: the challenge here would be to find a single systems developer who didn’t.
Much of what you do at system level is adapting data structures to new environments, where just using standard data structures won’t do. Big-O notation is another example. They are part of systems level discussions all the time.
By “academic knowledge”, I don’t mean you have to sit for 5 years in a university classroom. I mean the kind of knowledge that you acquire by going through the books and exercises one goes through in the “boring” courses in university. If you can learn that by yourself, that’s all good too. I have a great friend with whom I worked for years that never went to school, but he could run circles around everyone in the Linux Scheduler.
In my experience, though, few people can, and sitting through 5 years of university does help a lot. Unfortunately.
> Get a degree in Comp. Sci/Comp. Eng or at least some STEM degree and then a Masters. I understand the US-centric view of tertiary education being a risk due to large capital investment but in the rest of the world where it's affordable/free, most would hesitate to hire self-taught developers, even in web development positions.
I can agree that having a BSc would be an asset. Most employers understand Master's contribute almost nothing unless your particular niche is something in systems (compilers for example). However, systems advisors are few and far between these days. You're much more likely to find one of the millions of AI/ML MSc's. Maybe for a research position or something it doesnt matter as long as you have the paper. Even then, you could make an argument for systems programming that a BSc is STILL sufficient. My systems programming classes at the graduate level were basic bullshit. Nothing I couldn't have gleaned from reading either "Modern Operating Systems", The Dragon Book, Engineering a Compiler, or any number of the MPI books.
Lastly, I have the requisite credentials. I work side by side with self taught engineers. Very few companies will not hire a non-degreed person if they can show good work. The idea of "work in open source" is dumb and lame. If that's your cup of tea - great! 99.9% of people don't have enough passion about a single tool, and a single code base, to slog through it to get "noticed". Better to implement your own toy stuff and just talk about it online if you really care. The author's 10x cyber web developer ninja nonsense is a very 2000's way of thinking about "getting noticed".
My best advice to people is usually to get a BSc so you have a strong foundation in Math and Computer Science taught in a structured, standard way. I also advise people to not spend more than ~$20,000 or so getting it. At that point you're usually young enough that the opportunity/time cost is extremely low and ~$20,000 can be paid off pretty quickly even if it blows up in your face. ABET accreditation is an amazing thing. Aside from the "prestige" you're learning the same stuff MIT is. Personally, I paid all-in about $27,000. Worth every penny at that cost.
Everything else, like all things in life, can be boiled down to "just do it". I also work with a lot of MScs. There's a reason they report up to me and it's not because I have more "pedigree". Study theory all you want. At the end of the day an application/idea/paper/etc implemented is more important than waxing poetic about theory.
My only advice for people starting out their career is to make sure you are surrounded by really good people.
All the good things that have happened in my career have been because the people around me have been amazingly good.
Find those people, and stick with them - they will take you to places that cannot reach by yourself.
This also means you need to be friends with people and maintain those friendships.
Also, if you ever find yourself feeling like the "smartest in the room" it's time to start worrying. You are not going to learn anything in that situation unless you are a very special kind of person.
> My only advice for people starting out their career is to make sure you are surrounded by really good people.
I keep hearing this, but I have a hard time actually finding such people. There unfortunately aren't events like hackathons around where I live, so although I'm sure there are cool (in a professional context) people around me, I'm never able to figure out how to find them. I have an amazing set of friends but they're entirely into the arts so coming by tech work I can do through them is rare.
One thing that tech people tend to focus on it tech. As I replied to my own comment, good does not necessarily mean “good at tech”. Really talented people will attract other really talented people. You just need to make sure you are in the same orbit and “networking” with these people.
An amazing artist will bring all sorts of fascinating people into there sphere of influence.
The smartest people around me seem to hang out at obscure/niche programming language meetup events.
You’re gonna get a very different crowd at something like your local Rust/Elixir meetup group vs the .NET User group, as it’s likely a strong signal they like to tinker with new paradigms/programming languages vs just showing up for “networking opportunities”.
I'm not sure how well "like to tinker with new paradigms/programming languages" correlates with "really good", though. Some of the best people i've worked with were quite conservative technically (some weren't keen on this new 'Java' thing), but were masters at finding the right way to approach problems, being conscientious in their work, etc. The correlation coefficient probably isn't negative, but it's not 1 either. 0.3?
Meetups are a crapshoot. When people are involved in the community out of passion it's a great thing. Unfortunately, and this was often the case at meetups I was going to in NY, a lot of folks are there to add organizing and talks to their professional reputation to get some kind of edge at work. These people also tend to find each other easily and coordinate to give each other the best opportunities.
Not to single out any specific community here...and my experience especially in the Elixir community was lots of passionate people.
I have worked with some (actually quite a lot of) amazingly clever people that did not give me much more than a frown from time to time. Or if they are a bit more well behaved not even that.
Find good mentors, i.e. nice people who have a good overview but will frequently take the time to discuss things on your level. And pay them back with respect of course.
Find good mentors, i.e. nice people who have a good overview but will frequently take the time to discuss things on your level. And pay them back with respect of course.
I guess for me, those are the people that I would include in the “amazing” bucket.
> Also, if you ever find yourself feeling like the "smartest in the room" it's time to start worrying. You are not going to learn anything in that situation unless you are a very special kind of person.
I typically sit in an empty room, making me the smartest in the room by default. So im curious to know what you mean by "a very special kind of person", maybe itll help me learn better.
So this authors example of an ideal young systems programmer looking to get hired was one that provided (free!) significant contributions to their Golang client, their database and _an academic paper_, presumably over the course of many weeks (months?).
I don't disagree with the advice of contributing to open source, but I hope they realize that they are essentially telling readers that contributing unknown amounts of hard, free labor is the best path to getting a job in this subfield of tech.
(Meanwhile, the kid who went to Stanford will just apply and probably get an offer if their DS&A chops are fresh enough.)
(Also, I'm guessing your contributions don't count at some places if your PR/MRs don't get merged, which is the other gnarly thing about open source that complicates this advice. Big open-source projects tend to have big politics behind them, even if they are all entirely online, like working groups, the release process, general disagreements (which will happen; every contributor is smart, and smart people love friendly debate!), etc.)
> So this authors example of an ideal young systems programmer looking to get hired was one that provided (free!) significant contributions to their Golang client, their database and _an academic paper_, presumably over the course of many weeks (months?).
That's not how I see it! I love databases and open source; libsql seemed right for me. I had no idea (or expectations) I would get hired by doing so. By contributing to open source, I am getting to work on some complex codebases where some brilliant people are helping me with my code in pull requests. Isn’t that awesome?
Sure, it may only work for some, and this isn’t the only way to systems programming. It is totally okay if someone wants to take a different path.
Instead of focusing on what’s wrong, why not use this opportunity to help and guide others in a similar boat?
To rephrase, how would you advise someone like me to change the domain from the backend to systems programming? For someone who doesn’t have experience with systems programming, knowing only Python, and Go professionally. During the (previous) job, I was working on scaling micro services and building web backend. There was zero room for systems related stuff.
It's awesome that you found a project that speaks to your interests and is fun to contribute to.
In fact, I often recommend folks looking to get into tech to do exactly that, or at least have a few side projects they tinker with to demonstrate proficiency and willingness to learn.
My complaint here was with the authors using your journey (which you weren't doing expecting to be hired, which is important) as an example of what others should do to get a systems eng job.
Honestly, if you already have development experience and want to move into some other subfield, my advice in your general case would be to use your network to get a referral into companies you're interested in or message recruiters offering those jobs indicating your interest.
This is like saying "if you have a lot of money to throw at the problem, you will likely solve it". The kid who went to Stanford could afford to go there in the first place. A lot of things in life are different for kids like this one, hiring notwithstanding. That kind of "kid" probably won't need to go through the same job application processes as someone who could only afford a community college.
Also... comparing time and money investment you'd have to make to get into Stanford to investment you'd have to make to contribute to an opensource project is orders of magnitude not in favor of Stanford.
Also, as someone who actually had to hire for system programming jobs -- I wouldn't care about candidate's degree and would be put off if the candidate tried to force the subject. In my experience, there's very little overlap between system programming and college curriculum. So, I wouldn't be so sure the "Stanford kid" is getting a job. College education helps you get into "programmer mills" companies like the big names with large internship / junior education programs. Smaller companies who don't have the capacity to provide on-the-job education, especially in the face of low retention factor wouldn't be interested in hiring Ivy league graduates if graduation from an Ivy league university was the only thing going on for them.
Feels like the trend lately for a lot of white collar jobs is overt gatekeeping. Don’t know if it’s a natural reaction to economic uncertainty or what, but the gatekeepers always seem to insist that everyone should be 100% committed to their job in their off hours.
Feels like the no-lifers tend to run the show eventually. And I speak as someone who did exactly that in my 20s, and sometimes regret it.
This. The snarky tone definitely detracts from any sort of well-intended message hiding behind the virtue signaling of “I implemented a binary tree and I bet you couldn’t because you work on ‘frontend’”
Good advice to new peeps in the industry: this tone and obviously inflated sense of self is the “smell” you should look out for and avoid.
I am against contributing to open source just to show chops especially if it means contributing to $corp’s repo to try and impress
$corp into giving a job. Just contribute (if you want to) to
what is fun or gets you curious. As for bang for buck: more applications, more interview question prep > FOSS contributions from a standing start. If you invented clojure or something then that is something else. But you probably didn’t.
Incoming hot take: Don't become a professional systems developer. Do it as a hobby.
If the goal is to optimize for $$$ earned over one's career, there is more money in being a back-end/distributed apps developer. There are simply more roles (at the higher levels) and companies working on these problems.
The progression for SW engineers is junior->senior->staff->principal->distinguished. As you get closer to staff, there are very few systems roles left. Some people never make it beyond staff/L6/E6. (One could argue that it's ok to stay at staff for the rest of your career and still make good money. But there's always more to be made.) And the ones that do, are the ones that spearhead new products/features (direct business impact).
My 2cents, after 15 years as a system dev in the valley.
> Incoming hot take: Don't become a professional systems developer. Do it as a hobby. If the goal is to optimize for $$$ earned over one's career
Deep systems programmers get paid a lot. I'm sure there are other jobs that pay more, but if you make enough and like what you do, you should do what you like.
Also higher up the abstraction chain you go, the more froth their it (I'm mainly thinking of frameworks, but this is true more generally) so you have to pay a lot of attention to what's going on. While the deeper you go down the stack the slower the slewing rate and the more time you have to understand the domain more deeply. Which, to go back to your "$$$" position, acts as a moat.
I suppose this ultimately stems from that fact that if a program is ugly, everyone hates it, but if a program is insecure nobody knows, and if they find out they don't care.
The advice boils down to: Contribute to open source and hope to get noticed.
I was expecting something more actionable tbh, but it does make sense. It is a bit disappointing to read that systems programming jobs are basically out of reach unless you're willing to put in a bunch of free work.
That may be the advice, but what I actually saw was: "Be really, really good at what you do and someone will notice."
That isn't possible for most people. They simply don't have the innate skills and drives that that person does. That person was always going to get a job because their passion shows through, and they do things.
It doesn't matter if it's open source or not. Having a code portfolio when you apply, even if it's a private portfolio, would always have shown their skills.
I don't think that's necessarily a problem. There are many lines of creative work where you basically need a knack for it to get anywhere. This is true in programming as it is true everywhere else.
> That isn't possible for most people. They simply don't have the innate skills and drives that that person does. That person was always going to get a job because their passion shows through, and they do things.
That is why the ones that have it get rewarded. Lots of good people don't know the next step, he is giving advice to those people.
They aren’t. The advice in the article isn’t bad, but it’s not the only way. An alternate path I would suggest is get hired by a large corporation who employs systems programmers, straight out of college. Straight into a systems role or not.
> unless you're willing to put in a bunch of free work.
People pay ungodly sums to go to school. And even in countries with "free" education there is an opportunity cost.
Let's not even get started on those that want/need to contribute to academia either as a stepping stone or a career.
From the story I got the V was looking to “switch jobs”.
From personal experience, I once had to work with an open source library at work. I got very familiar with the inner workings to the point that it wouldn’t have been to hard for me to contribute, and I did have a few improvements in mind. I never did that though.
It makes sense given that systems programming is more in the realm of cathedrals like Universities, whose whole M.O. to begin with is having you do free work, underpaid work, or even pay to do work
> unless you're willing to put in a bunch of free work.
isn't most of open source eco system standing on free (often thankless) work? I am in no way insinuating they shouldn't be paid, just highlighting the current state
Why go to uni for 5 years to get a job in systems programming if you are talented? That seems like an awful waste of time. Learn C/C++, do 2 courses on operating systems and 1 on algorithms and data structures. Work on open source systems programming projects to get spotted. That's 4,5 years saved.
I thought I would give medium one more chance, thinking that maybe it has gotten better, it hasn’t.
The author starts off with a self aggrandizing tweet from themself:
> We kernel and database people think this discussion about whether frontend or backend is harder is kinda cute. you're all adorable!
As someone that has a full stack web development job that also enjoys systems programming on the side, both are difficult in different ways and the only reason you could come to the conclusion that one is “harder” (whatever that even means) than the other is from a stance of ignorance. You literally do not know what you do not know.
Than, the author’s only career advice is to contribute to open source. That’s great, not exactly earth shattering but not really worth the long winded article to get to that point.
If the author is here, consider not starting your article with a self quoted rage-bait Tweet that adds nothing of value to the article. Maybe your intention is to capture engagement, but it leaves any reader that may have been interested in what you had to say and is a web developer disenfranchised.
It’s very easy to dismiss an entire field of technology that you don’t work in without ever attempting it. It’s different to actually dive in and try to understand why there are problems and what those problems are.
The author's intent here is for young engineers to build signal and reputation. Open source contribution is one potential way to go about that. Another comment here referenced the importance of a CS degree. There are other ways to go about accomplishing ways of signaling to gain reputation.
As general advice for those early in their career, I find this to be inadequate. These tactics (no offense to the CS peeps) might "get you noticed", but that won't sustain if you don't back it up. A github account or a cert from your favorite uni might potentially get you in the door somewhere, but you will have built expectations about what people can expect from you once you're in the fold.
Very few have ever kept a job because of their G/H reputation or GPA. The number of times I've seen a hire who was "noticed" that failed in their new role is almost meme-level. It's amazing how quickly credibility and reputation from that get-you-noticed effort can be burned down.
By all means, make logical efforts to get noticed, but that will only take you so far. You will significantly improve that signal/rep when you translate your previous activities to skills, learning, and value as you go forward.
ok, I can see how the tweet on the top of the article can have that effect. In my defence, this was a humorous tweet that happened in a week where everybody on twitter, frontend and backend, were dunking on each other. So I wrote that in a humorous way. Lots of people liked it and it was funny, so I decided to open the article with it.
However taking a step back, if you don't have the context around the tweet, it can certainly be seen this way.
Since it was not my intention to have that tone, I will remove the tweet from the article.
Thank you for asking, since I dished it out I will try and explain what gave me that feeling, although @braza has made some excellent points already.
First off, thank you for the article, it was certainly interesting for me, being a newcomer in the industry myself.
What I did not like about it began after the first two lines with you quoting your own twitter post, which gave me real "i only listen to real music" vibes in the first sentence alone, but the "you're all adorable" took it from a bit edgy to condescending. Given, that might have been an attempt at a joke which I simply did not get.
Then the part about the "common discourse" which I really failed to understand, because in my experience there are lots of different specializations when talking to fellow developers and this frontent/backend divide you perceived I did not.
And finally all that talk about contributing to meaningful Open Source projects, thereby implying that there is a league of worthy projects and other projects that are wasting ones time. Then, by chance your company maintaining some of those good open source projects and the anecdote of V contributing to one of your projects a lot, to get hired eventually.
To me this is just saying: "Work for free for software companies, and if you only work hard enough, maybe someone will notice". And while that may even be the truth, I just don't find it good advice to give to people trying to become developers, frontend, backend or whatever.
It's more about the tone itself that sounds posing some superiority due to the fact that you do systems programming.
It seems that you have a huge experience and knowledge, and it's nothing about those things but how you convey your ideas coming with a very strong background.
I'm not offended by the post because I am not your target audience, but seeing other comments here I can highlight some pieces that others can think that you're patronizing.
> We kernel and database people think this discussion about whether frontend or backend is harder is kinda cute.you're all adorable!
Right at the start you pose as some kind of "hardcore outsider" that poses as some old uncle observing some children playing around. That's the same tone and words. Of course I understand that this is an irony/joke but here you start to lose some people, specially when you talk about "carrer advice" that supposed to be something bit serious.
> There are other developers. The ones writing databases, operating systems, compilers, and foundational building blocks that, if they do their jobs right, end up becoming almost invisible to the average programmer.
We got the point of the "unseen work", but to set some importance you do not need to conflate and contrasting that with the experience of an "average programmer". If the "average programmer" does his/her job right you will have your food delivered in your door, your airline tickets being booked correctly, your municipality having the scheduling systems working, etc. Again, here you lost the opportunity to highlight why is awesome to work with systems programming.
> Lots of the advice that you see on Twitter (X?), is especially bad when it comes to systems level software.
Strong affirmation and I think you can have a hard time to support that with data. I know that is a personal blog and you can do your hot takes on medium, but again, it's not about contrast and more about to elevate how nice is to work with systems programming.
> There’s a certain level of “move fast and break things” that you would never accept from your OS Kernel.
Big statement and it can be completely debatable. I can say anedotically that this was true on Facebook and small companies... in 2016. The entire world of Tech involved a lot since, and for lot of products outage can mean end of an entire day of revenue.
> The whole discussion of whether or not you should write unit tests sound frankly quite stupid from the point of view of a compiler author or some core Open Source library.
This ends the first paragraph of your topic "Advice for systems programmers". So far you made contrasts, call names, say that systems engineering advice in twitter is bad, but no substance; no red meat so far in terms of advice.
...
I can go on, but again I am not your audience, but I think the tone matters in those days and the article has some good gems, but the start of the text and tone distracts. Having that writing attitude to "contrast -> call names -> conflate via superiority -> show advice from a self pedestalized standpoint" used to work, but now I think we're in another internet.
I did some consulting recently for a startup on the data observability space. Performance and scalability were terrible. Not to mention other subtle issues like terrible coupling between services, between classes, terrible abstractions, the inconsistency of the naming in the domain model (e.g. an object that had one name in a set of micro-services, but was named completely differently in the UI and front-end code.
And in general, the culture of the company was about churning out features fast,
at the cost of anything else.
Not surprisingly, as customers started to scale up their deployments, the problems started arising. And yet, the CTO refused to even acknowledge my advice, my carefully done benchmarks, my numeric projections. It was completely alien for him. He didn't understand that system software requires a more careful approach than your usual B2C e-commerce MVP.
I was "lucky" to get into system programming on the cusp of Go introduction. I was a refugee from ActionScript world, and was looking for something else to do with my rudimentary programming skills, mostly looking for Python jobs, especially outside Web because going from ActionScript to JavaScript was way too depressing.
So, I applied to a job posting that was looking for "Python programmers who want to learn a different language" (I think, at first at least, Go advertised itself as "almost like Python"). And then I've got a job in the automation department of the company, and from there it was more predictable and sure way forward.
After a while I also had to interview people for positions in system. Obviously, I'd be overcome with joy if I ever had a candidate who knew what our product was and was contributing to the open-source parts of it... but nothing like this had ever happened.
In most cases, people who came to interviews for system jobs weren't themselves system programmers. So, my task was to look for the best match among candidates who didn't generally match at all. It's ironic how much a typical programmer is completely unaware of how their computers function -- so, I was generally fishing for the bits of general knowledge about computers, and if a candidate could master a plausible explanation of how a particular computer component or a process could work, that was already a huge plus.
Now, how can you possibly acquire this knowledge? -- Really, I cannot think of a better way than through contributing to an open-source project, if you aren't already hired by a company that employs you as a system programmer... College doesn't teach anything relevant. Even online boot camps rarely have anything relevant. There are some books, but, mostly woefully outdated and they don't generalize well. The knowledge mostly comes from first-hand experience and following various mailing lists, bug truckers and every so often a conference.
I don't know if my experience is the norm or wildly different, but when I started out as an electrical/automation engineer, hiring low-level programmers was way closer to hiring "traditional" electrical/electronics engineers, than the modern leetcode SWE ordeal.
It makes sense, no? Somewhere in time, developing software was split into multiple jobs but the intention is still the same: computation with different I/Os.
Interesting to see this here... I unexpectedly transitioned from full-stack development to paid open source systems programming a bit more than a year ago. It would have been quite more difficult without my contributions to the Rust compiler and ecosystem back when I was at the university, and it still feels like I got very lucky.
The author has co-opted the term 'Systems programmer'.
In the original Enterprise computing environment (big iron), a 'System programmer' is one that maintains the operating system, transaction processor (CICS), network stack, etc.
However they seem to be falling into the same pitfalls with the frontend rockstar programmer-influencers; omitting and even undermining the importance of formal computer science education.
Especially if we're talking about getting into non-web development/IT roles, it's quite a lofty goal to expect mastery in programming complex software without some structured curriculum that will help you obtain the fundamentals to do so. And no, Coursera unfortunately won't make the cut most of the time.
Get a degree in Comp. Sci/Comp. Eng or at least some STEM degree and then a Masters. I understand the US-centric view of tertiary education being a risk due to large capital investment but in the rest of the world where it's affordable/free, most would hesitate to hire self-taught developers, even in web development positions.
The degree may not be enough for systems programming competency and this is where advice in the article about open source contribution comes to play, but I'd say it's kind of necessary unless you're some bunniefoo type of brain or idk.