1. how to get around a UNIX system (be comfortable with emacs and/or vi, know your shell, be able to install Apache/your favourite web frame yourself on a machine
2. know basics of TCP/IP networking (know how HTTP works, be able to debug it using telnet/netcat and tcpdump/pass through proxies)
3. know databases (not just "SELECT Ajax FROM Php", but know about indices, joins and normalization/de-normalizations)
4. or more dynamic languages (Python, Perl, Ruby, Php etc...) as well statically typed as object oriented languages (Java is common for enterprise web development)
These are really just the basics (give or take). Most of these (except for databases and dynamic languages) are a standard part of any CS curriculum. Databases course should be readily available as an in-major elective. Dynamic languages -- if not available as an elective -- should be easy to pick up as you go along.
These are also very nice to have and would make you not look like a "PHP script kiddie":
* Understand how your OS works, at the least be comfortable using strace and gdb and digging around /proc and tuning sysctl/proc/kernel parameters
* Understand more about networks: more about DNS, know how a load balancer works (NAT)
* Know C/C++: that's what the extensions for your dynamic programming language are written in, that's what your web server/web proxy and database are (usually) written in.
* Know algorithms, data structures. Be able to do bitwise manipulation (e.g. how would you track on which day of a month a user visited a site?). Understand the advantage a message queue would provide, understand non-blocking I/O and threading/forking models.
* Know more about OO, meta-programming/reflection, functional languages -- be able to hack up your own ORM layer/ad-hoc MVC.
There are jobs in web development that don't even heavily touch HTML/CSS/Javascript and tend to be heavier towards algorithms, databases and UNIX hacking. These are called "back-end jobs". The other end is "front-end", which requires more familiarity with UX principles/Javascript/ActionScript/Flex and basic graphics design/layout in addition to HTML/CSS. The specific hot things (current frameworks, etc...) change but the general of computing is an invariant. The latter is what you learn in computer science classes.
Lastly, you should absolutely do programming/web-development for fun -- first, it's the way to learn things you won't learn in class (or at your first job). Secondly, many start-ups operate under the maxim of "don't hire anyone who doesn't code for fun", thirdly -- chances are, working for a web start-up won't make you a millionaire: if you don't find programming to be fun and worth your time (making long hours non-monetarily rewarding), enter a field that you would (you're lucky to be amongst the few who has the chance to choose).
The important thing is to be willing to learn and improve yourself, and to just have a natural talent for programming. Nobody expects you to hit the floor running in your very first job.
Nonetheless all of the material I've described was offered at university I attended and getting a formalized training in the matter (particularly a rigorous mathematical approach to algorithms, data structures and formal languages/automata) definitely helped.
Nonetheless -- if one is motivated and disciplined -- they can pick these things up at a job (provided you get a job where the environment is conducive to learning, vs. one that merely expects you to crank out business logic 9-5) as well as entirely on their own.
Even in my first job, which was pretty much just cranking out business logic 9-5 I've learned a lot about databases, OO programming, UNIX and software development in general.
At the beginning you have so much to learn that even if you don't work for Google or Microsoft (they actually do a lot of non-trivial R&D) you will still probably be learning a lot.
Programming is the craft/art skill of manipulating digital code and data. Within programming you can learn about specific domains - for web apps that would mean databases, networking, a host of standard formats and protocols, and user interfaces. Many commercial programmers go their entire career focused only within one or two domains.
Computer science is the academic study of computation. As the rigorous curricula of today would have it, it is a more mathy endeavor than programming by itself. In particular there is a focus on provability and formality that doesn't come up in commercial programming.
Basically, stuff you learn in CS won't help you ship the ideal mix of features, stability, and time cost for (insert app here). What it will tell you is about a variety of methods with which you may approach the underlying computation problems and direct your own original research efforts.
This can be advantageous (you know things like DP and more formalized algorithms) but most of it is far above what you will ever need to do (probably. Certain areas use more high-level things)
I'd call tarsnap commercial, but it has involved proofs and formality. Right now I'm writing a paper which proves some properties about the efficient computability of functions -- because showing that these functions cannot be efficiently computed makes it possible to rely on them for security purposes.
Sure, tarsnap is unusual in the amount of cryptographic research behind it, but most interesting applications do something new at least.
Still, given a CS major and no experience applying math to practical matters, how valuable is that to someone looking for new hires?
Take this summer and spend it hacking on a project you find interesting. Learn a particular language (preferably one that your college wont go over. Be it Haskell, Ruby, a Lisp variant, whatever) and learn it as well as you can in a few months.
Then when the next summer rolls around, you'll have two years of class + that summer building something on your resume. And that summer will help out a lot in terms of practical experience working on a project (as opposed to a 1-2 week assignment that you drop as soon as it's handed in for a grade).
I am a sophomore in college, so take my advice for what it is. But, I wouldn't think I'm too far off from reality. Good luck
The interviews were actually slightly intimidating because most of the applicants knew more programming than I did! Cool experience though :)
1. Do some jQuery tutorials and really bone up on flashy javascript.
2. Learn to use any popular web 'stack' - LAMP is easiest on *Nix servers, RoR and Django are not rocket science. Nor is ASP for that matter.
3. Go out and find a web designer, or yourself bone up on design and CSS
4. Find easy contract work such needs basic web programming. Eg "install a picture gallery in my website" = $200/300/400.
5. Move on up with the contract work or launch your own site.
6. ???
7. Profit!
If you do this through college (and I didn't start until my senior year, a deep regret), you will level up to the forefront of web programming by the time you graduate.
Also, now that web is mature - there are multiple paths to success. I think getting the Server Side Language/ Javascript/ CSS/ HTML loop right in your head is the most important. You can follow that up with MVC frameworks, Adobe Air, Silverlight there are at least 4 or 5 solidly "employable" paths you can take
Worked out better in the long run.
http://upload.wikimedia.org/math/7/6/f/76f99713cf111eb035d90...
What's being implemented is pretty simple to write with an English explanation. But my interviewer expected me to get it from the notation above.
It's been a decade since I left high school, and the programming in my career doesn't involve formulae. After a bunch of successful interviews I bombed on this question, and was never forgiven.
EDIT: seeing as this thread is about a CS major trying to get a job, this is also something that is taught quite early in a CS curriculum ;)
I can handle Fibonacci when the problem is described, but a page of math means nothing to me.