分类 随笔 中的文章

FlashDevelop 好用

好几年没碰过 Flash 了,最近需要给 ActionScript 导出一些 C 接口,又抽空捡起来。项目大了以后 Flash Builder 卡的要死,经常是一个构建你就可以休息了,按一下 “.“ 它就开始搜索补全提示,你的符号多了以后,有时候 Flash Builder 近乎假死了。实在难以忍受,咨询了一些正在做页游的朋友,是否还在用 Flash Builder 。得到答案是:早就投奔 Flash Develop 了。

试了一下 FlashDevelop 果然腰也不酸了,腿也不疼了,十分流畅,界面类似 Visual Studio,同时还是免费的,可以彻底和笨重的 Flash Builder 说再见了。再次感叹 AS3 写起来真爽之余,记录一下安装配置过程:

image

……

阅读全文

如何提高编程的手速

可以使用经典的 TT 来测试你的打字速度,注意是包含数字和符号的文章(Menu->Test->All key) 软件很简单,按照箭头指着的位置,快速输入上面的单词即可,输入完会有评分的。 TT是比较好的打字练习程序,直到今天,公司内都用作给新人练习打字速度用。不当能测试,还有比较详细的课程,教你从纯单词打起,逐步到数字,标点符号等。 我做过一个 DOSBOX版本的 TT (tt.exe 是 DOS下的程序),双击 TT.BAT 即可在 Win7/8 启动 http://www.skywind.me/mw/images/e/eb/TT-Dosbox.7z 我当时用 TT 测试 All Key 的时候,已经写过好多年程序了,自己觉得自己打字不慢,英文可以流利盲打,数字和符号需要看一下,结果 TT 测试下来,打字速度只有 31 WPM ,属于垫底的角色,丢死人了。 于是开始用 TT的课程进行练习,每天练习的不多,每天两次,每次15分钟,主要是先打10分钟的课程,然后做5分钟的测验,不能练多,练多了手麻,但是要坚持每天都练习两次左右。一开始纯英文的指法挺简单乏味,觉得没意思,因为我本身可以流利的盲打英文,觉得自己主要是被数字和符号拖累了。但是坚持了一段时间练习纯英文速度后,我发现纯英文速度从 42WPM提高到 55WPM。 后来开始继续练习数字和符号,这就比较痛苦了,就是单调乏味的重复练习,这部分手指动作跨度大,即便记得住在哪里,经常手指过去就按错了,但是一旦数字和符号分实现了盲打,整体 WPM的提高是非常大的。 TT 有专门练习数字和符号的的课程: 几个星期后,All Key的打字速度 WPM 终于从31 提高到 45 了,通过了打字测验。这时候我回来输入程序,我发现对自己编程帮助确实比较大。以前碰到数字和符号经常要低下头去看在哪里,指法也不标准,比如按shift组合键的时候是比较山寨的打发,现在纠正了一下实现全键盘盲打了,感觉写程序顺畅了很多。 很多人觉得程序主要是思考,你思路对了,打字只是小事,经常听到说某某高手打字是二指禅。以前我也这么认为,但是专门抽时间练习了以后,发现真正打字流畅的人,打字的 cpu占用很低,不会因为打错字而影响思考,更不会因为要低下头去看数字符号打断你的思路。 到了 45的 WPM 以后,再往下提高就比较难了,经常一个多星期没啥提高,我后来发现我的指速不够,就是即便全部盲打,手指不够熟练,灵巧度不高,再怎么盲打也是白打。因此买了一个机械键盘来专门练习指速。 先单纯练习从 A打到 Z,最开始是15秒,慢慢熟练到10秒,最后到5秒。又从最基本的单词开始,不断的重复同一节 TT的课程,同一个动作重复 300次,肌肉就会有记忆,而同一个动作重复600次,脊柱就会有记忆。别人打字要经过大脑,大脑一个字母一个字母,一根手指一根手指的指挥,是比较费脑的,而你打字如果真正进入了脊柱反应的条件反射时代,那么看到一个单词或者一串数字,大脑只需要下一个指令,脊柱这个协处理器就自动完成了,根本不需要过大脑。 所以实现全盲打后,又经过一段时间的指速练习,从 45 WPM 不断的提高到 50 WPM,55 WPM,60 WPM 最后到 65WPM (TT的 All Key模式),单纯打英文的速度也从原来的 35 WPM提高到 71 WPM,整整翻了一倍: 虽然 TT 是 DOS 时代的软件了,现在市面上出过很多打字练习软件,但是说道科学性和系统性,还是没有超过 TT的。现在偶尔抽空还是会拿出 tt 来练习一下,就当打游戏。但是自己手指的灵巧度感觉还是不够,可能这是先天的,因为即便我达到了 65 WPM,公司内还是有很多70,75以上的同事打的比我快多了。 现在再看到那些诸如某大牛只用二指禅来敲代码的言论,我都会嗤之以鼻了,字都打不好还写啥程序呀?不管有多牛,即便写代码的思路再好,但是手速跟不上,打字还要费大脑的话,还是有所局限的。 只有很流畅的打字了,让打字变为一种不经大脑的条件反射,你的注意力才能完全集中在思考你的程序上。我把自己的打字速度从 30 WPM 提高到 65WPM的过程中,对这一点感触是比较深的。因为先天手指笨拙,我好像要比同事们练习的更多才能有他们同样的提高,但是我还是能够感受到提高手速对编程的改变,所以有空我都还是会拿出 TT 来练习一下,全当打游戏了,希望有一天 All Key 的 WPM能上 70。 -———————— PS: TT 下载地址(DosBox版本)http://www.skywind.me/mw/images/e/eb/TT-Dosbox.7z 整合了 DOSBOX + TT,运行 “TT.BAT” 就可以在 Win7/Win8下启动,运行”TT放大版.BAT”,就可以设置 DOSBOX放大两倍显示(如今高分屏看起以前低分辨率的文字有点累,放大两倍后效果比较好)。 Ubuntu / OS X下,先安装 DOSBOX,把上面的 tt 下载下来,再用 ubuntu的 dosbox 启动 tt.exe 即可。 -———————— 不要用《金山打字通》: 金山打字通测试文章中,符号和数字偏弱,标点就是逗号和句号,比起TT的 All Key (每篇文章至少包含一定数量的电话号码,门牌号码,各种符号) 金山打字通测试是:每秒钟敲下多少字母,不是 WPM(每分钟敲下多少个单词),比字母的话,我最快5秒钟可以从 A->Z,应该是 312字母/分,没啥意义呀。 编辑于 2015-07-03……

