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?
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.
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.
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.
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
Object 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.
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.
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.
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).
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).
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 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>".
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 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)
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.
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 ..
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
I'm about 3/4 of the way through writing a book on implementing interpreters and compilers . 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.
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.
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
You demonstrate commitment by surviving the hazing ritual.
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 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.)
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.
The only thing I've never had any use for is differential equations. I have for instance never worked with signal processing.
Maybe a few years later I started delving into 'hacker culture', and I picked up C with K&R (since it was almost universally recommended and easy to read), I also at some point picked up UNIX Power Tools (recommended in Linux Format) and The Practice of Programming. At some point after that I became really interested in Compilers and Operating Systems.
When I went for my first internship three years ago, the interviewer said I knew more about the things we talked about, than most other bona fide engineers they interviewed. The university-hired interns that sat next to me couldn't read the Erlang manual or documentation because it just didn't click with them, which while I can appreciate on some level that people have different sources of information that suit them best, it's still astonishing to me.
Consider that programmers started out as secretaries learning how to program the machine from the specification and the schematics given. A lot of the programmers I have met, probably wouldn't be able to cope with such a task, I include myself in that category.
I agree with you about the quality of books. A fair chunk of the books on my bookshelf from that era are 80s/90s to early 00s because those books are just an order of magnitude better written, with a high signal to noise ratio.
Can you imagine a modern language like Swift or Rust being taught to the same level, in the same space as K&R? I can't!
This is a common misconception. There were plenty of shit books then, too, you just won't find people remembering and recommending them. Whereas we haven't, collectively, discarded the shit books of today, yet.
I 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.
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.
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.
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?
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…
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
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.
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.
As for knowing the theoretical basis of computer science, that will have value in some parts of industry and very little value in other parts of industry. While someone in your position may have a high degree of success working in the upper layers of abstraction, someone has to develop, advance, and maintain the lower levels of abstraction that you depend upon. None of that is meant to say that you need that theoretical knowledge to be successful, rather it is important for some people to have that theoretical knowledge to ensure the success of the industry.
The difference is one will remain standing after an earthquake.
Building good bridges without an engineering degree is easy. You simply don't minimize materials and cost.
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.
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.
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.
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...)
This is absolutely key. One of the main advantages of a solid undergraduate curriculum is that it forces you to work your way through things that are important, but don't interest you as much. And this path is designed and supported by people with a much better broad view of the field than you have.
Now, you'll still always gain knowledge faster in the areas that interest you most, but if you only indulge this approach you will have significant gaps.
One thing I always recommend to people self-studying (when they ask) is to find someone you trust who really knows the area and ask them for recommended courses/books. Then follow that advice.
To some degree MOOCs etc. try and do this for you by designing course progressions, but there are limitations and constraints there that can have you spinning your wheel.
Being disciplined about both breadth and depth in a new subject is difficult. One of the underlying themes of a post-graduate degree, particularly a PhD, is to give you tools to do this for yourself repeatedly. It's not impossible to gain these skills properly with little or no formal education, but it is quite difficult.
I 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.
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'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.
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.
Unsolicited feedback: I think it should be pointed out that your attitude probably isn't helping in your job search.
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.
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.
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 don't know why you want to call that a "loop", but, sure, you do you, you crazy imperative programmers.
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.
Which is better? YMMV.
> I didn't know how to write a for loop
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.
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
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 :)
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.