
Path to a free self-taught education in Computer Science - lainon
https://github.com/ossu/computer-science
======
ilaksh
Seems like a great list.

One criticism: I believe that the majority of programming jobs are software
engineering jobs (even if that's not in the job title). Since many are using
CS as prep for programming careers, I believe this list may need more emphasis
on software engineering and contemporary skills and knowledge in SE.

For example, I saw testing in the advanced section if I remember correctly.
But it was one of multiple options I think. Doesn't everyone need some testing
knowledge/experience?

Another one is requirements analysis or negotiation. Figuring out _exactly_
what needs to be done, in a way that makes complete sense all the way through,
is feasible and high priority, isn't nonsense from a UI or database
perspective, and getting the other people to go along with that, is pretty
important to most programming jobs I have had.

Another example: back in the good ole' days of CS, large scale code re-use may
have been mostly a dream for most popular programming language ecosystems
(that weren't Perl). But now, even though dependency reduction still seems
much cooler, being able to use real package management systems and select the
right modules or components is critical for most jobs. Not sure that type of
thing gets quite enough attention in this list.

~~~
harrisjt
Do people get testing experience in a CS degree? For me it may be a small part
of my software engineering course but that would be it.

~~~
imakecomments
In my experience, at my school testing is done to pass a professor's designed
test cases. Usually you don't know the professor's test cases in advance.

------
constantlearner
I'm learning programming on my own. I don't have a formal CS education and
cannot afford it. Do I need to pursue all this curriculum to become good at
coding? It seems overwhelming, but I'm not against learning and am not in a
rush. Currently I'm not a professional programmer. I started answering at
Stack Overflow and Reddit a couple months ago and am doing really good. I like
C and Python, but I regularly write in the latter. My GitHub repo has some
programming exercises, has about 300 stars and 50 forks and it happened within
a month's time and I'm releasing some more exercises soon. I had to
discontinue my education after 10th grade, but my love for English and math
has never faded. I had worked in health information for about 15 years, had a
passion for it, excelled in it. My employers never asked about my formal
education. They wouldn't believe me if I told them the truth. I quit my
previous job for learning programming full time because I like this more than
anything now. I want to spend the next 15 years programming and learning math.
These two and I are inseparable. Born in a village in a third-world country, I
learned English by listening to BBC Learning English and VOA Special English
radio stations. As a kid, I loved grammar, syntax, punctuation, vocabulary.
This is not my best writing :) I have another handle on HN and it took me
about 250 days to reach a 14,000 karma here.

~~~
brailsafe
No, you do not need to pursue this whole curriculum to become good at coding.

~~~
constantlearner
I knew it. Programming is part of computer science. Now I say CS is part of
math :)

------
itsmemattchung
I've followed this github project for the past year and a half and although I
find the repository full of amazing resources, I still find it unsuitable (for
my own needs) since there's limited (to no) feedback -- necessary for learning
-- from a dedicated resource (I.e professor ). However , the project
maintainer(s) are aware and working on addressing this -- as well as other --
issues; its worth noting that this problem isn't esoteric to this project ,
but many other (free) online resources .

~~~
BoysenberryPi
Join a programming community and ask for feedback on your exercises/projects.
Tons of communities out there. Not saying this is a non issue but the fix is
pretty simple.

------
junk_f00d
Here's a couple more:

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