阅读全文

什么时候用C而不用C++?

知乎问题《什么时候用C而不用C++?》: 前两天不是有一个问题是“什么时候用C++而不用C”,我一直觉得问错了,难道不是“能用C++就不用C”么?那么当然就要讨论什么时候用C而不用C++啦。 一直以来都严格遵循OO的原则来进行开发(用的工具是C#和Qt),直到最近,开始接手某同事的代码,整个项目20多个小工程(代码量并不多),除了界面部分用了MFC这种不伦不类的OO以外,所有的代码都是C写的。但是模块化做的非常好。后来跟他讨论为何不用C++,他说其实没有什么特别的,就是习惯和爱好而已,后又补充: 如果不用多态的话,其实不管怎么写,不管用那种语言写,都算不上真正的OO 忽然觉得很有道理…… 其实这是一个好问题, 题主开始欣赏到纯 C代码所带来的 “美感” 了,即简单性和可拆分性。代码是自底向上构造,一个模块只做好一个模块的事情,任意拆分组合。对于有参考的 OOP系统建模,自顶向下的构造代码抽象方法是有效率的,是方便的,对于新领域,没有任何参考时,刻意抽象会带来额外负担,并进一步增加系统耦合性,设计调整,往往需要大面积修改代码。 有兴趣你可以读读《Unix编程艺术》,OOP的思维模式,是大一统的;C的思维模式,是分离的。前者方便但容易造成高耦合,后者灵活但开发开发太累。用 C开发,应该刻意强调 “简单” 和 “可拆分”。一个个象搭积木一样的把基础系统搭建出来,哪个模块出问题,局部替换即可。 自底向上的开发模式,并不是从不站在大局考虑问题,而是从某个子系统具体实现开始,从局部迭代,逐步反思全局设计,刻意保持低偶合,一个模块一个模块的来,再逐步尝试组合。 自底向上强调先有实践,再总结理论,理论反过来指导实践,又从实践中迭代修正理论。这和人类认识世界的顺序是一样的,先捕猎筑巢,反思自然是怎么回事,又发现可以生火,又思考自然到底怎么回事情。 它的反面,是指大一统设计,你一开始用 UML画出整套系统的类结构,然后再开工设计。这种思维习惯,如果是参考已有系统做一个类似的设计,问题不大,全新设计的话,他总有一个前提,就是 “你能完整认识整个大自然”,就像人类一开始就要认识捕猎和筑巢还有取火一样。否则每次对世界有了新认识,OOP的自顶向下设计方法都能给你带来巨大的负担。 所以有些人才会说:OOP设计习惯会依赖一系列设计灵巧的 BaseObject,然而过段时间后再来看你的项目,当其中某个基础抽象类出现问题是,往往面临大范围的代码调整。这其实就是他们使用自顶向下思维方法,在逐步进入新世界时候,所带来的困惑。 当然也有人批判这种强调简单性和可拆分性的 Unix思维。认为世界不是总能保持简单和可拆分的,他们之间是有各种千丝万缕联系的,你一味的保持简单性和可拆分性,你会让别人很累。这里给你个药方,底层系统,基础组建,尽量用 C的方法,很好的设计成模块,随着你编程的积累,这些模块象积木一样越来越多,而彼此都无太大关系,甚至不少 .c文件都能独立运行,并没有一个一统天下的 common.h让大家去 include,接口其他语言也方便。 然后在你做到具体应用时根据不同的需求,用C++或者其他语言,将他们象胶水一样粘合起来。这时候,再把你的 common.h,写到你的 C++或者其他语言里面去。当然,作为胶水的语言不一定非要是 C++了,也可以是其他语言。 -———— PS: 这里主要在探讨 OOP存在的问题,并没有讨论嵌入式这种资源限制的情况,以及操作系统和底层等需要精确控制硬件和内存的情况,更没有讨论 C++在语言设计层面的事情。 -———— 转部分答疑:(点击more展开) Q:“实际上是,如果你能清晰的知道你要做什么事情,那C很好。但如果你只能确定流程基本是对的,而很多系列可能在后续维护中不断更改,或者增加更多的支持,那c的overhead就很大了。当工程非常庞大的时候会很难维护。比如开发一个数学算法库,其实跟数学没有关系,就是一个大数(任意精度)的一系列计算程序。这个程序可以是没有GUI的。开始自己设计一个大数的运算内核,然后还有很多更高级的计算算法。将来有一天想 把内核替换成GMP库,或者用户可以动态替换自己的内核” A:就以你说的大数计算为例,大数计算底层驱动根据CPU更换函数指针是个不错的选择,见polarssl openssl,我还真建议你用C来写大数的底层,因为你今天要算个求幂取模,明天要算个gcd,后天要生成质数,你无法预测你的大整数里面究竟有多少个接口,这时候用c的分治思想就很合适。大数不是一辆飞机,它会飞,会降落,会拐弯,这都是飞机的主动行为,主动行为是有限的,确定的,适合oo的。而一个数字,它几 乎没有啥主动行为,相反全是无限的,不可控的被动行为,正合适塞到不同的.c文件中。这种时候你想刻意在一个大数类里设置满无限的方法是不合适的,不该oo的。况且你要夸语言,大数基础库用c接口到其他语言方便。所以你会看到openssl polarssl到其他语言的很多绑定,可你从来不会看到crypto++除了c++外被导出到其它任何语言了。在你用C实现了大整数基础功能并导给其它语言接口后,针对c++用户, 专门包个class的壳,选择一些基础方法放进去,给cpp用户提供点方便。下面核心算法变了,比如你实现了一个sse版本的乘法,运行时换函数指针即可,外层完全不可见,多好!polarssl中还用了一些宏来代替为数不多的几处用模版很方便的地方。……

阅读全文

C++的反思

最近两年 C++又有很多人出来追捧,并且追捧者充满了各种优越感,似乎不写 C++你就一辈子是低端程序员了,面对这种现象,要不要出来适时的黑一下 C++呢?呵呵呵。 咱们要有点娱乐精神,关于 C++的笑话数都数不清: 笑话:C++是一门不吉祥的语言,据说波音公司之前用ADA为飞机硬件编程,一直用的好好的,后来招聘了一伙大学生,学生们说我靠还在用这么落后的语言,然后换成C++重构后飞机就坠毁了。 笑话:什么是C++程序员呢?就是本来10行写得完的程序,他非要用30行来完成,并自称“封装”,但每每到第二个项目的时候却将80%打破重写,并美其名曰 “重构”。 笑话:C容易擦枪走火打到自己的脚,用C++虽然不容易,但一旦走火,就会把你整条腿给炸飞了。 笑话:同时学习两年 Java的程序员在一起讨论的是面向对象和设计模式,而同时学习两年 C++的程序员,在一起讨论的是 template和各种语言规范到底怎么回事情。 笑话:教别人学 C++的人都挣大钱了,而很多真正用 C++的人,都死的很惨。 笑话:C++有太多地方可以让一个人表现自己“很聪明”,所以使用C++越久的人,约觉得自己“很聪明”结果步入陷阱都不知道,掉坑里了还觉得估计是自己没学好 C++。 笑话:好多写了十多年 C++程序的人,至今说不清楚 C++到底有多少规范,至今仍然时不时的落入某些坑中。 笑话:很多认为 C++方便跨平台的人,实际编写跨平台代码时,都会发现自己难找到两个支持相同标准的 C++编译器。 -————– Q:那 C++为什么还能看到那么多粉丝呢? A:其实是因为 Windows,因为 Windows的兴起带动了 C++,C++本来就是一门只适合开发 GUI的语言。 Q:为何 C++只适合开发 GUI呢? A:你看 Unix下没有 GUI,为啥清一色的 C呀?所有的系统级问题都能在 C里找到成熟的解决方案,应用级问题都能用其他高级语言很好地解决,哪里有 C++什么事情呀? Q:你强词夺理,Unix下也有 C++的项目呀。 A:有,没错,你任然可以用任何语言编写任何糟糕的代码。 Q:别瞎扯了,你都在说些什么?连C++和 Windows 都扯到一起去了。 A:回想下当年的情景,一个大牛在教一群初学者如何编程。一边开发一边指着屏幕上说,你看,这是一个 Button,我们可以用一个对象来描述它,那是一个 panel我们也可以用一个对象来描述它,并且你们有没有发现,其实 Button和 Panel是有血缘关系的,你们看。。。这样就出来了。。。。下面的学生以前都是学着学校落后的教材,有些甚至还在用 turboc的 bgi库来画一些点和圆。哪里见过这么这么华丽的 Windows 界面呀。大牛说的话,象金科玉律一样的铭刻在自己幼小的心理。一边学着 Windows,一边发现,果然,他们都需要一个基类,果然,他们是兄弟关系,共同包含一些基本属性,可以放到基类去。他们越用越爽,潜意识里觉得因为 C++这么顺利的帮他们解决那么多界面问题,那看来 C++可以帮他们解决一切问题了。于是开发完界面以后,他们继续开发,当他们碰到各种设计问题时,反而认为肯定自己没有用好 C++。于是强迫自己用下去,然后就完蛋了。 (点击 more展开) -————– 关于 C++的笑话我有一箩筐,各位 C++粉用不着对号入座。言归正传,为什么要黑 C++呢?谈不上黑不黑,我从94年开始使用 C++(先前是 C 和 Pascal),一路看着 C++成长壮大,用 C++写过的代码,加起来应该超过 10MB了吧,C++的各种宝典我也都读过,一直到 2004年开始切回 C,主要原因是发现很多没法用 C++思路继续解决下去的问题,或者说用 C++思路解决下去会很糟糕的问题。 那时候(2004-2005)正是 C++满天飞的时候,言必称 C++,用必用模版,我跳出来说你们醒醒吧,别过火了,这个世界并不是都是抽象数据结构和算法就可以描述清楚的。于是很多人激动的跳出来说:“你没领会到 C++精髓,你根本都不会用 C++”。我问他们:“语言是用来解决问题的,如果一个语言学了三四年都会经常掉沟里,算好语言么?如果编写十多年 C++的程序员都很难掌握得了,这算好语言么”。他们又说:“语言是死的,人是活的”。 我记得当时一位国内 C++大牛,为了纠正我的 “错误观点”,给我看过他写的一套十分强大的库,我打开一看,倒吸了一口冷气,全部是 .h文件。我只能回他三个字:“你牛逼”。当然这是一个极端的例子,那家伙后来终于也开始把 .h里面的东西逐步挪到 .cpp里面了,这是好事。 当时和云风在一家公司,2004年新人培训时,他给新人布置了一个实现内存分配器的作业,批改作业的时候,他经常边看边问人家,“不够C++呀,你能不能百分之百OOP?”,“1%的 C都不要留”。我当时在公司内部邮件列表里面发过关于 C++的问题,大部分人都表示:“你看没有C++我们怎么写3D引擎呢?”。我跟他们讲:“John Carmack直到 Quake3都还在用着 ANSI C,后来因为不得不支持 D3D,改用 C++了。为啥 C不能写 3D引擎了?”。他们告诉我:“你看,Point,就是个对象,Matrix也是个对象,那么多 Vector的代数计算,用 C++的算术重载是多么美妙的事情,三维世界就是对象的世界。”。 确实当时客户端 GUI的话,只有 C++,图形引擎也只有 C++,这两个正是C++最强的地方,所以我也没和他们争辩,强迫他们承认 C也可以很漂亮的写图形,而且C写的可以写的很优雅。我又不是闲着没事情,何必去质疑人家的核心价值观呢,呵呵。当年我正在接手一个 C++项目,代码超过 800KB,每次崩溃都需要花费很长时间去定位,项目中大量的前后依赖,改一个地方,前后要看好几处,一处遗漏,整个系统就傻逼了。我开始重构后,画了两个星期,将性能敏感的核心部分剥离出来用 C实现(代码量仅 200KB),然后导出 Python接口,用Python来完成剩下的部分,整个脚本层代码量只有 150KB。整个世界清爽了,整个 C++项目原来的工期为 2个程序员四个月,我一个人重构的时间加起来就 1.5个月,而且代码量比远来少了两倍还多,各种奇特的 BUG也一扫而尽。我看看左边的 800KB一团乱麻的 C++代码,再看看右边整洁的 300多 KB 纯 C + Python,琢磨着,这个项目干嘛不一开始就这么做? 跨语言接口 现代项目开发,不但需要更高的性能,而且需要更强大的语言描述能力。而 C++正处在一个尴尬的地方,比底层,它不如 C能够精确的控制内存和硬件,各种隐式构造让你防不胜防;比描述能力,比快速业务开发和错误定位,它又赶不上 Python, Ruby, Lua等动态语言,处于东线和西线同时遭受挤压和蚕食的地步。 很快,2006-2007年左右,其他项目组各种滥用 C++的问题开始显现出来:当时脚本化已经在工程实践中获得极大的成功,然而某些项目一方面又要追求 100%的 C++,另一方面又需要对脚本导出接口,他们发现问题了,不知道该怎么把大量的 C++基础库和接口导给 Lua。 C的接口有各种方便的方式导给脚本,然而整个项目由一群从来就不消于使用脚本的cpp大牛开发出来,当他们要吧cpp类导出接口给脚本时,他们设计了一套牛逼的系统,lua自动生成机器码,去调用c++的各种类,没错,就是c++版本的cffi或者ctypes。他为调用vc的类写了一套机器码生产,又为调用gcc的类写了一套代码生成。那位cpp大牛写完后四处炫耀他的成果,后来他离职了,项目上线一而再再而三的出现无 可查证的问题,后来云风去支援那个项目组,这套盘根错节的c++项目,这套盘大的代码自生成系统深深的把他给恶心到了。后来众所周知云风开始反C++,倡导回归C了,不知道是否和这个项目有关系。 于是发现个有趣的现象,但凡善于使用脚本来提高工程效率的人,基本都是C加动态语言解决大部分问题(除了gui和图形),但凡认为c++统治宇宙的人很多都是从来没使用过脚本或者用了还不知道该怎样去用的人。 凭借这样的方法,我们的产品同竞争对手比拼时,同样一个功能,同样的人力配置,竞争对手用纯C++要开发三月,我们一个月就弄出来了,同样的时间,对手只能试错一次,我们可以试错三次。后来,据我们招聘过来的同事说,竞争对手也开始逐步降低 C++的比例,增加 java的比例了,这是好事,大家都在进步嘛。 ABI的尴尬 ABI级别的 C++接口从来没有标准化过,以类为接口会引入很多隐藏问题,比如内存问题,一个类在一个库里面实例化的,如果再另外一个库里面释放它们就有很多问题,因为两个动态库可能内存管理系统是不一样的。你用这里的 allocator分配一块内存,又用那里的 allocator去释放,不出问题才怪。很多解决方法是加一个 Release 方法(比如 DX),告诉外面的人,用完的时候不要去 delete,而是要调用 Release。 项目写大了各个模块隔离成动态库是很正常的,而各种第三方库和自己写的库为追求高性能引入特定的内存管理机制也是很正常的。很多人不注意该调用release的地方错写成delete就掉沟里去了。更有胜者跨 ABI定义了很多inline方法的类,结果各种隐式构造和析构其实在这个库里生成,那个库里被析构,乱成一团乱麻。C就清晰很多,构造你就调用fopen,析构你就fclose,没有任何歧义。其实C++的矛盾在于一方面承认作为系统级语言内存管理应该交给用户决定,一方面自己却又定义很多不受用户控制的内存操作行为。所以跨 ABI层的c++标准迟迟无法被定义出来,不是因为多态 abi复杂,而是因为语言逻辑出现了相互矛盾。为了弥补这个矛盾,C++引入了operator new,delete,这new/delete重载是一个补丁并没从逻辑上让语言变得完备,它的出现,进一步将使用者拖入bug的深渊。 其实今天我们回过头去看这个问题,能发现两个基本原则:跨abi的级别上引入不可控的内存机制从语言上是有问题的,只能要靠开发者约定各种灵巧的基类和约定开发规范来解决,这个问题在语言层是解决不了的;其次你既然定义了各种隐式构造和析构,就该像java或者动态语言一样彻底接管内存,不允许用户再自定义任何内存管理方法,而不是一方面作为系统极语言要给用户控制的自由,一方面自己又要抢着和用户一起控制。 因此对象层 ABI接口迟迟无法标准化。而纯 C的 ABI不但可以轻松的跨动态库还能轻松的和汇编及各类语言融合,不是因为C设计多好,而是C作为系统层语言没有去管它不该管的东西。当年讨论到这个话题时 C++大牛们又开始重复那几句金科玉律来反驳我:“语言只是招式,你把内功练好,就能做到无招胜有招,拿起草来都可以当剑使,C++虽然有很多坑,你把设计做好不那么用不就行了”。我说:本来应该在语言层解决好的事情 ,由于语言逻辑不完备,将大量问题抛给开发者去解决极大的增加了开发者的思维负担,就像破屋上表浆糊一样。你金庸看多了吧,武术再高,当你拿到一把枪发现子弹不一定往前射,偶尔还会往后射时,请问你是该专心打敌人呢?还是时刻要提防自己的子弹射向自己? 系统层的挫败 C++遭受挫败是进军嵌入式和操作系统这样靠近硬件层的东西。大家觉得宇宙级别的编程语言,自然能够胜任一切任务,很快发现几个问题: 无法分配内存:原来用 C可以完全不依赖内存分配,代码写几千行一个 malloc没有都行。嵌入式下处理器加电后,跳到特定地址(比如起始地址0),第一条指令一般用汇编来写,固定在0地址,就是简单初始化一下栈,然后跳转到 C语言的 start函数去,试想此时内存分配机制都还没有建立,你定义了两个类,怎么构造呀?资源有限的微处理器上大部分时候就是使用一块静态内存进行操作。C++写起来写爽了,各种隐式构造一出现,就傻了。 标准库依赖:在语言层面,C语言的所有特性都可以不用依赖任何库就运行,这为编写系统层和跨平台跨语言代码带来了很方便的特性。而C++就不行,我要构造呀,我要异常呀,你为啥不能给我强大的运行时呢?什么你还想用 stl?不看看那套库有多臃肿呀(内存占用,代码尺寸)。 异常处理问题:底层开发需要严格的处理所有错误返回,这一行调用,下一行就判断错误。而异常是一种松散的错误处理方式,应用层这么写没问题,系统层这么写就很狼狈了。每行调用都try一下和 C的调用后if判断结果有什么区别?C++的构造函数是没有返回值的,如果构造内部出错,就必须逼迫你catch构造函数的异常,即便你catch住了,构造异常的时候当然会自动触发相关内部对象的析构,但是有很多并没有析构的资源(比如系统资源,比如C接口的资源,他们都没有一个析构),整个过程是很难控制的,此时这个实例是一个半初始化实例,你该怎么处理它呢?于是有人把初始化代码移除构造函数,构造时只初始化一下变量,新增加一个带返回的init函数,这样的代码写的比C冗余很多。何况硬件中断发生时,在你不知道的情况下,同事调到一些第三方的库,你最外层没有把新的exception给 catch住,这个exception该往哪里抛呀?内存不够的时候你想抛出一个 OutOfMemoryException,可是内存已经不够了,此时完全无能力构造这个异常又该怎么办呢? 处理器兼容:C++的类依赖基地址+偏移地址的寻址方式,很多非 Intel系列的微处理器上只有简单的给定地址寻址,不支持这样一条语句实现BASE+OFFSET的寻址,很多C++代码编译出来需要更多的指令来运算地址,导致性能下降很多,得不偿失。 隐式操作问题:C的特点是简单直接,每行语句你都能清楚的知道会被翻译成什么样子,系统会严格按照你的代码去执行。而用C++,比如 str1 = str2 + “Hello” + str3; 这样的语句,没几个人真的说得清楚究竟有多少次构造和拷贝,这样的写法编写底层代码是很不负责任的,底层需要更为精细和严格的控制,用C语言控制力更强。 当然,说道这里很多人又说,“C++本来就是 C的超集,特定的地方你完全可以按照C的写法来做呀。没人强迫你构造类或者使用异常呀”,没错,按 Linus的说法:“想要用 C++写出系统级的优秀的可移植和高效的代码,最终还是会限于使用 C本身提供的功能,而这些功能 C都已经完美提供了,所以系统层使用 C的意义就在于在语言层排除 C++的其他特性的干扰”。……

阅读全文

二十年前是怎样开发游戏的?

知乎上有人问:“贴吧都是十五六岁就用引擎写游戏的天才,大家怎么看?”,感觉现在做游戏真实一件幸福的事情呀,不尽想起当年开发游戏的各种艰辛。

现在做游戏很简单,大把代码给你参考,大把框架给你使用,Windows帮你作完了大部分事情。我们那个年纪写游戏时,家里还没有Internet,什么资料都查不到,什么开源引擎都没有,95年左右你要写一个游戏,你起码面临:

  • 同显卡打交道,显卡著名的 ModeX显示模式,估计现在没几个人听过了吧,直接写显卡端口,N多trick才能初始化成功。
  • 直接访问显存,记得当年有个优化是,((char*)0xa0000L)[x + (y << 8) + (y << 6)]=c,把y两次左移相加代替y * 320。
  • 用调色板绘图,256色的调色板,建立若干索引表,来快速索引两个颜色混色的结果。
  • 保护模式编程,自己初始化GDT和LDT,后来找到 dos4gw,牛逼的 watcom c++。
  • 自己实现线程,编程8254时钟控制器,给CPU的IRQ0发中断,来调度不同最多32个任务,到时间靠一条IRET指令实现切换。
  • 自己控制声卡,通过220端口控制声卡(估计也没几个人用过吧),再用DMA传送音频,实现声音播放。
  • 自己实现混音,同时播放多个音源时,需要重采样成声卡格式,并且每次DMA中断时混音后给声卡。
  • 自己播放音乐,利用声卡338端口的 FM Synth合成器来播放MIDI音乐里面不同音轨的乐器音符,并用之前实现的线程系统,在后台线程运行。
  • 大量汇编代码,图形拷贝,图块缩放,RLE,显卡控制,多边形填充,键盘中断接管。
  • 自己绘制字体,HZK16,估计听过的人也没几个了。
  • 自己读取图片,GIF,PCX, BMP。
  • 自己播放视频,自己实现解码播放 animator, 3ds输出的 FLC视频格式的视频。
  • 自己实现脚本,没有LUA,没有PYTHON,但是你需要给你的游戏实现脚本来描述一些简单的剧情,没见过其他游戏是怎么做的,没有任何参考代码的情况下,意识到开发游戏需要靠脚本来提高效率,然后自己实现一套脚本系统。
  • 凭空实现游戏,从来没见过任何一款游戏代码的情况下,自己想想状态机应该怎么写,游戏对象应该怎么同时移动,图像前后遮挡该怎么做,游戏各种逻辑该如何写。
  • 学习美术设计,虽然没有美术功底,但得熟练应用当时常用的animator,3ds,等软件,自己制作一些简单的界面和角色,自己能对其他图片进行二次加工,画像素图,合并调色板。
……

阅读全文

程序高手的境界

程序员也有三六九等:

初等程序员靠知识来挣钱,会别人会的东西,喜欢折腾架构和框架,以掌握更多新潮东西而沾沾自喜,以模仿各种奇技淫巧重新实现一遍而四处炫耀,常见台词:“为啥还在用png存图片?为啥不用webp这种高压缩比的格式?”,“我们使用 Erlang的高并发特性来实现同时支持5万人的效果”,“我们使用RTMFP来降低流量成本,又使用H265来给用户提供更高品质的视频画质”,这些人能够迅速的学会各种项目需要的架构套件,以自己的生产力来挣钱。

高等程序员靠智慧挣钱,会别人不会的东西,上能抉择技术方向,下能解决性能瓶颈;讨论方案时,腾讯怎么做的,阿里怎么做的,我们该怎么做,如数家珍;写完代码后,初读让人赏心悦目,再读让人恍然大悟,三读让人心悦诚服。常见台词:“webp压缩比不高,我改了一版新webp,用H265帧内预测来保存RGB,用lzma2来保存alpha比webp好多了”,“erlang大家不熟悉,我做了一个库,让大家可以象写erl ang一样来写C++,照顾大家开发习惯,又可以象erlang一样写多线程”。“Micheal Abrash这几行代码还有很大优化空间,其实性能还可以更好!”她们都是以解决别人不能解决的问题来挣钱。

上等程序员靠创新来挣钱,能促进行业的发展,在这个充满咨询的年代,学习大家都掌握的东西只是一个基本过程,没什么值得称道的,当你baidu上找不到方案,google里没有参考,国内外没有任何人能给你启示的时候,任然能够充满创造的分析问题,抽象问题,并解决问题。找到别人完全没有走过的路,创造前人从来没有创造过的东西,这是他们的价值所在。他们的常见台词是:“别烦我!”,“忙着呢!”,“谷歌搜呀,这都问我? ”,上等程序员是国宝,他们的时间不应该浪费在无意义的事情上。

即便做到上面几点,在神级程序员眼里,也只不过如此罢了。真正的神级程序员,不靠知识和智慧挣钱,更不靠创新来挣钱,而是靠意志来挣钱,十八般语言门门精通,上能架构操作系统,下可开发嵌入芯片;成功项目无数份,胸中代码千万行!不果这些也只是基本功而已,牛逼的神级程序员,左手抱四十八斤人体工学键盘,右手提二百斤纯铁鼠标,竞争对手哪怕有千军万马,也近不得他办公桌前半步!三十六小时连续编码依旧气定神闲,体力耐力无 人能及。上市公司首席科学家,创新项目的领导者,在他们看来,也只是尘土而已,不出三回合,毕斩其首级于电脑前。他们常见的台词是:“杀!”,“弄死你!”,高手们总是睥睨天下而又冷言少语。

……

阅读全文

[转载] 《论语》魔兽版

曾子曰:吾日三省吾身。
曾子墨说:我一天要检查三次装备、药水和道具

曾子曰:君子思不出其位。
曾子墨说:牧师专心加血,不要乱跑。

子曰:父母在,不远游。游必有方。
孔子说:奶妈奶爸在后面,战士不要跑太远,即使要走也是带着盾牌走。

子曰:以约失之者,鲜矣。
孔子说:因为公会活动而下副本跑掉,听着都新鲜。

子曰:德不孤,必有邻。
孔子说:德鲁依单干不好,必须有同伴。

子曰:吾未见刚者。
孔子说:我连一件甲板都没有。

子曰:兴于诗,立于礼。成于乐。
孔子说:联盟的优点在于有爱唱诗的牧师英雄和彬彬有礼的骑士,大功告成自然众人高兴了。

子曰:吾自卫反鲁,然后乐正。
孔子说:有个德鲁依在野外偷袭我,我快乐的原因是因为我打跑了他。

子曰:吾未见好德如好色者也。
孔子说:我还从来没见过像色狼一样喜欢德鲁伊的人。

子曰:后生可畏,焉知来者之不如今也?四十、五十而无闻焉,斯亦不足畏也已。
子曰:新来的玩家似乎很牛b,你怎么知道他不是用钱买的?有的战士四五十级还不会嘲讽,下副本根本不鸟他。

子曰:不患人之不己知,患其不能也。
孔子说:我不怕你看我的装备,就怕你近不了身。

子曰:由!知德者鲜矣。
孔子说:哟,知道怎么善用德鲁依很少。

子曰:工欲善其事,必先利其器。
孔子说:你想要去燃烧,还不快去找把像样的武器。

子曰:性相近也,习相远也。
孔子说:职业相同,天赋配点会相差很远。

子曰:唯上知与下愚不移。
孔子说:只要超级高手和初级菜鸟,pk的时候才不怎么动。

子曰:“学而时习之,不亦说乎?有朋自远方来,不亦乐乎?”
孔子说:玩魔兽要多学习,这还用说么?有部落的朋友来较量武艺,不也是很开心的事么?

子曰:“吾十有五而志于学,三十而立,四十而不惑,五十而知天命,六十而耳顺,七十而从心所欲不逾矩。”
孔子说:我15级了还想着继续学习,30级开始出去闯,40级可还是什么都没捞到,50级才学会复活术,60级等了大半年,70级终于可以随心所欲去燃烧了。

子曰:“攻乎异端,斯害也已。”
孔子说:副本里面乱引怪,这会害了自己的。

孔子谓季氏,“八佾舞于庭,是可忍,孰不可忍也!”
孔子对季氏 “对方八个60级都跑到你们新手区杀人了,这都可以忍受,还有什么不能忍受呢”

子曰:“苟志于仁矣,无恶也。”
孔子说:喜欢外形美观的玩家一般喜欢联盟,不喜欢部落

子曰:“唯仁者能好人,能恶人。”
孔子说:只有追求游戏技术的高手,才既用联盟,又用部落

子曰:“朝闻道,夕死可矣。”
孔子说:“想45分钟dk就要知道路,迟了人质就要死了”

子曰:“德之不修,学之不讲,闻义不能徙,不善不能改,是吾忧也。”
孔子说:德鲁依肉搏不强,魔法一般,看到有好的野兵不能做宠物,玩了这么久又不能换职业,我真郁闷啊

子曰:“回也非助我者也,于吾言无所不说。”
老师说:被别人逼着无敌加回城,其实我一点也不爽。

季路问事鬼神。子曰:“未能事人,焉能事鬼?”曰:“敢问死。”曰:“未知生,焉知死?”
季路来问怎么玩鬼族。老师说:“人族都没玩好玩什么鬼?”季路又问:“怎么打败对方?”老师说:“怎么保命都不知道,学什么打败别人?”

子曰: 二三子以我为隐乎 吾无隐乎尔
孔子说: 你们以为我要隐身么,对付你们两三个菜鸟还用隐身?

子曰:邦有道,危言危行。
孔子说:下副本有规则,不要刷屏,小心行动

子在川上,曰:“逝者如斯夫!不舍昼夜。
孔子边上厕所边说:时间过得好快,排队排了一天一夜还进不去

子曰:朽木不可雕也。
孔子说:拿着这个烂盾牌还想做MT?

……

阅读全文

断点-C语言

看着那密密麻麻的反汇编,

连眼睛红了都没有发现,

听到你说错误很难重现,

人数还一点一点再往下减;

我转过我的脸,

不和你争辩,

未检测边界肯定,

非常的危险;

发誓从今天,

不再用 C语言,

我真想改用脚本重构好几遍!

我点上一根烟,

在这个需求善变的年代,

再好的程序员也不能幸免;

打开的源文件,

设满很多断点,

只想在睡前让程序能够,

撑到明天。

……

阅读全文