2011年12月31日星期六

2011简单小结

非常简单地小结一下我的2011。
根据豆瓣上的记录2011年读了134本书,看了103部电影。

books_read_2011_chartmovies_saw_chart

生活:
2011游玩的机会比较少,只去了两次荷兰购物,有时在北威州逛逛,去了一次黑森州。
4月份复活节假期到瑞士玩了4天。
5月份回国办了结婚酒席。
10月份开始学车,但是进度很慢,没有太多时间去上课。
11月份第一次和同事到一个旅游区参加3天Workshop。


学习工作:
读博开始比较进入状态,但是只发表了两篇文章。
我也开始给别人上课,带了几次练习课。
参与了两个项目,并主持完成了一个项目的第一和第二阶段。
获得了一个校内的博士生的创新奖。


事业:
有一个计划在有条不紊的进行,在2012年初就应该实现第一步,这也许是2011年最大收获。


2011的新年假期,大多数时间都窝在家里,学习WPF,Prism (学习使用Microsoft Ribbon for WPF,MVVM Model View ViewModel)。
最后祝大家2011新年快乐。

2011年11月27日星期日

闲谈2011年11月情况

a.不上班的日子
因为德国糟糕的天气,生病了,11月17日,18日在家呆了两天。连续看了两个医生,最近一年来,每个季度好像都要生病一次,每个季度都要交一次10欧元所谓的挂号费,并使用一下医疗保险。看来还是要多锻炼身体才是。因为生病了,昏昏沉沉的,没法编程。很少超过两天没有编程,我居然会想念编程,常常在思考一些编程问题。仔细一想,其实并不完全是因为我对编程有爱,也有可能因为写程序时自我重要感也就得到了满足,并且总是认为自己在参与的项目中是个不可替代的人物,得到同事的需要,感受到这一点的时候,那种幸福感是无与伦比的。不编程的日子,日子也过的很快,读读别人的博客,看看网上有趣的视频,玩玩实况2012,然后选顶级对手,被电脑虐几次,做做饭,一天就过去了。

b.第一次参加workshop
第一次参加我们组的workshop,我们组的workshop还挺有趣的,所有同事和教授都一起到一个度假酒店(这个酒店离我们大学也就2小时车程)住3天,也就是这个月23号到25号,然后进行汇报总结,还有分组讨论,每天3餐都是自助餐,在讨论的时候还提供各种点心,感觉就是一直在吃东西,还好一般来说我们的workshop只有3天不然会把人搞的胖死。

c.第一次参加展小型的科技览会的比赛
24日,我和一个同事还专门从我们workshop的酒店,开车回到我们大学参加一个小型的科技览会,参展的都是我们大学的博士生,当天比赛参展完成后,又开回我们的度假酒店。值得开心的是,我们参加比赛的项目获得了"跨学科的创新奖",并共同获得了1000欧元的奖金,这是对我们的努力极大的肯定,而且在展会上很多人都对我们的产品和想法有很正面的评价。现在我对我们的产品在明年的面市更有信心了。下个星期开始进行我们项目专利注册的事情。


