漫步程序路(2)[学习经验谈及我的C语系书籍]

今天是2017年6月25日(8月26日注:6月25日开始写本文的),是值得纪念的一天。

是戒烟3周年纪念日!!!

2014年的今天,我(还有另外一位同事,水平非常高的一位同事,在他身上学到了什么是专注)在深圳招商银行数据中心负责CBS5(Cross Banking System)的开发工作(1.0后由其他公司开发维护)。每个月去深圳待20天,连续将近4个月!(腾讯大厦旁边)

有三个原因导致我在那天发誓戒烟:

  • 招行的安全机制,导致抽烟远离办公室,并且需要专人陪同才能开门回去,非常麻烦。

  • 可能深圳的空气太好了吧,一下子不适应,咽喉炎很厉害,咳嗽不停。

  • 那时候我孩子有四周岁了,老是说爸爸香烟味道很大,要求我戒烟。

在上述情况下,我就决定戒烟了!

其实戒烟也并不算很困难。我的法宝就是吃花生。一旦烟瘾犯起来,就吃花生米。坚持了一个周后,发现效果蛮好的。最重要的是咽喉炎没有了,而且吐出几口浓痰后,身心俱爽!至今已经整整三年没碰过一支香烟了。咽喉炎也没发作过!

所以,只要下定决心,那肯定是可以成功的!

毕竟是:
天下无难事,只怕有心人哪!!
只要功夫深,铁杵磨成针啊!!

哈哈哈哈!!!

追溯我的抽烟史,说长不长,说短也不短了。概括来说,就是:
起步晚、发展快,戒的爽


为什么我会学习编程呢?

三个原因:

  • 世纪之交(1999~2000春节期间),我和我兄弟一起每人买了台当时最先进的华硕镁铝合金,光软互换,带2兆显存,12g硬盘,奔三600,win98操作系统的笔记本电脑,并且外加64兆内存,数码摄像头及打印机,一套装备的价格在当时的上海,可以在不错的地段买8个平方。
我第一台笔记本电脑.jpg
  • 由于当时工作(98年-02年)是每个月出差20天。那个时代正处于计划经济向市场经济转变过程,产品相对短缺,经销商是怕拿不到货而不是怕卖不出去,所以有我没我真是无所谓。我天天做的事情是待在宾馆房间发呆,大把空闲时间不知如何打发。(刚开始还参加应酬,真是要喝死我啊!后来我就不参加这种从吃晚饭开始喝到半夜结束的吃喝玩乐活动。有一次喝的我半夜心跳快的自己都受不了)

  • 其实刚开始对photoshop很感兴趣,觉得ps好神奇,买了几本书自学。实在是没有艺术天分,按书照做,没有一次成功。后来就放弃了,开始玩cs,玩quake,游戏好好玩。于是想了解一下游戏是如何制作的(2001年底,2002年初开始)。quake的mod资料国外非常丰富(国内基本没有)。而cs基于quake引擎,使用著名的quake c进行mod制作,因此开始查资料,买书,学习。

所以: 电脑太贵,时间太闲,游戏太好玩,就是这三个原因

学习经验之谈:

关于学习的过程以后再说吧,反正就是无知者无畏,一开始上手就挑了约翰卡马克的quake系列游戏引擎(没经验,谁知道游戏引擎会这么多内容和知识)。今天还是看一下学习过程中买的c语系(类c语言的统称)相关的书籍吧

本篇主要是show一下相关的c语系书籍,后期会逐渐评论每本书哪些地方值得我们更加深入,细致的了解,以及延伸需要的资料,根据我以前的经验,就是:

  • 源码及书籍精读、泛读相结合,增加知识深度和宽度,了解知识的延续(上下),延展(左右)

【没人教的时候,源码和书籍就是唯一获取系统知识的渠道】

  • 以quake源码为核心,一切的知识点都是来自quake,然后通过搜索术语,了解整个知识体系,并且加强对源码的敏感性(实际上,后来,我阅读过很多的c/c++方面的源码,不单单局限于游戏引擎)

【选定源码后,不要朝思暮想,不要轻易换掉】

  • 加强调试能力,我深有体会,quake源码的研究,全靠visual studio c++ ide.强大的函数调用堆栈,多线程debug功能,还有强大的各种断点跟踪能力,要知道单看代码很多是理解不了的,而从源码跟断点,就能很清晰的知道代码流程,修改源码,观看效果(vs的调试功能极其强大,灵活运用各种调试手段,就能找到各种bug)。

    源码研究的两种手段∶断点跟代码、注释和简写核心代码

【如果我面试程序员,就给定一段源码,让面试者当场跟断点,就能看出他是否能解决问题】

  • 学习计算机,一定要加强英文,阅读原版经典著作,了解专业术语,这样会增加你搜索能力。搜索能力其实就是你的学习能力,现在知识都是公开的,在浩瀚的知识海洋中如何精确定位到你需要的东西,就是靠加强你的专业术语能力了!

【英语能力和搜索能力也是编程能力增长的关键点】

