分类: tech

  • 工具与技术,兼论如何选择技术

    论点一,如果某项技术必须某个工具的支持,远离它。(微软的COM、DCOM)

    论点二,工具只是帮助,不是学习技术的必须,vi、emacs也是如此。

    论点二点一,熟悉工具会帮助你更节省时间,更好的专注于开发本身,比如textmate,但不是不使用这个工具就完不成任务。

    论点三,如果某项技术连介绍都看不明白,远离它。(Windows Azure)

    论点三点一,如果有两个类似的技术,选择表述实用、设计简洁、使用简单的那个,此乃奥卡姆原理的推论也。(c与c++,j2ee与spring,azure与appengine)

  • WRK – windows操作系统源代码下载

    从潘爱民的博客看到这东西的,潘爱民准备写一个windows内核方面的书,就提到了微软的WRK计划(Windows Research Kernel),这个计划是让高校师生以及亲密的合作商有一个机会能够了解和学习windows的内核代码,它的网站在这里:

    http://www.microsoft.com/resources/sharedsource/windowsacademic/researchkernelkit.mspx

    虽然有个下载连接,可是进去以后需要申请一个序列号,我已经申请了,但是不知道能不能拿到这个序列号。

    WRK应该是包含了以下这些模块的代码,都是很实惠的,学习一下感觉挺有意义。而且WRK应该是可以编译运行的(需要验证),如果是这样,那就比光看代码更有用处了。

    The Windows Research Kernel contains the sources for the core Windows (NTOS) kernel.

    NTOS implements the basic OS functions for:

    * Processes
    * Threads
    * Virtual memory and cache managers
    * I/O management
    * The registry
    * Executive functions, such as the kernel heap and synchronization
    * Object manager
    * Local procedure call mechanism
    * Security reference monitor
    * Low-level CPU management (thread scheduling, Asynchronous and Deferred Procedure calls, interrupt/trap handling, exceptions)

    既然是为了学习(先拿到再说以后学习的事),估计会有好心人放出来代码的。所以开动google,果然找到了线索。国内有个驱动开发网,里面有个链接就是谈论这个东西。

    http://bbs.driverdevelop.com/read.php?tid-99380-fpage-0-toread–page-1.html

    如果还没有找到,那就试着查查wrk.7z,大概是个8M左右的7z压缩文件。反正我最后是从某个网站上下载了。

    http://groups.google.com/group/lua5/web/wrk.7z

    说到windows源代码,不得不说一下前几年windows2000代码泄露事件,那是货真价实的程序源代码,而不是像WRK这样的科研作品,但是好像也没有人因此产生什么新的书籍,谈论的也只是一阵就悄无声息,估计是被微软的法律信吓到了。不是有个博客“刀枪blue”因为介绍Windows7就收到了微软的律师信么?(参见http://www.vista123.com/html/5478.html)

    论起来操作系统的开放源代码,MacOSX、Linux家族、BSD家族、Solaris都早已经大规模的开放了源代码,他们都各有特点和长处,在大型服务器领域这些开源的操作系统应该占有率已经超过了微软的windows server。windows这样偷偷摸摸的开放代码,还需要什么身份认证之类,真是很小家子气,你说我瞧不起他们难道没有道理么?而且Linux内核设计、 Linux内核设计和代码阅读、Solaris内核设计都已经有大量的著作介绍,阅读难度要比看WRK简单的多。就我个人而言,我只想看看里面一些简单的函数或者代码,花个半天时间研究一两个,整体上不会去深度研究的,毕竟这个东西研究的深了对我而言也没什么价值,兴趣所至玩玩即可。

  • 互联网上一切皆有可能

    十年前,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的评分,这个就更客观了。另外不要买新书,因为新书在一开始可能会有一些书托吹捧,可以过一段时间看看。

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

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