Hacker News new | past | comments | ask | show | jobs | submit login
A computer science study plan (github.com/jwasham)
270 points by rhakmi on Dec 11, 2017 | hide | past | favorite | 53 comments

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.

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.

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.

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

to be fair, it says software engineer not computer scientist. But I don't really think it's a good basis for that. It really does look like a "cheat sheet for interviews"

One of the things I look for, in recommendations like this, is a mention of ethics. As an engineer we are obligated to understand the ethical consequences of our work, both in failure and success, and not do unethical work. This list of algorithm-heavy topics left out ethics, as well as other topics.

Here are the curricula recommendations that the ACM has for a software engineer, extracted and reformatted from https://www.acm.org/binaries/content/assets/education/curric... . The min/max expresses a weighting scheme for each of the knowledge areas

  min max  Knowledge Area 
   5   5   Programming Fundamentals 
   1   3   Integrative Programming 
   3   4   Algorithms and Complexity 
   2   4   Computer Architecture and Organization
   3   4   Operating Systems Principles & Design 
   2   4   Operating Systems Configuration & Use 
   2   4   Net Centric Principles and Design 
   2   3   Net Centric Use and configuration 
   0   3   Platform technologies 
   2   4   Theory of Programming Languages 
   3   5   Human-Computer Interaction 
   1   3   Graphics and Visualization 
   2   5   Information Management (DB) Theory 
   1   4   Information Management (DB) Practice 
   2   5   Legal / Professional / Ethics / Society 
   2   4   Information Systems Development 
   1   3   Analysis of Business Requirements 
   0   3   E-business
   3   5   Analysis of Technical Requirements 
   2   5   Engineering Foundations for SW 
   2   3   Engineering Economics for SW 
   4   5   Software Modeling and Analysis 
   5   5   Software Design 
   4   5   Software Verification and Validation 
   2   4   Software Evolution (maintenance) 
   2   5   Software Process 
   2   4   Software Quality 
   2   3   Comp Systems Engineering 
   0   3   Digital logic 
   0   4   Embedded Systems 
   2   4   Distributed Systems 
   1   3   Security: issues and principles 
   1   3   Security: implementation and mgt 
   1   2   Systems administration 
   1   4   Systems integration 
   0   1   Digital media development 
   0   1   Technical support 
along with non-computing topics, which includes the mathematics you mentioned:

  min max  Knowledge Area 
   2   4   Risk Management (Project, safety risk) 
   4   5   Project Management 
   0   2   Digital Signal Processing 
   0   1   VLSI design 
   3   5   Mathematical foundations 
   3   4   Interpersonal communication  

For example, the ACM explicitly recommends software engineers learn both "Analysis of Business Requirements" and "Analysis of Technical Requirements" which, unless I missed it, is only implicit in the list given here.

(I have omitted areas with min=max=0 for software engineering. The original table also includes weights for related fields. Eg, "Functional Business Areas" is an important topic for those going into Information Systems, but not for software engineering, "Scientific computing (Numerical mthds)" is weighted 0/5 for CS, but 0/0 for software engineering, and "Electronics" is weighted 5/5 for a computer engineer but 0/0 for software engineering.)

A sprinkling of ethical project management turns a good developer into a great coworker.

I don't feel like being an engineer obliges me any more or any less than any other employee regarding the ethical consequences of my work, nor do I have any stronger obligation than any other employee to not do unethical work.

Would you prefer this wording instead: "As a professional engineer, in our ethical decision making we must make sure to learn about the specific ethical questions related to software engineering"?

Can you recommend a list of mathematics resources (paid or unpaid) that would serve as a full foundation?

In Canada, where the title engineer is a restricted term and thus the universities have common requirements, all engineers are expected to take

- Calculus 1-3

- Linear algebra 1-2 (though condensed into one course)

- Statistics

- Differential Equations (including partial differential equations).

I preferred reading the textbooks over going to class, so I can speak mostly from experience.

- Stewart Calculus

- Linear Algebra - Gilbert Strang

- Paul's online math notes for Differential Equations (PDF is formatted better than the website)

- Discrete Mathematics - Epp

These works are meant to be read in their entirety. Now by reading these, I mean read them, work through the examples youself, and do most of the practice questions at the end of the chapter. I'd also recommend supplementing with Khan academy, which is often better than many university lectures.

It's no small amount of reading, is genuinely difficult, and without difficult exams at the end of semester you may not retain the info. Also, consider the list a foundation for Mathematics in engineering less than something that will improve your work immediately.

That said, totally doable if you move slowly, take the time to understand the material, and be okay with working through using formulas that don't make sense at first.

Rudimentary math is almost entirely sufficient. Meaning this should* have been learned early in life. I make web backends for e-commerce and I rarely do more than count and add.

Example life skills: -Balancing a checkbook or verifying an account balance (addition including negatives, ex. e-commerce) -Tipping (be familiar enough with percentages to eatimate a few simple ones in your head) -Baking (fractions, multiplication/division)

The only thing not covered is basic algebra, solve for X type stuff. If you can convert Celsius and Fahrenheit either way given one equation, you're golden.

Most of don't need set theory or calculus. We need rudimentary math that should be in any 101 course.

If you're going into some sort of engineering such as fluid dynamics or maybe deep financial territory like banking, then maybe you need some calculus. Otherwise, just be good at the 101 level.

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.

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.

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.

One of my bigger regrets of my undergraduate degree was not realising how you could interact with the faculty until my second and third years (when I ended up on the student club committee). Had I figured that out in first year, I think I would have gotten more out of my first couple of years, and I might have avoided some of the mistakes I made later on.

First year students: go talk to your lecturers, starting from your first semester!

I agree; google can help you answer a question but you will rarely know what is best practice, modern, or even most correct.

> Although material (e.g. books, online videos) are available (and free) Could you post the links to these please?

Distance learning is not going back to university.

Does that program not result in the same degree that an on-site student get?

I am asking to see if your comment is geared at the specific program, or if you just don't give any value to getting an equivalent degree via an online platform?

Most online trainings don't deliver any accredited degree. The few real degrees that can be obtained without attending are usually considered low tier by employers.

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.

It's also important for software engineers to eat and exercise, they should include cooking recipes and pilates videos on there too /s

Just kidding, but it's clear what the intent is here.

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.

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.

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.

>requires strong non-technical skills

You generally get those skills from working at BigCo Inc.

While you can read books about them and apply them more successfully than someone who didn't read, you still need raw experience to move on from a beginner.

There should be plenty of positions at BigCo Inc. that are only looking for technical skills. Everyone has to start somewhere.

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.

For economics at least, there is this rich online textbook called The Economy, published by The CORE Project (Curriculum in Open-access Resources in Economics).

It's opinionated in its approach, in that it stems from students and instructors believing conceptual economic education as it exists today is fundamentally broken and fails to address inequality effectively.


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.

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.

Same here, wish there were similar resources for other topics.

Amazing point. Another bad thing is that the books I come across on Amazon simply don't...idk scratch the itch.

Distance learning with a traditional university, or The Open University (OU), might be what you're after.

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.

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.

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.

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.

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?

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?

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.

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.

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


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.

> 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.

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... (spoiler alert: kinda, but not really). I bet you could easily do so now given the wealth of MOOC offerings.

Quite a few comments last year:


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

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=...

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

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) are carried over not just to relational databases, but an ORM system. (https://django-treebeard.readthedocs.io)

> 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.

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

"How to pass a basic SDE interview 101"

> How to pass a basic SDE interview

Please stop making these, they threaten my job security!

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact