I'm learning to code at the moment (Python this summer after learning the basics.)
I kept talking to developers online to find out about their backgrounds as I don't have a CS degree. I figured as I was already asking people how they learned to code I might as well write up some proper interviews and share them with other people. This way I can scratch my own itch and stay motivated as well as sharing motivation with other people.
You can check out my traffic/revenue at my open page which I have started from day one instead of waiting until big numbers www.nocsdegree.com/open
I'll be interested to see what variety of stories and individuals you interview. I know learning to code today is far different than it was 25 years ago. It would be cool to see the stories on a timeline once you have more.
Thanks for this. I began programming when I was 8 on a Sinclair ZX Spectrum 48K from books I liberated from my Mom back in 1983. I grew up as the internet was just becoming a thing, communicating with other would be developers and hackers on IRC channels. I still haven't lost the bug. I'd like to say my CS degree studies were useful, but they were hopelessly inadequate and so constrained and tedious as to kill any further interest in formal education. I ended up dropping out and continued to learn informally and build a successful career over the next 23 years.
It's inspiring to read about developers who are also informally educated. It brings a sense that people like us are more common than we think and that we're really not alone. They're also finding great success despite the prevailing wisdom that you can't make it without a degree. People like that are proof that you can.
Well, I started on ZX-80 at school then did a CS degree which I didn't really get at first so I struggled in the first year - but in subsequent years I came to really enjoy the more abstract and maths oriented parts of the course.
I don't know where the idea that a CS course is a good practical training for a career in development came from - I'm pretty glad the course I did included almost nothing that was attempting to "train" you and focused mostly on the absolute conceptual fundamentals (from the electrical engineering side through general engineering maths to specialised CS subjects) as well as letting us loose to actually build stuff with minimal supervision but careful evaluation.
[The thing that really got my attention was the lambda calculus course where the lecturer mentioned the S & K combinators, of course the same course covered the Y-combinator!]
I think its pretty well known that you can work as a successful developer without a CS degree. However , as someone who is currently working through a masters in CS (after working in software the last decade), I would say that CS courses (some, not all) provide invaluable foundation that would be difficult to obtain (of course you can self study CS). Sure — you don’t need to know how the OS works to write a web app that rakes in cash . But there’s something beautiful about peeling back the layers of abstraction : you gain an appreciation of how things work underneath the hood.
You can "peel back the layers of abstraction" without a CS degree, all it takes is time and (admittedly rare) dedication. Webservers, operating systems and books on theoretical CS are all out there, you just have to be interested.
It's possible to learn most things through self-study. But the vast majority of people will only learn the parts that they find fun and interesting.
They generally won't wrestle with the tough sections in a systemic fashion, the way you are forced to in a decent CS program.
For most people (even most professional developers) the only practical way to gain the equivalent knowledge you'd get with a CS degree, is by getting a CS degree.
I worked for years as a self taught professional developer before going back btw, and I've hired/interviewed many boot camp graduates, self taught programmers, and degree holders.
No, you don't need a degree. All you need is a resolution to learn the things that you're missing. I covered C++ in all its hairy glory, assembly, SIMD, data structures and algorithms (implementing them, not just using them) and concurrent and lock free algorithms and data structures. Some of the data structures I created perform better than anything in the published literature - but I couldn't be bothered to write papers. I might do them as an in depth blog post one day.
I went way beyond what any CS grad does, and it cost me nothing in money and less time than a CS degree. If you're motivated you can beat a university CS education - it's actually really not that high a bar.
I agree with you that most people won't do that. I was home schooled so I have a different attitude about learning than most people - and that's made all the difference. But is fundamentally a problem of motivation and goals, you don't need university for either.
> some of the data structures I created perform better than anything in the published literature - but I couldn't be bothered to write papers.
You can probably imagine why many people wouldn't believe you. "My work is amazing but I am too lazy to publish it" is a peak stereotype for self-educated people. My prior on this being ignorance rather than genius is super high. And if it is true that you are a once in a generation genius who could outpace the research community then your experience is completely useless for others, given that you'd be so much smarter than a typical person who is doing self-education and trying to get a job.
It's not really that hard. For example I made a queue that outperforms the lynx queue. My fundamental instinct after reading that paper was that there's no way faults out perform bounds checks in a modern, speculating out of order CPU. I ran some tests and yes my instinct is correct. Maybe the result wouldn't hold under peer review for some reason, I just tested a few more ideas / criticisms with a colleague and moved on. I don't personally benefit from trying to publish the result and I have enough demands on my time.
I'm not a genius, unless you count an online IQ test I took in my early twenties, but I'm deeply skeptical of those. It's true I'm well above average though, so perhaps my experiences don't generalize. I don't believe that though. I still think it's motivation and goals that count.
Haha, well I'm not sure I can honestly deny an accusation of being a genius, at the same time I'm not sure I can affirm it either - and just to talk about it seems to imply a lack of humility. Irrespective, there are lots of kinds of intelligence and I'm blessed with some of the less useful forms of it that happen to test well.
So, in reality, you have no idea if your idea is truly better and it looks like you just ran some specific test cases and assumed it applied.
Still paper worthy, but far from thinking that you made anything better than published literature.
And the goal isn't to "personally benefit" it's to know that your ideas survive scrutiny and contribute something meaningful to the world.
You're making a lot of assumptions there about which your mistaken. I don't need to defend myself here. If that's what you want to believe, that's fine.
The only assumptions I'm making is what you explicitly stated. And the cardinal rule is, what's stated without evidence can be dismissed without evidence.
Either way, if you don't want to defend yourself. That's fine.
Because you've claimed that you made substantial strides in algorithms that nobody else has supposedly done. Why not get a free PhD out of the deal? If anything, you can show it to a professor and they should be able to recognize it. After all, you could be advancing the field directly.
Honestly, if you think writing a two to three page paper is "a lot of effort", I doubt you've done what you've claimed.
You overestimate the value of a paper. It's worth approximately $0. But would cost maybe a week of time or about $6000 if you only count what I can sell my time for. Terrible deal.
Yet your ideas could get you millions in publicity, fame, etc. to spend literally one week to advance the field.
The fact that you actually argue against this is laughable, not to mention incredibly selfish.
What makes you think the idea is significant enough to get “millions in publicity”, etc.?
He’s not claiming he invented cold fusion, just something that would be an iterative step in improving the state of the art, probably worth one paper in a decent but not super prestigious journal. Where do you get the idea that it’s worth a free Ph.D, fame and fortune, and all that?
Because I’m aware enough of the CS world that I just know that an iterative improvement in an obscure data structure is not enough to become rich and famous.
Why do you assume it is an iterative improvement? You can get a free PhD for a lot less. You can get rich and famous for a lot less. You don't have to make cold fusion viable.
This. It's an iterative improvement on a data structure that in reality isn't useful as used on benchmarks and the benchmark performance is a totally artificial environment with little practical significance. It warrants a blog post more than a paper. Nobody is going to get rich or famous off of it. If someone wants to write it up as a blog post, I'll give them the code.
Like whatshisface said above, quality self-study is rare. As you point out, people will learn what is fun/interesting, but I will also add that they will just learn what they need to get whatever job done.
I have a friend who does webdev (mostly Wordpress, some Drupal) who did not have go through a CS program, though he took a few web dev classes in college. He goes good work, but he has a very loose grasp on fundamentals. He showed me a side project he was doing (a web based clicker game) and after looking at the code, I suggested he try adding some classes to reduce his code reuse. After explaining the basics (and some quick research on how classes work in Javascript), it kind of blew his mind. He never used classes before in his code because he just had no reference point.
I agree on difficulty of self study by remembering my student days, simply I was asking the lecturer about why we have to study some of uninteresting CS topics. They were quite boring but really got their benefit in the long run.
We've all seen the utter messes that recent CS graduates have made with classes, unnecessary inheritance and over complicating problems, while being unable to do fundamentally basic logic, you must know the opposite problem is equally true.
CS majors who cannot program applying academic theory without understanding.
I'm old enough to remember graduates rolling their own sorting algos, or building classes 6 levels of inheritance deep. While simultaneously creating massive if/else nesting, with tons of duplicated code, unable to understand how to use basic ideas like functions and recursion, even though I'm sure they probably had a whole one lecture on the subject, mixed in with whole modules on pointless compiler lectures.
Because that's what their CS degree taught them.
How both CS graduates and non-graduates really learn is by seeing what other programmers do in the industry, or by making their own mistakes.
This is absolutely true, however in reality (= in practice) very few non-CS degree devs _will_ reach the same level of knowledge.
When you have to learn all that stuff to get your degree, then you just have to learn it. Period. Also people who are full time students have more time to spend on these topics, but when you are actually working 8h+ per day and your career is mostly around JS frameworks it becomes much harder to invest time into these things.
Obviously this doesn't apply to everyone, but I'd say it applies for most.
I don't disagree with you, but I don't completely agree with your implications either. From my experience, most people with a CS degree will not attain that level as well. Even at the masters level, a number of people will not understand. It's sad. I really feel this is a failure of universities not forcing students to learn, but I know there are a number of politics etc that factor into how hard they can make courses, and what they can teach.
There's a difference between learning specifics, and learning habits of thought.
The two best things a CS degree can do is expose you to ideas you wouldn't otherwise know about, and to force you to work on hard projects that require a combination of multi-level analytical thinking and research.
Both of those are excellent training for at least some aspects of being developer.
But that doesn't mean the details are inherently useful. There are very few situations where you will be expected to write a compiler. So in that sense compiler theory itself is optional - far less useful than the experience of having to handle a complex set of data structures and relationships, which could in theory come from other kinds of projects.
Academic CS also tends to miss out a lot of useful practical skills. It won't teach you much about management (from either side), salary negotiations, office politics and co-worker relationships, or business theory.
It may not even teach you how to write good clean code that's easy to read and maintain.
So IMO the ideal CS degree doesn't exist. The ideal degree would be a good mix of theory with plenty of industry practice - possibly with some standardised requirements that would lead to a Chartered Developer qualification that was better at guaranteeing a working blend of practical skill, theoretical understanding, and analytical talent than current degrees seem to be.
>The two best things a CS degree can do is expose you to ideas you wouldn't otherwise know about, and to force you to
work on hard projects that require a combination of multi-level analytical thinking and research.
I agree that should be the case, and sadly enough, I've seen a number of people graduate college with degrees in CS and not have that. There have been a number of times when I'd mention some non-esoteric concept that should have been covered and the response is something like "huh"? I'm not talking about things like "Oh you don't understand how to implement Redux?", it's more things like "Ok, you need to compute the intersection of these two arrays." You are right, they probably have been exposed to these concepts, but they have no idea how to actually do it. More importantly, they grasp so little, they didn't even know where to start. The saddest one I saw was a student that was wicked smart, and the school didn't challenge him enough to struggle through any projects. When he came to intern, he was lost, because he'd never been actually challenged. (He was from a major public university too.)
Don't get me wrong, I disagree, there are a number of great CS programs from both public and private universities, and actually the good ones are exactly like you mention (both theoretical and practical application), but there are a lot that aren't.
There's a huge difference between taking the easiest path through a degree (mostly Cs, the easiest electives you can take etc...), and someone who pushed themselves while in college. That's why if the degree is a big part of someone's resume, I ask for a transcript.
Your comment goes to the heart of the debate: does understanding what’s going on behind the scene of your tools help you become better at using them? I think for the vast majority of jobs it does not, but for a few it absolutely does.
For me, understanding how a compiler and cpu/RAM works and is put into machine code and later on a programming language means that I fully understand what programming is.
It allows me to make sharper categorizations whether something is mathematical, architectural, security, programming, framework related or a best practice.
This again gives me a good feeling of whether something will be easy/quick to learn.
If so, though, then a CS degree in general is sort of pointless, isn’t it? But if you can say that about a CS degree, what degree could you really not say it about? I suppose a medical degree is “meaningful” in the sense that you can’t get access to bodies to dissect without attending medical school, but if a CS degree is a waste of time, then pretty much every degree is a waste of time.
I completely agree, Hackernews has really helped me personally. Tons of interesting articles over the years on LLVM or the inner machinations of garbage collections. Picking the brains of clever CS friends also helps a lot too!
It seems like you’re saying it’s nice to know the layers of abstraction but it sounds like you don’t use it in real life.
As a non CS degree developer I can’t really see anything that I’m missing because of not having the degree. I have a successful business, get hired for freelance jobs for a good salary, can build anything I want, ...
Would love to know what one would get out of having the degree versus self study.
Self-study verses earning a degree is a red herring. While there are some advantages to studying in an institution, the degree is simply there to tell others that you have studied a particular curriculum. My only concern with self-study is that a lot of resources are the educational equivalent of get-rich-quick schemes, but that says more about the people who create those resources than the learners themselves.
As for knowing the theoretical basis of computer science, that will have value in some parts of industry and very little value in other parts of industry. While someone in your position may have a high degree of success working in the upper layers of abstraction, someone has to develop, advance, and maintain the lower levels of abstraction that you depend upon. None of that is meant to say that you need that theoretical knowledge to be successful, rather it is important for some people to have that theoretical knowledge to ensure the success of the industry.
The original comment is about engineering competence and having the comprehensive understanding of subject, which is not just limited to running business and getting monthly paycheck to pay the bills.
Some benefits that it will give you:
- It will actually let you move into different positions within tech/it industry when you have wider/deeper understanding of how things works.
- As someone said already in this thread: "allows me to make sharper categorizations whether something is mathematical, architectural, security, programming, framework related or a best practice."
- You'll be better at your job. Maybe not every day you need to know what's happening under the hood, but there are and there will be days when you need to. Even if you only developed JS frontend apps whole your career.
When you actually say "I can build anything I want", then (although I don't know you) I'm pretty sure that you can't. People who get that deeper understanding of things also understand how complex some things are and how complex some things can get.
If you had a CS degree, you'd know you can't build anything you want cough halting problem cough.
I'm surprised this got down voted since it's 100% true.
Engineers with degrees work for the contractors. They minimize materials and cost. The result doesn't always remain standing, even without an earthquake:
Theoretical and CS fundamentals has never been an issue for me (no degree), because I find them interesting. Probably more interesting than most of my coworkers. I think you'll find this is the case for many people who end up in this industry out of passion rather than educational path. A year unemployed during the .com crash gave me lots of time to work on open source hobby projects, where I wrote my own virtual machine, compiler, etc. That was fun. Wish I could afford to do that again.
Honestly, what I find I'm missing is mostly class status and a piece of paper.
I'm at a point where I don't want to do (web) app development anymore and want to switch to something more interesting (to me)so I'm not stuck doing something I hate for the next x decades. Unfortunately, it seems that what I want to get into (low level embedded stuff, firmware development, etc) seem almost neccessary to have a degree (or even a Masters or PhD). I assume this isn't mostly because of the level of EE knowledge required. Unfortunately going back to school is out of reach now
It actually is because of the theory required. If you go low enough, more happens in your head and less in your tooling. It's why there are low-level and high-level languages.
The lower you go, the more you need to know (and do) yourself. That is where CS degrees do help, because without the benefit of layered architectures of shared libraries, systems and code in general you need to know what those layers did in order to know how to do the work without them. That said, low-level doesn't always mean the same thing. Some people think writing software in C is low-level, but when I think low-level I mostly think of assembly on bare metal with no OS or anything like that.
I have coworkers doing that without a degree. They did however show up with experience.
Personal projects will do. You could work on Open Source software. Obvious choices: qemu, valgrind, FreeRTOS, RTEMS, Linux (kernel), SeaBIOS, gcc, clang, ghidra, binutils, MAME, OpenOCD, gdb, dosemu, dosbox, FreeDOS, Wine, SDCC, dolphin-emu, Xenia, coreboot
I really appreciate this as a self taught dev with a full time full stack job. I worked my ass off for 3 years, taking online courses, building product after product for people to actually use and ultimately landing a well paying and satisfying job. Things like this make imposter syndrome a little less nagging in my every day life.
That's awesome! Honestly, I have interviewed tonnes of people already that are doing great with no degree. A friend of mine just got a job after taking a few months out to learn from scratch with Udemy, etc
I'm 39 years into a coding career with no CS degree. But as a compulsive auto-didact (probably a common syndrome among HN readers) it hasn't been a barrier. Self-learning is a continual, daily requirement for coders. If you can continue your education as needed for this job you probably also have the skills and interest to learn from scratch.
I studied the same books and did the same exercises as my brother the CS major and do feel that my training would be incomplete without that. But I don't feel disadvantaged by not doing that within a class structure.
The main thing I lack is access to government jobs, which routinely require credentials I don't have. But I've probably had a more diverse and satisfying career as a big fish in small private sector ponds.
Not everyone can learn coding without externally imposed structure. But those who can't probably have an ongoing problem in keeping up with the state of the art.
I think it's possible but when bidding for contracts I think it matters. When I worked at a smaller company that worked government contracts my lead was always telling me I should work on getting a masters as it looks more attractive.
>a custom build of the open-source search engine Solr, a highly responsive UI engineered on top of React, a high performance distributed brokerage system, and cloud-based hosted services with Kubernetes in Amazon Web Services. The primary programming languages are Python, Java, and JavaScript.
You're lucky. When I worked for the federal government(USDA/USFS), there was no way I was going to get access to non-windows servers for deploying my projects. When we brought up the idea of using AWS, they told is that it was impossible as they had no way to handle reoccurring monthly billing. (obviously, this is a lazy excuse). The only node project I managed to get deployed ran behind Apache on Windows Server 2003... and it performed as horribly as one might expect an event-loop to perform behind a threaded proxy.
> The main thing I lack is access to government jobs
I guess my question would be which government? I do government contracting (US), and degrees are not required. The labor categories are typically written so that if you don't have a degree, you just need an additional 4 years of experience. On almost every contract I've worked on I've met a developer without a degree.
It depends on the position. It's a lot harder to get work as a government employee without a degree in the US, but contractors seem to have more flexibility. I worked for a government agency while I was in the military, and I can't even get an interview for the exact position I was doing for a couple of years because I don't have a degree. I know a few people who've missed out on jobs because the government position has a hard requirement for a degree, even if it's not relevant to the position (like computer science for a security position).
A decade ago when I was on the job market I saw lots of ads for government IT jobs, seemingly all listing CS degree requirements. So I didn't bother applying. Maybe it wasn't a hard a requirement then, maybe it has changed, or both. I have an ethical preference for market transactions, so didn't push on that door as hard as I might have if other opportunities weren't readily available.
As others have mentioned, there are many folks working in the gov world without CS degrees. This is especially true for older workers who graduated at a time when CS departments weren't common place at every college as they are now. However, if it's credentials that you are after, governments love certifications as well.
I'm in a similar situation. Dropped out of uni because it bored me, easily got a dev job (I was really lucky), worked for years as a developer, and then an architect.
I eventually did study part time for a degree, mainly out of belief that it might help with future career opportunities, but also because I might enjoy it.
I got a 1st, with honours. TBH, the only part I truely enjoyed was the final project. The rest was mildly interesting at best, and a bore at worst. I found 80% of it easy, 10% difficult (maths), and 10% challenging (the final project, but only because I made it challenging).
In retrospect, I don't think it's really made any difference to my career, as I'd proved myself long before getting the degree. I don't necessarily regret it either though - maybe the most useful thing was getting me into the groove of reading academic papers, which had benefited me greatly, both work-wise and in my personal life (health issues).
Can you elaborate on some of these books you are referring to? I'm a self taught developer in his first real, institutional engineering role and I am worried I'm in over my head sometimes and would love to read some "must haves".
I got into this stuff in early high-school, and those were just "intro to C++" books.
The book that kind of changed my life (and a bunch of other people's as well) is one I bought when I was 19 called "Structure and Interpretation of Computer Programs" (SICP for short). It's a bit heavy, but if you know the basics of programming it's not too difficult. This book really teaches you a lot of fundamentals of software, and to me is the must-have book in compsci, and it's available for free of MIT's website.
Then I just went on ebay and looked up "discrete math textbooks" and "discrete structures textbooks", and bought a few of the cheaper ones.
Then I started finding individual topics that interested me, which largely dealt with distributed computing, weird abstract math, and video processing. For that, I bought the book "Programming Distributed Computing Systems" by Varela, "Certified Programming with Dependent Types" by Chlipala, and random books on Fourier Transforms from eBay.
This is over the course of a few years, and it was intermixed with about a million different blogs and tutorials to get me better. I've found if you stick with the more "theory-heavy" languages like Coq, Idris, or Haskell, you end up picking up a lot more of the compsci concepts that you might learn in school, just because there aren't a million people constantly yelling "OMG YOU DON'T NEED MATH FOR <insert language here>".
Yeah, agreed about the language choice. With math-y languages, the overall quality of presentation and material is higher than what you would get if learning the same thing in Python or JS.
> Not everyone can learn coding without externally imposed structure.
That's actually not what a CS degree is primarily about. You learn to code in maybe the first 2 or 3 classes. After that, it's assumed that you can translate ideas into code and you start learning about different areas of computer science.
If you just need to learn to code for a job, there are bootcamps that can teach you that in a fraction of the time and cost.
> But those who can't probably have an ongoing problem in keeping up with the state of the art.
Personally, I wasn't able to learn to code in any meaningful way before college. I had tried to learn from books and online sources but never got beyond basic scripting. After working my way through a bachelor's degree and PhD, I don't have much trouble keeping up with the state of the art now.
Good comment. I can code, and I am knowledgeable about computing in general terms, but I am not a computer scientist as I haven't benefitted from the rigour of formal training. (I am a lawyer, fwiw).
There's no real fixed meaning to computer scientist, so you can call yourself one if you like. I considered myself one when I was doing computer science research for my PhD, but I don't consider myself one now that I'm working as a software engineer.
I suffered the opposite experience. I can’t learn in an academic setting. If I’m faced with a problem (read: motivation) I’ll learn what I need to solve it.
The part about needing to continue your education daily is something a lot of non-CS/IT/programmers people don't understand. I know a lot of friends who want to get into a tech career (say, webdev) who don't get this. They think all they need to do is get a CS degree, or take a course and they'll be set for life.
A lot of people IN the industry (especially, but absolutely not exclusively folks who come from alternate backgrounds).
Ive been a consultant at several companies where other software engineers REFUSED to learn anything unless:
A) it was during work hours
B) the company provided a structured environment to learn the thing (usually in the form of paid 3rd party trainers coming on site).
Needless to say, those teams were far from successful.
There's also more and more folks coming in for the money (nothing wrong with that) expecting it to be a 9 to 5 job. It absolutely CAN be a 9 to 5 job given the right environment/company/structure, but no one in their right mind would pay average west/east coast software engineer salary for a 9 to 5 employee. The extra responsibilities, continual learning, possible on-call, etc, are all baked in those crazy 6 figure salaries everyone drool over.
There's totally a time and place for more typical schedule. Just expect to be paid accordingly. In the short term the market isn't quite adjusted to the idea that not all software eng roles are the same, so there's plenty of people who make 200k+ for doing essentially clerical work (that just happens to involve code) but its just a matter of time before that changes (its already happening).
38 years here, I had undergrad in Chem and part of a masters. Had no college classes or experience when I got my first programming job. Always worked at the leading edge of whatever I did and always had success. Was never an issue. Today I wonder if I would have even gotten an interview.
From what I saw it is individual and also based on area of CS. There are lots of people who are for example very good in JS, CSS and HTML, doing fantastic UI work while not having CS degree. And there are some with CS degree who can't really solve real tasks effectively. Some people learn only what is needed to pass an exam. And some people continuously want to learn more an be better. I, for one, started doing a degree but dropped due to lack of time and lot of work opportunities. And while school learned me some useful stuff and it could learn that way even more, I continued on my own. I am an introvert, not hating math and having lot of patience. I learned so much over years, for example C, python, PHP, bash, vim, linux administration, docker, kubernetes, mysql, golang, html, css, vue, flutter, http, cors, CSP, opengl, linear algebra in graphics, mutexes, atomic ops, Atmel AVR programming. I also learned abou free software, GNU history, Mozilla/Netscape story, Gopher. Majority of this self-tought because my life is CS, I am reading or doing something CS-related whole days because nothing interests me more. Yesterday I discovered dgraph and I am excited to learn in. There are math-heavy and scientific problems which require more school-type skills. But most real-world work is surprisingly not like this. On the other hand, lots of people lack CS history - I've heard some modern web devs don't even know what a http header really is.
Hey, founder of Dgraph Labs here. If you are interested, we would love to consider you for a role at Dgraph. Feel free to reach out to me at Manish at Dgraph.io.
Recursion and Abstraction, like love and herpes, are a form of disease which once caught cannot be lost, but can be shed, and so spread. Your brain is wired to look for both opportunistically, in any problem.
What a CS degree does, is teach you how to apply the infection. Some CS degrees are like innoculation against them and you come out with a degree, but no grasp of the fundamentals. Others, you learn so much you become a vector of the disease.
I disagree. To consider something overrated, its value has to be little in comparison to the effort to learn it.
For some problems, recursion is vastly superior e.g. for recursive data structure like trees. And coincidentally, often those structures are much better at delivering high-performance solutions than their naive loop-based counterparts.
Granted, it isn't easy to learn, but also not that hard. Overall, I think the gains easily outweigh the effort. And it is not like I am writing recursions all day long. Most of the time I write loops, but you should know when using recursions is the better way to go and for those times you should know how to handle them.
Note that using function-call based recursion is a programming mistake in most common programming languages, as they have a fixed sized stack.
This includes many "functional" languages like Scala. Even Haskell had a default stack size limit until some years ago, and many Haskell based parsers crashed on large inputs due to that.
If you write programs that are supposed to process arbitrarily large inputs, you cannot use function call recursion in most cases.
(Of course this says nothing about recursion as a concept, which is fundamental and unavoidable unless you're programming, say, a traffic light.)
fringe opinion. video courses in non-visual topics are a complete waste of time, made because the masses can't read and are lazy. there is a corresponding book better than the course available for everything listed. good books will have good exercises and solutions available.
video courses just won't teach as much. very easy to find best book available for each subject. even going partway through a book will offer more. can skip topics, look at syllabuses for classes offered in higher education that use said book if you want to know what to skip (many syllabuses available online).
for example, instead of taking the operating systems class you can simply actually read either of the two books suggested by this very page.
Firstly, depends on the university - not all degrees are equal. I did most of a degree after working in the industry for seven years, and having programmed on and off since the zx81 - the degree was pointless. Only one course was interesting, AI, and the only time I've ever used that knowledge is tinkering at home.
I think for anyone that started programming in the early days of home computers like the ZX81, C64 and BBC Micro, except for the fundamentals, most CS courses seemed to be completely useless. I cannot honestly say anything I learned in my course was useful compared to pursuing my own interests.
I missed undergrad, and managed to weasel my way into graduate school after 15 years as a programmer. ultimately research isn't for me, but I found basic CS theory both interesting and useful in my later life.
certainly agree that the systems and programming coursework wasn't particularly useful.
Hm - maybe not, but why is that, exactly? I don’t think that anybody believes that if you admit an otherwise stupid person to Harvard, they would become intelligent through the instruction they’d receive there. Instead, the degree and the institution are a signal - this person had to have been smart in the first place to get in, so you can assume that they’re going to do smart things for your business.
If I had a gray beard... 30+ years as working dev.
I've never taken a 'computer class' while in school, although I've taken some instruction while working.
Entirely self-taught. I do this because I like it. Back in the day, I never played video games, I taught myself, and wrote, code. To this day, I don't play video games.
It's been my experience that hiring degreed CS graduates may not be the best course. Theirs a big difference between being 'book-smart' and real world smart. I tend to give preference to guys who write code for fun over those who are in it for the money.
Case in point, we just brought on a high-school student who is about to start his comp-sci degree. He has written code for years for fun. He's just rocking it. I'm sure he'll be invited back each summer until his degree is complete and will likely be offered continued employment after.
If that works for you, then great, but you’re locking yourself out of an entire world of software professionals who only code for work. I suspect those who don’t code outside work outnumber those who do.
If their understanding that amateurs make for better hires than professionals is correct, then amateurs being the minority makes an even stronger case for filtering.
I agree 100%. I used to code all the time, prior to my CS degree, in High School, etc. But now I'm a professional programmer. I don't code outside of work, because coding is what I already do 4-6 hours a day. Now that it's my job, I've taken to other hobbies (and raising a family). I love what I do, but I don't live for it.
Which is fine. But that doesn't mean you should be favored in an interview and it certainly doesn't mean you're a better programmer than I am. My point was: favoring people that code for fun is just as bad as favoring people who only received formal degrees.
I didn't get that "point" from your post. I was just trying to assert the oft-ignored type of person (I am not an aberration) that still likes coding, after a lifetime. Even when I am inevitably confined to a hospital bed, I will code in my head.
I'm an engineer. No CS degree. I coded for fun on various side projects from 2006-2012. I didn't consider myself very good.
I worked at a couple startups from 2012-2013. During that time, I became very proficient in Coffeescript and a couple popular frontend frameworks. I was very productive in terms of pumping out lines of code (that somehow resulted in a working product).
However, I didn't know how to write a for loop. If you had asked me what "for...in" was, I wouldn't have had a clue. And forget about asking me how setTimeout has to do with the call stack.
The problem with being self taught, at least in my experience, is that you end up being very strong in whatever areas it is that interests you, and whatever areas of CS are relevant to the projects you're working on day-to-day.
In 2013, I began to realize my (glaring) deficiencies as a programmer. That was the point when I started spending all my free time doing online CS courses. They helped a lot with filling in the knowledge gaps that I didn't even know I had.
The main reason I'm posting this is to give a shoutout to Project Euler.
Project Euler (https://projecteuler.net/) is an amazing way to test yourself (and learn) CS concepts. If you've done a coding bootcamp and want to do a "gut check" to see how much you learned (or how much you have left to learn), I'd highly recommend Project Euler.
(I'm happy to say that in 2019, I can write for loops all day long...)
The parent said they didn't know what for-in was, which implies they were using a language like C for their side projects which only has for (i=0;i<n;i++) loops.
My CS degree (2002-2006) did not explicitly cover "for x in y" iterators. But it did cover an understanding of algorithms and data structures well enough that I could implement one.
That was probably before they were really in style e.g. C# didn't add foreach / iterators until ~2005 with v2.0 and your curriculum probably lags a bit behind the industry state-of-the-art unless it was Ivy league
It has not been very long since CS degrees were taught entirely in C89 or C++98, and there are a lot of us who won't touch Python or Java unless forced to.
exactly - I had a similar learning curve (and no CS degree) where I could never remember what certain methods did but I knew exactly what to google for the answer
I'm a self-taught developer with haskell in my arsenal, although that being said I have an MSc in theoretical physics which probably helps me appreciate the power of its paradigm.
You are sure he was never at a university? And why are you drawn to Haskell?
For me I only had to deal with it a bit at university and I found the concept interesting, but could not imagine non math people to use it for anything as a language of choice
And I think imperative languages are way more easy and clear to read and write.
I allways imagined that you have to be a math nerd to prefer Haskell, but apparently this guy is not a math guy, but loves Haskell .. so ok, good counterpoint.
> And I think imperative languages are way more easy and clear to read and write.
Because it's what you've had exposure to. Perhaps, they're even objectively easier to read and write, I don't know. It's also completely besides my point.
My point was that I want my programs to work as desired. That's orthogonal to how easy it is to read and write. I don't want runtime exceptions where I could've gotten a compile-time error.
But I had exposure to math functions much earlier. And I never liked their syntax. I did understood the math, but the math language made it harder for me.
And null pointer exceptions? They only happen to me very rarely, when I quickly hack something together and then it is a "oh forgot - and fixed" problem. The problems I do struggle with are non reproducable race condition fun etc. and I doubt haskell could help me with them.
Or I struggle, because I do not really understand my problem, or a certain libary ... or, because I misunderstood existing code.
So how on earth are correct programms orthogonal to how easy it is to read and write them?!? Did you ever had to use someone else code?
Or your own that you wrote 5 years ago (or sometimes 5 days)?
With any bigger project it is all about how easy it is to read and write them.
> And null pointer exceptions? They only happen to me very rarely, when I quickly hack something together and then it is a "oh forgot - and fixed" problem.
And you never run into NPEs in production? It's something you always discover during development? How?
> The problems I do struggle with are non reproducable race condition fun etc. and I doubt haskell could help me with them.
In a pure system, thread race conditions are impossible. You can still get race conditions for your external effects, which is unavoidable.
Right on! Plenty of people can teach themselves to code without a university education. But the degree gives you a broad exposure to parts of CS that you may never explore as a self-taught developer. And it gives employers confidence that you have the skillset to handle whatever they throw at you.
> And it gives employers confidence that you have the skillset to handle whatever they throw at you.
Blindly having confidence in someone with a degree vs. someone with no degree is a bad mistake in this industry, IMO, sadly it happens.
It really comes down to the person, self taught or not, if you don’t pursue continuing education (which is a must in this industry) whatever CS knowledge you learnt with your degree will only take you so far.
Also said “broad exposure” can be well… self taught as well, algorithms, data structures, OS, etc… all things you can learn and "master" with no CS degree.
With all that said, I do agree CS education is essential to become a better developer. As a self thought myself, learning CS has made me a way better developer for sure, and I would advise all self taught devs to do the same, it will pay off immensely and best of all no student loan to repay.
I think you’re missing the point your parent was making...
In a good CS program you will be presented a series of challenges below your “depth”....
“wait, you want me to WRITE a data structure? I usually just use a good one from a library”
“wait, you want me to fix a compiler? I have only ever run a compiler”
“wait, you want me to write code that CREATES processes out of nothing? I am used to letting the OS create processes”
... etc. These provide you a series of epiphanies, “wow, I can build a compiler from scratch, that means I could fux with LLVM if I had to”.
Ideally, these programs are designed to take you all the way down to the bottom of the machine. For some students, the end result is confidence in their ability to “dive in” to a problem anywhere in the system.
If your point is that you can teach yourself that outside of school—absolutely. But... well, in my case I doubt I ever would have. It wasn’t fun, I was pushed to do things I would never have followed through on if I was just casually teaching myself about programming languages or operating systems.
And if your point is that students can get away without learning the material—well, also yes. Of course.
But you are wrong to dismiss the idea that a CS degree is just another few things to learn. This business of “get all the way down to the bottom and challenge yourself at every step” is kind of the whole point of a CS degree, and the world outside is not going to encourage you to do it the way your profs will.
I have seen plenty of CS grads that can barely code or put together a real solution to a problem. There is no guarantee just because someone was able to muddle through a CS degree that they can do these things. In almost all cases, you really need to evaluate whether an individual shows the aptitude to solve your problems you need solved and crank out good well thought out practical solutions that fit the scale of the business problem. The degree paper is not all that important. I would give bonus points to a candidate if they came from an accomplished but different background than CS that shows they are capable of success/mastery in multiple areas, they are adept at learning and researching new material, and they have the matching technical prowess to spearhead a real project. For instance I have known many engineering (of the physical paradigm) types that are self-taught with no CS degree that I would trust to tackle a project over any random CS degree candidate.
Self taught, I remember loops were the last thing I learnt as a kid when I was working on my own Tibia servers using Lua. I remember the day it finally clicked. It helped having a forum where you could ask more experienced people to explain it plainly.
Self taught from ages 9-18, Qbasic -> C -> C++ -> PHP
I did go to college and learned Java and UML and a few other esoteric things - until I got into my data structures classes. If a self-taught software engineer feels like something is missing, take a few data structures classes. That helps a lot.
But yeah, self taught can take you pretty much anywhere unless the job reqs prevent it.
Nice to see that reference about projecteuler. Although I study Computer Engineering, which is very close to Computer Science with Electrical Engineer grade, I really focus too much in the subjects which interests me.
BTW, I reforce a lot of aspects about analysis, optimization and programming with ProjectEuler by doing Polyglot programming with some friends: https://github.com/DestructHub/ProjectEuler
This is interesting, but I don't think it's the norm for self-taught devs to not recognize a for..in. I would find that surprising. (I'm also a self-taught developer, and now I work at a larger corporation.)
Is Project Euler better than LeetCode for "gut checking"?
I've probably done 300 or so LC, and do some every week, mostly as an insurance policy for technical interviews if I ever opportunistically interviewed in a short time frame.
They're geared towards different goals. LC is for interviews: solving small scale problems of the scale you might get asked in an interview or come up against every day in a software job. PE is more of about curiosity and personal intellectual development. It asks something that you might never have heard about and might never see again but is often very interesting, and will stretch your ability to develop your own algorithms or to apply learnt methods to unfamiliar scenarios.
I'd recommend LC to someone who has an interview in a month, PE to someone who has one in a year.
Speaking of LeetCode, don't overlook the discussions for each problem. I think a lot of people just solve the problem, and then move on to another problem.
In the discussions many people post their solutions, and those often have bugs in obscure cases that the LeetCode grader doesn't hit. Another common thing is for the posted solutions to always give the correct answer, but miss the time or space constraints that the problem statement asked for.
I've found that reviewing those other solutions to find those issues to be quite instructive. Also, there will sometimes be a solution in there that is better than mine, which is also instructive.
i agree. i'm happy to have some CS students point me to some areas which are useful even if they are not interesting for hobbyists. There's also a lot of value in learning academic methods of investigation and research (if you are at a good university). A lot of self-taught learn a lot about computers or some programming languages, but a CS degree like any degree also teaches a lot of other valuable competences which can be hard to come by from own inspiration / initiative.
Another thing is that following and completing a degree is a practice in going from start to finnish in a multi-year project which the degree is, which is also very valuable in life in general. being able to see fruits in the distant future of your current work, and having that motivate and drive you.
A lot of people i meet who are self-taught will give up more easily due to this. not that they are quitters, but they tend to lean towards their interests, which is not always in their best interest :)
> The problem with being self taught, at least in my experience, is that you end up being very strong in whatever areas it is that interests you, and whatever areas of CS are relevant to the projects you're working on day-to-day.
Which is not necessarily a bad (for whatever definition of bad) thing.
For the startups you worked at, your ability to write code was far more valuable than your understanding of underlying CS concepts.
Kudos to you for having the maturity to acknowledge the gaps in your education and to address them in a manner that complements your life.
> The problem with being self taught, at least in my experience, is that you end up being very strong in whatever areas it is that interests you
This is absolutely key. One of the main advantages of a solid undergraduate curriculum is that it forces you to work your way through things that are important, but don't interest you as much. And this path is designed and supported by people with a much better broad view of the field than you have.
Now, you'll still always gain knowledge faster in the areas that interest you most, but if you only indulge this approach you will have significant gaps.
One thing I always recommend to people self-studying (when they ask) is to find someone you trust who really knows the area and ask them for recommended courses/books. Then follow that advice.
To some degree MOOCs etc. try and do this for you by designing course progressions, but there are limitations and constraints there that can have you spinning your wheel.
Being disciplined about both breadth and depth in a new subject is difficult. One of the underlying themes of a post-graduate degree, particularly a PhD, is to give you tools to do this for yourself repeatedly. It's not impossible to gain these skills properly with little or no formal education, but it is quite difficult.
I think it depends on the person and the experience. It's easy to say that a particular course was helpful, because it often is. But what's the opportunity cost? What other things didn't you learn because of all that time learning about, say, OS schedulers?
Also, it assumes that you have access to a very high quality education. In lots of cases, the teaching might be mediocre (perhaps even at elite universities that care more about research grants than education).
There's a lot of value in having a standardized base of knowledge, where you learn all the things that a practicing engineer should know. But in reality, the sum of things you "should" do takes more than a lifetime. And you have to find some ways to differentiate your knowledge and expertise if you want to innovate.
Yes, nothing is perfect. But in general, it is hard to be a good guide to yourself in a new area. You can do it, but it is a skill that needs to be developed and most people don't have it (or rather, they typically have the depth-first part but not the breadth-first part, if that makes sense).
I wasn't even talking about the course quality (which as you note, is very variable) but about the curriculum.
One thing you can do as an individual teaching yourself CS, say, is to try and follow the curriculum of a known good CS program. There are issues with this, too, but at least you are getting some guidance.
The opportunity cost issue is a good point. One problem with following undergrad programs, say, is that only part of what they are doing is teaching you material, the other part is learning-how-to-learn stuff. If you are an independent learner of sufficient skill, some courses will be way too slow for you.
It would be optimal in some sense to have high level "key concept" material that you can survey efficiently and then decide when and where you need to dig deeper. It's a bit of a chicken and egg problem though, because if you are insufficiently skilled you will do poorly at the second part...
As mentioned in another comment for this post, Cracking the Code Interview is probably a good place to start in terms of reviewing some key concepts, assuming you don't have a CS degree and are largely self taught.
Of course given the libraries and systems already available, you don't practically need a lot of this knowledge, but it does help. When certain portions of an application just don't perform well, or when you hit really weird side effects of race conditions on static properties etc. I think it's also important to know the language and tools that you are working with as well as possible. It's not always possible to know everything, but you should probably read and complete at least one book on the language you are using. You can hack away in any given language for years. But until you've actually read cover to cover on a comprehensive book, you won't necessarily understand some concepts, or better still you will learn how the language does something for you, that you've been doing the hard way.
Another way of putting this: a primary function of a curriculum - university or otherwise - is to convert unknown unknowns (things you don't know exist) into known unknowns (things you are aware of but not fully versed in) and known knowns (things you fully grok). This is why we shouldn't replace college with nothing: this is an important function.
Self-study isn't exactly nothing. I do find that there are a lot of people, especially web developers, who don't understand a lot of the basics, or even the language they're using.
I got into development from doing design work, also self taught back in the 90's. I wanted to do something... spent a very rapid weekend learning JS from a very large book, then applied what I needed the next monday. Spent the next weekend finishing that book and the next month swallowing three other large books on the subject (two more on JS, one on HTML). From there was VB5 then Access & VBA... then I started working as a developer. From there I learned more about databases and data structures, dabbled in C/C++ then circled around to VB6 when it came out. From there around the end of 2001 (after 9/11) I was unemployed and no jobs to be found. While crashing at a friend's house I learned C# with the command line compiler and another large book (didn't have VS). Since then more databases and db types, more C# and when it came out Node.js (had done a lot of classic ASP in JS along the way too).
I spent about 5 years working in eLearning, writing simulations of systems for learning/training as well as courseware. Really enjoyed that time in my life as I was constantly taking in domain knowledge as well as a very varied environment. Unfortunately after a while all the context switching and constant intake took a toll and I took a few more boring jobs doing corporate/banking work.
In any case, you'd be surprised how much you can learn without a formal education, or anything really structured at all. To this day I tend to take in new stuff rapidly and get bored once I've figured out the hard parts. Currently working on learning Rust and Kubernetes, short break on rust as the async syntax gets implemented and settles in.
I think my statement was too strong; I definetely don't mean to suggest that nobody who has never followed a curriculum of any sort can ever be successful. What I mean is that in general, as a policy, it is useful to have some curriculum to shed light on the unknown unknowns.
But to respond to "self-study isn't nothing": that's true, but your self study didn't replace college, it replaced self study. What I mean is that everyone has to do that self study and job training targeted at the specific stuff they're doing. Self study is necessary to expand "known knowns" in targeted areas, which is really necessary. It's just not as good at illuminating "unknown unknowns" as a curriculum put together by a person or group of people who know the breadth and history of a field.
I've been really involved in teaching people with non-traditional backgrounds (e.g. no cs degree) to program lately, and this has been my biggest struggle. There are people who are working in the field as a web dev and have been for years and can't do simple stuff like iterate. They have no understanding of what the stuff they're actually doing means or does. It's just copy and pasting snippets they see online and fiddling with it til it works.
I've taken to offering three pieces of advice to these people:
1) Go through the basic language tutorial of whatever language you use (e.g. how to declare variable, conditionals, loops)
2) Go read through the essentials guide to your languages (will be slightly higher level stuff)
3) Go read the sections on Data Structures, Concepts and Algorithms and Knowledge Base in Cracking The Coding Interview skipping the problems that aren't answered in chapter. Why? Because it's a solid primer for CS Concepts that people just don't pick up unless they have to, and most importantly short enough (< 100 pages) people will actually go through it. Large CS books with the dense writing intimidate people and so they never follow through.
I've had a lot of success with this method. It's not a formal cs education by any means but I've found it's enough to get people past the constant beginner part.
It is funny that people constantly mention these supposed developers who have jobs but cant program. Where are these jobs? I have a recent cs degree, did resume coaching, and worked through a couple coding interview exercise books. Still having trouble finding work. Show me one of these mythical jobs poorly trained programmers get, I will blow them out of the water. In reality I think most of those jobs have been outsourced and no longer exist.
Apply for bank outside of a tech hub, or any job outside of the major US cities. There's plenty of positions full of people riding the "expert beginner" status, blissfully unaware of how far behind they are because top performers leave for the hubs and the better opportunities offered there.
It's always a real shock to get an elite CS degree and then be told we aren't as smart as the people who got their job because they were friends with someone at the company and just happened to know Java.
Boring corporation jobs are fantastic in these cases. The performance bar is low, and due to inertia within the org, you can usually learn faster as an IC and bounce somewhere better rapidly, versus being somewhere like a startup where the treadmill moves too fast for your own personal development needs.
Sounds like he’s talking about defense contractors. Many contracting firms just need “butts in seats” that they can bill out. Mediocre developers are better in some regards there: they bill out more hours since they’re slower, don’t mind 10+ year obsolete tech, and they don’t complain as much, which could endanger relations with the bureaucracy (customer.)
I worked at a defense contractor for years. Some of the guys I knew could barely program, despite years of experience, but looked good on paper. Approving them individually doesn't mean that they're not a "butt in seat" kinda person.
Often "approved" by people who have very little idea about what they actually need in a hire. And even they're measured on how well they can keep things staffed and they're often requesting requirements for roles that are unreasonable or downright ridiculous at the pay rates they expect. So they end up with people who are good at formally ticking the right boxes, but have no Godly idea about how to enable the mission or be aware of the broader purpose behind the tasks set out for them.
It depends heavily on your COR and government leads, but the good ones are few enough that they don't get to send the norm. There are enough people who are sufficiently checked out that contracting/staffing firms can get away with murder. Indeed, it might just be impossible for them to do a good job based on what sorts of requirements they're expected to adhere to.
> The problem with being self taught, at least in my experience, is that you end up being very strong in whatever areas it is that interests you, and whatever areas of CS are relevant to the projects you're working on day-to-day.
I think this is the case even if you receive a formal CS education. I picked the most difficult or interesting classes and got As in them, and barely passed everything else in order to graduate in 4 years. Many students avoided the hard professors to protect their GPA, so it was really easy to register for them since 25% of students might drop the class.
Probably the most important thing a formal CS education does is expose you to CS fundamentals, but in my experience you end up having to be self-taught in a university setting anyway. Most of the professors I had were more interested in research than in lecturing - many lectures were completely incomprehensible. And even with amazing lecturers, I would still have to spend hundreds of hours reading and practicing on my own.
One of those classes I barely passed was algorithms, since my other workload was too great. I eventually had to self-study this subject years later to pass the tech interview torture chamber.
College was mostly an exercise in self-learning or learning how to learn for me - something I am still reaping the benefits of today.
Formal bs/ms ee here as well. Started off wanting to do hardware and looked at programming as an afterthought. After a few years of working in embedded and realizing how many gaps there are in my knowledge, and how beautiful the field is, considering a doctorate in CS.
> However, I didn't know how to write a for loop.
> If you had asked me what "for...in" was, I
> wouldn't have had a clue. And forget about
> asking me how setTimeout has to do with
> the call stack.
I'm self taught, I started with the C64 in the early 80s. By the time I was 15 I was working in assembly, had an excellent knowledge of what we would now call embedded software development and a working knowledge of algorithms.
I'm glad that you took the step to get a proper education. With the modern internet it's extremely easier and the quality is incomparably better than my experience of the UK educational system. Between Coursera, MIT and the vast number of excellent books it's a dream.
It's an eye-opener to me that someone can be self-taught and not understand something as basic as loops. It has been my experience hiring developers that the self-taught type are considerably stronger than those who are purely college educated. I've also noticed that the self-taught type who consider themselves software engineers all went through a two year period of intense studying of computer science and software engineering in their own time. The combination of a real working understanding of software creation with passion is an extremely strong combination.
What I've noticed is that your type don't get scared of technical changes because you're basically able to learn anything. The "college career" type tend to scare easily and also jump into management the second they get a sniff of it.
All of this said, if I was 18 now I would strongly advise myself to do 3/4 STEM A-levels (Math, Physics and something else) and then go study Computer Science at a university which has a good program. By good program - one where I'd write a compiler from scratch, learn the theory (finite automata etc), machine learning, linear algebra and hopefully something fun like building a 3d engine or game engine or something. You can do it all yourself but a three-year program certainly makes life a lot easier, plus you get to make friends and network. AND you have a nice piece of paper.
I'm self-taught since age 16. I've been able to write a for- loop since age 16. Maybe it helps that I'm self taught in a pre-google, pre-stackoverflow world. Any beginning programming book will teach for-loops.
I do have gaps in my knowledge but if I lose internet access I can still be productive. I mostly google for how to optimize when some API is slow or remind myself some method name.
I just wanted to pipe up because the top comment is "I couldn't write a for-loop" and I don't want all of us who are self taught being lobbed into that category.
At my last job I regularly had to help colleagues (some who held degrees) solve issues. Strangely they had trouble starting from scratch on something new vs maintaining old code. They found the latter easier. They also sometimes chose the wrong data structures (e.g. looping through an array every time you want an item with id=x instead of just using a hashtable)
> (e.g. looping through an array every time you want an item with id=x instead of just using a hashtable)
Huh, I had almost the exact same experience with senior devs here - they were checking if elements were in a (huge) list in nested loops, instead of using a set. Switching brought the runtime from around 2 hours to 2 minutes.
I think a lot of people learn a given language by hacking away at something they either want to create of modify. For example, in web development, I'd say most developers haven't ever read a cover to cover book on JavaScript.
I've tended to take the opposite approach, read first so I can at least grasp what I need to look for, then start applying. This of course is a mixed bag for rapidly changing/evolving tech and newer languages.
I take the same approach you do. When mentoring new developers I also start them off by assigning them tasks to read the docs for the core of the language we are working with.
I think the biggest difference between successful devs and unsuccessful ones is the hunger for constant learning and improvement. You can lack that hunger if you have a CS degree or not. I've observed this at my company and others I've worked for as an almost constant.
yes, completely agree with this. To be successful, it has to be your hobby and you have to be hungry to know more and improve. It is also required anyway because CS and technologies changes rapidly. For example it is not common to write UI apps in Tcl anymore. :) but it is now more common to use LXC and Docker instead of virtual machines and shared library versioning hedeaches.
"This 22 year old self-taught PHP developer earns $15k a month and lives in an Austrian farmhouse"
I mean, f*cking seriously?
Yeah, that's harsh, but such a headline's an insult to those with a CS degree and serious self-taught developers alike.
To those who made this stay on the front page: given you're competent, you already make the same or more money as those with a CS degree, even if you might know less about the fundamentals, get over it! Upvoting cruft like this isn't going to vindicate your choice.
1) You're allowed to curse on the internet. HN doesn't have a content filter. Saying "f*cking" reduces the impact the curse is supposed to have. If you feel it's appropriate to curse then just fucking do it.
2) Not everyone does well in a formal school environment. This site shows people that self-taught can still earn good money.
3) Even if a CS degree would increase the Austrian's earnings, how much would it increase it by? Would it offset the cost of the education? Would it offset the wages earned during the years he was in school?
4) People don't always upvote something to the front page because they agree with it. Sometimes people do it to encourage discussion around a topic.
regarding 2 and 3. My complaint isn't about having or not having a CS degree, I didn't even get that far.
It's about the Taboola-like quality of the headline. They're an insult to one's intelligence. If I want to be insulted on the Internet, I'd go elsewhere.
Which part is insulting? That he's young? That he's writing PHP or he makes a shitload of money? I'm envious, I admit it, but I don't find it insulting.
Regarding 2, I'd like to point out this is both 100% true and somewhat misleading. You certainly can be successful with no degree, but I think anyone without one will tell you it's a significantly more difficult path than a CS grad takes. If you are driven enough to pass some of the most difficult interviews in the industry, I'd argue you probably could have done well in a formal school environment, since the interviews are largely borrowed from it.
I have no CS degree, and I've been in the industry in various forms since the mid-90s, software developer full time since about 2001 or so. I have no CS degree because I just did not have the math grades to get entrance to university.
I've been working at Google as software engineer for 7.5 years now.
I guess you could say this is success, but I would not recommend this path; even after 20 years, there's hiring managers or recruiters that won't look at me, and coworkers whose behavior changes when they find out. Impostor syndrome can be an issue.
At my age with family mortgage kids, it's too late and pointless to go back and re-do all the HS math etc. I'd need to get into a CS program. But I do wish I'd done this. It took me a long time to elbow my way to where I am now.
> there's hiring managers or recruiters that won't look at me, and coworkers whose behavior changes when they find out.
I am very surprised to hear you say this. My background appears to be similar to yours (no CS degree, programming full-time since the mid-90s), and although I did see some resistance in job interviews for about the first 5 years of my career, once I had enough experience under my belt nobody cared what my education was. I've never encountered the type of elitism you describe. Maybe it's a Google thing?
I've had a similar experience to other poster, but relative to tech stack.
I learned .NET and Javascript early in my career. Every single job interview I had at a .NET shop brought up my lack of a college degree as a possible barrier to "handling" or being "good enough" for the position (their words). Not a single one of these companies invited me back for another interview.
Never had the same problem with JS, and now I happily work as senior-level engineer (using Python and Javascript) while encouraging other more junior engineers to take up and pursue the JS ecosystem.
I've never encountered anything like that (or maybe didn't read the signals?), if anything people are usually impressed by the fact that I'm self taught if they knew me beforehand. I've never felt like it's held me back in my career, but I do feel the lack of some of the math background sometimes.
Not sure if you would consider a two year associate degree in computer technologies as a CS degree because pretty much what I recall from my studies, we were working on understanding the computer parts and components, doing some typing (data entry exercises) and understanding what software and productivity suites are. We did embark on some nifty console programming and writing batch files, but never fully immersing into the bits and pieces of what makes up software (algorithms, binary, lists, etc).
I work professionally as a software developer for quite a while, and what I have seen in the industry is that you gain more merit when you are able to ship product(s) that people will use (or perhaps automate a process that was previously done in a manual manner).
Yes, you can get past the initial gates of hiring qualifications (such as having a CS degree certificate) as well as the coding tests that lots of companies use as a gauge to test your technical capabilities. But no amount of CS degree or certificate would be enough to patch for example when you are dealing with real world software issues.
The value of college to me was mainly the degree and an internship that resulted in a good reference. Nobody in practice seems to care about personal or volunteer projects unless it's maybe contributing to Mozilla or something. Degree is necessary to be interviewed by 99.99% of openings.
Between the requirements of a degree and silly things like "10 years experience with X" for a CRUD develeoper, I have a hard time getting through HR when applying for jobs. If I can get to a technical manager or another developer, we can talk shop and show code and I'm good.
Just remember it comes down to who you know or who you can meet, you might as well have worked at Burger King by the way some of the filters work.
I sometimes feel like I have a leg up based on when I learned computers (self taught mid 80's to early 90's). At that time, everything was more low level, and there were fewer, yet higher quality books on the market. So I started off with W. Richard Stephens, K&R, Pike, Sedgewick, and others that you either had to really get it, or you wouldn't get anything. Not that this was the best way to learn, but you knew coming out of it what you learned.
I have a CS degree (in fact, I have both a BS and a Master's degree in CS) - I'm still "self taught" in the sense that I learned to program the same way you did, by reading Stevens, K&R, Knuth, etc. outside of my coursework. Don't get me wrong - I learned a lot of interesting stuff: I never would have learned calculus if it hadn't been a degree requirement, and it helps to understand a lot of AI, but learning to program is sort of a "side effect" of academic computer science.
That was similar to my experience on a CS course - you were expected to do a lot of development, but nobody really specifically taught you about it and you were expected to pick that up by yourself as you went along.
In this field, you're always going to have to learn things on your own... The trivial example is new technologies that weren't available when you were in university.
That's how my CS program was (late 90s) as well. You were expected to be somewhat proficient already in C/C++ programming going into the major. Much of the program was mathematics courses. It was brutal. They eventually saw the high drop out rate and re-configured the major. I envy the kids who get to go through the major now. The courses look much more interesting and it's comprised of more actual software engineering coursework.
I finished my CS degree in 06' and it still was more about math than programming (C++, no Java). To graduate I had to take single/multi variable calculus, linear algebra, vector geometry, discrete mathematics, differential equations, combinatorics and numerical methods. When I started there were 600 in my class, when I graduated I think there were only 60!
I graduated with a masters in 2013 and my courses involved a lot of calculus, and some courses on theoretical foundations of computing ++
Still learned most of how to be a developer on my own, but I find immense value in the education. I learned to see how nothing in computing is magic, just hard work. In 2014 they changed the algorithm introduction course from C++/java to python, which I reckon is a good thing.
I also have both a BS and a Masters in CS. I took a required software engineering course in either 1999 or 2000. I think that there may not be a single thing taught in that course I would agree with now.
I learned a lot of useful things, like how to write a compiler. But I would say that in the sense of what I really do day-to-day to "program", I'm effectively self-taught too.
(I walk the walk, too; I can and have hired people without degrees, and it's been fine.)
I think that's one thing that's making me think twice about doing a CS degree now e.g. by night — a lot of what you learn at university isn't in lectures, it's in the ample free time that you have between lectures.
With limited free time, it's hard to know whether it's better to self study or do a degree (or even just follow along a curriculum online)
I go between trying to work through things systematically to get a good grounding where I have knowledge gaps, and jumping to what I think will help me best on my job at this point in time.
It would probably be better to stick to one approach or the other to make more focused use of time, but I'm not sure which way is best! :)
Those books are still quite useful today: I learned C from The C Programming Language, for example, and I’d still recommend it as the best book to read to learn the language (though a nice supplement that covers how modern compilers work would be useful to accompany it).
I started with MASM-style assembly, and transitioned to higher level languages when I got frustrated.
I think this angle has made a huge positive difference in my ability to reason about my work. I think if you start with high level languages, it's easy to ignore what you're actually doing.
Same here. The added benefit of there being a handful of really good resources to learn. The manual if my C64 pretty much taught me all the basics in a very approachable manner (I was 7 when I started).
Nowadays, there are so many resources (mostly low quality) that people waste too much time trying to decide or lesrning things wrong.
I had a similar experience with C64 and its User and Reference manuals at that age. I was thinking about that a couple of months back, and found that they're still out there as PDFs of the originals:
I started programming properly in 2010 when I was 12 or 13. Before that I did some small things in Inform 7, and now I remember it, Visual Basic, but I don't really consider that 'proper programming' as it was mostly cutting and pasting code with little understanding. I started with Inform 7, Python, and a little bit of Processing and Lua. I did three or four ludum dares and at some point I made most of a game in Lua with Love2d (around October 2012ish).
Maybe a few years later I started delving into 'hacker culture', and I picked up C with K&R (since it was almost universally recommended and easy to read), I also at some point picked up UNIX Power Tools (recommended in Linux Format) and The Practice of Programming. At some point after that I became really interested in Compilers and Operating Systems.
When I went for my first internship three years ago, the interviewer said I knew more about the things we talked about, than most other bona fide engineers they interviewed. The university-hired interns that sat next to me couldn't read the Erlang manual or documentation because it just didn't click with them, which while I can appreciate on some level that people have different sources of information that suit them best, it's still astonishing to me.
Consider that programmers started out as secretaries learning how to program the machine from the specification and the schematics given. A lot of the programmers I have met, probably wouldn't be able to cope with such a task, I include myself in that category.
I agree with you about the quality of books. A fair chunk of the books on my bookshelf from that era are 80s/90s to early 00s because those books are just an order of magnitude better written, with a high signal to noise ratio.
Can you imagine a modern language like Swift or Rust being taught to the same level, in the same space as K&R? I can't!
> I agree with you about the quality of books. A fair chunk of the books on my bookshelf from that era are 80s/90s to early 00s because those books are just an order of magnitude better written, with a high signal to noise ratio.
This is a common misconception. There were plenty of shit books then, too, you just won't find people remembering and recommending them. Whereas we haven't, collectively, discarded the shit books of today, yet.
I don't think that's quite the case. I think there are more books in the 2000s written about basically nothing. Look at the "For Dummies" series of books. They're accessible but the content they teach could be condensed into one or two blog posts with nothing lost except the material is easier to read in a single sitting and much easier to reference.
I grew up surrounded by computers, but took relatively few classes. I took AP Computer Science in high school, but had to teach myself the “B” part of the class because the other students couldn’t keep up and our AB class just reverted to just the A portion but that was too easy for me. I also took an “honor programming in C” class from the same teacher, but it was essentially just two hours a day for me to program silly games using some Borland graphics library. I spent a lot more time being familiar with networking at the time really, and despite the CS parts seeming easy, anything web related outside of HTML was a mystery to me.
I did music for college and the only programming I did was in csound and max/msp.
Long story short, music doesn’t pay much. I just started reading and doing programming. I got gigs almost immediately for solving simple data problems for people (extract these CSV files into this format and pull down web data, etc). Fortunately I had companies where they were happy for me to take on whatever programming I felt comfortable with, despite being in a non-dev role originally there.
12 years later, I’m damn good at this. It helps that I can generally just read a book and absorb it. I’ve read books on CS, but haven’t taken any more CS classes outside watching some MIT course 6 videos. I did take some machine learning classes at MIT over IAP and those were fun. One weird thing, I’ve never taken beyond pre-calculus, but the linear algebra stuff in most ML things isn’t that hard for me. Maybe I’m just lucky? I’m a total hack at math, but can understand concepts quickly still and apply them in code.
One weird quirk was that I had to learn that not everyone can learn like I can. I taught for a few years at General Assembly and learned immediately that most people don’t like being throw in the deep end, or being told to read something and apply it the next day. They need smaller and better defined problems to build confidence. Only 5% of student actually enjoy things on hard mode. That’s ok- it’s just different than me.
Like, at work right now I’m probably going to need to do some Go work. I’ve never used Go outside the first 10 project ruler problems. But- I don’t mind telling them that sure, I can do some work in Go. It’s just code, and if I sit down for 8 hours I can get decent with the language.
The only things I’ve encountered so far that felt were “hard” were Haskell, and anything with shaders and modern 3D programming. I’ll figure them out eventually. TouchDesigner has also been tricky, but it’s mostly that their documentation is scattered (so much in videos) and the ui/workflow is non-obvious. I should write a book on it.
Make peace with this fact: you can most definitely build businesses and add value to any organization. But you won't be able to optimize Twitch's video codec or any other very low level, uber-specific, high impact code.
Business need both types in this world. No shame in that, but don't lie to yourself into thinking that you can do _both_ with no CS degree. You can't.
So you're saying a highly motivated individual with an access to World Wide Web and physical textbooks can't teach him/herself to optimize "Twitch's video codec" or any low-level problems on their own ?
Nonsense. You can absolutely teach yourself to optimize low-level code if that's what you want to do. The amazing thing about today's world is that all of the incredible resources available for learning just about anything in science and engineering to anyone who has the time to consume them. And you can work on open source projects to build your native skills.
The difficult part for you will be obtaining an interview. Because all of the other candidates will have CS degrees, and increasing numbers of them will have graduate degrees. You are at a disadvantage.
The other difficult part is to put aside time and money. I mean the information is most likely free but you still need food. Food is not free. Then you have to work so you can buy food. If you work, you will have less time to study by yourself.
In this sense, UBI is a godsend. But of course, we assume all actors are rational and self-disciplined.
The main difference is that more resources are now publicly available to everyone to look up on the internet which was a different story 40 years ago. This is why companies at the time hired grads that can re-implement closed-source software from scratch from a reference spec or by reverse-engineering from another company to stay ahead. This has happened with device drivers and closed-source compilers.
To some extent open-source has removed the cost for reinventing libraries, reverse engineering and there is little need to study specific elements in a subject to solve such a problem when you can grab lib_whatever or a free compiler for a language.
You are right that in interviews at famous companies (FAANG, asset management companies, aerospace / embedded systems companies) being self-taught here isn't enough. Instead, they require specific certifications and they look for the graduate with a strong engineering degree rather than someone who is self-taught.*
Right now in 2019, I would do both.
*Having a serious open-source project or significant contributions is actually a huge advantage over recent graduates.
How would a CS degree help with any of that? I'm someone with experience in weird uber-specific, low-level areas of computer graphics/imaging with no CS degree, and none of the CS graduates I know have been taught those things at university.
Some PhDs and math students yes (at least, with regards to the algorithmic portions), but otherwise you have to learn the low-level esoteric stuff on your own, or be lucky enough to have a specialized optional course at your university.
And the cutting-edge will rarely be available to undergraduates anyway. All my CS graduate colleagues learned about codecs was how to compute a DCT by hand - they certainly didn't learn the modern 4x4 and 8x8 spatial block transform approximations as used in h264, or any motion vector calculation algorithms, or the x86_64 SIMD intrinsics, or any of the modern entropy coding methods.
I agree. Nothing in a typical CS degree would help with this. Maybe if your Masters was specifically in this obscure part of the field. On the other hand, I used to work in the video game industry where degrees (used to be) relatively rare and I probably knew 12 different guys who could optimize this kind of thing in their sleep.
I'm confused how you accomplished anything without some type of looping abstraction. If you understand one of them most of the rest are fairly intuitive except looping with recursion. It just seems bizarre that you were working somewhere and being productive without knowing what a for loop was.
I just find these odd. Does anyone struggle with this stuff? They just make it all look so easy.
I for one struggle quite a bit with coding, design, theory, and other aspects. I just don't get how so many people think coding is as easy as "reading a book" or "doing a tutorial".
Well, you're literally writing step-by-step instructions that a computer will faithfully perform without deviation. Once you understand how a computer works and how to talk to it, it should be as easy as having a conversation.
I don't think this is easy, but when you've been doing it for years and years, it feels that way.
Computers don't even operate solely step by step anymore. They often operate asynchronously, through interrupts, or compute things in parallel across multiple threads.
Maybe if you're programming something simple, it will be "step by step". But most programs are not this simple.
"Coding" is as meaningless a term as "writing". Much in the same way you can leverage basic writing skills to achieve entrepreneurial success, you can do so with coding skills. A literary academic may still consider writing to be a substantial exercise, probably more so than the untaught.
That's because the academic knows not to produce low quality content. The untaught often does not. I'm still reeling from having to maintain spaghetti code that some untaughts have churned out in my career.
Honestly, as someone who laboured in a CS degree and work as an employee for 10+ years, I feel frustrated that I feel stuck.
It feels like that the reason that I am still working in mediocre jobs is because I don't know how to generate ideas. Or how to make prototypes using design tools. Or how to go about as an entrepreneur.
It's both inspiring and deflating at the same time to people, especially young people, succeed in things that I have dreamed about when I was young.
479 comments
[ 2.4 ms ] story [ 322 ms ] threadI kept talking to developers online to find out about their backgrounds as I don't have a CS degree. I figured as I was already asking people how they learned to code I might as well write up some proper interviews and share them with other people. This way I can scratch my own itch and stay motivated as well as sharing motivation with other people.
You can check out my traffic/revenue at my open page which I have started from day one instead of waiting until big numbers www.nocsdegree.com/open
It's inspiring to read about developers who are also informally educated. It brings a sense that people like us are more common than we think and that we're really not alone. They're also finding great success despite the prevailing wisdom that you can't make it without a degree. People like that are proof that you can.
I had a ZX Spectrum but unfortunately just used it to play Fantasy World Dizzy.
I don't know where the idea that a CS course is a good practical training for a career in development came from - I'm pretty glad the course I did included almost nothing that was attempting to "train" you and focused mostly on the absolute conceptual fundamentals (from the electrical engineering side through general engineering maths to specialised CS subjects) as well as letting us loose to actually build stuff with minimal supervision but careful evaluation.
[The thing that really got my attention was the lambda calculus course where the lecturer mentioned the S & K combinators, of course the same course covered the Y-combinator!]
They generally won't wrestle with the tough sections in a systemic fashion, the way you are forced to in a decent CS program.
For most people (even most professional developers) the only practical way to gain the equivalent knowledge you'd get with a CS degree, is by getting a CS degree.
I worked for years as a self taught professional developer before going back btw, and I've hired/interviewed many boot camp graduates, self taught programmers, and degree holders.
I went way beyond what any CS grad does, and it cost me nothing in money and less time than a CS degree. If you're motivated you can beat a university CS education - it's actually really not that high a bar.
I agree with you that most people won't do that. I was home schooled so I have a different attitude about learning than most people - and that's made all the difference. But is fundamentally a problem of motivation and goals, you don't need university for either.
You can probably imagine why many people wouldn't believe you. "My work is amazing but I am too lazy to publish it" is a peak stereotype for self-educated people. My prior on this being ignorance rather than genius is super high. And if it is true that you are a once in a generation genius who could outpace the research community then your experience is completely useless for others, given that you'd be so much smarter than a typical person who is doing self-education and trying to get a job.
I'm not a genius, unless you count an online IQ test I took in my early twenties, but I'm deeply skeptical of those. It's true I'm well above average though, so perhaps my experiences don't generalize. I don't believe that though. I still think it's motivation and goals that count.
> I'm not a genius, unless you count an online IQ test I took in my early twenties, but I'm deeply skeptical of those
You do sound smart though. Just... one of the benefits of a challenging formal education is a large dose of humility.
Honestly, if you think writing a two to three page paper is "a lot of effort", I doubt you've done what you've claimed.
He’s not claiming he invented cold fusion, just something that would be an iterative step in improving the state of the art, probably worth one paper in a decent but not super prestigious journal. Where do you get the idea that it’s worth a free Ph.D, fame and fortune, and all that?
I have a friend who does webdev (mostly Wordpress, some Drupal) who did not have go through a CS program, though he took a few web dev classes in college. He goes good work, but he has a very loose grasp on fundamentals. He showed me a side project he was doing (a web based clicker game) and after looking at the code, I suggested he try adding some classes to reduce his code reuse. After explaining the basics (and some quick research on how classes work in Javascript), it kind of blew his mind. He never used classes before in his code because he just had no reference point.
CS majors who cannot program applying academic theory without understanding.
I'm old enough to remember graduates rolling their own sorting algos, or building classes 6 levels of inheritance deep. While simultaneously creating massive if/else nesting, with tons of duplicated code, unable to understand how to use basic ideas like functions and recursion, even though I'm sure they probably had a whole one lecture on the subject, mixed in with whole modules on pointless compiler lectures.
Because that's what their CS degree taught them.
How both CS graduates and non-graduates really learn is by seeing what other programmers do in the industry, or by making their own mistakes.
When you have to learn all that stuff to get your degree, then you just have to learn it. Period. Also people who are full time students have more time to spend on these topics, but when you are actually working 8h+ per day and your career is mostly around JS frameworks it becomes much harder to invest time into these things.
Obviously this doesn't apply to everyone, but I'd say it applies for most.
The two best things a CS degree can do is expose you to ideas you wouldn't otherwise know about, and to force you to work on hard projects that require a combination of multi-level analytical thinking and research.
Both of those are excellent training for at least some aspects of being developer.
But that doesn't mean the details are inherently useful. There are very few situations where you will be expected to write a compiler. So in that sense compiler theory itself is optional - far less useful than the experience of having to handle a complex set of data structures and relationships, which could in theory come from other kinds of projects.
Academic CS also tends to miss out a lot of useful practical skills. It won't teach you much about management (from either side), salary negotiations, office politics and co-worker relationships, or business theory.
It may not even teach you how to write good clean code that's easy to read and maintain.
So IMO the ideal CS degree doesn't exist. The ideal degree would be a good mix of theory with plenty of industry practice - possibly with some standardised requirements that would lead to a Chartered Developer qualification that was better at guaranteeing a working blend of practical skill, theoretical understanding, and analytical talent than current degrees seem to be.
I agree that should be the case, and sadly enough, I've seen a number of people graduate college with degrees in CS and not have that. There have been a number of times when I'd mention some non-esoteric concept that should have been covered and the response is something like "huh"? I'm not talking about things like "Oh you don't understand how to implement Redux?", it's more things like "Ok, you need to compute the intersection of these two arrays." You are right, they probably have been exposed to these concepts, but they have no idea how to actually do it. More importantly, they grasp so little, they didn't even know where to start. The saddest one I saw was a student that was wicked smart, and the school didn't challenge him enough to struggle through any projects. When he came to intern, he was lost, because he'd never been actually challenged. (He was from a major public university too.)
Don't get me wrong, I disagree, there are a number of great CS programs from both public and private universities, and actually the good ones are exactly like you mention (both theoretical and practical application), but there are a lot that aren't.
Or you could just do the bare minimum that your class’s TA will let you get away with, which usually means not much at all…
It allows me to make sharper categorizations whether something is mathematical, architectural, security, programming, framework related or a best practice.
This again gives me a good feeling of whether something will be easy/quick to learn.
As a non CS degree developer I can’t really see anything that I’m missing because of not having the degree. I have a successful business, get hired for freelance jobs for a good salary, can build anything I want, ...
Would love to know what one would get out of having the degree versus self study.
As for knowing the theoretical basis of computer science, that will have value in some parts of industry and very little value in other parts of industry. While someone in your position may have a high degree of success working in the upper layers of abstraction, someone has to develop, advance, and maintain the lower levels of abstraction that you depend upon. None of that is meant to say that you need that theoretical knowledge to be successful, rather it is important for some people to have that theoretical knowledge to ensure the success of the industry.
Some benefits that it will give you:
- It will actually let you move into different positions within tech/it industry when you have wider/deeper understanding of how things works.
- As someone said already in this thread: "allows me to make sharper categorizations whether something is mathematical, architectural, security, programming, framework related or a best practice."
- You'll be better at your job. Maybe not every day you need to know what's happening under the hood, but there are and there will be days when you need to. Even if you only developed JS frontend apps whole your career.
When you actually say "I can build anything I want", then (although I don't know you) I'm pretty sure that you can't. People who get that deeper understanding of things also understand how complex some things are and how complex some things can get.
The difference is one will remain standing after an earthquake.
https://en.wikipedia.org/wiki/Florida_International_Universi...
Building good bridges without an engineering degree is easy. You simply don't minimize materials and cost.
Honestly, what I find I'm missing is mostly class status and a piece of paper.
The lower you go, the more you need to know (and do) yourself. That is where CS degrees do help, because without the benefit of layered architectures of shared libraries, systems and code in general you need to know what those layers did in order to know how to do the work without them. That said, low-level doesn't always mean the same thing. Some people think writing software in C is low-level, but when I think low-level I mostly think of assembly on bare metal with no OS or anything like that.
Personal projects will do. You could work on Open Source software. Obvious choices: qemu, valgrind, FreeRTOS, RTEMS, Linux (kernel), SeaBIOS, gcc, clang, ghidra, binutils, MAME, OpenOCD, gdb, dosemu, dosbox, FreeDOS, Wine, SDCC, dolphin-emu, Xenia, coreboot
You don’t need a professor to tell you what books to read. You can just read them.
I studied the same books and did the same exercises as my brother the CS major and do feel that my training would be incomplete without that. But I don't feel disadvantaged by not doing that within a class structure.
The main thing I lack is access to government jobs, which routinely require credentials I don't have. But I've probably had a more diverse and satisfying career as a big fish in small private sector ponds.
Not everyone can learn coding without externally imposed structure. But those who can't probably have an ongoing problem in keeping up with the state of the art.
Here's one:
https://www.usajobs.gov/GetJob/ViewDetails/539439100
>a custom build of the open-source search engine Solr, a highly responsive UI engineered on top of React, a high performance distributed brokerage system, and cloud-based hosted services with Kubernetes in Amazon Web Services. The primary programming languages are Python, Java, and JavaScript.
https://18f.gsa.gov/join/
https://aws.amazon.com/government-education/government/
I guess my question would be which government? I do government contracting (US), and degrees are not required. The labor categories are typically written so that if you don't have a degree, you just need an additional 4 years of experience. On almost every contract I've worked on I've met a developer without a degree.
I eventually did study part time for a degree, mainly out of belief that it might help with future career opportunities, but also because I might enjoy it.
I got a 1st, with honours. TBH, the only part I truely enjoyed was the final project. The rest was mildly interesting at best, and a bore at worst. I found 80% of it easy, 10% difficult (maths), and 10% challenging (the final project, but only because I made it challenging).
In retrospect, I don't think it's really made any difference to my career, as I'd proved myself long before getting the degree. I don't necessarily regret it either though - maybe the most useful thing was getting me into the groove of reading academic papers, which had benefited me greatly, both work-wise and in my personal life (health issues).
I got into this stuff in early high-school, and those were just "intro to C++" books.
The book that kind of changed my life (and a bunch of other people's as well) is one I bought when I was 19 called "Structure and Interpretation of Computer Programs" (SICP for short). It's a bit heavy, but if you know the basics of programming it's not too difficult. This book really teaches you a lot of fundamentals of software, and to me is the must-have book in compsci, and it's available for free of MIT's website.
Then I just went on ebay and looked up "discrete math textbooks" and "discrete structures textbooks", and bought a few of the cheaper ones.
Then I started finding individual topics that interested me, which largely dealt with distributed computing, weird abstract math, and video processing. For that, I bought the book "Programming Distributed Computing Systems" by Varela, "Certified Programming with Dependent Types" by Chlipala, and random books on Fourier Transforms from eBay.
This is over the course of a few years, and it was intermixed with about a million different blogs and tutorials to get me better. I've found if you stick with the more "theory-heavy" languages like Coq, Idris, or Haskell, you end up picking up a lot more of the compsci concepts that you might learn in school, just because there aren't a million people constantly yelling "OMG YOU DON'T NEED MATH FOR <insert language here>".
That's actually not what a CS degree is primarily about. You learn to code in maybe the first 2 or 3 classes. After that, it's assumed that you can translate ideas into code and you start learning about different areas of computer science.
If you just need to learn to code for a job, there are bootcamps that can teach you that in a fraction of the time and cost.
> But those who can't probably have an ongoing problem in keeping up with the state of the art.
Personally, I wasn't able to learn to code in any meaningful way before college. I had tried to learn from books and online sources but never got beyond basic scripting. After working my way through a bachelor's degree and PhD, I don't have much trouble keeping up with the state of the art now.
Doing cs is not coding just to clarify.
Ive been a consultant at several companies where other software engineers REFUSED to learn anything unless:
A) it was during work hours B) the company provided a structured environment to learn the thing (usually in the form of paid 3rd party trainers coming on site).
Needless to say, those teams were far from successful.
There's also more and more folks coming in for the money (nothing wrong with that) expecting it to be a 9 to 5 job. It absolutely CAN be a 9 to 5 job given the right environment/company/structure, but no one in their right mind would pay average west/east coast software engineer salary for a 9 to 5 employee. The extra responsibilities, continual learning, possible on-call, etc, are all baked in those crazy 6 figure salaries everyone drool over.
There's totally a time and place for more typical schedule. Just expect to be paid accordingly. In the short term the market isn't quite adjusted to the idea that not all software eng roles are the same, so there's plenty of people who make 200k+ for doing essentially clerical work (that just happens to involve code) but its just a matter of time before that changes (its already happening).
What a CS degree does, is teach you how to apply the infection. Some CS degrees are like innoculation against them and you come out with a degree, but no grasp of the fundamentals. Others, you learn so much you become a vector of the disease.
Right up until the point where you have to traverse a nested data structure.
For some problems, recursion is vastly superior e.g. for recursive data structure like trees. And coincidentally, often those structures are much better at delivering high-performance solutions than their naive loop-based counterparts.
Granted, it isn't easy to learn, but also not that hard. Overall, I think the gains easily outweigh the effort. And it is not like I am writing recursions all day long. Most of the time I write loops, but you should know when using recursions is the better way to go and for those times you should know how to handle them.
This includes many "functional" languages like Scala. Even Haskell had a default stack size limit until some years ago, and many Haskell based parsers crashed on large inputs due to that.
If you write programs that are supposed to process arbitrarily large inputs, you cannot use function call recursion in most cases.
(Of course this says nothing about recursion as a concept, which is fundamental and unavoidable unless you're programming, say, a traffic light.)
video courses just won't teach as much. very easy to find best book available for each subject. even going partway through a book will offer more. can skip topics, look at syllabuses for classes offered in higher education that use said book if you want to know what to skip (many syllabuses available online).
for example, instead of taking the operating systems class you can simply actually read either of the two books suggested by this very page.
certainly agree that the systems and programming coursework wasn't particularly useful.
Hm - maybe not, but why is that, exactly? I don’t think that anybody believes that if you admit an otherwise stupid person to Harvard, they would become intelligent through the instruction they’d receive there. Instead, the degree and the institution are a signal - this person had to have been smart in the first place to get in, so you can assume that they’re going to do smart things for your business.
I've never taken a 'computer class' while in school, although I've taken some instruction while working.
Entirely self-taught. I do this because I like it. Back in the day, I never played video games, I taught myself, and wrote, code. To this day, I don't play video games.
It's been my experience that hiring degreed CS graduates may not be the best course. Theirs a big difference between being 'book-smart' and real world smart. I tend to give preference to guys who write code for fun over those who are in it for the money.
Case in point, we just brought on a high-school student who is about to start his comp-sci degree. He has written code for years for fun. He's just rocking it. I'm sure he'll be invited back each summer until his degree is complete and will likely be offered continued employment after.
If their understanding that amateurs make for better hires than professionals is correct, then amateurs being the minority makes an even stronger case for filtering.
I worked at a couple startups from 2012-2013. During that time, I became very proficient in Coffeescript and a couple popular frontend frameworks. I was very productive in terms of pumping out lines of code (that somehow resulted in a working product).
However, I didn't know how to write a for loop. If you had asked me what "for...in" was, I wouldn't have had a clue. And forget about asking me how setTimeout has to do with the call stack.
The problem with being self taught, at least in my experience, is that you end up being very strong in whatever areas it is that interests you, and whatever areas of CS are relevant to the projects you're working on day-to-day.
In 2013, I began to realize my (glaring) deficiencies as a programmer. That was the point when I started spending all my free time doing online CS courses. They helped a lot with filling in the knowledge gaps that I didn't even know I had.
The main reason I'm posting this is to give a shoutout to Project Euler.
Project Euler (https://projecteuler.net/) is an amazing way to test yourself (and learn) CS concepts. If you've done a coding bootcamp and want to do a "gut check" to see how much you learned (or how much you have left to learn), I'd highly recommend Project Euler.
(I'm happy to say that in 2019, I can write for loops all day long...)
Which is better? YMMV.
> I didn't know how to write a for loop
If
I don't know why you want to call that a "loop", but, sure, you do you, you crazy imperative programmers.
edit: Sigh. I was jockingly mocking.
How did he solve the iteration problem? A for loop is just syntactic sugar for a while loop.
> why are you drawn to Haskell?
I just want my programs to work. I've seen too many null pointer exceptions and other runtime errors. Runtime errors = bad. Compile errors = good.
[1]: https://news.ycombinator.com/item?id=20112065
Me too ...
And I think imperative languages are way more easy and clear to read and write.
I allways imagined that you have to be a math nerd to prefer Haskell, but apparently this guy is not a math guy, but loves Haskell .. so ok, good counterpoint.
Because it's what you've had exposure to. Perhaps, they're even objectively easier to read and write, I don't know. It's also completely besides my point.
My point was that I want my programs to work as desired. That's orthogonal to how easy it is to read and write. I don't want runtime exceptions where I could've gotten a compile-time error.
And null pointer exceptions? They only happen to me very rarely, when I quickly hack something together and then it is a "oh forgot - and fixed" problem. The problems I do struggle with are non reproducable race condition fun etc. and I doubt haskell could help me with them. Or I struggle, because I do not really understand my problem, or a certain libary ... or, because I misunderstood existing code.
So how on earth are correct programms orthogonal to how easy it is to read and write them?!? Did you ever had to use someone else code? Or your own that you wrote 5 years ago (or sometimes 5 days)?
With any bigger project it is all about how easy it is to read and write them.
And you never run into NPEs in production? It's something you always discover during development? How?
> The problems I do struggle with are non reproducable race condition fun etc. and I doubt haskell could help me with them.
In a pure system, thread race conditions are impossible. You can still get race conditions for your external effects, which is unavoidable.
They use enumeration (list/array traversal) to process a list/array of inputs.
And it entirely makes impossible the off-by-one error.
I am happy if I never have to see a for-loop again. (Even in JS, I use iteration/enumeration constructs as much as possible.)
It is one of several programming paradigms, after all. Am I missing something?
Maybe I should become a high school CS teacher, because I would not curse anyone with a procedural language.
Blindly having confidence in someone with a degree vs. someone with no degree is a bad mistake in this industry, IMO, sadly it happens.
It really comes down to the person, self taught or not, if you don’t pursue continuing education (which is a must in this industry) whatever CS knowledge you learnt with your degree will only take you so far.
Also said “broad exposure” can be well… self taught as well, algorithms, data structures, OS, etc… all things you can learn and "master" with no CS degree.
With all that said, I do agree CS education is essential to become a better developer. As a self thought myself, learning CS has made me a way better developer for sure, and I would advise all self taught devs to do the same, it will pay off immensely and best of all no student loan to repay.
In a good CS program you will be presented a series of challenges below your “depth”....
“wait, you want me to WRITE a data structure? I usually just use a good one from a library”
“wait, you want me to fix a compiler? I have only ever run a compiler”
“wait, you want me to write code that CREATES processes out of nothing? I am used to letting the OS create processes”
... etc. These provide you a series of epiphanies, “wow, I can build a compiler from scratch, that means I could fux with LLVM if I had to”.
Ideally, these programs are designed to take you all the way down to the bottom of the machine. For some students, the end result is confidence in their ability to “dive in” to a problem anywhere in the system.
If your point is that you can teach yourself that outside of school—absolutely. But... well, in my case I doubt I ever would have. It wasn’t fun, I was pushed to do things I would never have followed through on if I was just casually teaching myself about programming languages or operating systems.
And if your point is that students can get away without learning the material—well, also yes. Of course.
But you are wrong to dismiss the idea that a CS degree is just another few things to learn. This business of “get all the way down to the bottom and challenge yourself at every step” is kind of the whole point of a CS degree, and the world outside is not going to encourage you to do it the way your profs will.
I did go to college and learned Java and UML and a few other esoteric things - until I got into my data structures classes. If a self-taught software engineer feels like something is missing, take a few data structures classes. That helps a lot.
But yeah, self taught can take you pretty much anywhere unless the job reqs prevent it.
BTW, I reforce a lot of aspects about analysis, optimization and programming with ProjectEuler by doing Polyglot programming with some friends: https://github.com/DestructHub/ProjectEuler
I've probably done 300 or so LC, and do some every week, mostly as an insurance policy for technical interviews if I ever opportunistically interviewed in a short time frame.
I'd recommend LC to someone who has an interview in a month, PE to someone who has one in a year.
In the discussions many people post their solutions, and those often have bugs in obscure cases that the LeetCode grader doesn't hit. Another common thing is for the posted solutions to always give the correct answer, but miss the time or space constraints that the problem statement asked for.
I've found that reviewing those other solutions to find those issues to be quite instructive. Also, there will sometimes be a solution in there that is better than mine, which is also instructive.
Another thing is that following and completing a degree is a practice in going from start to finnish in a multi-year project which the degree is, which is also very valuable in life in general. being able to see fruits in the distant future of your current work, and having that motivate and drive you.
A lot of people i meet who are self-taught will give up more easily due to this. not that they are quitters, but they tend to lean towards their interests, which is not always in their best interest :)
Which is not necessarily a bad (for whatever definition of bad) thing.
For the startups you worked at, your ability to write code was far more valuable than your understanding of underlying CS concepts.
Kudos to you for having the maturity to acknowledge the gaps in your education and to address them in a manner that complements your life.
This is absolutely key. One of the main advantages of a solid undergraduate curriculum is that it forces you to work your way through things that are important, but don't interest you as much. And this path is designed and supported by people with a much better broad view of the field than you have.
Now, you'll still always gain knowledge faster in the areas that interest you most, but if you only indulge this approach you will have significant gaps.
One thing I always recommend to people self-studying (when they ask) is to find someone you trust who really knows the area and ask them for recommended courses/books. Then follow that advice.
To some degree MOOCs etc. try and do this for you by designing course progressions, but there are limitations and constraints there that can have you spinning your wheel.
Being disciplined about both breadth and depth in a new subject is difficult. One of the underlying themes of a post-graduate degree, particularly a PhD, is to give you tools to do this for yourself repeatedly. It's not impossible to gain these skills properly with little or no formal education, but it is quite difficult.
Also, it assumes that you have access to a very high quality education. In lots of cases, the teaching might be mediocre (perhaps even at elite universities that care more about research grants than education).
There's a lot of value in having a standardized base of knowledge, where you learn all the things that a practicing engineer should know. But in reality, the sum of things you "should" do takes more than a lifetime. And you have to find some ways to differentiate your knowledge and expertise if you want to innovate.
I wasn't even talking about the course quality (which as you note, is very variable) but about the curriculum.
One thing you can do as an individual teaching yourself CS, say, is to try and follow the curriculum of a known good CS program. There are issues with this, too, but at least you are getting some guidance.
The opportunity cost issue is a good point. One problem with following undergrad programs, say, is that only part of what they are doing is teaching you material, the other part is learning-how-to-learn stuff. If you are an independent learner of sufficient skill, some courses will be way too slow for you.
It would be optimal in some sense to have high level "key concept" material that you can survey efficiently and then decide when and where you need to dig deeper. It's a bit of a chicken and egg problem though, because if you are insufficiently skilled you will do poorly at the second part...
Of course given the libraries and systems already available, you don't practically need a lot of this knowledge, but it does help. When certain portions of an application just don't perform well, or when you hit really weird side effects of race conditions on static properties etc. I think it's also important to know the language and tools that you are working with as well as possible. It's not always possible to know everything, but you should probably read and complete at least one book on the language you are using. You can hack away in any given language for years. But until you've actually read cover to cover on a comprehensive book, you won't necessarily understand some concepts, or better still you will learn how the language does something for you, that you've been doing the hard way.
It's obviously true that you don't need to know these things to perform your current job, but that's not what the OP was talking about.
I got into development from doing design work, also self taught back in the 90's. I wanted to do something... spent a very rapid weekend learning JS from a very large book, then applied what I needed the next monday. Spent the next weekend finishing that book and the next month swallowing three other large books on the subject (two more on JS, one on HTML). From there was VB5 then Access & VBA... then I started working as a developer. From there I learned more about databases and data structures, dabbled in C/C++ then circled around to VB6 when it came out. From there around the end of 2001 (after 9/11) I was unemployed and no jobs to be found. While crashing at a friend's house I learned C# with the command line compiler and another large book (didn't have VS). Since then more databases and db types, more C# and when it came out Node.js (had done a lot of classic ASP in JS along the way too).
I spent about 5 years working in eLearning, writing simulations of systems for learning/training as well as courseware. Really enjoyed that time in my life as I was constantly taking in domain knowledge as well as a very varied environment. Unfortunately after a while all the context switching and constant intake took a toll and I took a few more boring jobs doing corporate/banking work.
In any case, you'd be surprised how much you can learn without a formal education, or anything really structured at all. To this day I tend to take in new stuff rapidly and get bored once I've figured out the hard parts. Currently working on learning Rust and Kubernetes, short break on rust as the async syntax gets implemented and settles in.
But to respond to "self-study isn't nothing": that's true, but your self study didn't replace college, it replaced self study. What I mean is that everyone has to do that self study and job training targeted at the specific stuff they're doing. Self study is necessary to expand "known knowns" in targeted areas, which is really necessary. It's just not as good at illuminating "unknown unknowns" as a curriculum put together by a person or group of people who know the breadth and history of a field.
I've taken to offering three pieces of advice to these people:
1) Go through the basic language tutorial of whatever language you use (e.g. how to declare variable, conditionals, loops)
2) Go read through the essentials guide to your languages (will be slightly higher level stuff)
3) Go read the sections on Data Structures, Concepts and Algorithms and Knowledge Base in Cracking The Coding Interview skipping the problems that aren't answered in chapter. Why? Because it's a solid primer for CS Concepts that people just don't pick up unless they have to, and most importantly short enough (< 100 pages) people will actually go through it. Large CS books with the dense writing intimidate people and so they never follow through.
I've had a lot of success with this method. It's not a formal cs education by any means but I've found it's enough to get people past the constant beginner part.
We all know hiring and interviewing are basically a crapshoot. Good people sometimes don't get hired and bad people sometimes do.
Unsolicited feedback: I think it should be pointed out that your attitude probably isn't helping in your job search.
a.) Be able to pass a drug test
b.) Not have any problematic debts or associations with problematic groups (e.g. Aryan Nation, ISIS)
c.) Have a certification or degree that is related to the very specific thing they are asking for.
It's entirely clearing a checklist when they're recruiting. They have no idea how to evaluate for actual competence.
It depends heavily on your COR and government leads, but the good ones are few enough that they don't get to send the norm. There are enough people who are sufficiently checked out that contracting/staffing firms can get away with murder. Indeed, it might just be impossible for them to do a good job based on what sorts of requirements they're expected to adhere to.
I think this is the case even if you receive a formal CS education. I picked the most difficult or interesting classes and got As in them, and barely passed everything else in order to graduate in 4 years. Many students avoided the hard professors to protect their GPA, so it was really easy to register for them since 25% of students might drop the class.
Probably the most important thing a formal CS education does is expose you to CS fundamentals, but in my experience you end up having to be self-taught in a university setting anyway. Most of the professors I had were more interested in research than in lecturing - many lectures were completely incomprehensible. And even with amazing lecturers, I would still have to spend hundreds of hours reading and practicing on my own.
One of those classes I barely passed was algorithms, since my other workload was too great. I eventually had to self-study this subject years later to pass the tech interview torture chamber.
College was mostly an exercise in self-learning or learning how to learn for me - something I am still reaping the benefits of today.
Definitely agree with this.
I think my data structures professor spent more time talking about chess rather than data structures.
I'm self taught, I started with the C64 in the early 80s. By the time I was 15 I was working in assembly, had an excellent knowledge of what we would now call embedded software development and a working knowledge of algorithms.
I'm glad that you took the step to get a proper education. With the modern internet it's extremely easier and the quality is incomparably better than my experience of the UK educational system. Between Coursera, MIT and the vast number of excellent books it's a dream.
It's an eye-opener to me that someone can be self-taught and not understand something as basic as loops. It has been my experience hiring developers that the self-taught type are considerably stronger than those who are purely college educated. I've also noticed that the self-taught type who consider themselves software engineers all went through a two year period of intense studying of computer science and software engineering in their own time. The combination of a real working understanding of software creation with passion is an extremely strong combination.
What I've noticed is that your type don't get scared of technical changes because you're basically able to learn anything. The "college career" type tend to scare easily and also jump into management the second they get a sniff of it.
All of this said, if I was 18 now I would strongly advise myself to do 3/4 STEM A-levels (Math, Physics and something else) and then go study Computer Science at a university which has a good program. By good program - one where I'd write a compiler from scratch, learn the theory (finite automata etc), machine learning, linear algebra and hopefully something fun like building a 3d engine or game engine or something. You can do it all yourself but a three-year program certainly makes life a lot easier, plus you get to make friends and network. AND you have a nice piece of paper.
I do have gaps in my knowledge but if I lose internet access I can still be productive. I mostly google for how to optimize when some API is slow or remind myself some method name.
I just wanted to pipe up because the top comment is "I couldn't write a for-loop" and I don't want all of us who are self taught being lobbed into that category.
At my last job I regularly had to help colleagues (some who held degrees) solve issues. Strangely they had trouble starting from scratch on something new vs maintaining old code. They found the latter easier. They also sometimes chose the wrong data structures (e.g. looping through an array every time you want an item with id=x instead of just using a hashtable)
Huh, I had almost the exact same experience with senior devs here - they were checking if elements were in a (huge) list in nested loops, instead of using a set. Switching brought the runtime from around 2 hours to 2 minutes.
I've tended to take the opposite approach, read first so I can at least grasp what I need to look for, then start applying. This of course is a mixed bag for rapidly changing/evolving tech and newer languages.
By the way, my site does use HTTPS and for analytics, Simple Analytics so no cookies.
I mean, f*cking seriously?
Yeah, that's harsh, but such a headline's an insult to those with a CS degree and serious self-taught developers alike.
To those who made this stay on the front page: given you're competent, you already make the same or more money as those with a CS degree, even if you might know less about the fundamentals, get over it! Upvoting cruft like this isn't going to vindicate your choice.
2) Not everyone does well in a formal school environment. This site shows people that self-taught can still earn good money.
3) Even if a CS degree would increase the Austrian's earnings, how much would it increase it by? Would it offset the cost of the education? Would it offset the wages earned during the years he was in school?
4) People don't always upvote something to the front page because they agree with it. Sometimes people do it to encourage discussion around a topic.
It's about the Taboola-like quality of the headline. They're an insult to one's intelligence. If I want to be insulted on the Internet, I'd go elsewhere.
I've been working at Google as software engineer for 7.5 years now.
I guess you could say this is success, but I would not recommend this path; even after 20 years, there's hiring managers or recruiters that won't look at me, and coworkers whose behavior changes when they find out. Impostor syndrome can be an issue.
At my age with family mortgage kids, it's too late and pointless to go back and re-do all the HS math etc. I'd need to get into a CS program. But I do wish I'd done this. It took me a long time to elbow my way to where I am now.
I am very surprised to hear you say this. My background appears to be similar to yours (no CS degree, programming full-time since the mid-90s), and although I did see some resistance in job interviews for about the first 5 years of my career, once I had enough experience under my belt nobody cared what my education was. I've never encountered the type of elitism you describe. Maybe it's a Google thing?
I learned .NET and Javascript early in my career. Every single job interview I had at a .NET shop brought up my lack of a college degree as a possible barrier to "handling" or being "good enough" for the position (their words). Not a single one of these companies invited me back for another interview.
Never had the same problem with JS, and now I happily work as senior-level engineer (using Python and Javascript) while encouraging other more junior engineers to take up and pursue the JS ecosystem.
U.S. East Coast.
I work professionally as a software developer for quite a while, and what I have seen in the industry is that you gain more merit when you are able to ship product(s) that people will use (or perhaps automate a process that was previously done in a manual manner).
Yes, you can get past the initial gates of hiring qualifications (such as having a CS degree certificate) as well as the coding tests that lots of companies use as a gauge to test your technical capabilities. But no amount of CS degree or certificate would be enough to patch for example when you are dealing with real world software issues.
Just remember it comes down to who you know or who you can meet, you might as well have worked at Burger King by the way some of the filters work.
The only thing I've never had any use for is differential equations. I have for instance never worked with signal processing.
Still learned most of how to be a developer on my own, but I find immense value in the education. I learned to see how nothing in computing is magic, just hard work. In 2014 they changed the algorithm introduction course from C++/java to python, which I reckon is a good thing.
I learned a lot of useful things, like how to write a compiler. But I would say that in the sense of what I really do day-to-day to "program", I'm effectively self-taught too.
(I walk the walk, too; I can and have hired people without degrees, and it's been fine.)
With limited free time, it's hard to know whether it's better to self study or do a degree (or even just follow along a curriculum online)
I go between trying to work through things systematically to get a good grounding where I have knowledge gaps, and jumping to what I think will help me best on my job at this point in time.
It would probably be better to stick to one approach or the other to make more focused use of time, but I'm not sure which way is best! :)
I think this angle has made a huge positive difference in my ability to reason about my work. I think if you start with high level languages, it's easy to ignore what you're actually doing.
Nowadays, there are so many resources (mostly low quality) that people waste too much time trying to decide or lesrning things wrong.
https://www.commodore.ca/commodore-manuals/
Maybe a few years later I started delving into 'hacker culture', and I picked up C with K&R (since it was almost universally recommended and easy to read), I also at some point picked up UNIX Power Tools (recommended in Linux Format) and The Practice of Programming. At some point after that I became really interested in Compilers and Operating Systems.
When I went for my first internship three years ago, the interviewer said I knew more about the things we talked about, than most other bona fide engineers they interviewed. The university-hired interns that sat next to me couldn't read the Erlang manual or documentation because it just didn't click with them, which while I can appreciate on some level that people have different sources of information that suit them best, it's still astonishing to me.
Consider that programmers started out as secretaries learning how to program the machine from the specification and the schematics given. A lot of the programmers I have met, probably wouldn't be able to cope with such a task, I include myself in that category.
I agree with you about the quality of books. A fair chunk of the books on my bookshelf from that era are 80s/90s to early 00s because those books are just an order of magnitude better written, with a high signal to noise ratio.
Can you imagine a modern language like Swift or Rust being taught to the same level, in the same space as K&R? I can't!
This is a common misconception. There were plenty of shit books then, too, you just won't find people remembering and recommending them. Whereas we haven't, collectively, discarded the shit books of today, yet.
I did music for college and the only programming I did was in csound and max/msp.
Long story short, music doesn’t pay much. I just started reading and doing programming. I got gigs almost immediately for solving simple data problems for people (extract these CSV files into this format and pull down web data, etc). Fortunately I had companies where they were happy for me to take on whatever programming I felt comfortable with, despite being in a non-dev role originally there.
12 years later, I’m damn good at this. It helps that I can generally just read a book and absorb it. I’ve read books on CS, but haven’t taken any more CS classes outside watching some MIT course 6 videos. I did take some machine learning classes at MIT over IAP and those were fun. One weird thing, I’ve never taken beyond pre-calculus, but the linear algebra stuff in most ML things isn’t that hard for me. Maybe I’m just lucky? I’m a total hack at math, but can understand concepts quickly still and apply them in code.
One weird quirk was that I had to learn that not everyone can learn like I can. I taught for a few years at General Assembly and learned immediately that most people don’t like being throw in the deep end, or being told to read something and apply it the next day. They need smaller and better defined problems to build confidence. Only 5% of student actually enjoy things on hard mode. That’s ok- it’s just different than me.
Like, at work right now I’m probably going to need to do some Go work. I’ve never used Go outside the first 10 project ruler problems. But- I don’t mind telling them that sure, I can do some work in Go. It’s just code, and if I sit down for 8 hours I can get decent with the language.
The only things I’ve encountered so far that felt were “hard” were Haskell, and anything with shaders and modern 3D programming. I’ll figure them out eventually. TouchDesigner has also been tricky, but it’s mostly that their documentation is scattered (so much in videos) and the ui/workflow is non-obvious. I should write a book on it.
Business need both types in this world. No shame in that, but don't lie to yourself into thinking that you can do _both_ with no CS degree. You can't.
The difficult part for you will be obtaining an interview. Because all of the other candidates will have CS degrees, and increasing numbers of them will have graduate degrees. You are at a disadvantage.
In this sense, UBI is a godsend. But of course, we assume all actors are rational and self-disciplined.
To some extent open-source has removed the cost for reinventing libraries, reverse engineering and there is little need to study specific elements in a subject to solve such a problem when you can grab lib_whatever or a free compiler for a language.
You are right that in interviews at famous companies (FAANG, asset management companies, aerospace / embedded systems companies) being self-taught here isn't enough. Instead, they require specific certifications and they look for the graduate with a strong engineering degree rather than someone who is self-taught.*
Right now in 2019, I would do both.
*Having a serious open-source project or significant contributions is actually a huge advantage over recent graduates.
Some PhDs and math students yes (at least, with regards to the algorithmic portions), but otherwise you have to learn the low-level esoteric stuff on your own, or be lucky enough to have a specialized optional course at your university.
And the cutting-edge will rarely be available to undergraduates anyway. All my CS graduate colleagues learned about codecs was how to compute a DCT by hand - they certainly didn't learn the modern 4x4 and 8x8 spatial block transform approximations as used in h264, or any motion vector calculation algorithms, or the x86_64 SIMD intrinsics, or any of the modern entropy coding methods.
I for one struggle quite a bit with coding, design, theory, and other aspects. I just don't get how so many people think coding is as easy as "reading a book" or "doing a tutorial".
I don't think this is easy, but when you've been doing it for years and years, it feels that way.
Maybe if you're programming something simple, it will be "step by step". But most programs are not this simple.
> spaghetti code that some untaughts have churned out
Now we see both sides of the coin.
It feels like that the reason that I am still working in mediocre jobs is because I don't know how to generate ideas. Or how to make prototypes using design tools. Or how to go about as an entrepreneur.
It's both inspiring and deflating at the same time to people, especially young people, succeed in things that I have dreamed about when I was young.
https://imgur.com/a/6RGJQQ1