By: Tara Gu, MEng 2015
Brief Biography: Dr. Andrew Hilton is an Assistant Professor of the Practice in the Electrical and Computer Engineering Department at Duke University, and the Managing Director of Graduate Studies for Electrical and Computer Engineering. He’s the recipient of 2015 Klein Family Distinguished Teaching Award and teaches ECE 551 and 550, which are very popular foundation programming courses. Before coming to Duke, he was an Advisory Engineer at IBM.
Q: You mentioned in class that you enjoyed programming when you were young. How did you get in the field of Computer Architecture specifically?
A: I was an undergrad at Georgia Tech, working in compilers and programming languages. I also went to UPenn for a PhD in programming languages. When I was there, I took a graduate a computer architecture course, much like ECE 552 here at Duke. I really enjoyed the class. The programming languages research happening at Penn was much more theoretical, proving things about type systems, which wasn’t exactly what I was interested in. So, I switched to computer architecture in my second semester.
Q: What did you work on at IBM?
A: I did performance modeling in support of a core under development, much like the simulator students work with in ECE 552, but much more advanced. I got to influence the design a lot. One of the things I did was go to the designers and tell them “you can do this, and this is why: it improves IPC (instructions per cycle) by 2%”. The designers might say, “2% is great, but we can’t implement this; can we do this instead?” Then I would work with them to find a middle ground, and might find something that improves by say 1.8%, which they could implement. I also did performance verification, where I took the VHDL code for the core, and ran it. There was an infrastructure that recorded on what cycles various things happened for each instruction. I compared that with our software simulations. When they didn’t match up, I worked with the designers to fix it and tried to find alternative solutions in the middle.
Q: Given your experience in the industry, what qualities do successful engineers possess? What personality traits have helped them succeed in their field/business?
A: One of the most important qualities in not only engineering, but any profession, is discipline under pressure. Doing it right, and precisely, the way you’re supposed to, under time pressure. Not panicking when things are going wrong. It’s important when you’re developing software because you can’t say “I only have 2 days left, so I’m going to skip testing this code,” and get the product out of the door. You’re better off in many ways to test it while you build it, and sticking to a disciplined approach. For engineering specifically, problem solving, creativity (i.e. solve problems in ways that aren’t immediately apparent) are also very important.
Q: You emphasize for students to develop both foundation (good programming skills) and technical depth (knowledge of a sub-field) in order to have the best chance in finding a job. However, companies like Google, Microsoft, and Facebook give interviewees generic live coding questions, instead of asking them about their technical depth. How do you think students can advertise their technical depth to companies in their job search process?
A: First, if you want to have a programming job, you need to be a good programmer. A lot of programming interviews are trying to separate who can program and who can’t. If you can’t program, you can’t get a programming job. Beyond that, emphasizing technical depth comes into the kind of jobs you’re looking at. Take you for example (referring to me as his student). If you take classes and are interested in distributed systems and performance, you apply to cloud-related jobs over machine learning jobs. After you get past the “can you code” stage, people will start asking you to talk about deeper things. If you apply for a machine learning job, you would be lost because you haven’t taken any machine learning classes.
There are two ways you can sell yourself. Take me for example. I’m an excellent programmer, so I could sell myself simply as “I’m a coder”, but my skill set goes much deeper than that. A better way to sell myself is “I’m a micro-architect, with a firm knowledge of performance modeling, optimization, parallelism, and compilers”. The later sets you up for a much more advanced position, and, of course, still requires great programming skills. You should apply to specific jobs that match your area of expertise.
Also, a lot of students worry so much about getting a job that they sound very desperate and unconfident. If you are good at programming, you should know that and be very confident. Language and cultural skills are also important. Some people are technically proficient, but if they can’t explain things well, it’s hard to tell they’re technically proficient. Even if you can convey that you are good at what you do, the interviewer is going to be thinking about how you will work in teams. If it would be difficult for you to integrate into a work environment where you need to communicate in English, they will probably want to consider another candidate.