附加:
刚刚,随便翻了下以前看过的书,发现有些有趣有用的观点,这里做一个摘抄:
帕金森法则(Parkinson's Law)[1]:任务的重要性和复杂度与所分配的完成任务的时间密切相关。(Work expands so as to fill the time available for its completion.)   
帕金森法则告诉我们一个道理,我们其实可以减少工作时间来做最重要的事情。这就是不断迫近的最终时限的魔力。如果给你24小时去完成一项任务,时间的压力促使你集中精力去执行,别无选择只能做最重要的部分。同样的任务,如果给你1周去完成,它就换来了小题大作的6天。如果给你2个月的时间,但愿不要这样,它就变成了一场精神磨难。因为精力更高度集中,短时限内做出的最终产品通常不比长时限内做出来的差,甚至质量更高。[2]

30岁是一个关键点。一个人是作为通才走上企业的经营管理者或者创业家的道路,还是走上企业内部专家的道路,必须在这个时候做出决断。而且在35岁的时候,还没有展现出通才能力的人,就应该不要有任何的犹豫,选择一个专业领域,并且拿出不输给任何人的决心走上成为专家的道路。[3]


引用:
[1] http://en.wikipedia.org/wiki/Parkinson's_law
[2] 《告别朝九晚五:每周工作4小时》
[3] 大前研一《知性力II》

2011年11月14日星期一

我们的XX项目使用的系统架构

上上个星期五,我们的大头和我们三个核心开发人员开了一个下午的会。决定11月24日,参加一个展览会,推荐我们的产品,也是算是一次了解我们的产品的市场反应的机会。但是这个产品的具体介绍(其实是一个专业软件,加上辅助的硬件系统),我将在正式上市的时候进行详细的说明,可能会在明年的2月份,这个项目的软件部分这里我就暂且称之为XX项目。

这个XX项目已经进行了一年,我从开始就参与开发,作为软件核心开发人员,看到即将上市,感到特别的兴奋,而且有些成就感,特别是这个软件的用户界面还是我一点一滴设计的,和很多程序员不同,我认为设计一个漂亮的GUI是非常有趣的事。

进入正题,今天谈谈这个XX项目系统架构。

开发这个软件我们采取的很多对我们来说比较新的开发方式和架构,我们采用模块化开发,模块设计,所有的模块都通过我们特别设计的类似Service Interface方式导出其数据与功能,所有的模块的接口通过特定的方式进行开放。这些模块都有自己想对应的测试模块,对其进行自动化测试,使用的统一的架构。这些模块我们不仅使用在我这里所提到的XX项目,而且还使用到我参与开发的几个项目,有的是运行在服务器上,有的则是在单机上运行的。

我们使用的架构类似下面所示,XX_GUI模块是用户界面模块。XX_APP(应用程序)获取各种模块的“服务”,这里类似中间层。XX_GUI(用户界面)通过我们特殊定义的event和XX_APP(应用程序)进行通信,目前我们的XX_GUI(用户界面)是使用Qt进行编写的基于单机,但是XX_GUI(用户界面)可以简单的通过替换改变成为Web-based user interfaces(WUI),例如使用Java,AJAX进行开发,如果使用Web-based user interfaces(WUI),并通过各种Web服务协议进行数据和事件通信,XX_APP(应用程序)进行简单的改造就可以放置在服务器上。


XX_GUI
  ^
  | 通过event进行通信 
  |   
XX_APP (应用程序)
  ^
  | 通过统一模块注册机制进行调用
  |
各种模块

 

XX_WEB_GUI
  ^
  | 通过网络进行通信 
  |   
XX_APP (应用程序)
  ^
  | 通过统一模块注册机制进行调用
  |
各种模块

 

进一步延伸,因为各种模块组合产生的XX_APP(应用程序)可以在服务器上运行,我们的XX_APP(应用程序)适用于类似很多大型平台采用的Service-Oriented Architecture(例如亚马逊),可将XX_APP(应用程序)功能作为服务发送给用户。通过统一Service注册机制进行调用多个不同的XX_APP(应用程序),组成一个复杂的网络服务。例如下面所示。这就因为使用同一Service注册机制这就大大提高服务的复用性。这就是在应用程序层级上提高复用性。

                         特定的服务
  ^                                                                        ^
  | 通过统一Service注册机制进行调用 |
  |                                                                          |  
XX_APP_1 (应用程序)    ... ...       XX_APP_n (应用程序)
  ^                                                                        ^
  |  通过统一模块注册机制进行调用         |
  |                                                                          |
各种模块                                           各种模块

 

最后总结一下,复用性一直是我对设计上思考的要点,简单来说:
我们的模块依赖于我们开发的类库,这就是在类层级上的复用
我们的应用程序依赖于我们开发各种模块,这就是在模块的层级上的复用
我们的服务依赖于我们开发各种应用程序,这就是在应用程序的层级上的复用


接下来的时间,为了准备这个展览会,除了设计一个产品演示,准备展位的广告,就是要好好再练一练德语了,突然发现自己的那点德语水平做一个好的产品演示推介非常吃力。

2011年10月17日星期一

闲谈最近的情况

居然超过一个月没有更新博客,接下来会常常更新的Smile。因为最近在忙着完成一个项目的一个里程碑的收尾工作,这个项目共分为3个里程碑,也就是分三个阶段完成,我们现在刚刚完成第一个里程碑,在我们的Time Schedule上应该是在今年三月底就应该完成这个里程碑。因为遇到技术性难题和人员调动还有测试的原因,我们居然拖延了半年,所以说软件工程常常会把人拖入泥沼,最后我发现这个项目的核心开发人员,也就是我和另一个同事写了80%以上的代码,虽然采用了模块化的开发,因为开发依赖于我们自己开发的Framework但是除了核心开发人员其他人对Framework的理解和应用并没有达到熟练使用Framework进行开发的水平,所以整个项目还是过于依靠核心开发人员,导致项目进度很慢。最近每天都花一点时间重读了一些C++的书。同时还用C#自己写了些小东西,其实C#是一门很不错的编程语言。

这个月读了不少关于财经及投资的书籍,进行财商再教育。最近也开始关注德国DAX,“有幸“遇到振幅超过20%的这几个星期,其实有很多抢小反弹机会,但都没有把握。

新的美剧季又开始了,其实我几乎每天看一集美剧,晚上在家吃饭的时候看,以下是我看的美剧,排名分先后。

1.《豪斯医生》,编剧的水准之高,令人折服。

2.《超感神探》,很多有趣的推理,Jane的个人魅力无敌。

3.《生活大爆炸》,配角越来越出彩。

4.《老爸老妈浪漫史》,一如既往的搞笑,很符合我的笑点。

5.《绯闻女孩》,因为前季都看了,所以看此剧已成为一种习惯,看看美女,漂亮的衣服,时尚繁华的纽约也不错。

 

每周我都看1到2场球,主要是皇马的,因为我也是穆里尼奥的粉丝。

十月的德国已经挺冷了,家里的暖气已经开始供暖了,最近常常还下雨,没有办法每天骑自行车上班,对我来说,这是一件很痛苦的事,因为每天骑10公里自行车是我最主要的运动。

2011年9月11日星期日

不要让人重构你的烂程序

上个星期主要工作是重构一个很重要的模块,先抱怨一下,这个模块没有注释,可以运行,完全没有可维护性,写得是相当的丑陋。

单是理解这个程序就花了我和一个同事整整1天,然后重构花了我4天。而且每天我为了这个模块的重构,居然打破了我的“程序员每天只需编程4个小时”的教条,我每天竟然要花6个小时在这个模块的重构和测试上,最终我在重构上大概花了30个小时,所以很多人说不要轻易重构代码,这里我想说的是重构他人的烂代码还不如自己重写。
但是经过上个星期的经历,这里再次总结一下什么是烂代码。
1. 没有关于重要代码的解释
2. 没有统一的名称的规范
3. 到处都是注释掉的代码(注释掉的代码会让读代码的人很痛苦,而且会让人觉得这个代码不是最终的成品,而是实验性的代码,或半成品)
4. 巨大的方法(我居然看到了一个超过1000行的方法)
5. 很在方法中很随意的加入代码
6. 过于愚蠢的API的设计 (如果要学习如何设计一个好的API请查看Qt API Design Principles

上面第4点提到的,对于这个超过1000行的方法,被我改成的8个小方法,每个都不超过50行,而且这些方法的都具有复用性(因为每个方法很小,代码的可重用性开始指数增长)。为什么会有这种巨型的方法呢,其实就是程序员很多时候很随意的加入代码所造成的,而且他们满足于写出“可用”的程序,而不满足于写出“优雅”的代码。

很多人都停步于烂代码,因为他们认为他们的烂代码可以用,很多程序员都会犯这样的错误。他们很理直气壮的对我说,看我的代码很好用,可用的代码不代表不是烂代码,其实这些代码都金玉其外,败絮其中。人们常说,程序员都是从写烂代码开始,然而也许写出所谓的“内聚性、松耦合、零重复、封装、可测试性、可读性以及单一职责”的“好代码”需要长时间的锻炼,但是最坚持最简单的代码规范却是每个程序员可以做到的,这就是避免烂代码的最好方法。

其实我们常常并不要求人们写出“优雅,精妙”的代码,我们的要求不高,程序员只需要坚持“简单性”,写出符合“代码规范”简单的代码即可。

2011年9月1日星期四

关于经济危机的一些思考

最近计划转换跑道,常常“不务正业”地看一些关于金融投资的书,同时也关注一下德国的股市,最近跌得很厉害,DAX前几天还破了5500点,作为经济的晴雨表的股市表明,经济似乎遇到了危机。我这个电子工程师今天也来谈谈我关于危机的思考。


危机1  夕阳工业和退休基金
突然想到,如果美国政府不断的增发货币。那么证券市场是一个池子,如果这个池子的增加变大要低于货币的增加速度,证券市场作为货币的重要流出口,那么证券市场的就很有可能上扬。但是我们可能会遇到最坏的情况,很多夕阳工业正在消亡,而中国的社保基金,美国和西方国家的退休基金,都相当依赖于这些夕阳工业公司所发放的股利,然而股利的大幅度下降对这些求稳的基金是有很严重的影响。

危机2  债务和赋税
美国的债务不会自动消失,早晚会为了这些庞大的债务付出高额的代价。据统计美国地方政府、州政府以及联邦政府工作的人数,大于制造业的就业人数。众所周知,中国承担着巨大的行政成本,以及越来越庞大的公务员队伍,这是整个国家的巨大负担。虽然政府工作人员虽然对维持社会运作起了很重要的作用,但是他们对社会财富的贡献是很低的。为了解决债务危机,美国政府持续大量印钞票,这些债务得用税赋的方式来偿还,美国的赋税一定会上升的。如果中国的经济无法持续高速发展,为了负担中国巨大的行政成本,中国的赋税会继续上升。

危机3  消费
我们都知道如果美国人停止消费,那么全球将会开始迈入所谓的经济大萧条,因为中国这个重要的市场消费不足。但是美国消费者并没有储蓄,如果美国经济进入小的不景气,消费者的储蓄花完后,那么经济大萧条是肯定的。

危机4  失业率
据最近的报道,德国的同比失业率下降,但是我认为不管西方国家还是中国,失业率长期看来是一定会不断增加。全球化的影响是企业可以大幅降低公司的营运支出,并且利用新的信息技术,会大幅降低人事的成本,带来的是裁员。工业机器人在未来几年内会更大规模的运用,蓝领工作也会受到巨大的影响。


危机中的可能的机会
机器人技术(重点是工业机器人领域)
信息技术(可以用于减少的员工,可以获得更高的利润的信息技术,或者优化生产流程,提高生产效率的信息技术)
房地产(在巨大货币投放下产生的通货膨胀下,如果向银行贷款购买房地产也许是一个还可以的机会,因为我们的还贷成本随着通货膨胀会大大降低,但是必须是能带来现金流的房产(例如出租),例如小套的公寓)

2011年8月15日星期一

程序员每天只需编程4小时

很久没有更新“电子工程师乱弹编程”这个系列。今天继续谈谈时间管理的方法。
其实我一直认为,作为程序员每天有效编程时间大约4个小时就可以,我每天就是最多编程4个小时,不是因为我没有什么活,其实我的工作任务在很多人看来是“相当繁重”的。减少编程时间后,剩下的时间用来学习,研究,可以进行“时间投资"(下文会介绍)。


如何摆脱加班的痛苦,减少工作时间,以下是我的几个小方法:


1. 减少”所谓的无效工作时间”
例如工作时上网时间,因为干这些事的时候,我们精神体能处于死亡的状态。编程时不要看邮件,减少外部的干扰。


2. 放弃完美
根据我的经验很多过长的工作时间就是我们追求完美所造成的。正如《卓有成效的程序员》所说的,“始终牢记你到底要做什么,如果情况开始失控就及时抽身而出。“80 10 10”法则,80%的客户需求可以很快完成,下一个10%需要花很大的努力才能完成,而最后的10%却几乎不可能完成。”我们常常为了那20%的东西,花费了80%的心力,我们所要警醒的是20%的东西是否是核心功能,对于不是重点的功能我们应该说“不”,并及时抽身而出,取和舍是减少工作时间的要点。


3. 使用合理的开发流程,开发方式,高效的开发工具
对于软件开发方法,我个人并不喜欢敏捷,应该所很不喜欢,因为软件质量和生产率成正比,因为软件的质量越高,生产率越高。而不是编码的速度越快,生产率越高。
我喜欢的开发方式是模块化开发,并且是采用相对传统的方式进行开发(常常使用迭代法,一定要画UML),我们组的系统的架构基本上是模块化的,每个提供对外接口,每个模块都要写一个对于的测试例程,一来是为了模块测试,二来是方便做持续集成的人理解。然后进行持续集成。这种开发方式相对比较累的人是做持续集成的人,我最近一直在做这件事。模块化开发出的模块,也可以提高代码质量,以及复用性。


4. 进行时间投资
这是我最近看《杠杆思考术》一书看到的一个概念。程序员的时间投资的根本就是找出“模式”。其实对于程序员而言,例如自动化构建的脚本就是一种时间投资方式,有时重做轮子也是时间投资的方式之一,例如自己写一些适合自己项目开发的工具类库,特别的工具类库常常可以在特定的项目开发中节约很多开发时间。以下摘抄一些书中原文:

因为投资而增加的时间,就应该用来投资打造新的模式或新的事业,进一步作为提升自己能力的自我投资,也就是所谓的再投资。如果能够反复运用这些时间,每年就可以产生数百个小时的时间资产,而且这些额外的时间还能够以复利的形式像滚雪球一样快速增加,所以投资效果就会越来越大。只要能够有效地缩短工作时间,就能争取到更多的额外时间,这样一来也就可以达到不错的成效,而且最终还可以跟升职加薪有所关联。
所谓的时间投资,其实是由几个基本步骤组成的。
首先,最重要的是事前的调查。环视一下自己的工作全貌,检查什么事情是很麻烦的,哪些地方很花时间,自己要完全掌握。
接着,就要检讨在这些工作中哪些项目可以进行的更有效率,也就是所谓的过滤。不管是跟成果有关联的事还是没有关联的事,只要是非做不可并且没办法交待别人的,都按照其重要程度排出先后顺序。而且,为了建立所谓的模式,就必须实际投资时间去实施,以追求效率化。在这种时候,如果无法达到预期的效果,就没有必要勉强坚持下去。相反,如果能够持续取得成果,就能累积时间资产。


当然大话谁都会说,找到适合自己的方法才是最好的方法,对了,今天你是否只编程4小时?

2011年7月25日星期一

“工作淡季”到底可以做些什么呢

上个星期开始是我所参与的项目的间歇期(我主要负责设计和开发的一个小系统的软硬件开始运行并且都运行正常,与此同时正在参与的另一个项目(并不是很急切的)正处于停摆期),我挺清静的,整个星期就开了一次会。

这其实也就是我前不久读的《代码之道》一书所谈到的开发团队达到了“零Bug反弹”(ZBB,Zero Bug Bounce),在这个清静时期,我们可以做些什么有建设性的事情呢?

开发人员在“工作淡季”到底可以做些什么呢?下面是《代码之道》提出的一些想法:

分析Bug。分析团队在过去的一个产品开发周期中修复过的所有Bug,找出其中的规律。
为部门开发一些工具。
讨好项目经理,把他们的设计思想变成原型程序。
学习新技术或技能。
跟研究人员交谈。
撰写专利申明或白皮书。
反思职业生涯。

这是《代码之道》软件开发团队对于软件工程师的想法。

其中:
学习新技术或技能,反思职业生涯
这两点对于无论是硬件工程师,还是软件工程师还是软硬件研究人员都很重要。


所以,我决定应该好好应用这个“清净的时期”学习新技术或技能,参与一两个培训使自身得到提高,下个星期,我在我们大学报了一个一周的课程。
关于反思职业生涯,突然发现自己虽然忙碌但是不是富有激情,可能是没有太多新的挑战了,经过一些和同事的讨论,我决定开始学习一门新的编程语言objective-C,开始学习移动设备应用开发。


“清净的时期”其实也是一个很好的放松和修整的时刻,虽然不是在度假但是可以放松一下紧绷的神经,下班后,我又玩了一遍“三国志英杰传”,读了几本没读完的书,改变了家具的位置,彻底地将家里大大小小的东西整理了一下,而且我居然连续看完了how I met your mother的4,5,6季,很久没有一口气看这么多美剧,HIMYM不仅好笑(譬如第6季第10集:“早闪哥”,让我笑翻了)而且还挺温馨,个人非常喜爱,其实看完后感触还是很多的,里面有很多点点滴滴的生活中的哲理,很多也会发生在我们身上的人生大事,小事。其实生活中精彩和幸福之一就是你的好朋友就在你的身边。

2011年7月17日星期日

上周小记 -- 我的两个简单的人机交互的小游戏

每到周末,夜深人静就想写点东西,写点东西记录一下我上周生活吧。

德国的一个著名的卡通老鼠[1],今年已经40岁了,我们所和德国WDR电视台一起组织了一个开放日--7月10日,也就是上周日,一起庆祝这个卡通老鼠40岁生日,有至少2千个儿童来我们研究所参观。
我和一个同事带了一个学生,做了两个小游戏(花了我们两周的时间),给来参观的儿童玩,我们组的其他同事也做了好几个游戏,希望可以通过这些游戏培养儿童的科学兴趣的,虽然花了很多的时间和精力,但是来参观的儿童和很多家长都表示收获不少,特别是给儿童们带来了很多欢乐,与此同时,我们这些所谓的“科技工作者”的也获得了相当的成就感,这个偶然的机会做了游戏,也获得了很大的乐趣,自己感受似乎年轻不少!


以下简单地介绍一下我做的两个小游戏:
一个是微型机器人的逃离游戏,也就是有几只微型机器人(我们使用的KheperaIII微型机器人),通过一个门,有两种情况,一种是这四个机器人通过互相交流,它们可以有秩序地通过这个门,另一种情况就是四个机器人不进行交流,它们就会争先恐后地通过这个门,然后挤成一块,最后这几只微型机器人会“很艰难”的通过这个门。我们做了一个卡通界面,这个GUI(图形用户界面)可以通过连接我们的服务器可以和机器人进行通信。在这个GUI上选择机器人,通过它们的编号,然后可以选择按左边的大象卡通按钮,机器人就会通过无线网络的交流有序的通过门,这些微型机器人上面都跑Linux,选择老鼠按钮,机器人就会想上面说的第二种情况无次序的通过门。
儿童可以通过这个游戏了解一下微机器人的通信和控制知识。

Maus_Escape_Scenario

 


第二个是关于控制机器手臂的小游戏,两个儿童可以通过Wii的控制手柄Wiimote来进行游戏,游戏的目标就是让机器手能够抓住一个塑料积木块移到目标位置,为了保证安全,我们不让儿童直接控制机器手,而采用让儿童完成指令然后让机器手自动完成运行的形式。首先可以得到一组Key,这两个儿童必须按照上面的指令,“同步”地使用Wii手柄完成游戏上出现的一组动作(有四个),如果不同步,必须重复,完成之后,这两个儿童必须摇晃Wiimote,同时游戏屏幕上会出现他们摇晃Wiimote的次数,他们摇晃的次数相加的数量越大机器手移动的距离也就越远。然后继续重复,上面的过程,机器手就会继续进行移动,最终移到目标位置,然后将抓到的塑料块放下。下面是我做的游戏的GUI,如果GUI启动,主窗口会同时显示关于机器手运行的实时视频和游戏的指令和各种信息(显示渲染使用的是SDL库,并使用了一个简单的游戏引擎,实时视频的接受和解码使用的是libvlc库),记录了玩家需要的时间,玩家的名字,花费的时间,玩家的名字可以通过我们做的一个网页输入,我们的游戏GUI也会自动从网上的数据库上读取玩家的信息。
儿童可以通过这个游戏了解一下机器手的控制知识,体验一下人机交互的感觉。

Maus_GUI

 

周记的最后再写点东西,周五和六晚上,和两个PB电子系的老同学一起吃了饭,聊聊社会的乱象,感慨一下生活,分享一下人生感悟,闲扯一下工作上的压力,遇到的趣事,大家都已经或即将步入30,突然大家也觉得自己已经老了很多。简单总结一下我们这些中年男子的感悟就是:时不待我,现在应该做到的事情就是,好好把握人生的精华时光,活在当下,珍惜现在身边的人和事。

附注:

[1]著名的卡通老鼠,http://en.wikipedia.org/wiki/Die_Sendung_mit_der_Maus

2011年7月4日星期一

铁打的营盘流水的兵

上个星期二我的一个同事“小埃及人”博士毕业了,答辩完成后,在庆祝的自助餐上,他问我:你打算什么时候毕业呢。呃,我说,应该还要很多年吧。
其实我一点也不想毕业,完全没有在意博士毕业的事情,很喜欢现在的生活,想一直做大龄学生。读博虽然收入微薄,工作压力大,工作时间很长,但是可以做自己喜欢做的事情,每天都可以“玩到”很多好玩的微型机器人,高性能服务器,复杂的实验平台,还有很多“大玩具”,上班的时候随便上网,上班不用打卡,有时还会去旁听一下我觉得有趣的课,这对我来说简直是一个完美的工作,有这些,什么收入,工作压力,都不是问题,我自己一直是一个超级知足的人。

我的一个台湾同事小C已经辞职了,过两天要回台湾,研究所真是一个铁打的营盘,总是有流水的兵,才这几天“小埃及人”毕业了,小C辞职了,还有另一个同事,“光头土人”也是最后一次来上班,想到以后,在他们的位置上看不到他们,还是有点伤感。

每天中午12点45都要和“小埃及人”还有几个同事吃午餐,他个子比较小,而且是埃及来的,所以我称他为“小埃及人”,这是小C给他取的外号。他的硕士本科学的是计算机科学,博士研究的是图像处理,体育运动中图像追踪系统。“小埃及人”信基督教,而且很虔诚,每年有超长的时间在吃素,他常常说他们这些信基督教的人在埃及这种穆斯林国家常常受到迫害,“小埃及人”很喜欢看youtube,玩facebook,踢足球,英语很好,还喜欢把程序编得复杂,我在半年陆陆续续在读和改写他以前写的一些代码,真的深有体验。

“光头土人”,他的发型当然是光头,德籍土耳其人,从小在德国长大,硕士学的是计算机科学专长CUDA和OpenMP,家乡是卡塞尔,喜欢打电话,为人很热心,喜欢自嘲并将一些笑话和故事,常常可以看见他找mm聊天,中午喜欢喝食堂的汤,不喜欢吃“四只脚”动物的肉,有一双很漂亮的墨绿色的眼睛,看人的时候总是让人觉得很深情,他呆在我们所里大概只有半年吧,现在要到工业界发展。

小C其实也就比我小一岁半吧,他在我们所已经工作的快两年了,人非常nice,因为和小C住得近,几乎每天都和他一起8点50坐大学专线到研究所,下班也常常和他一起坐大学专线回家,和他在路上胡扯很有乐趣。小C的英文,德文,中文甚至是闽南语都说的非常好,这得益于他丰富的求学经历,因为他老爸常年被公司外派到欧洲,所有他在英国和台湾读过小学,在台湾和德国读了中学,最后在德国汉堡读完大学,和我一样他也是学电子的,但是主修通讯,专长VHDL。因为他英文极佳,以前我的SA和DA都是他改的,他还改过Lin的MA。小C钢琴弹得很好,钢琴弹的好的人反应都快,这样玩Call of Duty就非常厉害了,先天优势,他玩射击类游戏非常强悍,而且他也非常喜欢玩。我和Lin还有他和他的女友今年还一起去了一次荷兰的Roermond的Outlet,复活节的时候还一起参加的瑞士的旅行,这些都是一些很有趣的回忆。

唉,铁打的营盘流水的兵,让一些小小的回忆藏在这里吧,祝他们平安顺利。

2011年6月21日星期二

读书随笔

今天下午觉得工作效率很低,所以不想上班,直接回家,随手写一些东西吧。
最近工作效率很低,刚刚读了《程序员的思维修炼:开发认知潜能的九堂课》,才明白多任务处理对生产力会造成重大损失,工作时我常常喜欢多任务工作,看来这是错误的。
书中提到:

一项研究发现,一般情况下,多任务处理将耗费你20%至40%的生产力。多任务处理在这里是指在不同的抽象层次上执行多个并发任务。而在同一代码区域休整几个错误不能算作多任务处理,回几个类似的电话或做多道菜也不算。当你中断代码修正而去回应无关的即时消息、电子邮件或电话时,或者快速浏览新闻网站时,你才会遇到麻烦。
科学家认为,试图把注意力同时放在几件事情上,意味着你在每件事情上都会处理得很差。如果你持续中断正在进行的任务,去检查电子邮件或者回复即时消息,你的有效智商会下降10分。相比之下,吸大麻烟卷导致下降的智商仅4分。


前几天读了一本书《The Research Student's Guide to Success》,上面提到PhD的定义,很有趣,但是很真实。


“A PhD is about finding out more and more about less and less until one eventually knows everything about nothing.”


据《程序员的思维修炼:开发认知潜能的九堂课》说,成为专家之前的积极的实践需要四个条件:


1.需要一个明确定义的任务
2.任务需要有适当的难度——有挑战性但可行
3.任务环境可以提供大量反馈,以便于你采取行动
4.提供重复犯错和纠正错误的机会


继续谈编程:
最近常常使用复制-粘贴式编程(把Google作为IDE的一部分),很多情况下缺乏思考,这样不可取,这绝不是积极的实践。
好的程序员能写出人能读懂的代码,这谁都知道,但是我们是否常常问问自己,自己是否以“好程序员”的标准来要求自己,去写让人读懂的代码。
刚刚还看到一个有趣的说法,很深刻:


Programming as an intellectual activity is the only art form that allows you to create interactive art (编程能够创造出交互式艺术作品的艺术形式). You can create projects that other people can play with, and you can talk to them indirectly. No other art form is quite this interactive. Movies flow to the audience in one direction. Paintings do not move. Code goes both ways. [出处]


[出处] http://learnpythonthehardway.org/book/advice.html

2011年6月20日星期一

随机性

很久没有写读书笔记了,最近也没有读什么“闲书”,忙着啃一些工作上需要的工具书。今天来简单记录一下这个周末读的《随机致富的傻瓜》,让人看得入迷,美中不足的是中文版翻得有些生涩。纳西姆·塔勒布(Nassim Taleb)的这本书妙趣横生,有很有知识性。
以下是一些书摘,作者的观点独具一格,令人玩味无穷:

这本书提到了三个锦囊:
一、偏态。概率分布上的不对称,黑天鹅事件的出现就是最典型的偏态。现实意义就是失败的代价过于沉重、难以承受,那么这件事成功的概率有多高都无关紧要。
二、存活者偏差。由于我们只看到成功者,而由此形成对机遇的歪曲看法。比如说我们认为长的漂亮的人薪水比较高,其实是我们只会注意那些薪水比较高的人,或者说那些薪水比较高的人容易引起我们的注意罢了。
三、路径依赖。有点像物理学上的惯性,人们过去的选择决定了他们现在和未来可能的选择。要完全摆脱路径依赖,就要完全不受过去行为的束缚,摆脱了路径依赖,每一天来说都是一张白纸。

时间尺度短的新闻充斥噪声,时间尺度长的历史中噪声则多已剔除。

如果一年报酬率为15%,波动性为每年10%,那么,任何一年赚钱的概率为93%,一个月为67%,一天为54%,任何一秒赚到钱的概率只有50.02%……在很短的时间尺度内,我们观察到的是变异性而非报酬率,也就是说,噪声湮没了有用的真实的信息,使我们情绪失控痛苦不已。

投资人和企业要赚的不是概率,而是白花花的钞票。因此对他们来说,某个事件发生的可能性多大并不重要,重要的是那件事发生时能赚多少钱。利润出现的频率有多高并不重要,结果多少才重要。

财务工程financial engineering的应用就带有浓厚的伪科学成分。应用这些方法的人,衡量风险是以过去的历史作为未来的指针。这里我们只想说,由于分布有可能缺乏定常性,这整个观念可能大错特错,且必须付出非常惨痛的代价。

致富纯粹是自私行为,不是社会行为。资本主义的优点在于社会能够善用人们的贪婪,而不是他们的善行,同时也不需要颂扬这种贪婪为一种道德后知性成就。成为有钱人不是一种道德成就。

常识不过是18岁以前学到的错误观念,路径依赖是理性思考的敌人。

容易受随机性愚弄的性格特征:
1、在某种程度上过高估计了自己信念的可命性,不是经济学意义上的就是统计学意义上的。
2、有与仓位联姻的倾向。死抱住一个思想不放对交易员、科学家或其他任何人都不是好事情。
3、经常变换说法的倾向。赔钱的时候会就变成“着眼于长远利益”的投资人,在交易员和投资人之间来回摆动,根据命运的最新变化而给自己定位。
4、事先没有确切的行动计划来应对万一出现的赔钱局面。他们干脆就不知道有这种可能。在市场急剧下跌,并没有依照事先确定的方案反应以后,买了更多。
5、不会做批判性思考。这表现在,不能用“止损”的方式修正他们的态势。
6、拒不接受。在出现损失的情况下,没有表现出明确地接受现实。

我们有必要在知识中接受不对称;有些情况下,利用统计学和计量经济学是有帮助的。但我不希望自己的生活依赖于它。如果统计科学能够在哪些方面给我带来好处,我就用它。如果它带来一种威胁,那么我就不用。我要去掉过去资料中的危险成分,只利用它的精华。在此前提下,我要利用统计学和归纳法来下富有进取性的赌注,但我不会用它们来对风险和资金损失进行管理。根据从一些观察中得来的想法(其中包括过去历史)进行交易,然而又采取措施以确保如果他们弄错了的话,损失会限制在最小的范围内(而且这种概率不从过去数据中得出)。在采用一种交易策略之前就知道哪些事件会证明他们的想法是错误的,而且为此留下余地。一旦那种情况出现,他们就会中止交易。这叫做止损点(stop loss),这是一个预先确定下来的退出点,是一种防范黑天鹅的措施。

要重新建立一个较少信息、较多决定性的古代社会,好比说生活在19世纪,但同时还要能享受到技术进步的一些好处,一切医学领域里的突破以及我们这个时代在社会公平方面取得的所有成就。这样一来我就拥有一切事物中最好的东西了。这就叫进化。

人们总把科学与科学家混为一谈。科学是伟大的,但科学家个体却是危险的。他们是人,人类所具有的认识偏差他们都具有,而且可能更甚于普通人。因为多数科学家都比较顽固,否则他们哪来的那种耐力和精力去完成交给他们的那些艰巨任务。 科学家有时不得不像个廉价的辩护律师一样行为,而不像个纯正的追求真理的人。

命运女神唯一不能控制的东西,是你的行为。

 

最后我来说一下:其实我们经常低估随机现象,在生活中我们对于随机性的无视与误解随处可见。重视随机性,使用随机性对生命以及的钱财进行了解,这样才可能避免风险。

2011年6月8日星期三

使用EA(Enterprise Architecture)自动生成UML图

使用EA(Enterprise Architecture)已经一段时间了,这里谈谈一个小技巧 -- 自动生成UML图。

  • a. 新建一个Project,add一个class mode,(如果建的是空Project,请在Project Browser的Model中add a package)
  • b. 在Project文件夹上点击鼠标右键 选中code engineering 然后选Import Source Directory,然后可以自己做一些设定,例如Source Type的设定等等
  • c. 生成完毕后,可以在UML 类图就会出现在project browser里面,点击这些类图就会发现挤成一团,我们可以使用Layout Diagram图标,进行自动排布,如下图所示。这个图标在Diagram Toolbar里面,如果没有找到Diagram Toolbar,可以点击View-->Toolbar-->Diagram

EA Layout Diagram

大功告成,很简单吧,如果不满意,觉得我们的class diagram显示太多信息,可以在图中点击这个class,然后点鼠标右键,选Feature Visibility,然后可以进行设定,可以对Attribute和Operation的可见性进行调整,如下图所示。

EA Feature Visibility

如果想保存我们生成的UML diagram成为图形格式,可以在Menu中选择Diagram,然后选择Save Image..,更简单的方法就是按快捷键啦,也就是ctrl+T。
 

Sparxsystems提供的UML 2.3教程也相当不错这里推荐一下:
http://www.sparxsystems.cn/resources/uml2_tutorial/index.html


版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者hanyionet信息。

2011年6月7日星期二

关于 Side-by-Side 问题的解决

上个月回国20天,回来上班也比较忙,没有更新博客。
今天写一些关于Side-by-Side error或Side-by-Side Configuration Issues,其实我很久以前就想记录一下解决方法。

什么情况下会遇到Side-by-Side Configuration Issues呢?
如果在Win7下使用VS2008编译一个程序,然后换一台WinXP机器下运行就有可能会出现Side-By-Side errors
如下警告:
The application has failed to start because the application configuration is incorrect. Reinstalling the application may fix this problem.

如果不同机器的Win7也许会有如下警告:
The application has failed to start because its side-by-side configuration is incorrect. Please see the application event log for more detail.


附注一些关于WinSxS的介绍:
百度百科:http://baike.baidu.com/view/599776.htm
维基百科:http://en.wikipedia.org/wiki/Side-by-side_assembly
WinSxS文件夹体积虽然很大,但是并不神秘。简单来说系统使用“WinSxS”(Windows Side-by-Side)文件夹来存储各个版本的Windows 组件,减少因为动态链接库(Dynamic Link Libraries,DLL)引起的配置问题(DLL hell)。


可执行文件的或DLL的manifest。可以使用UltraEdit打开来看看。Manifest information一般在文件的最后,应该可以发现类似XML格式的描述,这就是Mainfest information。
但是也可以不使用UltraEdit来打开文件找Mainfest information,可以使用Kenny Kerr 编的工具很方便地查看manifest information。请见:
http://weblogs.asp.net/kennykerr/archive/2007/07/10/manifest-view-1-0.aspx


使用这个工具随便开一个application试试,如下图所示,我们可以看到Microsoft.VC80.DebugCRT表面使用的是VS2005的Debug的C Runtime (CRT)。X86架构(processor architecture),版本为8.0.50727.762。1fc8b3b9a1e18e3b (public key token): A unique ID for C Runtime。

manifest view example

接下来我们要做的就是在%WINDIR%WinSxS里找找是否有类似x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.762_none_....这样的文件,这个文件名也就是由manifest information所组成的。
如果没有,我们就需要installer并包含这个文件,然后再安装这个installer,Side-by-Side的问题就可以解决。
 

  
延伸一下:
也许我们会想要绕开(bypass)WinSxS对于CRT/MFC/ATL DLLs的处理,可以看看这篇文章

从VC8开始,我们就有两个方式分配CRT/MFC/ATL的DLL。

1. 将DLLs和我们的application放在相同目录中并且放入一个有效的manifest对于这些DLLs
2. 安装redist.exe,并且DLL将安装到WinSxS目录
 
如果我们想要和全局的DLLs无关,我们也许会认为将DLLs放入applications目录就可以了,但是这是一个误解
其实如果DLL已经被安装在WinSxS目录,那么local的DLLs将会被忽略。
绕开WinSxS其实很简单,只要从我们编译生成的.exe和.dll中manifests中移除“publicKeyToken”就可以了。
 
接上图例子,我们只需要删除publicKeyToken="1fc8b3b9a1e18e3b"就可以了。 
 
 
 
参考以及延伸阅读:
Resolving Side-by-Side Configuration Issues:http://buffered.io/2008/05/17/resolving-side-by-side-configuration-issues/
Microsoft Visual C++ 2008 Redistributable Package (x86):http://www.microsoft.com/downloads/en/details.aspx?familyid=9b2da534-3e03-4391-8a4d-074b9f2bc1bf&displaylang=en
The Secret Of Windows Vista / Windows 7 Winsxs Folder.:http://www.winvistaclub.com/f16.html
How to bypass the WinSxS for CRT/MFC/ATL DLLs:http://blog.kalmbachnet.de/?postid=80

2011年4月12日星期二

科学计算Scientific Computing笔记(1)- 介绍

很久没有更新博客了,今天给自己放半天假,写一篇学习笔记,最近工作需要用到科学计算Scientific Computing的知识,打算用半自学的方式学习科学计算Scientific Computing这门课程,所谓半自学也就是我同时也旁听的我们大学的这门课。

谈到Scientific Computing在Geometry Processing的应用,我们一定有先谈谈几何处理,下图就是所谓的几何处理Geometry Processing(利用应用数学、计算机科学、工程学等领域理论设计高效地获取、重建、分析、处理、模拟及传输复杂三维模型的快速成长的研究领域。[wiki])的简介。可以看到,它和Modeling, Visualization还有Animation都有密切的关系。

geometry processing

关于Modeling
这里列几个例子:
3D Laser Scanning,具体步骤为:
Physical model --> 3D Laser Scanner --> Set of raw scans --> Reconstructed model

Engineering Applications 例如下图所示: 

Engineering Applications

Smoothing & Fairing 平滑,光顺处理

Mesh Parameterization 网格参数化 - Laplace Equation & Conjugate Gradients

Shape Deformation 图像变形

关于Animation
这里列几个例子:
Rigid Bodies, Collisions
Elastic Deformations
Face Animation
Cloth

 

很多人都知道Geometric Modeling Based on Meshes其实Scientific Computing可以作为从Geometric Modeling Based on Meshes 到 Physically-Based Simulation的桥梁。 简单来说做比较复杂的电脑动画,和电子游戏Scientific Computing的知识是不可缺少的。

 

Scientific Computing有什么比较重要和基础的内容呢?

1. Mathematical modeling 数学模型

2. Partial differential equation (PDE) 偏微分方程(指含有未知函数及其偏导数的方程。描述自变量、未知函数及其偏导数数之间的关系。分为线性偏微分方程式与非线性偏微分方程式。[wiki])

3. Discretization 离散化

4. System of linear equations 线性方程系统

5. Efficient solver 高效解决

参考出处:
[wiki]:维基百科
Trefethen, Bau, Numerical Linear Algebra, SIAM, 1997
Demmel, Applied Numerical Linear Algebra, SIAM, 1997
Press, Teukolsky, Vettering, Flannery, Numerical Recipes in C++: The Art of Scientific Computing, Cambridge University Press, 2002

版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者hanyionet信息。

2011年3月13日星期日

UDP TCP 包头(Headers)和其效率(efficiency)分析

这篇文章将非常简单地讨论UDP TCP 包头(Headers)和它们的效率(efficiency)分析,尽可能的利用图表进行说明。

使用以太网(Ethernet)的一个优点是它具有非常低的错误率。这对UDP很有利,这是因为UDP没有纳入纠错。让我们深入看看一个以太网帧,下图为Ethernet Header:

Ethernet_header

在这个图中我们可以看到,以太网实现FCS(帧校验序列 Frame Check Sequence)。由此产生的头18个字节(Bytes)(4字节的CRC(循环冗余校验 Cyclic redundancy check) + 14字节)。

我们已知的最小的IP header有20 Bytes并且UDP有8 Bytes。如下图所示Packet encapsulation:

UDP_packet_encapsulation 

对比TCP/IP,我们可以得出 28/40 = 40% 更多的header Bytes对比UDP/IP。

由下图可知“n”的最大值为7。 使用这个值, 我们可以得到最大效率(maximum
efficiency), 因为这样是最优的. 更高的值将超出MTU(Maximum Transmission Unit)。

Header RTP with MPEG2-TS encapsulated 如下图所示:

Header RTP with MPEG2-TS

数据长度取决于MPEG2的Codec,但在MPEG2-TS传输中有188Bytes加上4个Bytes的Playload。理论上最高效率:(Ethernet/IP/UDP/RTP/MPEG2-TS)是94%。

mpeg-ts-header

 

以下图表显示了最大理论Efficiency对于TCP/UDP RTP:

Max Theoretically Efficiency

 

参考:

http://en.wikipedia.org/wiki/Internet_Protocol

http://en.wikipedia.org/wiki/Cyclic_redundancy_check

http://en.wikipedia.org/wiki/Frame_Check_Sequence

http://en.wikipedia.org/wiki/MPEG_transport_stream

http://vbrickvip.com/topics/transport_stream.htm

2011年3月10日星期四

为什么RTP往往是使用UDP,而不是使用TCP封装

继续完成“流媒体技术系列”,接上一篇提出的问题:为什么RTP往往是使用UDP,而不是使用TCP封装,接下来简单的解释一下,先摘录一些基本概念,然后使用一个表格进行对比,进一步探讨这个问题。

计算机网络OSI模型中,TCP和UDP为第四层传输层的功能。

简单的说:TCP传输控制协议(Transmission Control Protocol)是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接。TCP协议能为应用程序提供可靠的通信连接,使一台计算机发出的字节流无差错地发往网络上的其他计算机,对可靠性要求高的数据通信系统往往使用TCP协议传输数据。

必须要经过三次“对话”才能建立。
第1次对话
A-->    发连接请求数据包                       -->B

第2次对话
A<--    发送同意连接和要求同步          <--B

第3次对话
A-->    发数据包确认B的要求的同步    -->B

UDP用户数据报协议(User Data Protocol)是与TCP相对应的协议。它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去!UDP适用于一次只传送少量数据、对可靠性要求不高的应用环境。
UDP例子:“ping”命令测试两台主机之间TCP/IP通信是否正常,就是向对方主机发送UDP数据包,然后对方主机确认收到数据包,如果数据包是否到达的消息及时反馈回来,那么网络就是通的。

几个使用TCP重要的优点
1.TCP速率控(TCP rate control)制有经过证明是具有的稳定性和可扩展性。
2.TCP提供保证delivery, deleting the packet loss efficiently。
3.TCP是可以助于的越过防火墙。
4.流量控制(The flow control)。
5.The transmission windows system有助于优化网络资源的使用。

从网上摘抄一段关于TCP协议的主要功能
TCP协议的主要功能是完成对数据报的确认、流量控制和网络拥塞;自动检测数据报,并提供错误重发的功能;将多条路径传送的数据报按照原来的顺序进行排列,并对重复数据进行择取;控制超时重发,自动调整超时值;提供自动恢复丢失数据的功能。

相对TCP,UDP显然更好地使用于实时应用,原因如下:
1.最低开销(Minimum overhead)。
2.在最大数据从传输速率开始发送。
3.不重复请求,所以就没有重传(一个单一的数据包丢失在一个的实时应用中并不重要)。
4.低处理时间(low processing time)。不需要缓冲(No buffers)。

与TCP不同,UDP并不提供对IP协议的可靠机制、流控制以及错误恢复功能等。由于UDP 比较简单,UDP头包含很少的字节,比TCP负载消耗少。下图为TCP的头和UDP的头的格式:

TCP-Header 

UDP-Header

TCP协议和UDP协议的差别(以表格的形式):

 

  TCP UDP 和流媒体的关系
Header 20 Byte 8 Bytes UDP更好,少overhead
Connection Connection Oriented,在数据传输前需要建立connection。 Connectionless,没有connection需要被建立。 对于Multicast,Connection Oriented是不适合
Reliability 可靠 ACK 不可靠 可靠性比时间延迟(time delay)不重要。TCP会增加延迟
Communication Two-way双向 One way单向

In UDP, RTCP implements the feedback

Errors Error Correction FEC在整个packet Error Correction只在Header Checksum UDP使用较少处理Errors时间
Data flow 控制data flow用于管理下载速度 没有控制

UDP sends to the same data flow as is encoded the media.

Re-transmit 需要Repeat 不需要Repeat Repeat也会产生延迟,不适合实时应用
Delivery Rate 没有预设。TCP将一直增加直到数据丢失或发现堵塞 传输速度和流的编码率相吻合

UDP适应性更好

Client Buffer

Receive buffer
overflow: 如果数据到得太快,receiver发送一个信息给server,使其减慢传输

没有local caching,packet到了媒体播放器直接被处理。

Client Buffers也产生延迟

 

参考:
深入浅出讲解TCP/UDP协议:http://tech.163.com/05/0913/11/1THDB8DO00091589.html
http://zh.wikipedia.org/zh-cn/传输控制协议
http://zh.wikipedia.org/zh-cn/用户数据报协议

2011年3月3日星期四

实时传输协议RTP (Real-time Transport Protocol)

继续完成hanyionet的长期计划,在博客中完成“流媒体技术”系列文章,今天谈谈RTP,其实以前的文章也提到过这个协议。

RTP是一个传输协议,具体制定了数据流如何通过IP网络,并且它是流媒体中最重要的标准。所有的媒体流封装在RTP包。它通常是封装在UDP/IP如下图,并与其他譬如ATM或IPv6协议兼容。

rtp_Location

RTP主要用于实时数据多播(multicast),但它也可用于单播(unicast)(例如,如视频点播单向传输)。

也许我们都有一个疑问,为什么RTP往往是使用UDP,而不是在TCP封装,hanyionet将在以后的文章做一些解释。

 

RTP的特征

RTP提供多媒体应用正确传输所需的信息:时间戳(timestamp),序列编号(sequence numbering),安全(security),内容识别(content identification)和其他机制。这些服务必须在执行应用层(Application level),但它不是RTP所负责。因此,RTP协议只是有助于低层(lower layers)对资源的控制和增加可靠性,流量/拥塞控制(flow/congestion control)与其他机制对于实时信息。

RTP协议传输实时数据包通过网络,这意味着丢失或损坏的数据包将不重发(not retransmitted)。客户端软件要解决这个问题。另一个问题是,如果连接速度(connection speed)比媒体数据传输速率(media data rate)慢,那么传输播放会不佳或者不能播放。

下图为RTP data in an IP packet:

rtp_packet

下图为RTP的Header Format:

rtp_header 

具体说明请查阅:http://en.wikipedia.org/wiki/Real-time_Transport_Protocol

 

RTP是如何工作的?

这其实是我们比较关心的问题。时间戳(timestamp)是实时应用(real-time applications)领域最重要的信息。时间戳将增加,在第一个字节的数据包被传输,并当每一个包被发送它也将增加。接收器(receiver)使用它来重建原始的时间,并且可以使用正确的速率来播放数据。时间戳也可用于同步不同的数据流,不同的时间属性,如音频和视频数据在MPEG中。

另一个重要域是序列号(sequence number)。UDP不提供数据包在一个时序(in timely order),所以有必要使用序列号,是接受的数据包放置传入正确的顺序,用于数据包丢失时的检测。此外,例如,一些视频格式,当一帧分割成几个RTP包,它们都可以有相同的时间戳。

负载类型(payload type)编码/压缩格式(encoding/compression format)是必要的负载识别码(payload identifier)。但是,一个RTP发送者每次传输只可以发送一个有效载荷类型,虽然负载类型(payload type)在传输过程中可能会发生变化,例如,调整网络拥塞。

MTU“最大传输单位”(Maximum Transmission Unit)。也就是通过TCP/IP协议所传输的数据包最大有多少字节,MTU值越大,封包就越大,理论上可增加传送速率,但MTU值又不能设得太大,因为封包太大,传送时出现错误的机会大增。
考虑MTU很重要,不要超过它。因为如果一个RTP包超过MTU,它会被路由器分割,这个过程被称为分裂(fragmentation),如果其中之一丢失了,所有剩余的也将丢失。分裂(fragmentation)也会增加资源的使用。MTU是因网络类型而定,譬如以太网为1500字节。

 

参考资料:
http://www.ietf.org/rfc/rfc1889.txt

2011年2月28日星期一

什么是一顿优质的早餐

前几天很偶然地翻阅了一本杂志《时尚健康女士》2011第一期,有一个关于早餐的专题,觉得还不错,这里做一个非常简单的记录。
什么是一顿优质的早餐,其实很简单:

1.早餐要占全天能量的1/3
从能量供应的角度,早,中,晚餐的合理比例应为,30:40:30,也就是说,早餐的能量摄取应为1/3。其中,碳水化合物最好为50%,蛋白质为15%,脂肪为35%。

2.保证摄取3类以上的食物
谷类,蔬菜和水果,鱼肉,奶类和蛋类。
如果有以上几类中的3类,那么这样的早餐是达标的。

3.落实4种营养搭配原则
其实就是:有干有稀,有荤有素,有粗有细,有菜有肉。

中医专家推荐养生的早餐法则
1.早起不适合吃寒性水果
因为中医的观点,清晨,身体的阳气是和太阳一样逐渐生发的,吃寒性水果会抑制体内阳气生发。大多数水果是寒性的,例如香蕉,西瓜,李子等等。其实可以吃吃中性的苹果,热性的水果例如木瓜其实就很适合做早餐的搭配。
2.早餐的组合中如果有一碗粥,很养生

2011年2月12日星期六

将Qt Application Project改成Qt Library Project

很久没有写一些关于Qt的东西,今天介绍一个小方法将Qt Application Project 改成Qt Library Project。
换句话来说,如果原来使用的是Qt项目,生成exe,后来想要将这个项目生成DLL,那么简单的改变方法如下(在VS2008中):

在project的设置里(没有什么特别的步骤,唯一请注意第三部):

1) 定义一个macro 对于Qt,DLL export,写一个头文件(但是也是可以直接使用Q_DECL_EXPORT,类似和Qt的DLL project自动生成头文件一样。

#ifndef MYGLOBAL_H
#define MYGLOBAL_H 

#include <QtCore/qglobal.h> 

#ifdef MYLIB_LIB
# define MY_EXPORT Q_DECL_EXPORT
#else
# define MY_EXPORT Q_DECL_IMPORT
10 #endif 
11
12 #endif // MYGLOBAL_H 

2) 将Project的Configuration Tpye改成Dynamic Library (.dll)

3) 修改Prprocessor Definitions设定:
MYLIB_LIB
QT_DLL

