如何得到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这样的软件做记录,搭配一个抓屏软件抓取界面变化、程序运行栈或者是一些关键数据就更好了。

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

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

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

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

快快乐乐的年三十

今儿是大年三十,跟帅哥贴了春联后早早就赶去沟里了,一家五口欢欢喜喜迎接牛年的到来,萌萌宝贝当然是最开心的一个,老人常说过年就是过孩子,看来是一点儿不假啊。

到沟里后我俩在楼下打电话看是否还需要买点什么东西,小丫头立刻抢着叨叨她自己心里装着的那点小事儿,我们一再解释说马上要见面她才肯罢休,进门一边帮我们摆拖鞋一边追问是否给她带图书来,当得到肯定的回答后立刻欢呼雀跃。

萌萌从很小就爱看书了,而且看书的热情高到令人无法想象,用奶奶的话讲就是扒开眼睛就得要找书……今天这本贴纸书简直成了她的至宝,恨不得上卫生间都带着,我们担心她累眼睛劝其休息人家是死活不肯,临睡前还一脸严肃地嘱咐我们千万不能动她的书!萌萌午觉才睡了一个多小时,奶奶说就是因为惦记着那本书啊。小丫头看书不光是看图画看热闹,还能大声朗诵。今天她格外高兴书也看得特别耐心,大段大段的文字她都逐一阅读,有些不认识的就由我帮着补充,我们都惊叹于她居然能认识那么多汉字,这都是爷爷奶奶的功劳啊,当然,奶奶功劳更大一些!可惜小丫头对于数字不是很敏感,呵呵,也许这方面还没开窍呢。

中午吃饭,做爸爸的允许萌萌宝贝喝一点点啤酒,小丫头高兴得手舞足蹈,边举杯边说祝酒词:“祝大家新年快乐!”,声音嘹亮得很。不知是真的高兴还是酒精的作用,她兴奋不已地分别跟我们干杯,连平时有些惧服的爸爸也不错过,爷爷奶奶一个劲儿夸萌萌会处事儿。小丫头立刻许诺晚上还要陪爷爷喝一杯!

因为实在太开心,萌萌宝贝分别在上午下午和半夜打了三次电话给姥姥姥爷和二姨拜年,当二姨说等她去串门的时候人家一点儿没犹豫,说我去我去,只住五天话茬再也没提起,哈哈。最让人吃惊的是下午那通,她突然说要跟二姨通话,因为不是今天第一次打过去,我教她无论谁接都要说:“我是萌萌,想跟二姨说话。”电话一通他听见的是姥爷的声音,不等我反应过来,人家立刻说:“姥爷新年快乐!”……这孩子都成小人精了。

下午大家醒来后开始包饺子,奶奶把材料准备停当,我提议让爷爷奶奶休息或者做其他事情,咱仨人儿来包,爸爸负责擀皮,妈妈包,萌萌也跟我学包饺子。三口人干得有声有色,萌萌最终包的八个都很不错,当然需要妈妈帮忙放馅儿,爸爸负责检查,妈妈再最后处理一下就完美了,嘿嘿,总之包饺子是很成功的啦。

春晚前的一个小时由爸爸提议,作为全家表演节目时间,所有人都表演了歌唱节目还有舞蹈,舞蹈主要是爸爸和萌萌在跳,尤以冬天里的一把火最火啦,没想到帅哥的舞姿那么有特点,实在佩服啊佩服。今天的春晚节目还不错,我们看得也很安心。主要是萌萌宝贝没看到李咏吧(其实现在她看到李咏不再哇哇大哭了,哈哈)小丫头实在太高兴了,保持了十几个小时高度兴奋的状态,看晚会时她一度把脚丫子放在帅哥脖子上,奶奶让她再来一次,她立刻狡猾地说再来一次爸爸就烦我了。之后她递给爸爸一个巨大的苹果,帅哥故意很吃惊地说是苹果妖精啊,哈哈,爷俩终于不再像往日般一个严肃一个敬畏了,好兆头哦。不过希望宝宝今晚别睡毛愣才好!

半夜十二点全家大拜年,奶奶给每人一个红包,里面全是崭新的票子,心意我们算是领了,不过还是不好再要老人的钱啦,拜年后领着萌萌到楼下放烟花,小丫头开心极了,真是长大啦,不怕鞭炮声不算,自己还能放小小的烟花呢。等我们俩在炮火中返回家已经下半夜一点。

现在已经是下半夜三点了,帅哥看电影弄得我精神起来,萌萌宝贝之前嘱咐我把她的趣事都记下来,做妈妈的我不能辜负女儿的心意啊,好了,就到这里,大年初一帅哥大舅一家还要到沟里,我得睡了,真是快快乐乐的年三十啊。最后祝愿全家牛年大吉大利,所有亲朋万事如意!

我的上网经历

晚上秀楠妈上网打滚子,我在边上跟她闲扯,突然聊起来第一次上网的经历,时间应该是九七九八年的样子,机器就是奔腾133的,modem牌子应该是贺氏(一个美国公司,已经破产了吧),第一次上的网好像还不是互联网,而是类似于169还是168的内部网站,就好比现在的教育网,一个大型局域网罢了,尽管如此,还是让我大开眼界。互联网给我一个完全不同的体验,这是个人计算机无法比拟的。

也许现在的朋友不太能体会这种感觉,不过可以试验一下这样的场景,没有bp机,没有手机,没有短信,机器上只能玩单机游戏,所有的软件游戏,只能通过盗版商购买得来,这样生活个半年一年,然后再让你上网,是不是会有一种重见天日的感觉呢?这时候再加上一段澎湃的伴奏,完全就是《甲方乙方》里面那个把村子里的鸡都吃光了的大款形象了。

当时的网络,因为是拨号限时上网,随之而来的是要控制上网时间,计时计费软件算是一个热门的分类。现在我只发现手机还有类似的软件存在,个人电脑上早就没有这种软件了。那时候上网都要有个目的,要事先想好了要干什么,比如上BBS看一个小说。然后立刻拨号,盯着那个状态栏的小图标,一旦标记联通网络了,立刻开动浏览器,然后进到想去的网站,开网页。几个网页都显示出来以后,立刻断开网络,这样,一个完整的上网活动不过需要几分钟而已,省钱而且完成了想做的事情。

记得那时候买过几个光盘,里面都是些txt文本的小说或者散文之类,名字叫做cfido大全或者cfido软件什么的,在《大众软件》也经常推荐一些bluewave蓝波软件。

什么叫做fidonet,或者中文叫做惠多网的这个东西呢?现在的人基本上都不知道,我也没有经历过,但是还算赶了个尾巴,有一些了解。当时玩这个东西的都有谁呢?如果你搜索一下“丁磊 求伯君 马化腾 bbs”,应该能搜到一些文字,比如这篇“http://www.techweb.com.cn/people/2008-12-03/378875.shtml”,摘选一下:

这时的马化腾从未想过自己会改变几亿人的沟通方式,甚至,没有想过自己的未来。他只是狂热地 爱好着自己的爱好。虽然年纪不大,马化腾的网龄却非一般人能比。很少有人知道在真正的Internet普及之前,有许多网民已在惠多网(FidoNet, 它诞生在1984年的美国,非我们现在意义上的互联网)上早早体会到网络的乐趣,马化腾就是其中之一。

1995年2月,在惠多网上挂了半年之后,马化腾义无反顾地投入了5万元,在家里连了4条电 话线和8台电脑,承担起了惠多网深圳站站长的角色,在接下来的很长一段时间内,深圳“马站”在惠多网上有着极高的人气。当时在BBS上混迹的还有丁磊和求 伯君,这时的丁磊早已经跳槽,来到了广州。“当年一起喝啤酒的时候,我们只是打工仔而已,都还不知道未来。丁磊后来的成功为我带来了启发,只要去做,没有 什么事情是不可能的。”

这里面也没有解释为何不叫真正的互联网(internet),为何投入四万元,连电话线,买电脑,办网站还需要用电话线么?有网线就行了吧?

惠多网,其实不是现在的互联网,所谓互联网,通俗的说就是基于tcp/ip网络,使用网线或者无线宽带上网(也有拨号到96163的,但应该已经很少了吧),用户需要开着浏览器连接网站的网络服务器(比如新浪搜狐腾讯)。而惠多网,是基于拨号网络的,拨号网络最基本的用法,是一台电脑激活了拨号服务(modem连上电话线,打开一些软件),而另外一台电脑,也是使用拨号服务,连接到主电脑上。简单的说就好比我知道马化腾搞了个fido的bbs,他的服务电话是10086,我就配置一个拨号到10086的拨号服务,就相当于我打个长途电话给马化腾差不多,只不过两个说话的人变成了两台计算机,而且需要运行一些特定软件罢了。

