

Ask HN: Do web startups hire CS majors? - raptrex

Right now im a 1st year student at Cal Poly Pomona as a computer science major.  I have been interested in building web applications, however, there are no CS classes at my school that teaches web development.  I know i can learn it on my own (i know html, basic SEO, CSS, some php).  I was wondering if startups hire CS majors or should i switch to CIS, which has a few web classes related to the internet, but CIS is mostly buisness related from what i know about it. If startups do hire CS majors, what do they do?
======
strlen
Having interviewed people fresh out of college for both web-startups and
established companies, from my view the most important thing you'd need to
know if you want to work in a web start-up are:

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).

~~~
ido
These are definitely good things to know, but I wouldn't necessarily expect a
fresh-out-of-college 22 year old to know them all - I think you can pick them
up on the job in the first couple of months/years.

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.

~~~
strlen
I knew most of these things at twenty two, coming out of college -- however,
my case is slightly different -- I've been a hobbyist before and during
college.

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.

~~~
ido
I guess my experience is a bit different, since I was a math major.

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.

------
triplefox
You are simply conflating CS with programming, which is very commonplace.

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.

~~~
cperciva
_In particular there is a focus on provability and formality that doesn't come
up in commercial programming._

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.

------
Zev
If startups hire CS majors, they code. CS at your college probably isn't pure
theory, but rather closer to Software Engineering. And you can't expect
college to teach you _everything_ that you'll need to know on your own.

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).

------
smidwap
Just finished interviewing 5 programmers, all of them CS undergrads or grads,
for my startup. (This might be a bit biased because CS majors were the ONLY
ones we interviewed so far.) Two things occurred to me during the interview
process: 1) CS majors have some formalized training in designing software, and
2) the most important part of their resumes was the
experience/internships/projects section. Nothing can replace the work that is
done outside of the classroom. Classes can't expect 40 hours/week of coding
but real jobs can. So, initiate projects yourself or find internships that
will actually utilize and grow your skills.

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

~~~
raptrex
Good advice. I think I will wait until I finish learning Java and C++ before
looking for internships. Your a sophomore in college and interviewing people
for your startup? I think im behind :(

~~~
smidwap
Yeah like Zev said know something before you get there, but expect to rapidly
learn new technology at your internship...that is the best way to impress and
push forward in a job. I was hired a couple years ago to work on a company's
employee portal, which started as sort of a joke because it was so
rudimentary, but I learned the insides and outs of the existing software and
quickly learned how to hack it (without using any real programming language).
Within weeks my boss had me doing complex work flows/applications on the
portal and paid me a pretty penny for it! Every internship will be different,
but just try to be flexible with what you're given. My guess is this is what
will impress potential employers the most, especially web startups looking for
individuals who can think outside the box.

The interviews were actually slightly intimidating because most of the
applicants knew more programming than I did! Cool experience though :)

------
ninjaa
A good way to get a leg up:

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

------
nailer
Have been working with Linux for over a decade. Had 9 interviews for a site
reliability engineer role at Facebook here (which I gather is considered a
startup until it becomes profitable or gets bought), before I got a 'no'.
Interview that lost it for me was a guy (who'd just graduated college)
presenting a page of math and telling me to write some Python to implement it.
This wouldn't have been my job function, but I couldn't read the math =
'definite no hire' in Facebook speak.

Worked out better in the long run.

~~~
sqs
What kind of math? Just curious.

~~~
nailer
Literally this:

[http://upload.wikimedia.org/math/7/6/f/76f99713cf111eb035d90...](http://upload.wikimedia.org/math/7/6/f/76f99713cf111eb035d908228c351710.png)

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.

~~~
ido
That's the Fibonacci Series. It would be hard for me to forgive anyone who
wouldn't at least recognize it too, since it is so famous and is basically the
classic example of recursion.

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 ;)

~~~
nailer
The job was as a system administrator, emphasizing troubleshooting and
automation. The question wasn't job related.

I can handle Fibonacci when the problem is described, but a page of math means
nothing to me.

------
rms
<http://code.google.com/soc/> maybe?