4) linker-->Ouput File 改成生成.dll

5) 在我们想要export的class加入上面写的头文件
和一般dll export类似,只是我们这里使用的是我们定义的export的macro

1 class MY_EXPORT MainWindow : public QMainWindow 

 

附注
如果只是简单的使用__declspec(dllexport) ,而不是使用Qt的export DLL的macro,如果使用生成的DLL会出现类似这样的错误。
error LNK2001: unresolved external symbol "public: static struct QMetaObject const XXX::staticMetaObject"
非常简单来说,Qt的object比较特殊,不能直接通过常用的__declspec(dllexport)进行export。

2011年2月10日星期四

数字图像处理笔记(2)

继续记录Digital Image Processing一些重要的概念,关于图像解析度,以实用知识为主。

逐行扫描(Progressive scan):每一帧图像由电子束顺序地一行接着一行连续扫描而成,这种扫描方式称为逐行扫描。
隔行扫描(Interlaced scan):每一帧图像通过两场扫描完成则是隔行扫描,两场扫描中,第一场(奇数场)只扫描奇数行,而第二场(偶数场)只扫描偶数行。隔行扫描技术在传送信号带宽不够的情况下起了很大作用,逐行扫描和隔行扫描的显示效果主要区别在稳定性上面,隔行扫描的行间闪烁比较明显,逐行扫描克服了隔行扫描的缺点,画面平滑自然无闪烁。在电视的标准显示模式中,i表示隔行扫描,p表示逐行扫描。[1]

 

