This is one of the longest tech interviews and one of the most enriching 🙂 even though I don’t “like” all their questions — very academic/theoretical, text-book driven, too low-level to be practical, not testing practical zbs.
Q: Any consistently reliable technique to detect stale order in your book?
Q: what’s your frame size if your tcp/ucp buffers sizes are so large?
Q: experience storing ticks?
—— C++ questions:
Q1: how can you avoid the cost of virtual function?
%%A: enum/switch or CRTP
Q1b: what’s CRTP
Q: what if your copy ctor signature is missing the “const”?
%%A: you can’t pass in temporaries or literal values. Such arguments must pass into “const &” parameter or “const” parameter. Correct.
Q: double delete?
Q: policy class? traits class?
Q: STL binders.. use case?
Q: how many types of smart pointers do you use?
Q: difference between java generics vs c++ templates?
%%A: type erasure. Java Compiler enforces many rules, but bytecode saves no info about the type argument, so we can get strange runtime errors.
%%A: template specialization. Template meta-programming
%%A (accepted): code bloat since each template instantiation is a separate chunk of code in the object file and in memory.
A: I have a dedicated blog post on this.
Q: what’s returned by a std::queue’s dequeue operation when it’s empty?
AA: undefined behavior, so we must check empty() before attempting dequeue. I believe ditto for a std::stack
Q: why template specialization?
%%A: customize behavior for this particular vector since the standard implementation is not suitable.
Q: how do you implement a thread-safe c++singleton
A: not obvious. See concurrent lazy singleton using static-local var
Q12: in a simple function I have
vector v1 = {“a”, “b”}; vector v2 = v1; cout<<….
What happens to the ctor, dtor etc?
A: 2 std::strings constructed on heap, vector constructed on stack; 2nd vector copy-constructed on stack; 2 new strings constructed on heap; vector destructors deletes all four strings
A: the actual char array is allocated only once for each actual value, due to reference counting in the current std::string implementation.
Q12b: you mean it’s interned?
Coding question: implement void remove_spaces(char * s) //modify the s char array in place. See %%efficient removeSpaces(char*) #Wells
—— threading, mostly in java
Q: What are the problems of CAS solutions?
A: too many retries. CAS is optimistic, but if there are too many concurrent writes, then the assumption is invalid.
%%A: missed update? Not a common issue so far.
%%Q: Synchronized keyword usage inside a static method?
AA: you need be explicit about the target object, like synchronized(MyClass.class)
Q21: Name 3 effects of java volatile keyword — Advanced. See 3effects@volatile ] java5.
Q21b: analyze the double-checking singleton implementation.
staticInst = new Student(); // inside synchronized block, this can assign an incomplete object’s address to staticInst variable, which will be visible to an unsynchronized reader. Solution – declare staticInst as volatile static field
—— System programming (ANSI-C) questions
Q: have you used kernel bypass?
Q5: how do you construct a Student object in a memory-mapped-file?
%%A: placement new
Q5b: what if we close the file and map it again in the same process?
%%A: the ptr I got from malloc is now a dangling ptr. Content will be intact, as in Quest
Q5c: what if Student has virtual functions and has a vptr.
%%A: I see no problem.
Q: you mentioned non-blocking TCP send(), so when your send fails, what can you do?
%%A: retry after completing some other tasks.
Q4: why is UDP faster than TCP
%%A: no buffering; smaller envelopes; no initial handshake; no ack;
%%A: perhaps most important for market data — multiple recipient with TCP is very heavy on sender and on network
Q4b: why buffering in tcp?
%%A: resend
Q: can tcp client use bind()?
%%A: bind to a specific client port, rather than a random port
Q6: is there socket buffer overflow in TCP?
A: probably not
Q6b: what if I try to send a big file by TCP, and the receiver’s buffer is full? Will sender care about it? Is that reliable transmission?
A: Aquis sends 100MB file. See no overflow]TCP slow receiver #non-blocking sender
Q: in your ticking risk system, how does the system get notified with new market data?
%%A: we use polling instead of notification. The use case doesn’t require notification.
Q: any network engineering techniques?
Q: what kernel parameters did you tune?
—— Stupid best-practice questions:
Q: what’s the benefit of IOC?
Q: Fitnesse, mock objects
Question on j4 factory. See separate blog post.