惠多网的主计算机(也就是马化腾开站用的机器)需要运行一个bbs程序,(好像应该是firebird bbs,后来发展成为大部分校园网具有的telnent bbs(其实telnet就是fido的根本),比如大工的碧海青天bbs,清华的水木清华,别看现在都是web浏览,当时可都是dos界面下的程序,都是用键盘操作的。说远了)这台机器一直开着,然后各地的fido站友就用电脑一直给马化腾拨号,如果某个人比较幸运,可能一会就拨上去了,然后就要开动bluewave蓝波这个发信收信软件进行打包上传下载,大概几分钟以后,上传下载任务完成,自动断开。这时候占线的机器会有一点空闲,下一个拨号的站友就有机会继续进行跟刚才一样的操作。

这里面有一些东西可能大家不太理解,比如为何不是直接浏览、在线写文章,而要用软件上传?因为电话线本身有着一个致命的缺点,就是同一个时刻服务的数目是有限的(我不确定,也许就是一对一的),简单比喻,就是某个人给你打电话,而你正在和另外一个人通话的时候,给你打电话的这个人只能听到嘟嘟的占线声音,一直到通话的两个人其中一方放下电话、通话结束了,才能拨到你的电话上。fido网整个通信过程跟两个人打电话是一样的,基于网络礼节或者为了更好地为更多人服务,两个人通话的时间一定要足够短,写文章、读文章这些不需要在线的操作(没有人必须连上网才能写字的怪癖吧?),就要放在通信过程之外完成,而且为了保证充分利用带宽,文字都要压缩打包。这样两个之间真正需要连接沟通的时间就很短了,一条电话线也可以尽可能的服务更多人。

于是乎,当时的人上惠多网就是这样的流程,先看信(类似于现在论坛的一个帖子的概念),有必要的才进行回复,灌水或者废话是会被人鄙视的,然后写好文章内容,蓝波软件就是一个集中了看信、信件打包、上传下载过程的软件。另外需要检查是不是有错别字,一切稳妥后,拨号连接服务器,估计幸运的过十来分钟连上去了,蓝波会把写好的文章、以及关注的版块里面的新文章和最新回复都打包下载,因为资源的紧张,大家都不会写什么废话,打包下载也不需要很长时间,然后断开电话连接,就可以悠闲的看文章看回复了。

惠多网本身是基于电话网和telnet协议建立的这么一个网络,在没有互联网之前,它是各地的网络爱好者互相交流的唯一方式,前面提到的一些奇怪的方式方法,都是因为电话网本身的限制造成的。但是应该承认,虽然有种种限制,当时fido网上的文章却是质量很高,精品很多,而且里面高手也是非常多,比如文章里提到的那三位,后来都成立了自己的公司,在网络上创出了一片广阔的天地。现在有了更方便自由的上网方式,但是却不见得对此有什么珍惜,未免有些可惜,特写此文留作纪念。

最后转载一下维基上的介绍“

中国惠多网

维基百科,自由的百科全书

中国惠多网络(CFido)是通过电话线路连结的BBS网络,网络之间互相通过点对点的方式转送信件。中国惠多网是中国计算机网络通讯爱好者自行创立并维持运作的业余网络系统。盛行于1993年1998年间,高峰时期全国有上百个站点,使用者达上万人。有名的BBS北京的轻松快车、长城、西点军校、天堂、舒克,广州的新月、深圳的Data Express、珠海的西点。CFido的网友算是中国最早的网民,后来多个CFido网友成为中国互联网名人,比如腾讯马化腾当时就是深圳的Data Express的站长,而金山软件公司求伯君是珠海西点的站长。发表“金州不相信眼泪!”而成名,后来担任8848网站董事长的网友老榕(王峻涛)是福州站的站长。

1992年,北京的罗依建设的“长城”站和汕头黄耀浩建立的“手拉手”(后来改名PCUG)站成为国内按照FidoNet体系建立的最早bbs交换系统。由此形成cfido。金山的北京西点和珠海西点也曾担负南北网络转信服务。

FidoNet R65C 罗依是cfido的第一个总协调人,求伯君是最后一个。

CFido的价值观是:爱国、高尚、勇敢、忠实、进步、友爱、守分, 业余精神万岁! 后期在网络上的电子出版物叫《龙音》。CFido曾召开过全中国第一次、第二次的站长大会。