(我在2004年-2009年间【2009年后做游戏开发去了】,英文能力增加非常快,得益于整个工作环境,每天可以接触不同国家的人,土耳其人,伊朗人,美国人,日本人,德国人,印度人,巴基斯坦人.......)

我会拍一些视频,在视频中不单单演示代码,而且会讲述相关的英语术语,用于加强搜索的正确性

实际上我策划了【6部技术笔记】,目前在简书上每天撰写的是图形引擎以及c/c++方面的东西,实际并不是我【6部技术笔记】之内的东西,这是因为图形引擎与c/c++我最熟悉,因此不用过多调试就能直接出结果,当然文笔是败笔啊,但是技术为主,就将就一些吧!

关于六大系列笔记,具体我会另行视频演示。

  • 多做笔记,多写心得。我的quake引擎,21本笔记,外加我公司打印机(09年以前)打出来的技术资料(公司打印机速度极快,我一本500页的原版书pdf,没几分钟就出来了,好多国外书,中国没引进,价格贵的离谱,好的书,我喜欢打出来,每天睡觉前翻一下,养成的习惯,不看书,晚上睡不着)

【好记性不如烂笔头,需要定期总结前段时间的经验与得失】

后来有一年时间,我专门负责公司内部员工培训(三批次,每天远程avcom教学 ,出卷,每周考试,试卷讲解)以及对徐州化校计算机班进行远程培训(原本是想选人,不过感觉他们并不喜欢计算机,一个月后放弃),拍摄和撰写了很多内部资料和视频讲解(整个引擎源码分析,uml架构图,序列图,渲染器,面相对象,设计模式....),培训结果非常不错,由于公司业务性质原因,以c/c++为核心,然后根据业务需要调整各个员工到各个领域中去,有了c/c++,stl容器,gdi,数据结构等基础知识,其实转到客户端,前端等岗位是比较容易的

  • 一定要树立崇拜对象,就像军队要建立荣誉制度,程序员也要建立信仰目标。

【树立偶像很重要!】

我的程序人生中,两大崇拜对象:

3D引擎之神:

John D. Carmack(约翰卡马克)

传记《Doom启示录》


Delphi、C#,Typescript之父:

Anders Hejlsberg(安德斯·海尔斯伯格)

传记《Borland传奇》


我的非计算机图形学/游戏引擎相关书籍:

  1. 谭浩强的《c语言教程》和 严蔚敏的《数据结构(C语言版)》

不用说,这两本书肯定人所共知。之所以选这两本书,是因为我去我哥们(工科)那里,开课的也是这两本书,所以就买了下来。这两本书上记录了很多内容,但是后来被我送给当时公司的文员了(我那时在公司没事【还未进入程序行业】,就给他们show我的flash动画,后来其中一个小姑娘原本也是工科毕业,也想学编程,我就慷慨的送给了她)

  1. 四本c/c++经典书
