C++的用途和意义
总体来说,C++是一门软件开发语言,它的流行度在减少的。主要原因在于语言的复杂和灵活导致软件的开发成本高,这体现在开发周期和人力上。
它不适合startup公司的快速开发,也不适合对性能要求不高的软件系统中。
C++的优势体现在语言的灵活和对底层的控制,比如内存分配和释放,和其他硬件的交互能力上,这导致在对性能要求高的系统中它能够体现价值,在金融业常用的两种系统,衍生品定价系统(包括风险控制的计算系统),以及低延迟交易系统。这也是金融行业对Quant常常要求C++的原因。
因为C++的用途局限,一般建议程序员多学一些其它语言,如Python,JavaScript,R,Java,Scala等。
C++入门
C++入门最推荐的书是C++ Primer,或者The C++ Programming Language,二者选一即可。
读之前最好有一点编程的基础,不管什么语言。
这些书的内容很多,应该侧重于理解概念,而非单纯记忆。
算法和数据结构
对C++来说,首先要了解Standard Template Library中提供的数据结构的复杂度以及常见的实现。
了解各种算法,可以参考算法导论CLRS的前17章,Cracking coding interview等书,这些书采用的语言并不重要,主要是了解算法。
Leetcode的easy和median难度的题目可以用来练习。
C++进阶
可以阅读Effective C++,Effective STL,C++ FAQ(website)和一些编程规范(数千行代码量)的project。只有在project中才能真正学习。
C++11
C++ Primer第五版已经涉及,另外还有,Effective C++,C++11很重要,有很多改进需要了解和掌握,在程序中善于运用。
这里举一些比较有代表性的,move samatic,rvalue reference, range based on loop,override keyboard, static assert, initializer list, lambda ,etc. Boost Library 的常用内容包含在C++11中,建议先掌握C++11再关注Boost的其他内容。
软件开发环境
Version Control. Git是主流,在老的开发组可能还在使用SVN或者CVS。这是团队开发必须掌握的工具。
Testing. Production code的设计要考虑到可测试性,所有代码在release之前都要进行测试。测试的设计,自动化等工作也是需要功夫的。
Build System.常见的C++build system 有Make,CMake,Automake,scons,Visual Studio等,至少使用一种,了解Gcc的使用,了解如何使用第三方库。
Debugging/profiling tool:Valgrid memcheck,Cachegrind, gprof, OProfile, etc.
行业相关:衍生品定价系统
这种系统以计算为核心,需要数值计算,并行计算的知识。现在的CPU也比较流行,一般使用nVidia的CUDA,并行计算也有使用MPI的。另外系统的跨平台特性和其它系统和语言的接口也是开发的要点之一。
行业相关:低延迟交易系统
交易系统比较注重底层的了解。Memory alignment,multithreading,networking communication,cache friendliness,如何保证系统的高可靠性,这是值得注意和学习的地方。建议学习SEC对Knight Capital Trading error事件调查报告。