Do you have to be a computer science major to work on Microsoft products? NO you don't.

While my major is computer related, I'm afraid it's not technical enough to assure that I become a competitive candidate. So I'm wondering what you would say are the core technologies candidates should have to be competitive and any other tips you can offer.

I’ll address this for interns and full time hires for the product groups at Microsoft.

The short answer is that we don’t require any specific major and what we are looking for are the skills associated with the three core technical disciplines at Microsoft (Software Design Engineer, Software Design Engineer/Test, Program Manager). Being a computer science major (or computer engineering if your school has that) is helpful only because it is usually the place the recruiters go looking. However, don’t let the lack of a specific major stop you from applying if you think you meet the core skill requirements outlined below.

But above all, the most important thing for you to possess when considering Microsoft is a passion for software and bringing software products and services to market. If you aren’t excited about software then Microsoft isn’t the right place. If all you want to do is “make money”, or “get a sense for how things are done” then there are probably places that are a better fit.

Just taking a look back, computer science is a relatively new major at many universities (new compared to say Physics or Political Science). In many schools computer science is an off-shoot of Math or Electrical Engineering. So early on at Microsoft we would expect to see lots of hires from technical fields, not necessarily computer science. We still see that, though with the prevelance of comp sci folks who want to work in software generally find that major. Some of the very very best programmers I’ve known at Microsoft never studied computer science formally—some studied Music, Physics, Math, etc. Cornell always made it very clear in their requirements for graduation that your major was not a career choice, but rather it was a necessary part of graduating to have in depth coursework in one area. So I majored in Chemistry (and comp sci) J

Software Design Engineers (“developers”) are going to write production code that ships to customers. So for this job you are going to need to know how to program. The following are some of the core programming skills you should be familiar with: high level languages (C++, Java, Scheme—beyond scripting HTML), data structures (linked lists, trees), machine architecture (instruction sets, virtual memory, hex math), and algorithmic concepts (complexity theory, recursion, abstraction). You will notice that this list is not a list of Microsoft technologies – we love to see that, but by and large over the course of your career you will learn many languages, toolsets, and runtimes so mastering a specific one is cool but you will not be quizzed on the keyboard shortcuts of the IDE that you use. A significant portion of development at Microsoft is in C++, which does often prove to be challenging for folks that went to programs that teach exclusively in Java. We try hard to interview without a bias towards the language, but rather to gauge how fast you will be able to pick up a new language. A good acid test of your skills would be something like “if someone told you that you needed to implement the Java Collection classes, how would you do it”. If you have no idea except going to the reference book and just using the Collection class then being a Software Design Engineer is probably not for you. But if you could write a Collection class only using some of the primitives of Java then go for it!

Software Design Engineers/Test (“testers”) require many of the same coding skills as developers and will put those to use routinely. The primary differentiator is that the code testers write generally facilitates shipping software code, but is not itself a product customers will run. In addition, there are significant differences in the types of problems being solved and the approach. Whereas a developer might have to implement a Collection class, a tester really looks at that and says “how do I figure out if it really works”. A tester would put their problem solving and coding skills to work demonstrating that the code meets the specification or satisfies all the boundary conditions. A cliché about testers is that they like to “break things”. I don’t think that is exactly fair, but perhaps a way of looking at the difference is that a tester definitely likes to focus on insuring that things operate the way they are supposed to, rather than claiming they operate correctly. With testing, you generally do not need as much specific background as developers in terms of data structures and algorithmic concepts, which is why we see a lot of success with testers hired from all sorts of “technical” majors. Many of our senior test managers in Office have backgrounds in physics, math, operations research, or a whole host of other majors where you learn critical thinking and problem solving and become significant users of computers and programming.

A Program Manager (“PM”) is a job that is unique to Microsoft. You can read lots about this in Michael Cusumano’s book (somewhat dated) Microsoft Secrets. This job was created as a way of bridging the “gap” one often sees between customers and developers, and at the same time the idea is to allow developers to focus on what they love to do (write code) and testers focus on product quality while PMs go and develop a product specification that meets customer needs. Program Management is a highly technical position of course and you must have in depth knowledge of how software works and how people interact with computers. You don’t write any code, though knowing how to write code is super helpful. Important skills for program management would include communication, negotiation, organization, and important character traits would include empathetic and detail oriented. Chris Pratley has written quite a bit on what program management does so check that out. Successful PMs can be found with all sorts of backgrounds including anthropology, linguistics, political science, art and architecture, music, etc. But of course many program managers come straight from computer science as well. If you worked on a group project in computer science and somehow found yourself trying to orchestrate the work of the team, filling in the holes, and writing down the details of how things should work, and then presenting the work to a professor or class then you just might be a program manager. One thing to keep in mind is that the job title is a bit misleading as program managers don’t really program and don’t manage the project. What a program manager does is “manage the program” where the program is a feature area of the software.

A neat thing about these three jobs at Microsoft is that they are all peers. People new to Microsoft, but with industry experience, find this awkward because they are used to an org structure where test reports in through an engineering manager who manages development and test, and the specifications come from product management/marketing in the form of a “market requirements doc”. If there are any specs that are detailed then development writes them, but these are usually architectural. At Microsoft we have “triads” of development, testing, program management that work on the code together from the beginning. This is a super important organizational concept and one that I think adds a lot to how we build end-user software in Office. It also says that consensus and understanding different viewpoints are an important part of building products. Successful members of a team at Microsoft work across the other disciplines to get their job done.

So basically, the big tips I would offer, to answer the email question:

Be passionate about software

Know the concepts behind computers, and understand how those are reflected in a specific system

Understand what drives you and where in the triad you think your personality and character puts you