I refuse to buy into this idea as I crave the challenge that I feel a good computer science program can bring as well as want to experience the good ol' college life. Are there still places out there that offer a diverse undergraduate Computer Science program that goes beyond teaching Java and C++ and focuses on the application of these technologies to create things? Are there schools out there that will let undergrads touch research and tackle the problems that current computer scientists face today? Or is this asking too much of a pre-graduate program?
That's not computer science, that's software engineering. If that's what you're interested in, you could look at RIT. That said, I'm guessing you're in high school, which means you may well not really know what you want. Personally, I wouldn't recommend doing a software engineering degree. If you get a solid CS education, the software stuff is relatively easy to pick up.
If you can get in, I highly recommend Stanford. Your chances of doing research as an undergrad aren't great, but you'll learn a lot, meet smart people, and classes like CS210 will give you a little of the practical software experience you mentioned. Plus, it's an awesome undergrad experience, one that I'm sad I missed out on.
If you want to do research as an undergrad, I know from experience that this is possible at Georgetown. The department there is tiny, but has several good professors, and many of my friends there did research as undergrads. There are definition downsides to doing CS there (department has less resources, you're unlikely to meet any potential cofounders, etc.) but overall I think I got a good education there (enough to prepare me well for a MS at Stanford, anyway).
I would expect that as ramchip notes informal arrangements can be done most anywhere, although getting paid in any way other than experience may not be.
One maybe not so minor note: according to one school that is ABET accredited, only 210 in the US have ABET accredited CS programs. E.g. my home town 4 year public college doesn't have one, I'd have to go to a larger regional one 70 miles away.
If he wants something very "applied", there's also computer engineering. I've been doing research since my first year as an undergrad (mainly through Canadian research grants, which offer paid summer internships). We do mainly C++, Java, VHDL, Verilog, assembly, but there's fairly little actual language education - they teach the semantics, we learn the syntax by reading and trying stuff.
On the more CS side of things, we did state machines, graph theory, recursion, formal proofs, and a good dose of math: solving differential equations analitically and numerically, calculus applied to force fields, Laplace, Fourier, complex analysis etc. Of course there's also electronic circuits, networking, computer architecture, (object-oriented) architecture... It's possible to study more web-related things such as databases, but I'm in embedded systems so we don't really touch this.
It's as applied as you can get: I have co-authored several papers and I'm only in my third year. But if you want to do research, you'll have to work for it a little. Go speak to teachers, do projects on your own, etc. AFAIK it's possible pretty much anywhere, but you won't necessarily get paid for it or get to choose your topic.
By "diverse" I mean going beyond software engineering and touching on graphics, AI, simulation, AR/VR, hardware architecture, and so on. My main worry is ending up in cookie cutter classes for four years. Then again, my idea of what college is truly like may be skewed due to the romantic idea of higher education that is sold to us in high school.
Thanks for the suggestions!
More generally, I think the anti-education sentiment you mentioned is unfounded. I'm colored by my experiences, of course, but I don't think I'd be half the engineer I am today without the education I've had, and I'm not a stupid guy.
Also my favorite Quake server (kitty1.stanford.edu) was run from a Quake CS Lab :)
Personally, I went to a top-10, big-10 school. If you wanted to go into research, you had that opportunity. If you wanted a silicon valley internship, you had that opportunity, if you wanted a startup position, you had that opportunity. The money is optional, if you can stick to federal grants/loans, you can consolidate them all into a single payment, and when you get your job out of college, start paying it off, as far as I can tell, it's the private, non fed loans that should be avoided like the plague.
I loved my school, I loved my college life, I loved my friends, and I wouldn't trade it for anything in the world.
You can't just waltz into University buildings and be all "sup dawg???". People are at least pretending to do work, you won't be able to access the network, you won't have common classes to complain about together, etc. etc. We're somewhat suspicious of non-students, too.
A couple additional notes. If you're interested in creating things, a small CS program probably wont suit you. Those tend to be far more theoretical; what you want is a CS department with strong systems. You might also consider getting a degree in something else and minoring in CS and/or programming on the side. Finally, undergraduate research is accessible at any research focused university and I definitely recommend you participate. You'll have to knock down a ton of doors to get a position, but it's worth it.
Feel free to email me if you want to know anything else about UIUC or just have questions in general!
As others here have said, what you describe is Software Engineering not CS. But if you learn CS, Software Engineering comes pretty easily (which the inverse is not necessarily true). Most credible CS programs will give you some exposure to SE as part of the curriculum. If you find a program with very little math, it's the wrong school. If you find a school with classes like "Regular Expressions" avoid it. However, if you find a program with a lot of math, and courses with names like "Formal Evaluation of Algorithm Design" and "Regular Languages, Context Free Grammars and Compilers" it's probably fine. Expect to take lots of course you don't find immediate application for, like English Lit, Social Sciences or Communications. Take those classes and ace them. They'll be cakewalk compared to the weedout classes you'll have to take (most likely something like "Data Structures and Analysis or Algorithms" or "Concurrent Processes and Distributed Applications" or whatever your school has chosen). Expect to spend 40-60 hours a week on those classes and be one of the 10% remaining in the class at the end of the semester.
Most good programs will take you through the entire computation stack, from designing digital circuits to ASM and machine code, to C and/or C++ in terms of modeling computation, operation systems and concurrency, networking communication theory, algorithms, graph theory, Chomsky's hierarchy of languages, probably some alternative computing principles and languages. If you haven't spent time in at least a half-dozen different languages, from Prolog to Lisp to C++ to ASM, it's probably not a good program. Expect to write at least one toy Operating System, and design at least one function 8-bit clocked calculator (if you are lucky it'll be a stored memory computer or a co-processor of some type). You'll need to take about as much math as a math minor. If you can, take the extra 2 or 3 classes and just get the minor. It'll put you out a whole semester since you'll be doing heavier loads than most majors.
At least at my school, there was an informal hierarchy of undergrad majors that indicated relative hardness (and therefore respect): Math > Physics > EE/Engineering > Computer Engineering > Computer Science > Software Engineering > Information Systems > Biology > all soft sciences like poly sci and intl relations > Art > Criminal Justice.
This hierarchy generally represents what a person from one major can do in another. For example, a Math major can learn to be a Computer Scientist without too much fuss, but not necessarily the other way around. A French lit major wouldn't likely survive an EE curriculum intact. Everybody knows this hierarchy and it can sometimes be the bases for clique formation and preconceived judgement between members of different majors. It's weird, but it happens.
Computer Engineering is a good applied program if you want to stay out of computational theory for the most part and just build stuff. It'll probably have lots of circuit design work and you'll spend lots of time with embedded systems.
Research will more than likely happen as part of your MS program (or if you go into it, your PhD), not your undergrad. But you better be ready to hyper-specialize pretty quick if that's what you want to do.
Don't pick a school based on name brand recognition, pick a school with a solid program -- some well known schools also have solid C.S. programs, most do not. Do a B.S. program. If your school offers such a thing as a B.A. in C.S. run far away and don't look back.
It will be challenging, and even if you don't end up doing pure C.S. work, you'll be in good shape to do most of anything else, even non-technical work. The best courses I ever took in my C.S. program were the required history courses. My two semesters of Chinese history have probably made me a $80k in salary doing research work for technical assessment papers early in my career.
If you get a chance to do a study abroad program for a summer, do it. Even if you have no hope of ever making that money back. Those programs will also really stick with you. Consider teaching English after graduation for a year also in a foreign country. That stuff will make you ready for any crap the job market will throw at you.
Former physics minor: your hierarchy is useless. Advanced classical mechanics (a weed-out course) is no harder than EECS 310 (discrete math).
But then again I found field physics and quantum physics quite a bit harder than discrete mathematics (and relativistic physics relatively straightforward no pun intended). I could probably still derive most of the equations for classical mechanics if I really sat down and worked at it (it's been many years since I looked at any of that material) but would definitely have a hard time with Maxwell's equations.
I didn't create the hierarchy, but I think it was the perceived hardness of the applied calc in field physics and applied dif-EQ in quantum that led the Comp Sci folks to hold the Physics majors in higher esteem (since we had to take like 9 credits of Physics and at least 2 lab courses at my school).
Yes, you will learn Java. Yes you will learn compiler design. But you will not learn ANYTHING about real world programming and you will find very few people with an entrepreneurial spirit.
If I had to recommend schools it would go in this order: 1) Stanford 2) Carnegie Mellon 3) Anywhere in NYC (only because you are exposed to the opportunities of the city, regardless of school)
http://www.cs.purdue.edu/academic_programs/undergraduate/cur... http://www.youtube.com/watch?v=HuY5XeEhX4g
If you're looking to learn basic programming skills, it's great. If you want to be part of a cutting edge program, as the OP seems to, look elsewhere.
However, college is still going to be a very valuable time in your life. It often is the catalyst to forming a social network that continues through your life, and also lets you see how the work you'll do fits into the larger picture of human knowledge.
Big picture aside, one of the best things you can do in college is get summer internships (hopefully every summer). That's going to give you some experience with building real system, provide a low commitment way to figure out what type of work you want to do after you graduate, and introduce you to people in the industry that can be invaluable in getting or finding jobs.
Research is also great, but make sure that you're working on something that is valuable to you. It is definitely possible to work on real problems and to get published as an undergraduate, but it's also very easy to end up working on someone else's project, and not getting much out of it.
I got a great education at Harvey Mudd (hmc.edu) and would encourage you to look at them. It's a small school - which also means no graduate program,so I was able to do research directly with professors. I had a job lined up at Google when I graduated, and can't imagine being prepared for where I am if I had skipped college.
Also -- +1 on internships. They were super valuable for me. For example the summer I spent in the theoretical physics dept at Fermilab helped me figure out what I didn't want to do :)
Before I start, I'll start by stating that I'm a U. Waterloo alum, though from Computer Engineering, not CS... so what I'm describing in terms of their CS programs might not be entirely accurate... and that I might be a bit biased.
1. Co-op (or internships). University of Waterloo's CS and engineering degrees are all 5 years long, with year-round 4 month terms in which you're either studying or working. You have 8 study terms and 6 work terms in those 5 years, and in the work terms, you're hired in real life companies and work in real life jobs working on real life projects, for companies like Google, Microsoft, Qualcomm, Research in Motion, etc. Not only that, you get paid a decent salary (enough for me to completely cover my tuitions + living costs) and wide network of people to start from when you're finished your degree and a nice thick resume to get balls rolling. The University actually hires a bunch of people to go out and look for jobs, and if you're good, you'll several offers from some of the top names in tech companies. The flip side, though, is that companies will expect real work out of you.
2. Waterloo's CS department is actually under the Faculty of Mathematics, which shows you how seriously they take the mathematical roots of CS. I've been told that they're very mathematically rigorous in their studies, and their success can be seen from the Waterloo's rankings in ACM programming competitions, as well as experts who teach in the field (like the people who invented elliptic curve cryptography, etc)
3. Waterloo has very liberal policies for Professors getting to keep much of their research, patents, and IP on their own instead of assigning it to the University, so a lot of professors are looking to get started on their research and spinning out. You'll see a streak of entrepreneurship from both the students and the faculty there.
4. At least in the computer engineering curriculum, they never teach you any computer languages. The first introductory class I took was in C++, but basics of C++ was covered by a TA in help session. The data structures and algorithms class is in Java, but the language itself was covered by another TA in a single help session while the professor focused on the actual data structures and algorithms, not how to write and compile java code. Through your 5 years, concepts are taught, but not the specifics... or that's at least how I felt. After the 5 degrees, I think I got most of the basic concepts to the point where I understand how computers actually work at a fundamental level, and I know how to get through the "abstraction" layers that so many people seem to have issues with. If you understand how a transistor works, it'll give you a better understanding of why writing to a flash device is different from other memories. If you understand how flash devices work, then it'll give you a better understanding of why you need different file systems to support it. If you understand how the file systems work, it'll give you a better understanding of why, for instance, opening a file with a million small files might be slow in some systems... and so on and so forth. I think one of the biggest thing that I got out of the school (besides not having a debt + thick rolodex + all the intangibles like friend network, etc) was 5 years of just learning and thinking about the concepts are all inter-related, so that when something fails, you have the required tools and knowledge to actually dig into it and figure out what's underneath all that abstraction that everyone takes for granted.
I know this is little bit long winded, but I'm of the opinion that the 4 years spent in college will not be a waste... On the flip side, it's my understanding that the college qualities vary wildly in US (I once talked to a Professor who turned down a tenure track position at one US college where they were told they don't have classes on Fridays because of Football Pep Rallys are on Fridays!!!). BUT, if you find a right school, just the people you're going to meet and befriend I think is worth it all by itself. It's really going to be what you make out of it.
Hope this helps.
My understanding is that upper year courses are pretty language agnostic. They just want to make sure that lower year students actually have some programming knowledge in a common language, cause when you don't, your coop opportunities are greatly reduced, as any first term mech/civil eng student will tell you.
My impression is that most of the top-ranked CS programs also do this, although at some of them it's more optional than others (i.e. you can get a CS degree without necessarily having written very much code). CMU is arguably the biggest in terms of number of pure CS faculty, and one of the only ones with a CS "School" with subdepartments (including CS (aka "misc"), machine learning, robotics, language technologies, software engineering, and some others I forget).
Basically everywhere I've heard of that's an actual university does let undergrads touch research. But, if you're interested in jumping straight to industry, research may or may not be what you're after; you might be better off with internships each summer and then your own side projects.
Also, the Java/C++ thing is more about employers complaining that they see people coming out of random universities with CS degrees but no ability to code. There are probably a fair number of universities that will let you graduate with only a JavaSchool coding level, but most places also allow you to get a vastly deeper education if you don't dodge all the good coding courses.
TL;DR: Yeah, go to a good CS program, it'll be worth it, and you'll be a lot better at life, programming, and thinking afterward.
Want a research position over the summer? Ask professors and show them your interest -- most freshmen will assume they can't, won't get to know professors, and won't show passion. This is how I got a paid position as a freshman.
Want to do applied stuff? Join a club such as DARPA Grand Challenge, RoboCup, etc. Or, start a club. Or, you will likely have free time to work on personal projects (moreso than at a full time job at least). I started a RoboCup group my freshman year, met a lot of like-minded people, met a lot of professors. What a great thing to do to meet people and learn what the university has to offer.
Want to take an interesting upper-level class but don't meet the formal prereqs? Just ask, they'll probably let you in.
Also, I must say -- it is completely inaccurate that universities just "teach Java and C++". Almost everywhere, this is likely only a first, test-outable introductory course. The topics you said you were interested in should be available at any decent CS program as electives.
- does your 'refusal to buy into this idea' prevent you from seeing additional options?
- is it really a binary question, or are there a range of possible solutions to your need that include different mixes of university and work
I got a Ph.D. at age 20 by being a bit creative with the institutional side of things. My university, rpi.edu, brought me in as a transfer student from nowhere and gave me credit for university-level classes i had sat in on at skidmore college and through johns hopkins cty program. i finished the last 2.5 years of my undergrad in 2 years by cleverly managing course requirements and taking a few extra classes. Then i cranked through my ph.d. while getting sent to japan for a summer through the nsf, and to conferences in Nice and Hungary.
if you set out a list of all that you would like to do and view university more as a mix-and-match opportunity, there are a lot of ways one can do things, that can be more productive than the traditional route.
for example, one could camp out in palo alto and attend a pile of stanford classes and events, plus tech industry startup events, plus ...
for two years i was on a campus without being a student there... but hey, some people like to get a degree and have a student i.d. card. at what cost though... food for thought ;)
Read about courses offered this fall: http://www.cs.umass.edu/ugrad-education/fall-10-course-descr...
You can complete one of the 11 tracks leading to a B.S. in Computer Science.
As well, you can complete the new B.A. in Computer Science. Instead of requiring Calc I, II, III, Linear Algebra, and three science courses like Physics I, II and Biology, this program requires only Calculus I and II for Life Sciences. The B.A. is designed for students who want to double major in a non-science field, and are required to take four courses relating to computing/technology in that second major. (As well, the student must take five Computer Science electives, like students pursuing B.S. degrees do.)
It's not difficult to do undergraduate research by doing an independent study with a professor for a grade, or by working for a professor for money during the school year (which is probably a bit harder than for credit). One would probably be expected to have completed the introductory coursework (data structures, algorithms, discrete math), of course. Yet another option is joining the honors program and writing an honors thesis, which could tie into the undergraduate research you could do.
In the summer, there is an official REU program with a stipend and housing. On top of that, professors also frequently have funds to pay skilled/upperclassmen undergraduates for conducting research, similar to what happens during the school year.
First, undergrad research. I was able to participate in undergraduate research at my university. They offer an engineering (including CS) undergraduate research initiative for students to work with faculty mentors, and some professors receive NSF REU grants which allow them to fund undergrads for a semester or more to do research with them. These opportunities don't jump out at you, however, and you need to take the initiative to talk to professors and discover the opportunities. Don't think you are too "inexperienced" either - you can start looking in your first or second semester. If you decide to apply for graduate school in a few years, you'll find that having undergraduate research is a huge plus for your application.
Also, yes, my school offered C++ and Java as the required programming languages. However it's not going to matter what they offer - you really learn programming once (not a trivial task), and from there, you can pick up whichever languages you need (a comparatively trivial task). Most importantly, you should learn outside the classroom -- make your own projects/applications/websites or contribute to existing projects. I did. This helps in a lot of aspects -- it trains your motivation, improves your skills in programming, can be used as resume fodder, and so on.
Do live on campus, at least for the first year, if not more.
Since hindsight is 20/20, I wish I'd double-majored in CS and biology (back in the 90's), but you eventually find your niche and you can always keep learning. I took a summer school course in CS at U of Illinois U-C while working full-time and married. So don't think that all of your knowledge will come in those 4 years.
I think the best argument for college is the immediacy for learning, networking w/ classmates (not social, rather intellectual), and developing the self-discipline to meet a well-defined goal. My wife has a doctorate in Music, and watching her accomplish that goal was enlightening. Yes, there's lots of b.s. to wade through, but that's exactly what's waiting for you on the other side.
This at least avoids the "Java/C++ problem", but of course, there are many other very important factors to consider in choosing a school, and in particular, you should go with the best all-round school you have as an option, not the one that has a slightly "better" CS program but not much else.
That being said, I posted an essay to HN not long ago which received a lot of positive feedback from the general public. However, it received not so much as one up-vote here on HN and vanished into obscurity. It was entitled "Want to be an Entrepreneur? College May Help."
http://news.ycombinator.com/item?id=1315158
Just remember, as great and intelligent as the HN community is, it is still a very specialized group of people. No matter how unbiased a given community is, you will never find very diverse points of view as long as you solicit only one source for information.
If you're actually as interested as it sounds you are, then go. Lots of people have found university to be a waste of time, but I can't help but think that it's mostly been the people who waste their time there.
I think it's a shame that so many uninterested people get 'duped' into going; they likely won't get much out of it, and it's horrible that their guidance counselors (or whomever) are misleading them into thinking it's a necessary step. But there's so much cool stuff that goes on there, and profs will let you participate in it if you actually show an interest.
If I had to do it all over again, I think I would have angled very hard for a Symbolic Systems degree from Stanford (http://symsys.stanford.edu/). It's a very cool cross-disciplinary program and, if you can afford it (mentally, financially), you can cram in more CS classes or whatever strikes your fancy along the way.
It also has a wealth of other engineering students (chemical, electrical, mechanical, and industrial) who are forced to co-mingle to avoid going outside in the awful Worcester winter.
Despite not being as well-known as some of the more famous engineering schools, in the years since going, I've run into a lot of really sharp folks who also went.
I'd at least recommend it as one to look into.
I don't think this viewpoint is credible, and you shouldn't listen to it. What is true is that, for many people going into college, it's a misuse (but a required one, often) of time because they're destined for non-college jobs. Widespread higher education is a waste of society's resources, and a lot of colleges out there aren't very good. But this decision isn't about society and its resources; it's about what's best for you.
What's best for you is probably to get a college education. It's very hard to get a decent job without one (and not so easy to get one if you have one, but that's another story).
Read every post on this thread. The advice here is great, and a good CS education will put you miles ahead (in terms of skill) of where you'd be without one. If, for some reason, you end up at a school that doesn't have a good CS program (a "Java school") then major in math and take the CS courses you like, plus independent studies.
As for which universities and colleges are decent, there are about 200 good universities and liberal arts colleges in the US, including most state flagships. You don't have to go to an Ivy or MIT to get a good education, and the drop off from Harvard to (for example) Penn State is measurable but not that steep; the academic job market is so rough that a lot of brilliant professors are ending up at middling universities. After you leave the top 200, the dropoff is much more severe.