c++四本经典书.jpg
  • 《c++ primer》 & 《深度探索c++对象模型》
    这两本书的地位,不用我说了吧!
    作者Stanley B.Lippman当他在AT&T Bell实验室的时候,领导了cfront 3.0版本和2.1版本的编译器开发组。他也是Bjarne Stroustrup(c++之父)领导的Bell实验室Foundation项目的成员之一,负责C++程序设计环境中的对象模型部分。
    微软的VC++编译器就是他作品

  • 《stl源码剖析》和 《C语言接口编程与实现(英文版)》
    作为唯一的进入c++标准的stl库,绝对值得研究,用途太大了! 其中侯捷先生选择sgi(opengl拥有者)版进行源码剖析,该版本由stl之父Alexander Stepanov实现,质量有保证(微软版stl源码风格实在是太可怕了)

  • 至于这本C语言接口编程与实现(英文版),基于对象编程(是基于而不是面向,两者是有本质区别),实现了c版本的容器对象(stl是c++泛型版容器库,当然现在stl包含的内容不仅仅是容器了).该书作者是: David R. Hanson,还是<<A Retargetable C Compiler: Design and Implementation>> ,中文译本叫《可变目标C编译器——设计与实现》的联合作者之一(编译原理的经典著作之一,该书中讲述了如何实现lcc这个gnu c编译器。

  • 约翰卡马克在quake3中修改了lcc源码,用于生成quake3引擎虚拟机代码。quake1是卡马克自己实现的quake c脚本解释器。(去除指针的c语言,强大的很啊!全部解释执行,而且速度极快,quake1 逻辑端都使用quake c编写,约翰卡马克就是神一样的人,而我就是跟着神学习,到目前为止,很多还是没能搞懂,基本上觉得也没办法搞懂了,遗憾!)


  1. 数据结构、多线程、COM:
数据结构_多线程_组件对象模型.jpg

数据结构这本书,我个人非常喜欢,使用c++描述,没有冗余代码,实现代码极其简单明了直接,非常棒的书

Jeffrey Richter的windows核心编程(Windows via C/C++),经典中的战斗机,内核对象,线程与同步描述的多么清晰,最喜欢IOCP原理描述这一章和DLL注入方面的东西(好多年前,我通过win核心编程描述的DLL注入方式,hook住dx9运行库,在pps的网页播放器上运行我的字幕及绘图,我有时间测试一下,现在是否还能注入到例如爱奇艺浏览器版视频播放器中),还有就是内存调试方面的内容,非常棒的一本书(难度很大,但是收获很多)

Jeffrey Richter还有部经典的.net著作: CLR via C#,虽然我没买,但是这本书绝对是经典。

C++并发编程,主要使用了C++ 11中的线程和并发方面内容,我将该书作为参考书使用,遇到问题,查阅使用。

线程从底层到高层(windows描述,其实除了win api和ppl之外,其他库都是跨平台的!):

  • windows 线程相关API
  • 在API的基础上封装跨平台的pthread库
  • windows 强大无比的PPL库(可惜无法跨平台)
  • windows对PPL封装而成的c++ 11 中的线程库
  • intel开源跨平台库: TBB(Threading Building Blocks)
  • 一些专用的封装后的并发库:例如libuv、boost::asio、移植到各个平台中的libdispatch库(gcd)....
    其中windows PPL库和intel TBB库支持"偷窃"概念(简单来说,就是会根据任务,进行拆分,让线程处理的数据进行动态均衡,避免某个线程累死,另外线程没活干)

ATL是简化微软COM(组件对象模型,二进制复用技术)开发而提供的一个轻量级的封装库,开发COM基本都喜欢用这个库,以前我们的引擎就是基于COM实现


  1. IOS/Android 和重构、设计模式:
    objc_ndk_重构.jpg

这几本书是用于IOS和android开发的,在2014年,我负责移动部门的开发事物,当时没接触过移动,就这几本书学的,其实移动开发比桌面简单(个人认为,不代表普遍性观点).

重构这本书,很经典,和四人帮的设计模式并列面向对象的经典教程,设计模式书没买,我是打印版。没事就应该翻阅一下,然后根据经验和书中进行对比总结。这两本书,随着你的经验增长,每次阅读都有不同的体会


  1. .net、js和python:

点net_node_js_python.jpg

.net本质论,如果你想深入了解统一类型系统,AOP(面向切面编程),从汇编级别了解.net类型安全的delegate合成....,那么本书就是经典!

深入浅出nodejs(阿里朴灵,nodejs布道者),学习nodejs的人员必备书籍吧。我这段时间,这本书读的最多,我主要结合libuv及nodejs源码来验证第二章模块机制和第三章异步io部分内容。这部分我认为是本书的最精华部分。其他章节主要是js方面的内容。

知道为什么nodejs都是回调吗?
很简单: 因为nodejs的核心引擎是libuv,所有js输入都转换成libuv c结构数据,然后经过libuv处理后,进行完成通知(windows中用IOCP,linux中用epoll),异步回调模式。

所以并不是v8 js引擎导致nodejs的回调编程模式,而是libuv的使用了完成回调通知的模式。

你不知道的js,涉及js的一些关键点。我在撰写闲聊js系列文章中,遇到js最多问题就是this指针指向的问题,具体原理都在本书中有详细解释。

python基础教程,满经典的一本书,目前js和python是最有前途的脚本语言。和c/c++的协作能力也是无与伦比的。其实python不算c语系,语法风格差距蛮大的。是一门很好用,很有特色的语言。我主要在树莓派中使用python。


  1. 编译原理方面书籍:
编译知识.jpg

我本人最有兴趣的两个领域:图形引擎和编译器

flex是词法分析器,bison是语法分析器
其实编译原理方面,关键是明白什么是:
BNF(Backus-Naur Form)【巴科斯范式】
说难很难,说容易也很容易的,就是递归的一层层的定义出语言的各个基本组成部分。像c,c++,c#,js,switf,java,sql....开源的语言都能在文档中查到BNF定义式。这个以后有机会我们可以深入的聊一下。

json2objc.png

上图为json2objc(2015年我开始开发的核心库)的方法签名,使用的原理就是BNF递归式定义各个语言要素(例如对象,类,属性,方法,赋值,枚举,事件,绘图命令等....),生成抽象语法树(AST),然后将json描述转换为objc代码(做跨平台UI系统)

js2cpp2.png
js2cpp.png

上图为一个研究项目,将js的ast转换为c++/objc/java/c#,现在中断了,因为typescript更适合(带类型系统,不需要通过变量类型前缀来进行其他强类型语言的类型输出,例如 let nParm = 1,用类似微软匈牙利命名法来进行类型前缀标注)

其实我大部分工作是进行基础性工作。

关于LLVM,我只是觉得苹果objc编译速度超级快,cocos2d-x 3.x版本在vs2015基本要编译半小时,但是在objc中大概10分钟就能搞定(两年前的事情,不知道是否最精确,但是的确当时感觉objc编译速度超级快)

目前llvm已经在各个平台运行了,而且c/c++调试信息方面,lldb要优于gdb。我前段时间装Ubuntu就是为了在上面运行llvm系列库。

也写了蛮多字了,休息一下。下一篇就关注一下我的计算机图形学及引擎方面的书籍吧

漫步程序路(1)[学什么不重要,重要的是你静得下心来吗?]

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容