Path to a free, self-taught education in Computer Science
github.com
github.com
Self-teaching computer science is a long and winding road. OSSU seems to favor a completionist approach that most people would do well to avoid. Grok on the fundamentals and quickly specialize, because life is too short to learn computer science in an encyclopedic way.
* https://news.ycombinator.com/item?id=29353904 - Nov 26, 2021 | 52 comments
* https://news.ycombinator.com/item?id=23588896 - June 21, 2020 | 265 comments
* https://news.ycombinator.com/item?id=13862284 - March 13, 2017 | 237 comments
> Self-teaching computer science is a long and winding road.
What does this mean in terms of years? My estimate for the not too persistent average person is, that working through (not only read once, forget) all of the books listed on that website could well take 10 years. For someone very focused maybe 5 and for one working "day and night" on it maybe shorter.
Just to give an idea: SICP, the PDF version, has already 800+ pages and many many challenging exercises to solve. That alone could take a year or more, depending on how easily it comes to a person.
That said, I often find the website to build up a huge wall against which anyone with not 100% motivation will crash. It might not be a realistic program for most people and I would rather recommend one item after another or smaller parts.
For SICP, I read through the year after finishing my undergraduate Computer Engineering degree. I had a decent background, but a lot of the concepts in SICP were new. I loved the book and got through it in a few months of train rides, doing most of the exercises in my head. I feel that was sufficient for me, but I also don't think I'm in any way the "average person" when it comes to this domain.
If you’re goal is to have the same amount of CS knowledge as the average person with a CS degree who’s a few years out of college, it probably wouldn’t take that much time. Extremely few - I’d say almost none - CS graduates have gone through the entirety of SICP. You can read the other comment where someone said they went through it after getting a degree in computer engineering, and a lot of the concepts in it being new to them.
How long will this take? If you’re focused on learning as much as you can, it’s a never ending journey. But you probably won’t find a use for most of the knowledge (more and more so as you go along), so it’s going to be a hobby for the most part. If you’re just trying to cover the topics that people say you need to know (IE, the site gives understanding recursion as a reason to go through SICP), I imagine you could learn most of them surprisingly quickly.
College courses don't go through books from start to finish. The instructor determines what's appropriate and what's left to the reader (and these books can be picked up many years later when someone recognize a gap in knowledge that's covered).
However, what's missing from these books are group assignments and mentoring from a proper instructor.
> Just to give an idea: SICP, the PDF version, has already 800+ pages and many many challenging exercises to solve. That alone could take a year or more, depending on how easily it comes to a person.
You aren't supposed to go through the whole book, especially for an intro class using SICP.
Alone you always worry if you skip something it will come back later. Math is the worst- trying to complete a textbook could easily take years.
Timing is really hard to nail down because your strength as a programmer and engineer really come into play. SICP, for example, took me about a month of putting in a few hours a day. As it turned out my professional experience had given me significant experience with many of the concepts involved.
Conversely, for Computer Networking: A Top-Down Approach it took me 6+ months because I'd never had meaningful experience with networks outside of browser dev tools and was not very good at systems level stuff.
Is there a good recommendation for teens who're just getting the programming bug?
My son's getting hooked but their curriculum is terrible (think Excel or word )...
freeCodeCamp, the YT channel and republisher isn’t that good.
They hoarde all kinds of stuff from other people on YT, and not all of the courses have good quality. I have seen some awful explanation/teaching in some videos on the fCC YT channel.
When I was young, generating visual things was my gateway-drug to programming. With all the tooling, frameworks, workflows, concepts, etc. that you have to learn today in order to do even simple things, programming can become pretty overwhelming to someone who is just starting out. Processing is like a sandbox that is simple, but still keeps you close to the metal and provides a fun and liberating environment to grow your skills.
It may not be for everyone, which also depends on what your son is interested in building, but creative/artistic expression through code is something that I believe everyone should experience at some point.
There are many great learning resources for Processing that cover the whole spectrum from very easy stuff to more advanced projects that involve physics simulation, fractals, 3D graphics, etc. I especially recommend the video lectures by Daniel Shiffman, who teaches even advanced topics in a fun and engaging way: https://processing.org/tutorials
When I interview ICs it is a very free flowing conversation. When there is a lull I will jump to a new subject. I will just start asking things and keep going deeper until I exhaust your knowledge.
“What is the command for listing directories in a terminal? Name a flag you can use - what does it do? How do flags actually work anyway? Do you know any libraries for CLI parameter processing? Ever heard of argc and argv? How do you think those variables are mapped into memory of the forked process?”
I go on and on and on. If you just become obsessed with computers and software engineering and put in some years of effort you can beat what school charges you for. Plenty of MIT and Brown and Harvard grads don’t know fuck all about software development. Credentials are a signal for sure but that is all they are.
I held ok until midnight, then I was just too tired and just told the interviewer there was no point and I went to bed.
Still doesn't go around the fact that universities need the approval for teaching the said degrees.
For example in Germany, the German title „Ingenieur“ is protected, but carrying the title Software Engineer is fine.
That being said, nobody cares about it in CS expect for government and very large companies which will use it against you in salary negotiation.
My understanding was that is was true throughout the French world (so French speaking Canada does this as well)? And that the curriculum for Engineers was more rigorous than other disciplines (there's a strong emphasis on math, you have to do some economics and so on)?
[0] https://www.bmbwf.gv.at/en/Topics/Higher-education---univers...
- The German equivalent would be "Diplom-Informatiker" (which roughly translates to "certified computer scientist"), which you're awarded after completing a graduate degree/MSc in Computer Science.
- In Austria you'd be awared a "Diplom-Ingeneur" instead, so a "Diplom-Ingeneuer in Informatik/Software-Entwicklung" would be a "Certified Computer/SW Engineer".
In Ontario, the PEO (board that manages these things) hasn't gone after software engineers often. I don't think I've ever heard of a prosecution in general, and may people call themselves XYZ engineer without having the P. Eng designation. They tend to prosecute civil, and industrial engineers, and building related engineers more since civil engineering and a Civil Engineer have very different roles. Even then, you have to be pretty flagrantly disregarding the regulations to make yourself a target.
The only people who'd given me a hard time over the job title 'software engineer' were engineering students during my undergraduate degree.
>“practice of professional engineering” means any act of planning, designing, composing, evaluating, advising, reporting, directing or supervising that requires the application of engineering principles and concerns the safeguarding of life, health, property, economic interests, the public welfare or the environment, or the managing of any such act; (“exercice de la profession d’ingénieur”)
In principle, there's certainly a good justification for the protection of the title, but the reality is much different. There's probably a case for regulators to actually figure out what meaningful licensure would mean for Software Engineers or companies but that'll never happen. There was a time where I thought 'Software Engineer' was a relatively uncommon title due to this case, but it appears Ontario employers have become much more lax about this.
And while the PEO hasn't gone after individual engineers, Alberta's regulator has taken up the case, for some reason: https://www.theglobeandmail.com/business/technology/article-...
https://www.peo.on.ca/public-protection/complaints-and-illeg...
The issue is the word "engineer".
If you say "software developer" there is no problem. If you say "software engineer" in many places that has an additional implication of being a professional engineer.
I have met "sales engineers", that are supposedly technical people and don't know you need to hit "enter" after copy pasting a command on the shell.
https://cacm.acm.org/magazines/2002/11/6976-texas-licensing-...
https://law.stackexchange.com/questions/52816/can-i-legally-...
Also, "software engineer" is an umbrella term within the industry; Very few "software engineers" are actually engineers (I don't recall meeting one software engineer that actually has the right to bear the title "engineer" - which, in my country -Portugal - requires being admitted in the Order of Engineers); The same goes for all "software engineers" that have actually graduated in mathematics, chemistry, electronics, telecommunications, biology and even design.
You may also find amusing that very, very few solution designers are actually designers, and even less software architects are legal architects. Also, often a cloud engineer or cloud architect has no idea on how to design proper rain.
One cannot just go around doing a six months bootcamp and then call yourself engineer without having studied at such university.
And those that sign legal contracts for project deliveries specially with government agencies, better have done the Order exam, if they want the Eng. on the signature.
Then again, if they happen to turn out to politics and even reach prime minister status, it doesn't really matter how they managed to get hold of the "engineer" title.
Naturally if one is at their own company, they can call themselves whatever they want, until they become invited to government and background checked on some TV channels.
You are still confusing job titles with credentials. In a private company, you can use whatever title you want for a given role, and you can hire whoever you want for said role, barring some legal limitations of scope (eg.some documents need to be signed by certified accountants - even if the job title is "Scrooge McDuck in Chief", some documents will require a lawyer signature, even if the job title is "Major Wolf", etc). You can name the CEO role "master dictator" and no one can do anything about it. And as you already know, no one but pompous self-entitled code monkeys calls themselves the Portuguese version of "software engineer" when they describe their job.
Also, Government isn't private companies. The Government itself hires very few "software engineers", as most implementations are done by private companies. The most obvious exception is, of course, teaching - and even those rules may be easily tweaked if you are outstanding in your field, or have done outstanding work on a specific area - something that frequently requires bright minds and middle-school level skills. On a fun note, there are even some fringe cases where you can actually legally teach recognized courses (upto level 4) without any formal education in that specific field. This is often an exception - not a rule - and needs to be thoroughly documented, but perfectly legal.
I only see this kind of nitpicking and fencing on guys that come out of the academia and think that the "real world" (translation: most, but not all vacancies) cares about titles, grades and (often bad quality or irrelevant) published thesis. I'm not saying a degree isn't important - or even obligatory requirement in some cases - but those are often the exception and not the rule.
I thought teaching might be a good laid back alternative income. Now schools consider you without a degree.
My path into tech has been really hard without a proper cs degree. Even after my first and second jobs I had a real hard time. I found my way through ops/DevOps/sre
I almost switched careers multiple times
How to do this?
I have never looked at or asked about how they learned the skills needed for the job.
So I'm taking a math course in the evenings and going to try university this year!
I wouldn't put much stock in word choices like that. Connotations vary so immensely around the world, it's best to presume they're synonyms unless context says otherwise.
An old example from the beginning of the century: if you did matrix algebra you could have understood how to rotate an object position in 3D for a game using math but find it very hard to code. Or you could take Michael Abrash's Graphics Programming Black Book [1] and learn it anyway. You'll do fine.
[1] https://www.jagregory.com/abrash-black-book/#a-simple-3-d-ex...
Boy, I can't wait until that magical day where I can bust out my knowledge of that Pumping Lemma, though, for those proofs I need to... always be writing...?
It basically made me a sys-admin, many people around me do docker these days, few can diagnose issues with Docker itself, route traffic around with valid certs, open a shell inside a container to really see what's happening. But I just feel at home inside Linux. I know my way around /etc, I know how I would do things and that is how things often are. It helps me a lot in my daily job. I feel like the whole stack is an open book to me. I still listen to a lot of Linux podcasts (like most Jupiter broadcasting shows), that also helped me a lot, also keeps me informed on recent tech.
I'm really getting paid for my hobby nowadays.
It's a lot of fun, I get to choose my own preferred tech which is really nice (I have strong opinions).
If anyone with similar skills (Python, Docker, Shell) reads this and looks do get started, do check out our Google Summer of Code projects for this year. You'll get paid and can pick any task in this field: https://github.com/borgbase/vorta/wiki/Google-Summer-of-Code...
I think the reason 99% of people study computer science is to get a computer programming job. Almost all programming jobs are actually software engineering jobs these days.
So I believe that at least one third of a degree program like this should actually be software engineering.
And the most important part of software engineering is the outer loop with clients or end users (or some stakeholders). So they should train on multiple project iterations with some external group as customers.
So the interaction with customers, defining requirements, the basic looping of iterations and maintaining software and evolving designs and technical debt, somewhat larger codebases that make modules/components/classes etc. more important. A lot of that should be integrated and probably even replace some of the lower-level stuff that would have been much more relevant in the 1980s for most application programmers.
It should be multiple projects that get evolved over the entire course.
Also another thing, a key tool to add to an education like this would have been active Google searching and learning how to do that, which should be at least a small part of the curriculum. Since the last few months, another key tool at least as important is ChatGPT.
The technology landscape changes rapidly. Education should keep up. Especially if its self-education, no reason to be stuck in the late 80s or early 90s.
Not quite. Most all programming jobs are translation jobs, where you take some business requirement and put it into code. Which is why GPT models are going to render most of those jobs obsolete.
Funny, seems that this take is more obsolete than the degree itself :)
Also the OpenAI coding model code-davinci-002 has an 8000 token max not 4000 like text-davinci-003.
There just needs to be more targeted training, and some system built around it to write a complete service code, and you can replace a good number of jobs solely through that.
By pure I mean with no other requirements such as accessing another data store and running a bunch of rules decided by having several meetings with various people to find out what is actually required… a bit like what chatGPT doesn’t do.
On the point of >Almost all programming jobs are actually software engineering jobs these days.
Thats a very narrow view of Computer Science, ignoring how software and hardware can be exploited in air gapped scenarios, exploiting what the military have traditionally called Signal Intelligence, not something taught in any university or online as far as I'm aware of.
The undetectable metadata by human senses because of restrictions like our range of audible sounds, ability to detect tiny fluctuations of electromagnetic radiation, lack of knowledge of a devices ability, makes most computer science graduates somewhat blinkered and restricted in perspective and highly exploitable, with hubris being the number one attribute for most.
IMO Computer Science should be viewed more as a natural science, incorporating things like physics, biology, psychology, chemistry along with what's currently taught in a stereotypical CS course. I'm reminded of the fact that my language debugger is an excellent colour blind test operating in plain sight and when you become wise to these additional points of interest, you start to see the chaff from the wheat, whose good, whose not because Only the Paranoid Survive!
How many people will come into contact with an air gapped system in their entire lives?
Are you a bot trying to resource burn me? If a bot, would you even know you are a bot?
> Are you a bot trying to resource burn me?
Seek help.
But designing a user interface that's intuitive or chooses sensible default values, especially one that isn't "typical" (where a business model or user use case already exists), or one that's not trivial to specify, or complex to integrate into a workflow -- these use cases will require iteration in order to specify useably. And revision of a specification is an ability where language-based specification tools like GPT have yet to prove themselves -- like activities such as interactive debugging or the performance tuning of an implementation.
How do you describe a task to ChatGPT that isn't yet well defined and still requires iterative refinement with the user to nail down? Until ChatGPT can perform Q&A to "fill in the blanks" and resolve the requirements in a custom task, a human in the loop will still be still needed.
Think of ChatGPT as a way to code using templates bigger than the ones used today. Initially it's templates will be smaller than the average function. It's hard to know how long before its templates will grow in size and complexity sufficient to build a full blown app, unless that app is pretty trivial and requires no customization. I'm guessing it'll be years before it creates apps.
A scaffold is basically a code template that gets you started with writing a particular class so you don't have to start from zero.
ChatGPT is an amazing scaffold generator, which isn't suprising because that is one of the defining features of an LLM but people extrapolate this and say absurd things that simply trigger my bullshit detector.
Prompting an AI to write text is also quite a slow back and forth process that took me two hours for a basic class I could have written in 5 minutes but since the AI can answer with bullshit in five seconds I am now obsolete even though it needs multiple iterations and reading the code is the bottleneck and I practically did all the work. (Integrating the code into my project and doubling the lines of code because asking it to make the modifications and additions is just way too slow. Typing is just too damn fast to bother. Maybe teach your developers touch typing so they don't suck versus AI?)
Could you elaborate on this? Why do you think it's such an important tool for software developers, and how would one go about learning or teaching it?
Also, what should be an appropriate interval between the appearance of a technology and its inclusion in a curriculum? Curricula, by their nature, tend to be fundamental and conservative.
Curricula should not be so conservative in this age of high technology. Especially in a highly technical field.
In that case, wouldn't it be more useful to teach students regular software engineering skills that will allow them to check whether the code generated by something like ChatGPT is correct / appropriate / fit for purpose?
I guess I'm wondering what is it that a CS course would need to teach specifically about ChatGPT.
software engineering: https://amspub.abet.org/aps/name-search?searchType=program&k...
vs computer science: https://amspub.abet.org/aps/name-search?searchType=program&k...
Dumb example: counting sort is fast! Ok let's use it. Then your data happens to be an array of 2 elements -10000000 and +10000000.
Or the classic "let's parse a math expression with regular expressions".
Exactly the point I was trying to make when saying that knowing theory is useful :)
With my recent encounters with new-comers and juniors employees, this has become a big commonality
> And the most important part of software engineering is the outer loop with clients or end users (or some stakeholders). So they should train on multiple project iterations with some external group as customers.
100%, I've become an advocate for this in my recent roles. Something as fundamental as applied communication between different contexts is underrated in a lot of curriculums I've heard of from.
That would almost be a Psychology course. Include stakeholders who don't really know what they want, who think they know what they want but constantly "rearrange the furniture," and who try to give you the solution rather than the problem. This would be a great idea. For this to be effective, it would probably have to be 2 semesters, 1 for theory and 1 for practice. It's a great idea though. Get rid of some of those Calc/Physics classes.
I had a professor tell me one time that the "meeting of the minds," between stakeholders and the developer was the hardest part of building software and that getting specs was like "pulling teeth." He wasn't wrong.
How about an actual software engineering degree instead?
As others have said, it should teach interfacing with non-tech people, extracting requirements, reacting to changing requirements, and so on. But it should also teach things like source code control systems, bug databases, dealing with large long-lived code bases (go find this bug in this 1,000,000 line code base, say), what languages work best for which kinds of problems, and so on.
Maybe one third of that degree could be classical CS.
Can anyone recommend a good book for this? I'm getting the hang of lots of other 'TYCS' topics, but I'm mostly building little toys for myself to try out cool algorithms I see in my books/resources. But mention CI/CD, large module & class design, or other 'big software' stuff I get very intimidated.
Computer Science would be computational theory, complexity theory, a proof based cryptography course, the mathematics of computer geometry/machine learning type stuff.
About 80% of the courses here are software engineering courses - about using computers to build things. The quote 'computer science is as much about computers as astronomy is about telescopes', comes to mind.
Just call it 'a self-taught education in Software Engineering'.
A standalone course, which presumably comes from the ethos of rejecting degree-based education, is completely free to call a spade a spade.
All of the computer-whatever bachelors from around the world are not allowed to sign up for it.
Historically and foundationally CS is a child of mathematics and electrical engineering, neither of which really fit the narrow English term of science.
CS is mostly preoccupied with a) making (useful) deductions in closed logical systems, and b) building cool shit. Empirical knowledge generation is usually only relevant as a tool to help us with the first two goals.
There is a notion of experimentation in pure CS, because CS asks the question, what can be computed on physical machines. And to check that, you actually need to build and check.
Nothing illustrates this better than Quantum Computing. Computer Science (and Physics) theories predict the existence of quantum computing, and suggest a computational advantage, but we will never know unless we build QCs and experiment.
To me, it is that at our core we are a society of marketing bullshitters. The vast majority of daily activity is marketing falsity as truth to each other in basically all context.
Astronomy isn't called "Telescope Science" though..
This also covers a lot of things you should probably not be studying as self-taught dev, since there is a much larger opportunity cost because you are not at university. I like calculus and maths, but that knowledge is low value for a developer.
Once you've bootstrapped a basic understanding of programming and CS, I think you should be building stuff 80% and reading up on new things that catch your eye 20% until you hit diminishing returns. Reading about things like SOLID, DRY, algorithms, OOP, etc is just not going to stick. You need to build stuff and start getting an intuition for the concepts.
Immersing yourself in community discourse is also very underrated. You will pick up so much jargon and be exposed to lots of different concepts and tools just by hanging out where other programmers talk, like on HN, Twitter and Reddit.
Obviously this is not what everyone wants in life, but it's a fairly straightforward path to career success and financial independence.
Aside: any good curriculum definitely needs to include building, learning is not a spectator sport.
If you want to be a top engineer you will need to learn CS stuff at some point, but you don't need to do it all at once right at the start.
And stick with, after studies. When switching jobs, for example, I imagine the network you built there is helpful.
Many students today are alcoholics, stoners, activists, or just lazy losers. You also open yourself to sexual harassment lawsuits etc...
If you're at a university where none of your peers are better than you at anything - you should probably transfer.
Then don't sexually harass people?
You should have decency also if you don't attend a university.
Sometimes you'd meet someone who is just leagues beyond the average CS student, and they were often great and humble people. Spending time with those people, talking, studying, and just hanging out with them led to a lot of learning (and not to mention good times).
OSSU: Path to a free, self-taught education in computer science - https://news.ycombinator.com/item?id=27744255 - July 2021 (149 comments)
OSSU: A path to a free self-taught education in computer science - https://news.ycombinator.com/item?id=21062799 - Sept 2019 (172 comments)
Path to a free self-taught education in Computer Science - https://news.ycombinator.com/item?id=16035839 - Dec 2017 (66 comments)
According to one model, students have three primary motivations: 1) passing the classes and getting the degree; 2) getting good grades and otherwise being good on whatever is being measured; and 3) learning things. Teaching is most rewarding when the third motivation dominates, but the other two are often the necessary evil that pays the bills.
There is a huge gap between the theoretical and practical aspects of CS in both the academic and professional fields. Generally, most college programs have lab driven smaller classes, and produce better coders (ready to go in a few months). However, university level programs tend to produce primarily theorists from thousands of students (an additional 1 to 2 years of training is usually needed for a commercial setting).
I often recommend plumbing, as it allows folks to afford to do a postdoc. =)
Funny enough, I hold a 'general science' BSc. When I was applying for a work permit, the country's immigration office didn't believe my degree existed for a short while.
In general, a hiring firm should have put you in contact with a special lawyer to handle the nonsense/hazing.
Good luck, =)
The selection of areas and materials is broad enough to teach a reasonable chunk of CS. The individual course quality looks good from a quick skim.
I ask this question as a mostly non-technical person, wondering what skills it makes sense to develop in my children, so they can "skate to where the puck is going", so to speak.
I imagine it helps to know a lot of the same basics, but as AI gets better at reliably performing certain types of functions, it becomes OK to view more and more stuff as 'black boxes'. I'm trying to figure out what those black boxes are, and what they will be in the future. Because the more time you spend learning something that becomes irrelevant, the less time you can spend learning other stuff that remains relevant (coding or otherwise).
Learning how to deal with possibly-bad advice is a real world skill, as anyone who's used StackOverflow should know.
I am working on a website right now that uses OpenAI's models and at the moment it can definitely write and (immediately) deploy simple web pages with interactions and calculations exactly customized by my customers. I am working on the dialogue interface and the text-to-speech and some other things to make it work better. Planning to have a new release at the end of the week. The current version that is up is hard to use since it requires special commands and has some rough edges and uses the non-coding ML model (which can code, but not as well as the code-specific model I am switching to).
Within 3 years I believe that these types of systems will be doing a very significant percentage of programming tasks, both for programmers (as "assistants") and end-users.
Within 7 years I think that programming will have evolved mostly to be directing these types of coding assistants for most use-cases.
The challenging thing though is that kids still need to learn how to read, write, think and problem solve. Despite the fact that AI is starting to be able to do quite a lot of it for us.
They need to learn solid problem solving skills like problem decomposition, how to search/find answers to roadblocks (such as using ChatGPT etc. or other tools like Google and other tools that arise) or just plain persistence, logic, abstraction. The struggle will be getting them to do some of this stuff for themselves rather than cheating like most of their classmates.
But at the same time they absolutely have to learn how to use the new AI tools. It will be critical to stay competitively productive as an adult or just to be able to fit in. There will be important new tools every few months or years.
Where this is really headed in my opinion is by the 2040s high bandwidth brain computer interfaces that tightly integrate cognition with advanced AI systems (2-10 X smarter than humans) start to become commonplace. These will enable different paradigms for communication and society. Before we get to that, AR glasses/goggles will integrate AI deeply into most people's lives.
What is your justification for these estimates? I've been trying to pay attention to what various experts think (I'm not one) and it seems like far from a foregone conclusion that this will be the case, and it might not even be the case that scaling up produces the same outsized benefits we've seen so far.
François Chollet for example seems like someone who is pretty in the know about current SOTA and is not nearly as optimistic best I can tell.
https://twitter.com/fchollet/status/1620617016024645634?cxt=...
> But at the same time they absolutely have to learn how to use the new AI tools. It will be critical to stay competitively productive as an adult or just to be able to fit in. There will be important new tools every few months or years.
Definitely agree here.
> Where this is really headed in my opinion is by the 2040s high bandwidth brain computer interfaces that tightly integrate cognition with advanced AI systems (2-10 X smarter than humans) start to become commonplace.
My gut feeling is this is pretty insane and unlikely to be the case but I suppose insane things have happened before.
The only reason to be un-optimistic like that person is if you assume that the model capability will remain essentially static over several years. But even with current models (which new ones are released every few months at this point) there is huge potential for replacing quite a lot of real software engineering work especially when you start putting them in loops and specializing/priming them for particular types of programming.
* What every computer science major should know (https://matt.might.net/articles/what-cs-majors-should-know/)
* learn-anything mind map (https://learn-anything.xyz/computer-science)
Haskell and Prolog slightly less so but at my current job (mostly Clojure, which is even less popular than Scala and Haskell according to the stackoverflow dev survey) we do have one guy who prototypes stuff in Prolog sometimes.
In fact according to the SO dev survey Scala and Haskell are used by almost 5% of professional developers, almost as much as Swift which is hardly seen as a language with "effectively zero" commercial use. They also rank a lot higher in the salaries section than many more popular languages. And I don't know how recruiters think but if somebody lists that they know Haskell on their resume and are applying for a JS job I'd assume they can learn JS pretty quick.
Here's the data:
https://survey.stackoverflow.co/2022/#most-popular-technolog...
According to that, Haskell and Scala are used by (a bit less) than 5% together. Something seems a bit off about that though. I find it hard to believe that Python is used only 20x as much as Haskell, and I say that as a massive Haskell fanboy.
I agree it seems a little odd, there's probably some kind of a bias for people using those languages being more likely to answer the survey.
My wife works in Scala/Spark as a Data Engineer, at a very large Tech company.
I not sure your assessment is at all accurate.
What I tried to find for myself is a bunch of in-depth courses that cover the areas where I'm not as comfortable. I've started collecting some courses (there were especially many in the COVID era simply because the universities recorded the courses anyway and only needed to upload them), books and papers. I didn't aim to get a comprehensive set of resources covering everything or having some specific features, I simply gathered what I thought is interesting for myself:
If you just want a career in making computer software. Build something. Then do it again. Google all the stuff you need to build your current thing. After a few month it will be obvious to you that you can build software. Then talk to companies about junior positions. Tell them you are self-taught and show them the stuff you have built already.
Best to talk to a company (usually small companies are easier), where you are allowed to talk to a programmer early on. The fact that you learned everything by yourself means they do not have to hold your hand all the time. Hand-holding time is the most important consideration for me, when taking on junior devs.
[1] https://www.youtube.com/watch?v=4CpHpFu_KYM&list=PLbY-cFJNzq...
Either organize locally with a smaller group of sub-20. Even 2 or 3 or 7 people groups are great if you can hold yourself accountable.
Or you can organize over the net. Had some great groups during Covid, and formed 2-3 lifelong relationships from these groups. Get started with 50 random people from the discord server, and after 8 weeks, ~7 will still be there. That's enough and that's great.
This REALLY works. Trust me on this and get started.
Also curious if there is a list somewhere out there for similar self-taught path for other subjects?
How do they differ?
For example reading a file with a loop of read(1) works fine, but it's extremely slow. A CSE graduate should in theory know that, and also know why that is.
Group Characteristics:
- Has a full-time job and a family with kid(s): Basically means only 1-2 hours everyday, maybe a little more when workload is light
- Not super smart (probably can identify myself as median IQ at best)
- Did not go through a solid CS education (I came from MATH in a mediocre school)
- Managed to grab a developer gig by luck and self-development (for me it's mostly luck)
- Want to have the deepest understanding of computers and computing as possible (I just realized that computers and computing are two things, one is more about hardware and the other is more about MATH)
Issues identified:
So we probably still want to get the best education from MIT/Berkeley/etc. but the problem is:
- The courses are too tough for us
- We don't really have the mental reservoir to consume difficult topics everyday, so that means maybe a few hours of study may push me away from studying for the next day
- Contrary to the second point, we do need to study the material as often as possible to retain knowledge learned
My plan:
- Browse through the list of MIT/Berkeley/CMU/etc. classes and figure out a list of courses. I want to study reverse engineering so my list:
- Introductory to programming (I want to skip this one but local university doesn't allow me, see below)
- Computer Architecture
- Data Structure and Algorithms
- Theory of Computing (basically pre-requisite for compiler theory)
- Operating System
- Compiler Theory
- I then registered in local university. It's a mediocre one but it fits in the bill of giving me a general understanding of the topics - The lab/assignment is really easy, like in OS class it doesn't even touch anything about writing functionalities for a student OS
- The exams are annoying, mostly about memorizing things, but since I don't care about score I just get by
- I have to take a few extra pre-requisite courses such as Introductory to Programming and Discrete Math but I'm fine, good to pump to GPA in case I fuck up something in the future. I want to have an average of B
- I'm going to take one course per semester and study the corresponding MIT/Berkerly/CMU course in the NEXT semester, so basically I always have two classes going on from the second semester. The workload is more manageable and more importantly I already know something before taking the courses of tougher tier schools.I'm now on Data Structure and Algorithm so next semester I'm going to take Theory of Computing in local school + Algorithm in tougher tier school. I hope it can ease my way into the topics so that I don't burnout quickly.