有用小常识:
a) 视觉惰性(视觉暂留特性):每秒换帧24次,人会产生连续感。
b) 图像的闪烁感:人在较低频率的光脉冲刺激下,会产生一明一暗的闪烁感,这是有光和无光在亮度感觉上的差别所致。把闪烁的频率提高到临界闪烁频率(45.8Hz)以上,由于视觉惰性的作用就感觉不到闪烁了。电影的帧频为24,其实也写成24p(电影胶片),利用光活门,使每帧画面闪亮两次,达到每秒闪亮48次,超过临界闪烁频率。
c) 场频率:如使用隔行扫描,就会有场频率一说,就是一帧图像分两场传输,常见的60Hz,50Hz对应的帧频率就是30,25。
d) 我们常见的1080i50就是1920×1080像素,每秒50个场的速度交织编码(25帧)[3]。
e) PAL和NTSC
50i(PAL):全名为逐行倒相 (Phase Alternating Line)。每秒25帧,隔行扫描的电视广播格式。[4]
60i(NTSC):属于同时制,每秒60/1.001场。但存在相位容易失真、色彩不太稳定的缺点。NTSC标准的帧幅为每秒30帧。[5]
f) 数字电视,传统的PAL和NTSC陆续被淘汰,取而代之的是数字电视,数字电视其实就是将画面信号经数位化处理后,变成一串数据资料,再经数位调变传送到家。
简单的说,数字电视的成功,主因是视频压缩技术的发展。国际统一的压缩标准是MPEG-2,在传统无线电视台600万赫兹频宽的电视频道中,可传送1080条水平扫描线的高画质电视(HDTV高清晰度电视)。它同时也提供杜比的AC3级高级音响效果。

 

