1.C++的用途和意义

总体来说,C++作为一门软件开发语言,它的流行度是在减少的。主要原因在于语言的复杂和灵活导致软件开发成本提高,这体现在开发周期和人力上。它不适用于startup公司的快速开发,也不适合用于普通的对性能要求不高的软件系统中。C++的优势体现在语言的灵活和对底层的控制,比如内存分配和释放,和其他硬件的交互能力上,这导致在对性能要求高的系统中它能够体现价值,在金融业常用于两类系统,衍生品定价系统(包括风险控制的计算系统),以及低延迟交易系统。这也是为什么金融行业对Quant常常要求C++的原因。因为C++用途的局限,一般建议程序员应多学一些其他语言,如Python, JavaScript, R, Java, Scala等。

2. C++入门

C++入门最推荐的书是C++ Primer (注意,不是C++ Primer Plus) ,或者The C++ Programming Language,二者选一即可。读之前最好已经有一点编程的基础,不管什么语言。这些书内容很多,应该侧重于理解概念,而非单纯记忆。重要的概念理解后自然会记住,一些不是很重要的概念一时记不住也没有关系。C++的概念和规则很多,就算是有经验的C++程序员有时也需要google一些语言规则。在这个阶段应该掌握重要的概念。

这一阶段以后可以思考下面这些问题。

Difference between pointer and reference?

i++, ++i, which one is better?

Why use virtual destructor?

What is the signature of a copy constructor/ assignment operator?

How to specialize a class template?

What are the four types of casts in C++? Usage?

etc.

3. 算法和数据结构

对C++来说,首先要了解Standard Template Library中提供的数据结构的复杂度以及常见的实现。了解各种算法,可以参考算法导论CLRS前17章,Cracking coding interview等书,这些书所采用的语言并不重要,主要是了解算法。Leetcode的easy和median难度的题目可以用来练习。可以思考的问题有:

可直接联系客服QQ交代需求:953586085

欢迎光临程序代写小店https://item.taobao.com/item.htm?spm=a230r.1.14.59.255028c3ALNkZ0&id=586797758241&ns=1&abbucket=15#detail

What does reserve() do on std::vector? What is the complexity of adding element to a std::vector?

Underlying data structure of std::map/std::unordered_map? Implementation outline.

K-way merge sort.

How would you implement atoi and itoa functions?

Max sum subarray problem.

How to compute max drawdown of a price time series?

4. C++进阶

可以阅读Effective C++, Effective STL, C++ FAQ(website) 和一定编程规模(数千行代码量)的project。只有在Project中才能真正学习。C++ standard library 的实现也是很好的学习工具。它有几个不同的实现,GCC, SGI, Clang等。Clang的实现比较清晰,如果用GCC作为编译器的话了解GCC的实现对有效使用library中的container是很有好处的。对于Quant来说不一定要掌握到这个部分所提到的内容,有兴趣的话可以学习。

这个阶段以后可以思考下面这些问题。

What is strong exception guarantee? Cost of exception handling? Why C++11 deprecate exception specification?

What is type trait?

What is smart pointer? Difference between std::shared_ptr<T> and boost::instrusive_ptr<T>? Implementation outline.

How is virtual function call implemented? What is the cost of virtual function calls? *What is CRTP? *What is the limitation of that?

*What is the runtime cost of a lambda function? *What is the cost of std::function compare to a function pointer? *What does std::function gain from that cost?

注1:带*号为难度较大的问题,Quant或初学者可以不在这上面浪费时间

注2:本文所提的思考问题仅是一些有代表性的问题,仅代表C++知识的一小部分。

5. C++11

C++ Primer第五版已经涉及,另外还有Effective Modern C++. C++11很重要,有很多改进需要了解和掌握,在程序中善于使用。这里举一些比较有代表性的, move sematic, rvalue reference, range based for loop, override keyword, static assert, initializer list, lambda, etc. Boost library的最常用内容已经包含在C++11中,建议先掌握C++11再关注Boost的其他内容。

6. 软件开发环境

  • Version control. Git是主流,在老的开发组里可能还在使用SVN或者CVS。这是团队开发必须掌握的工具。

  • Testing. production code的设计要考虑到其可测试性,所有的代码在release之前都要经过测试。测试的设计,自动化等工作也是需要功夫的。

  • Build system. 常见的C++ build system有Make, CMake, Automake, scons, Visual Studio等,至少会使用一种。了解Gcc的使用,了解如何使用第三方库。

  • Debugging/Profiling tool: Valgrind memcheck, Cachegrind, gprof, OProfile, etc.

7.行业相关:衍生品定价系统

这样的系统以计算为核心,需要数值计算,并行计算的知识。现在GPU也比较流行,一般使用nVidia的CUDA. 并行计算也有使用MPI的。另外系统的跨平台特性和其他系统和语言的接口也是开发的要点之一。

8.行业相关:低延迟交易系统

交易系统注重对底层的了解。Memory alignment, multithreading, networking communication, cache friendliness, 如何保证系统的高可靠性,这些都是值得注意和学习的地方。建议学习SEC对Knight Capital trading error事件的调查报告https://www.sec.gov/litigation/admin/2013/34-70694.pdf, 以及SEC对Tower Research RegNMS violation的调查报告http://www.sec.gov/litigation/admin/2015/34-76029.pdf. 以及知乎大神董可人的文章C++ 为核心语言的高频交易系统是如何做到低延迟? - 董可人的回答高频交易软硬件是怎么架构的? - 董可人的回答

