10 ms·
What every computer science major should know (2011)
- icpmacdo 11y agoPrefacing this I am only 20 years old so I have some time to figure it all out but I feel like I am missing out a fair bit on not pursuing a degree in computer science. A lot of the content, especially the focus on algorithms, seems really interesting to me. Straight out of high school I did not have the math grades for CS so I went to the American equivalent of community college and am on track to get a diploma from an IT related course thats basically going to amount to a web dev job in the future. If I decided to go that route for lets say 5 years to save some money would it be a hindrance career wise, because of a large time gap in the resume, to take the 4 years off to get a CS degree from a decent school, say Waterloo? The biggest point of fear is that I would not be able to complete the degree and realizing it was to above my cognitive abilities.
- morgante 11y agoTime spent in university isn't usually seen as a gap. Most employers would admire that your chose to go back to school so you could really understand the fundamentals.
- ane 11y agoYou will regret not going later. If you have the interest, computer science can offer staggering amounts of enlightenment.
- nosefrog 11y agoYou do not need to be in college to study CS. If that is really what you want to do, you should make a point to start now.
- chris_wot 11y agoRight now, I'm prepping for a Computer Science degree. I find I just can't study mathematics at a pace that's as fast as a Uni course goes. I really find I need to understand the underlying concepts of the math, so it takes me a bit longer but I seem to be able to hold a lot more info, and my progress is getting quicker. As an example, it took me some time to grasp that the determinant is the size of a square matrix, and that a one-dimensional matrix gives the distance, a two dimensional matrix gives the area of a parallelogram, and a three dimensional matrix gives the volume of a parallelopiped. After that it became easier to understand how to get the determinant of an n-dimensional matrix. Same with vectors and trigonometry. I'm finding that self study with a little help from Google is really paying off!
- anxrn 11y agoI couldn't get past "Computer science is not quite engineering."
- tantalor 11y agoAcademia vs. industry; or, Who pays the bills?
- bshoemaker 11y agoIt's not
- ecopoesis 11y agoIt's not. It also is not quite not engineering too. A lot of terminology and philosophy from engineering carries over to CS, but for most applications, the quality and thoroughness of real engineering does not, nor is it needed. Computer science, or software engineering if you prefer, is a strange hybrid of a lot of things. On the pure development side, there is a lot of engineering-like stuff going on. In academia and research, there's a lot of science. And everyone is doing heaps of math. Unfortunately, English doesn't have a good word that encompasses all this, so we end up with poor terms that each only describe parts of the whole.
- anxrn 11y agoAs a software practitioner, I find it hard to believe the distinction is a question of degree of quality and thoroughness. CS largely involves design and implementation of machines and automaton, and in many cases far more complex machines and automaton (for example, self-learning ones) than "real" engineering. I can't see how this is not engineering, so I'll have to respectfully disagree.
- ecopoesis 11y agoSome CS involves that. Some involves fitting pieces together, or following an existing pattern: something more akin to carpentry then engineering. My point was not to denigrate CS, but in fact to say that it is something larger then just engineering. Sometimes what we do is engineering, sometimes it's science, sometimes it's math, and sometimes it's carpentry.
- mikenwani 11y agoThis is a really great resource to keep track of. As an up and coming graduate, I'll probably refer back to it from time to time.
- smegel 11y agoInterestingly the word "mobile" did not appear once.
- 11thEarlOfMar 11y agoI earned my CS BS degree almost 30 years ago. My school kind of served as a training ground for mainframe programmers. We had plenty of assembler and COBOL, but not much in systems architecture and design. There is a lot that has become much more relevant since then: Security, networking, and distributed systems. But if I could have taken one more course, I'd really like to have studied graph theory.
- politician 11y agoOn the subject of technical communication, formal oral presentations are not enough -- frequent practice engaging in short defenses of small ideas would benefit students immensely when it comes to working on teams in industry.
- bascule 11y agoEvery computer science major should... double check they've entered all the correct input before pressing the submit button.
- vortico 11y agoI like this title better than the actual one.
- nobael 11y agoAre you kidding me? People won't know all this stuff after 15 years in the field.
- unimpressive 11y agoI would agree that four years is an optimistic timetable to learn everything here to the degree that you would want to. I also disagree on the relative ranking and importance of the items, but I don't feel experienced enough to really argue with them on the basis of my knowing better. Maybe in a few years. I think a few of the points could be expanded. For example 'Robotics' gives the wrong impression and I'd say that you can get a lot of conceptual bang for your buck just from understanding the operation of basic electronics components like capacitors. It's not necessarily 'computer science' in the strict definition but being able to get an idea of how electronics and hardware items work is frankly more powerful than some of the items on this list like being able to make pretty visualizations. Moreover, in that long list of cool languages, not a single one was a scripting language like Ruby, Perl or Python. Having one of these in your toolkit is pretty much essential and it feels like a glaring omission.
- nobael 11y agoI dislike how these articles make it seem like you need to be a super-human coming out of college. You don't. As long as you are perceptive, intelligent and can learn on the fly you'll be fine going into most entry level jobs in the industry. As far as the list itself, it is highly debatable. Depending on your job you won't ever need to know most of this.
- unimpressive 11y agoYeah. My general objection to this article would be that for the dedicated autodidact you'll be better off taking this advice on a longer timescale and as a guide instead of a checklist you need to cross off before you're Minimally Qualified. In particular be sure to optimize the curriculum towards your interests and goals instead of prioritizing somebody elses recommendation by fiat.
- 11y ago
- lnanek2 11y agoThis was a lot more practical and hands on and engineering than most CS degrees, which are more about math. Sys admin is really IT, it isn't CS at all.
- thedevil 11y agoSuggested revisions: - More on databases (including non-relational). We all need to know a lot of this for day-to-day work yet it but it barely made the list. - More on writing clean, readable code (this isn't on anyone's list, damn it!) How to name variables appropriately, how to comment, how to not write 150-character lines, etc. Fail them if they can't produce code that other students can quickly read. - Corporate survival skills (read your email before sending, come to meetings prepared with what you need to say, don't criticize people directly especially in front of others, etc) - More on concurrency - No machine learning or robotics - these are specialties without much use for the rest of us (though they are fun) - Reduce the number of useless but interesting languages
- liquidmetal 11y agoNo machine learning? Really? It seems like for every problem out there - at least some tiny bit can be solved by machine learning. General pattern recognition (identifying peaks, predicting disk outages, etc) at the minimum seems like a requirement that will show up in the next few years.
- collyw 11y agoMost problems out there are probably solved in an excel sheet at present. No need for machine learning.
- Messiah_ 11y agoAny book to recommend to learn Corporate survival skills, and writing clean code?
- petersellers 11y agoFor writing clean code, I highly recommend Uncle Bob's "Clean Code": http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882 http://www.amazon.com/Clean-Code-Handbook-Software-Craftsman...
- giaour 11y ago
- cheepin 11y agoWhat is a good book for C++11 and beyond? I took a lot of C++ before '11 was implemented, but have been focused on other languages recently, so I feel like I'm a bit behind the modern development. The references he points to are all 10+ years old, so I strongly doubt I'll find any C++11/14 in them.
- banachtarski 11y agoThe C++ primer (latest edition) covers C++11 concepts pretty well. http://www.amazon.com/Primer-5th-Stanley-B-Lippman/dp/0321714113/ref=sr_1_1?ie=UTF8&qid=1430802864&sr=8-1&keywords=c%2B%2B+primer http://www.amazon.com/Primer-5th-Stanley-B-Lippman/dp/032171... Once you learn the fundamentals, read Scott Myers. (effective c++, effective modern c++)
- monksy 11y agoI found that this was said, and more things that are helpful in the book "Soft Skills" (a manning pub).
- Silhouette 11y agoI can see how a list like this could develop, but unfortunately it seems to have become the academic version of a job ad that wants 20 years of experience in every tool and technology ever invented. No-one would stand a chance of coping with such a broad and deep syllabus within the time frame of a degree course, but I worry that the target audience for this list won't necessarily realise that and so the current presentation could actually discourage people from studying CS. I think part of the problem is having so much emphasis on specific tools and standards rather than general principles and theory. Hopefully CS students do pick up some familiarity with practical examples along the way, but I don't think that should be the priority for undergraduate level CS teaching. I'm particularly wary of putting so much emphasis on "old school" tools that aren't necessarily very good by modern standards but remain popular because of momentum and ecosystem effects. As a result of that emphasis on tools, I'd say sound theoretical foundations seem to be given less weight than they deserve. Some examples of terms that I would have liked to see on any modern undergraduate CS syllabus or reading list are "comparison sort", "halting problem", "ACID", "transaction", "distributed system", "CAP theorem", "concurrency", "deadlock", and "lock-free", as well as a lot more specifics on basic data structures and algorithms.
- sbov 11y agoI graduated 10 years ago and never used calculus, differential equations, linear algebra, or physics in my job. I'm not saying this to say they aren't useful. But does anyone find them generally useful for their job? If so, what for? I'd like to know what I'm missing here, if anything. I don't want to go through a refresher just to forget it in another couple of years.
- benrhughes 11y agoFor the first 10 years of my job, I never used them. In my current job (working on hydrologically modelling software), every now and then I wish I could remember highschool maths.
- probably_wrong 11y agoMy two latest research projects required all of those things. More specific, I tried (and failed) to model movement in an environment as a particle in an electric field. Defining this model required physics of a particle, and optimizing the parameters required differential equations. A sub-section of the project (not done by me) defined a grammar, which required some properties over a semi-ring, which I remember from Algebra.
- archgoon 11y agoThat sounds interesting; can you provide a link to your homepage? Or describe the project in more detail?
- probably_wrong 11y agoWell, the first part of the project got scrapped, because it turns out people behave like a particle only under trivial conditions (or I modeled the problem wrong, that's also possible). The idea was that, since we know which target is attracting a pedestrian's attention, we could model both as a particle being attracted to a target (and being repelled by distractors). Whatever little remained of that idea ended up in another paper[1]. As for the grammar, the best I have is this paper[2]. I apologize for not having anything less dry to read than papers - as I'm not looking for another job, I don't feel the need to get off my ivory tower too often. [1] http://ivan-titov.org/papers/emnlp13.pdf http://ivan-titov.org/papers/emnlp13.pdf (poster: http://www.ling.uni-potsdam.de/~villalba/publications/refexp_resolution_poster.pdf http://www.ling.uni-potsdam.de/~villalba/publications/refexp...) [2] http://www.ling.uni-potsdam.de/~koller/papers/chart-gre-14.pdf http://www.ling.uni-potsdam.de/~koller/papers/chart-gre-14.p...
- franciscop 11y agoI am really happy that, with industrial Engineering background and thanks to all the resources I have been able to find online (stackoverflow and blogs like this), I have been able to follow all of these steps independently to be a programmer. The things I'm still missing (and trying to improve) have to do with managing servers and parallelism. This is highly advisable but maybe too daunting in such a list for sharing with a beginner...
- onion2k 11y agoInteresting that the list includes "not being a lone wolf" and that goes on to state you should be capable of doing pretty much everything necessary to complete a project on your own. If you're capable of working well in a team you don't need to be able to do all the things in this list. You can hand off things to people who are better at those things. That's a good skill to have. That makes you very employable.
- sliverstorm 11y agoA good team member plays to his strengths, but a wide breadth of ability is still valuable. It means you can understand what your teammates are doing. It's not requisite and sometimes is unreasonable to expect in multi-domain projects, but that doesn't mean it isn't valuable. Similar to philosophies on management. A good manager does little hands-on work himself, but he will generally make for a better manager if he could hypothetically fill the shoes of each of his reports. Not that he should ever actually do that, but it means he understands what they are doing.
- stiff 11y agoThere is more harm in the notion that there is anything at all that absolutely everyone needs to know to succeed than there is benefit from the contents of such lists themselves (which boil down to "everyone needs to know what I know"). To succeed, all you really need to know is enough to be able to do meaningful contributions to society in any way whatsoever. This is all there is to it and there are thousands of individual paths that lead to this. In fact, many of the most successful people specialize early, devote themselves to a single project or group of projects and spent the rest of their professional lives on it. Do you think John Carmack knows much about visualization, databases or cryptography? Does Linus Torvalds care about Scala, Haskell or Prolog? People love what those guys have created, so they have succeeded, it is as simple as that - nobody examined them for knowledge of 25 unrelated areas, instead they have built for themselves a useful toolkit of skills for their particular goals. It is not worth it to spend your life chasing some abstract platonic ideal of an uberprogrammer who knows everything about anything - in fact such attitude is detrimental to success.
- bottled_poe 11y agoThat's great, but who said anything about success? The article is about how to be a well-informed computer scientist. This guide will put a graduate in a great position and open up a lot of opportunities. Whatever "success" means is only loosely related.
- stiff 11y agoFrom the article: I've tried to answer this question as the conjunction of four concerns: What should every student know to get a good job? What should every student know to maintain lifelong employment? What should every student know to enter graduate school? What should every student know to benefit society? For all the four points listed the attitude of focusing on some checklist covering everything is not really the optimal strategy. For graduate school you may need to pass some broad exam, but afterwards in turning towards research you also want to be much more picky about what you choose to learn and stick to learning mainly (but not necessarily exclusively) things that are likely to help your particular goals. You should think of learning as of investing and learn things that you are likely to have some use for in the future or ones that you simply like learning. Things that you learn but that you have no long term use for or passion for you will promptly almost completely forget and the time and effort you spent learning them will simply be lost.
- olalonde 11y agoIf you have a chance, read his other posts as well, this blog is a gold mine.
- morbius 11y agoA lot of this stuff isn't strictly necessary for many people. But there is a very distinct change in the quality of your thoughts and approaches to solutions after learning advanced mathematics and the theoretical concepts that inform modern systems and abstractions. For instance, Haskell is far easier to someone with prior experience with discrete structures, category theory, and recursion than to someone coming from a purely object-oriented background. Both will be able to write effective code, but it's no question that the mathematically-inclined individual will write more elegant, more concise, and qualitatively better code than the other.
- MrBuddyCasino 11y ago"Scala is a well-designed fusion of functional and object-oriented programming languages. Scala is what Java should have been." The only thing I disagree with. Scala is the only language I know of that several startups have decided to give up on. How can you call C++ a necessary evil and recommend Scala, which is basically the JVMs C++? Anyway, that list is pretty long - I don't think I know any CS major with that skillset. Or even half of it. You'll still be employable, don't worry - but its a good long term guide.
- justthistime_ 11y ago> Scala is the only language I know of that several startups have decided to give up on. Not sure this makes any sense. Companies changing stacks for whatever reason happens about hundred times every day on this planet. Plus, I think the C++ comparison doesn't do you any favors...
- MrBuddyCasino 11y agoIn hindsight I shouldn't have posted this, language wars never lead anywhere. For an overview of why some people deem it unsuitable for big, long-term projects, this thread is a good starting point: https://news.ycombinator.com/item?id=9393551 https://news.ycombinator.com/item?id=9393551
- kelnos 11y agoI've gotten to the point where I won't write new JVM-based code in Java anymore. I think many companies that have tried and discarded Scala used too much of it. It has a lot of advanced features, and I'm not particularly good at using most of them (and some of them I probably don't even know exist). If people start off thinking of Scala as simply a "better Java", and only move to use its easier-to-understand features, I think it'd be a lot easier to hire people to work on Scala codebases and/or train people in the language.
- MrBuddyCasino 11y agoYou mention the key points - in order to use it successfully, you have to agree to use a common, safe subset of the language (e.g. no implicits), similar to C++. You then have to make sure everyone adheres to this, if possible by using automated tools. As a startup, you often don't have the luxury to be able to invest in that kind of infrastructure. You have to train people to use the language correctly, which is a huge time sink. Onboarding still is a huge problem. Backwards compatibility is another big factor that has bitten people once too often. Compiler bugs, slow compile times, bad community attitude come on top of this. >> If people start off thinking of Scala as simply a "better Java", and only move to use its easier-to-understand features, I think it'd be a lot easier to hire people to work on Scala codebases and/or train people in the language. Yes absolutely, and I agree it can be used effectively in that case. But the language attracts people that like to think of themselves as wizards that want to master the advanced stuff, too. After all, the whole thing started basically a vehicle for Martin Odersky's papers, implementing any paradigm known to mankind. Considering all those downsides - is Scala still worth the tradeoff? I do understand the appeal, but there are so many languages out there right now. You need a stable and reliable platform to base your business on, and after hearing - for several years - people moving away from it because it is lacking in that regard seem like something a responsible CTO should not ignore.
- probably_wrong 11y agoEvery time I read one of these "what computer science should be" posts, I keep coming back to the old quote, "computer science is no more about computers than astronomy is about telescopes". I feel there are many computer scientists that wish they had studied engineering instead, but assume the career is the one that needs change. This author IMHO tries to solve that by making sure that CS contains everything, which I think it's a bit too much. I think I'd cut most of the more technical subjects (robotics, computer graphics, system administration), moving them to an elective basis. I have no issue with a Comp. Scientist that doesn't know Racket or Smalltalk, but if I don't see formal proofs there will be blood.
- unexistance 11y agothe first & most important lesson my professor thought me before we start our programming class 'Programming is a self-thought discipline' that guides me to this day... Obviously I have apply it to broader IT segments, not just programming
- ThePhysicist 11y agoConcerning visualization I'd rather recommend Wilkinson's "The Grammar of Graphics" instead of Tufte's "The Visual Display of Quantitative Information", since the former contains much more practical examples and advice.
- hessenwolf 11y agoThanks for the reference. I was rather disappointed with Tufte's works, given all the hype. There were too many specialised "arty" graphs, and not enough standardised methods.
- chris_wot 11y agoThere's a book that every person who is serious about databases should read: it's "Applied Mathematics for Database Professionals", by APress. See here: http://www.apress.com/9781590597453 http://www.apress.com/9781590597453 Here is the table of contents, just to give you an idea of why it's such an amazing book: Table of Contents 1. Logic: Introduction 2. Set Theory: Introduction 3. Some More Logic 4. Relations and Functions 5. Tables and Database States 6. Tuple, Table, and Database Predicates 7. Specifying Database Designs 8. Specifying State Transition Constraints 9. Data Retrieval 10. Data Manipulation 11. Implementing Database Designs in Oracle 12. Summary and Conclusions
- agounaris 11y agoFail article...no you don't have to know all these things... Mathematics for 3D Game Programming and Computer Graphics??? OMG!! Thats totally not what everyone should know, thats a very "narrow" field of software engineering that it's suitable for those who really like it...jesus just don't read it.
- chris_wot 11y agoThat's a very solid book that deals with things not just restricted to 3D programming. It covers vectors, matrices and linear transformations, which are useful in other areas of Computer Science. Although an excellent book that covers these things is The Manga Guide to Linear Algebra, by O'Reilley.
- jnbiche 11y ago> Although an excellent book that covers these things is The Manga Guide to Linear Algebra, by O'Reilley. Thanks for that recommendation! I'm reading the sample chapter now, and it's a great review. I'm not a huge manga fan but this is a nice way to break up complex ideas.
- dghf 11y ago> I've tried to answer this question as the conjunction of four concerns: > ∙ What should every student know to get a good job? > ∙ What should every student know to maintain lifelong employment? > ∙ What should every student know to enter graduate school? > ∙ What should every student know to benefit society? I'm having difficulty articulating why, but I can't help feeling that this approach goes against the idea of education as a good in its own right; that the things that every computer science major should know are those things that are fundamental to the field, defined without reference to e.g. whether it'll get you a good job. My degree is history, and it would be difficult to provide any sensible answers to those questions for that subject, except perhaps #3. There is an argument that studying the humanities provides transferable skills in critical thinking, which I would dispute; apart from the importance of questioning and evaluating sources, and a large pool of counter-examples for many arguments of the form "people have always done X", most of my (limited) abilities in critical thinking derive from my amateur digressions into science and logical fallacies. The only quantifiable benefit to society I can identify is the nuggets of interesting information I can sometimes throw into discussions and comment threads (my favourite being "Gandhi wasn't a pacifist and the British were bombed out of India", which I don't get to use often enough). But a society without students of history (or French literature, or ancient Japanese ceramics) would be poorer; so would one without computer scientists, even if the field had no practical applications. Human knowledge advances best with a broad and deep body of ideas to bounce off each other. (No, I can't provide a concrete defence of that statement.) The things every computer science major should know are those things that, if he or she did not know them, would make it ridiculous to call him or her a computer science major. Ditto for every other formal field of study.
- hessenwolf 11y agoEvery computer science major should build a portfolio? Ahem, excuse me, but I've been employed. I kinda don't live off Mummy and Daddy and need to eat and pay rent. May I throw in a gigantic go fudge yourself in there, you elitist prat.
- heyts 11y agoThis seems like a complete counterpoint to this: https://news.ycombinator.com/item?id=9486391 https://news.ycombinator.com/item?id=9486391 Being self-taught, different experiences bring different problem-solving approaches and not _everyone_ has the need to know Haskell or Racket to self-identify as a programmer. This is exactly the kind of article that prevent people to consider a software engineering career.
- davexunit 11y agoThe author is trying to shove too many things into a CS curriculum that just don't belong there. CS is for studying the theory and nature of computation, so why is cutting and crimping a network cable on the list? System administration, user experience design? No way. This isn't a vocational program to get someone a job, it's Computer Science!
- deleted 11y ago[deleted]
- slamus 11y agoThis upsets me. "CS Majors" (as described in this article) should first learn that life is not a checklist, but rather a random sequence of experiences & events. Just be passionate in what you do, no matter the field you are in.
- rfrey 11y agoHaving produced a laundry list of skills ranging from implementing cryptography protocols through being an expert UX/UI designer, skilled in robotics, AI, data visualization, and having proficiency in 11 programming languages across 3 paradigms (not counting the 12th, which one should implement themselves), the author humbly notes that "My suggestions are limited by blind spots in my own knowledge."
- logfromblammo 11y agoNow I have one more anecdotal confirmation for my hypothesis that all advice is bullshit. I notice that the section on Networking has nothing to do with building cross-company relationships with your peers and future business contacts. Nothing is said about interviewing or salary negotiation. Suspiciously absent is the section about how to balance doing something correctly against doing it profitably--or how to stop arguing with your manager before you get fired. I have to assume that someone majors in computer science as a means to land a job in the field. We all know that hobbyists don't need the expensive degree credential. The vast, overwhelming majority of work now available for software professionals is to take someone else's shit code and make it work better. A very tiny fraction of it is producing all-new code that is done right the first time. As a new grad, you are probably not going to get that work, and even if you do, your inexperience in the real world will probably still make it shit code that someone else will have to improve. You do need a resume, even if you have a stellar portfolio, because the majority of available jobs are filled by people who don't know what a github is, or how much their mechanic charges to fix it. It is blindingly obvious that the writer is an academic, who has never held a developer position in a startup, a mid-cap, a megacorp, or a government. In the real world, the only skill you absolutely need is to learn exactly what you need to be productive. You don't just make yourself "T-shaped"--you also cultivate the ability to make yourself "Pi-shaped" by quickly growing a new stem of deep knowledge.
- deleted 11y ago[deleted]