高清的播放分辨率有 3 种:
768i (i 表示隔行扫描)
1080i(i 表示隔行扫描)
1080p(P 表示逐行扫描)

 

HDTV高清晰度电视(High Definition Television)的扫描格式共有 3 种[2]:
1280×720p
1920×1080i
1920×1080p
中国采用的 1920×1080i/50Hz。
全高清分辨率为1920×1080的高清信号。

例如,不做任何压缩:
高清640*480的彩色图像,每秒30帧,则一秒钟的数据量为:
640*480*24*30 = 221.12 M
NTSC视频信号720*480,每秒30帧,则一秒钟的数据量为:
720*480*24*30 = 248.83 M
高清1920x1080的彩色图像,每秒30帧,则一秒钟的数据量为:
1920*1080*24*30 = 1492992000 bit =  1.5 G
-->
必须对视频信号进行编码压缩[2]。

 

注意,我们有可能搞混的是
a)在描述数据传输时的计算如下(In some cases when used to describe data transfer rates bits/bytes are calculated as in the metric system as follows):
1 MB = 1,000,000 bits/bytes
1 kb = 1,000 bits/bytes
1 bit/byte

b)在描述数据储存是的计算如下(In the cases when used to describe data storage bits/bytes are calculated as follows):
1 byte = 8 bits
1 kilobyte (K / Kb) = 2^10 bytes = 1,024 bytes
1 megabyte (M / MB) = 2^20 bytes = 1,048,576 bytes
1 gigabyte (G / GB) = 2^30 bytes = 1,073,741,824 bytes
1 terabyte (T / TB) = 2^40 bytes = 1,099,511,627,776 bytes
1 petabyte (P / PB) = 2^50 bytes = 1,125,899,906,842,624 bytes
1 exabyte (E / EB) = 2^60 bytes = 1,152,921,504,606,846,976 bytes