技术背景

CFido使用Telix拨号器,基于ZModem协议。信件组织类似新闻组服务,使用蓝波快信(BlueWave)系统,对所选信件进行分类,筛选,压缩打包传输以节省传输时间,亦可进行离线编辑阅读以节省电话费。 多数的站点基于最高28.8/33.6kbps的拨号系统,因为56Kbps是非对称协议需要与电信局合作才可架设服务器。

因为整个系统运行在DOS下,需要使用DOS外挂中文系统。而Fido系统大量使用ASCII字符图形,与国标码中文有冲突,对外挂中文的要求比较高,促进了UCDOS等中文系统的发展。

c/c++程序员必读的十本书(上)

这个题目大的有些离谱,实话说,只是想推荐一下自己觉得很好、值得收藏的一些技术方面的图书。如果不是程序员,或者关心的方向是网页开发、数据库开发,或者只是想了解一下开发流程,这些书不都是适合你,但也很值得收藏了。

这篇文字的针对目标是,微软平台下的c/c++程序员,学过计算机基础学科,有一定的英语阅读能力。建议购买的顺序也是从上至下。

建议大家阅读的第一本书是《编码的奥秘》(英文名《code》),豆瓣链接http://www.douban.com/subject/1024570/,这本书中文版应该已经绝版了,但好像有英文影印版。这本书没有讲该如何编程,如何写一个hello world。它深入浅出的介绍了计算机是如何组成的,比如二进制,比如逻辑门电路的实现,都是很浅显的。看了这本书,会对计算机有个知其所以然的了解,也就是机器如何实现的一加一等于二,如何能执行程序。《编码的奥秘》是计算机专业或者是初中高中对计算机感兴趣学生,应该一上学就读的一本书。

第二本也是建议大家看到了立刻买下来,保证物有所值,就是《程序设计实践》(英文名The Practice of Programming),豆瓣链接http://www.douban.com/subject/1173548/。有了这本书,基本上《代码大全》、《程序员修炼之道》这几本后面推荐的书可以不买了,因为精华基本上都浓缩到这本书里面,当然,不同的作者写出来的还是不一样,如果有钱,还是都买了最好。《程序设计实践》的两位作者Brian W.Kernigham / Rob Pike,在计算机领域,就是大师级的人物,高山仰止,写出如此通俗易懂的计算机工程实践书,让我还能说什么仰慕的话啊。你不知道他们是谁?去搜wiki吧。里面每一章节都非常经典,甚至每章后面推荐延伸阅读的书籍,都是经典中的经典。一定要慢慢读反复读,如果这本书看完了以后,基本上就是一个计算机中级编程水平了。

第三本书比较难选择一些,还是推荐这本好了《The C Programming Language 2nd Ed》,豆瓣链接http://www.douban.com/subject/1230004/。也就是传说中的K&R,如果你是一个计算机专业的学生,还没有这本书,那你在学校里学了什么就很值得怀疑。这本书272页,每页都很经典,基本上你碰到的所有c语言问题在这本薄薄的小书里都有涉及,但是限于篇幅,有些会简单带过。里面代码例子不多,但还是包含了一个相当完整的语法分析器程序。不多说了,如果没有这本书,赶快去买吧。

现在大部分企业使用的是c++而不是c(比如google),除非是嵌入式或者操作系统内核级的程序,c++的性能与强大语法基本上可以满足各方面的需求,c++的入门书很多,选择也比较容易,推荐大家买奥莱理O‘Reilly的或者是c和c++经典著作这个系列的。第四本要推荐的不是c++编程方面的,而是一般类似于八卦c++历史的书《c++语言的设计与演化》,豆瓣链接http://www.douban.com/subject/1096216/。编程工作其实就是一个在不同的方案中进行选择权衡的一个过程,是该选择vector还是list,是该使用多线程还是多进程,是该使用xmlrpc还是dcom,是使用数据库还是注册表,有心的人会研究不同选择背后的深层技术问题,有些人基本上就是一套方案打天下。这本书就介绍了c++之父设计c++语言时选择的一些考量,为什么不用GC,为什么没有这个那个特性,为何不内置某某keyword。在我看来,这些考量的过程,对于一个编程人员来说要比如何使用c++更有价值。