>[https://functionalcs.github.io/curriculum/](https://functionalcs.github.io/curriculum/)

------
Goladus
Can anyone explain to me the continued prominence of "Object-Oriented Design"
as part of a fundamental computer science curriculum?

It seems to me that the basics of OOP, the kind of things that most
programmers need to know about, can be covered in a single lecture or two as
part of a general programming or software engineering class. Java-oriented
design patterns and general API design seem more appropriate as an
advanced/optional offering for students who are interested.

The linked curriculum has 6 weeks dedicated to Object-Oriented Design in the
intermediate part of the "core programming" section. It seems like that much
time could be spent on something more fundamental.

~~~
robotresearcher
This is explained by the teaching staff having been there for 25 years and no
effective process in place to force them to change the curriculum.

I’m a CS professor. My colleagues and I have complete control of the program.
When you see an outdated program it’s the faculty’s fault in general and the
leadership’s fault in particular for not forcing the issue.

~~~
Goladus
Not that my opinion matters, I don't have any advanced degree and no
experience building curricula. But if I were going to include OO in a
curriculum here's how I'd do it:

1\. (Intermediate/Core) I'd cover basic OO in Python. I'd demonstrate basic
features like instantiation, introspection, properties and methods before
moving on. I would not cover defining new classes before I had covered
creating a dispatcher with first-class functions in a hash-map/dictionary. I
would not cover defining new classes unless I could cover pros and cons of
using OO style versus simple functions that accept rich data structures like
lists and hash-maps.

2\. (Intermediate/Optional) I'd offer Java, C# and(or) Smalltalk classes at
the intermediate level, where the goal would be competence with the chosen
language's implementation, tooling, ecosystem and common programming idioms.
These classes would involve object-oriented principles, given how important
the paradigm is to these languages, but it wouldn't be the sole focus of the
class. Edit: Also C++ if possible.

3\. (Intermediate/Optional) A design patterns practicum. (Visitor, observer,
factory, etc.). Just a programming-heavy class where you solve problems using
as many of the common design patterns as possible.

4\. (Advanced/Optional) A bottom-up class where we'd cover implementation
details of object systems in a low-level systems language like C. Perhaps a
semester-long project might be to build a working object system in C. The
pedagogical goal would be impart an understanding of the kinds of problems
that object-oriented programming was invented to solve by relying on first-
hand experience rather than dogmatic instruction and hand-waving about the
evils of procedural style.

5\. (Advanced/Optional) An Object Oriented Design class that would cover
issues in designing large-scale systems using object-oriented programming. It
would cover issues relating to inheritance, Object-Relational Mapping, and API
design. This is where you'd cover UML and that sort of thing.

~~~
bluesroo
I think the main issue with structuring a curriculum like this (assuming the
classes are sequential) is that it would take 2.5 years of university to cover
it all. That's a A LOT of class time to cover only one programming paradigm
when the average CS curriculum is already heavy and lacking slots for
electives.

Someone would need to start this Sophomore year and not miss a single course
until graduation in order to complete this... While that's fine for core
classes like Chemistry which have multiple timeslots offered per semester,
having such a brittle pathway for a less-taught topic would cause some grief
to plan around.

------
godelmachine
A suggestion for the section - “Computer Science - Great Readings”. How about
“Readings in Computer Architecture”? While I’m aware it’s a tough book to
read, and there are already books like “The Elements of Computing System”
(NAND2TETRIS) and “Computer Organization & Design : The Hardware Software
Interface”, which suffice in getting acquainted with hardware architecture,
Readings in Comp Arch will take reader to the transistor level. Any other book
suggestion that takes reader to the transistor level would be appreciated.

~~~
jackyinger
Computer Organization & Design : The Hardware Software Interface by Hennessy
and Patterson is a great book for any coder that is interested in how CPUs
actually tick.

However I don’t think knowing the gorey details of transistors is necessary.
What they need to be aware of is cache hierarchies and pipelined superscalar
processor architecture.

These sophisticated architectural features can be flouted by code that causes
them to behave poorly. Such as code that does random accesses in a large
buffer causing the probability of the desired data being stored in cache to be
low.

The ways in which real computers differ from idealized ones is what CS
students need to know.

Also CS students ought to have to learn to read others’ code.

------
jcadam
I'd really like to pursue a PhD in Comp Sci (My BS is in CS). But with a
family there's just no way. If I kept my full-time job, I might have the money
to do it, but I wouldn't have the time. And vice-versa if I quit my job and
became a full-time student.

I did go and get an online Masters of sorts (an MBA from WGU), which was
definitely do-able while working full-time (and also useless), but it was
nowhere near as rigorous and time-consuming as an engineering graduate degree
would be :)

~~~
imakecomments
A PhD is paid. Universities near me pay around $30,000+/yr.

~~~
jcadam
Even so, I could never get my family to agree to a ~$100k/yr drop in household
income :P

------
grawprog
I'm going to show this to my co worker. He was telling me the other day how he
felt trapped at his job and wished he could learn computer science but didn't
feel like he'd ever be able to get the money or time to do it.

~~~
hackermailman
Tell him to apply to UoP and get an accredited degree tuition free online
[https://www.uopeople.edu/programs/cs/degrees/computer-
scienc...](https://www.uopeople.edu/programs/cs/degrees/computer-science-
bachelor-degree/) it's $4k or so for 4 years of exams ($100 each). Problem
with self-learning courses is most people decide to skip things they believe
won't be useful but actually are, which is why they are in the university
curriculum, then later they get lost since they didn't do all the pre-reqs.
UoP also has TAs

