This is more or less the talk that I gave to some OU honors students on September 3, 2015, as part of a sort of lecture series on ‘Majors and Careers in a Volatile Economy’. It seems mostly correct in retrospect, if not terribly well-written:
My name is Tim Burr. I graduated from OU with a Bachelor’s in CS/math in 2011, and finished a CS Master’s in 2012. After that I moved to Boise, ID where I live and work as a software developer for a medium-sized company called Clearwater Analytics. More on that later.
Some of you may be trying to decide what you should study here at OU, and so Dr. Ray asked me to come down and tell you why you might find Computer Science to be a good choice. Maybe some of you are already studying CS; I want to talk to you about how to find internships and jobs, and what it’s like to be a professional software developer. Before we get started, I’d like to share a couple of things I’ve noticed:
* A lot of people will give you advice in order to validate or feel good about decisions they have made. This seems to happen whether or not those decisions were good ones, and so you should always be at least a little bit skeptical whenever someone tells you to do the same things they did. This is extra-true of people who are much older than you; a lot of advice that was just fine in 1985 is terrible now.
* In general, people tend to explain their successes in terms of their own effort, and their failures in terms of bad luck. Our outcomes are obviously shaped by the choices we make, but luck is always there to a degree that terrifies me whenever I stop and think about it. People will always tell you how hard they’ve worked to get where they are, but never how lucky they’ve been.
Hopefully you will keep this meta-advice in mind as I tell you how to do the things I’ve done so that you too can get lucky and land a pretty sweet programming gig. Please take all of what follows with an appropriate helping of salt.
First of all, how do you decide if you would even like to study CS? If you’ve never programmed before, your best bet is to try it. There are approximately a million free programming courses online: CodeAcademy, Khan; Stanford and Georgia Tech offer some good ones through Coursera… Here at OU, Java 1 or Programming for Non-Majors can be applied as gen-ed credits toward basically any degree, so the cost to take one of these is low. It’s definitely not for everyone, and if you take one of these classes and hate it then maybe write it off as a learning experience and move on. But some of you will find that you enjoy taking a broken program and figuring out how to make it compile. Or making a change, and seeing the result show up right in front of you, maybe on a screen or maybe in the behavior of the robot that you are programming. Being a dev is kind of like going to school, kind of like solving logic puzzles, and kind of like building things out of Lego. If any of those seems appealing to you, CS might be right up your alley.
The next thing I want to say might seem kind of crass, and it comes with a ton of caveats, but there are worse reasons to pick a major than money. Don’t get it twisted, there are many better ones. But if you really don’t know what you want to do, you might as well give yourself options. If you get decent grades and learn the material it isn’t hard to make bank right out of school with a CS degree, which I don’t think is the case with a lot of majors.
No script, talk about: work/life balance, vacation/travel opportunity, etc.
How do you know if you’ll be any good at it? Again, really the only way to find out is to try. Movies and TV shows have this trope of the brilliant coder who locks himself into a room and emerges weeks later with a working prototype of Skynet or something. I’ve actually met a couple of people like this, but they seem to be a tiny minority. Being a genius is probably really nice and helpful, but if you can understand the difference between a variable (which is just a box that holds some value) and the value itself (which might be a string like “Hello world”, or the integer value 48, or something more complicated) and are willing to work kind of hard, you should be fine.
Before moving on to the next section, I’d like to talk about one particularly terrible way to decide if you are good enough at CS: whether or not you look like the people in your CS classes. I was a TA during grad school, and noticed a pretty weird pattern while grading homework: grades for white/Asian guys tend to be distributed in a rough bell curve, like you would expect. Minority students tend to be almost the inverse of that: either at the very top of the class, or in danger of dropping out. With I can’t prove this, but I suspect that this is b/c the middle of the pack has self-selected out. Everyone doubts themselves sometimes. “Can I do this? Am I smart enough?” I suspect that it’s pretty easy to look around and notice that there aren’t a ton of people like you, and just kind of shrug and say “maybe this isn’t for girls after all…” And that’s a shame. For every black/Hispanic/female student that does this, there are like three white guys asking themselves the same question and deciding to stick it out. Clearly white/Asian men are not generally too stupid to program computers, since you see them doing it all the time.
I was exposed to programming in high school, which is maybe more typical for white dudes than some other demographics. Setting that aside, I am here to tell you that there is nothing special about white dudes. If we can do it, so can you.
You’ve probably heard all about how you should be looking for internships. These look good on your resume and really do teach you a lot. A CS education is heavy on stuff like finite-state automata, which are really interesting but turn out to not be very useful in solving most of the problems that you will actually encounter in the wild. Conversely, your schoolwork tends to be light on the day-to-day logistics of writing, managing, and debugging code. That’s a shame, since familiarity with version control systems and design patterns and other kind of mundane tools can be hugely helpful for you as a student. Who’s had the experience of pulling an all-nighter to hack on some project? You work until 5am, crash out, and when you wake up your program is in a worse state than it was the day before. How do you put it back in that earlier, less-broken state? Something like Git or TortoiseSvn solves this problem perfectly, but you could make it to your senior year without hearing about these. So maybe you devise some kind of awkward backup system like I did, or maybe just roll the dice every time you save your code. If you do that, then stop it. As an intern have a great opportunity to learn about a whole bunch of different classes of problems, and how people are solving them in real life. I want to suggest to you that these solutions can be really helpful with the problems you are trying to solve for your classes. Finally, a development internship should just give you a lot of practice writing software. Like anything else, the more you do it, the better you will become.
So internships are important. This might not be true at other companies, but at Clearwater potential intern candidates are judged much more leniently than potential full-time hires. Hence it’s easier to get hired as in intern, but if you do a good job, you will almost certainly be offered a full-time gig. How do you get an internship? At Clearwater, the interview process runs like this: if you apply online, there is a phone screening to make sure that you have some clue what you are doing. If you apply at a career fair, introducing yourself to someone like me and maybe signing up for an on-site interview serves this purpose. Next you’ll typically do a phone interview with a developer, who decides whether it’s worth flying you out to interview in person. This interview is actually a series of four or five one-hour interviews where you will probably be asked some math/logic questions, do some pseudo-coding on the whiteboard, and teach your interviewers about something you care about. This could be the topic of your master’s thesis, how to play Dungeons and Dragons, or the basics of World War 1-era trench warfare. I did not make any of those examples up. If this sounds brutal it’s because it kind of is, but it seems to work and we end up with really competent people.
We can talk about interviewing more if you have questions, but first I want to give you some tips that I am pretty sure will help you:
* Ask questions. I’ve just asked you to write some function on the board, and you aren’t sure if it should take a Double or an Integer as an argument- ask! A reasonable person will not dock points for this. I may have even asked a question without telling you all of the relevant information, to see what you do. Making assumptions about what people want is not the right thing to do- in fact it is a huge source of bugs.
* Tell me what you are thinking. This helps me to see what your thought process is like. It will be helpful to you too, since I can stop you and clear up a misconception.
* Typical interview subjects: object-oriented design, time complexity of algorithms, simple coding problems
* Relax! If you don’t get this job, there will be others. It might help to think of any given interview as a practice run. I didn’t get the first job I applied for; you probably won’t either, and that is okay.
Imagine that you are a large company, perhaps one named after a fruit. You’ve been selling a bunch of handsets lately, and now you find yourself with a lot of cash on hand. Someday you may want to spend that money on a giant mecha-Steve Jobs, or on R&D for iBlunts by Dre or something. But what do you do with it in the meantime? You can’t just walk down the street and open a savings account, so in practice you end up with what’s called a Corporate Treasury Dept. This operates like a hedge fund, buying bonds and stocks or authorizing various asset managers to buy them on your behalf. The result is a portfolio of many thousands of securities, held in maybe a few dozen accounts. It turns out to be a pretty difficult job to just figure out what you own on a given day, much less figure out the risk profile or how much you should expect in coupon payments next month.
Clearwater (the company I work for) exists to give our clients insight into this stuff. We are a Software as a Service company, which just means that we operate a web site and charge people to use it (as opposed to charging them for software which must be installed on their computers). This makes us more agile, for a variety of reasons that we can talk about in the Q&A if there is any interest. If we decide it’s a priority, we can turn around most client requests in a week or two, rather than the six months it can take to get code written and deployed off-site.
So that’s who I work for. My job is to either build new software for our clients, or to fix problems in the existing code. Some cases are super-interesting, some are really tedious, and most fall in between. We are mostly a Java shop, but I’ve recently switched to a new team that does a lot of web development in JavaScript (which confusingly has nothing to do with Java). We work on teams of 6-12, mostly in open plan offices. There is a lot to like about this style of work, but it requires good headphones and a taste for electronic or classical music whenever you are trying to get things done while the people behind you are having like three different conversations about SQL query optimization or modeling derivatives or whatever. My bosses are very flexible about my hours. I typically work a 9-5, but as long as I put in 40 hours a week and my work gets done, nobody cares. It’s not a big deal to work a little late on a Thursday and then dip out early for Friday happy hour, or a dentist appointment or whatever else. With the exception of a few team leads, we are not allowed to work from home for security reasons, which is kind of a drag.