附注:在数据通信中, 1 kilobit 是 1000 bits。它通常用于测量是在一秒钟两个通信点之间传输的数据量。千比特每秒,通常缩写为Kbps。

 

下一篇笔记将关于,数据冗余,编码压缩。

 

参考资料:
[1] 逐行扫描与隔行扫描: http://baike.baidu.com/view/115294.htm
[2] 数字图像处理(第2版),Rafael C.Gonzalez / Richard E.Woods,电子工业出版社
[3] 高清晰度电视: http://zh.wikipedia.org/zh-cn/高清晰度电视
[4] PAL制式:http://zh.wikipedia.org/zh/PAL制式
[5] NTSC制式:http://zh.wikipedia.org/zh/NTSC制式

2011年2月8日星期二

数字图像处理笔记(1)

最近的一些研究涉及了数字图像处理。这里我准备开一个小小的系列,放入我最近的一些学习的笔记。


Digital Image Processing是一个很有趣的领域。接下来我按照我的喜好,记录一些重要的概念。

我们大概都知道,在计算机中,静态的图像有两种表达形式:
矢量图,vector based image
位图,bit mapped image,(位图里又有灰度图(grap scale image),彩色图(color image))

矢量图,顾名思义,也就是可以用计算机的指令来描述的,图像中的每一的元素都可以使用数学表达式来实现。所有一个矢量图会由很多的数学表达式来进行描述。我们常常使用最简单的visio就可以做矢量图,当然了adobe illustrator是一个做矢量图的利器。
矢量图有很多优点,1.可以进行不失真的缩放,2.可以容易的移动复制,甚至旋转,3.矢量图产生的数据量比较小。
矢量图的一个很明显的缺点是使用场合有所限制,因为很多复杂的图像无法使用数学表达式来描述。