~~~
brailsafe
FWIW, I thought you were referring to UofPhoenix until I read the URL. Haven't
heard of UoPeople but thanks for sharing. Do you know anyone whose had success
with their programs?

------
xtiansimon
As a self-taught programmer I hoped for one of these to explain whatever I
needed to wrap my head around "frameworks"\--abstractions which make it
possible to build the vast diversity of programming development tools built on
top of programming languages, while themselves being written in that language.

You can learn about the idioms such as Callbacks and Hooks, but to really
grasp how these are organized into frameworks seems difficult for authors.
It's easier to just tell you, If you want this effect, Do that. Or, I'm just
not getting something about computer science pedagogy; Maybe the domain of
programming where I find my interests doesn't teach programming the way I
think about learning it. I will dig into this to see what's here.

~~~
Goladus
A framework is kind of like a big template for software applications. A
framework gives you a skeleton to work with, where the programmer fleshes out
the details in the flexible spots. Except that instead of just some
boilerplate code, you have a whole set of libraries and applications.

For a trivial analogy, consider this template for a C program:

    
    
        #include <stdio.h>
        #include <stdlib.h>
        
        int main(int argc, char *argv[])
        {
          // Your code here.
          return 0;
        }
    

It is not technically a "framework" because it's just a few lines in one file,
but it's different mostly by magnitude (though also by the fact that it is
trivially modifiable). And maybe, if this is an IDE, it puts our cursor right
at the line where you're supposed to start putting your own code.
Conceptually, what this does is give you a clear place to start developing. It
sets up some libraries that you'll probably use defines a main function that
accepts arguments and gives you a default return code of 0 (which means
success, by convention).

Frameworks essentially do the same thing on a larger scale, and usually with
multiple discrete components. The key difference between a library and a
framework is that a library is something that the developer imports and
invokes, whereas the framework establishes a useful context for a specialized
type of development.

------
aminukano
This is quite awesome.. I'm gonna use it!

------
anonemouse145
We really need to quit forcing programmers to take calculus. Even set theory
is a minority of us. Nobody actually needs order of magnitude either, so long
as you can tell one thing is bigger than another which is about one day of
learning after you cover polynomials.

The vast majority of us never use more than basic algebra. Counting,
multiplying and dividing money, and estimating effort in story points (and
maybe dollars as you get seniority) are the big math items.

I'm horrible at calculus, a fault that cost me around $30,000 in makeup
classes and a delayed graduation as I kept losing scholarships.

Yet I have never, and will never, use Calculus in my field. This was told to
me by the career coach in my intro class, who said almost none of you will
ever use Calculus, yet my school still made everyone take up to Calculus 4.
Who the hell is finding the area under three-dimensional curves without
relying on a library? Madness.

~~~
qubex
I’m inherently biased because I studied applied mathematics, but if you
advocate removing mid-level mathematics (calculus, set theory, much of college
algebra) out of a computer science degree, what you have left is a few years
of courses about ’scripting’ and practical use of particular specialised
tools. One cannot aim to become some kind of ’engineer’ or technical person
without at least a grasp of these mathematical techniques, even it they’re
only learnt for the sake of understanding and then forever set aside. They
enrich your thinking; without enrichment your mind remains... impoverished.

Beyond that, computer science is an offshoot of mathematics (Turing laboured
on Computability, Boole on relation algebra, Von Neumann on finite difference
methods). To rid computer science of mathematics makes about as much sense as
stripping psychology out of counselling,

You have a much too ’practical’ view. What you have in mind is not a graduate
degree in computer science but some kind of... vocational training for
programmers. Which is OK, if that’s what you want, and provided you leave the
faculty of computer science intact for those who wish to study the abstract
field and make progress therein.

~~~
tnecniv
I agree. Too many people conflate a computer science degree with the ability
to code. The real purpose of a computer science degree is to learn to model,
analyze, and solve problems in a computational framework. Mathematics is the
language used to do that, so math is a necessary part of such an education.

When it comes to sitting down and writing software, such a mathematical
computer science education provides a clear benefit. The more math you know,
the more problems you can formulate and solve with a computer. If the job is
cranking out web pages, a mathematical background will increase efficiency
because you'll recognize the problems at hand fit into familiar formalisms
with familiar solutions. Moreover, if you run into a hard problem, a
mathematical background will provide the necessary tools to work through it in
a principled manner.