C++ 如何进阶?的更多相关文章

  1. nodejs进阶(6)—连接MySQL数据库

    1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABA ...

  2. nodejs进阶(4)—读取图片到页面

    我们先实现从指定路径读取图片然后输出到页面的功能. 先准备一张图片imgs/dog.jpg. file.js里面继续添加readImg方法,在这里注意读写的时候都需要声明'binary'.(file. ...

  3. JavaScript进阶之路(一)初学者的开始

    一:写在前面的问题和话 一个javascript初学者的进阶之路! 背景:3年后端(ASP.NET)工作经验,javascript水平一般般,前端水平一般般.学习资料:犀牛书. 如有误导,或者错误的地 ...

  4. nodejs进阶(3)—路由处理

    1. url.parse(url)解析 该方法将一个URL字符串转换成对象并返回. url.parse(urlStr, [parseQueryString], [slashesDenoteHost]) ...

  5. nodejs进阶(5)—接收请求参数

    1. get请求参数接收 我们简单举一个需要接收参数的例子 如果有个查找功能,查找关键词需要从url里接收,http://localhost:8000/search?keyword=地球.通过前面的进 ...

  6. nodejs进阶(1)—输出hello world

    下面将带领大家一步步学习nodejs,知道怎么使用nodejs搭建服务器,响应get/post请求,连接数据库等. 搭建服务器页面输出hello world var  http  =  require ...

  7. [C#] 进阶 - LINQ 标准查询操作概述

    LINQ 标准查询操作概述 序 “标准查询运算符”是组成语言集成查询 (LINQ) 模式的方法.大多数这些方法都在序列上运行,其中的序列是一个对象,其类型实现了IEnumerable<T> ...

  8. Java 进阶 hello world! - 中级程序员之路

    Java 进阶 hello world! - 中级程序员之路 Java是一种跨平台的语言,号称:"一次编写,到处运行",在世界编程语言排行榜中稳居第二名(TIOBE index). ...

  9. C#进阶系列——WebApi 接口返回值不困惑:返回值类型详解

    前言:已经有一个月没写点什么了,感觉心里空落落的.今天再来篇干货,想要学习Webapi的园友们速速动起来,跟着博主一起来学习吧.之前分享过一篇 C#进阶系列——WebApi接口传参不再困惑:传参详解  ...

  10. 【腾讯优测干货分享】如何降低App的待机内存(四)——进阶:内存原理

    本文来自于腾讯优测公众号(wxutest),未经作者同意,请勿转载,原文地址:http://mp.weixin.qq.com/s/3FTPFvZRqyAQnU047kmWJQ 1.4进阶:内存原理 在 ...

随机推荐

  1. Shell变量一览

    Shell变量一览 $# Shell命令的参数个数 $$ Shell本身的进程ID $! Shell最后运行的后台进程的进程ID $? Shell最后运行的命令的退出码(返回值) $- Shell使用 ...

  2. pytorch 0.4.0迁移指南

    总说 由于pytorch 0.4版本更新实在太大了, 以前版本的代码必须有一定程度的更新. 主要的更新在于 Variable和Tensor的合并., 当然还有Windows的支持, 其他一些就是支持s ...

  3. SQL Server中,常用的全局变量

    在SQL Server中,全局变量是一种特殊类型的变量,服务器将维护这些变量的值.全局变量以@@前缀开头,不必进行声明,它们属于系统定义的函数.下表就是SQL Server中一些常用的全局变量. 全局 ...

  4. 苹果手机浏览器的$(document).on(“click”,function(){}) 绑定的事件点击无效

    需要给对应的元素加上 cursor: pointer  的css样式才可以生效点击事件:

  5. Jenkins多环境持续集成架构实践

    自动化部署主要是为了解决项目多.环境多.持续集成慢.部署操作麻烦.手动操作易出错.自动化运维等问题. Jenkins是开源CI&CD软件领导者, 提供超过1000个插件来支持构建.部署.自动化 ...

  6. UCOSIII消息队列

    任务间消息传递2种途径 全局变量 发布消息 主结构体 typedef struct os_q OS_Q; struct os_q { /* Message Queue */ OS_OBJ_TYPE T ...

  7. Needham-Schroeder Scyther工具形式化过程

    1.Needham-Schroeder Public key Protocol 协议的通信认证的过程 顺序图的 1.  A-> S :   A,  B 2. S->A:     {Ks, ...

  8. Graphviz install the Windows for Scyther

    1.在Pycharm 中使用Scyther工具的时候需要导入 graphviz 直接在 Interpreter 上安装的售后会报错,如果在 IDE上无法支架安装的库可以试图在控制台上安装,控制台上无法 ...

  9. python3 xml_to_dict、dict_to_xml等互相转换的方法

    from basic_config_vars.config_vars import moviesAllFilePath,moviesFilePath #自定义的一些文件变量 import xmltod ...

  10. 安装k8s,单master脚本

    这个以一个普通xxx帐户运行即可. 因为上面root帐号作了sudoer的操作的. 还有,最好将xxx帐号加入docker组,这样xxx也可以执行docker命令了. 可以看到,这个脚本还需要其它目录 ...