- cloud? but ask Zhao Bin
- big data
- machine learning
Until I left GS, I didn’t know how it feels to “conquer” a sizable, lucrative tech skill. Such a tech skill represents a specific job market with supply and demand.
C++ interviewers may demand <del>c++ecosystem knowledge</del> but java also has its own ecosystem like add-on packages.
As I told my friend and fellow c++ developer Deepak CM,
Low level topics are tough
Q: Your resume says “memory mgmt” for c++, so what did you do personally, not as a team?
A: I will talk about the features in my system. Most of them are not written by me, honestly
Q: what core java QQ topics (not necessarily skills) to make you stand out from the crowd?
— second tier QQ topics
I have found core java and core c++ outstanding domains for my personality. I feel there are not too many similar domains with
… so we can hope to accumulate. Here are some comparable domains:
These are portable, longevity skills either for IV or GTD.
+1 +2 +3 .. = subjective valuation as of 2018
[grey color = portable financial domain skill, not tech skill ]
OMS — is probably a core module in execution system. Equity and FX systems tend to need OMS but many trading desks presumably need no OMS, very simple OMS or off-the-shelf OMS. A buy-side trading desk may simply use the OMS of the broker. The same could be said of “execution systems” like VWAP algos.
Therefore, I feel the importance of OMS/EMS is over-stated.
SOR — is more niche, less “generic” a skill, but as a module is more visible to the business.
FIX connectivity — is a more generic tech skill and shows resilience to churn.
mkt data — is more “separate” from the other skills.
Me vs a java guy having only a single long-term java project, who has more zbs (mostly nlg) and GTD power, including
When it comes to QQ and coding test scores, the difference is more visible than it is with GTD/zbs.
Conclusion — over 10 years, your portable GTD power grows too slow if you stick with one (or very few) system.
Am I advocating job hopping? Yes if you want to remain an individual contributor not aiming to move up.
I’d like to keep the table columns simple.
|2D coding Q||3->5||2018||2D||3|
|tail recursion||0->5||2017||x hours||1|
|big O analysis||7->8||2018||1|
|sorting algo nlg||7->8||2018||x hours||1|
|advanced recursion||3->5||2018||x Days||3|
|whiteboard best practice||6->7||2018||2 days||3|
|shared mem||2->4||2018||2 H||2||coding experiment|
|c++ for coding Q||3->8||2017||10-20 D||2||bbg|
|socket||3->6||17-18||x days||2||thanks to IV, not project|
|noexcept||0->5||2018||1 H||1||Trex IV|
|py basics 4 coding test||3->5||2|
As stated repeatedly, c++ is the most complicated and biggest language used in industry, at least in terms of syntax (tooManyVariations) and QQ topics. Well, I have impressed many expert interviewers on my core-c++ language insight.
That means I must have some expertise in c++ QQ topics. For my c++ zbs growth, see separate blog posts.
Note socket, shared mem … are c++ ecosystem, like OS libraries.
Deepak, Shanyou, Dilip .. are not necessarily stronger. They know some c++ sub-domains better, and I know some c++ sub-domains better, in both QQ and zbs.
–Now some of the topics to motivate myself to study
This classification helps me organize my java learning, but let’s not spend too much time on this imprecise concept —
So-called “java ecosystem” is anything outside the “core java” stack and include jxee plus ..
Combine with https://bintanvictor.wordpress.com/wp-admin/post.php?post=24064&action=edit ? no need… Don’t spend too much time! I keep this list only as motivation and reward, but I don’t want a long list. I want heavy-hitters only, non-exhaustive.
Note “Take-up/Conquest” mean … I now feel as competent as my interviewers on that topic.
Note QQ means … hard topics unneeded in any project.
[3=top-33 favorite topics among ibank interviewers]
[d=reached some depth of understanding]
We often call these “obscure details”. At the same level, these are a small subset of a large amount of details, so we can’t possibly remember them all 😦
Surprisingly, interviewers show certain patterns when picking which technicality to ask. Perhaps these “special” items aren’t at the same level as the thousands of other obscure details??
These topics are typical of QQ i.e. tough topics for IV only, not tough topics for GTD.
These are the features I feel likely to turn up in production source code or interviews, so you need to at least recognize what they mean but need not know how to use exactly. (A subset of these you need to Master for writing code but let’s not worry about it.)
List of operators, keywords and expressions are important for this purpose
Most built-in Methods are self-explanatory.
Challenge — to implement non-trivial logic quickly, cleanly, with assurance and peace of mind.
Default (stupid) solution is a java/c++/c# implementation – painful. The challenge feels like a stone wall to drill through. The following technologies are good dynamites. (Additional Background — often, there’s a legacy Prod codebase…)
#2) SQL execute immediate
* embedded db
* multiple-statement SQL batch to implement complex logic
* byte code engineering
* DB constraints to replace app validation
* MOM as concurrency tool
* DB as concurrency tool
* file system as concurrency tool
I don’t fancy dependency-injection, ORM, ajax.
(another blog post)
Problem — in any bank, a contractor or employee at any age could lose job due to many reasons – economy, new boss…
Problem — too many young developers join the job market every year, often from overseas
Problem — we aren’t getting younger 🙂
Problem — waves of new technology
If anyone doesn’t feel the need to worry about it, i feel that’s unwise. One of my strategies to survive is focus on old and core technical topics –
* threading. Wall street always likes threading, even if their system doesn’t use threading
* data structures – java collections, STL, trees, pointers, basic arrays and basic strings (both outdated but extremely relevant)
* OO – static vs non-static, HASA vs ISA, abstract, constructors/destructors, proxy
* DB table + data model design
* DB tuning
Other areas I like
– memory mgmt
These technologies didn’t change for the past 10 years, except some new GC algorithms.
–Most imp to hiring and productivity–
swing, wpf — more complex than all other tools
pnl rollup, MTD, unrealized.. is imp to traders
mastery over db query
general low latency techniques
gemfire — imp to both risk and real time pre-trade. Let’s xx2set up
trade booking, cancel, MOD
java OOM — simple techniques
position mgmt is important to traders
trade blotter basics
(context — IV, not performance) When you compete for trading jobs in SG, you must show convincing value-add otherwise why should they pick you rather than some regular java guy in SG with 15 years xp?
— ranked in terms of entry barrier
Even though we can pass most java interviews (in the east coast:)), I find myself learning bits of practical java how-to on a *daily* basis.
* ant and JVM launch script
* thread pool
* concurrency constructs
* callback listeners
They present everyday challenges to a intermediate developer like me, so better knowledge does improve problem solving, code t r a c i n g and design. These challenges illustrate one reason why I feel less proficient in java than in Perl. I can solve most *practical* Perl problems. Java is bigger and present more “problems”. As I spend more years in java, I hope to pick up more know-how. Therefore java remains my primary study subject, along with c++.
In the list above, I have deliberately omitted vendor products as they aren’t core java IMO. But obviously there’s a lot to learn in them.
What skills make you a more resourceful and *productive* developer to a fast-paced trading system? These usually have little to do with arch design. Almost never asked in interviews, ironically.
See also my post on 2 types of tools.
1) IDE remote debugging
** breakpoint on exception
** conditional breakpoint
** compile with local vars
2) IDE refactor — rename, search
) reflection, dynamic proxy
) jconsole, JMX
) requesting Runtime.gc()
) generics for algorithm abstraction but this tends to be too complex
) code gen? cache triggers
Threading? nope it seldom adds too much biz value
I said before that core java trading system developers need a few special skills
3) data structures and algorithms
?) distributed caching — trading system often avoid hitting database, so they keep large amounts of data in memory
?) java tuning
?) distributed computing using RMI, web services, ejb etc
?) Spring DI beyond MVC
#1 and 2 are the most broadly recognized requirements.
Now I feel most of these skills are built on top of fundamental java skills. Messaging system uses threading, serialization, data structures. Caching uses threading, data structures, serialization …
I don’t know a well-defined list of “fundamental java skills” but interviewers often zoom into threading, collections and OO. Among these, threading presents the highest complexity, but most applications stick to well-tested fool proof patterns.
I feel java generic collections (in a multi-threaded environment) is perhaps the 2nd in complexity. (I realized this after reading c++. C++ generic collections are quite a bit messier than java.) Most java developers I know never need to go beyond scratching the surface of generics.
In conclusion, to pass interviews, over-prepare on threading and collections, and prepare for high-level questions on messaging. To be a good trading programmer, become really good at threading and serialization… among other things
* java/javac command line options
* null pointer prevention
* familiar with ide, esp. (remote) debugger
* familiar with logging tools/techniques to simplify logging to the extreme
** add logging without impacting existing code.
** tracing proxies?
* lots of asserts
* jconsole* get compiler to help prevent potential issues
* memory profiler?
* thread dump analysis
* sound concurrent architecture (high-level) to(low-level) idioms
Other survival skills/toolkit
* cvs familiarity
* lsof, tcpdump
* core dump analysis
* system memory investigation? never seen such a need
* unix scripting? probably
* vi, find, grep…
ptr to ref; ref to ptr
ptr to method
new/delete global overload to intercept new/delete operations
scoped typedef, namespace
static initialization sequence
Note: MOM, spring, hibernate, data grid … aren’t core java and out of scope.
— Below are needed only in rare situations, IMHO
memory management — leak detectors, garbage collection, weak (soft) references, memory profilers,
jdk and cglib proxy
custom class loaders
byte code engineering
JVMTI — (eg jprobe) powerful tools to analyze production systems.
real time java
(another blog post)
Any powerful technology requires learning. Whatever learning effort I put into EJB, Corba, struts, JSP, JNI, J2ME, Swing, AWT, rule engines .. are becoming less and less valuable to employers. The march of java is merciless. How merciless? Even the creator of java – Sun microsystem – has to go open source on both java and Solaris just to survive, and sell itself to Oracle.
I am now very careful not to invest myself too heavily into anything including popular must-know stuff like Spring, hibernate, distributed cache, EJB3, AOP, CEP, JSF, GWT, protobuf, web services, design patterns, RMI …
I think most of the above are jxee, not coreJava.
Instead, I seek stability in older core java technologies like threading, collections, serialization, messaging, reflection, …
(C++ is even older and more stable, but this post is all about java.)
(to be published on blog, no need to reply)
I wrote about the same topic in a 2007 email to you — http://bigblog.tanbin.com/2007/12/interview-topics-are-irrelevant-now_10.html, and you replied — http://bigblog.tanbin.com/2007/12/fwd-interview-topics-are-irrelevant-now.html.
My GS experience shows that I could be somewhat slow initially, when getting up to speed on an unfamiliar system. Now i’m feeling a similar “teething pain”.
Now, what technical knowledge do highly *productive* developers tend to have in common?
* IDE — big area i am lacking, though i used IDE’s extensively since 2006.
** ant integration and external build tool
** cvs/svn integration
** content assist
** setting classpath
** using multiple versions of jre system library
** remote debugging? few know it but it’s powerful
* java generics
* junit — how to run, debug, write
* cvs/svn — synchronization, tortoise, branching, tagging
* ant, maven, ivy
* unix — grep, find, vi …
In GS and my new team here, I have met a few experienced java developers who know Eclipse a lot more than I do, just like I know Perl and Unix more than others. I learned so much Perl by reading and using advanced features — things like the O’Reilly cookbook tricks and tips.
 initial 2-4 months