
A computer science study plan - rhakmi
https://github.com/jwasham/coding-interview-university
======
janoc
I am sorry but this is neither complete nor a plan how to become a software
engineer.

This is a list of trivia to get you through a coding interview conducted by a
clueless HR department that equates engineering skill with remembering answers
to test questions. Nothing more.

None of the stuff in the list will actually teach you _how to apply_ these
techniques nor _when to apply them_ (and when to stay away!) - which is much
more important to know than to remember how to balance a red black tree or to
sort a list.

The algorithms you can always look up - and frankly, how often does an average
engineer implement something like that today instead of using a library?
However, knowing _when_ to use which technique or algorithm is absolutely
essential.

What am I missing completely is foundations of mathematics. There is some on
combinatorics (good) and some geometry in the optional parts, but where is
numerical mathematics? Linear algebra? Basics of statistics and calculus?

With the "big data"/AI crazes going on you will be dead in the water if you
don't know at least the basics. Not to design the algorithms (that will be
still way over your head) but to at least have a shot at understanding what
you have to implement! Nobody is going to explain you how to multiply matrices
or calculate a covariance there.

Stuff like geometry and linear algebra is absolutely essential also for people
programming computer games, anything related to virtual/augmented reality or
robotics.

Statistics is needed anywhere dealing with data but especially in AI, machine
learning and computer vision.

And basics of calculus are pretty much everywhere.

So while the list is pretty useful as a reference, the title is seriously
misleading.

~~~
professorTuring
Completely agree. This is "how to become a programmer with a general
knowledge". Far, far away from a Computer Scientist.

I can't see any of the "basics" stuff like calculus, algebra...

BUT, it is truth that most of the enterprises are fine having a programmer
rather than a Computer Scientist... Probably most of them can't even tell the
difference.

~~~
bri3d
Most enterprises would much _rather_ a programmer than a Computer Scientist.
They, by and large, want and need implementation of either existing
architectures (Programmers) or existing concepts applied to a take on an
explored problem domain (Software Engineers). Research into net-new patterns
(Computer Science) is often the domain of large corporate R+D departments and
a few niche startups, not the bulk of industry.

~~~
rhizome
I'd go so far as to say that almost zero jobs need Computer Scientists.

------
itsmemattchung
I self studied computer science and like the author of the article, working as
a software engineer for Amazon. However, despite already working as a software
engineer, I decided 6 months ago to return back to university to pursue a CS
degree, currently wrapping up two courses — discrete mathematics and computer
architecture — offered through University of Northern Iowa via their distance
learning program. Although material (e.g. books, online videos) are available
(and free), I prefer taking these courses (and receiving the credits) through
the university instead of a the self study method due to one reason: feedback
from professors. I found it difficult, while self studying, when I was unable
to ask someone (who was dedicated) to answering my questions about the
textbook or about the lecture or about the homework assignments.

~~~
nicolashahn
Expanding on this: I believe the most important reason to attend university,
aside from getting the piece of paper (which could even be argued is secondary
to this), is to interact with your professors as much as you can. My biggest
regret about my academic career is that I didn't do more of that. There were
some devastatingly smart people working in my CS department, and I wish I
could have absorbed some more of both their domain knowledge and just their
general life wisdom.

~~~
anonemouse145
The purpose of university for a first timer is to build connections to get an
internship or job offer. If you come out without a job offer in hand that pays
more for your degree, you failed. If like OP you went back because you already
had/have a job, then yes, working with professors and other students is a fine
thing.

You don't need real computer science theory until you're already a seasoned
programmer, at which point you need a refresher anyway. Beginning programmers
spend more time setting up environments and breaking down poorly written
requirements, than traversing binary search trees by hand.

I wish someone would have explained to me what it's like finding work in CS
before I took the degree, how "entry level" positions can often mean 4+ years
experience, how Interview questions often have little to do with the job and
everything to do with memorization.

