I had a phone screen with Infoblox last Tuesday for a Principal Software Engineer, Server position. I was in the midst of taking care of some family issues before leaving town, so in general, I did not perform as well as I might have otherwise.
"Are you currently working?
No, not currently.
"When was the last time you worked?
"Why did you leave your job?
To take care of personal and family issues.
"What are your strengths?
Protocol conformance, performance, and scalability.
"In HTTP, what is the difference between how are parameters are passed in GET and POST?
I wasn't sure, thinking he wanted information about headers that are used to pass information to the server. When I realized he meant URL parameters, I said via key/value pairs. (I probably should have given more information, e.g. http://example.com?key1=value&key2=value.
"In DNS, what is the difference between a recursive and an iterative query?
A recursive query returns the answer (if it exists). An iterative query returns the address of another server that should be queried.
"How is DHCP used by a client to obtain an IP address?
The interviewer's accent was very thick, so I wasn't sure whether he had said DHCP or HTTP. When he clarified, I wasn't sure at first, so I had to think about it, and said that I didn't remember the details, but a special DHCP request packet is sent to an IP broadcast address. (I probably should have said that I would use the DHCP RFC to get the details.)
"What data structure would you use to get the most used IP address in a log file?
After getting clarification of what type of log file he meant (ie. is it like an HTTP access_log), I said a simple way to do it was a hash table, keyed by IP address, such as is used in Perl.
"What is the difference between bubble sort and merge sort, and what are their orders of growth?
I said bubble sort is an exchange sort with an O(n2
) order of growth. In merge sort, the list of items is successively halved until individual items can be (pairwise) sorted, then the sorted lists are merged. Its order of growth is O(n
). He was pleased that I remembered the orders of growth.
"What programming languages have you used the most?
C and Perl.
"Have you done any object-oriented programming?
I said that I have programmed in Java and Python, but not recently.
"Have you done any multithreaded or multicore programming?
Multithreaded yes, multicore no.
"When using sockets, what is the order of system calls required to set up connections between a client and a server?
I couldn't remember what to do for the client side after doing a connect(). I asked for more time, but still couldn't remember, so I just said so, but I had done it before. (I probably should have said I'd check the man pages, at least. More on this later.)
"Are your family issues resolved and could you start working?
I said I hoped the family issues were resolved.
He then asked if I had any questions. In response to the usual questions I ask, he said that the engineering group has about 60 people located on several continents. However, his group has between 20-30 people. He doesn't write code anymore; he is more involved in project planning and hiring. In closing, he gave the indication that I might fit in better with a protocols group, and that he would send my résumé to some of the other managers to see what they thought. (I wasn't sure whether or not that was a good sign.)
So, as always, we'll see. I wasn't very happy with how I did on the sockets question. I've been asked that before, and done better, but this time, I didn't. On the way to the airport on the day after the phone screen, I spent some time reviewing the OpenBSD system calls related to client and server connection. (I'll go over the Linux system calls also. Although I don't think they differ substantially, it can't hurt to check, just in case.) However, I don't think the socket question was difficult (if you know in advance you're going to be asked it), but it's not something that someone is necessarily going to remember. When working on a nontrivial piece of code that uses sockets, the socket setup and any other associated system calls are usually the first part of the program written, so that basic interaction with peers can be established. After that is working properly, most of the attention is given to adding new functionality, resource management, debugging, etc.