No CS Degree – Interviews with self-taught developers
nocsdegree.com
nocsdegree.com
I wonder if it’s prepared me better than a CS degree for the actual work I do.
What did I learn with my RELS degree? Hermeneutics— understanding ancient texts written by lots of different authors in their original historical contexts, often which has been deeply redacted over time. Anyone who’s worked on any production code can see the benefit of being trained in that kind of thinking.
The classes I took on theology and philosophy helped train my brain to organize ideas. I had no trouble understanding object oriented programming — Plato would’ve loved it too, I think.
Classes on ethics have come in handy too.
Oh and just, we did a TON of writing in college. Lots and lots of writing, lots of research papers. I had to learn something new, read all about it, and put together a document carefully explaining the idea, with lots of evidence and citations. That skill has come in SUPER handy for everything from bug reports to API clients, to customer-facing documentation, to internal memorandums.
That's brilliant and obviously useful for software engineers. Don't forget that you've probably also studied holy wars in considerable depth, too.
This prepared him/her to understand the great conflict of vim and emacs users no doubt.
Easily the most trivial objection I've ever seen in the never ending spaces/tab debate.
Many people I know customise their local environment to suit.
It is amusing to see how directly those skills taught in a religious context apply towards being a good engineer. Perhaps they're more universal than many realize?
IMHO the worst bottleneck in both practical computing and even much of computer science is the struggle to explain/document the work in, say, English.
I briefly mentioned how my non-formal studies of religion and philosophy have helped to inform me - mainly in the context of "machine learning".
Your thoughts about how such studies apply to CS in general, though, are interesting. I noted that there are extreme overlaps between CS and many, many other areas of study that I believe both informs and is informed by those areas (whether known consciously or not).
We may actually be doing a disservice to ourselves (and perhaps for the world) by having (though rightly, I suppose) tying Computer Science so tightly with that of Mathematics.
Of course, that could just mean that mathematics also in turn informs and is informed by those subjects, I suppose...? Which is arguably true from what I understand of mathematics and the history of mathematics!
I guess, though, is what I am getting at is that we - humanity that is - have somewhat "enclosed" CS as a subset or adjunct of mathematics. Many don't seem to understand or "see" that so many other subjects and topics are involved. Not having that understanding may be hindering our advancement (both in CS and perhaps even as a species).
Yes, most people can learn to code without a degree but to be able to fully understand the scientific/mathematical foundation of why things are the way they are, and to use those skills to create something scientifically new, probably requires a degree.
Indeed, Object-Oriented Programming is harder to learn for programmers who have experience with other languages already (no pun intended) ;-)
When you know a language like C/C++/Java and you learn about OOP you think you understand, but in fact, you don't. So while functional programming was probably the easiest course for me in university, it took me 1,5 semesters to actually understand OOP. In the end, it is not that complicated, it is just that you have to think more on the meta-level than on the implementation-level and I think, for someone who doesn't have access to the implementation-level, it is easier because it doesn't get in the way.
OOP is a concept. It doesn't care about the implementation and neither should you. So if you are talking about integers, don't care about the implementation which might have limitations like MAX_INT, care about the idea of having a number which you can increase and decrease. That is a concept and it can be implemented in different languages and with different limitations.
Next, understand the idea of 'Everything is an Object'. This means that you have a class hierarchy and at the top is the class 'Object' (so everything can do, what 'Object' can do). Objects can receive so-called 'Messages'. When an Object receives a Message, it calls the corresponding method. So for example, in Smalltalk (the mother of Object-Orientation) the expression '1 + 2' means, you have an Object '1' (always the first thing) which receives a message '+ 2' and when the method '+' is being called, it returns an Object ('3').
This leads to some odd situations like
1 + 2 * 3
= 9
becauseObject 1 receives message + 2 returns object 3. Object 3 receives message * 3 returns object 9.
I think that is part of the secret sauce that many tutorials are missing. You can read a lot about the class hierarchy (inheritance, class variables, instance variables, ...), but few seem to care to explain what 'Everything is an Object' really means.
So your OOP program is basically sending different messages to different objects.
Finally, what makes OOP so powerful is that there are some attributes which are being enabled by placing your classes in the right spot of the class hierarchy, so that an object of that class does not just inherit all the attributes, but can also be used as one of its superclasses (polymorphism). That way you can write code that works with a wide variety of objects.
I am sure I missed a few things, but for me, understanding the clean syntax of Smalltalk and the implications of 'Everything is an Object' changed my perception of the OOP concept.
OOP is easier to use when describing a mental model as-is, without the analytical deconstruction that (typed) FP would demand.
I think this is a failure of Smalltalk, not OOP. I tried it in Ruby and Python (languages where everything is an object), both return 7.
Just like writing code, written communication is a difficult skill requiring lots of practice and feedback. A liberal arts degree provides that in spades!
I'd started with software well before university (5th grade - maybe 6th?) and there were not many resources. Our school had a computer, but no classes as such - the staff weren't really even sure what to do with the 3 we had. HS - there were some "computer classes" - intro to BASIC sort of things. I'd already been programming (mostly BASIC, a bit of z80 and 6502) by the time those classes were available.
CS was a thing in university, but just taking one class (some Pascal class), I was generally put off doing it "professionally" by the difficult social nature of the people in the main computer departments. I was not the social butterfly, and they were really offputting (and I may have been not very helpful as well) but I never clicked in that class or the lab, and so dropped that idea as a profession, but fell in to it years later accidentally.
Funny thing is that it's deemed unimportant when they have to do it themselves, but appreciate it when presented with well-documented tooling/libraries.
Not that they actively want to be bad at it, but they do not see it as a priority, they hate doing it, and they are unwilling to put effort into being decent at it.
In more extreme cases, they will even make somewhat absurd excuses to justify it. My favorite is, "We shouldn't write documentation. It's harmful because it just goes out of date." True, documentation gets out of date, but you can plan to maintain it, or you can just mark it as out of date so people aren't misled.
I've seen this from interns to CTOs and remain baffled by its prevalence.
I've seen this as well. It really makes one wonder how they're able to code properly since programming is, in a sense, also the expression of ideas as text.
That’s not what my religious studies degree was about. It wasn’t expensive Sunday school. They didn’t teach apologetics. They taught scholarship, empiricism and critical inquiry. Philosophy and theology were taught from a historical/critical/contextual perspective, not a devotional/didactic one.
I remember one asking a RELS professor about his internal religious beliefs once (in private) and got a stern talking to about how deeply inappropriate that was.
I appreciate and agree with your comment generally, but your characterization of my degree is not factual.
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.
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).
You can have a degree or not, even bad developpers can hop from one job to another, making more and more money in the process, given they're good enough to manipulate the recruiters/clients into hiring them. Making money does not mean your product is good,useful or well-designed. It means you're a good salesman.
Congratulations, you're making money by manipulating someone into giving you their money. Awesome ! Thanks for playing, please leave.
I guess the point of the website is to encourage people without a CS degree to learn programming. That's great. The disctinction beetween CS graduates and non-graduates seems to be very unfruitful IMHO so encouraging people to pick up a computer is cool.
What I would sugget is to stop promoting sensationnal stories like the kid that is making 15k$ a month. This is purely manipulative and dishonest. This kind of journalism is plain wrong. Even if the number are true (which I highly doubt) encouraging kids to drop out of high school to study CS on their own is wrong. Getting a degree is the best chance you have to becoming good at it. You can still be creative this way.
More, maybe encouraging good engineering (or craftmanship whatever you want to call it) instead of instagram buzz and money would make tomorrow's software a little less frustrating to use and a little less bloated.
I would love to see a story, just once, with the title "this guy made a beautiful piece of software, and it's awesome"
I don't see why you would want to get a degree on the off chance you wont end up liking the job and want to go into a different field.
In my situation I learned how to code at a young age, I wanted to go to university to fill in the blanks. The first semester of my computer science Ba was a course on facebook and the internet which costed 3400GBP just for that few months. Then and there I decided I wanted nothing more from this course.
After years and years of this, 8 hours, 5 days a week, it gets really monotonous.
You'll thank yourself when you think maybe I can get into journalism, or HR, or accounting, or any X-degree field at a different company without even having to take more college because you already went.
There's also bad universities, you went to a bad one or you didn't continue far enough past general ed.
Of course there are the Peter Deutsch wunderkinds and the people who get a really good secondary education and can jump into CLRS on their own without hand holding from college, but I don't think there are very many of them out there.
And adult learners are a whole different matter for whom the decision to go to college for CS is radically different.
Anne-Laure made a wellness plugin.
Steph won an Inclusion prize for calculating how many women contribute on Product Hunt.
Harry Dry made a funny dating site for Kanye West fans.
What about encouraging people to learn CS on their own, who have no way, to go to the university?
(lack of formal education, money, time ...)
And for those people usually what matters are not academic high valued software, but to make a living. And many people dream about making a living with IT, so they want to read such success stories, so thats why you see such success stories much more ..
Both have their up- and downsides, and treating them like equals is ignoring that which makes them each of them unique.
There will always be a market for self-taughts, if you don't understand this, you don't understand what makes a self-taught special.
My whole point was that the truth of what it is to code for a living is hidden by those kind of sensationnal articles. Those who want to get into the industry are not encouraged to work on what matters (ie engineering skills instead of fancy frameworks) and end up disappointed with their opportunities or their skill set. CS universities tend to push students toward developping an engineering skill set.
I would really like to see people without a degree that want to improve to be encouraged to do the same instead of being encouraged to read 3 wordpress tutos and start selling their skills by manipulating small business owners into spending money they don't have.
I trained developers with and without a CS degree and I always nudge them into improving engineering skills.
It's not manipulation. It's always a sales proposition, but you're either doing it well or you're doing it poorly.
Obviously, there is no external, impartial arbiter of what makes a "good" programmer (or products, or services). There is only perception.
I used to drift around but I've learned the importance of selling myself so I can be sure I get the value I deserve.
So many things in business are sales transactions, and it's better to come to peace with that early on. Sure, we're engineers but if you want your value to be recognized you have to learn to be a businessperson too.
This does not prove you can make money by learning some wordpress overnight but still the article pretends exactly that. The average worker with average sales talent will have to present real skills to an employer to get hired. Those real skills take time to develop. It's evidently possible to get them outside of Uni but it takes times and effort. Guidance by experienced people reduce time and effort to learn a skill. That's the whole point of schooling btw.
Those article say "I taught myself how to code and became rich by offering the world an awesome product". They should be "I'm a very good salesman and I became rich by getting people into buying my software".
That software is maybe good, maybe not. Mostly not. Second law of thermodynamics teaches us that you can't beat a 30 year old experience with an overnight schooling, except if your father is zeus or someone like that.
I think you're going to see these kinds of arguments made ('Don't attend University. Learn [x] instead/on your own.') and each day the argument is going to hold more merit. The university industrial complex continues to expand and become ever more out of reach for a large section of the population, or worse: it's becoming more and more fiscally irresponsible for most people to attend higher education, taking on the mountains of debt necessary to make it possible.
So the sensational stories of survivorship bias about the one-off people making exorbitant amounts of money can definitely go... but a university degree is becoming more and more impractical, and I expect it to get much worse.
That degree got me my first job. And the next. I started with zero debt and I do not come from money. I am very grateful for that. I would probably not have attended a 5 year college if I had had to get into debt.
In the US*
All that means is that either alternate methods (eg: trade school) will become much more sophisticated, or that the US will fall behind countries that have solid, but much cheaper CS degree programs (helllllllo Waterloo)
Good developers can also hop from one job to another and make more and more money in the process.
Job security is a thing of the past, whether you went to school or not.
The "ideal" developer isn't some kind of monk who dedicates his entire life to one firm.
Making money doesn't mean your product is bad, useless or badly designed. It also doesn't necessarily mean you're the best salesman.
Sometimes experienced developers without a CS degree and without sales skills still get paid a lot because:
A) the requirement doesn't call for advanced computer science knowledge
B) the requirement does call for a significant amount of practical experience and business knowledge
C) it's a highly profitable industry and the specific work being done will generate the company profit and/or cut costs
It can be perfectly legitimate to perform jobs like this without having a CS degree or ever intending to get one.
It can be perfectly legitimate to work your way up the ladder of such jobs and jump from job to job in the process.
Some of us want to raise a family and/or be able to retire one day. Why should we put our careers on hold to pursue a degree?
I think you mistook my A => B assumptions for a no B => no A which is a flawed logical reasoning.
I totally agree with that proposition. The degree is not a sine qua none condition of competence.
My point was that success stories about kids making a lot of cash on a self taught developer skillset are pure and simple lies. They hide the truth to those who really want to get into the IT industry and make a living with it. That truth is : work your engineering skills if you want to build cools things.
I said make a living. Not get crazy rich. Engineers don't get crazy rich. Salesmen (and salewomen) do.
People that did not have the ressources or desire to go to uni would get a lot more encouragement and from real developer tales : stories about smart engineering, beautiful UIs, dedication to a craft and passion, or even sly hacking.
Instead they read stories about skilled salesmen. The stories are not even that good. Glengary glen ross and the wolf of wall street are much better.
You mostly spend (or waste) time on tools, frameworks and interaction (both with humans and other systems). Lots of common development is rather mundane compared to all the beautiful theory behind it. Which is not automatically bad, but also doesn't require a CS Degree to get going.
I don't necessarily enjoy writing compilers. But the fact remains that I can write a compiler. I can program in C or C++. I do understand pointers. None of this may hold any real value, but I wouldn't be able to do any of them if not for the degree.
I liked your initial point, but the argument weakens... People absolutely have learned all the above things (and very well), on their own, outside of a CS degree, and I bet you could've.
My point was that I wouldn't have learned it because I don't enjoy it. And sometimes, professionally, we get to do stuff that isn't fun. The nature of being self-taught is heavily biasing the things that interest you. College forces you outside of the box. Outside of the box happens to be those things for me, but they'll be other things for other people.
Sorry if that point wasn't clear.
Learning to think outside the box and learning about specific specialties that you don't find interesting aren't even remotely the same thing. If you read what I wrote, you'll notice the example areas I gave. None of them were "thinking outside of the box", they were fields that didn't interest me.
The value they bring is that I learned a common language. I can talk to ML engineers or Compiler Engineers in a common language because I have experience in those fields that I wouldn't had I taken a different route. That isn't even remotely a requirement for my field. It's just useful for discussions with other people.
Maybe you'll spend hours and hours learning compiler design and implementation so you can have a friendly conversation with a colleague at lunch, but I'm not going to. Formal education forced that on me. That's been healthy for my professional networking, but that's about it. I still consider it useful, but had I skipped the CS degree I wouldn't do it. Nor would most people.
It's natural to gravitate towards things that interest you. Some people are driven by gaps and learn things regardless, most people do not. That's not even controversial.
And that's my point. If you're self-taught you have to be willing to learn things you find completely uninteresting (or boring, hard, whatever) if you want to be as well-rounded as a CS graduate. Most successful self-taught programmers do exactly that. Most people don't.
Not necessarily, you could also just find all that CS stuff interesting.
I'm about 3/4 of the way through writing a book on implementing interpreters and compilers [0]. My day job is as a software engineer at Google working on the Dart language.
My highest attained degree is a high school diploma from a shitty public high school in southern Louisiana. I went to LSU for a year and a half and dropped out.
EDIT: Note - I see your replies and reasoning with others on what you meant; I do agree with you there, too.
---
I know you can do all of them without a CS degree.
Where a CS degree really helps, though - and this is something that I know I lack (but real-world experience has taught me enough that I can get by) - are what could be almost considered CS fundamentals:
* Data Structures
* Sorting Algorithms
* General Algorithms
Fortunately, in the day-to-day realm of most programming, you don't need to implement any of them from scratch, and most of them you can learn the basics of (or "best common examples") fairly quickly, which is where I am at mostly.
The problem happens when you run into a situation that isn't seemingly addressed by that level of knowledge (which again, thankfully, in most day-to-day work is extremely rare); by having that prior exposure via a CS degree, you would at least potentially know some words or phrases to look up to refresh your memory on concepts.
Further, you would also have the knowledge (or refreshing of knowledge) to be able to understand any new developments that may have occurred since you were taught (and so could easily read any research papers on the topics).
If I were in such a situation, I would need to break out some google searches on various xyz (ie structures and/or algorithms), use whatever understanding I have to understand those to a level to be able to pick out potential candidates to study in more depth, and maybe hope to run across more recent stuff that may be better (and pray I could understand it enough to implement it).
The one upside in this day and age, though, is that for all of these, for virtually any language I currently understand, someone has likely written an implementation of it - which can be extremely helpful both in the solution to a problem, and in understanding that solution.
But a CS degree would make things much simpler, were it something I had time to pursue. I could probably find the time, but the cost vs benefit ratio no longer works out to my favor, beyond self-edification, given my age and current life obligations.
The latter is able to identify holes in his own knowledge, and find appropriate material to educate himself on. That ability is what defines an autodidact in the first place.
This is also the very same thing you get taught in basically all sciences: How to aquire knowledge about a subject matter you yet know nothing about.
So, an autodidactic Programmer without a degree will most certainly have similar knowledge as a CS graduate, simple because that is how such people "tick".
It's just that not every self-taught programmer is an autodidact. And in that case I agree with your argument.
https://en.m.wikipedia.org/wiki/Operational_semantics
Writing a compiler is just the side effect of showing it could be useful. It’s not hard programming equals cs. It’s the science part of computer science that matter.
Earning my BS and then my MS did not increase the amount of money people were willing to pay me to build things. However, I can generally tell when I'm working with someone who is entirely self taught and I assume others with degrees can tell also.
1. "I can just tell that person is self-taught." (No, they went to a contemporary dotcom feeder vocational CS program, and spent all their time adding the latest framework keywords, and drilling for the leetcode whiteboard interview.)
2. "It hasn't occurred to me that other person might be self-taught." (Yes, they are.)
3. "100% so far."
All the stuff that your CS degree taught you is also possible to learn by reading books.
ITT people are focusing too hard on the content of a CS program and too little on the more general goals of an undergraduate degree:
- expose you to multiple fields of knowledge while focusing on a main thread
- help you develop generic thinking skills that should translate to a variety of fields of application (there are many CEOs with art history degrees)
- lead you through a first approximation of a scientific project, qualifying you for graduate-level research
- signalling to the world that you have the chops and the work ethic to go through with a major project with many frustrating stepping stone
- etc.
i.e., hazing.
You demonstrate commitment by surviving the hazing ritual.
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.
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.
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.
In another comment a few days ago, I mentioned a 10x engineer I knew. Graduated from high school. Went into the military. Came out and coded. He is the best coder I've worked with.
College education is not necessary to be a successful programmer. You do need to have some predisposition to coding, but you definitely don't need a degree.
Yes.
While the evidence provided is anecdotal (that is to say: outliers exist in successfully learning anything outside of a formal education), there are languages designed to be more friendly and more fun for newcomers (Ruby, for example) while others are designed to be translate more directly to the instructions a machine might execute. More anecdotal evidence indicating that one language might facilitate informal learning better might be interesting or helpful.
What they care about is if you have given them a solution that solves their problem(s). They don't care how you got there. They don't care what technology you used. Just as long as you solved the problem(s) they were having, and that you did it in the time/budget allotment for the job.
That said, as the solution provider you should have found out both their current use cases and potential future use cases, in order to select the tools you'll need for the immediate solution, and ideally for any updates or improvements that may be needed later on.
Because they will care, for instance, if the code you wrote was in a language that won't allow them to scale up quickly and easily (assuming you wrote the rest of the system to allow for this of course), or has some other kind of issue that prevents the client from moving forward with a change.
The last thing a client wants to hear is "complete rewrite using different language/framework/system" just to implement an extension or upgrade path (the best you can usually get by with is a refactor of the existing code base - but you better have a damn good reason and plan for that refactor).
I simply asked a simple question out of curiosity, JFC. Does curiosity matter?
For the record, all code is ephemeral so since you're going to end up throwing it away anyway one day, it doesn't fucking matter what language you start with. Pretty much any language can back-end an API until a certain (large) number of users. #ProblemsWe'dLikeToHave
Twitter threw away Ruby and went to Scala; Facebook is slowly replacing PHP with... whatever, pretty much anything is superior to PHP; plenty of other companies have had to do partial or full rewrites of core functionality on a new stack. Paul Graham himself had his Lisp code tossed in a rewrite.
Uber's ripping out Python and going to a bunch of other langs: https://eng.uber.com/tech-stack-part-one/
Uber and Reddit have schemaless db backends for scalability reasons; I doubt they started out that way.
And yet, Discord is still on Elixir. Isn't that interesting. But I think they're putting in pieces of Rust.
So... I just asked a question.
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.
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.
- People who went to university, going through significant effort for their degree, and want to defend that choice
- People who _didnt_ go to school, perhaps suffering from a touch of imposter syndrome, who want to hide their insecurity
I'm a 20yr old "self-taught" dev. I'm considering going back to school this year. But its a tough choice. Things are going very well for me in the professional world so far. I was in a CS undergrad program for a year but didn't feel like I was learning as well as I was on my own, to be honest.
What I think I can say with confidence is theres not much point in arguing about this. If you want to go then go. If not, don't. Why do we have to prescribe a gospel on this? Let people decide what they want to do. Part of why "self-taught" devs like myself often suffer from insecurity is people shouting the absolute necessity of a degree. I don't see it.
Additionally, I legitimately enjoyed the coursework and learning about high(ish)-level math, art, and engineering that I may otherwise not have. It also gave me free time to pursue fitness and personal projects.
I'm probably not a better programmer as a result. And I'm probably not wealthier either, as I failed to leverage my degree into a position in Big Tech, though as a middling developer, it does make it easier to find jobs. But I do think I'm a better, happier, healthier person, and I would do it again.
The discussion today seems to be all about the logic of it (how will you know what's in a uni degree unless you go?) That was the logic that convinced me to go. It wasn't until I graduated that I could say, with confidence, none of the classes contained anything I didn't already know.
(Yes, yes, including the theory classes.)
But the parent is exactly right: going to uni is a complex decision with multiple independent axes to evaluate: will you make more money over your lifetime (probably not)? Will you get that job you want (probably not, it's more down to people skills)? What will you do with your spare time while in uni (you will have some spare time)? What will you do with the opportunities to meet people?
Then there's what uni you want to attend. How you plan to pay for it. Whether you want to live in a dorm, live with your parents, or go online.
It's always like this when it comes up, which is fairly often here, and I think you're right to point this out. It's an emotionally loaded topic, which means it's a hard one to actually get useful data from.
I think there's a couple of things going on here:
The path someone takes to get where they are is a huge part of their identity. So when they look back on their own history, they want to feel that that path is a good, valuable one because it implies that they are valuable people. So everyone who doesn't have a degree has an incentive to feel it's not important. Likewise, everyone who has a degree wants to feel it is.
The thing is, they're both right. There are many many paths and almost all of them are worthwhile human experiences. Many of them even lead to being a good software engineer. (And of those that don't, they still often lead to being a valuable human in other, often more important ways.)
But the reason it's useful to write about this stuff is for people that are looking ahead and trying to choose a path. Those people want to know the odds of each path and how likely it is to work out for them. Unfortunately, a long list of anecdotes is really hard to synthesize into that. It's like trying to figure out where to eat dinner when every single restaurant review is five stars.
I don't have good data either, but if you're trying to pick your path, I would think about your personality and how that's likely to interact with your choice:
Not going to school gives you more freedom to explore your interests and choose a unique, idiosyncratic path. If you are driven and focused, you can get farther down a road than most others will because you have the freedom to focus on areas where you are passionate. If you want to stand out, it's easier to do so this way.
At the same time, if you aren't self-directed and passionate, you can end up meandering and going nowhere. No one will tell you what to do and it's easy to end up doing nothing, or just dabbling a little in a million things. All of the onus to create structure and discipline is on you.
School will give you a structured environment to learn in. It gives you a curriculum crafted by experts so you will be introduced to topics in a reasonable order and you'll be shown things you might not have realized are important. You'll also absorb much of the culture and tribal knowledge of the field. However, this is skewed towards academia, and if your goal is ultimately industry, this may not be pure win.
Personally, I think going to school is generally a good, safe bet. You'll learn a lot, have a good experience, and meet a lot of people. You'll take a bunch of non-CS classes that will round you out as a human. Even though I dropped out, I got a ton out of my limited college experience, mostly not related to programming.
Not getting a degree is a higher variance path. You may blaze a trail and end up somewhere exciting and unique. You could be the next Bill Gates or Steve Jobs. Or you could end up flipping burgers, or underpaid because you're at a company that values degrees.
Not going to school gives you more freedom to explore your interests and choose a unique, idiosyncratic path. If you are driven and focused, you can get farther down a road than most others will because you have the freedom to focus on areas where you are passionate.
This is me, but I know this is not for everyone. I would advise going to school to make it easier in the long run. Passion for your work and the focus to pursue it is very important to get somewhere.
If school worked like it does today, 20 years ago, then maybe I could've finished it.
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
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!]
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.
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.)
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'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've worked with loads of self-taught developers, mostly from tech/coding bootcamps, and I've seen a lot of people burn themselves out due to a number of factors:
1. Bootcamps are hard, but suddenly these developers find themselves in a harder environment where 12 weeks of coding experience might not be enough to get them out of a problem.
2. Bootcamps cost a lot of time/money, without the option for a student loan, so many people put themselves into debt to switch careers, and that added pressure is a lot for people - especially when they've been sold a lucrative career and find that a company has hired them because they are cheap.
The CS knowledge aspect is largely irrelevant, because many developers can get by quite happily without ever using a linked list or priority queue, or knowing anything about quicksort, merge sort, etc. For most projects where you need to merge k sorted arrays, concatenating them and running the standard language sort function is good enough.
IMO, the problem has never been one of skill, because many industries have developed skills on-the-job or with time spent in industry. Where a CS degree comes in handy is in giving a student a structured approach to learning over a respectable amount of time, and offering a step above the entry-level barrier of entry.
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.
I've found being willing to learn more to help me out, my breadth of knowledge is good enough that in many languages and concepts, I can hold my own against CS graduates.
I think knowing what you don't know is important, because you get incentivized to expand your knowledge. I'm currently studying Maths and Stats, because they're a good base for data science, and where I want to go in my life out of corporate.
The value that I bring to the table is no longer fluency in about 7 languages and a skill to learn more quickly (I've done obscure things like reverse engineering 'complex' accounting rules written in COBOL). What I bring to the table is the ability to solve problems using my financial expertise and technology.
So if anyone's reading this, don't be intimidated by "coding". I see writing software as a natural extension of what's on my mind, using what I understand technology to enable me. So, stretch your mind, it's a very powerful thing. Have faith in yourself, and do great like the people on No CS Degree
Found interviews with self taught people who hacked together websites and built businesses.
Admirable but misleading. Suggested title: “No CS Degree required - interviews with entrepreneurs who learned to hack code”
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.
If you need software to scale to hundreds of millions of users, then you probably need people who have CS degrees to think about your hard problems and how best to optimize them and which ones have no polynomial time solutions for all inputs (problems to be avoided or worked around somehow).
I can do RSA by hand (on small messages), quickly tell (with only pencil and paper) what 2^1027 mod 3 is and do Euclid and Extended Euclid by hand to find multiplicative inverses (in one pass). But I can write code that runs pretty well, too, and I can do that with or without a CS degree. So can most people.
For example, the conceptual framework for reasoning about distributed systems provided by chemical engineering is superior to the traditional CS version when applied to software systems, and more mature. This has been a persistent advantage over the course of my career designing scalable software. And it is much easier for a chemical engineer to learn computer science than the other way around.
I've come across a few other examples of this in computer science, particularly as it relates to complex systems design and behavior, and not just in relation to chemical engineering. Extremely complex real-world systems as a model are relatively new to CS but have highly evolved solutions in other disciplines out of necessity. There is still much value to be had in learning CS from an unorthodox perspective.
Long story condensed: I grew up dirt poor. Went to college. Got my first computer that could get on the Internet (1998). Wasted time online, missed classes, lost financial aid. Ended up going to work for local ISP doing tech support. Quickly moved into web work, and then development. (mostly ColdFusion) This was late 1999, when things were booming and everyone was hiring.
I took a 6 month contract - low on the contracting end of things, but great money for me. Next job was in HR department attached to the airline industry, which was a good job even when the "dot com crash" was occurring. That job ended do to effect of 9/11 on stock prices, but by then I already had a couple of years of work experience under my belt and was on my way.
Today: director of technology for a small company (fancy way of saying I'm the lead developer and lead architect)
What was true for me then is true for many developers today: some are very cut out for this. Looking back, I've always been a programmer; it wasn't a trade someone told me to go to because of the income. That's why I think some bootcampers succeed, and some fail: truth be told, this industry isn't for everyone (alas, I saw many leave the industry in the early 2000s who went on to do accounting or management or car sales or whatever they're a better fit for). Those same students, and myself, would also succeed with a CS degree. I think the lack of one is a matter of circumstance, not a formula for success or failure.
I will say that there are certain jobs I'm not necessarily equipped for due to some missing foundational information. Those situations are the examples that everyone goes to, but the reality is, the world is bigger than SF and FAANG. (And even at the FAANG's there's plenty of Python, Ruby, and JavaScript slingers... the only time they may have used their CS degree was to get past the ego-stroking whiteboard interview)
No real regrets, though I had (and still have) a sense of inferiority that drives me to study. Last year I threw out many boxes full of papers that I've read over the years (they're mostly available online now). I have bookcases and bookcases of CS-related material. I've read Knuth, etc. (okay, still going through Vol 4...).
My only regrets are not getting a better math background (a decent calculus-based probability and statistics course would have helped). I took linear algebra in school, but didn't really get it until I started doing graphics and then I needed much more than my college course provided anyway.
Tried going back to school a couple of times. Work always got the better of me. Finally I realized that the degree just wasn't important to myself or my employers, and that I wouldn't learn anything anyway. Lack of a degree has never been a problem when finding a job (except once, and I actually felt pretty good about that one . . . maybe I'll tell the story some day).
I think the key to long-term success (whether you have a degree or not) is continuing self-education. I try to keep up by reading papers and digging into promising new tech. The industry is bigger and moving faster these days, so you have to pick and choose what to stay current on. It's a good idea to branch out anyway (if you read ten papers on storage, networking or graphics, read a couple on something unrelated, like AI or queuing theory or dig into biology or astrophysics -- stretch your head). Helps to do different types of projects, too.
I plan to work until I drop; I feel fantastically lucky to have found a career that I enjoy this much. My father-in-law retired from writing code at age 75, I think I can go longer.
I'm writing mostly to hopefully let others know you can be self taught and be super impactful.
I've dealt with a lot in my life, and our ride wasn't smooth sailing -- https://twitter.com/randallb/status/1110669172487286784
But regardless, now I build things that are high quality and fun.
They are more ok with doing 'not fun' stuff, because they have suffered doing a bunch of homework. At work, maybe a percentage of the job is fun, and some things you need to power through. Tuning logs, painfully stepping through the code for the 110th time to find the erratic bug, or boring documentation, also part of the job.
They are less inclined to just copy-paste a solution that you found on StackOverflow and more agreeable to go into the R&D mode of finding the right algorithm. This can be a blessing and a curse.
People that have been through several years of education are more inclined to follow a schedule. We are very relaxed at Silicon Valley and yes some people do their best work from home, but sometimes you just have to be here. College helps form some of these habits.
Last, a degree comes with a lot of soft skills that Universities just throw in sometimes. Communication skills, the ability to summarize properly, grammar and spelling .. not required for a coder but definitely useful for someone that wants to grow into a career into software, eventually you need to interact with Product Managers, Business, Customers, and those unrelated-to-the-job skills start becoming very handy.
I can even speak for myself. I didn't learn to code at school much , did some bash and C here and there but that was not the point of my study. We mostly had math, physics and electronic-oriented courses and more precisely in my case a lot of telecommunication courses.
Still, for a first programming job, engineers (as in those with an engineering school diploma) are often preferred to people with a CS degree, which did a lot more programming that we did.
I would guess that it mostly has to do with the reputation of both the schools and the students from there. When it comes to STEM, engineering school is seen as much more prestigious than studying in a university. Young people with higher grades wishing to make a career in programming more often than not tend to choose the former over the latter - even if it means less focused courses.
And yet having said all that, I wouldn't say that french developpers are worse in any way than developpers from other places. Even if most of us learn to truly program at our first job.
I'm not at all saying that a CS degree has no point, but as long as you have the minimum knowledge about the field when starting, it's very efficient to learn on the job the specificities.
That said, most folks did have some sort of science-related degree. People with no higher education aren't unknown, but quite rare ime. People with higher education only in non-science fields have also been quite rare. I haven't run into many shit hot coder history majors, frankly, but those I have encountered were so smart I'm certain they could have aced any degree they took the time to study for.
Last thought: architecture, design and coding seem more akin to creative endeavors such as writing a novel or play, making movies, that don't seem to be easy to "teach". e.g. nobody is marveling that J.K. Rowling doesn't have an English Literature degree (French, to save you checking..) and nobody is seriously trying to "teach" folks to write the Harry Potter series.
Disclosure: EEE major
I'm willing to bet there's some selection bias here. If you got a job and don't have a cs degree it's probably because you're so good you don't need a degree. The skills outweigh the lack of a degree, which means higher risk. The piece of paper sets the bar lower because there's more trust and thus lower risk.
As someone getting a graduate CS degree and coming from a different degree I notice that there's definitely Swiss Cheese knowledge. I got here because I could code (half my peers can't in their first year of graduate school. This surprised me a lot!). But on the theoretical side they have less Swiss Cheese knowledge than I do. It's a weird dynamic.
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.
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 got my first programming exposure when I was 5 or 6 on a Commodore VIC-20. By 10 or so I was doing 6502 machine language on a Commodore 64. I went from there.
I have a BS degree in biology. I studied that because I wanted to study something new, but more importantly because I was interested in AI. I always thought (and still think) the best way to learn about intelligence is to study the only existing examples of intelligent systems. These are found in biology. The University of Cincinnati let me do a little bit of a "design my own major" thing so I designed one in "organic intelligence" with classes in genomics, evolution, neuroscience, and ecology. Those are the four scales at which intelligence is found in nature.
I work in computers now (founder of ZeroTier) but still follow AI and biology avidly and would like to return to some of those areas of study someday. I also find that my study of biology deeply influenced me as an engineer and the types of systems I design.
I graduated from college with a degree in Philosophy where I was focused on logical systems. I recall one of my favorite professors being intrigued to know whether I could program and disappointed when I confessed that I only did the design side of web development.
I of course had a strong interest in code, having gone through interactive online python tutorials but I wasn’t able to make a the leap into becoming a developer.
The wall, I realized, was my lack of knowledge in the unix command line. Once I learned about bash, ssh, and setting up basic web servers, my learning skyrocketed.
With a background in logical systems, I was able to grasp the model of computing very rapidly. While I cannot claim to be advanced in algorithms or data structures, I feel comfortable being able to develop solutions that work.
On algorithms, I think being able to use the work of others is already very empowering. Perhaps one day I’ll get into it deep.
It's like they memorized some books and definitions but never actually had to build anything.
The developers that didn't have a formal background in CS almost always did poorly on the technical questions, but I found about half the time it was simply a lack of knowing the terminology. She might not know what a monad is, even though she implemented in her own code.
I have always been into computers, but didn't really consider it as a career until I got a job that required me to do a lot of data entry, so I started teaching myself how to automate things. I turned a 40 hour per week data entry job into a single button click on Monday. This meant I had a bunch of free to time to develop my skills and work on additional programs that would help our organization. I fell in love with programming. I eventually interviewed for a position but failed the technical questions miserably, I didn't understand a lot of the terminology like "linked list", "adapter patern" or what "bubble sort" was. So, after that I got a book just about programming interviews, and realized I had actually implemented most of the practical things in that book, I just didn't know the technical name for it.
After I read that book I interviewed at another location and was immediately hired. The only difference was that I took maybe a week to learn some terms.
The site seems to lean pretty heavily on contradicting the remarkable idea that you might need a CS degree to slap together a website and write some lines of PHP.
But that being said, there's a lot of evidence that some people who don't have CS degrees can do great programming and even great CS, and a lot of evidence that some people with CS degrees can't code their way out of a wet paper bag.
I'm not sure why everyone feels the need to run around with their dresses over their heads every time this comes up; although it does provide a good venue for people to indulge in the harmless pleasure of praising oneself on HN.
I'll say this. There's advantages starting both ways. By starting from a CS background, you're likely to get a formal education into concepts and terminology that might seem boring otherwise. By starting from a non-CS background, you begin with the most important skill a programmer requires-- the ability and passion to teach yourself new technologies and concepts.
Any developer who begins with a CS background can learn to be self-taught.
Any developer who begins without a CS degree can learn algorithms and advanced concepts.
1. You can be highly educated in a subject without getting a formal degree.
2. A CS degree is not a programmer/developer degree. CS is to programming as art is to drawing.
3. Having knowledge of CS might mean you can more easier adopt to a variety of roles (front-end, back-end, systems programming) but comes at a cost that you probably have less practical skills than someone who is specialized in this (because of self-education/going to a trade school/learning on the job).
I have a bachelor in informatics, master in CS and PhD in informatics (technically informatics is not CS, but there's a lot of overlap), but I would say I gained most programming/development knowledge through internships and working on personal projects.
If you are starting career, how are you going to convince someone that it is not passing fad for you, that after 6 months you would say "ok I am done, I am bored with it". There is no way to show people how much time you invested in your self study. It is not about what you know, it is about other people getting to know so they can hire you.
Your point still holds true in this industry when you get as much as 300+ candidates applying for 1 graduate job. As much as I hate it, unfortunately some companies would hire internal candidates than external ones even if they were highly qualified, because they are highly networked within the company.
Having just a CS degree in 2019 is not enough to market youself as a better candidate. It is meerly seen as a minimum expectation from larger companies.
Functional programming has seemed much easier to pick up without formal teaching than object oriented. The latter appears to have many more unknown unknowns.
e.g. in game dev I did not know that static methods and objects existed, so I built a bunch of dictionaries in an instance of a single use class to store some data for a game. It works, but its garbage.
But hey, all things are discoverable eventually, and I would argue going through the experience of why things are nice before learning they exist has some merit to it. I don’t blame companies which require credentials though. Hiring is hard, especially hiring many people at once.
I was blown away by his methodical approach to a simple problem I gave him. Less than year later he was running his own team that had people in it that had been to some of the top universities in the UK, like Brunel, and they all respected him. He'd completely taken control of that project. That was all using VB6. 20 years on he's now a leading C++ expert.
Degrees don't mean anything imho.
So if you have no prior experience with the web-technologies, I would recommend you to learn a bit of HTML/CSS/JS until you are familiar with them (build a simple, plain HTML page, add some CSS to change the layout, throw in some JS to load some content asynchronously and maybe add some JS buttons to make the page interactive via JS (e.g. change the content when pressing a button)). Nothing too fancy, just make should you know what every language looks like and which language to use for what use-case.
Next, you should find out which Java Framework you really need to learn. When I learned Struts 2 a couple of years ago, I remember that it was considered outdated already.
And then start doing the tutorials of the frameworks, followed by building something you want to build with those technologies (start small and keep adding stuff). At least that is the path of the self-taught developer.
No one second guesses a CS degree, but a good chunk of CS grads (your future coworkers and hiring managers) will second guess a self-taught education.
I learn some of the most interesting shit that I would never have thought to teach my self. Data structures, discrete math, and theory of computation come to mind.
Learning about how grammar and linguistics are so heavily tied into CS has been eye opening and has helped me understand so much more about what's going on in a computer. I never would've learned that on my own.
Sure, probably don't need that to get a job as a developer. But, having a CS degree != being a developer in the first place. I get that they can go hand in hand but it's just not the same.
Most companies don't have a hardline requirement for having a degree anymore, but if they do, even for management, I'll do my best to avoid them.
Last thing, I started coding at 28.
I'm at the ceiling pay-grade wise now, and burnt out, but that's another issue :) The moral of the story is, you can progress really well in this field if you can prove yourself. Experience > Education
However I think that people loving the job are better than the ones that were learning for it, so no wonders sites like this exists.
And in any case I wouldn't go to a self-taught doctor, so something will probably change in the future.
By the way, my site does use HTTPS and for analytics, Simple Analytics so no cookies.
But could you imagine riding in a plane or using critical infrastructure services programmed by people with absolutely no computer science degree to their name? Not a chance. Like getting surgery from a butcher.
In at least Sweden's machine industry programming is just something you learn in your engineering role by osmosis and revulations from God, and typically one to three 7 week courses at university.
Volvo Cars, Volvo Trucks, Scania, SAAB etc.
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.
can i write a compiler or a lexical parser or am I versed in distributed computing and/or other highly specialized technical areas? not off the top of my head, but give me a few days/weeks and I know I'll be able to.
Every one will have knowledge gaps, the skills for CS degree and real world programming will have some overlap, but there is whole lot of distinction in both.
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.
Let me explain: When I learned to program, QBasic was the first language I had contact with. I could make the computer beep but never achieved anything useful. Next, I learned HTML and was very happy about creating something. In school, I learned a little bit about Delphi and while GUI programming was cool, I preferred doing things on the web. A little time, later I came across PHP and was finally able to create real websites. So I coded a few projects with PHP and had my first struggles with arrays and the likes.
Finally, I arrived at the stage where I wanted to learn a real programming language. So I learned C. C was great. I mean, it was also very complex, but finally, I had control over every bit.
At that point, I started a CS degree and learned about pure languages like Smalltalk (Object Orientation) and Scheme (Functional Programming). Those languages were beautiful but felt like a step back in terms of practicality.
When the JS frameworks poped-up I learned to use a few of them too and still use some of them today and while JS is a great language to create results, it doesn't feel to me like a language that teaches you how to write good code.
Along the way, I encountered other languages like Java, C++, Python, Rust and those are certainly not bad languages, but I wouldn't recommend them for beginners.
What makes Go so special, in my opinion, is that it reduces the complexity of C while not taking away its purism. It comes with all the tools you need (except a text editor) and encourages to write good code. Finally, it has good support for building web applications so finding a good use-case shouldn't be that hard. After all, good use-cases motivate students ;-)
I am well aware, that one could certainly argue for every programming language to be the perfect candidate, so please remember that this is a personal opinion.
In my opinion, software is more of an art and design discipline than other types of engineering. The traditional notions of what constitutes an engineer do not apply as much to software. This is clear in the fact that we have no formal certification.
That can be both a good and a bad thing.
Lately, I've been exploring other areas of CS which have always interested me, even as a child with my first computer, namely that of "machine learning". Where I have found I fall down in that area is in understanding the deeper level math concepts. I know these aren't really required to come up with solutions to problems using the existing toolsets for machine learning (as long as one can understand the math and concepts at those levels, which is arguably simpler) - but not having that understanding (or only a partial understanding) makes me frustrated that I can't understand exactly what is going on inside "the black boxes".
For instance, I (mostly) understand how MSE and backprop works in a neural network. I also understand why and when to use RELU vs sigmoid (or some other activation function). But could I derive any of that from first principles? Not at my current level of understanding (all those damn rules of calculus - which I don't understand). In many cases, though, I don't need to - I can treat them as a black box. But I don't like it. I do intend to fix this someday.
Of course - this subject - machine learning - has over the years led me down interesting and surprising paths (long before I started really studying it as a subject, in 2011, when I took the "ML Class" and "AI Class" MOOCs). Things more philosophical in nature, but all seemingly related in some manner, at least to my mind:
* Chaos theory
* Network theory
* Emergence and Complexity
* Theory of Mind
* Various topics in neuroscience
* Various topics and ideas in psychology
* Etc
...with "Etc" encompassing robotics, engineering, electronics, ethics, history, religion - and all the interactions and branches and spaghetti in between.
So much of that I wish I could have a more formal grounding in; I also wish I could speak with (and have the language to speak with) those who have this knowledge and grounding. I know that to be an impossibility, even if I were 20-30 years younger.
It astonishes me that many don't see how much CS in general touches and interacts (and both informs and is informed by) with all those topics and more. I see this, even if I don't understand it completely, and sometimes wonder or suspect that maybe I am wrong at some level? Maybe the lack of a formal education in all of those subjects has caused me to see things which aren't there...?
Alternatively, it could be that by not having such an education, I am - like before - not "constrained in a bubble" so that I don't see those things?
I am not saying I am special in this regard - I have read and spoke with others who have similar ideas to one extent or another, and in many cases their understandings have informed mine.
I'm just not sure if I should focus narrowly at this point in my life at 46 years of age, or go more broadly; both are fascinating paths for me. From what I have seen and read, it seems like the "broad path" would be more immersion in studying philosophy, perhaps with a greater focus on the philosophy of mind and/or consciousness.
At the same time, I like to think about and focus on the idea (and fantasize of solving it - fat chance) of the "wrongness" of backprop - and whether another solution exists for neural network learning that is more biomemetic?
...and at this point, I'm rambling - so I'll shut up.
You can still teach your things, but as soon as you submit to formal training you are no longer “self taught”. That’s what self taught means.
The practical real-world applications of those classes aren't 1:1 with their first job. I'm a frontend engineer and took 0 classes that are even remotely relevant to my day to day work. That said, foundation adds value. I can speak a common language with other engineers, including those that are completely different than my specialty.
To suggest a persons degree is meaningless is just as nonsensical as saying being self-taught is meaningless. I've also worked with both prestigious graduates that can't program and self-taught brilliant programmers. However, they are exceptions to the rule. The only thing that doesn't indicate much is anecdata, which both of us have now provided.
As an aside, your attitude towards entry-level programmers is likely similar to the attitude of senior programmers when you were entry-level. "Simple" is relative. You were undoubtedly a considerably worse programmer when you graduated as well, assuming your current title was earned through merit. Perspective.
It's possible there's selection bias going on. The wheat end up at the Apples and Googles of the world and the chaff end up working with you.
This isn't intended to be an insult. People who attend ivy leagues are given such a huge leg up that even an average graduate probably make it further than most of us plebeians.
All professional knowledge is self-learning. The founder of The Pure Function Pipeline Data Flow.
[The Pure Function Pipeline Data Flow](https://github.com/linpengcheng/PurefunctionPipelineDataflow)
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.
It's hard for everyone to enter the industry, especially now, college or not. It's not about how smart you are, or your identity, or your environment. It's how bad you want it, how hard you'll work for it, and if someone is willing to help you.
As software engineers, degrees or not, focus on that last part. Be there for someone learning, studying or just trying to figure it out. Feels great to see a finished product. Feels even better to teach someone how to fish, (code for money). I wouldn't be here if it wasn't for people along the way, giving pointers, telling me where to look, telling me what not to do. I was a gawd dang line cook. Be that helpful person.
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.