今天是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个平方。
由于当时工作(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传奇》
我的非计算机图形学/游戏引擎相关书籍:
- 谭浩强的《c语言教程》和 严蔚敏的《数据结构(C语言版)》
不用说,这两本书肯定人所共知。之所以选这两本书,是因为我去我哥们(工科)那里,开课的也是这两本书,所以就买了下来。这两本书上记录了很多内容,但是后来被我送给当时公司的文员了(我那时在公司没事【还未进入程序行业】,就给他们show我的flash动画,后来其中一个小姑娘原本也是工科毕业,也想学编程,我就慷慨的送给了她)
- 四本c/c++经典书
《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编写,约翰卡马克就是神一样的人,而我就是跟着神学习,到目前为止,很多还是没能搞懂,基本上觉得也没办法搞懂了,遗憾!)
- 数据结构、多线程、COM:
数据结构这本书,我个人非常喜欢,使用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实现
-
IOS/Android 和重构、设计模式:
这几本书是用于IOS和android开发的,在2014年,我负责移动部门的开发事物,当时没接触过移动,就这几本书学的,其实移动开发比桌面简单(个人认为,不代表普遍性观点).
重构这本书,很经典,和四人帮的设计模式并列面向对象的经典教程,设计模式书没买,我是打印版。没事就应该翻阅一下,然后根据经验和书中进行对比总结。这两本书,随着你的经验增长,每次阅读都有不同的体会
- .net、js和python:
.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。
- 编译原理方面书籍:
我本人最有兴趣的两个领域:图形引擎和编译器
flex是词法分析器,bison是语法分析器
其实编译原理方面,关键是明白什么是:
BNF(Backus-Naur Form)【巴科斯范式】
说难很难,说容易也很容易的,就是递归的一层层的定义出语言的各个基本组成部分。像c,c++,c#,js,switf,java,sql....开源的语言都能在文档中查到BNF定义式。这个以后有机会我们可以深入的聊一下。
上图为json2objc(2015年我开始开发的核心库)的方法签名,使用的原理就是BNF递归式定义各个语言要素(例如对象,类,属性,方法,赋值,枚举,事件,绘图命令等....),生成抽象语法树(AST),然后将json描述转换为objc代码(做跨平台UI系统)
上图为一个研究项目,将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系列库。
也写了蛮多字了,休息一下。下一篇就关注一下我的计算机图形学及引擎方面的书籍吧