Going to school to become a good programmer is wasting money. Going to school
because you want to work a field that rewards having a degree, and starting
relationships where someone is waiting for you to get your degree and hire you
when you finish, is smart.

------
cle
This may help you _get_ a job at BigCo Inc., but to succeed at BigCo Inc.
requires strong non-technical skills. Software engineering in big companies is
as social as it is technical, and that's a glaring gap in this otherwise
impressive list of skills.

~~~
bdamm
I don't understand why you're being downvoted as you have a very good point.
For those who are very technical and socially less developed, some structured
work on social capabilities would be a great asset. That doesn't necessarily
have to coursework although a course in marketing could be a good thing; it
could be public speaking clubs.

Even if you plan to devote your entire career to honing technical skills, the
work around marketing one's self is also worth developing at least a little
bit. It'll make it easier to position yourself in a community and to help
others understand your ideas.

~~~
posterboy
isn't mediated social interaction like trying to learn to cook by going to a
restaurant? well, at least you'll know what it _should_ taste like.

~~~
hateduser2
Agreed. I think “learning to be social” is the opposite of the point of being
social, which is only good so long as you’re trying to authentically connect
with people. Seems like anything else is evil. And so authentically connecting
with people shouldn’t require training! It should be as natural as being
itself. That’s just my POV anyways...

The extent of socializing that should be “learned” is recognizing things that
may be confusing or upsetting. Nothing more. But by god and by no means should
it ever be learning to act cool and by god not learning to lie about yourself.
Those are extremely antisocial behaviors.

------
biohax2015
I see a post like this on HN once every few weeks, and as wonderful as it is
to have a plethora of organized CS courses of study, I really wish similar
things existed for other topics. I'm fascinated by economics, political
science, and literature but I cannot find a good place to truly educate myself
on these topics. Instead, I'm left jumping from MOOC to MOOC and scouring
whatever Wiki entries I can find.

~~~
i6Respawns
You are not alone, and the good thing is Economics, political science, and
literature are all highly literary. So read a book!

Have you heard of Keynes, Smith, Marx, Locke, Rousseau, Hobbes, Emerson,
Tolstoy, or Conrad? Great! Each of them has no less than three legendary books
that you can spend weeks to months to years studying. Computer science is a
bit different in that the landscape is fresh and the resources constantly
shifting and growing, but the old fields, as always, can be studied safely on
ink and paper.

You start with one author, you go through his or her influences,
contemporaries, pupils, and you are guaranteed to have a healthy amount of
daily reading material.

~~~
biohax2015
Reading texts is great, but it's only one piece of the puzzle when it comes to
becoming educated in these topics. In the classroom, students read, discuss
with their peers and professors, read and write essays, and are lectured by
very smart people. You can only get so much out of the literature without the
right tutelage.

------
ptero
This is, IMO, a bit mislabeled: this is not a complete CS study plan to become
a SW engineer, but a collection of information about basic algorithms.
Probably useful as one of a number such lists, but almost orthogonal to the
stated goal.

I think the article's stated goal is background for _getting_ hired as SW
engineer at a _large_ company. If this is your goal, I would spend half of
allocated time on getting the basics (and you _do_ need to be able to
understand algorithms quickly) and the other half on networking -- going to a
few meetups or an open conference will likely generate as much value for
getting hired as learning yet another method of balancing a particular tree.

Once hired, though, it is critical to expand beyond just writing code.
Dropping by sales / user groups / wherever and using end-to-end system, just
as one of the end users, is likely to yield larger benefits, career-wise, than
writing an extra few functions. Learning a few basics about company's
financials and how your product fits can be an eye-opener and help you steer
once you are inside. Just my 2c.

------
theli0nheart
Memorizing a bunch of algorithms doesn't make you a software engineer. A
software engineer should be able to read an algorithm's description, without
having ever seen it before, and implement it correctly in code. Too many
people equate memorization with aptitude or skill.

It's too bad that most interview processes don't differentiate between these,
and this guide perpetuates that problem.