第五本书,我选择了《unix编程艺术》,它击败了《代码大全》《c专家编程》等诸多经典占据了这个位置,主要也是占了unix操作系统的光。豆瓣链接http://www.douban.com/subject/1467587/。之所以选择这本书,是因为对于一个windows平台上的程序员来说,尽量开阔眼界是非常必须的事情。我们经常说混血或者说杂交会让基因更加优秀,编程也是如此,windows平台的程序员,如果只懂mfc,只会注册表保存配置,只知道COM或者DotNet,是一件非常悲哀的事情,用成语来说就是井底之蛙坐井观天,只认为天就是这么大一片,编程就应该用这些东西。unix操作系统虽然不像windows占据了桌面平台,但是在其他方面,使用非常广泛,比如苹果的mac osx系统,比如sun的solaris,比如继承了unix精神的linux。尤其在当今桌面系统网络化的潮流下,unix系统天生的网络特性、多用户管理特性、安全特性,更是体现了超越时代的杰出思想。读一读这本书,体验一下不同的设计理念和不同的操作系统哲学,对于日常的编程工作都有非常大的帮助。Windows程序员尤其要学习的是:unix系统上script的使用,使用纯文本作为数据格式,使用管道,最最重要的一点就是,Keep it simple and stupid,一个程序只做一件事,只需要把这件事做到完美。这与windows的大而全思想有着本质上的不同。

有空再给大家写剩下的五本书。

宝贝乐事

前一阵子因为回海城奔丧长时间没去看萌萌宝贝,导致小丫头想妈妈想得怪可怜的,电话里直撒娇。姥姥问她去不去海城她说不去,可是后来想到妈妈在姥姥家就又改变主意了,很笃定地说去姥姥家,天冷也不怕,多穿点儿就行了,穿最大的棉袄肯定不冷,呵呵。说了这话之后明显有些后悔,立刻补充一句:在姥姥家就呆五天!意思是太长时间她受不了……    今天在沟里时她跟小郝阿姨打电话又提到去姥姥家串门儿的事情,人家又明确说住五天,小郝阿姨一说多呆两天吧,小丫头立刻变脸,眼泪忽地就涌出来,哎,可能上次在海城呆的时间长太想家了?肯定是!

奶奶说萌萌昨天就想爸爸妈妈了,要给我们打电话呢,听奶奶说我俩工作忙才不再嚷嚷,幽怨地说:“哎,工作忙就是一天到晚打电脑啊!”简直哭笑不得。幸亏我回来当天立刻跑去看她,不然多对不起孩子啊。

中午饭后准备收拾碗筷,萌萌赖着我死活不撒手,到底是爸爸帮奶奶捡的桌子,小丫头事后解释说那会儿就是不想让妈妈干活,想让爸爸干呢,女儿真是妈妈的小棉袄啊,可能怕把妈妈累到?小丫头眼睛很尖,看到我手机上没有挂着她送的绿色小娃娃立刻很一本正经地问我缘由,听说是我担心弄坏了她才安心,并且出乎预料地把有镶有她照片的手机链欣然奉上,安慰我说:“妈妈我之前不给你是逗你玩的。”我的天,这孩子小嘴儿也太能白话人了吧,明明当初嚷嚷着那是她的,不给不给呢!