位图,计算机中最广泛使用,其实就是一幅图由很多的像素(也可以说是由像素矩阵)组成的。
每一个像素pixel其实在计算机里就是由一定长度的数字值来表示它的颜色和亮度。如果单位面积内的像素越多,那么分辨率就越高,所显示的图像就会接近于真实物体。
如果图像的深度越高,或是图像的分辨率越高,那么位图的大小就越大。
色彩深度,色彩深度又叫色彩位数,即位图中要用多少个二进制位来表示每个点的颜色,是分辨率的一个重要指标,例如16位(增强色),24位和32位等。
例子:
例如一个图像,RGB三个分量,每个8位,一共就是24位,像素的深度为24,每个像素就是2的24次方就是16777216的一种,其实人是无法分辨这么多颜色的。

位图常用的编码方式有:
RGB,红、绿、蓝三原色的光学强度。
CMYK,用青、品红、黄、黑四种颜料含量来表示一种颜色

常常还有Alpha通道,也就是增加像素的透明度信息。

 

我们常常见到的图像格式有:
BMP(Bitmap Image File or Device Independent Bitmap (DIB) file format or simply a Bitmap)
GIF(Graphics Interchange Format)
PNG(Portable Network Graphics)
JPEG(Joint Photographic Experts Group),附带提一下它是基于Discrete Cosine Transform离散余弦变换,转换到频率空间,JPEG有选择地选择数据来压缩文件,会丢弃一些数据,使用是有损压缩。

参考资料:
http://zh.wikipedia.org/zh-cn/%E5%83%8F%E7%B4%A0
http://zh.wikipedia.org/zh/%E4%BD%8D%E5%9B%BE

http://zh.wikipedia.org/zh/Jpeg
http://zh.wikipedia.org/zh/Bmp
http://zh.wikipedia.org/zh/Png
http://zh.wikipedia.org/zh/GIF

2011年2月2日星期三

年末随笔 -- 我也来谈谈“真正的学习”

前几天,我看了武志红的一篇文章《真正的学习》。看完之后真是非常有感触。
里面谈到了顿悟,模仿学习永远是跟在别人的后面,而顿悟,却永远是崭新的。即便你顿悟到的一个发现可能是无数人都发现的,但对你而言,这是崭新的,而且真的是你自己发现的。

其实我一贯成绩不佳,特别是高中尤其差,高中的时候几乎从来没有完成过作业,我其实非常讨厌做题,做的也非常慢,高中的时候几乎一半的作业要么没有写,要么就是抄的。对于我无法理解的知识,我是无法通过记住题型,或做大量的练习掌握。而且很多知识,如果我不知道有什么用,其实我更本就不想学。高中的物理我是学的极烂的,我永远搞不懂例如那些什么小车啊,上面有小球啊,推来撞去的计算。但是凡是我知道的东西,1是靠慢慢理解它的本质,2是靠悟出来的。但是我掌握的知识,无论是什么时候总是可以信手拈来。这也许就是理解本质的学习,和悟出的知识的好处吧,也许永远不会体现在分数上面。

后来到了德国,遇到了几个很好的教授,他们就是先告诉你这个知识以后有什么用,工业上有什么东西是用了这个技术,先给你一个最直观的概念和描述,然后在从最本质的公式,以及实验推出来这个知识,这就是本质的学习,学的是什么呢,就是学事物的本质。以前读研究生,其实很多精深的知识,是非常难通过“悟”来理解的,然而确是可以通过本质的学习达到真正的掌握。

然而慢慢去理解它的本质,其实远比靠悟出来的知识少了那份成就感。但是理解本质的学习也是真正的学习的一种,上面提到我的高中物理很差,但到了大学物理我继续通过“本质的学习”,我的大学物理就学得很好,其实这是因为,越到高深的知识越需要高层次的学习,也就是需要“理解本质的学习”。我现在号称在读博士,博士不仅需要“理解本质的学习”同时也需要一些“悟出知识”,这样才有可能到达“创造知识”的阶段。悟出知识,其实书创造知识的一个准备阶段,或是可以说是一个训练的方法。

我个人认为的学习的"档次":
模仿学习 << 理解本质的学习 << 悟出知识

我个人认为的进阶:
学透了之后--->“创造知识”

上面说过很多精深的知识很难通过悟来掌握,因为过于“精深”。然而,编程确可以通过“悟”来学习,学习编程语言的过程,其实是一个绝佳的悟的过程,我还是比较愚笨的,以前学指针和类的时候,很是一头雾水,比起其他同学来说,学的非常慢,但是突然有一天,脑子里突然间有一个“啊哈”的感觉,哇,原来如此,顿悟一下,突然间发现编程的世界是如此的广阔,这个广阔的天地是自己发现的,自己会迫不及待得想要在这个自己创造的新天地里施展一番手脚。这就是顿悟的乐趣。也是学习编程的乐趣。顿悟之后,这个知识似乎已经融入自己的血液,有一天有一个朋友问我说,哇,你的面向对象的设计和使用得非常好,看不出来你只有两年编程经验,我的回答是,类的设计和使用的很多要点其实是我自己“悟”出来的,呵呵,这是悟出知识的好处。

 

------ ------ ------ ------

最后祝大家,新年快乐,健康如意。这里没有假期,大年三十还是要上班,呵呵。很想念国内的家人朋友,唉,每逢佳节....今天随手写一些东西吧,用类似微博的方式。

正如工作了才体会工作不易,其实无论工作生活,每个人都有自己的辛酸之处,网上有一句话说的很好,每个人的幸福其实是活在其他人的眼里。

年纪大了,常常也会得到一些生活的感触,如何让自己生活得更快乐一些,其实也就是爱自己的生活,爱关心你的人,爱自己的工作,常常感恩。