~~~
iandanforth
Let me reframe this. You need to be able to 1. Clearly describe a problem 2.
Notice when that problem can be mapped to one or more known solutions or
algorithms 3. Be able to implement a _system_ which takes those core solutions
and makes them work together in a robust, efficient, scalable, and useable
way.

~~~
sidlls
Almost none of which requires one to be able to implement said algorithms from
scratch on demand in a 45 minute interview. Yet, here we are where exactly
that is the norm in certain circles. Just one more reason why I consider the
state of the industry to be closer to farce than reason.

~~~
pbhjpbhj
Of those who can do iandanforth's 3 steps what's the intersection with the
group who can program algorithms from scratch under interview conditions. The
latter is supposed to be a proxy for the former, not a test of it, surely?

------
adamnemecek
Or, pick a semi-popular github project, step through it with a debugger, try
to fix things (even the tinies changes for the better count, e.g. you can
remove trailing spaces, it's gonna be accepted).

One path develops "software engineering", the other one develops software
engineering. P vs NP is nice. But like have you ever seen a person, whose mind
is wrapped about the tools s/he uses just destroying it? Like a debugger or
something? Just ripping shit to shreds?

------
nudpiedo
I think that’s great effort, really!

But you seem very focused only in one kind of workplace... which looks quite
like deep into the programming/algorithm part of CS...

If you would like to compare to software engineers as we know then in Europe
you would need to have also some knowledge of physics (a general overview),
mathematics (including statistics, discrete mathematics, algebra, ...) basics
of economy (it is very common to have at least a subject or two) and then a
fast overview of some domain specific technical areas such as databases
(formal SQL92), artificial intelligence (an overview on the common algorithms
and story of AI), operating systems (I remember to have read the code from a
small Unix, also made a kernel module), the architecture of a computer (von
Neumann) and understand the basics of Hardware programming (including some
assembly and an overview how the CPU registers work, and so on...) and
compilers.

Also do not forget things like classic software engineering, specification
modelling and definition of problems in formal languages. And then comes the
actual specialisation (web programming, deeper in databases, graphics
programming, ...).

I have the feeling I forgot half subject of every area I mentioned... but as
you see an software engineer knows a bit of every area, not to deep in the
ones he/she did not specialise, and a bit of the surrounding careers; and very
often after complete the basic degree is common to specialise deeper in some
of those areas or go deeper in them as part of your professional life.

P.S. and for sure the final project of the career... which not many students
take it serious but it could be compared to some side projects/per projects
which you see from time to time in HN.

------
djaychela
This is immensely useful. I'm currently 3 months into what I originally
predicted would be at least 2 years learning enough programming skills to be
useful (and possibly even employable at some level), having made a decision to
leave teaching in the UK (and then being made redundant rather than the
'tapering off' I had planned!). I've got a long, varied history in all sorts
of general computer knowledge (having run a linux server at home for years,
web programming of horrifically low quality, various non-starts in various
programming languages), and am finding that a lot of that is actually useful,
but self-studying is hard, and being 46 and having forgotten a lot of the
maths I learned at school means I'm spending an hour a day doing that before
making any programming/CS/etc progress. I think it's easy to get lost or
bogged down in a lot of thing stuff, and having a fresh load of information to
cast my eyes over is much appreciated.

~~~
faitswulff
What kind of work are you looking to find at the end of this journey? And what
kind of mathematics are you studying? As a beginner several years ago, this
page helped me develop a healthier attitude toward mathematics and programming
that got me to just start programming:

> 1 + 1 = 2

> \- The minimum level of math skill needed for an interesting program

[http://ruby.bastardsbook.com/about/](http://ruby.bastardsbook.com/about/)

If mathematics is necessary for what you want, then by all means, continue to
study it! However, the link between mathematics and programming, or even
computer science and programming, can be more tenuous than it would seem.

~~~
thethirdone
> However, the link between mathematics and programming, or even computer
> science and programming, can be more tenuous than it would seem.

I would even say that computer science is more connected to mathematics than
it is to programming. Very little of everyday programming necessitates an
understanding of computer science. Whereas pretty much any computer science
research requires a deep knowledge of mathmatics.

------
adam_gyroscope
In 2012 I wondered if it was possible to build a 4 year CS degree from what
Coursera offered at the time: [http://www.thesimplelogic.com/2012/09/24/you-
say-you-want-an...](http://www.thesimplelogic.com/2012/09/24/you-say-you-want-
an-education/) (spoiler alert: kinda, but not really). I bet you could easily
do so now given the wealth of MOOC offerings.

------
stablemap
Quite a few comments last year:

[https://news.ycombinator.com/item?id=12649740](https://news.ycombinator.com/item?id=12649740)

~~~
rajathagasthya
Interesting to note that the repo author changed title from 'Google Interview
University' to 'Coding Interview University'.

------
git-pull
You likely won't be writing many algorithms or data structures from scratch.
You'll be implementing them, though!

In practice, you'll be so busy seeing the forest for the trees, tackling the
business case at hand, you'll rarely be fussing over textbook definitions.

Often, when I see someone focusing too much on book smarts and interviewing in
itself it's a sign they may need to put their reading and memorization into
practice more. This is why I'm skeptical of job interviews - these things
cater toward those who memorize them (likely fresh out of college), not devs
on the field of battle shipping stuff for a few years.

Memorizing arbitrary stuff out of a text book when you have libraries already
there and deadlines? Come on. In the rare event you need to write your own
thing, you'll ask the manager for time to clear up airspace and study not from
the textbook, but other's successful implementations, at a time when it
actually matters.

Here's how I'd improve it: find implementations of linked lists, queues,
stacks, graphs, and whatever in programming languages, their standard
libraries, and community frameworks. Show people the utility, have them
conceptualize it internally, rather than memorize it.

Here are some off the top of my head:

Something broad and standardized, templated containers of data structures,
like C++'s stdlib and its vector, map, and so on. Last time I checked
chromium's source tree, std:: was everywhere:
[https://cs.chromium.org/search/?q=std::+package:chromium&sq=...](https://cs.chromium.org/search/?q=std::+package:chromium&sq=package:chromium&type=cs)

Something low-level and cool, like Python's timsort:
[https://svn.python.org/projects/python/trunk/Objects/listsor...](https://svn.python.org/projects/python/trunk/Objects/listsort.txt).
(Java actually ended up borrowing that: [https://github.com/openjdk-
mirror/jdk7u-jdk/blob/master/src/...](https://github.com/openjdk-
mirror/jdk7u-jdk/blob/master/src/share/classes/java/util/TimSort.java))

Something high-level, for instance, django-treebeard's approaches toward
handling hierarchies in Django. In this package, adjacency lists
([https://en.wikipedia.org/wiki/Adjacency_list](https://en.wikipedia.org/wiki/Adjacency_list))
are carried over not just to relational databases, but an ORM system.
([https://django-treebeard.readthedocs.io](https://django-
treebeard.readthedocs.io))

~~~
thomastjeffery
> find implementations of the concepts of linked lists, queues, stacks...

I would venture to say that you will likely never implement a 1-dimensional
data structure. Those will exist in the standard library, or even in the
syntax of the language itself.

What _would_ be helpful practice is to implement more complicated data
structures like trees, graphs, associative arrays, etc. for several different
languages, and find out which methods are the clearest, the fastest, and the
easiest to implement in each given language.

The _other_ thing to focus on is everything used to go from source code in a
file to a binary running on a user's system. There are interesting problems
that practically no one teaches to "beginners", like foreign function
interfaces, package management, signatures, etc. that are just as important to
understand as tree traversal algorithms.

------
jupiter90000
I like teachyourselfcs.com better for this personally. Give it a look if
you're trying to do this type of self-study.

------
jorblumesea
"How to pass a basic SDE interview 101"

------
jorblumesea
> How to pass a basic SDE interview

------
hateduser2
Please stop making these, they threaten my job security!

