Ask HN: I dropped out. How do I continue my CompSci education?
18 comments
"NAND to Tetris" will give you a good grounding in the basics of hardware design, the low-levels of operating systems, implementation of languages. Basically, you get a good overview and practical experience tinkering with the whole thing.
http://www.reddit.com/r/programming/comments/7s383/from_nand...
I got the same thing from my CS education, but by accident. You can get it packaged neatly in one place from this course. This alone will put you in the top half of the programming community with regards to knowledge and overall understanding.
http://www.reddit.com/r/programming/comments/7s383/from_nand...
I got the same thing from my CS education, but by accident. You can get it packaged neatly in one place from this course. This alone will put you in the top half of the programming community with regards to knowledge and overall understanding.
This alone will put you in the top half of the programming community with regards to knowledge and overall understanding.
Really? Is the bottom half really that dumb? Or people just choose to ignore things which are not immediately of there need. I completed that book and though it was a great read, I wouldn't say I know much more than a person who has a CS degree.
Really? Is the bottom half really that dumb? Or people just choose to ignore things which are not immediately of there need. I completed that book and though it was a great read, I wouldn't say I know much more than a person who has a CS degree.
Or people just choose to ignore things which are not immediately of there need.
A sentence that answers its own question! (Left as exercise.)
I completed that book and though it was a great read, I wouldn't say I know much more than a person who has a CS degree.
The problem is that often the same material is covered in the process of getting a CS degree, but in the wrong order and in a time-dispersed manner. "NAND to Tetris" gives you an overview of the whole thing in a coherent way. And yes, there are people with a CS degree who would get a few "Ah Ha" moments out of doing the course. Also note that I said it would put you in the the top half of the programming community and not the top half of those who hold CS degrees.
A sentence that answers its own question! (Left as exercise.)
I completed that book and though it was a great read, I wouldn't say I know much more than a person who has a CS degree.
The problem is that often the same material is covered in the process of getting a CS degree, but in the wrong order and in a time-dispersed manner. "NAND to Tetris" gives you an overview of the whole thing in a coherent way. And yes, there are people with a CS degree who would get a few "Ah Ha" moments out of doing the course. Also note that I said it would put you in the the top half of the programming community and not the top half of those who hold CS degrees.
I dropped out, too (it was to a programming job). This was quite some time ago (1982).
I tried to finish school later, but work always won. I never had the discipline to do both.
To keep up:
1. Read CS textbooks and do small projects to make sure you understand the material at a practical level.
2. Join the ACM and keep up with interesting publications from their electronic library. (The Usenix papers are free, but more limited in scope).
3. Learn a new programming language, server technology or OS environment at least every year. Keep your level of exposure to new things high and don't get too comfortable in one thing. Don't be a zealot and don't get stuck.
4. Read a LOT of code. (I read through the Unix sources, the source for TeX and a bunch of other largish packages just because they were there).
More recent things that I didn't have access to: Publically available course videos and material. My guess is that these are as good as the amount of time you put into them.
I tried to finish school later, but work always won. I never had the discipline to do both.
To keep up:
1. Read CS textbooks and do small projects to make sure you understand the material at a practical level.
2. Join the ACM and keep up with interesting publications from their electronic library. (The Usenix papers are free, but more limited in scope).
3. Learn a new programming language, server technology or OS environment at least every year. Keep your level of exposure to new things high and don't get too comfortable in one thing. Don't be a zealot and don't get stuck.
4. Read a LOT of code. (I read through the Unix sources, the source for TeX and a bunch of other largish packages just because they were there).
More recent things that I didn't have access to: Publically available course videos and material. My guess is that these are as good as the amount of time you put into them.
Regarding point 2, it might be worth checking out if any local university has a public library with journal access.
Finish school. Startups will wait. In the meantime, see me re an internship.
I disagree. If anything, it's school that can wait. Especially considering you can get a decently comprehensive CS education w/o paying mid-5 figures a year in tuition.
Rather than giving all that money away needlessly, spend a fraction of it on room and board and spend the majority of your time teaching yourself. You'll be done way ahead of 4 yrs.
And then jump into the startup world.
Rather than giving all that money away needlessly, spend a fraction of it on room and board and spend the majority of your time teaching yourself. You'll be done way ahead of 4 yrs.
And then jump into the startup world.
You don't go to college just to study.
I can't agree with this more. I was a bit of an outcast at my school and I still had the time of my life. I played in a few bands, went to a lot of shows, worked at the college radio station, took classes in philosophy, writing and photography and got a degree in Comp Sci. I would argue that the non-programming experiences are just as valuable to someone starting their own company.
I did. I didn't survive too long...
Likewise, you don't launch a startup just to make money.
Bad advice. By the time he enters middle age, the higher-education bubble will have long since popped. A college education will be cheaper than it is now, and will be available entirely online. Brick and mortar schools will be so desperate for students that they'll be offering zero-interest loans to get him to come back.
Conversely, due to family commitments and other aspects of real life, starting your own business is something that gets monotonically harder every minute until you retire.
Do it now, or it probably won't happen. Believe me, college is what will wait.
(Edit: Maybe I was too hasty in saying 'bad advice.' It's good advice if he actually takes it. If he doesn't have the kind of personal drive needed to ignore people who tell him to take the safe path through life and stay in school, then he may not be happy as an entrepreneur.)
Conversely, due to family commitments and other aspects of real life, starting your own business is something that gets monotonically harder every minute until you retire.
Do it now, or it probably won't happen. Believe me, college is what will wait.
(Edit: Maybe I was too hasty in saying 'bad advice.' It's good advice if he actually takes it. If he doesn't have the kind of personal drive needed to ignore people who tell him to take the safe path through life and stay in school, then he may not be happy as an entrepreneur.)
I might make me here unpopular, but I would say: No, you did it wrong! Let me clarify on this:
Yes, in CS you might not learn how to program well, this is true. However, when you study you get knowledge about several interesting computer science problems and how to solve them. You will see that problems later in your programming carrier however now you have a good background to solve them. Just a simple example:
You given an array (let's say integeres). How would you remove all duplicates? A naive solution would be to check for every value, if there is more of this in the array. This has a running time complexity of O(n^2). The better way would be first to sort your array and then just iterate and remove all neighbours which are equal. This corresponds to O(nlogn) + O(n) complexity.
What I try to say, as a young "coder" you might not see all the troubles (in this case performance) you make when coding just straight away. You need to understand what you are actually doing, for this CS study gives you a good background.
The other really important point is: Startups fail with very high probability! CS diploma (or whatever this is in your country) gives you a solid background on which you can relay, when looking for a job position after your startup time. So, complete with your study is maybe a very classic way, however this is the most secure way for a long term.
What I try to say, as a young "coder" you might not see all the troubles (in this case performance) you make when coding just straight away. You need to understand what you are actually doing, for this CS study gives you a good background.
The other really important point is: Startups fail with very high probability! CS diploma (or whatever this is in your country) gives you a solid background on which you can relay, when looking for a job position after your startup time. So, complete with your study is maybe a very classic way, however this is the most secure way for a long term.
You can do even better by inserting each element from the array into a hashtable and either discarding or doing a deep compare on collisions. Ignoring the probability of collisions, this is O(n) at the cost of extra space.
I know that some people will disagree with me violently, but you can self-learn pretty much any topic in CS as long as you are willing to put in the effort (any topic in any subject, really, the main factor is motivation). As someone who skipped straight to a masters, I know it is certainly doable to self educate.
MIT open courseware might be a good place to start, although I've never used it myself.
http://ocw.mit.edu/courses/electrical-engineering-and-comput...
I would personally focus on topics that are either historically difficult, or pragmatic.
So stuff like compilers, computability and complexity, operating systems, database systems, cryptography, machine learning, web applications, linear programming, networking. Learning the basics of hardware is important too, although it is more electrical engineering and math theory.
MIT open courseware might be a good place to start, although I've never used it myself.
http://ocw.mit.edu/courses/electrical-engineering-and-comput...
I would personally focus on topics that are either historically difficult, or pragmatic.
So stuff like compilers, computability and complexity, operating systems, database systems, cryptography, machine learning, web applications, linear programming, networking. Learning the basics of hardware is important too, although it is more electrical engineering and math theory.
Same for Stanford.
http://see.stanford.edu/see/courses.aspx
Youtube lectures, download through torrents available on the site.
Some are good, and all have a lot of documents attached (all accept the book, often)
Youtube lectures, download through torrents available on the site.
Some are good, and all have a lot of documents attached (all accept the book, often)
Also UC Berkeley has video podcasts of entire courses on iTunesU, with materials available online.
Doing the startup will be an education in and of itself. Just follow the lead of what needs doing. Need to scale? Learn about scaling? Need algorythms? Learn algorythms. Etc.
Learn you some PLT. Specifically, study this:
http://www.paultaylor.eu/stable/prot.pdf
and this:
http://folli.loria.fr/cds/1999/library/pdf/curry-howard.pdf
and this:
http://www.cis.upenn.edu/~bcpierce/tapl/
very, very carefully.
http://www.paultaylor.eu/stable/prot.pdf
and this:
http://folli.loria.fr/cds/1999/library/pdf/curry-howard.pdf
and this:
http://www.cis.upenn.edu/~bcpierce/tapl/
very, very carefully.
More algorithms and theory. In my experience the first algorithms course you take glosses over a lot of things and outright omits a lot of other (very cool!) things. I also enjoyed compilers and OSes, but I ended up doing high level stuff so I haven't had to care about either since school.
These topics aren't strictly computer science, but I highly recommend studying number theory, abstract algebra, and graph theory.
As far as resources go, I would use CLRS/OpenCourseWare/whatever you can find. I don't think the texts I used to study the above topics were exemplary, so anything you find on them will probably be as good.
Also, this place: http://www.topcoder.com/tc?module=Static&d1=tutorials...
These topics aren't strictly computer science, but I highly recommend studying number theory, abstract algebra, and graph theory.
As far as resources go, I would use CLRS/OpenCourseWare/whatever you can find. I don't think the texts I used to study the above topics were exemplary, so anything you find on them will probably be as good.
Also, this place: http://www.topcoder.com/tc?module=Static&d1=tutorials...
Congratulations on your startup!
In my opinion, you could check out what kind of courses they typically offer in their curriculum at MIT/etc and check out their corresponding courses on OCW. Since you're doing this out of sheer fun, don't be bothered getting too caught up with the structure of it. If you see anything you like, just read up on it.
Usually the ones you've mentioned are a good stepping stone towards more advanced ones though you mentioned you don't want advanced ones. Here are some you can look into:
1. user interface designs (helpful with any startup I think) 2. software engineering (teaches you a little bit of structure in a development process) 3. courses about testing, testing methods 4. operating systems (not crucial but it's fun to read, kinda helps with ideas about distributed computing)
Good luck!
In my opinion, you could check out what kind of courses they typically offer in their curriculum at MIT/etc and check out their corresponding courses on OCW. Since you're doing this out of sheer fun, don't be bothered getting too caught up with the structure of it. If you see anything you like, just read up on it.
Usually the ones you've mentioned are a good stepping stone towards more advanced ones though you mentioned you don't want advanced ones. Here are some you can look into:
1. user interface designs (helpful with any startup I think) 2. software engineering (teaches you a little bit of structure in a development process) 3. courses about testing, testing methods 4. operating systems (not crucial but it's fun to read, kinda helps with ideas about distributed computing)
Good luck!
Links to free ebooks:
http://news.ycombinator.com/item?id=1327632
Which programming book you just couldn’t stop reading from start to end?:
http://news.ycombinator.com/item?id=1944913
http://news.ycombinator.com/item?id=1327632
Which programming book you just couldn’t stop reading from start to end?:
http://news.ycombinator.com/item?id=1944913
> What are some topics in CS that I can self-learn?
Any. Pick ones that interest you and start googling.
Any. Pick ones that interest you and start googling.
I'd suggest you look into machine learning. It's probably going to be the single most important area of computing in the years to come. Start with the Stanford course online.
Also, if you haven't already, learn functional programming.
Also, if you haven't already, learn functional programming.
I hear this a lot: "learn functional programming", so I did a Haskell module and I still don't understand what all of the fuss is about.
Can you attempt to explain it to me?
Can you attempt to explain it to me?
I think PGs Common Lisp is a good book for functional programming. It really forces you to solve problems in new ways. While it is not difficult to do the problems in each chapter, doing them the "lisp" way will definitely challenge a C programmer.
An operating systems course and a compiler course are what would complete your fundamentals. I have no idea how good the OCW courses are on these subjects (or if they even exist at all), but if they sound something like "build your own OS/compiler" then you're probably on the right track.
Bear in mind these two courses will contribute minimally (if at all) to your startup but its a nice to have a basic knowledge of how these two things work.
Bear in mind these two courses will contribute minimally (if at all) to your startup but its a nice to have a basic knowledge of how these two things work.
Some familiarity with Numerical Analysis is, in my opinion, a must to a practicing Software Engineer. The official course book where I took the course was Dahlquist,G.L., Bjorck,A. Numerical Methods. I didn't use it too much so I can't comment on readability, but it does cover the material well.
I would highly recommend iTunes University, its has many high quality recordings of lectures from many of the top universities. I've been programming for 10+ years and am self-taught, however I'm currently 'attending' the Programming Methodology course from Stanford University.
Those seem atleast the core fundementals! Maybe pick up compiler design, functional programming and software engineering/architecture
Go to your local community college and take some classes. Maybe not a full load, but a few.
Congratulations, you made absolutely the right choice, even if the startup is a total failure.
As someone who has worked with many right-out-of-school CS graduates, I'd strongly suggest you pursue a lot of code writing. I'm sure you'll be doing this at the startup. But spend as much time as you can doing it, and learning from errors in production, and in review.
The real thing that CS programs lack is teaching people how to program. I mean that seriously. They focus on theory, but rarely on actual programming. If your startup does not consume absolutely all of the programming energy you have, then work on a cutting edge open source project on the side as well.
If you wish, there are classes in iTunes university, and you can surely peruse the catalog of the university you left, find the classes you would have taken, and buy the books, or comparable (cheaper) books on the same subjects and study them. I've done this in the past, but found that books targeted at practitioners in the field are generally more effective (and at the same cost or less) than those targeted as textbooks. (Back when I was younger, when I'd be going into a new area and wanted to research it, I'd wander into college bookstores looking for things like machine vision, etc.)
The industry oriented books won't have tests and problem sets for you to do... but you don't need them because you're pursuing this knowledge to help you complete some goal, right? For instance, maybe you want to build a robot that can compete in GPS Magellan and you need computer vision expertise for that? (That's what I did.)
When you are excited about a project, you will go and devour what you nee to learn, and you will learn it much more deeply and fundamentally than any class can teach you.
So, find projects and pursue them.
As someone who has worked with many right-out-of-school CS graduates, I'd strongly suggest you pursue a lot of code writing. I'm sure you'll be doing this at the startup. But spend as much time as you can doing it, and learning from errors in production, and in review.
The real thing that CS programs lack is teaching people how to program. I mean that seriously. They focus on theory, but rarely on actual programming. If your startup does not consume absolutely all of the programming energy you have, then work on a cutting edge open source project on the side as well.
If you wish, there are classes in iTunes university, and you can surely peruse the catalog of the university you left, find the classes you would have taken, and buy the books, or comparable (cheaper) books on the same subjects and study them. I've done this in the past, but found that books targeted at practitioners in the field are generally more effective (and at the same cost or less) than those targeted as textbooks. (Back when I was younger, when I'd be going into a new area and wanted to research it, I'd wander into college bookstores looking for things like machine vision, etc.)
The industry oriented books won't have tests and problem sets for you to do... but you don't need them because you're pursuing this knowledge to help you complete some goal, right? For instance, maybe you want to build a robot that can compete in GPS Magellan and you need computer vision expertise for that? (That's what I did.)
When you are excited about a project, you will go and devour what you nee to learn, and you will learn it much more deeply and fundamentally than any class can teach you.
So, find projects and pursue them.
But I don't want to remain stagnant in my knowledge. What are some topics in CS that I can self-learn? What are some great OCW courses/textbooks/resources I can use to continue learning about advanced CS topics?
Here's what I have taken already: Discrete Math, Data Structures and Algorithms, Intro to Computer Architecture, Intro to Artificial Intelligence.