摘要: 好久没写个人总结了,印象中上次写的应该是09或者10年了。写2013年的总结,积极性也不是很高,感觉这一年没啥特别有意义的事值得说的,不过个人总结嘛,又不是个人表彰大会,非要写些很牛逼的事情,主要是记录一下这一年,看看做了什么,哪里做的好要表扬一下,哪里做的不好要改进一下。先说说我想怎么写年终总结吧,大概的步骤就是:看看年初的年度计划看看自己的微博,微信,豆瓣,doit,有道笔记,博客等等,记忆不总是那么靠谱,记录才是总结的内容,参考fenng的格式(http://dbanotes.net/mylife/2013_personal_review.html):人生各个方向的回顾:事业,财富,健康阅读全文
posted @ 2014-01-05 10:36 lzprgmr 阅读(689) 评论(0) 编辑
摘要: 最近工作压力比较大,手头有四个项目的事要做,其中三个我是owner,这三个当中:一个在开创阶段;一个在稳定开发阶段;另外一个在维护阶段。压力主要来自于开创阶段的A和稳定开发阶段的B。首先,最重要的是时间不够,又要开发,有要support,作为owner,什么乱七八糟的事情都要操心,每次一个新的release出去吧,又要担心有没有regression,有没有breakage,时不时还得应付被惹毛了的用户的challenge - 真是操了卖白粉的心。A项目进展速度不够快,因为B项目上花的时间多了些。虽然我想尽办法把B项目slow down下来,还是免不了被吸进去无数宝贵的时间,这主要要感谢一位国外阅读全文
posted @ 2013-10-12 19:18 lzprgmr 阅读(240) 评论(0) 编辑
摘要: C++的开发效率低是众所周知的,原因比如有:语言复杂度高编译效率低工具链不够完整高效(尤其是linux下)另外一个恐怕是不少编译错误让人摸不着头脑,今天碰到一个,举个例子: 1 #include 2 3 enum LogLevel { 4 ERROR, 5 WARN, 6 INFO, 7 DEBUG, 8 TRACE 9 }; 10 11 12 int main() 13 { 14 printf("%d\n", ERROR); 15 } 16 编译错误为:$ g++ -DDEBUG test.cpp test.cpp:7...阅读全文
posted @ 2013-09-07 23:53 lzprgmr 阅读(223) 评论(3) 编辑
摘要: 动态库的麻烦之处在于 - 如果你的程序使用了成百上千个动态库,你的程序在运行时如何找到这些动态库?一般有三个方法:一、设置LD_LIBRARY_PATHexport LD_LIBRARY_PATH="/path/to/lib"直接手工设是不可能完成的任务,因为你也知道有很多path (多不是问题,问题时你得知道这些path),所以一般需要在由编译系统来自动产生这些path,并放到一个runscript中:#set pathexport LD_LIBRARY_PATH=/path/to/lib1export LD_LIBRARY_PATH=/path/to/lib2:$LD_阅读全文
posted @ 2013-09-07 23:36 lzprgmr 阅读(219) 评论(0) 编辑
摘要: 说到软件项目的依赖管理,可以从三个方面来考虑:一、由build system控制的dependency现在的build system,都支持一定程度上的dependency management, 比如make支持target之间的dependency,ant也支持其每个target之间的dependency(区别是make的每个非PHONY的target是个文件,make会检查输入与输出之间的timestamp来达到incremental build的效果,而ant则是对上一次build没有任何记忆,除了javac task支持incremental compile)上面的dependenc阅读全文
posted @ 2013-09-06 09:13 lzprgmr 阅读(148) 评论(0) 编辑
摘要: pathing jar是一个特殊的jar:该jar文件只包含manifest.mf文件该manifest文件只包含Class-Path,列出了所有需要真正加到classpath中的jar,或者directory需要pathing jar的原因是windows下command line额长度限制(8k),无论你怎么声明你的classpath:set CLASS_PATH=allpathsset CLASS_PATH=path1; set CLASS_PATH=%CLASS_PATH%;path2java -cp allpaths结果都会是:The input line is too long.T阅读全文
posted @ 2013-08-24 16:51 lzprgmr 阅读(234) 评论(0) 编辑
摘要: 所谓的patch strategy,就是软件发布后出现bug时打补丁的方式 - 主要是关于源代码branch如何组织的方式针对项目的开发阶段、开发状态、维护方式不同,可以有不同的patching strategy一、trunk - release新版本从release branch发布适合只需维护最新版本的情况 - 一般工具类型的项目适合有较多的开发者在trunk上check-in代码的情况,因为trunk可能不太稳定,而且包含一些不想release的代码需要release时,从trunk分支选择需要的feature,integrate到release分支并发布同时,开发者继续在trunk上开阅读全文
posted @ 2013-08-24 16:20 lzprgmr 阅读(290) 评论(0) 编辑
摘要: cocos2d-x自带了不少示例,以及几个比较简单的游戏,不过这些游戏都是用javascript binding(SpiderMonkey)做的,所以我猜测javascript binding可能是cocos2d-x开发游戏的主流模式,优点是:游戏逻辑用javascript,开发效率高,无需编译直接跑因为使用了javascript binding,实际跑的还是C++代码,性能不容小觑javascript binding使用的api与cocos2d-html5一致,以后向cocos2d-html5移植转换成纯网页游戏的成本接近于0CrystalCraze用的系统自然也是js binding。一、阅读全文
posted @ 2013-07-18 21:56 lzprgmr 阅读(769) 评论(0) 编辑
摘要: 看代码相当简单直观,觉得怎么都不会出错,可运行结果明明就是错了 - 对着vim摸着脑袋就是想不出哪里有问题,可去掉新加的代码,就又可以了。没办法,只好祭出杀手锏:一行一行注释掉来观察。。。反映问题的代码段相当简单:if condition then local v = create_object(mpr) if condition2 then v.R = "fixedR" end return v.MP .. v.Rend被影响的是和v同类的一些object,可是这个代码里怎么看都没问题,v是被我改了,可那是local的啊,管我怎么改对全局都不会有影响。当注释掉这一行试了一阅读全文
posted @ 2013-07-18 21:04 lzprgmr 阅读(163) 评论(0) 编辑
摘要: 接触的语言越多,对语言的偏执就越少,越来越明白语言只是一种解决问题的工具 - 核心永远是问题与解决问题的思路。我的体验,从简练程度上来讲,shell脚本优于perl/python/lua,perl/python优于java/C++,所以能用前者解决的问题,就别用后者。项目中用到python,前段时间就“系统”的学了下python - 主要也就是把官方的tutorial过了一遍,从学习python的资料来看,我的评价是:Python Tutorial(http://docs.python.org/2/tutorial/), 简洁而重点突出,绝对是上品,把这个快速的过一篇,例子全部敲一遍,想说没入阅读全文
posted @ 2013-07-12 09:14 lzprgmr 阅读(299) 评论(3) 编辑
摘要: 老板叫我帮他测一个命令在windows下消耗的时间,因为没有装windows那个啥工具包,没有timeit那个命令,于是想自己写一个,原理很简单:REM timeit.batecho %TIME%call %*echo %TIME%然后两个时间减一下就可以了,但是总是自己去减始终不方便,最好能直接算好打印出来。因为涉及到时间格式的解析,时间的运算,在batch下比较困难,自然就想到了python或者perl脚本,这里首先想到的是python的-c参数:REM timeit.batset t1 = %TIME%call %*set t2 = %TIME%python -c "some 阅读全文
posted @ 2013-07-06 07:50 lzprgmr 阅读(238) 评论(0) 编辑
摘要: 这其实是个非常简单的东西。我们会写一些命令行的工具,一般跨平台的话,会用python或者perl写,比如叫foo.py,然后在Windows和Linux下调用这个脚本:Linux: foo.py - 只要在第一行加上:#!/usr/bin/pythonWindows: python foo.py直接foo.py是不一定能工作的,除非你在你的系统中设置了的映射,但这个就有问题了,首先,这对本机有依赖关系了;其次,你到底用哪个版本的python?每个系统设置可能不一样 - 作为这个工具的作者肯定希望我们来控制这些因素。于是,Windows与Linux的命令行就不一致了。。。解决方案是为window阅读全文
posted @ 2013-06-25 20:58 lzprgmr 阅读(245) 评论(0) 编辑
摘要: 先谈谈三个code review的关键因素:一、创建review要简单code reivew是一个程序员日常工作中经常做的一件事,理论上来讲,任何一个将要submit到SCM的change,都必须经过peer review。如果创建一个review要傻了吧唧的打包代码,发送邮件,或者shelve一个changelist,再发信告知changelist number,或者进入某个比较先进的code review系统(比如crucible)手工创建一个review,这些步骤都太过繁琐,任何一个懒惰的程序员都不会有耐心来做这种事,更别说日复一日的做这种愚蠢的事了。我们需要的是一键式创建review 阅读全文
posted @ 2013-06-23 21:46 lzprgmr 阅读(1260) 评论(7) 编辑
摘要: $ history | awk '{print $2}' | sort | uniq -c | sort -nr | head 124 dir 80 vi 77 echo 60 cd 58 vim 53 jobs 38 gcc 33 ls 33 less 31 lua124 dir虽然linux下也有dir,但明显没有ls来的正统,甚至很多linux党都不知道这个命令的存在 - 这个是windows下面比较经典的命令阅读全文
posted @ 2013-06-22 06:45 lzprgmr 阅读(227) 评论(0) 编辑
摘要: 工作8年,前6年基本是Windows环境下,也就是个鼠标党;两年前换工作开始用linux,也就开始了领略了命令行的强大,无论是直接在命令行组合命令,也还写几行简单的shell脚本,其能完成的功能往往令人难以置信。关于命令行强大的一个例子:csdn泄露的10个最常用的密码awk '{print $3}' www.csdn.net.sql |sort |uniq -c |sort -nr |head (陈硕同学写的)关于脚本强大的一个例子:提高分布式环境中程序启动性能的一个方法如果说我工作中第一次感觉“哇”是08年左右开始使用perl处理文本 - 发现脚本原来可以如此强大,自动化那阅读全文
posted @ 2013-06-22 06:42 lzprgmr 阅读(318) 评论(0) 编辑
摘要: 假设在linux下,你有一个可执行文件,其依赖于100个动态库,而这100个动态库来自网络中不同的位置,甚至可能来自不同的region,即使网路用的是专用光纤,其网络延迟也不可忽视,那么在启动该可执行文件时发生了什么:100个rpath100个动态库为了加载任意一个动态库,都需要在这100个rpath逐个寻找,假设其实一一对应,那么查找的次数为:1+2+3+...100=5050,在分布式的环境中,这个代价是非常大的(根据网络环境的不同,有的甚至能达到10分钟以上)。但其实有个蛮简单的方法,可以完全消除这些无谓的查找:把rpath设为只有一个entry,比如当前目录,然后把这个可执行文件所有的阅读全文
posted @ 2013-06-22 06:10 lzprgmr 阅读(288) 评论(2) 编辑
摘要: lua没有调试器,但是它提供了很强的调试功能(debug 库), 所以其实一些常用的调试功能都能很方便的使用,就像使用一个命令行调试器一样:【例子程序】-- debug.luagvar1 = 100function foo() local var2 = 10 function bar() debug.debug() return var2 end bar()enddebug.debug()foo()【设置断点】这个比较麻烦一点,需要修改代码加入一句:debug.debug()如果...阅读全文
posted @ 2013-01-01 11:40 lzprgmr 阅读(1935) 评论(3) 编辑
摘要: 很多时候,针对大部分情况,你能有一个完美的设计,但是当一些边边角角的情况被考虑进来之后,这个“完美”的设计就不在完美,甚至无法工作,这个时候,你其实有两个选择:重新设计,找到一个对这些rare case也适用的设计保持原有设计,但找到一个让这些rare case能够正常工作的work around第一种选择的是牺牲了整理设计,妥协后的方案可能能工作,但非常的丑陋; 而第二种选择则是牺牲了部分用户,但保证了整体设计的优美。选择的关键在于这些rare case到底有多rare,以及这些rare case有多重要。我的观点是:如果可以,请尽量选择第一种方案。我这里有个例子:一般对于C++工程,我们需阅读全文
posted @ 2012-12-10 18:19 lzprgmr 阅读(164) 评论(0) 编辑
摘要: 一般面试C++,都会很无聊的问到虚拟函数的实现机制,接着就会问到vtable放在哪里 - 实现细节中的细节,我个人觉得这个除了卖弄没啥大意义,但面试嘛,一般就这吊样。写个小程序:#include <iostream>using namespace std;// .data - read-write dataint rwdata = 100;// .rodata - read-only dataconst char* rodata = "hello, world";// .bss - non-initialized dataint bssdata;// .text阅读全文
posted @ 2012-12-08 20:56 lzprgmr 阅读(435) 评论(2) 编辑
摘要: 最近一直在做一个build system的依赖管理,感觉其中某些内容可以抽取出来,作为一道很不错的面试题:假设你在同时编译n个项目,他们相互之间有依赖关系,比如:现在,让你写一个算法,把每个项目的依赖拍平:即把其所有间接依赖+直接依赖的项目都输出。比如上面这个图的输出就为:a: b c d e f gb: c dc: dd:e: f gf: gg:然后,还可以有后续的问题:如果有环,如何判断并输出环?如果这些项目有可能有一些外部的依赖,请改变你的算法以适合这种情况。好,面试到此结束。下面是个扩展题,没在工作中做到,但后来想了下,觉得挺有意思:为了提高编译速度,现在需要找出那些可以并行编译的项目阅读全文
posted @ 2012-12-07 20:45 lzprgmr 阅读(324) 评论(0) 编辑

黄将军