小丫头下午睡觉醒来情绪不太好,可能没睡通,我陪着看了会儿巧虎才开心起来,怕她累眼睛就提议玩个游戏,名字叫我们都是木头人。就是一群人手拉手按照一个方向边转圈边喊着我们都是木头人不许说话不许动,话音一落立刻全体立正,谁先说话或动了就输掉游戏,再重新开始。萌萌玩得特别认真,站得笔直不算,眼睛还瞪得像豆包,嘴巴闭得严丝合缝,因为太努力双下巴都出来了,哈哈。看她一本正经的小样子我总是忍不住哈哈大笑,后来又一次只有我们娘俩玩,小丫头憋不住动了一下,爸爸说她输了,人家就立刻变了脸,带着哭腔说:“我都累死个屁的:(”把我们笑得肚子都疼了。

孩子真是大了,经常会弄些搞笑的事情让我们开心不已,不过最近可能是感冒还没好,总是爱变脸掉眼泪,希望过了年长了一岁的她能健健康康开开心心地,不断给我们惊喜哦。

技术笔记一月二十二日

2009年,入行也有一些时间了,水平有限,没法写出什么有深度的文字,只能想起什么就写点,也许到了零九年年末,能积累一些东西出来。今天写的都是一些务虚的笔记。

1,编程能力无所谓天才白痴之分,只有用不用心的区别。

2,一个好的团队能让人发挥百分之二百的能力,而一个不和谐的部分能让木桶里的水都漏光。对于一个中型或者大型的项目来说,核心的成员应该是非常团结的。

3,基本上现阶段所有的软件工程开发理论都没什么用,都是学院派搞出来骗人的。ISO9000,CMMI,六西格玛,莫不如此。而且,所有的软件工程辅助工具,都还处于非常初级的阶段。

4,所有的技术革新或者是技术推动,应该是从上至下的,这一点,在企业里搞过管理信息系统的都知道。

5,技术交流或者是技术分享,重点并不在于交流的成本有多高,而是在于人们是否有意愿去分享,或者说企业文化是否鼓励分享精神。

6,开源或者免费软件的使用,是一个双刃剑,开源会减少表面上的成本,但是相应的学习成本以及部署成本也比较高。

7,微软平台,已经不是开发的主流平台,java和web,是现阶段比较流行或者说占据了大部分市场(企业市场、个人消费市场),微软的强项,只剩下windows操作系统和office,而这两方面,都在被人不断的蚕食,微软的日子将会越来越难过。一提到微软基本上就是官司或者是被人嘲讽,这一点很致命。

8,个人预测,苹果借助它的iphone,将会继续占据IT时尚前沿阵地,引领这两三年智能手机市场。手机开发将会是web开发之后的又一个流行趋势。随着国内3G市场的开放以及手机上网网速的提高,这些大网站都会推出手机专门浏览的入口,或者针对手机进行定制。手机软件会变得流行起来。而且,手机的在线特性,使得手机软件盗版变得困难,这一点可以从网络游戏得到证明。

理想中的软件开发模式,应该是这样的:

需求简洁清晰,问题明确,客户要求的变动在预期范围内。

前期开发基础架构,不过多考虑扩展性,但是留出扩展的余地,高内聚低耦合,在早期允许冗余代码的存在,但也要注意代码味道,如果发现坏味或者是超过两次的代码重复,或者是超大的函数,就要开始重构或者重写。

前期开发,测试人员就要进入,同时构建单元测试用例,而编程人员每完成一个特定的逻辑功能块,也要写相应的unittest,如果测试发现问题,也要先写unittest,然后进行修改。

在前期就要确定整个系统的debug log体系以及错误处理方式(异常、返回值、message等等),并且伴随相应的一套unittest程序,对于非通用性软件来说,unittest程序基本上需要自己定制,而且需要定期维护,这个成本看起来比较高,可收益也是很大的,在我最近参与的项目中,unittest的使用保证了大部分功能的正确性。谈到这里还要跑题说一下,以前经常碰到有人说“这个地方不能改,非常关键,改了没法确定是不是对的”,主要就是因为缺少unittest的保证,关于unittest以后还要写写自己的一些心得体会,比如什么时候必须用,什么时候可以不用。

当程序大的框架搭起来以后,或者经过一段时间的试用,客户需求会变得比较复杂,这时候要注意不断的调整代码结构,删掉或者重写坏味的代码,重构有问题的、或者比较复杂的函数,另外,定期维护unittest以及定期进行组内的code review都是必要的。

对于大中型项目来说,客户要求需要进行项目管理,基本上就是建立defect管理系统,进行需求的优先级排列,如果是小公司,Python的Trac是一个很好的选择,可以集成svn这套版本管理软件,另外内置了bug列表和wiki功能。

如何使用c++,以及windows的新技术,是一个需要权衡的问题,我个人的原则是,技术上尽量使用的简洁,比较常用就是vector以及string这两个stl模板类,也不使用什么炫目的模板编程技巧,也不过多的进行封装或者抽象,尽量少用COM或者是高级的windows技巧,选择通用的技术而非微软专用的技术。使用c的编程理念,加上c++的基本语义支持,足够了,至于什么偏特化、c++模板技术、dcom、连接点,都是非必要的。

项目进入后期,需要考虑自动编译以及自动单元测试的实现,在这一点上,java要比c++容易得多,c++程序员或者说微软平台程序员,基本上不会去考虑类似的实现。另外,微软平台程序员缺少的技能是脚本编写能力以及正则表达式使用能力,在这一点我也有缺陷。

c、python、web开发、iphone开发,是我在2009年比较感兴趣的技术,另外,有空学学外语也很必要,感觉自己这两年有些吃老本,是该充充电了。