
OSSU: A path to a free self-taught education in computer science - paulygarcia
https://github.com/ossu/computer-science
======
tombert
This is a bit hypocritical coming from a self-taught dropout, but I have kind
of grown to dislike a lot of these "learn programming on your own!"
things/bootcamps/courses.

This isn't because of some idea that it's bad to learn programming for fun,
but more that I think it's kind of reductive to try and squeeze things down to
a streamlined lesson to begin with...There's a reason college takes four or
more years; it takes a long time for these fundamentals to really sink in, and
moreover, a lot of the "extra" classes you're required to take actually _do_
inform your perspective on a lot of career stuff. For example, I hated taking
philosophy classes and thought they were "pointless", but I recently realized
how much they have helped me with logical thinking, and being able to justify
decisions I'm forced to make.

If you're learning to code just for fun, these things are totally fine and can
be incredibly fun, but if you're learning to code for a job, _please_ don't
treat these things as an "alternative" to college. Any kind of self-learning
system almost universally requires a huge amount of self-study, probably more
than a university, if you want to become any good at this stuff.

~~~
Pfhreak
I'm 50/50 on this. Part of me really agrees with you -- you need time and
practice and mistakes to learn this stuff. But also, I'm not sure it has to be
wall clock time.

Four years at university gets you breadth that is probably good for you as a
human, and probably important for contextualizing your work as an engineer (oh
hey, history might be a valuable lesson for your understanding of ethics. Art
and literature might combine with your computer science degree to inspire
projects natural language processing or generative art.)

I think it's possible to condense down from 4 years for someone who is highly
motivated and self driven. And honestly, I think many, many people's careers
would benefit from going partway down the computer science path -- being able
to script repetitive tasks or diagnose computer issues methodically will help
you wherever you land.

~~~
lol768
>oh hey, history might be a valuable lesson for your understanding of ethics.
Art and literature might combine with your computer science degree to inspire
projects natural language processing or generative art

For what it's worth, this is a very American approach to college.

You generally wouldn't spend more than 3 years on an undergrad course as a
student in the UK - because you tend to spend the vast majority of time on
your chosen degree subject. There's maybe room for one or two optional modules
in an unrelated field.

~~~
devmacrile
Possibly because the U.S. provides the "best high school education in the
world.. It's just a shame you have to go to college to get it."

\-- Alan Kay, some anecdote I forget how to locate

~~~
alankay
From the very proper English lady across the table from me at a supper at
Douglas Adams' house: "You Americans have the best high school education in
the world -- what a pity you have to go to college to get it!"

------
ChuckMcM
As someone who has lived through a big chunk of the 'computer science'
lifecycle arc :-) My perspective is a bit different here.

"Programming", or the skill of writing specifications that can be translated
via software into product has come a long way from the 60's to the present
day. People I meet, interview, and work with, often fall into three broad
chunks of the spectrum.

At one end there are 'coders', who are essentially cooks, they take previously
written code, adapt it to their requirements, attach it to third party
libraries and ship the end result. They have been essential to the boom in
Internet companies for decades because they ship a lot of code and they are
relatively inexpensive (with respect to the expected generated revenue) to
hire. When their code doesn't work as they expect they generally iterate on it
using other suggested solutions until they arrive at one that operates the way
they need/want it to.

In the middle are 'engineers' who build more at the system level and can fill
in the gaps with third party software when needed but are also fully capable
of generating the required capability starting with a blank screen. When the
system doesn't work they expect they can analyze it from first principles to
get to the root cause of the problem.

At the other end are 'scientists' who think about the problems of the nature
of computing. These folks rewrite an algorithm in three different ways to
understand how different compute architectures might execute it. Driven by the
joy of discovering new insights about how computers work, if something they
build doesn't work they are delighted because it has illuminated a gap in
their understanding that can be productively filled.

Different educational settings are useful for addressing the goals of the
student, and in my experience those goals will be different depending on where
on the spectrum of 'programmer' they see themselves.

~~~
carokann
Simplistic but it's a pragmatic way of looking at things.

------
jamestimmins
This has some good courses, but in general seems overly long and is of
inconsistent quality.