问问自己,去年真正学到了什么,其实不是什么所谓的高深的知识,而是简单的四个字,活在当下,去年的博客中我也常常提到这个。如果能够真正的活在当下,听听自己的内心,唤醒真我,这样才可以从自己的心智牢笼里挣脱出来。如同《活在当下》这本书中谈到的,在我的开悟之旅中,我也正在学习不认同自己的头脑,不再把心智的内容看得那么认真了,其实我们的自我感并不依附它而存在。

摘录《活在当下》一段原文:
当下之外一无所有你可曾在当下之外,经验过、做过、思想过、或感觉过任何事吗?你认为你以后会吗?任何事有可能发生或存在当下之外吗?答案不言自明,不是吗?过去不曾发生过什么;它发生在当下。未来不会发生什么;它会发生在当下。你认为的过去,是一个记忆的轨迹,是一个储存在心智里的前任当下。当你记起过去时,你重新启动了一个记忆的轨迹——而且,你现在就在制造轨迹。未来是一个想象的当下,一个心智的投射。当未来到的时候,它就是当下。当你想到未来时,你是在当下想的。过去和未来显然没有它们自己的实相。正如同月亮本身不发光,它只能反射太阳的光一样。过去和未来也一样,只是永恒的现在的光、它的力量、和它实相惨淡的反射而已。它们的实相是向当下“借贷”来的。

2011年1月30日星期日

周末闲聊电影音乐

很久没有聊一下电影和音乐,这都是美好生活的重要组成部分,今天我这个电子工程师很外行的和大家聊聊电影和音乐。

先谈电影,推荐一部电影《爱情与灵药 Love and Other Drugs》,对我来说,这是我最近看到的最好的一部电影,安妮·海瑟薇和杰克·吉伦哈尔主演,两个人配搭十分养眼。故事改编自杰米·雷迪(Jamie Reidy)的一本名为《强卖:一名万艾可销售人员的演变》(Hard Sell: The Evolution of a Viagra Salesman)的畅销书。我个人评4星,为了安妮·海瑟薇的裸戏再加一颗星(5星啦),充满了性感的张力,却不流于色情,补充一下,她的裸体和她的脸蛋一样美丽,每个部位都充满魅力。

正巧的是我有一个朋友也是辉瑞区域销售代表,电影里的描述还是很有真实性的,销售代表的语言,他们对药品的滔滔不绝,优渥的收入,业绩的压力。Jake Gyllenhaal绝对是辉瑞最近最佳销售代表(辉瑞应该和导演进行了很多的磋商),其实这部影片也如同Tom Hanks在《荒岛余生》中给FedEx做的巨大的广告一样,整部影片充斥着辉瑞的雨伞,笔,钥匙圈,各式的药盒,万艾可的T恤,但是这绝对是影片的最好部分之一,非常真实。各种销售的恶斗,看完之后其实并不觉得辉瑞的“邪恶”,反倒是有另外一种亲切感,这就是商业,不,这就是商业“生活”,商场如战场,任何Business都是这样,辉瑞也不例外。这就是“嵌入广告”的极致吧,至于冯小刚之流应该好好学学。

love and other drugs 

回到电影,他们的感情接受了现实的拷问,但是最后我们看到的是真诚的感情!Jamie对患帕金森病的Maggie情圣一般的告白,还真让人有些感动。

情与欲,灵与肉,沉重无比的爱。很深的悲剧色彩,爱情的本质,责任和同情。很多很多可以使人体会的元素。

很多笑点,附带一些美式的轻喜剧元素,很多温情,一些思考,但是又不是太过沉重,美好的结局,这就是我要的一切。

 

 

接下来聊一下音乐。
其实我非常少听粤语歌,今天很偶然地听到了陈奕迅的《陀飞轮》注1,很有感觉。歌词很有深度,画面。它对简单的描述,但是谈到了很多人生,时间。
但是歌里没有对描述的问题进行回答。
答案是什么呢。

Tourbillon

我的答案是《当下的力量》中的一段话,这是我在脑海里立即浮现的答案,也许不是真正的答案:

时间既不宝也不贵,因为它是个幻相。你所谁知的宝贵,不是时间,而是时间之外的那一点:当下。当下才是既宝又贵的。你专注在时间上——过去和未来——的程度越大,你磋跎掉最宝贵的当下的程度就越多。为什么说它是最宝贵的呢?首先,因为它是唯一的。它是存在的全部。永恒的现在,就是你整个生命展现其中的空间,那个如如不动的因素。生命就是当下。过去从来没有一个不是当下的时间,未来也不会有。第二,当下是唯一一个能带你超越有限心智局限的点。它是你唯一的一个通往无时间、无形式的本体界的点。

你的答案是什么呢。

附上歌词:

过去十八岁 没戴表 不过有时间
够我 没有後顾 野性贪玩
霎眼廿七岁 时日无多 方不敢偷惰
宏愿纵未了 奋斗总不太晚
然後突然今秋
望望身边 应该有 已尽有
我的美酒 跑车 相机 金表 也 讲究
直到世间 个个也妒忌 仍不怎麽富有
用我尚有 换我没有 其实已 用尽所拥有
曾付出几多心跳 来换取一堆堆的发票
人值得 命中减少几秒 多买一只表
秒速 捉得紧了 而皮肤竟偷偷松了
为何用到尽了 至知哪样紧要
劳力是 无止境
活着多好 不需要 靠物证
也不以高薪 高职 高级品 搏尊敬 wo~
就算搏到 伯爵那地位 和萧邦的隽永
卖了任性 日拼夜拼 忘掉了为甚麽高兴
曾付出几多心跳 来换取一堆堆的发票
人值得 命中减少几秒 多买一只表
秒速 捉得紧了 而皮肤竟偷偷松了
为何用到尽了 至知哪样紧要
记住那 关於光阴的教训
回头走 天已暗
你献出了十寸 时和分
可有换到十寸金
还剩低几多心跳 人面胀水晶表面对照
连自己 亦都分析不了 得到多与少
也许真的疯了 那个倒影多麽可笑
灵魂若变卖了 上链也没心跳
银或金都不紧要 谁造机芯 一样了
计划了 照做了 得到了 时间却太少 no~
还剩低几多心跳 还在数赶不及了
昂贵是这刻 我觉悟了
在时计里 看破一生 渺渺

注1,来自维基百科:
陀飞轮(法语:Tourbillon)是由法国著名钟表大师宝玑(Abraham Louis Breguet)于1795年发明,是机械钟表机芯中的一个装置。 陀飞轮装置的设计本身是用于怀表之上,因为怀表垂直的放在口袋中,或挂在颈上时,地心引力会影响摆轮摇摆速度,引致出现误差。陀飞轮的原理基本上是把游丝、叉式杠杆和擒纵系统设计在同一轴上运作,陀飞轮在运行时会不断旋转,以减少地心引力所做成的影响。但随着二十世纪手表的兴起,由于手表并非长时间垂直放置,因此陀飞轮装置对手表的作用已经没有怀表那么大,但陀飞轮装置极其复杂,而且由于制作成本及工艺的要求相当高,因此陀飞轮变成了高档手表的代名词。

2011年1月17日星期一

清扫机器人Scooba 230

最近在研究一些"多机器人系统",对机器人又有了很多新的认识和兴趣,接下来我将会记录一下机器人学习的一些笔记,并提供一些有趣的机器人新闻和知识,(具体为robot新知,robot笔记两个分类)。

今天在focus.de看到一则新闻关于清扫机器人,简要的翻译一下。

irobot_230

清扫卫生间通常不是令人喜欢的家务。最近在国际消费类电子产品展览会(International Consumer Electronics Show)上,美国iRobot公司展示了其生产的Scooba 230机器人,它可以用来执行清扫卫生间任务。

这个Scooba 230只有16.5厘米宽,9厘米高,很适合做厕所和浴室中狭小空间内工作。

该机器人应该能够消除高达97百分之的常见细菌,而且并不会重用脏水。今年初就会在美国上市,大约300美元。

原文出处:
http://www.focus.de/digital/multimedia/irobot-scooba-230-roboter-putzt-das-bad_aid_589204.html

2011年1月5日星期三

如何写好文档

最近做项目的时候需要阅读很多文档,并且需要写一些文档,今天总结一些关于如何写好的文档的个人经验,和大家分享。

1. 文档要服务于受众
请努力做到,使读者读文档时候不会遇到任何困难,例如把该解释的定义解释清楚。如果可以的话,写之前请分析一下读者和要表达的内容。

2. 不要写那些你自己也没理解的东西
我们读一些文档的时候常常感到一头雾水,其实是因为这个文档的作者其实自己也并不是完全搞明白这个东西,文档上的描述其实只是东拼西凑的资料。

3. 使用好的规范,好的格式,你的文档就成功了一半
例如当我们对于一个技术进行描述的时候,我们必须让读者不需要前后翻页,就可以跟上我们的描述。保持格式的一致性很重要。其实不仅需要写规范,而且还需要使用正确的语法,消除错别字。当然了,写中文比较不容易出现这些问题。但是写英文文档就会常常出现这种问题,这就需要认真对待。

4. 使用短句,显示精华
这只是文档,所以不要卖弄文采。长的复杂的句子,并不是知识性文章的标志。

5. 使用常见的词
这样会让读者更容易进入“状态”。还要注意做到统一术语。

6. 只写需要的,并尽可能少写
这其实就是我德国同事常常说的:“so viel wie noetig,so wenig wie moeglich”。这样会让文档的读者尊敬你,因为你让他们节约了时间。