I work at Facebook on Cache infrastructure doing super low level C stuff that gets deployed to lots and lots of machines in a massive distributed system. At best, half of the knowledge I needed could have been gained hacking around on my own in my free time. The other half came directly from Systems courses at Carnegie Mellon and research I did there as an undergrad.
This is also true of my close friends from school (housemates my junior and senior year) who work at Apple on the jscore Javascript engine, at Pure Storage[1] on hardcore storage stuff, and at SpaceX on control systems.
Maybe the average coder doesn't really need a college degree, but if you want to be a badass and get there as quickly as possible, four years at a top CS University is about the quickest shortcut you can take[2].
[2] You still have to go WAY above and beyond, but the exposure to people in that realm is invaluable, and it's hard to get that exposure outside of these places.
I have an nontraditional CS degree (DigiPen). I learned a lot of math in school, and programmed a ton. There was emphasis on data structures / algorithms, but not as much as you'd find in a traditional CS degree.
Part of my job is to hack around on JSCore in a Webkit port. I do this without much problem. I wouldn't say I understand the whole thing, but if I needed to I could.
In my experience, you learn as you go. As long as you're good at problem solving and using Google/Reading/Asking People Who Know, you'll figure it out. With or without a traditional CS degree.
There's nothing magical about JSCore, or hardcore storage, or spaceship control systems. It's just domain specific knowledge that you pick up if you spend time solving those kinds of problems.
I definitely think that self-directed learning in that area can provide an adequate background. I am very skeptical of any supposition that a traditional university will actually let you learn things quickly; the curriculum and pace is necessarily lessened to the lowest common denominator, and everyone suffers (even the LCD, because he won't constantly be the LCD for every subject).
The biggest advantage a traditional CS path has, imo, is the exposure to university resources, bot social and physical, though predominantly physical. As you noted, if you're doing some massive distributed thing, it helps to have access to a lot of decent computers. However, I fully believe that a determined independent student can gain the same knowledge on a faster schedule than he would if he followed a degree program at a university.
Except it's harder :) I tried doing stuff on the MIT site and always fell behind - and of course I would never do the assignments that add real value to understanding.
The problem here is that your work ethic is not up to par because you can always think to yourself, "Why should I waste my time on this?" and not have an imperative answer ("I need to pass this class").
The major draw of a University education is that it forces you to focus and do the work. If you are driven and do not need the grade excuse to dig into a subject then you do not need to attend a University.
This becomes ever more apparent past the undergraduate level when you enter the workforce or a graduate program. You will end up going to classes or learning about material that interests you or is relevant to your work and you will do this without concern as to whether or not you get a grade at the end because all you care about is learning something you are passionate about.
I was in the same boat until I actually sat down and tried to do it. Look, the problem with being a self-learner is discipline, meaning discipline not to cheat by just Googling the answer. Discipline to swallow your pride that not everything will click at once so you may have to rewatch the lecture two or three times. And discipline to put your head down and go through the problems.
I'm doing 6.001 SICP course right now, the video lectures of Sussman and the other guy was mind blowing to me and most of it went over my head. I didn't quit though, found another resource for it in HTDP and am now going through it. The first part was easy, I could go through a chapter in 1 hour and do all the exercise. I'm now on the second part of the book and it's not so easy anymore, one chapter is now taking 3-5 hours to complete. But if I look at the big picture, it seems I'm par for the course as one is suppose to spend 10 hours a week per class.
College for me was a mix of self-learning (writing LISP interpreters and video games) and being forced to learn nifty new stuff through coursework.
I wound up dropping out after 3 years. I don't regret it because I've kept up the self-learning (being an ACM member, reading lots of papers on a continual basis, not budgeting books on CS and engineering).
I think you can afford to drop out of college, but you cannot afford to drop out of learning. I've seen too many senior engineers wind up sidelined because they concentrated on just what they were good at in their job.
I don't mean be a butterfly, or attempt to learn every month's new cool stuff. But get exposure to lots of levels of many good systems. Read the Unix source code. Read a compiler or two. Learn Prolog or Haskell. Write a network stack. Learn about database implementation, and Self, and modern graphics, and build systems. Learn everything you can from the stuff around you that is of good quality.
I'm earning more money than I would have believed possible, at a job I think I would do for free, if I could. It's a privilege to work with really good people.
If one is working on very low level problems — as you are — then an academic education is tremendously useful. What you refer as badass is the work of a true computer scientist. There are indeed incredibly brilliant academics in most computer science departments.
However, most of us here — including the OP, it seems — are interested in higher level problems. Not those of writing compilers or optimizing some arcane algorithm, but those involving successfully running a startup. Academia is far behind on the later, and as a student myself, I share the sentiment of the OP.
I'm a student too, as well as a paid developer, as well as a guy in my early 30s, as well as a person who changed careers within the past year to software development.
I've been doing this (programming) in earnest for a little over a year. Already I want to broaden my horizons beyond web development. It's getting stale, and frankly a little repetitive. Granted I'm not working on Big Problems, but that's the point, right? It doesn't take a CS degree to put together a web-based startup with a great idea, some market research, sexy CSS and some funding.
However, I'm already bumping up against the limits of what I know. I'm a ... let's say, voracious and enthusiastic autodidact. I don't think there's anything about developing for the web I either couldn't handle right now or learn rapidly. I'm talking UX, backends, servers, etc. You know, until the actually fucking difficult problems come along that aren't answered all over StackOverflow. The problems the people in IRC channels don't have a macro for answering. The problems that aren't well-documented, or, better yet, tread new ground.
On the web it seems like treading new ground is pretty tough. There are a lot of uber smart people who started a lot younger than me who had the ideas and thoughts and problems I'm having, but 15-20 years before I had them. Web development is a solved thing, it seems like. That doesn't interest me.
It seems to me that I can't do anything new if I stick to the web-startup-centric (or just web business) world. And I am not bright enough to work on new and/or unsolved problems right now. I need education, and I need the fuckin' good stuff. Discrete math, data structures, algorithms, linear algebra (hell, I don't even know how linear algebra applies to CS, but I've read a million times it's central), the stuff I can't figure out in an hour or a day or a weekend. That's why I'm going to school.
So yes, school might be boring the fuck out of you right now, but in a year or 5 or 10 you're going to want to do more, different, arguably better (more meaningful?) things than iterating a web site.
Plus, I don't know about you but I don't want to be the guy who really really really knows Python|Ruby|JavaScript (plus HTML and CSS!!!) and gets really emotional about why my high-level languages of choice are awesome or better or whatever than the others. I've seen it already among my co-workers and fellow students and tbh it bores the piss out of me. I want to know WHY Cython is slow at X while Ruby is great at Y, or why the JVM's disadvantages exist. In short, I want to be prepared so that when the day comes that I get the chance to ask a brilliant guy (or girl!) like Rich Hickey a question, I ask an awesome question.
I haven't gone back and read this over, and I feel like I sound way too grizzled for my experience level. Sorry in advance if I sound smug or condescending. Just trust me when I say it was unintentional. I fully accept the fact that I am 100% full-blown stupid and know nothing, in practical terms. And frankly I don't think I personally would ever rise to anything other than the mediocre, run-of-the-mill peon I am now on my own. That's why I'm studying the science of computing.
Don't get all frustrated about school. Trust me, part of me wants to work full-time and get the money rolling in and so forth. But shortcuts are almost always the long way around.
> I don't think there's anything about developing for the web I either couldn't handle right now or learn rapidly. I'm talking UX, backends, servers, etc.
Does that include some of the more modern browser frameworks like Cappuccino [1]?
I mention Cappuccino specifically because it is almost identical to Cocoa. Once you know Cappuccino, you know how to build native Mac apps; and are only a stone's throw away from developing iOS apps too.
From there you have a whole slew of new technologies to explore.
Native development opens you to a whole new world of technologies. Having nearly direct access to the hardware means you can do a lot more than the browser sandbox allows. Like, I am currently playing around with computer vision to do some pretty neat things with video cameras. Something that is difficult to nearly impossible in a web browser.
I'm not sure what exactly you want to do, but the possibilities are only limited by your imagination.
I would also add that school affords one with the ability to focus full time without the distarctions and fateague of a full time job (especially if the job is in a non related field). This is imparative to those who haven't been programming sense age 12 and are relatively new to the space. Everything is "easy" when you know how to do it. I guess the point I'm trying to make is that the value in higher education extends beyond its curriculum and that value is entirely dependent on the individual.
Your post sounded a little bit like Steve Yegge's talk about how we should focus on more important stuff. Instead of doing another pointless startups we should read some hard math and do some hard stuff. Did you happen to watch it? ;-).
> Web development is a solved thing, it seems like. That doesn't interest me.
I was in the exact same boat as you when I started out. After a few years of web development, I was getting closer to a sinking suspicion that I was nearing the end of the rope, so to speak...
And then the rabbit hole opened up to me. Trust me when I say: the web development stack is very, very deceptive. It would take at least a decade, if not more to fully master every aspect of it. And it hasn't even been around that long (comparatively), which makes finding true experts for our "hard problems" quite difficult.
The knowledge that I have to go into work knowing inside and out every day? Domain registration, sysops, provisioning a server from scratch, chef/puppet for configuration management, bash scripting, server security, firewall rules, DDOS prevention, nginx/apache hosting software usage and configurations, the dozen and a half different fucking flavors of wsgi servers and how to properly reverse proxy into them, redundant load balancing with HAProxy and heartbeat, postgres/mysql/nosql database software usage and configuration, database sharding and connection pooling, master/slave and master/master setup advantages and disadvantages, proper schema creation/indexing/querying efficiently, proper static and media file headers/caching/expiration, python/ruby, django/rails, process management ala supervisord/runit/upstart/initd, semantic HTML, flexible CSS through a separate tool like SASS/LESS, javascript and what used to be the giant clusterfuck of front-end engineering, ajax, comet/long-polling/buzzwordsgalore, getting SSL to properly work with all of the above, Solr search engine usage/configuration, caching with varnish and memcached, queuing all over the place with rabbitmq, lightweight key/value stats with redis, proper version control, continuous integration, project management, one-click builds and deploys with fabric/capistrano, and the 1001 insecurities built in to naive web development and how to properly protect against them. The list goes on and on and on. I'm sure I'm forgetting to mention a lot more.
Now I know how silly I was back then to believe that I was "done" with web development after a short amount of time setting up toy websites. I still consider myself a novice, and I haven't even scratched the surface of what it takes to make a web site/service scale to massive amounts of traffic.
The parent comment from a Facebook dev is somewhat spot-on though: for the hard Computer Science problems, you have to get into the low-end systems level programming. On the complete opposite end of the spectrum, I deal with problems at the macro level. Computer Science, while extremely helpful in some cases, in no way, shape, or form prepared me for the bottomless pit of knowledge required for modern web development.
To each their own, but both sides are deluding themselves if they believe that they somehow have the "tougher job" when it comes to programming. The only difference is that a CS degree better prepares you for one over the other, due to the nature of the work involved.
Sorry if I gave you the impression that all I've done is set up toy websites. In your list, just in the past year, I've touched a solid 80%, if not more, of the technologies you listed, professionally. The only ones I'd leave out are database sharding, connection pooling, redis, project management... and I think that's it.
That's kind of my point. This stuff isn't hard and oftentimes the things you mentioned are the big obvious solution, because a million people have done it before and blogged about it. That's not to say it isn't really cool. ad hoc multiprocessing with rabbit (or whatever) & celery is awesome. Sass is neat, etc., etc. But by and large they're solved problems. That doesn't make them unworthy of anyone's time, or stupid or dumb or whatever. I didn't say the tech stack is shallow; I said the problems you try to solve on the web are solved by and large, except at the edges where companies like Twitter, Disqus, etc., are doing new things to scale.
There are people out there who collect spoons. They have an enormous wealth of knowledge about all kinds of spoons. There is practically a bottomless pit of knowledge about spoons. Their history, origins, etc. That doesn't make it interesting to everyone, necessarily.
That was partially my point. It doesn't matter if you're doing systems engineering, high frequency finance trading, web development, games development, database systems creation, mobile app development, or working with embedded systems. Most of the problems you run into are solved.
But when you work with any of these fields at length, new and largely unsolved problems crop up. That's not unique to people working on cache systems. Whenever you're in a field that runs into scaling/performance issues (which is all of them), you run into hard problems.
If you were to do a 180 and go into a job building database engines instead of web sites, guess what? Most of the stuff you deal with has been blogged about, answered on StackOverflow, and is generally a solved problem. Where does it break down into tough programming? Making it perform bleeding fast. Same goes for web development, and games, and so on.
It might _seem_ like web development is more trivial than the rest, but that's just a common misconception.
This is also true of my close friends from school (housemates my junior and senior year) who work at Apple on the jscore Javascript engine, at Pure Storage[1] on hardcore storage stuff, and at SpaceX on control systems.
Maybe the average coder doesn't really need a college degree, but if you want to be a badass and get there as quickly as possible, four years at a top CS University is about the quickest shortcut you can take[2].
[1] http://www.storagereview.com/pure_storage_comes_out_allflash...
[2] You still have to go WAY above and beyond, but the exposure to people in that realm is invaluable, and it's hard to get that exposure outside of these places.