Tuesday, June 8, 2004

Advice For John

One of the best things about the Direct3D tutorial series that I've written is that occasionally people will email me asking for my help. I like this because I get to hear about what they are trying to do, and because it gives me a chance to solve interesting problems.

I recently got a letter from John Wessel that I thought posed an interesting question, so (with his permission), I'm posting it here.

> First, your tutorials on DirectX are great. I enjoy reading them because
> afterward I can actually make something work, and it validates my
> existence.

:) Glad you enjoyed them.

> Second, my question is almost related. I'm eighteen, in junior college and
> will be transferring in two or three semesters to a 4-year. I'm trying to
> find out what the job market is and what people are looking for when they
> hire. I figured I'd start by asking the people who got me interested in
> programming in the first place, the legible tutorial writers! I'm not
> quite sure exactly what you do or if you work for someone, but you seem
> knowledgeable enough so I thought you might have a good perspective.

I'm an independent computer programming contractor. My wife and I run our
own business, which is just the two of us. I used to teach for
DevelopMentor, but these days I design and write systems for my clients. I
bill myself as an expert in .NET technologies, with an emphasis on security
and web services. Our website is
http://wangdera.com if you want to see a
bit more.

> What should I major in? Is computer science absolutely necessary, or would
> something like physics, which I'm leaning towards right now, be
> acceptable? I've taught myself how to program and I dread having to take
> classes on something I'm decent at already. I'd rather learn something
> more that I can apply through programming, but I'd like to have a job,
> too.

Computer science is not necessary. It helps some, since your focus will be
on computers, but frankly, there's not a ton of difference between one BS
and another - most of your core courses are the same regardless of whether
you're a physics major or a biology major or an electrical engineer (which
is what I did).

See, here's the thing that no one tells you: learning to be a good computer
programmer takes at least ten years. Which means that just about no one
coming out of college is any good. The smart employers (and believe me,
there are a lot of dumb ones) know this, and aren't really looking for
people that already have really strong programming skills. They're looking
for people with strong *thinking* skills, since those people can be taught
to do just about anything well.

You should major in whatever you're interested in. Five years from now, when
you graduate, the job market and technologies in use will probably be pretty
different from what they are now. Also - and I know this can hard to believe
from your side of it - your brain is going to change a lot between now and
age 22. It changes even more between 22 and 30. Everyone always thinks that
you stop growing up at 18, but I can tell you that is sooooooo not true.
Anyway, the point is that it's too hard to guess with a lot of accuracy what
a) the job market is going to be like in 2008, and b) what *you're* going to
be like in 2008. Therefore, to make the most out of college, stay
interested. If that means physics, do physics.

> What skills should I have in order to get hired? My ideal programming job
> would be developing the next platform of blank, like .NET, DirectX or
> something entirely new and different. To date I've gotten a few jobs
> building some ASP.NET web applications, the major one being some
> accounting software for the City of Elk Grove, but no other work
> experience.

Well, one thing I'd point out is that for something like .NET or DirectX,
there are a very small number of people building it, but a very large number
of people using it. In other words, there's a lot more work out there
building ASP.NET web applications than there is writing DirectX 10.0. For
example, Managed DirectX 9 was written by one guy.

This is sort of good news and bad news. The bad news is obvious - what you
think is your ideal job is going to be very competitive to get. The good
news is that all of that other work building "business" applications,
actually turns out to be very interesting, and very lucrative. So don't
write it off - there are hard problems to be solved in every field, and good
programmers are needed to do the work. That said, *someone* has to write
.NET 3.0, and it might just be you. :)

My parting advice to you is that, regardless of what major you choose, be
sure to keep programming. Remember - it takes at least ten years to get
good. It sounds like you've already got a great start. (And you write well,
too, which is also a really good sign.) But make sure you take what you've
done already and keep building on it. Write code. Study design. Write more
code. Even familiarize yourself with some of the non-technology aspects of
programming like how team-based development works (e.g. pair programming,
test-driven development, etc.) You're going to need to do all of this - a
lot - before you can rightfully consider yourself an elite programmer. I
know I'm still learning.

Let me know if there's anything else I can do to help, or questions I can


P.S. Do you mind if I reprint your message and my response on my weblog? 


  1. Great post and great advice Craig.

    I'm going to forward this to my little brother, who is interested in programming, but unsure of what to do at University. So far my advice has been to take something that he's interested and/or passionate about, if nothing else it gives you a better chance of finishing and actually getting that degree.

  2. When I entered MIT, I knew I wanted to do Math, Physics, or Computer Science.

    By the end of my first year, I'd chosen Electrical Engineering as my major.

    During my summer jobs and in my free time, I never did any EE stuff, but I frequently wrote code.

    I graduated with a BS and an MS in EE after five years.

    Over the summer, I was offered a job doing software work for a very EE-oriented company, and a contract position doing straight software in a business context. I took the contract position, which led me to where I am today. No regrets.

    The point of all this is that it was a pretty random path from here to there. :)

  3. nice post, I can definitely relate...

    I studied Architecture for 5 years, worked for another 4 years in design/construction (started a small design company with my future wife), then suddenly took a totally different direction and ventured in the IT world, a Masters Degree in CS (MIT) and been working for the last 4-5 years, still a lot to learn. The statement "it takes at least ten years to get good." seems absolutey true, am still half-way and I think I'll even need more :)
    In that time, I've had an inclination to Web Dev & Web Design as well as DirectX lately so god knows what I'll be doing next, am at the stage where work is starting to become quite boring and my hobbies are a much more interesting direction to me so yes you can't plan for the long term... the key is not sticking to one thing all ur life or it gets really really boring ;)

  4. Have to echo the nice post, again, this needs to be said.

    I started as a CS major at a land grant college and was bored with the cirriculum and found my only challenge was the higher level courses that were all abstraction and not any programming. I decided to do what Craig suggested and study what I wanted to study. I went the Anthropology route and ended up writing some simulation software to model cultures and educational programs for Anthropology, but now I'm writing code for web applications and .NET apps that focus on user interaction. How do people respond to this application, and why. So find what you want to do in the realm of programming, if you want to write computer related systems, stay in CS/Math, but if you want to write business apps (like Craig said, where the $$$ is) study business and people. If you want to write games, study art, design, and physics. Find what you want to do and mould your program to that underlying goal.

    Odds are over time (took me six years) you'll find your niche, and even then you won't really be ready to stop finding new things to do.

  5. Nice post. But I will quibble slightly, otherwise what would be the point?

    a) Pursue your passions is absolutely dead on. But it sounds like John's passion is programming and for him to think he has exhausted this at 18 seems, well, to suffer from the exhuberance of youth.

    b) Many CS majors place far to much emphasis on learning languages and platforms. OTOH, any good CS degree will teach how to think about code. I see so many people in the computing world who wouldn't know an effective loop if it wrapped itself around their neck. Taking an Anthro degree won't teach the fundamentals of good code. Nor are you likely to learn them without directed focus.

    c) 10 years? Once you know how to think (very good point) and you know fundamental coding practices, you should be able to PROGRAM fairly well. But that is hardly the battle. Figuring out everything else, now that is the battle. Take some Psychology courses is my advice...

  6. a) Hey, if programming really is his calling, he'll wind up doing it no matter his degree. ;)

    b) Agree that Antrhopology won't teach you to code. But I'd argue that CS degrees won't either. More useful, yes, but not by much IMO.

    c) Agree.