I contacted Marko Misic about MUPS (multiprocessor systems) course that he held, and was told that usually people that listen to this course are interested in working an internship at NVIDIA. I got interested and started visiting course extracurricular. I first applied while in my second year of studies, but I never got contacted back. So, next year I tried again.
It’s good to have a current employee at NVIDIA to forward your application, and Marko Misic helped me get in touch with Andrija Bosnjakovic, who’s an NVIDIA employee. They both verified and corrected my CV and then sent it to the office. My CV was sent in the late November, and I got first response within two days.
In total, two teams contacted me for two different positions:
Infrastructure Architect (IA) and Software Engineer (SE).
After you apply with your CV, teams that are interested in you will contact you and try to schedule an interview. They will probably require that you send them your resume as well. (note that CV != resume)
My main resources were the books and websites mentioned in the Microsoft written test post. Re-doing programming problems, reading CUDA books again to freshen up knowledge, visiting bunch of websites regarding graphics pipeline and OpenGL specification. Reading object-oriented theory and patterns. I tried to cover everything that I possibly could, but after my first interview for the IA position, I focused more on the graphics and GPGPU rather than C/Cpp programming.
I prepared certain answers in advance, so I don’t spend too much time thinking. Where would I want to work an internship, why do I want internship, what do I know best, what I hope that internship will bring to me, my key skills, diploma project ideas – that were some of the questions that I had written down and answers were on my screen during the interview. I also included a list of the questions that I wanted to ask to a interviewer.
Also, learn about the company that you’re applying for. I knew quite a lot about the history of the company, and I followed latest news over Twitter, so that really helped.
Time for interviews!
It was a phone interview, and connection was quite poor, which made interview a bit more difficult. Questions were regarding classes, composition and virtual methods. “Could you simulate class inheritance with a composition?” I had to write code that mirrors each word’s letters in the sentence. So, “Hi there.” would become “iH ereht.” I wrote it in plain C, and was asked about thoughts on optimization, or translating it to a more high-level C++ code.
I wasn’t satisfied with my answers, so I believe that my interviewer wasn’t happy also. That was the only interview that I had for the SE position. That team later waited for a IA team to come with a decision before continuing with the second interview (which never happened).
Five days after sending my CV, I had first interview for the IA position. I wrote questions that I was asked during the interviews in the note after the interview, so I might have forgotten something.
Intro and basic programming questions (~20min):
- interviewer described the position of the IA, what do they do, how
- what do I know about NVIDIA?
- interviewer talked about his work and I was required to tell something about myself
- talk about complex and complicated software that I wrote (I mentioned 3D engine and OS kernel, but they were more interested in the project regarding the 3D engine)
- mark yourself between 1 and 10 how familiar are you with tech: Cpp, stl, boost, OpenGL, D3D, CUDA, OpenCL, Linux Bash
- some differences between Cpp and C
- what are pointers and references; differences
- how are virtual functions implemented
- how to optimize thick switch loop, compiler-wise
- you are given a phonebook. what’s the appropriate data structure to use if you want to a) search by name or b) sometimes search by name, but sometimes you want to iterate through it
- given a double linked list’s root, insert item at the second place
Getting more graphical (~35min):
- describe graphics pipeline
- ways to draw a circle on the GUI
- all ways to draw a triangle
- textured quad problem
Outro, questions that I asked the interviewer (~5min):
- how many interviews are there?
- internship location
I was really, really satisfied, and confident that I did well. Other colleagues informed what questions they had on their interview (all were for SE position), so I was really surprised that I was asked more about computer graphics than the usual programming problems. I was delighted to talk about graphics on the interview, so I was happy. Positive, both for me, and I believe it was also for the interviewer. I later asked my friends that were into graphics about the textured quad problem, but no-one was able to provide a correct answers to the problem, so I guess that question really helped me make an impression.
Second interview was via Skype, because phone connection was having some issues. Interview was a bit shorter than the first, and a lot less about programming. It was scheduled around 19 days after applying.
I was asked about my experience working with clients. How I treat them, how do I handle difficult situations and what I think that difficult situations are. I was asked about experience with libraries, stl, boost etc.
Interview wasn’t that formal at all, which I liked. We talked about our experience with clients on both sides, what I enjoy doing and how did I get started with all of it. It was more of a HR talk, than programming talk, well first half of the interview at least.
In the second part, I was asked to solve a real world problem. You are a sys admin and you are responsible that computers in the network get all the antivirus software’s updates so they stay secure. I was asked how would I approach that kind of problem, how would I solve it and then to describe exact technologies and methods that I would use to implement such system.
Interview was quite different than the first one. Barely and C/Cpp questions, no graphics or GPGPU questions. Talk was about experience with clients mostly, and that one real world problem at the end. Though, I was really satisfied how it all went.
I was told that there would be two interviews. So, I waited for some time for them to wage a decision. I was a bit surprised when they scheduled a third interview. Third interview was 40 days after applying.
This was once again very technical interview, over the phone.
- rate yourself 1..10 for knowledge of C
- explain hash tables, what are they good for, how to handle collisions
- Big O for array/hash insertion and access
- pointer and references; null reference in Cpp
- define encapsulation
- polymorphism, virtual functions, virtual destructors
- templates, what and how
- Shape, Rectangle and Square classes – what are the relations between those
- stack and heap memory; what’s a stack overflow (not a forum!)
- does OS allows mixing memory between multiple processes
- what is paging
Graphics and GPGPU:
- vertex, geometry and fragment shaders
- describe graphics pipeline
- what is CUDA kernel, threads, blocks, grid
We talked about my personal projects, 3D engine that I wrote and the research I was conducting at the time. Talk about problems, bugs and overall experience while working on those projects. After that, there was talk about real world problems:
- how would you debug the program if you only had the programmer-made error message displayed in the log
- handling massive log file issue – speed vs log data
- student course application problem
Outro: I asked abut the interviewer and its job, the IA team, about the position.
I was very satisfied with this interview also, and so was the interviewer, I believe. All interviews with IA team ended in a good mood, with quite positive feeling on both sides, I reckon. I haven’t wrote a single line of code during all three IA interviews. I was asked more to think and analyze problems, to talk outloud while thinking instead of doing an actual coding, which suited me well.
I got an email 60 days after I first applied, with positive feedback. Santa Clara, here I come! :)
Interview questions are reasonable and quite expected. I was positively surprised with questions regarding computer graphics. I was also first ever who got into a IA team (well, from my country at least), all other interns went to SE position. So, the conclusion that I could draw is – work on your area of expertise, the right team will spot you and contact you. Don’t focus you time and energy on certain topics just because. In my case, I should have spent less time looking into some Cpp low-level things that are really not related to the graphics, but hey, it all went well, so I won’t complain. I was just terrified by some questions that previous interns got for SE position, so I thought that that kind of knowledge is expected from me no matter which team I speak with, which is not the case.
Interviewers are nice and pleasant people. You have to try and understand their position, having interview with who knows how many people a day, they can also get tired. But, if you demonstrate you knowledge well and somehow express you persona, so they get to know you a bit in that ~1h, then all should be okay. Don’t be too stiff, which was happening to me at the beginning of the interviews, but there’s no reason for that stiffness to persist through an entire session.
I really liked the fact that I didn’t need to write code. Not because I’m bad at coding, but because that can complicate things. That one interview for SE required me to write code on paper and then dictate it over the phone, which, when combined with the fact that connection quality was poor, resulted in a small disaster. Other colleagues, when prompted to write code, used some kind of online collaboration tools, which is not a bad option.
There were moments when I wasn’t sure what was happening, or is my process still active. My advice would be – don’t hesitate to contact recruiters and ask them for updated. It will make you life easier and less stressful and it will show them that you’re interested and involved in the whole process. So, work on your process! That includes preparation, active involvement and friendliness during the interviews. It’s in your/theirs, best interest to find a suitable and enjoyable position/person to work at/with. If you have some concern or if you want feedback – ask!
Overall, I enjoyed the whole process, amplified by the fact that I got a positive feedback, of course. A bit of temptation, a bit of anxiety, but in the end, it came down to normal programming/graphics questions, and if you know that, you’ve got nothing to worry about.
Special thanks to Marko and Andrija for helping me during the process.