博客

  • 年前年后这几天

    过年对于我们大人来说似乎越来越没意思,除了能多些时间陪陪家人之外,用萌萌的话说简直就是索然无味。

    腊月二十四从娘家回来后因为身心疲惫,足足在床上躺了两天,跟本没有精神去办什么年货,两个人甚至连双新袜子都没买。幸亏宝宝有爷爷奶奶照看,俺们也是

    照例回沟里过年。如果说没有年货好像还有点儿冤枉了,福字倒是买了几个,呵呵。

    虽没办什么年货,卫生还是打扫了一下的。先是大洗一通,把衣物床单被罩之类都清洗干净;然后把所有房间的灯具都擦拭干净

    ,还把坏掉的灯泡给换了;第三是把浴室彻底刷洗一遍,算是做到亮亮堂堂过大年吧。前两个活帅哥都起了很大作用,洗衣机由他搬进去,拆卸灯具也全是他的功劳,之前我总说人家不做家务,其实是大大地冤枉了,人家一年到头地负责刷碗,我咋给忘了呢,人家经常往家里办置生活用品我咋给忽略了,人家偶尔还会主动洗衣服扫地……

    初一帅哥大舅全家到沟里串门儿,我们着实热闹也辛苦了一番,初二本来帅哥奶奶家亲戚搞家庭聚会,我因为娘家的特殊情况没有参加,急匆匆赶回去帮妈妈招待初三的大批客人,大厨的名声也因此传将出去。可惜因为妈妈的不信任和唠叨俺一走神儿割破了手指,幸亏伤口不是很深,今天已经没有那么红肿了。初四到长辈们家里拜年一上午(正规行礼那种)下午简单招待小姨后跟妹妹送其回家,跟一老同学仓促见面后,大晚上地搭朋友的顺风车赶回大连,因为没有吃好睡好加上紧张劳累,在车上有些恶心想吐呢。

    实在折腾瘦了,今早称一下只剩94斤,一冬天不但没长肉反倒掉了五六斤,唉!初五幺幺睡了一天,才觉得缓过来一些。今儿阳光明媚,俩人儿高高兴兴去沟里陪老人孩子直到晚上才回来,想想很久没记账了,在帅哥的撺掇下,草草写几句,明儿还要回沟里包饺子,因为是小孩儿的日子,呵呵,年说过去就过去了,除了折腾就是折腾,难怪妈妈总说过年最没意思,唉。

    之前听同事说好像初八上班,到现在没消息简直太好了,希望能按照原计划二月中旬开工吧,!!!

  • 互联网上一切皆有可能

    十年前,ICQ是国际上最流行最火爆的IM(即时消息)客户端,没人能想到不到10年它就衰败了。

    十年前,最火爆的电脑软件公司是微软,微软一出谁与争锋。而现在,apple和google的一言一行都会引人注意,他们的CEO要么年轻(佩奇)要么有着明星般的气质(乔布斯),他们的粉丝给apple公司和google建立专题博客,甚至一点点小变化都可以成为焦点。而微软,虽然盖茨大叔也经常被人拿来嘲笑,可是到了巴尔默,好像只剩下傻乎乎的推销员热情,微软完全成了小丑,微软的新闻基本上跟官司或者负面联系到一起。

    十年前,没人想到网络游戏把单机游戏打得如此之惨,所有的游戏公司都在往网络发展,已经很久没有听说过单机游戏大作了。暗黑破坏神3,等它出来估计网络功能要远远超过单机玩了。

    五年前,没人想到一个输入法会重新因为网络而又火爆起来,搜狐、谷歌、腾讯,谁都在开发自己的输入法,功能都很雷同,目的都是重新抢占用户的桌面,由桌面从而勾引到网络。

    十年前,腾讯刚刚起步,还叫oicq,百度还未产生,现在他们已经是中国互联网的大哥大,而当时牛逼的国外公司,现在已经有不少已经倒掉,Yahoo甚至求着别人收购自己。

    五年前,互联网上免费邮箱越来越小,收费电子信箱好像成了主流,收费成了大众的呼声,而google的gmail一出,大家都歇菜了,263以及大批数字域名邮箱都在五年后销声匿迹,免费的gmail甚至打败了不可一世的hotmail,微软在互联网上又败了一阵。

    五年前,ebay中国(又叫易趣)跟阿里巴巴的淘宝战在一起,没人能预料到阿里巴巴胜利了,而且竟然还吃掉了yahoo中国。地头蛇又一次战胜了过江猛龙。(百度算第一次,腾讯战胜msn、icq算一次)

    五年前,没人知道ipod会带领apple建立一个庞大的媒体帝国,成为事实上的标准,而现在,有谁知道微软也推出了zune来对抗苹果?甚至在微软经营多年的智能手机领域,苹果和google的纷纷出手,把微软这个老师傅打得是两眼乌青,最炫的是iphone或者gphone,而windows mobile,那是山寨机的最爱,档次高下立辨。微软又输一阵。

    五年前,微软雄心勃勃要用Vista来占领用户的桌面,继承windows Xp的优良传统,而现如今,windows xp的退休年龄不断延迟,而新一代的windows7也开始出头,vista注定要跟windows me一样昙花一现。甚至windows7,也未必能挽回微软的颓势。

    为什么呢?互联网上一切皆有可能,apple和google都在推出自己的浏览器,加上google的app还有苹果的me.com,谁还需要windows呢?

    对于一个传统行业,互联网应用是否就不那么重要呢?未必。除了一些特殊要求实时性和安全的行业,B/S系统(浏览器服务器体系)或者RIA系统(丰富界面互联网应用)有着一些优良的特性,一个是不需要客户端配置或者应用下载,只要服务器更新就可以。另外现在互联网开发的应用方法已经非常成熟,可以根据不同需求选择多种开发方法。设想一下,新的开发体系可能是服务器+简单桌面程序+浏览器+手机终端或pc终端。配置一个硬件只需要使用浏览器即可。当然一些复杂应用还是可以使用桌面开发,但是已经不需要使用原来笨重的设计方法了。

    一切皆有可能,网络上,新的传奇一直在发生。

  • 如何得到Windows系统的高精度计时

    可以看这篇http://en.wikipedia.org/wiki/Time_Stamp_Counter

    文章里有个简单的代码,如下:

    1)calling  ticks getticks(void);

    2)calling double elapsed(ticks t1, ticks t0);

    #if _MSC_VER >= 1200 && _M_IX86 >= 500 && !defined(HAVE_TICK_COUNTER)
    #include <windows.h>
    typedef LARGE_INTEGER ticks;
    #define RDTSC __asm __emit 0fh __asm __emit 031h /* hack for VC++ 5.0 */
    static __inline ticks getticks(void)
    {
    ticks retval;
    __asm {
    RDTSC
    mov retval.HighPart, edx
    mov retval.LowPart, eax
    }
    return retval;
    }

    static __inline double elapsed(ticks t1, ticks t0)
    {
    return (double)t1.QuadPart – (double)t0.QuadPart;
    }

    如果是64位

    #if defined(_MSC_VER) && defined(_M_IA64) && !defined(HAVE_TICK_COUNTER)
    typedef unsigned __int64 ticks;

    #  ifdef __cplusplus
    extern “C”
    #  endif
    ticks __getReg(int whichReg);
    #pragma intrinsic(__getReg)
    static __inline ticks getticks(void)
    {
    volatile ticks temp;
    temp = __getReg(3116);
    return temp;
    }

    在64位机器上的代码有些难懂,简单查了一下,可以看出来如下,intrinsic在这里有介绍

    http://msdn.microsoft.com/en-us/library/tzkfha43(VS.80).aspx

    http://msdn.microsoft.com/en-us/library/sctyh01s(VS.80).aspx

    http://msdn.microsoft.com/en-us/library/26td21ds(VS.80).aspx

    好像是说要把函数调用改成内联,来提高速度。对于可以内联的函数,msdn上有列表,基本上都是CRT函数,不是每个函数都可以调用这个预定义的。

    __getReg将会得到寄存器的值。这个命令必须先使用intrinsic(msdn里提到的)。

    http://msdn.microsoft.com/en-us/library/kcb3wece(VS.80).aspx

    3116,是INL_REGID_APITC寄存器。这段代码应该是由intel自己的developer发出来的,在这里有个文档。

    http://www.securitytechnet.com/resource/rsc-center/presentation/intel/spring2002/DESL187.pdf

    这篇文章http://msdn.microsoft.com/en-us/library/bb173458.aspx介绍了windows下编程高精度时间需要考虑的一些问题,值得一读。

  • 计算机编程新人入行指导番外篇

    前面介绍了一个计算机开发人员如何很好的参与到一个新的项目组里,这一篇想讲讲其它的一些方面,相对来说零散一些,故作为番外篇出现。

    进入公司,一般会分给你一个公司邮箱作为业务交流使用,这里推荐大家再申请一个google的账号http://mail.google.com/mail/signup,这个账号可以使用google所有的服务,包括google的信箱系统gmail,日历系统Google Calendar,新闻组google groups,在线文档google docs,博客系统google blogger。

    gmail可以作为个人使用的一个信箱,足够大而且功能很全面。calendar日历系统可以管理自己的日程安排,还有短信支持;通过新闻组可以参加一些技术方面的讨论,比如我喜欢的toplanguage,相对论坛来说,噪音更少一些,另外python-cn的group也是经常去看的。大家还可以使用docs保存一些技术文档或者写写心得体会,甚至可以用来记账。google blogger是一个最为开放的免费blogger hosting系统,大家可以在上面写写自己的技术感想或者是生活日记,也可以借此来展现自己的技术水平和文学才华:)。

    另外,可以注册一个delicious.com的账号(好像现在是跟yahoo账号合并了吧),这是我常用的一个收集网站的工具,相比浏览器的书签,它可以保存的更长久,不会因为重装系统就丢失了自己喜欢的网站。一般常用的做法是firefox浏览器加上delicious.com的浏览器插件,看到有意思的网站,点一下toolbar按钮就收藏起来了,方便得很。

    谈到软件,需要着重介绍一下,大家可以先安装google的软件包,这里面包含了谷歌拼音、谷歌金山词霸、瑞星杀毒软件谷歌合作版(完全免费、全功能),用于 IE 的 Google 工具栏,还有谷歌桌面搜索,这些都推荐大家安装,实用价值很高而且都是免费的。

    作为程序员,必须有一款常用的文本编辑器,对于windows程序员我推荐开源免费的notepad++,功能很强大。另外必须安装的是免费的winmerge,每次进行代码check in、check out,都需要比较代码变化,或者是进行code review的时候,一个好的merge工具能节省很多力气。其它的比如office或者visual studio什么的都是必要软件就不多说了。

    安装好这些软件,参加完公司的入职仪式,就是一个正儿八经的软件开发工程师了,这里再简单说一下平时要注意的一些事情。

    作为开发人员,经常会跟外面的客户打交道,或者是有些外企可能要跟国外同事进行邮件交流,那么如何更好的使用邮件呢?

    假设这样一个情景,在defect系统中,你被分配到一个bug,里面介绍了不少的步骤,你照着做完以后,却没有得到同样的错误结果,软件跑的很正常,该怎么办?不知道有没有人会直接发个邮件给客户,“我试了,软件是好用的,你这个问题没法重现”,估计客户不投诉你都是不正常的。首先确定自己的环境设定是正确的,软件版本跟问题描述的是一样的,因为不同的版本可能导致不同的结果,也可以让测试人员帮忙重现这个问题,或者自己在一个干净的虚拟机里面进行重现,因为开发人员的桌面机里面通常是不同版本混在一起,系统不是很干净,有空的时候,安装一个windows系统的虚拟机,然后压缩备用,将来使用的时候解压就好了。假如这些步骤都做了,还是没法重现,那就真是应该跟客户沟通了,注意在邮件里把自己重现的步骤、一些实验结果、相关一些软件规范粘贴进去,这样客户或者同事可以知道哪个步骤可能跟他做的不一样,另外一些不同的注册表配置、杀毒软件防火墙设置、软件参数配置都可能导致重现结果的不一样,这都是要注意的。反复几次基本上都可以找到问题的真正原因了。

    总而言之,就跟我在“入行指导”一文里提到的,跟客户或者同事交流的前提是要有诚意,也就是你真的做了一定的努力和研究,这就是所谓的“态度决定一切”,不要一遇到问题,立刻就发问或者写邮件。

    个人感觉(也许不对),不要在跟同事交流的时候总是张口就来“我想xx、我还以为xx、我寻思xx”这样很主观的论断,哪怕是书上写的结论,也应该验证一下或者思考一下,任何一个结论,没有事实支持都是沙滩上的城堡罢了。另外作为一个新人,这些动手过程也可以帮助自己更好的学习新知识和理解问题。如果总是这么不假思索张口就说,可能给人比较肤浅的感觉。

    除了一般工作之外,平时应该尽量多看一些相关的书籍充实自己,如何选择一本好书是个大题目,以后有机会再写。这里有一个简单的办法,可在douban上搜索一下打分和评论,看看其他读者怎么说的,如果是影印版可以看看amazon.com的评分,这个就更客观了。另外不要买新书,因为新书在一开始可能会有一些书托吹捧,可以过一段时间看看。

    一个新人进入公司的头几个月会感觉到非常疲劳,这其实是正常的,任何一个人到了一个新的环境,都会感觉到紧张不适应,过一段时间就会好起来。也许会有一些心理挫折感,比如因为关系不熟悉或者业务不熟悉,平时同事讨论插不上话,只能看着。这其实是正常的,经过努力都是可以转变的。一个好的公司在新人入职以后,都会指定一个老同事作为指导,平时应该多跟老同事交流,哪怕说的不太靠谱,也不要担心大家笑话,因为每个人都是从这个阶段过来的。只要努力,一定会逐渐融入团队当中。

    总结一下,进入软件开发这个行业,一定要多跟团队其他同事交流、多学习、多思考、少说多做,有了这些努力,新人应该很快就可以在开发团队里如鱼得水融洽工作了。

  • 计算机编程新人入行指导

    从2003年加入现在的公司,已经有了快6个年头,自己也从一个计算机软件开发方面的新兵变成了老人。在公司里也做过几个不同的项目,有一些新的同事加入项目组,会有这样那样的疑惑和问题。在这里想简单说说,一个新人如何能快速的融入一个新的开发组,让其他同事能够接受自己。

    首先是读文档。计算机方面有个著名的黑话叫做RTFM,什么意思呢?按字面翻译就去“去读他妈的文档”,这是在新闻组或者论坛里可能常见的回复,一些人娇滴滴的说“我是妹妹,能指导一下这个问题么”或者贱兮兮的”跪求某某问题答案”。当然,同事之间不可能搞这些,不过也经常碰到有人问一些感觉非常简单问题,这些问题实际上都在项目文档或者软件规范里就明白写着。

    一个新人加入某个项目,或者转换到一个新项目,都会感觉到手足无措,就像老虎吃刺猬不知如何下嘴。领导不会让这样的新人去完成一些复杂模块的开发或者修改一些相对困难的bug,基本上都是先分一些界面上的小改动,或者是让他开发耦合程度低一些、相对独立一些的功能作为练手,这个时候作为一个新人就要尽快的掌握整个项目的大概,然后泛读一下项目的重要文档。如果要开发某个业内标准的实现软件,那这个标准的相关文档至少要通读一遍,不需要投入很长时间,可以快速掌握一下大概,做做简单的笔记,不懂的地方先记下来以后有空再说。读文档不要作为一个整体任务完成,可以用一些零碎时间来读,以免很长时间没有什么进展,领导看了还以为在磨洋工呢。

    **注意事项一,尽管有这样那样的软件支持,一支笔一个本子仍然是最方便最快速最实用的学习工具,我几乎每年都要写掉八九个大笔记本,里面写着项目开发的心得、文档书籍的感受、领导指示的一些开发问题等等,不需要有什么文章格式,先写下来就可以了。

    如果是第一次进入公司,项目组长会分一个任务作为对新人水平的考察,就好比网游中的新手任务。我们公司大多数的新手任务都是半个月一个月左右的时间,注意要尽量赶在期限结束前完成所有的编码和单元测试,而且最好完成代码清理和代码注释工作,注意命名规则,这样看起来比较专业一些。

    **注意事项二,接到一个项目第一个要问的就是这个项目结束期限(dead line)是什么,这样心里比较容易对进度有个估计,免得最后无法完成任务。领导可能会反过来咨询老程序员对分到的项目难度估计。一般来说,估计一个大概的编码时间,然后把估计时间乘二,留出一定余量比较好。

    接手一个新任务,必须要做的就是理解需求。一个开发人员如何不理解他想做什么,基本上这个任务一定会失败。我们高考时候都会写一篇大作文,对题目的理解非常重要,偏题跑题就没法拿到高分,开发也是如此。对需求的理解需要反复的进行,定期和项目组领导或者客户进行沟通,以免自己做了无用功。但是沟通之前一定要注意,自己先掌握一定的背景知识,比如前面提到的规范文档,或者是读一读已经有的代码,跑一跑成型的产品,免得问的都是不必要的问题。

    搜索一下可以找到一篇题为”提问的智慧“的文章,里面介绍如何在网上问问题。其实项目组内沟通也是如此,要注意问有意义的问题。打个比方说,有时候自己会有一种感觉,跑到别人面前,把问题说了一遍,还没等人回答,突然拍着脑袋说”啊我明白了“,也许是反应挺快,可是还是耽误了别人的功夫,像这样的问题,自己组织组织语言或者写出来,答案就很容易发现。另外也有的人,总是这是怎么回事那是怎么回事,其实到搜索引擎一搜或者是把动手做做就知道结果,但是非要张嘴问,这样的人说得难听点就是问题不经过大脑,其实一思考就能得到答案了。问问题之前也可以试着理清一下思路,看看前因后果,简化一下问题模型,也许经过这些方式,自己就能找到答案。有同组的同事问问题,很多时间我反问几句,把思路理清,他自己就知道答案是什么了。忘记在哪有看到一个轶事,在某个著名软件公司里,开发组的桌上会放着一只小熊,大家互相问问题之前,先对着小熊把问题说一遍,看能不能把问题描述的清晰,基本上说的比较有条理以后,答案也就随之而来了,大家可以试试这个办法。

    **注意事项三,提问之前,自己先试图看看能不能找到答案,我建议的寻找顺序是文档、google,最后才是张嘴问,问之前最好已经积累了一些材料,比如关于这个问题自己做了什么研究,搜索了什么关键字等等,这样问的有诚意,回答才能有诚意。

    另外,对于一个新人,需要多跟老同事沟通,了解项目的关键点是什么,比如开发一个通讯程序,用了什么协议,哪个网站比较有用,哪个文档需要精读,都是非常有意义的问题,这些问题可以少走一些弯路。早上到了公司,第一件事是接收业务邮件,然后记下一些需要回复或者要做的工作。邮件阅读以后,可以跟项目组长做个简单的沟通,了解一下哪个任务或者功能需要快一点完成,交流一下自己的想法,时间花费不多但是可以把一天的任务明确下来。

    如果比较努力而且有一定的开发能力,两三个月以后应该开始接触到项目比较核心的东西了,这个时候需要做的工作就是读代码。一个项目最重要的东西就是代码,至于文档、注释、测试,其实都是保证代码质量以及代码可维护型的一种辅助手段,作为一个开发人员,不熟悉代码就是致命的错误。

    读代码我这里有一些简单的体会。

    读代码要注意的第一条是从界面开始,深入到功能。打个比方说,一个桌面软件,其中有个格式转换功能,可以从菜单选择”格式转换“进行操作(注意,所谓格式转换就是一个例子,没有实际意义),那么就可以搜索菜单里的”格式转换“,找到相对应的界面函数,这就是一个相对独立的功能入口点了。然后从这个入口点顺藤摸瓜,就可以搞清楚格式转换这个功能需要的一系列界面函数以及逻辑实现函数。

    读代码的时候注意要随时做笔记,可以用word或者是powerpoint这样的软件做记录,搭配一个抓屏软件抓取界面变化、程序运行栈或者是一些关键数据就更好了。

    一个相对独立的功能基本上是由几个数据类或者数据结构,加上几个比较重要的逻辑函数实现的,抓住了这些关键就抓住了这个功能的核心。比如说一个通讯软件,重要的就是通讯数据格式和通讯协议实现。经过我的体验,这个小窍门还是很有用的。一般经常出现问题的也就是这些相对来说复杂一些的函数。

    阅读代码的同时还要经常问自己一些问题,比如这个地方为何这样实现,有没有其他的方案,哪个方案更好一些等等。这些问题可以让自己更好的理解当时开发人员的一些想法思路,另外也是将来代码进行重构的一个铺垫。

    **注意事项四,作为一个开发人员,多思考是非常必要的一个特质。

    一个新人,经过这些阶段,基本上可以成为项目组的中坚力量了,希望每个入行的新人都能成功晋级成为老手。