As an alternative,
[https://teachyourselfcs.com/](https://teachyourselfcs.com/) is a curriculum
from the folks at Bradfield, but it's narrowly focused on core CS
concepts/topics.

~~~
newguy1234
The big problem with projects like this is the quality is pretty much lacking.
Most of those MOOCs to begin with are no way intended to replace the
equivalent college class. Most of them are watered down introductions to the
courses. At a baseline for me to take any MOOC seriously then I want to see a
high-quality textbook (or equivalent) for the course. If that doesn't exist
then my opinion is the course is likely to be of low-quality. I'm sorry but
replacing a textbook with a series of online blog articles or tutorials is
simply not a sufficient replacement.

~~~
Jimpulse
The site gp posted addresses your concerns. All the topics listed in that site
primarily focus on textbooks with the videos or courses as additional
resources.

~~~
sincerely
What does gp stand for?

~~~
doctorsher
GP stands for grandparent.

In case you need an explanation: in the context of a forum, the parent comment
is the one you are replying to, and the grandparent comment is the one your
parent comment replied to.

~~~
sincerely
Thank you

------
jlevers
It seems to me that one of the biggest advantages of having a CS degree from
an actual institution is that prospective employers are far more likely to
believe that you actually have the skills you say you do.

If you're self-taught, but have truly gone through something like OSSU (or
[[https://teachyourselfcs.com/](https://teachyourselfcs.com/)](https://teachyourselfcs.com/\]\(https://teachyourselfcs.com/\)),
or any other set of courses that covers much of what a CS degree would), how
do you convince employers that you actually know what you say you know? Sure,
you can perform well in the interview, but first you have to make it that far.

~~~
greggyb
Just an FYI for you. HN does not support Markdown, but does automatically make
URLs into links. Unfortunately, its parser doesn't play well with Markdown
syntax. Your link goes to the URL below:

    
    
        https://teachyourselfcs.com/](https://teachyourselfcs.com/)
    

Rather than to [https://teachyourselfcs.com/](https://teachyourselfcs.com/)

------
kevintb
I hate to be that person, but “Multivariate Calculus”, “Introduction to
Probability” and “Introduction to Logic” cannot possibly be considered
“advanced math” and “advanced theory” as this guide states. This is something
every CS freshman learns in their first term.

------
CalChris
If this is self taught then calculus shouldn't be core. It should be moved to
advanced math and replaced by more linear algebra. Calculus is a beautiful
course but linear algebra is central to data science and ai. Unless you're
getting into topics that require it, 3 semesters of calculus will go unused.
You can't know too much linear algebra and discrete math.

~~~
h3ctic
Linear Algebra is indeed essential - but Calculus as well. If you're talking
about AI, then backpropagation would be the first thing that comes to my mind
where Calculus is needed. On the other hand if you talk about data science, I
would focus more on statistics and probability theory (again linear algebra
and calculus are tools you will need)

~~~
PeterisP
There's really nothing in applied machine learning that requires calculus.

1\. Usually you're not _implementing_ training, you're most likely using a
framework that does training for you while you set up NN structures and data
flows.

2\. If you are implementing specific training methods yourself, massaging loss
functions, new regularization functions and various objectives, and you _are_
explicitly implementing backpropagation, then you're not implementing
differentiation yourself, you're most likely using some kind of autodiff
library or framework that does that for you.

3\. If you _are_ actually doing something with ML that involves _you_ doing
calculus, congratulations, you're likely doing PhD research on the topic and
yes, sure, you're expected to know calculus at that point. But it's not really
_necessary_ even at this stage, an intuitive understanding of the concepts is
obviously useful, but much of actual applied ML academic research doesn't
really _use_ calculus directly, the methods obviously use calculus but it's
used just like CUDA kernels are used - obviously necessary but as a very low
level of abstraction that's handled by those who specialize in it and most
others can just apply it because it just works and is good enough.

I mean, seriously, you can get good progress and published papers in computer
vision or NLP or data analysis without ever needing to directly use calculus;
most people doing that would obviously know calculus as it's a basic thing,
but it's not really that relevant to the daily work, most likely none of the
experiments you'll run will require you to solve any calculus problems.

------
mlthoughts2018
Given there is variation of skill at anything, there will be variation of
skill at self-teaching. Not all self-teaching is created equal. If you’re not
good at self-teaching, then you get a bad teacher every single time.

Colleges diversify this risk. A few teachers might be bad, a few will have
their back to the gigantic lecture hall the whole time, etc. But averaged over
all your classes, most of them are actually pretty good, and many TAs,
tutoring center employees, classmates, etc., can help a ton. Plus you’ll
practice and improve self-teaching the whole time.

Like it or not, college can command a high price for this standardization and
diversification of teaching quality risk. It confers a status credential.

Meanwhile, if I see you are self-taught in a complex engineering discipline,
so what? If you also have job experience already to back it up, then ok. If
you’re asking me to be the first one to take a gamble on whether your
particular instance of self-teaching led you to sufficient competency, no
thanks, I don’t have time to take that risk.

~~~
woat
If the self-taught candidate can pass an interview screen at the same level of
a new grad, then how does hiring the former become more riskier than the
latter?

~~~
mlthoughts2018
Passing trivia interview screens is useless, can’t tell you anything useful.
You have to dig recursively into technical details about past experience or
projects, and for university new grads this would be their education work.
What will the self-taught candidate do at this point?

~~~
flukus
> What will the self-taught candidate do at this point?

Generally self taught people will have built something. I'd generally consider
that the definition of self taught and would not include people that have only
done self directed learning.

~~~
mlthoughts2018
That would be fine, but I think it’s weird that you’re trying to make the
phrase “self-taught” stretch to include also building something. I think it’s
far more common for people to believe taking a self-directed online course and
getting a certificate entitles them to equal consideration for a job as
someone who put in 4 years of a structured university program.

~~~
flukus
Maybe I'm out of touch with how it's used today, but self taught used to be
someone that built things, W3schools was the closest thing to online courses
years ago. If so I'd argue the modern usage is wrong though, a self taught
mechanic is someone that tinkers with cars, a self taught electrician is
someone there own cables, a self taught sysadmin typically fell into the role
by doing stuff, a self taught investor has invested money. So I see know
reason why a self taught developer shouldn't be someone that's built software.

------
pmiller2
This is great, but I was wondering if there is any similar, more text-based
alternative? Videos are great, but I prefer text.

~~~
icpmacdo
See jamestimmins post about
[https://teachyourselfcs.com](https://teachyourselfcs.com) it's a
recommendation of textbooks to follow for self learning CS

------
saboot
I really like this list, but believe it's wrongly titled. I'm a nuclear
engineer, who pretty much just writes modelling software all day. The software
architecture stuff is something I've never been taught and always felt would
be immensely valuable to learn. Some good resources for that on this list.

Also a request for any resources of scientists trying to get their head around
how to write good software, we're all pretty much people who once read a C++
tutorial and just went with it.

~~~
devmacrile
That is basically the mission statement of Software Carpentry
([https://software-carpentry.org/](https://software-carpentry.org/)). They
have a _ton_ of great material for those in scientific computing wanting to
improve their software engineering skills.

~~~
saboot
I've looked into software carpentry, I'm glad it's there but learning how to
commit and 'intro to <python/R/unix>' is about five years behind what I need.
Most scientists can read intro tutorials themselves. I'll keep looking around
on their website though, thanks for sharing.

------
quaquaqua1
I am entirely self taught. I have a degree in History but didn't do any
programming in college courses.

Everything I learned I learned from a non-structured source.

I talked my way into my first technical job, then talked my way into my next,
and so on. Many people denied me during coding test or on resume screens.

But for the few employers who didn't, I thank them for taking a chance on me
and it seems they're keeping me around because I deliver valuable code to end-
users.

~~~
mjfisher
Did anyone tell you why you failed the coding test stages? I'm putting
together a best practice checklist for coding tests, and I wondered if you'd
noticed any common themes.

~~~
quaquaqua1
It's probably not very helpful but certain problems are just too hard for me
or I've never seen them before :) I don't have a deep background in data
structures and algorithms, so most of the jobs I get are more like for very
small companies that just want a guy to stand a bunch of libraries on top of
each other and make a cool crud app with a "modern" interface.

It's a very different experience from an org with 100 or more engineers. Good
luck on your project!

------
swiley
I'm not sure this is meaningful as a path to employment in the US if you don't
actually get a degree at the end.

I've gotten calls from at least five recruiters this week alone all excited to
have _finally_ found someone who's at least done some C only to realize that I
haven't finished the community service hours for my degree (I've done all the
classes but the university won't officially confer the degree until I've
finished this, that's made my summer pretty complicated which has actually
made it a lot harder than it needs to be, thankfully I'll be done in a couple
weeks.)

What you actually know only matters once you're hired (at least for your first
couple jobs.)

But it is always good to be learning new things and if that's why you're doing
this than good! I've been teaching myself violin and I can definitely
appreciate classical music more because of it, I absolutely don't expect it to
get me a job.

------
neogodless
I see some comments here along the lines of "Is this a good way to get
educated in computer science?" or "Is this a good path into a career?" or
"What are some good alternatives?"

Maybe the problem is that it's pretty hard to gauge how good education of any
kind is. We have countries all over the globe doing things a bit differently,
and we have public and private schools with different methodologies. But,
while I personally don't have the answers, and obviously our governments
probably aren't sure either, clearly there is work being done in figuring out
what works and what doesn't.

What are some good resources for identifying the best forms of education?

Are there any resources for identifying the best way(s) to learn computer
science, or entry-level computer programming, or foundational software
engineering?

------
unnouinceput
Browsing throughout those courses I found out that more then 50% of them
require you to either sign in with FB or Google in order to access them, so no
thank you. Remember, if something is free then you're the product.

~~~
user_50123890
it doesn't always have to be nefarious.

By having a FB/Google sign in a website won't have to deal with implementing
login, registration, email verification, forgotten passwords, etc.

Oh and even better; if they get hacked then all the hackers will be left with
are hashed FB/Google IDs.

------
groundCode
> assumes the student has already taken high school math and physics,
> including algebra, geometry, and pre-calculus

Does anyone have good resources for someone who would like to brush up on
these subjects?

~~~
lolinder
The best source I've found for reviewing these is Khan Academy. Their courses
are more thorough and accurate than most high schools teach them, and they
have all subjects you list.

------
rc-1140
While it isn't directly related to the topic of the thread, is the Imposter's
Handbook a suitable purchase for someone who didn't major in CS in college to
"catch up"? I had two intro to CS courses during my undergrad and took several
night courses while employed at my first job and did get a tech-facing career,
but once I got that job I haven't had the energy to go back and tackle things
like Data Structures and the maths I have to take all with the pressure of a
grade.

~~~
hnruss
I went back to college after having worked as a developer for a few years,
which helped me focus on what mattered. That book looks like a good overview
of many important CS topics.

I recommend the following topics (in roughly this order):

\- Data structures

\- Sorting algorithms

\- Search algorithms

\- Algorithmic complexity analysis (Big O) - _Important_

\- Databases

And these topics that aren't in the book:

\- Set theory

\- Networking

\- Security

\- Encryption (learn what to do and what not to do)

My take on the rest of the book:

\- The history of computing is interesting but not necessary to learn (plus
there's a lot more than what's in that book)

\- Software design patterns and principles are nice to know, but they're only
useful when you're in a position to design the software (not likely for an
entry-level job)

\- Study functional programming before trying to learn lambda calculus, unless
you like abstract math (guessing you don't)

\- Learning how compilers work is not necessary unless you're working on a
compiler or writing much low-level code (sounds like you're not)

\- Testing is good to know, but it's not really that hard to figure out how to
do

\- Unix basics can be useful, depends on your situation

------
w8rbt
You could also get a free Udacity account and watch the Georgia Tech CS Master
classes (OMSCS). Algorithms, Machine Learning, Operating Systems, etc. It's a
good program.

------
dang
A thread from 2017:
[https://news.ycombinator.com/item?id=16035839](https://news.ycombinator.com/item?id=16035839)

------
ilaksh
Personally I think this is great but I would spend less time on certain things
and more time on others.

I think what people who are trying to train themselves for programming jobs
need most is topics in software engineering. And in particular I have my own
view of the most important parts of software engineering.

So I would put more emphasis on modern tooling, practical requirements
analysis, hammer home the importance of iteration and closed feedback loops
such as end-to-end testing and observing/interacting with users. Emphasize
iterative requirements analysis and verification -- it's very easy to get on
to the wrong path early on in a project and waste a lot of time. And for most
projects the programmer is the person who is best equipped to really
understand and steer requirements and this means they need to be assertive
which is quite a challenging aspect that requires practice.

Also modules and components can be critical so they need to get beyond objects
or functions to that level. And also they need to understand and have
experience with package managers and registries. These are examples where
things have changed over the years. In the past it might have been more
important to, for example, have experience with assembly language, or
something. But these days, for building new software or integrating existing,
selecting and combining components is critical to leverage the massive amount
of available code and systems and avoid reinventing the wheel. People
disparage that as "glue" or "plumbing" etc. but it is a high-level skill that
needs to be developed and I think in most cases a much more advanced approach
than building everything from scratch. Also it takes practice to know which
parts should be components and which parts should be custom.

------
Havoc
I’m glade that this exists and it looked interesting for me at first glance
but it’s just too detailed. Wouldn’t mind brushing up my theory but learning
about CMOS isn’t what I had in mind

I guess I’m not the target audience, which is fine

------
aronhegedus
This reminds me of

[https://functionalcs.github.io/curriculum/#linear-
algebra](https://functionalcs.github.io/curriculum/#linear-algebra)

------
dlphn___xyz
why doesnt this exist for any other field? you never hear of a DIY
mathematician or economist...further proves that tech is a trade not a
profession

~~~
KoftaBob
All it means is that the software engineering sector is more open to
applicants with varying backgrounds. This shouldn't come as a surprise, given
how relatively young and innovative the tech industry is.

There's nothing stopping someone from getting textbooks and learning the
fundamentals to be a mathematician or economist, what stops that from getting
them a job is the industry not being open to that.

The differentiator between "trade" and "profession" has traditionally been
physical work vs intellectual work, not how tightly controlled the training
is. For someone to describe something as complex as machine learning or
building Netflix's backend as "a trade not a profession" is just absolutely
absurd.

~~~
hogFeast
It also depends on the culture of teaching. In econ and, to a certain extent,
in comp sci the stuff occurring within universities is very different from
what students of those subjects do when they leave.

And, imo, this is actually due to the popularity of the underlying subject.
Both econ and comp sci are popular because of what you can do when you _leave_
uni but this means more funding for those _inside_ uni. This funding seems to
go into producing more arcane research and increasing the complexity of the
subject (not knowledge, just complexity).

Mathematics doesn't do this. The practical and the abstract are clearly
demarcated. If you are studying to go onto research, there are usually
specific courses. If you just need to know calc, there are different ones.

It isn't healthy when this distinction isn't clear. Economics has suffered
massively from being very abstract. Comp sci is probably going the same way.
And I think in both cases more effort needs to go into making the knowledge
more accessible.

------
codesushi42
Does anyone have a similar resource for applied math?

I am looking for something that goes beyond the standard calculus, linear
algebra and stats material. For example, optimization, numerical analysis,
stochastic processes, dynamical systems etc.

~~~
proverbialbunny
The first thing that came to mind (maybe due to mentioning stochastic) is
MITx's [https://micromasters.mit.edu/ds/](https://micromasters.mit.edu/ds/)
Masters in Data Science. It's statistics, but 102. (Of the alternative MIT
6.0002, which is MIT's intro to DS stat class.)

I take it you've done Discrete Mathematics and have enjoyed it? If you
haven't, I highly recommend going that direction first, as imho it is the most
beneficial math class a programmer can take in college.

~~~
codesushi42
Yes, I did Discrete Math long ago and enjoyed it.

Thanks for the link! Though it looks too basic for me, I was hoping for
something on the more advanced topics I mentioned.

