2008年12月5日星期五

Fedora 9在英文环境下安装fcitx指南

Fedora9终于发布了,第一时间将这个系统折腾进我的本本里。我下载的是LiveCD,安装之后语言环境如下:

LANG=en_US.utf8
LC_CTYPE="en_US.utf8"
LC_NUMERIC="en_US.utf8"
LC_TIME="en_US.utf8"
LC_COLLATE="en_US.utf8"
LC_MONETARY="en_US.utf8"
LC_MESSAGES="en_US.utf8"
LC_PAPER="en_US.utf8"
LC_NAME="en_US.utf8"
LC_ADDRESS="en_US.utf8"
LC_TELEPHONE="en_US.utf8"
LC_MEASUREMENT="en_US.utf8"
LC_IDENTIFICATION="en_US.utf8"
LC_ALL=
下面介绍一下我的安装方法

1、去http://www.fcitx.org/main/?q=node/9下载fcitx的fcitx-3.4.2-bin.tar.bz2稳定版(预编译包)
2、开一终端,进入下载目录中执行命令:tar-jxvffcitx-3.4.2-bin.tar.bz2解压缩
3、执行./fcitx.install安装完毕
4、su至root用户,输入vi/etc/X11/xinit/xinput.d/zh_CN命令,录入如下内容:
XIM=fcitx
XIM_PROGRAM=fcitx
GTK_IM_MODULE=fcitx
gnome-im-settings-daemon>/dev/null

保存,退出
5、编辑用户目录下的.bashrc文件如下:
#.bashrc
exportLC_CTYPE="zh_CN.utf8"
exportXMODIFIERS="@im=fcitx"
#Sourceglobaldefinitions
if[-f/etc/bashrc];then
./etc/bashrc
fi

#Userspecificaliasesandfunctions
6、将命令fcitx加入至启动项目中,重启,OK!

2008年10月9日星期四

有助于你编程而立即要做的10件事

我们一直努力又努力去掌握那些对于我们来说是全新的东西。那么,我们做什么来帮助学习?下面是一个关于如何使你编程更迅速合理的10件事情的列表。我更习惯与使用Ruby on Rails,但下面的观点也适用于其他环境。

1.升级单元测试

你的编程没有测试?你应当随时进行测试,即TATFT ( testing all the fucking time )。当然你应当选择比仅是单元测试更好的方式。RSpec和Shoulda是两个可以选来使用的工具。

2.试用TDD

既然你在测试,那你就应当记录下这些测试。不要记录代码并用后来的测试覆盖它,而应当是方法的记录。TDD ( Test Drive Development ) 可以使你编出更好的代码,TATFT最重要的基础就是 TDD。进行TATFT并不难,首先你写下你所能做的最简单的测试并运行,观察测试的失败,然后写出执行语句以便使测试通过,不停地重复这样的过程就可以了。

3.自动化部署

自动化是你最好的朋友,想要实现自动Capistrano是相当好用的工具。在你配置部署好你的项目后,第一个要装的东西就应当是Capistrano。从第一天起就可以自动化部署将会节约你大量的时间。

4.安装 SCM

安装 SCM并学习使用它,这样做的好处是可以使那些超重的库中的代码不再那么冗繁,目前有大量的工具可以选择,我每天使用的是Git。Git是一款很特别的分布式SCM,即DSCM。DSCM是很有前景的,它可以同有其他库的用户们协同工作。

5.审查持续集成

现在我们已经测试了代码并将其安全的存放在库内。比起不停地测试,什么是更好的方式?自动测试是个不错的选择。很感激有cruisecontrol.rb的存在,这个应用工具自动运行了那些琐碎的测试。

6.了解你的代码

写代码是一回事,但是更重要的事情是了解代码。可以用四种自动化工具来帮助你了解代码:flog、 tarantula、rcov 和saikuro。这些工具分别有其独到之处,我很乐意向你介绍它们。
Flog,可以按字母排列的顺序来记录复杂的结果。

Tarantula,根据相关性原则和一些灵活的创意设计的。它所做的是spider 你的Rail应用以便去搜索坏链接。这真是令人得到解脱,使我受益匪浅。

Rcov,这是一个在Ruby界相当受欢迎的工具。它是一个C0范围工具,换言之,它精确的测定出你的代码中哪些部分在被测试,哪些部分没被测试。唯一的缺陷是它不能测试诸如:“if condition_a && condition_b || condition_c”. 这样的语句。

Saikuro,可以测量出你代码环的复杂性,即可以计算出你代码branche 和path的数量。当然你代码的复杂性越低,它运行的越容易。

7.升级你的Fixtures

Fixtures 是看起来很有创意的事物之一,但有诸多的弊端。对于Fixtures,只有极少的替代,我选择使用Rails Scenarios,原因是它在测试中工作起来像Fixtures一样,但是允许我做比YAML更好的DSL。我也可以在一个文件内指定多重的 Scenarios,这将使事情变得更有组织性。

8.收集分析对象

在Rail平台上搭建新的系统。每周都会有新的监控工具出现,这样我们有很多的选择,在这里我介绍我已经使用过的工具:HopToad 和 TuneUp。

HopToad对于异常报文有不错的能力,它可收集间断应用并用简便的方式显示收集结果。还有,这是一个免费软件~

TuneUp 用另外一种方式获取数据,它计算每一处分别花费多长时间去组合自身。你的页面是不是花费了很长时间去组建?但你又不知道是因为什么缘故花费了这么久,使用 TuneUp来查一下吧,你会发现一些你以前从未想到过的事情。另外,TuneUp是一款开源软件,你可以登陆进他们的托管服务分享你的结果。

9.阅读其他人的代码

你想成为更优秀的程序员吗?那一定要多读代码,这包括好的、坏的、你自己的、其他人的代码等。阅读代码是一项很多程序员都不重视的技能,但其实能够快速阅读他人的代码并理解其中的含义是一种极其需要的能力。

10.写博客的习惯

就我个人来说,当我阅读博客的时候我可以找到所有的信息。大部分时候我是会撰写跟技术相关的要点,偶尔讨论点轻松的话题。写博客是出于分享的原因,你可以写下能够帮你节约时间的技术技巧,也可以是一些你想要记住的技术难点和命令之类。

2008年10月6日星期一

一个可怜可悲的男人的故事

烧饼:

  你好!我也不知道这样叫你是否合适,但我知道你不会计较的。本不想把心事说给任何人听,但看到你写的散文与情感文章后,我还是决定把你做为我的倾诉对象,我真的活的很累,总是怕老公知道了,怕身边的朋友亲人知道后,会给我鄙夷的眼神,我夜夜睡不着,经常在噩梦中惊醒,谢谢你愿意听我说出埋藏心底多年的故事。

  我现在是一个孩子的母亲,那是5年前,我的丈夫被派往美国公干,为期两年,那时我与丈夫结婚还不到一年,生活很甜蜜,可突然发生的变动让我无法接受,那时我真的很傻很天真,认为丈夫不爱我,新婚就离开我,我又哭又闹,却无法改变局面。

  丈夫走后,我心情很压抑,虽然每天都能接到他的电话,但用以泪洗面来形容我的状况,一点都不为过。我了调节情绪,我听了家人与朋友的建议,他也很支持我出去旅游散散心,又恰逢“十一”,假期又长,可万万没有想到,就是这次旅游,让我这几年都活在阴影中。

  旅游的目的地是海南,在飞机上,我认识了同是去旅游的陈刚,陈刚很年轻,大学毕业两年,工作非常出色,人长得也很阳光。我与丈夫结婚应该属大龄青年的结合,早就过了那种年少轻狂的年纪,丈夫在大公司做高管,平时浪漫与幽默根本找不到。

  两人在飞机上谈的很投机,陈刚很机智,很幽默,不知不觉中我似乎喜欢上了,面前这个大男孩,从他的眼神中我也能读懂些什么,我知道那代表什么,我也曾爱过,虽然我快30岁了,可也许就是我的成熟与感性,吸引了他。

  海南风土人情都很美,天空是那样的蓝,一望无际的蓝色海域,身边的他让我开朗了许多,我看他的眼神也变的迷离。

  相聚时总觉得时间过的很快,一晃就该回到现实生活中去,我心中莫名产生了失落感。

  就在返程前的那个晚上,我和他在一家宵夜摊上,忘情的喝了很多酒,我也不知道当时是怎么了,平时滴酒不沾的我,却不停的举杯与他对饮。也许是一种心情的发泄,把不愉快都发散出来,也可能是有意把自己灌醉,最后激情淹没了我,彻底泯灭了我的道德底线。

  那个晚上,他年轻健壮的身体让我疯狂,我疯了似的与他缠绕在一起,那一刻没有烦恼,只有快乐!

  返程后我没有再与他联系,陈刚也没有再找过我。

  可事情却远没有那么简单,回来后不久我就发现自己怀孕了,刚好婆婆又发现了,再加上年纪也大了,双方家庭都热切的期盼孩子的降临,丈夫听到消息也非常兴奋,两年中丈夫几次回来探亲,面对成熟温柔,对我体贴有加的丈夫,我不知如何是好,几次想把事情告诉丈夫,可又怕得不到原谅,其实我心里也是很爱他的。

  5年来我时刻提醒自己,要对丈夫好一点,来弥补自己的过失,可每天我都好担心丈夫会发现什么,从此我很少能体会到快乐,和丈夫之间也好像有了一堵无形的墙,丈夫却以为是那次公干引起的,对我是更加好。

  烧饼我该怎么办,我真的怕失去现在的幸福。

我不知道这的男人到40岁左右的时候知道事情的真相了怎么办,那种心碎和善心欲绝可以让任何一个人心里崩溃的

2008年9月29日星期一

百度被强奸之后会怎样?

百度目前财大气粗,为啥呢?因为把自己最重要的部分都卖出去了.就好比一个美女,一旦决定做妓女,那一定是财源滚滚的.也一定会财大气粗,

世界上其他的搜索引擎,几乎都是将广告放在右边,与正常的结果加以区分,让网民知道:这是广告,如果你喜欢可以点,不喜欢可以不点.

但是百度不同,只要是热门的东西,那么搜索出来的第一页结果,一定基本上是广告.

网民没得选择,除非你跑到第二页去.

这好比一个小伙子爱上一个美女,而美女是个妓女.小伙子很痛苦,但是没有办法,只好拼命抚摸美女漂亮的胸脯.边摸边流泪.

其他搜索引擎大不心羡慕百度.因为,如果你羡慕它,就是想歪了,想做妓女了.这万万不可啊.一旦走错了这一步,将难有回头.

你想啊.百度每天有多少猛男在疯狂地点击它的胸脯啊.抽插它的私处么?多到你想象不到的程度.完全被搞烂了啊.

更让你想象不到的是:百度还在自摸.为什么呢?

难道这么多的人搞它,它还觉得不过瘾?

不是的.这与百度要求嫖客们付款的方式有关.

嫖客要求百度的肉体服务,百度答应了.但是规定了服务的模式.是摸一次多少钱.

我们知道.百度是同时被超级多的人在摸,这就有了浑水摸鱼的机会了.

反正人多,出了钱的嫖客在摸.其他人也在摸.百度于是自己也摸.

百度虽然被众多的人同时摸.但是摸了多少次,百度是统计得非常清楚的.但是嫖客不清楚.却无法反驳百度提出的被摸的次数.于是只好认栽.

嫖客们于是只好天天给钱,月月给钱.

会不会吵起来呢?

会的.

那怎么办呢?

好办.嫖客们在招摇大家来摸百度的时候,其实是想卖些个姻渍粉,手帕,避孕药,自慰膏之类的东西出去的.

如果嫖客不想通过百度这个美女来出售这些东西了.

可以.

但是请将您的姻渍粉,手帕,避孕药,自慰膏之类的东西从百度的胸脯上拿开吧.

不想拿开吗?

好.我百度自己把它拿开.并且永远别想沾我百度的边.放在脚边也不行.

客官,大家注意了.目前只也百度这号美女[尽管已被入得不成样了]是头号招牌,是头块牌子.大家都喜欢.你不想跟它合伙,你的东西可能要通过更贵的方式才可以卖出去.

所以,嫖客们只好情愿挨宰.

与此同时,也在呼唤另一个清纯的美女出现.

硕鼠硕鼠,勿食我粟.

淑女淑女,何时适汝!!!

淑女是谁呢?就是营销型企业网站!

什么是营销型企业网站呢?

2008年9月25日星期四

Prison Break!!!

一直以来都很喜欢Prison Break,不仅仅是喜欢里面的男主角的帅气面孔,更为我所敬仰的是里面严密的逻辑思维和给我的启发(MS我很喜欢在这在那受到启发,不知道这是不是好事。吼吼)。
Prison Break里面,处处都体现了一个道理,就是,无论你要做什么事情,都要谋而后动,考虑到种种可能发生的情况,这样才能万无一失。
还有,我可以看见,Michael博学,什么都知道。但他不是躺在床上想啊睡觉啊得到这些知识的,也是通过不停的看书,付出,虐待脑细胞得到的。这点就不得不让我佩服,我最缺乏的就是这种精神,小白也曾告诉我,要么就不看书,要么就要把书看透,一个字一个字的看。从今天开始,我将要这么做。我发誓!
不言放弃,在任何情况下,Michael都没有说放弃,哪怕到了最坏的情况也是,我呢?往往看到一点绝望的气息的时候,就支持不住了。这点,我要学习。------困难是对弱者而言是痛苦,对强者,它只是帮助自己的助手。
无论如何,谢谢prison break ,谢谢Micheal,虽然都是虚构了,但教会了我很多。

2008年9月23日星期二

复杂的社会,简单的苹果

乔布斯在旧金山的Macworld大会上发布了一款没有LCD屏幕,没有FM收音,只有一个随机播
放的功能的闪存式廉价数字音乐播放器-iPod Shuffle。有创新能力高端厂商都恨不得把
消费者能想到的功能都做到一个手表,只有苹果提出了不同的方向,以至于竞争对手嘲笑
苹果推出了一个落后于整个行业四年的产品。但深暗苹果Think Different文化的macfans
仍然对这款产品追捧至极,简约实用,做功精细,童叟无欺。苹果电脑凭借Macworld发布
的新产品一天以内股票狂涨14%。

苹果电脑84开始应用图形界面,微软5年以后才有,10年以后才真正有人用;苹果电脑99年
就有了成熟的无线网络技术并无私地努力推广其标准化,无线网卡地价格才得以从几千将
到几百,3年以后intel无耻把这项技术加到其某类芯片中无休止的抄作;01年苹果就有了
iPod,3年以后Sony和创新才推出类似产品;创新总裁在iPod Shuffle发布以后嘲笑苹果是
一靠抄作文化的公司,遗憾的他不知道iPod Shuffle内置哩电池,USB直接充电,附加多个
增值配件?. iPod Shuffle没有收音和LCD,非不能也,是不为也。

iPod Shuffle 可以容纳120首歌却不可以在LCD上进行选择,很不方便,苹果的解释是:L
ife is random,生命是随机的,我们永远不知道下一首歌是什么。真的很象美国著名阿甘
真传里面的对白。Life is iPod Shuffle, you will never know what will be next。但
是这句话苹果只讲了前面的一半,Life is random 的背后是选择;iPod Shuffle的背后是
iTunes,是网上音乐商店,是我们购买音乐,是我们收藏CD,然后我们又把音乐下载到iP
od Shuffle,我们其实一直都在选择,我们在iPod Shuffle上听到的每一首歌都是不期而
遇,又是似曾相识的。我们为什么在iPod Shuffle不需要在选择我们要听哪一首歌,因为
我们已经选择过了。

和苹果所说的一样,这样的模式非常接近生活的本质,微观上我们无法控制事情的发生,
宏观上我们却掌握着命运。一个记者不会知道明天发生什么事情,但从他决定要做记者的
那一刻起,他已经决定了要面对这一切。生命总是不太方便的,只有坚强的人才知道命运
是掌握在自己手里的,这是一个秘密,并不是所有人都知道。让人怀疑的是,是不是在发
达的国家里坚强的人会比较多。

选择苹果不是选择了一个随身听或者是一台机器,而是选择了一种态度和思维方式。遗憾
的是我们总是无法轻易的作出这样的选择,买苹果电脑担心不兼容,买iPod太贵,iPod S
huffle不能收音。和现实生活中的选择一样,我们要有所取舍。我们痛苦于精神层面的理
想要受制于现实外界强加标准,有时候我们无意识的陷入这样一种圈套当中,认为MP3一定
要有收音,认为用计算机的时候一定要点开始菜单,认为人到了一定的年龄就应该结婚??


有一天我终于知道了除了实用应付以外还有学问的道理,决定要献身学术,于是我终于体
会到在一个复杂的社会里面要生存又要有所坚守是多么的困难,我开始理解一个古老而又
年轻的IT企业是为什么在行业里面赢得尊重,而她的命运又可以因为非种族的原因牵动成
千上万人的心。我开始考虑去买一个内置哩电池而没有收音的随身听。

2008年9月12日星期五

今天我生日。。。。

又到生日啦。。。每年的这个时候都要花钱请吃饭了,都要被灌倒了。。。。
来个国际惯例吧。
1.感谢我的父母,感谢他们给予了我生命并含辛茹苦的养育了调皮的我这么多年,感谢他们的宽容和支持,谢谢你们,感谢我的爷爷奶奶,二老很疼我这个大孙子,感谢二老教给我的很出处事的道理,感谢我的小姑姑和小姑爷,小姑姑从我小的时候就对我很严厉,但遗憾的是我当时没有体会出她的苦心,感谢小姑爷对我的疼爱~~嘻嘻!感谢大姑姑和大姑爷,他们从小就很宠着我,从小就相信我一定会成大器,谢谢!感谢我的大哥哥和婶婶,你们谆谆教导我不会忘记。感谢小哥哥和婶婶,小哥哥教给了我很多为人处世的方法和成功的方法,让我少走了很多弯路。
2.感谢我在大学时光里认识的两个特比特别铁的哥们,mouse和疯子。他们在这3年里给了我很多的帮助,感谢他们无论我多困难的时候都一直陪在我身边。
3.感谢tang和yiyi,她们是我感情上的曾经和现在,但无论是曾经和现在都让我知道了什么叫做真爱。
4.感谢公司技术总监老史,他告诉我“发现问题,找出问题,查询资料,解决问题”的工作和学习方法
5.感谢老涂,在老涂身上我学到了学习编程应该怎样做,还有感谢老涂在工作的时候对我的照顾和细心的讲解!
6.感谢小翟和镜子,感谢小寨像姐姐一样的照顾我,感谢镜子在我进公司的第一天给我培训了!
7.感谢老千给我的工作机会和工资,让我知道什么是开发!

感谢所有曾经关心我的和爱我的人,感谢你们。希望你们能否永远快乐幸福!

2008年9月9日星期二

Python 八荣八耻

以动手实践为荣 , 以只看不练为耻;
以打印日志为荣 , 以单步跟踪为耻;
以空格缩进为荣 , 以制表缩进为耻;
以单元测试为荣 , 以人工测试为耻;

以模块复用为荣 , 以复制粘贴为耻;
以多态应用为荣 , 以分支判断为耻;
以Pythonic为荣 , 以冗余拖沓为耻;
以总结分享为荣 , 以跪求其解为耻;



太牛了~~~

2008年9月8日星期一

喜欢上Python

最近喜欢上Python了,太方便了这脚本语言,我喜欢这种简洁的语法形式!而且,python适合做短期开发,方便兼职一些项目!(嘿嘿!绝对不让某些人如愿以偿的。),而且,据介绍Python是用C写的哦!!我最喜欢的C语言哦!
今天很郁闷,和某某闹了点别扭,他把话说直了说死了,ok,奉陪,我david不是过了这个庙就无处容身的人,你也甭跟我说什么大道理,道理再大大不过我现在的主要任务,学习!而且我选在这个时候Python也是因为它是脚本语言,开发周期短,即使我去其他地方兼职也不会耽误我多少时间!我最不喜欢的就是,那么把责任都强调到别人身上的人,我觉得无论是作为一个员工还是一个领导(如果你想成为一个令人尊敬的领导或者受器重的员工的话),首先,出现问题,反省自己有什么地方不足,其次再去在别人身上寻找问题的要点,而不是上来就是你你你你你你不对~~!ok?

Python我给自己一个月的时间,我希望能达到自己的目标。
10月份还有考试啊。。。天啦~~~上帝我两本书都还没看完呢,数据结构这个星期是绝对能看完的而且还能看第二遍了
新thedbeina的钱凑齐了,就等支付宝把钱打到银行卡上了。各位debinaer,我们会呈现一个你想要的社区形象给你们的,相信我!

2008年9月6日星期六

一个程序员的奋斗故事,与君共勉之

这些日子我一直在写一个实时操作系统内核,已有小成了,等写完我会全部公开,希望能够为国内IT的发展尽自己一份微薄的力量。最近看到很多学生朋友和我当年一样没有方向,所以把我的经历写出来与大家共勉,希望能给刚如行的朋友们一点点帮助。

  一转眼我在IT行业学习工作已经七年多了,这期间我做过网页,写过MIS、数据库,应用程序,做过通信软件、硬件驱动、协议栈,到现在做操作系统内核和IC相关开发,这中间走了很多弯路,也吃了不少苦。

  我上的是一个三流的高校,就连同一个城市的人多数都不知道。因为学校不好也就没有指望能靠学校名气找一个好工作。所有的希望都寄托在自己的努力上了,大一开学前的假期我就开始了学习,记得我买的第一本书是《计算机基础DOS3.0》,大家别吓着了,其实当时已经普及了DOS6.22了,只是我在书店里看到了DOS4.0,5.0,6.0的书,以为像英语那样是第四、五、六册,记得当时到处找DOS1.0,现在想想也幸好我没有找到:)开学前我学完了 PASCAL,那时既没有计算机也没有人可以请教,我连程序是什么的概念都没有,只好死记硬背代码,然后拿纸写,我一直到大三才有了一台486,在这之前用纸写了多少程序我也记不清楚了,只知道最长的一个我拿A4大小的草稿纸写了30多页,我的C语言、C++、VC都是在这样的条件下入门的。所以说条件是可以克服的,希望我的经历多少给条件艰苦的同学们一点信心。第一次上机是在我姐夫的机房,我的心情激动的无与伦比,但是一上机我立刻傻了眼,他们用的是英文版的Win3.1,我的那点DOS知识都见了鬼,上机提心吊胆的一阵瞎摸,一不小心把Word弄成了全屏,怎么都还不了原,当时真是心急如焚,我以为机器被我弄坏了。第一个C语言程序,就是那个经典的HelloWorld,我调了几个星期,上机机会非常少,也没有书告诉我开发环境(TC2.0)需要设置,而且开始我都不知道有编译器,我甚至自作聪明把写好的程序扩展名从.c改成.exe,结果可想而知。大一学完了C、X86的汇编、数据结构、C++。由于精力都花在自学上了,大一下四门课挂了彩,三类学校就是这点好,挂上一二十门也照样毕业。不过扯远点说,我那么刻苦都及不了格,可见我们国家的计算机教育有多死板。

  大二准备学VC和BC,当时难以取舍,后来选了VC,不为别的,只为书店里两本书,VC那本便宜6块钱。我的努力在班上无人能及,学的日夜不分,大三有了计算机后更是如此,很多次父亲半夜教训我说我不要命了,我一直觉得自己基础差,记忆又不行,条件也不好,所以觉得只有多花点时间才能赶上别人。居然后来有许多朋友说我有学计算机的天赋,让我哭笑不得。我用的是486,16M内存,1G硬盘,当时同学们的配置都是P166MMX,我安装一个 WindowsNT4.0需要一个通宵,编译一个BC5.0向导生成的程序需要近两个小时,我的显示器是个二手的,辐射非常大,开机屏幕冒火花,看起来很酷的:),有一次程序写的太久,觉得怎么白色的编辑器背景变成了紫色,以为显示器坏了,后来才发现眼睛不行了,不过说来也奇怪,到今天我的视力还能保持 1.5,真是个奇迹。但是就是那台破机器陪伴了我两年,让我学会了VC、Delphi、SQLServer等。后来那台机器给我阿姨打字用,据她说一天她正打的开心,一股青烟夹着火苗从显示器钻出来,之后它才寿终正寝。

  大三假期找了个机会在一个计算机研究所实习,与其说实习不如说是做义工,工作了两个月一分钱没有拿。但是这两个月对我的发展帮助很大,让我早一步了解了社会,刚去的时候我当然是一窍不通,在那里我熟悉了网络,学会了Delphi和Oracle。由于工作很认真,得到了比较好的评价,在一位长者的引荐下,我开始和他们一起做项目,这使我在大三大四就有了自己的收入,大四又找了两家MIS公司兼职,虽然钱不多,但是在学生期间有1000多的收入我已经非常满足了,我终于用自己赚的钱把计算机换了。大四下开始找工作,这时我的工作经验已经比较多(当然现在想想非常幼稚),开始听父母的想去那个研究所,实习过那个部门也希望我能去,但是不知道为什么最后不了了之,这种单位就是比较官僚,我一气之下就到了我兼职的一个公司做MIS的TeamLeader。在大三到毕业一年的时间,做过了各种MIS,从煤气、烟厂、公安、铁路、饮食到高校,什么有钱做什么,工作也很辛苦,经常加班和熬通宵,从跟客户谈需求到设计、编码、测试、交付都要上。那时觉得很有成就感,觉得自己还不错,现在想想真是很肤浅。

  刚走上工作岗位的学生很容易被误导,各种开发工具让人眼花缭乱,同时也觉得很受公司器重,但这样工作永远是一个低层次的开发者。不要跟我说什么系统分析有多么多么重要,多么多么难。你以为自己跟用户谈需求做设计就是系统分析和设计了吗,国内又有几个公司能够做的很到位很规范?我是ISO9000内审员,也在Rational公司受过多次培训,拿了4个证书,还有一个公司让我去做CMM。这些我听过很多,但是很多事情到国内就变了性质,一个公司不是通过了ISO9000或者CMM就能规范了,我现在在一家有几十年历史的外企工作,里面的管理不是一般国内企业能及的。作为一个毕业不久以前没有步入过社会的学生,几乎不可能在很短的时间掌握系统分析和设计,面向对象、UML只是一个工具,关键是人本身的思想,不是说你熟悉了C++、Rose就能够做出好的设计,相反如果你具备了很高的素质,你可以用C写出比别人用C++更加模块化的程序。

  话说远一些,国内软件开发行业有一个怪圈,很多人觉得VC> Delphi> VB,真是很搞笑。这几个软件我都做过开发,说白了他们都是工具,应该根据应用的需要选择采用哪个,而不是觉得哪个上层次。如果你因为用某个开发工具很有面子而选择的话,只能说明你很浅薄。如果说层次,那么这些工具都不上层次,因为它们用来用去都是一些系统的API,微软的朋友不会因为你记住他们多少个 API或者多少个类就会觉得你很了不起,你永远只是他们的客户,他们看重的是你口袋里的银子。我也做过系统内核,我也封装过很多API,同样我也不会看重那些使用这些API做二次开发的客户,除非他能够作出自己独到的设计。

  至于有人认为C++> C那更是让人笑掉大牙,不妨你去打听一下,现在有几个操作系统内核是用C++写的,又有几个实时系统用的是C++,当然我也不是说C++不好,但是目前的内核和实时系统中C++还无法与C匹敌,至于说C++适合做应用系统的开发那是另外一回事。所以我的观点是不在于你用什么工具和语言,而在于你干什么工作。你的设计体现了你的技术层次。

  这样干了一年我觉得非常苦闷,做的大多数都是熟练工种的活,个人技术上没有太多的提高也看不到方向。所以决定离开这个城市去上海,寻求更好的发展,并且打算放弃我以前的MIS转到通信行业。

  写到这里不能不提到我女朋友,我们是在来上海前半年认识的,她大四在我公司实习,公司派她给我写文档,我们的感情发展的很快。她告诉我很多事情,她家原本是改革开放的第一批暴发户,她母亲爱打牌,输掉了几百万,还欠了很多债,她有男朋友,但是她对他没有感情,只因为他给了她母亲两万多块钱,后来还强迫她写了四万块的借条,她男朋友背叛过她并且不止一次打她,现在逼她结婚不然就要她还钱。这人居然还是一个高校的老师!她母亲把父亲给她的学费花了,因为拖欠学费她没有办法拿到毕业证。她母亲现在有病需要钱,我拿出了自己的一点积蓄并且跟朋友们接了一些,替她交了学费并给她母亲看病(后来才知道看病的钱又不知所终,就连她母亲是不是有病我都不知道,但她也是没有办法)。这个时候我家知道了一些事情,坚决反对我和她在一起,她原来的男朋友也极力破坏。无奈之下我们决定早一定离开这个伤心的城市,并且瞒着我们家。由于时间仓促,我只准备了4000块钱,她仅有的几百块钱也被她母亲要去了,我买了三张票,一张是中午的,两张是晚上的,中午我的家人把我送上船,他们一离开我就下了船,我和她乘坐晚上的船离开了这个我和她生活了很多年的城市,带走的只是一身债务。没有来过上海的我们两个性倔强,都不愿意去麻烦同学和朋友。来到上海是傍晚6点半,我们都不知道该去哪里,我们找了一个20块钱的旅馆,这个房间连窗户都没有,7月份的天气酷热难耐,房间里非常闷热。第二天我们开始租房子,因为身上的钱不多,我们基本都是步行,花了一个星期时间,不知道在浦东转了多少圈后找到了一个400块的房子,但是我们都不了解上海是付三压一,还要付半个月的中介费,买了一些锅碗瓢盆后,我们身上只有800块钱了,工作都还没有着落,这 800块钱要支持到我们拿到第一个月工资,为了省钱我们自己做饭,每天买菜只花两块钱,她非常喜欢吃(也可能她在大学经常挨饿的愿意),看到她现在这样省吃俭用我真的很不忍心。她以前的男朋友也没有放过她,经常打电话来骚扰,并且来上海看她,还说了不少恐吓她的话,她过于善良,说他以前毕竟帮助过她,叫我不要与他一般见识。以后的每天在家就是苦等面试通知,原本我想迅速找一家MIS公司解决眼前的困难,但是她坚持让我不要放弃自己的理想,终于功夫不负有心人,我找到了一家通信公司,4000块的工资虽然赶不上MIS公司给我开出的价位,但也够在上海生存。她也找到了工作,第一天上班她哭了,这是她来上海第一次流泪,我心里很难受也很感动。

  由于是全新的行业,我把自己降到了零点,我学的VC、Delphi、数据库派不上用场,摆在我面前的是嵌入式、协议、信令一些我从未接触过的知识。我知道我没有退路,于是拼命的学习,我把自己当做一个应届毕业生一样,一分努力一分收获,半年过去我终于熟悉了工作,并且得到了公司的表彰,薪水也加了一级。后面的日子里我们省吃俭用,把欠朋友的1万多块钱还了,日子终于上了正轨。这时女朋友告诉我她想考研究生,我也很支持,于是她辞职在家备考。

  另外,在这里我要感谢我的ProjectManager,他原来是一个大通信公司的产品经理,对人非常和善,我从他那里学到了很多知识,而且他也给了我许许多多无私的帮助。在工作上他给我充分的空间和信任。记得公司安排我维护一个接入服务器软件,由于代码量不算太小(5万行),资料和文档都不齐全,我维护起来非常吃力,所以想重新把它做一遍,公司领导不太支持,可能觉得工作量太大,但是他极力支持我,私下里他让我放手去做,我的维护工作他挤时间做。在他的支持下,我花了半年时间完成了接入服务器的软件,并且实现了一个相对完整的TCP/IP协议栈。在这里我学会了嵌入式系统设计、驱动开发、TCP /IP和很多通信的知识,我花了一年时间终于使自己从MIS开发转到了通信行业,并且站稳了脚跟。我的开发大量是对硬件的直接操作,不再受微软的操作系统,VC、Delhpi这些开发工具的约束,我终于看到了另外一片天空。

  我做事情喜欢追根问底,随着开发的深入,软件开发与硬件联系越来越紧密,硬件知识的匮乏又对我的发展产生了障碍,而且芯片技术基本上掌握在国外公司的手里,这对做系统级设计是一个非常大的制约,一个新产品出来,第一道利润(也往往是最丰厚的利润)常常都被IC公司如Intel、Motorola赚去了,国内的厂商只能喝点汤。所以我决心解决自己的硬件技术障碍,并打算离开通信行业,进入IC设计相关领域。

  当然我明白如果我对硬件了解的非常少,没有哪家IC公司会仁慈到招我这样一个一窍不通的人来培训。所以我必须努力打好基础,学一些相关知识为以后做准备。就像我开始从MIS转到通信一样,我看过大量通信方面的书,并且给一个ISP做过RADIUS计费分拣台,在这样的背景下这家通信公司才给了我这个机会。我在的通信公司是做系统设计的,有不少PCBLayout硬件人员,平常我就注意向他们学习,由于我做的是软件,在公司看硬件资料不好意思,所以开始只好在家看,刚来上海工作我连续一年都在加班,后来不加了,因为我要挤出时间学习,通常我12点左右睡,第二天5点半起,我上班比较早,地铁上如果人不多我也用来看书。学习当然不会是一帆风顺的,有些实在不懂的问题就积累起来问硬件人员,他们的帮助使我学习进度快了很多,因为在没有人点拨的情况下自学,我的一半时间是花在解决疑难问题上,但这种问题经常是别人的一句话就可以让我豁然开朗,我非常庆幸我有这样的学习环境。在后面的一年里,我学会了看硬件原理图,学会了简单的硬件设计(模拟电路方面还有不小的差距),事情就是这样的,当你安安份份做软件,别人永远认为你是软件开发人员,在你开始学习硬件时别人未必会认同,有位中兴通讯的朋友还对我说过,一个人不可能把所有东西都学完。我也明白这一点,但我希望自己做的更好。但当你熟悉硬件后大家又会觉得你好像原本就是软硬件都懂的,同事们也都习以为常了。这个时候我可以把硬件资料堂堂正正的拿到公司看,没有人再大惊小怪了。让我比较自豪的是我通过自己的努力做了一个IAD(软交换的终端设备)系统方案,包含软硬件的选型、设计等内容,这个方案得到了公司和同事们的认同,让我感到非常欣慰。

  技术是相辅相成的,当我的硬件有了一定的进步后,我的软件设计也有了很大的提高,我可以从更深层次理解问题,我做的接入服务器CPU是 MotorolaPowerPC860,熟悉的朋友都知道860QMC与软件的批量数据传输通常采用BD表的方式,硬件人员做驱动的时候习惯采用固定BD 表,每接收或发送数据都将数据从BD表拷贝到用户Buffer,或从用户Buffer拷贝到BD表,由于理解的比较深入,我自己重新实现了这个过程,采用动态BD表的方式,驱动从一个网口接收数据,提交给我的软件进行三层交换,直至从另外的接口发送出去,没有进行一次拷贝。这样的设计大大提高了性能,使系统的指标接近理论值。软硬件的结合使我的设计水平上了一个台阶。我现在写的这个操作系统,编译后我把程序反编译成汇编,找出其中不优化的代码,然后在C程序中进行调整。举个例子,很多CPU没有专门的乘法指令,这个大家应该都知道,在这种CPU上进行一个乘法操作常常会花费大量的指令周期,有的朋友会说这个我知道,我会尽量避免采用×号,但是事情往往不是那么简单,你知道C语言中数组的下标操作是怎么实现的吗?仔细看看反汇编的代码你就会明白,同样是通过下标的定位操作,C编译器会有时候会产生位移指令,但有时候会用乘法实现,两者效率往往是天壤之别,所以明白这些问题你才能将系统性能提升到极致。这些问题就不多说了,有兴趣的话以后可以共同探讨。

  话说远一点,我由衷的希望在软件上做的比较深入的朋友们有机会学学硬件以及其它相关知识,尤其是做底层开发和嵌入式设计的。这对软件技术的提高有非常大的帮助,否则很多事情你只知道该这样但不会明白为什么该这样。我这个观点在我现在的IC公司ProjectManager那里也得到了验证。他告诉我们公司现在的802.11芯片产品的软件经理原本是做该芯片硬件设计的,某某某原本是做软件的,现在在做IC,类似的例子还有很多,只是在国内这样的风气不是非常流行。

  我有一些心得体会与大家分享,只有当我干好本职工作后,我才会学习与工作关系不大的技术,这样公司的上司才不至于反感,在入门阶段的问题我通常不去问那些资深人士,而是问一些资历比较浅的朋友,比如刚毕业不久的学生,因为他们往往会跟你详细的讲解,而资深人士通常觉得你的问题太简单,所以回答的也很简单,我又不好意思多问。等技术上了一定的层次后我才会问他们,他们也能给你比较深入的回答。另外,有些朋友说我机会比较好,他们也希望能从事新的工作可惜没有机会,我听了只有苦笑,我的机会了解的人都应该知道,我没有出生在什么IT世家:)也没有谁一路提拔我,所有的路都是自己走出来的,我母亲去世比较早,我的后母(我叫她阿姨)看着我努力过来的,一次她看我大年30还在写程序,她说像我这样努力木头都能学出来。

  我的最终目的是IC而不是PCB,所以我下一步的准备开始学习IC设计的知识。公司的同事没有懂IC设计的,后面的路又要靠自己了,我买了不少相关的书,在网上也查了很多的资料,我花了大量的时间去学习VHDL,并且用软件进行了一些简单的设计和仿真(没有设计ASIC,只是针对FPGA),随着学习的深入,我渐渐明白了IC设计的基本流程,同时也明白了这条路的艰辛。这个时候我已经做好了跳槽的准备,我向一家业界又一定知名度的IC设计公司投了简历,并通过了漫长的面试(4个多小时)。其他的一切我都比较满意,唯独薪资差强人意,我也明白原因,因为我是这个行业的新人,我没有经验,我再一次将自己清零了。公司老板问我6000多一个月能不能接受,我知道他也是照章办事。想想我通信行业的朋友们,基本上都是年薪10万以上,月薪过万的也比比皆是,朋友们也帮我介绍了不少待遇不错的公司,我该怎么选择,当时我很犹豫,我热爱我的事业,我向往我的追求,但我也是一个普通的人,我也需要养家糊口,我也想早一点买房买车。生活给我出了一道难题。

  


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


爱因斯坦在63岁时说过“一个人没有在30岁以前达成科学上的最大成就,那他永远都不会有。”这句话给了我很大的压力和震动,我马上就26岁了,离30只有四年时间,我必须抓紧这几年宝贵的时间,努力达到我技术上的最高峰。为了这个理想,为了能离自己的梦更近一些,我选择了这家IC公司,我明白自己的薪资和公司刚进来的硕士研究生相差无几,但为了今后的发展只能忍受,一切又得重新开始。换行业是一个非常痛苦的过程,尤其从一个春风得意的位置换到一个陌生的岗位,感觉象从温暖的被子里钻出来跳进冰水中,让人难以接受。在原来那家通信公司,我是唯一两年时间涨了五次工资的员工,公司和同事都给了我极大的认可,工作上也常常被委以重任。但现在这一切都成了过去,在新的公司我只是一个新人,没有人知道也没有人在意我过去的成绩。我决定重新开始,我把自己看作新毕业的学生,我要用自己的努力得到公司的认可。进入新的行业是非常痛苦的,我告诉自己必须忍受这一切,虽然外面有很多诱惑,但是既然作出了选择我就不允许自己轻易放弃。

  我现在已经在这家新公司上了一个多月的班,开始非常艰难,现在慢慢适应了。第一个月结束时,TeamLeader找我谈话,说我是新进员工中最优秀的一个,我心里很欣慰,这也算对我努力的一个肯定吧。在这里还要感谢我的女朋友,她给了我很大的支持和鼓舞,每次在我动摇的时候她都在鼓励我,让我坚持自己的理想,刚来上海是她让我不要勉强去做MIS,这次也是她让我顶住了月薪过万的诱惑,没有她我可能不会有今天的成绩。

  现在的公司有自己的操作系统,自己的CPU、DSP和其它芯片,在这里我能学到世界上最先进的技术,我们的设计开发不再完全依赖别人的硬件和系统,这让我很开心。我打算等工作步入正轨后,全力学习新的知识,实现我的理想。

 暝诤竺娴牧侥昀镂腋约憾ㄏ铝思父瞿勘辏?nbsp;

  一.努力做好本职工作,在工作上得到公司和同事们的认同;

  二.努力学习IC硬件设计知识,多向同事请教,并利用一切机会多实践;

  三.实现我的实时操作系统的主要部分,完成TCP/IP协议栈模块,并免费发布源代码;

  四.和我女朋友结婚并买一套小房子,这是最重要的,因为我明白事业是可以重来的,但是珍贵的感情很难失而复得。

  在这里提一下我现在开发的操作系统,它是一个实时嵌入式系统,目前支持以下特性:

  a.支持时间片轮转调度和基于优先级调度,最多64个优先级;

  b.抢占式实时内核;

  c.为了便于移植,主体用标准C实现;

  d.汇编代码非常少,不到100行;

  e.支持任务管理,各任务有独立的堆栈;

  f.进程同步和通信目前完成了Semaphore,MessageQueue正在调试;

  g.实现了定时系统调用;

  h.可以在windows上仿真调试

  我还打算下一步实现优先级反转保护,EventFlag,DataPipe,内存管理(以前实现过)、驱动接口等。

  在这之后我还会努力完善它,比如加入文件系统,协议栈、调试接口等。希望朋友们提出自己的意见和建议,在此不胜感激!

  后记:

  就像有的朋友说的,我的经历或许会给一些朋友产生误导,在这里我必须说明一下。我来上海以前学习过于拼命,常常晚上只睡3个多小时,我身高1米71,那时只有108斤(我现在130多),家人也说我这样拼命活不过60岁,但是当时的我太固执,我对他们说只要能实现理想活50岁我就够了。那时的拼命使我的身体受到了影响,有一次早上突然腰肌剧痛难忍,痛的我倒在床上站不起来。虽然我现在已经比较注意,但有时候还会隐隐作痛。后来在女朋友说服了我,来上海以后我不再如此。我经常引用父亲的一句话“身体是革命的本钱”。

  而且我也发现拼命不是办法,我可以熬一两个通宵,最多的一次我连续工作了三天三夜,但是我半个月都没有恢复过来,这样是不是得不偿失?学习工作应该是一个长期的过程,像马拉松而不是百米冲刺。我现在非常注意调整学习和工作的强度,我要保证每天尽量有相对充沛的精力,一些年轻的朋友觉得自己也应该拼命努力,这让我多少有些担心,如果我的故事能让你在学习工作上多一点兴趣,我会感到很开心,但如果误导了某些朋友,让你做一些不值得的付出,我会感到很内疚。

  技术没有贵贱只分,我以前换行业是因为自己的兴趣所致,而不是对哪个行业有什么偏见。我希望我的经历不要给朋友一个错误的导向,觉得我始终向更高的技术发展。其实各行各业做到顶尖都是很困难的。话又说回来虽然技术没有贵贱,但是门槛是有高低的,无论如何,做IC的门槛要比做网页的高,这一点无可否认。国家各种人才都是需要的,但是作为个人奋发向上的想法还是应该有的,努力在自己喜欢的行业上做的更好,而不应该停留在比较肤浅的层次上。

  我是一个自己觉得比较有自知之明的人,或许我最大的优点就是知道自己有很多缺点:)。我的故事中很多的曲折和错误都是由我的缺点造成的,希望大家用审慎的眼光看待我的经历,不要被我的“花言巧语”所迷惑。我学习有些随心所欲,这给我带来了无尽的麻烦,也大大阻碍的我的发展。记得我小时候成绩比较出色,但是后来学习严重偏科,导致我中学成绩一再滑坡,也没有考上什么好的学校,小时候的一个朋友,当时的成绩和我相仿,但是没有我这个缺点,她上了清华,后来在去了美国深造,在一个著名导师手下研究理论科学,这未尝不是一条更好的出路。另外我的学习方法也是在不断改善中的,过去的学习过于讲究数量和时间,那样学习既苦而已效率不高,现在我非常注意学习的效率和技巧,这样才是学习的捷径(当然不是指投机取巧),比如说学一相对陌生的技术,如果有条件,不妨问一问有经验的人,不需要问很多,往往他不经意的几句话会给你非常大的帮助,甚至超过你看一个星期的书。带着这样的思想再去学习你会节省很多时间,这样何乐不为呢?这些年中我学了不少的东西,由于开始非常盲目,所以学的东西杂乱无章,现在回想起来让我啼笑皆非,我把大量的时间浪费在一些没有必要深入了解的知识上,毕竟一个人的精力是有限度的。很多朋友很我一样都背过五笔字形,的确它是一个不错的输入法,但是对一个研发人员它绝对不值得你去背,你的时间应该花在有价值的地方。我这样的事情还做过很多,我背过CCED、WPS的命令和快捷键,在dBase基本退出历史舞台后我还花了很多时间去学习它的使用。所以我的学习在前期缺乏规划,没有明确的短期目的、中期目标,只有一个虚无飘渺的长期的理想。这就像做设计一样,好的设计是从需求抽象到代码有很多过程,而不能得到了需求就立刻开始开始编码。

  当然这么些年的学习和工作多多少少有些收获,下面我说说我的一些学习的心得,这些方法未必正确,我也在不断探索和改进中。我的学习和工作有相对明确的目标,我不会一时心动而去学习某一技术,在下决定之前我会考虑很多,包括长期的发展,个人路线的规划,需要付出的代价、可能遇到的困难及解决的办法等等,在决定后还会制定更加明确的计划,包括短期、中期和长期的,身边可以利用到的资源(包括好的书籍、资料、软硬件环境,也包括有经验的朋友或者师长),以及每一个阶段是怎么过渡到高一阶段的计划,往往在一个学习阶段一旦上路后会走的相对顺利,但是跨阶段通常比较麻烦,比如从学习基础知识转到实践。另外我买书也有自己的方法,现在世面上高质量的书远不如低质量书多,对于一个陌生的技术,往往在第一次买书会选择错误,即使买到一本好书但是它的方向也未必适合你,所以我通常会先在网上查找一些该技术的介绍,有了一点点概念后再去买一本比较薄、相对便宜并且内容相对泛泛而谈的书,这是国内作者最善于写的书:),再把它浏览一遍后我就会基本明白这门技术的要点,后面买书和制定计划就会明确的多。否则一开始就想找本好书往往比较困难,而且买回来后努力学习,有时候学了一半才发现是本低质量的书或者是相对过时技术,让人非常懊恼。另外让有经验的人帮你介绍,通常也是一个不错的选择。

  有些朋友想学通信、嵌入式开发,但总觉得自己没有软硬件环境,我就按我的了解给大家介绍一下怎么建立这样的环境,当然我了解的只是我学习和工作的方向。通信我做的是数据网方面的工作,包括TCP/IP、二三层交换、对接入网、H.323和软交换也有一点认识。这些软硬件环境都是可以在PC上构建的。你甚至可以在一个没有网卡的PC上建立一个包含多个路由器、接入服务器、VoIP网关、网守、主机等的仿真网络环境,而且与实际的网络相当接近,当然这需要你有清晰的网络概念和一定的网络知识,我一直在努力开发一套软件将这个过程简化,目前试验已经做完,我可能会将它融入我的操作系统外围扩展软件中。这样的方法我无法用简单的语句讲的很清楚,我可以说一下大概的思想,就是在PC上实现仿真网卡,(知道Windows怎么在没有网卡的机器实现虚拟网卡技术的朋友都应该会明白),然后每一个仿真网卡对应一个虚拟设备,如路由器或者主机。你也可以借助第三方工具完成部分工作,如VmWare等。我现在就是利用一个仿真网卡做自己的开发的。

  至于嵌入式开发环境更加容易实现,PC就是一个非常大的硬件平台,现有的嵌入式操作系统通常都支持X86,你可以在上面做开发,通过软盘Boot或者使用虚拟机装载,我用VxWorks做了试验,在一台PC上跑Windows和VxWorks两个系统。另外Windows上的兼容DOS的16位仿真 X86环境也为很多操作系统提供了绝佳的试验环境,我的操作系统在Windows上就是这样实现的。Linux在嵌入式中应用也比较广泛,它在网上有大量的资料,而且也相对比较容易实践。同时很多完善的嵌入式开发环境支持软件仿真,如Tornado、WinCE等。

  前段时间处理了很多事情,一直没有写下去,花光了所有的积蓄买了一套房子,同时把户口的事情也基本办完了,这几天稍微缓口气。昨天跟我的一个老上司见面聊了半天,心里感慨万千。他从外在条件看让不少外人羡慕,二十多岁做过到了863项目的负责人,博士毕业的爱人单位也非常好。现在三十出头的他在一个通信公司做产品经理,工资虽然不算高但也有一两万,而且还持有股份。但是我们了解的人才理解他的艰辛。“白领”这个词在一些人看来是仿佛是一个动人的光环,但是在我看来是一个无奈的名字,每天行走在大街上,来来往往的车流中有多少是“白领”的?又有几个“白领”住的起高档的住宅?在上海一套别墅300万不足为奇,按揭贷款下来总额接近600万,年薪二十万在上海算是一个中高级“白领”,高额的税金去掉了你百分之几十的收入后,这样算下来不吃不喝也要四十多年,加上生活的其他开支,注定了你与这样的住宅无缘。看着外面一套套别墅,一辆辆好车,我不知道它们是谁的,但我知道其中没有什么白领。我觉得自己很渺小,在这个喧闹的都市中我如同一只蚂蚁,但我有不甘于平凡,我不愿做一个单纯的“白领”。

  其实很多朋友并不了解我,我不是一个追逐时尚技术的人,我只是不愿意做一个所谓的“白领”,更加不愿意做一个单纯的“程序员”。我不甘愿平凡的生活一辈子。我在不断的努力,我的方向非常明确,我要做多数人不做和做不到的事情,很多朋友对我这样频繁的换方向不理解,觉得一个人只要熟悉一种技术就可以了,对于这样的看法我只能说你浅薄,现在的大的系统和产品往往都是软件、硬件和应用相结合的,我要做的不是哪个方面的专家,而是希望能够成为系统设计师。我不相信一个只精通发动机的专家能够设计一辆好车,同样我也不相信对硬件一窍不通的人能做出一个操作系统,或者一个对财会没有一点概念的人能设计出一个优秀的财务软件。在工作中我发现社会上非常缺乏边缘人才,尤其是在国内。在国外一个人软硬件兼修非常普遍。如果设计产品的人只了解他的专业那么是很难有出色的设计。所以我必须趁着自己年轻学的更加广泛一些,这样才能提高自己的综合素质,这也是为什么高校那么多非专业课程。学习工作了这些年,实际上都没有脱离IT 这个行业,我现在的公司开发一个系统时,先是将最终功能列举清楚并分析可行性,然后划分哪些是用芯片实现,哪些是用硬件电路实现,哪些是用软件实现,这样的设计才能做出最好的系统。如果一个设计者单纯只懂一个方面是不可能做到这一点的。

  自负常常伴随着无知,记得我大学毕业时,论文答辩会上我和专家组组长争起来了,因为我对自己的设计非常得意,而他虽然是鸡蛋里挑骨头,但是由于知识非常有限,我无法回答他的问题,所以有些“恼羞成怒”。我原来一直喜欢用“所谓”最好的开发工具,记得做过一个愚蠢的设计,一个排课表的软件我用 VC+Oracle开发。这些经历我牢记在心,时刻提醒自己学会谦虚。我的亲身经历加上我对一些身边朋友的观察发现这样一个现象。当一个人只会他认为最好的技术,而对其他的一无所知,这样的人经常是目空一切。

  从第一个“HelloWorld”到今天的操作系统,前前后后写了很多代码,从这中间我也积累了很多心得。由于我是在没有人指导的情况下自学编码的,所以走了很多弯路,也犯了不少错误。最初我写程序全凭自己的感觉,写一个新程序对结构设计不很重视,以为学好语言,数据结构就可以写出好的程序,其实远不是这样的。没有设计的情况下,也可以写,但是程序无法写的很大、很复杂。我个人的经验是这样的系统超过8000行我就无法控制了,以前我用VC写过一个 Windows下的应用程序,大概8000行左右我对它失去了控制,整个代码一团糟,这8000行倒是可以相对稳定的运行,但是我没有能力再增加什么新的代码,动辄前后冲突,要么就是新代码与旧设计格格不入,需要调整旧的程序。最开始我写程序喜欢追求代码的精巧,别人很多行写出来的代码自己只写很少就可以实现,感觉那样比较酷。其实这样也是非常错误的,我现在写程序非常注重结构设计,为了结构清晰我愿意牺牲一点效率。

  下面一段话是我写程序的座右铭,希望与大家共勉:

  Makeitrightbeforeyoumakeitfaster.

  Keepitrightwhenyoumakeitfaster.

  Makeitclearbeforeyoumakeitfaster.

  Donotsacrificeclarityforsmallgainsinefficiency.

  BrianKernighan

  另外补充一点:我和我的女朋友现在非常好,双方的家人都认可了,我们决定在近期结婚。


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

这篇文章出自何处。我搜了很多,都是转载。都不知道原作者是谁??????????????????


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


怎么这么眼熟啊

在哪里见过呢


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


最讨厌就是还没做出来的东西就先废话一大堆.先为自己立传云云,来满足自己的虚荣心.真正的牛人只拿产品先说
话.归根到底还是浮躁啊.


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


楼主应该把转贴说明放在前面而不是后面。说实话我也找了这个原帖的地址很久。


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


好长,收藏了慢慢看


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


问题是,我最早看到这个帖子是6年前,为什么6年了还一直只有小成呢?



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


。。。。。。。。



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


很早就看过,不知道原贴的作者现今何处……

也许早就成名了,但是他却忘了自己的这篇文章,有这个可能


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


多年前的帖子 我估计作者限制极牛!!!

程序员修炼

程序就是一系列按步骤进行的操作序列,它有好多种级别,比如最低级的微程序、次低级的汇编程序、高级的各种编程语言程序、最高级的脚本语言程序,也许我列的不对,但没关系,我要说的是不管是那个级别的程序,其本质都是操作的逻辑序列。大多数系统和应用程序都是建立在高级编程语言上的,比如C、 C++、C#、FORTRAN、BISIC、JAVA等等,就让我们只关注这一级的编程能力吧。因此如果一个程序员的逻辑能力不高,他永远都不能成为一名具有合格职业水准的程序员,我们在下面的讨论有关编程能力的方方面面,最终都是为了最大程度地提高和实现一名程序员的逻辑能力。

一、掌握基础知识:十六年寒窗的持续积累

从7岁读小学起,经过16年的学习,你从软件专业本科毕业后,必须完成以下几门专业课程的学习:计算机组成、操作系统原理、汇编语言、数据结构、编译原理、数据库原理、软件工程、结构性设计语言(PASCAL、C)、面向对象设计语言(C++、C#)、计算机网络等,你最好还懂一些算法分析、分布式系统、计算机图形学、形式逻辑、人工智能原理、软件设计模式、软件构架/框架等研究生的课程,16年来,你积累的除了知识,更重要的是形成最适合自己的学习方法和工作方法。这些是你具备程序员职业水准的基础能力,不要受什么计算机软件怪杰之类传奇的影响,那不过是小概率事件,而且这些怪杰们就算没有读过软件本科和研究生,也往往自学了大多数专业课程,很可能比在校学习的学生对这些课程的精髓部分理解的更好,还有他们的工作方法和思维方式是特别而高效的,但普遍性差,可以借鉴,不宜模仿。好,所以现在你只需要问问自己,那些课程和知识都学会并掌握了吗?如果是,那就准备好进行实践了。

二、在实践中提高:成为一名高水平的Coder

好了,你毕业了,在校功课都不错,也找了一个专业对口的工作,你想大展鸿图了,可是别急,你的翅膀还不够硬,不信我们说来看看。

通常,你在工作中都会用到某一种单位/公司固定的操作系统和编程语言开发环境,比如Windows、UNIX、LINUX等操作系统,又比如用 VC、VB、PB、Delph、JAVA、Motif/XWindow、QT、OpenGL、OpenInventor等编程语言和开发环境,我们在后面把它们合称为开发环境。就在校学习的有关开发环境的知识而言,大概你距工作需要的差距是不小的,当某个操作系统和编程语言环境成为你的饭碗时,就不应也不能用通过课程/认证考试之类的眼光和要求来评价你的能力,即使你能考100分。你需要深入地学习该操作系统和编程语言环境的各类开发手册的所有内容,你会说大多数你都用不上,其实你既对又不对,对的是单从使用的角度而言,你确实用不上开发手册的大多数内容,比如庞大的VC开发类库和复杂的开发环境,你在实际工作中能用到的不到总数的1/10或1/5,不对的地方在于,你用到的部分不是孤立存在的,它们是整个体系中的一部分,只有对整个体系有了一个较完整的了解,才能得心应手、随心所欲地用好你用到的部分,你才算初步具备在这种开发环境下进行Coding的职业水准(还远不够程序员的职业水准呢),而这只是刚开始。如何才能真正掌握一种开发环境的全面的知识呢,最原始的办法就是读开发指南/教程、参考手册,一般来讲,学习开发指南/教程时,你如果是一个认真的人,都会完成5/10~7/10左右内容的学习和练习,如果你想成为职业选手,就应该完成9/10以上内容的学习和练习。参考手册不同,大多数所谓的“ 程序员”们只是用到了才翻翻,这差的太远了,你应该象读开发指南/教程一样,每个环节都要读,比如VC,参考手册中的每个类,类的每个函数,都要读上几遍,它们往往是一小伙一小伙地纠缠在一起使用的,开始时读得你毫无头绪、心烦意乱,不要紧,还有一手呢,如果你开发环境安装的全面,它们往往都有开发商做的demo例子可看,你就进入另一个境界了,开始时你关注demo中的具体技术,后来你发现这些demo的程序写的都还算不错,结构简单但合理,如果你真的用心,就一定能发现一些个别的demo是极品,它所展现的程序逻辑结构是你设计不出来的,你现在有点更关心它的程序设计构架,甚于对你原始目的(某种相关的技术/技巧)的关注,这时的你,开始了从一名Coder向一名Programmer的转变,你会忍不住要看看开发商提供的源程序,比如.h 和.cpp,通常你会找到include路径下所有的.h程序,你才知道,哇!好多好多东东在参考手册中都没提到,你要学的太多了,没时间顾及其它的业余爱好了,现在知道为什么程序员是年轻人的职业了吧,你要有足够多的时间才行,即使你的智商有160。如果你走到这一步,在你工作的团队中,已经是经常有人向你请教技术问题,经常有人请求你帮忙debug,你已是公认的“高手”了,别得意,因为你仍然是个Coder,为什么这么说呢,你想想,你已深入了解了这个开发环境中的各种技能,知道一名Coder如何用好这些东西,可是你能设计的出提供给Coder们用的东西吗?唔……,你想了想,可能还不太行。对了,就是这样,你还是一名小我境界的程序员呢,本质是个Coder,当然已是一名高水平的Coder了,然而你需要进一步登堂入室才能成为一名真正的程序员。

让我们继续吧,通常你都是从精通一种编程环境开始的,假设你已经较为精通在Windows下用VC开发软件了,这时在技术和技巧方面你将面临一小一大两个挑战,第一个小挑战是如果公司/单位改换了开发环境,比如用LINUX下的QT交互语言工具进行开发,你不过是把前面掌握VC的过程再来一遍,由于在主观上经历了VC工具的学习过程,在客观上各种开发环境都有太多相似的方面,这回你掌握的应该较快。要小心,在这时第一次诱惑之门打开了,因为你感觉良好,看!这回这么快,我就这么好地掌握了新的开发环境,你开始关注其它暂时还用不到的同类环境,比如VB、Delph、JAVA,如饥似渴地掌握各种开发工具,证明自己的学习能力和价值,但你忘了一点,你仍然是个Coder,只不过是一个在好多开发环境下都能编程的Coder,就像你生活在中国,因而精通了汉语,工作需要你又掌握了英语,然后你就来了劲,把俄语、日语、阿拉伯语、拉丁语,等等等等,都学习个遍,我只能说,有点BT。你忘了自己是个职业人,同一类的东西工作中用得到才需学习,太多太多的Coder们喜欢在一起比较和炫耀自己会掌握了几种开发工具,不信你看看招聘时的求职书就知道了,sigh!他们中绝大多数人永远都只能停留在这个层次上,心浮气躁,一生都再也当不成真正的程序员了。总结一下,其实你在这时需要的是对自己掌握新开发环境的能力的自信,而不是一遍遍地重复来证明自己。第二个大挑战就是你明白了只掌握VC是不够的,你发现自己有点浅薄,有很多东东你会用但你不太懂,很多方面支持VC编程的知识你都没掌握,比如操作系统的源码、网络协议知识、Windows 的注册表、进程和线程的基础知识、硬件驱动方面的知识、ActiveX、Windows 庞大的 API,又是一个等等等等,这些基础知识的学习和掌握可是要花费大量时间的,你再一次深切地感到时间太不够用了,因为这时的你大概有许多俗务缠身了,所以有点沮丧,还不用提IT业每天不知有多少新东西在发布,KAO,永远都跟不上,越拉越远了。哎!别气馁,振作一点,你还是忘记了自己是个职业人,既然好多东东在工作中你永远都没机会用,那么干嘛要学呢?用什么才学什么,最多预测到马上要用什么,先一步学什么好了,要知道没有人是真正的、无所不精的全科大夫,除非你是神,但如果你还在耐着性子看这篇文章,你肯定是个人嘛。

OK,一般工作后三五年,你经历了上述过程,经受了诱惑和考验,终于明白了一个道理:你要的是强劲的学习知识的能力,是对某种软件知识/技能的有深度的精通,一种摸到它的根的深度,而不是已掌握的技能的种类和数量。这时无论谁用他掌握了多少种你不会的技能来吓唬你都没用,你对他的层次只有蔑视。通过几年的学习和工作,要记住最重要的一点,永远最重要:对自己学习IT知识能力的自信,一个程序员一生都要不停地进行高强度的学习,用心问问自己,有没有这个自信?别用虚荣心来骗自己哦,如果没有的话,那就不必花费你宝贵的时间向下看了,作者在此感谢你有耐心看到这里,现在建议你关闭这篇文章,趁着年轻,当机立断转行吧!

三、注重逻辑:成为一名职业程序员

好,再前进一点点,你就要成为一名职业程序员了,让我们继续来完成这个任务吧!我们在前一节提到过,“你发现一些个别的demo是极品,它所展现的程序逻辑结构是你设计不出来的,你现在有点更关心它的程序设计构架,甚于对你原始目的(某种相关的技术/技巧)的关注”,其实你是在关注这个demo程序作者的思维逻辑,所有程序的本质就是逻辑。技术你已经较好地掌握了,但只有完成逻辑能力的提高,你才能成为一名职业程序员。打一个比方吧,你会十八般武艺,刀枪棍棒都很精通,但就是力气不够,所以永远都上不了战场,这个力气对程序员而言就是逻辑能力(其本质是一个人的数学修养,注意,不是数学知识)。逻辑能力也是逐步提高的,开始时你一定是用直观的逻辑能力来编程的,怎么想就怎么编,不对就再改,在改进中提高自己的逻辑能力,从直观逻辑能力提高到抽象逻辑能力,这是很正常的。提前说一句吧,到达逻辑能力的至高境界,其表现是用数学语言来描述问题和问题的解决办法,高度抽象!好,说回来吧,你要提高逻辑能力,最快的办法就是读别人写的结构优秀的程序。优秀的代码是百读不厌的(这句话是我抄来的),暂时放放对其中某种技术和技巧的关注吧,你要推导和学习的是这些好程序的逻辑结构,它们是被精心设计出来的。你可以先捂住这个demo程序,自己设计一个功能相同的程序结构,然后比较一下demo的程序结构,如果差距较大,那你就不应简单地改进一下,而是要把demo作者设计的过程在心里复原一遍,做到这一点也许有点困难,但这种事干的多了,你就会越干越快,越来越得心应手,你的逻辑能力飞速提升,你能看得上的逻辑结构优秀的程序开始不多了,下一步就是练习。从工作中开始吧,如果你有空闲,你需要做至少两类练习,一类是算法练习,所有的经典算法都是经典的逻辑,题目有的是,像个好学生一样吧,每年的国内国际编程竞赛都有逻辑要求非常高的题,你可以只选一两道难题来做做。当你可以把复杂的单递归程序(只有A调A)变成非递归程序时,已经不错了,如果你能看得懂双递归程序(A调A、A调B、B调A、B调B都有),我为你鼓掌!你不必往下看了,我有点不好意思啦――班门弄斧,你快滚蛋吧!另一类是把以前和当前你工作中你不满意的程序推倒重新设计一遍,这非常重要,省时省力,因为你熟悉需求,技术上也没问题,目的就是改进程序的逻辑结构,很划算哦,唯一要克服的就是:你对推翻以前工作中那点小小成就的心理障碍,如果你真想优秀,说句粗话:这点心理障碍算个屁,一遍遍反复地推倒已有的成果只能使自己快速进步,放手干吧,没什么好可惜的,马恩早就在《共.产.党宣言》里说过了:在这个过程中,你失去的只有锁链(禁锢你思想的锁链)。

让我们来总结一下,经过自我否定后,再生的你尽管对过去的“业绩”还有一些眷恋,但已是一个初步具备职业水准的程序员了,掌握了相应的技术和技巧,具备了较高的抽象逻辑思维能力,最主要的特征是:能自觉地自我否定,不断地追求更高水平的逻辑能力。

在这个过程中,如果你能注意以下一些小的方面,你前进的步伐也许会快一些。

l 从编译原理的角度来理解你工作中使用的高级语言,如果你做到这一点,至少有两个好处,第一个好处是避免一大堆低水平重复出现的编译错误。一名优秀的 Coder平均在一个工作日中应该完成200行以上的源码,其编译错误应该控制在5个以下,要知道这200行源码不是一次完成的,所以大多数情况下你都要追求一次编译通过,而一名职业水准的程序员,应该进一步做到即使用purify这类的工具来检查源码,也不会存在严重的内存泄露。第二个好处是可以提高源码的可读性和效率。规范地编写你的代码使你自己的逻辑清晰,因为你明白多加几个括号和空行、多换行对齐、多注释,编译器是会自动识别的,不影响程序执行的效率,反过来,控制好递归调用和循环内的if语句才是提高程序效率的关键,要全力避免递归,但要深刻理解递归,能通过自己建立堆栈来把递归程序转换成非递归程序,要求还是较高的哦!

l 避免思维陷阱,只要你是人就一定有自己的思维惯性,这一定又会表现在你的程序逻辑中,有时你就是从这个惯性中跳不出来(谁都有这个时候),但要心里有数才行,所以你需要帮助,如果你有几个水平相若或更高的职业伙伴,太好了,当遇到花30分钟还打不下的bug时,就别浪费时间了,找他们吧,最要紧的是能思路清晰明确地表述你的问题,通常你自己在这个过程中或者伙伴中就有人把问题解决了,又快又好。另外,有几个可以良性竞争的职业伙伴是人生的一件幸事,1+1>2,大家各有所长,你最好做到及时公开你的成果,技不压身嘛,IT发展的这么快,你再优秀,那点东东也没有什么值得隐藏的,所以你可以技术或水平不够高,但千万不可以让真正具有职业水准的选手鄙视你的职业品质和行为。

l 有自己debug的特点,下面的说法作者不敢太肯定,只是经验之谈。即使在VC这种高度完善的开放环境下,你仍然应该要求自己仅凭打印语句就能 debug。这也有两点好处,第一个好处是,遇到bug你会认真想问题所在,而不是用debug工具一步步简单地追踪卡在哪儿了,你定位bug范围的方式是从大到小、从粗到精,这是一种自顶向下的思维方式,而用工具追踪,容易形成自底向上的思维方式,这不算好,你应该先看到森林,再看到树木。我反复提及:程序就是逻辑过程,大多数程序从main函数开始,是由数据结构和功能子程序组成的一个树形结构的逻辑过程(要认清即使是面向对象的程序语言也是一样的),它的执行过程是深度优先的,但你定位bug应该是广度优先的,好好想想这一点,嗯?第二个好处是强迫你思考并记住而不是用工具看到调用过程,你大脑的抽象逻辑思维能力和胳膊上肌肉的力量一样,都是练出来的,如果你的bug是程序结构上的逻辑错误引起的,这一点就非常重要了,顺便说一句,最难打的 bug就是程序逻辑结构错误导致的bug。你要是真正明明白白地认识到这儿了,那我就没什么东西可以告诉你了。总之,程序员的职业水准:生产效率和程序质量,主要是取决于源码中bug的数量和debug的速度,而不是取决于编写源码的速度。给你一个我自己定义的考查一个职业程序员的指标:一个合格水准的职业程序员,编程的时间如果算一份的话,其累计debug的时间不能超过一份,真正职业高手累计debug的时间应该控制在0.5份以下,如何?你关上门悄悄问问自己,你花费在编程和debug上的时间比例是多少?如果你把程序员作为自己一生的职业,那么就永远都要牢记一点:追求做一个0 bug的优秀程序员!这是任何一个想成为职业程序员的人的理想,请相信:坚忍不拔地追求实现这个理想将让你出类拔萃!

l 做好程序的单元测试,这是另一项考查你是否是一名具有合格职业水准的程序员的一个必要指标。其实在你拿到需求的时候就要准备单元测试用例了,并且这些用例将直接影响你的详细设计(有关软件设计本来是该放在第四节讲的)。我们还是打比方吧,当你拿到一个需求时,除了分析它静态的功能外,还应明确它动态的操作 /执行过程,把这个动态过程明确地用流程图画出来,比如分为A~Z的26步,其中A又可以进一步分解为A1~A5的5步,直到不能再分解为止。又比如说 A3步不可分解了,那么你应该把A3步的正常操作和所有五花八门的异常操作都列出来,确保正常的操作肯定正确,异常的操作起码程序不退出才行。这样你就要写好多好多的测试用例,说句老实话,我也从来不写!但我一般会列一个提纲,比如A3步有正常的操作a、b、c、d、e共5项,异常的操作有f、g、h、 i、j、k、l、m、n共9项,你在进行单元测试时都应该跑一遍,这样的程序都还不敢说质量如何好,但起码可以说较稳定吧!如果要想在进行单元测试时干得快、效率高,那么在进行详细设计时,你就应该把A3步中对所有正常操作和异常操作的判断都设计好,在编程实现A3步时,使得程序的结构合理高效,对不对?所以,如果你在工作中是割裂地看待软件工程中从需求、分析、设计、编程、测试等各个环节,恐怕水平很有限喔!但如果你在分析需求时就能看到测试的问题,并改进设计和实现,为此做好相应的准备工作,嘿嘿,整个软件开发过程你的效率会高很多,通常你在一个开发团队中就会高度自信的,你已越过当一名偏颇、露骨的高手的境界,成为一个平静的高手,这可是The best in the best!,用周星星的话说:是高手之高高手,因为别人看不出你高在哪儿,没见你有什么高招或特拚命干,但反正你就是干得又快又好、又省力。关于进行单元测试还有很多复杂的方法,在此本文只提到了最基本的一点,目的是让你在工作上考虑周全、安排有序,其它的自己琢磨吧,没有人能替你吃饱饭!

l 如果你是用C++编程,我再简单谈谈有关内层释放的一个小技巧,就是对所有你编写的类,在构造和析构函数中加打印语句,统计每个类在运行程序时构造和析构的地方,如果是配对的,那么起码没有对象类一级的内层在程序运行结束时没有释放,然后你就可以把打印语句删掉了,招数虽土,但管用!

l 还有其它一些好习惯,在这里我随笔写一些,你要是有不同看法也请一笑过之吧。编程时应该对齐缩进,一个缩进用一个tab键,一般是4个空格,严格遵守开发团队的编程规范也是非常重要的。一个子程序不应超过30行(不算空行),其内多重循环不应超过3层,否则都应该分裂成两个子程序,个别算法程序可以长一些,但也不宜超过200行。通常一个类的所有成员函数总和不宜超过1500行,多了就应该考虑分解成两个类(这个工作最好在设计时就完成)。每完成一小段程序,比如15~30行,就立即编译运行,不要假装高手,先敲它一大堆程序,再编译运行,妄想一次成功,体验一种假爽的、虚荣的快感,或炫耀给别人看,这么做只能证明自己是一个不折不扣的傻瓜,装酷而已。因为只要有一次不成功,你就会花费大量的时间来调程序,别人的进度在这时就远远地超过你了,平常心是道,还是修炼真功夫吧!孙子兵法里关于这一点有明确的阐述,我就不引用了,但建议你真的不要这么干,除非你确实就是这样总是一次就成功的天才,那你还看这篇文章干什么呢?我又不是写给你们这些天才们看的。再就是有学会买好书、读好书,关于计算机和软件方面的书太多了,时间有限,比如有一个叫侯捷的家伙,几乎写的每本书都不错,张国峰的C++编程也不错,这只是我的个人意见啊,好书多着呢,列出来比这篇文章长好多倍,我就不多说了。还有一招,要是你运气好,能搞到一些著名软件系统的源码,好好读读吧,在此我只能告诉你,Linux操作系统的一些源码不错,是开放的,你可以合法地搞到,其它的不要说是我建议你侵犯知识版权啊!

四、天生神力:成为系统分析员

本来就论述如何成为一名职业程序员而言,本文已基本完成任务了,但《菜根谭》有言:竭世机枢,似一滴投于巨壑,穷诸玄辩,若一毫置于太虚。既已乘兴到此,何妨多置一毫于太虚呢,作者不才,干脆尽兴写算了。

你要是运气好,直接进入了一个严格规范生产的软件企业就业,刚开始就应该是按别人做好的软件设计来实现编程,你可以有机会直接学习软件设计,当你积累的足够多了,能够对其中的一些设计提出好的改进建议,而且干得又快又好,就会渐渐地展露头角,我相信你终有一天成为一名软件设计人员(注意,不是软件产品设计人员),步入系统分析员的行列,但这还需其它的一些条件和自我修炼。如果你在一个不规范的软件企业工作,那也不错,你很可能直接就有机会进行软件设计,然后开发、测试,甚至还不得不自己定义需求,把软件开发过程的各个环节走一个遍,当然这样对你的要求更高,而且你也不容易得到及时有益的指点,在正态分布的情况下,你应该是成长的很慢。但不管就业的单位如何,如果你决心要成为顶尖软件职业选手,通常什么客观困难都阻挡不了你,然而你个人的因素可能会阻止你的前进。下面提出的观点纯属一己之见,伤人自尊之处作者在此提前道歉,并建议你除非对本文有强烈的兴趣,否则就请直接看第五节或放下别看了。丑话已说在前头了,在各种软件开发组织的发展过程中的事实也证明,只有少数程序员能成为系统分析员,我想这一点不是我杜撰的吧,因此你要是在看接下来的部分时感到气愤难当,那也实在没着,纯属活该,因为作者只是在说明自己的观点而已,你最多可以呲之以鼻,表示一下你的轻蔑好了,但没有任何理由可以骂人!

作者自己没有到微软面试过,但身处软件行业,关于微软的许多东东当然还是有耳闻的,据说微软招聘一名程序员要过五个已经成为微软程序员的面试关,而且是一票否决制,又据说大多数面试题并非编程,而是一些有关逻辑和智力的题,作者私下也做过许多流传的微软面试题,并对此做法深以为然。程序的本质就是逻辑,所以几十年前就有人提出编程是一门艺术,而艺术是要靠天份的,这一点少有人反对。一个人的逻辑能力可以不断提高,但其能到达的终极逻辑能力的层次必定为其天生智力所限制,这一点就让人不易接受了。好笑啊!人们可以公开承认自己没有某种或全部的艺术天份,但要说自己逻辑天份不够,换句话说承认自己笨、 IQ不够高,往往是要怒发冲冠的,其实这又有什么区别呢?话都说到这儿了,再次建议你如果不够自信,就跳过这一节吧,直接看第五节,好吗?

好了,把话题说回来,你已经成为一门合格的职业程序员了,如果要想成为从事软件系统设计的职业系统分析员,第一件事就是悄悄找一个标准智商测试的网站或其它渠道,严格认真的测一测自己的智商,如果IQ低于130 (正常智商是110),就请别费劲了,打消掉成为系统分析员的念头吧!好!好!先请你冷静一下,好好想想,其实微软面试时就是在测你的智商和逻辑数学素质呢,这就是本节的标题为“天生神力”的原因,因为设计就是从无到有地进行创造,无论是软件还是其它行业都一样,可以有借鉴的,没有现成的,设计就是创造!如果你IQ在130以上,又决心要当一名职业软件系统分析员,其实你不过是要准备好吃更大的苦而已,有什么好虚荣的呢?

修炼还是从基本功开始的,过程和成为一名职业程序员差不多。必须使用设计工具这一点是不用多说的。在工作中,你基本上遇到的是两类方式的设计,一个是结构化设计,另一个是面向对象设计,就个人经验而言,面向对象的设计更好。如果你工作中不得不采用结构化的设计,你必须熟练地掌握数据流图和控制流图的分析和设计,一般来讲,如果你把一个软件中用到的数据模型设计好了,针对功能化的流程,不难设计出数据流图,但下一步设计控制流图才是挑战,如果你按照需求走不通设计好的控制流图,那么你或别人在按照这个设计编程实现时,必定也走不通,没有奇迹会发生,还是在设计阶段严格要求吧,又有一点需要牢记:返工是最慢的。当你在进行控制流图的设计时,也不要妄想得到需求人员提供给你明确的指点,通常他们要是能够把需求的功能和操作次序写完整的话,你应该就感恩戴德了,从需求中整理出功能、操作的拓扑次序和条件是你作为系统分析员的职责。看看,要是没有一点图论的基础和拓扑学的入门知识,你是当不好一个职业系统分析员的,即使你天赋不错,必要的数学和逻辑素质仍然不可或缺。也不用气馁,永远没有最好的设计,只有更好的设计,反复地进行设计迭代,勇于推翻旧的设计,你将快速进步。如果你在工作中是采用面向对象进行设计的,那就更有利了,有关面向对象设计的书太多了,不用作者在此多费口舌,建议精读一本经典的书,比如北大邵维忠等编译的《面向对象的分析》,有些方法和技巧可能过时,但其逻辑的基本原理是非常正确的,其本质是,你在逻辑上是如何认识这个世界的,你就是如何设计软件体系结构的,然后读读其它书,触类旁通,自己创造机会多实践,成功自然会到来的,总之,不管是结构化设计还是面向对象设计,评价一下自己的软件系统设计方案吧,有好多指标呢,比如是否均匀和平衡?局部独立性强不强?有没有歧异的结构?有没有层次太多或太少?有没有某个层次太大、太广?是不是逻辑结构先复杂了再化简的?还是只会设计简单的,复杂不起来(这一点是笨哦,如果出现多次,请你不要意气用事,转行吧)?最重要的一点,是否容易理解、实现和改进?你自己会得出评价的。如果有机会看到别人的设计,一定不要错过学习的机会,自己推导一遍,认真比较比较,获益会较多。

走到这一步,你就应该关注设计模式了,首先还是学习,这方面的好书有的是,但一般在工作中用到的设计模式较为单一,应该多尝试一下其它的设计模式。其次必须要明白设计模式不是设计思路,也不能代替设计思路,比方你要从A到B修一条路,设计模式只是让你选择,是修水泥的还是柏油的?是高架路还是普通的,但线路必须你自己定,而线路就是设计思路,模式对思路是有影响,但不能代替,所以如果你的智商高达250,我相信你直接用汇编语言也能写出面向对象的程序来。第三在此有一个陷阱,很多系统分析员生搬硬套设计模式,全然不懂如何融会贯通,在你的一项具体工作中,往往是以一种设计模式为主,其它模式为辅的,思维不拘泥于形式才是关键,而且也为你到达更高的软件设计的境界做好准备。

唉!都不知该怎么向下写好了,因为已达到作者水平的极限了,我胡乱说一点,你凑合看吧。软件设计最终的层次是:以无法为有法、以无限为有限,这句话是李小龙说的,不是我说的。再拾人牙慧一把,类比一个故事吧,金大侠在《倚天屠龙记》里讲到张无忌初学太极,学会的标志是把刚学的招数全忘了,记住的是太极的道理和精神,和李小龙有些相似喔,软件设计也一样,忘记所有的设计模式,随心所欲进行设计才是至高境界,所以你能到达多高的软件设计的境界最终将取决于你的哲学素质,这一点实在是不好写啊,你自己领悟吧!作者只有祝福了!

五、职业人的终极目标:全面修炼,成为Leader

这一节更不好写,涉及到太多其它非技术方面的因素,特别是个人人生观和世界观的修炼,如果本帖的点击率超过作者私下期望的一个数值,那我就争取尽力厚着脸皮再补上吧。我只说一句,虽然大家都知道软件开发是一个团队性的工作,但追求参与一个大型软件系统的成功开发,是一名软件人员的本能,就像拿破仑说的不想当元帅的士兵不是好士兵,所以不追求实现大系统的软件人员,也不是一个好的职业软件人员,但你只有成为Leader,领导一个优秀的软件开发团队,才有机会实现这个终极职业目标,对不对?

debian学习笔记--添加windows字体

但是有时看到的文字还是乱码,感觉debian的字体太少了,就想添加字体,想想还是windows的字体比较多,所以现在开始添加windows字体。方法如下:
1、挂载windows系统盘。
[root@localhost ~]# fdisk -l
Disk /dev/sda: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sda1 * 1 1913 15366141 c W95 FAT32 (LBA)
/dev/sda2 1914 9729 62782020 f W95 Ext'd (LBA)
/dev/sda5 1914 2551 5124703+ b W95 FAT32
/dev/sda6 2552 2678 1020096 82 Linux swap / Solaris
/dev/sda7 2679 3570 7164958+ 83 Linux
/dev/sda8 7014 9729 21816238+ b W95 FAT32
/dev/sda9 3571 5100 12289693+ 83 Linux

Partition table entries are not in disk order

以上是我的硬盘分区情况,windows盘为/dev/sda1
在键入如下命令:
[root@localhost ~]# mount /dev/sda1 /mnt/c

2、拷贝windows字体文件到debian系统
windows字体位置:c:\windows\Fonts,把该文件夹拷贝到debian系统的 /use/share/fonts/下,并且重命名为msfonts

3、修改xf86config-4文件
vi /etc/x11/xf86config-4
大家会看见关于字体的字段,内容如下:
Section "Files"
FontPath "unix/:7100" # local font server
# if the local font server has problems, we can fall back on these
FontPath "/usr/lib/X11/fonts/misc"
FontPath "/usr/lib/X11/fonts/cyrillic"
FontPath "/usr/lib/X11/fonts/100dpi/:unscaled"
FontPath "/usr/lib/X11/fonts/75dpi/:unscaled"
FontPath "/usr/lib/X11/fonts/Type1"
FontPath "/usr/lib/X11/fonts/CID"
FontPath "/usr/lib/X11/fonts/Speedo"
FontPath "/usr/lib/X11/fonts/100dpi"
FontPath "/usr/lib/X11/fonts/75dpi"
EndSection
把FontPath "unix/:7100" 这一行 注释掉(加#),
在另起一行添加如下内容:
FontPath "/usr/share/fonts/msfonts"

4、重新启动x,添加完成。

我用了配什么问题,大家可以试一试,有问题大家在讨论讨论。

男人和女人的经典误会

下班了,一身轻松地回到家里,本来想彻底地放松一下,可是,一不小心的一句话,却惹得对方不高兴起来,甚至两人为此大动干戈,都说男人来自火星女人来自金星,男人和女人之间,真的永远存在着一条不可逾越的鸿沟吗?

我们不妨在回家第五秒的这个时刻,看看男人和女人在沟通上的几种经典误会,从而发现你们在思维上存在着怎样的差异——

情景一: 女人的牢骚,男人的心烦

女人:我再也不想坐公交车了!挤死了!被别人踩了好几脚!

解析她:我这样的好身材,穿得这样漂亮的女孩怎么能被面包样挤来挤去的!女人希望自己扮演一个弱者的形象来博取别人的同情,看,我多么地楚楚可怜啊!

男人:又不是你一个人在挤,大家不天天都在坐车吗?

解析他:你不是天天在坐车吗?男人总是不理解女人在瞬间的情绪的风云突变,觉得不可理喻。殊不知女人的思维总是跳跃性的,昨天好好的,今天就能找出它的一百条不好的理由。

女人:别人是别人,我是我!我就是受不了!

解析她:记住,任何一个女人都认为自己是和别人不一样的。都觉得自己是惟一的,这是女人的普遍的心理,她其实需要的就是一句简单的问候语罢了。

男人:那你打车吧,我来给你报销。

解析他:这下看你还怎么说,最好能堵住你的嘴。男人是喜欢把事情变得简单的,特别是对感情上的事,更不愿意花过多的时间和精力去纠葛。男人觉得这样也是解决问题的根本办法。

女人:算了吧,你一个月能挣多少啊,你以为你是谁啊!

解析她:其实,女人想说的是,我就是嘴上发发牢骚,让你心疼一下,你以为真的会让你天天花钱打车啊,还不如攒点钱来买车呢。其实女人永远是比男人更实际的。

男人:你是不是觉得和我在一起特委屈啊,连车都坐不上。

解析他:我都已经说成这样了,你还不满足,还要打击我,我是没多少钱,可是我也是有自尊的啊,你这样有损我的尊严。男人最怕的就是女人说自己不行,自己比不上别人,那种话的伤害是致命的。

女人:是,我就是觉得委屈,看看人家天天都有车接送,天天都穿宝姿,我呢?连打车都要反复琢磨。

解析她:其实,女人想说的是我爱上你,就接受了你现在的一切,但只是希望你能对我好一点。女人既然实际,就知道自己选择的是什么和放弃的是什么,但是她又放不下自己的攀比之心,所以会不由自主地去抱怨。原谅女人可怜的虚荣心吧,如你满足不了,那么就对她多点温存吧。

男人:那你找别人去吧,我给不了你这些,你找能给你这些的人去吧。

解析他:心思简单的男人觉得你一定是变心了,被外界影响了,觉得他给不了你那么多想要的,这样强求有什么意思呢?男人喜欢干净利落。

情景二:男人的晚归,女人的质疑

女人:今天怎么回来得这么晚啊?

解析她:干什么去了啊?是不是有什么事啊,可以和我说说话吗?女人希望得到交流。

男人(不以为然地):没事。

解析他:怎么这样婆妈啊,像个管家婆。男人喜欢自由不被束缚,越管束越反抗。

女人:没事怎么就晚了,有什么不能说的。

解析她:身正不怕影子斜,我就知道你有事,否则干什么回避啊,是不是有什么其他女人了,怎么都不愿意理我呢。

男人:别胡思乱想的,没凭没据的,不要瞎说!

解析他:你太不信任我了,我就用法律术语来对付你。

女人:好啊,还要证据,心里有鬼,难怪也不告诉我一声。

解析她:女人总是会把一件事情按自己的思路往上套,特别是感情上面,女人简直是个“推理家”,有时候甚至非要把自己的推理证明成现实。

男人:我干嘛去都要向你汇报啊,我走到路上忘记拿一份很重要的文件又折回去了,你满意了吧?

解析他:男人是最能说谎的一种动物,但是对自己亲爱的人一般是不会使用这一招的,除非是你把他逼到绝路上了。

女人:哼,很好的理由,既然这么简单干嘛一开始不说啊。

解析她:从现在开始,一切都可能只是谎言了,即使女人真的信了,也还是会因为你的不当回事而继续抱怨。

男人:本来就没什么好说的,如果你非要往别处想,就随你便吧。

解析他:男人爱赌气,有时脾气上来了,会故意说一些伤害女人的致命要害的话来。顺着她的话故意激她,会让她更坚信自己的猜疑的正确,让无须有的罪名得以成立。

女人:你……你开始说谎了,你变心了。

解析她:她被气得泪流满面,就这样,本来一件小事,因为沟通上的障碍,矛盾升级成一件严重的外遇事件。

情景三: 男人的遗忘,女人的失落

男人回家,女人跟过来:你今天回家忘记什么了?

解析她:绕个关子发问永远是女人的爱好,有点娱乐调情的作用。

男人(四处打量一下):我什么都没忘记啊。

解析他:又要找茬了吧。

女人提示了下:很重要的东西,你再想想。

解析她:爱故弄玄虚是女人的天性,这样才能显示她的重要性来。

男人眉头一皱,脱口而出:今天是什么节日?我又忘了给您老人家买什么东西了?

解析他:上次不是刚买了东西送你了吗?你又想要什么了?故意找理由向我要吧?男人总是误以为物质是女人的第一需求,因为女人见到物质性的东西就会两眼泛光。却忘了女人更是情感类动物。

女人忍无可忍地大叫:三年前,每天回来的第一件事,就是叫我的名字,吻我!而现在呢,别说吻了,连名字都懒得叫了?

解析她:是不是看我已经成了黄脸婆就想抛弃我?女人总是怕老的,青春的流逝对她来说是最残忍的,她需要你在这个时候的肯定。

男人:你以前也是很温柔地接过我的包,见到我很雀跃,现在却是连个“你回来了”都不愿意说啊。

解析他:殊不知,女人骨子里的浪漫和她的年龄是没有丝毫关系的,任何年龄的女人都需要浪漫,即使是柴米油盐的生活中,也别忘了给她偶尔的惊喜。

情景四: 女人的地狱,男人的天堂

男人:你怎么还没做饭啊?

解析他:原本以为回到家,会有热气腾腾的饭菜等着,没想到却是冷锅冷灶,要知道我是推掉了三个聚会才回来的。就是为了和你一起吃饭啊。

女人(没好气的):我是你家保姆啊?

解析她:保姆一个月还有工资,你凭什么理直气壮地非要我天天做饭?其实我只是今天太累了,想出去吃。

男人:你是女人,女人就应该做这些。

解析他:不可否认,在现代的社会还有很多男人有这样的观点,认为这是男女分工的问题。大男子主义思想严重存在。

女人:凭什么啊,我也要天天上班,我也每天都要累死了,怎么就没有人给我做饭啊。

解析她:女人的倔脾气上来了,是谁都拦不住的。其实很多都市女人也都接受一个女人洗衣做饭做家务等琐碎的事,但是她希望你能觉得这些不是因为她欠你的,而是她为了爱你才做的。因为这是两个人的生活,共同的事情。

男人:我可是推掉了三个聚会回家的,你就这样对我啊。

解析他:男人的心中那些聚会是很重要的,因为他要维护社会关系。他想告诉你,我放弃了这些,是为了陪你,希望你能明白和理解。但是在女人听来就好像是一种威胁,是让她觉得自己不值得他放弃这些一样。

女人:你回家是对我的恩赐啊,我不需要。这家我受够了!

解析她:女人总是容易把问题上升到一定高度,尤其是上升到爱与不爱的高度,她自始至终关注的其实都是她在你心目中的位置,如果能够时刻感受到自己是最重要的,那么女人就会感到满足。

免费用银行的钱的独门绝技

楼主的经历和我差不多,我的第一张信用卡也是从招行的MSN迷你卡开始的,一大四小,信用额度才2000,但那时不用拿任何抵押就办下来的,当时相当满意,呵呵,于是买任何东西都刷他,为了凑刷卡次数,我不惜在超市买一次东西刷三次,经过不懈的努力,三年时间,信用额度已经增到了5万,因为有了这张卡,其他行的就好办多了,只要拿着这卡去,带上你的近期的对账单,而且你对信用额度没有要求的话,你任何一家银行基本都给你办下来,现在我已经有在北京的大部分银行的大小信用卡近20张,总信用额度有30万左右(这在我现在有车有房的情况下,我申办的基本全要求是白金卡,有的行虽然有好几张,但他给你的总信用额度是一致的)

其实用银行的钱是很容易的,只要银行不倒,你可以一直用着银行这笔钱,
(前提的是你必须要有套现的地方),这也是所有卡族最头疼的,告诉大家一个套现的办法,先去中关村找人帮你刷卡套支票,一般是一笔收20左右,也有收50 的,但一周后才给你支票,(如果你路子硬,认识的人能直接给你换成现金的话,下面的程序也就省了,或者你有直接支票换现金的地方也行)刷少了就不划算了,一般2到3万一次最好,支票怎么换成现金呢,去东大桥的蓝岛大厦西边的建行办张能入支票的个人储蓄卡,全北京好像就那里能办,一次只能入3万以里的支票,抬头写你的名字,用途写稿费之类的,就可以把你的支票入到你的储蓄卡上,两天到账你就可以提现了,一分手续费也不用,这套程序其中主要的费用就是那刷卡的 20到50元手续费,你也别郁闷,这钱你能从其他方面赚回来,你刷卡的同时,银行会给你积分,一般是一元钱积一分,凭积分可以换很多礼品,包括很多小家电,家居用品,甚至是商场购物券,或者麦当劳的餐券,(我家的小家电基本全是我积分换来的,光吸尘器就换了三个)根据我个人这几年的经验,每4万分就换价值100元人民币的礼品,你每次刷3万左右的话,就能得到75元左右的礼品,再贬值也能抵用20到50元的手续费吧,(这对一些不想用这手续套现的朋友也有启发,就是你可以办一张卡,然后每次去要买大宗东西的时候与其给现金还不如刷卡后再还现金,跑趟银行的事,能换好多积分,积分其实就是钱那)这套手续虽然繁琐,但能避免楼主用支付宝套现的风险了,其实我最近也在研究用支付宝套现的办法,其实也不是不可以,你得先找一个朋友的身份证在淘宝上开个网店,最好卖些大宗贵重物品,一般无人问津的那种,比方说名贵字画啥的,然后你用信用卡把钱支付到你的支付宝里,再从你的支付宝里支付到你朋友的支付宝里买他的大宗商品,然后他再提现给你,但用信用卡支付在线支付你必须去各银行办理移动证书,每个银行都要收几十元,然后给你各U盾啥的,还有个缺点是这没有积分,而且很多银行从信用卡里支付到支付宝里每次都有金额限制,像招行一次只能转499元,你要转2万多,得转好多次,还有好像广发行的信用卡就不支持转给支付宝,这太麻烦,马云的细节还是做得不好,可能他觉得淘宝上没有大宗买卖吧!

最重要的一点就是楼主说的,你必须把所有的卡的记账日和最迟还款日记到一个表格里,尽量把还款日给错开,这样你能有时间差去换现金周转!有的银行的还款日和记账日是可以自己在网上银行设置的,还有就是像最长时间的用银行的免息期,那就在记账日的第二天刷卡最划算,这样银行就把这次消费记到下个月的记账日,记账日离最迟还款日还有一段时间,各银行不一样,好像广发的金卡时间最长,有25天的时间,也就是说你有55天的免息期!一般银行都是48天左右!

总之,想免费用银行的钱,你就得多动动脑子,多和像楼主这样的多卡族交流,呵呵,像楼主说的,没钱也能买房,但得量力而行,千万别玩儿陷了反而成为银行的卡奴一族,那就惨了,呵呵!

2008年8月30日星期六

时间的轮回

前天,yiyi把她毕业的照片发给我看了。看了之后,心里有一种说不出的感觉,就感觉那是我的同学一样,或许是照片上的她显得有点青涩,有点羞涩吧!呵呵,现在她,成熟!
有的时候忍不住在想,如果她晚生个几年会是什么样子呢?亦或她保养的特别好,涉世还不多,还是和刚毕业那会一样又会是什么样子呢,又会是一种什么感觉呢?显然,时间是无法跳转的,因为时间是平面的,自然是没有轮回一说,所谓轮回,只是痴人一厢情愿的一种说法罢了,只是文人骚客心思的一点发散。
那就再发散一点吧,如果还有来生来世,我是说if,那么,我会是什么样子的,她是什么样子的?我们是否还能在这个时间的交叉点的一个万千个假如当中遇见?

2008年8月27日星期三

刘墉凤凰卫视「世说心语」第二十讲.〈其实我们很优雅〉

刘墉



今天继续我的北京奥运会的专题。
1978年我辞掉了在台湾的电视记者工作,应美国一个美术馆的邀请,去做驻馆艺术家。刚去的时候,每次坐美国朋友的车,下车常会看到奇怪的眼神。起先我不知道为什么,直到有一天碰到一位比较心直口快的朋友问我:「刚才你是不是有什么不高兴,是不是我说什么话,你误会了?」
我说:「没有啊!」又问他:「你为什么会问这个问题?」
美国朋友说:「因为你刚才关车门,很用力,我以为你不高兴。」
这时候我才搞懂,过去很多人奇怪的眼神都因为我关车门太用力。说实话,我一点也没觉得,因为我在台湾都样关车门,而且从小,我母亲也总叮嘱我,关车门用点力,确定门关紧了,免得摔出去受伤。但是,当年跟台湾的车子比起来,美国车子好得多,不太有车门关不紧的问题,自然对我关门很不适应。
到美国的第二年,我进研究所,在学校旁边租房子,有一天,我的房东跑来对我说:「刘先生,麻烦您以后关水龙头小一点力量,因为你用的水龙头,里面的橡皮垫特别容易坏。」
隔一下,她大概怕我多心,又跑来对我说:「我发现你们亚洲来的留学生,关水龙头都用很大力气,其实我小时候也一样,因为我从罗马尼亚移民来,在我老家,水龙头老漏,非用力不可,我也是到美国才改的。」
再说个故事:
最近有个学生对我说,某餐厅真不错,他欣赏极了,还要请我去那里吃饭。
我说他们有什么拿手菜吗?学生想了半天,答不上来。我就笑他:「你连他有什么好菜都说不上,为什么那么赞美他们?」
学生说:我发现他们不一样。第一,他们是中餐厅,按说比西餐厅吵,可是去那里的客人都很安静,因为餐厅服务生会用很巧妙的方法教客人安静。
原来,那餐厅服务生在你点菜的时候,会特别弯下腰,把脸凑过来,用很柔和的声音跟你说话,好像唯恐打扰到别人。当服务生这么做,顾客自然就把声音放小了。
我那学生还讲,有一天餐厅一个服务人员打翻了盘子,老板立刻过去帮忙收拾,除了问他的职员有没有受伤,没半句怨言。清理完,还给每桌客人送上一份小点心,说因为刚才让大家受惊了。可见那餐厅多么有水平,又多么优雅,连不优雅的人进去,都变得含蓄了。
我说以上三个故事,是要告诉大家,如果有人怨我们中国人说话太大声,扭水龙头和关车门太用力,应该知道那可能因为我们的环境,尽管中国经济起飞了,有些过去的习惯,一时还是改不掉。而且说不定,今天在比较落后的地区,因为车子老旧,还是得用力关门,才安全。如果水龙头是老式的,也必须用很大力气关,才能不滴水。又因为环境比较吵,或大家都爱大声说话,不大声说听不清楚,时间久了,大嗓门自然成为习惯。
所以,今天如果有外来的观光客,进中国餐馆,不习惯我们人说话的大声,或奇怪中国人关车门很用力,他们不能怪我们,而应该设身处地想想,如同我以前罗马尼亚裔的房东,会说他以前也一样狠狠用力地扭水龙头。
只是,从另一个角度想,今天中国富裕了,我们是不是也该自己告诉自己,在公共场所可以小声一点说话,坐轿车的时候不必那么用力摔门?
而且,作老板的人,如果你的员工摔碎了东西,先问有没有人受伤,而别急着骂。因为人比东西重要啊!
说到这儿,让我想到很多年前,有一回我到个落后的国家旅行,坐在船头,用录像机拍两岸的景色。
这时候划船的土著对我喊:「小心!前面有疾流,小心机器摔下去。」
我笑着问他:「你为什么不讲我会掉下去呢?」
那土著倒有理,他说:「你掉下去没关系,到下面自然会浮起来,机器掉下去,就麻烦了。」
我又问他:「如果两个都掉下去,你先救谁?救我还是救机器?」
您猜他怎么回答?他说:「当然先捞机器,因为机器比人值钱!」
请别觉得匪夷所思,要知道在非常落后的国家,机器甚至耕牛,在人们心里的价值是惊人的。
同样的道理,如果外国观光客跟我们一起用餐,我们的孩子打翻了果汁,或砸碎了盘子,大家先安慰孩子,安安静静地为孩子清理,向在座的客人表示歉意。而不是当众先给孩子两巴掌。
这些宽容,能让外宾刮目相看。因为它反映了我们对人的重视,反映了在众人面前控制情绪的能力,也反映了中国今天的富裕。
请别骂我这么说,会把孩子惯坏。套一句梁实秋先生的话:「谁说孩子是未来世界的主人翁,我们处处看见他们在作现在这个世界的主人翁。」
我们当然要对主人翁好!我们当然要培养有风度、有格局、能自制,泱泱大风的下一代。

2008年8月26日星期二

c c++ include机制简述

1.引言
做c/c++编程的对#include指令都不会陌生,绝大多数也都知道如何使用,但我相信仍有人对此是一知半解,
C:
#include
C++:
#include
表示包含C/C++标准输入头文件。包含指令不仅仅限于.h头文件,可以包含任何编译器能识别的C/C++代码文件,包括.c,.hpp,.cpp,.hxx,.cxx等,甚至.txt,.abc等等都可以

2.名词解释
preprocess
预处理:为方便编译器处理而设置的一种机制,包括一些常用预处理指令和语句,我们统称为预处理系统。
如#include #define #if...#else...#endif #pragma等
这些指令的实现是由编译器来决定的(implementation specified)

提到预处理指令,顺便说一下头文件防止重复包含的2种方法
a.保护宏(暂且称为Macro guard 宏卫兵?):
#ifndef _ABCDE_H
#define _ABCDE_H
/*
代码部分
*/
#endif
在被包含过一次之后,宏_ABCDE_H已经有了,下次再碰到就会略过从#define _ABCDE_H开始到#endif之间的代码
还有一种特定编译器支持的指令:
b.#pragma once
能保证该文件(物理上的)只被编译一次,也能起到防止重复包含的作用
但这2种方式是有区别的:
a.Macro guard可移植性好,绝大多数编译器都支持,而且万一不小心拷贝了几分相同的代码也不会出问题,但你得确保这个宏名不会与其他的宏冲突,否则等编译器报出一大堆错误的时候你可能会觉得莫名其妙;
b.#pragma once指令简单,它能保证该文件(物理上的)只被编译一次,不用去费劲的想不同的宏名,但如果有几份该文件的拷贝,显然起不到作用。

declaration
声明:指将一个名称引入当前编译单元,或者重新声明一个前面已经声明过的名称,声明指定了如何解释一个名称和该名称具有的属性;
例如:
int main(void)
{
int a; // 声明了变量a,类型为int
int *pa; // 声明了变量pa,类型为指向int型的指针类型
}
definition
定义:除了以下情况,声明就是定义
a.声明函数但不包括函数体;
b.声明包含extern链接限定符,例如:extern int a;
c.声明既没有初始化语法,也没有函数体;
d.类声明中声明静态数据成员;
e.类名字声明;
f.typedef声明;
g.using声明或者using指令;
以上情况适用于C具有的特征,C++则完全适用,一般来说定义要为其对象分配或预留存储空间,而声明则不用。
translation unit
编译单元:一个源文件,.c .cpp等和它所包含的文件一起,在经过预处理之后形成一个源码文件,标准称之为translation unit(编译单元)包括一系列的声明和定义;一个program(程序)由一个或多个编译单元组成。编译器将各个翻译单元编译为目标代码(.obj),通过连接器(linker)将这些编译后的编译单元(即目标代码)连接成完整的指令序列(可执行文件、静态库、动态库等)。
one definition rule
一次定义规则:是指定义在所有进入连接的编译单元中只能有一次。
3.观点、例子
A:头文件只放声明
example_a.h
void function();

example_a.cpp:
#include "example_a.h"
void function()
{}

B.被包含的文件可以使用任意扩展名:
只要是用符合标准的代码编写的文本文件,就可以使用#include来进行包含,包括.cpp .c等常见的源文件扩展名;
example_b_1.b
void function();

example_b_1.cpp:
#include "example_b_1.b"
void function()
{}

example_b_2.b
void function1();
void function2();

example_b_21.cpp:
void function1()
{}

example_b_22.cpp:
#include "example_b_1.b"
#include "example_b_21.cpp"
void function2()
{}
上面的例子中,example_b_21.cpp仅被包含在xample_b_22.cpp中,不再被其他的文件包含,而且不加入工程中;

C.标准头文件的使用
最新的C++标准库中的一切内容都被放在名字空间std中(名字空间中的内容对外是不可见的),但是带来了一个新问题,无数现有的C++代码都依赖于使用了多年的伪标准库中的功能,如声明在等头文件中的功能,使用std包装标准库导致现有代码的不可用,为了兼容这种情况,标准委员会为包装了std的那部分标准库创建了新的头文件,新的头文件的文件名与旧的一样,只是没有.h这个后缀,如就变成了。对于C头文件,采用同样的方法,但还在每个头文件名前加了字符 c,如就变成了变成了。最好使用新的文件头,使用新的文件头的C++程序,需要使用using namespace std或者using namespace std::指定的类名,等方法来使需要的类对于我们的代码可视。

4.总结
既然是经常使用的东西,我们就应该明白它的原理,减少编程时的困惑,提高编程的效率。

2008年8月22日星期五

金牌大户不等于是体育强国

随着2008北京奥运会的大幕即将闭合,奖牌归属的情况也日见端倪,中国的金牌第一应该说已成定局,奖牌总数第一也指日可待。截止到本文起笔时为止,我国已获得金牌46 块,再加上已到手的女乒单打,和极有可能的男单乒、男跳水十米台,陈中的跆拳道等,超过50枚是极有可能的。于是乎,举国上下,齐声欢呼,一致认为我们已是体育强国。
且慢:倒一下大家的胃口,逆向思维一下,随着中国男女足,男女排,男女篮等大球项目一个个被逐出局,最见体育功力的田径奖牌也于中国无缘,这很尴尬的局面应该给我们热情的火苗泼一下冷水。要知道:我们国家培养体育人才用的是举国扶持的机制,说白了,是国家在拿钱培养运动员。
在中国超过40枚金牌时,举国欢腾之下,我在网上就看到了“金牌大户不等于是体育强国”这样异常冷静的声音。也有人说,金牌大户并不意味着中国已经可以称之为体育强国,倾全国之力培养出来的国家队不能代表中国社会普遍的体育精神与竞技水平。中国体育的行政主导色彩过于浓重,过分强调“为国争光”的比赛成绩,而光环之下,体育的本质精神与真正价值却未能得到应有的重视。
而这次,我们得了第一,面对这一前所未有的辉煌,我们在欢呼雀跃的同时,更应冷静理智地看待,更需做深层开放的思考。对中国来说,金牌第一并不意味着是体育强国。再加上“东道主效应”的作用(根据奥运会历史以及奥运的“国际惯例”来分析,“东道主效应”、主场优势是可以提升主办国的参赛水平和夺冠实力的。比如,1964年的东京奥运会就使日本的金牌数从4枚升至16枚;1992年的巴塞罗那奥运会使西班牙从1金上升到13金;韩国的汉城奥运会,也使其金牌数从7枚涨到了12枚;而1980年的莫斯科奥运会和1984年的洛杉矶奥运会,更使苏联和美国分别多收了三四十枚的金牌……)所以我们必须要头脑清醒地看金牌、看奖牌,真正做到不以我们的摘金夺银而狂喜,亦不以无缘决赛、失去奖牌而痛悲,以一份淡定与从容的心态,真正着力于善始善终办好“有特色、高水平 ”的北京奥运会,并从中进一步获得我们今后“发展体育运动,增强人民体质”的经验与动力。
与奥运金牌世界第一的身份极不相称的是:我们的民间体育条件极其简陋,多为自发组织,人均占有的体育设施、场地微不足道;群众体育的目的除了玩乐,就是为了健体强身,以致能够坚持体育煅练竟然多为中老年人;少数市场化运作的联赛项目鲜有成功之例,反倒是黑幕丑闻层出不穷。可以这样说,我们的金牌数基本上和民众的身体素质没有关系。尽管我们的运动员不断地为祖国拼得一块块闪耀着美丽光芒的金牌,但金牌的背后,却依然是陈旧的体育管理体制、低效的体育产业模式,公共体育的设施、群众的参与热情以及社会公众对于体育精神的理解等都处于相当落后的窘境。
不可否认,奥运金牌给我们带来了畅快的精神享受与强烈的民族自豪感,我们需要这样的振奋与激励,奥运金牌,不可不夺,竞技比赛尤其需要志在必得的信心。但金牌却是极少数幸运儿的荣耀,更多的人注定只能得到“重在参与”的安慰。作为奥运会的远程观众,我们无法真正体会失败者的痛苦,相比而言,胜利者的激情更具感染力。但奥林匹克的精神是全民参与,从这个角度看,让人人参与,那才叫务实、也更有意义,从而真正走向体育强国之路。
  伴随着我们国家经济的飞速发展,改革事业的成功,社会的文明进步,人民生活水平的提高,这为我国体育事业迅猛发展提供强大的物质保障基础和人才选拔基础。体育的精神与价值,在于塑造强健的国民体格,积极向上的民族心态,尊重规则、公平竞争的社会氛围与公民素质。体育可以强国,体育强国非但拥有各个项目水平高超的国家竞技队,可以在包括奥运会在内的国际综合或单项比赛中取得金牌;而且更应具备普遍的群众体育基础,体育强国的公民热爱体育,乐于积极参加各项体育运动,并且拥有良好、方便的体育设施与场地;体育强国的社会尊重包括比赛规则在内的各种社会规范,习惯并且服从于通过公平的竞争决断出包括赛事在内的各项社会事务的最终结论。
  50多年前,毛主席用他的如椽巨笔,写下了“发展体育运动,增强人民体质”。当中国的“奥运战略”,接连在几届奥运会上,取得成功之时,可在众多比赛中,我们看到的却是中国人的体质,依旧比不上欧、非等国。在现实生活中,看看现在的下一代,出现了越来越多的“小胖墩”、“小近视眼”,也出现了越来越多大学生“心理崩溃”的案例。因而,我们说,金牌大户不等于是体育强国。很客观地说,我们中国,最多只能算是“竞技体育强国”。而不是“全民体育强国”。现在,体育已经越来越回归其本义,地球人都知道:一个身体不强健的民族,是难以称得上“精神强健”的。

2008年8月11日星期一

从易中天教授身上学到的

我发现有很多人喜欢易中天,而且很崇拜他!但是,那种崇拜,是一种盲目的崇拜至少我觉得是!
只是一味的喜欢他讲话的风格,但内在的一些东西却没有看见!我在听了四遍易中天品三国后有了一些感想,哪些,有
1.他治学的严谨你看见了吗?
易中天教授在引用一个典故或材料的时候都是详细的说明,这个材料出自哪里?什么人说的?很详细,也就是说,你可以在看完之后去检验是否是真的出自那里!
2.他知识的渊博你看见了吗?
历史学我敢说易中天教授是个牛人,因为一个对历史研究不透的人,是不可能想到引用那些材料的,这就像你要解数学题,那么你就要把定义定理理解,不记住,你想查都不知道在哪去查!
3.用通俗的话解说专业的东西,这个你看见了吗?
这个我估计都看见了,但是你学到了吗?本来生硬死板的三国志被他说的风趣异常,你在对别人讲某个专业知识的时候能否做到?

2008年8月7日星期四

开幕式来临,装Fedora


本来今天准备跟同事去王府井看开幕式的,但是在网上一看,崩溃了,总共两个半小时,2个小时的各国代表队入场时间,想想,算了,还是在家快进的好!
没事想研究研究fedora,而且用8代,听说9代问题太多了,算了,我没时间去研究他的bug问题,还是直接用稳定的版本来的好。
和那个土耳其女孩聊天以后才发现,原来我英语这么差啊,平时是感觉挺差的,但没感觉这么差,太打击我了~~~5555555.
崩溃中~~

2008年8月3日星期日

Show My Ipod





show my ipod

2008年7月31日星期四

快乐的工作着


在刚开始学正则表达式的时候,一看例子那些乱七八糟的符号~~麻了!觉得这么难我能会吗?
可是看了几天然后实践一做,嗨,不就这么几个东西嘛,有什么难得,就开始有点想不通当初为什么觉得难了!
----------------------------------------------------
这就是所有学语言的障碍所在,在看书的时候,觉得,哎,行了,例子都能看懂,会了!到真正遍的时候又不会了,我当初学C语言的时候也是,不停的看书看书看书.......!觉得理论都可以了,都会了,例题会分析了,结果一上机,又木了!

实践是检验真理的唯一标准,这是多么无所不能话啊
-----------------------------------------
每天上班都会进过Google公司,在他附近有不少知名公司,可是每当看见google的标志了时候,心情又是一阵激动不已!口水ing!
-----------------------------------------
今天老涂做个个巨搞笑的事情,我们下班走在路上的时候,因为下雨嘛北京这几天,路上有好多积水!然后,我们正在一路走一路说着的时候,一个MM开着个别克过来了,“刷'的一下,水开始做抛物线运动,老涂激动的说了一句”我顶你个肺啊”,其实他也不是要骂他,就是激动了一下,难知道,那MM突的一下就停了,冒出脑袋说:“对不起啊,我已经开的很慢了,哪知道还是。。。。不好意思啊”,搞得老涂巨尴尬。郁闷的说:“好了,我是受害者,这下变成我没素质了”崩溃ing!!!!

2008年7月29日星期二

努力的奋斗着

为了能拿到更高的薪水让我的大学生活水准更高点,为了能积累更多的知识让我和老婆以后的生活更惬意,为了能让自己在公司的地位和尊严更高。。。我只能奋力的学习!
目前在全力攻克java和数据结构中。
希望我能以最快的速度攻克他们。
加油!

成功男人的标准!

成功的男人,最明显的特点就是自信和乐观。在他面前,没有翻不过的山,没有趟不过的河;在他眼里,砍头估计不会有碗大的疤,顶多也就茶杯那么大。

成功的男人相信两句话,第一,“天无绝人之路”。上帝在关闭一扇门的同时,一定会记得为他开一扇窗的;第二,“车到山前必有路”。只要动脑筋,办法总比困难多。

成功的男人敢于负责,善于负责,但从不轻易许诺负责。只要他答应了负责,无论是事业还是女人,他都会负责到底。

成功的男人处在厄境时,不会因为别人看不起就自暴自弃,也不会因为环境所迫就蝇营狗苟,“贫贱而不移”。他知道自己缺少的只是机会而已,他的理想依然远大,他的志趣依然高尚。

成功的男人失误时,从不为自己找任何借口,也绝不把责任推到别人身上。他知道,错了就是错了,摔倒了就是摔倒了。要走向成功,首先
先要学会面对失败,不敢面对失败,永远也不可能成功。怨天尤人时,也许对手走得更前了。

成功的男人失败时,既不歇斯底里的去放纵和发泄自己,也不悲观失望、一蹶不振,更不会丢下他所爱的人和爱他的人走上绝路。他会像一只受伤的狮子,找个谁也找不到的地方让自己安静,默默地舔干伤口上的血迹,整理自己的羽毛和武器,然后精神抖擞地走出来,准备下一场战斗。

成功的男人成功时从不得意忘形,即使在取得了像“建立新中国”这样辉煌的胜利时也一样,因为他知道这只是“万里长征走完了第一步”,更何况“山外有山,天外有天”。在别人欢呼雀跃为他庆贺胜利的时候,他会把自己关在书房里,在“沙盘”前谋划着下一步的行动。

成功的男人对待员工像对待自己的兄弟姐妹一样,因为他知道,他之所以成功,正是由于他们的辛勤和努力;更重要的,他懂得,在员工心目中,他对员工的态度,就是员工对待公司的态度。把员工当兄弟姐妹,员工才会把公司当家。

成功的男人一定有很多朋友,但知心的朋友一定只有几个。成功时围在他身边的不一定是他的“死党”,失恋时想找人去酒吧喝酒,打电话
话的第一个人,一定是他的“铁哥们”。

成功的男人背后不一定站着一个女人,但一定有一个女人,这个女人也许是他的动力,也许是他的压力,也许是他目标,也许是他的耻辱,也许什么也不是。

成功的男人不一定有才,但一定有能;不一定聪明,但一定灵活;智商不一定很高,但情商一定很高;不一定会做事,但一定会做人;不一定酒量大,但一定肚量大

成功的男人像尤今笔下的“古井”,看上去波澜不惊,实际上却一眼望不到底。和他交往得越久,你就会像吸鸦片一样,越来越迷上他。

你们这帮人有中国人的尊严吗?

气死了,在Mariah Carey吧居然有人说,Mariah Carey没巨款,鄙视她,Mariah Carey对灾区的人民慰问了几句,居然说人家假惺惺。好吧,残疾人(仅指思想残废),我来告诉你:

1. 中国受灾了没错,可是,你又有什么权利向别人乞讨捐款,人家捐不捐是人家的事情,不捐不代表没爱心,你怎么可以乞讨呢?(指某些说这个那个明星不捐或捐那么少的人),中国人要有骨气知道吗?捐了,我们接受,这是你们的爱心,我们谢谢你!不捐,也没关系,我们可以靠自己的力量再重建,当然,我们也不会恨你,抵制你什么的。

2. 很多台湾香港艺人捐了不多,然后就有残废在那骂,说你妈的我喜欢你那么多年你居然只捐了那么点,妈的我要抵制你,我要号召抵制你。用你的残疾大脑想一下,台湾谁统治的,是不是共产党统治的,他们能捐已经是很不错了,冒着政府啊,百姓啊,政治啊前途啊等压力捐你已经不错了,别再无耻的索求更多了,还有,你喜欢人家那是你自己的事,关人明星鸟事!

3.整天抵制这个明星抵制那个明星,就因为人家捐少了!别丢人了,真的!中国自强不息的精神是不是教你危难的时候不自己帮自己靠外人捐款了,外人捐的不够多就骂人了,抵制了?

4.关于有残废地址迪奥我想说的事,莎朗只不过是个跳梁小丑而已,管人迪奥什么是,她又不是迪奥总裁,她所发表的言论又不能代表迪奥,你抵制有什么意义?我看是国内的有些品牌从中作梗吧!

5.气死了,不说了,真丢中国人的脸,好好反省自己,残废们,都是一群没大脑而又不理性的人

喜欢google的bolg

本来以前听说google的blog速度慢什么的,没建,但是今天一看,不错,有着google一贯的风格
在MySpace被恶心坏了,只要稍微有点不和谐的内容,比如说什么骂共产党啊,骂社会啊,抱怨社会啊,抱怨Myspace没有自由和民主啊什么的,立马被删,真恶心,这也叫blog,不知道他们的脸皮怎么那么厚来着!
好了,不多说了,以后再这安家,不在看那恶心的myspace,同时,也希望大家来google,我可是google的忠实拥护者哦!

Ubuntu创始人呼吁开发Linux桌面软件对抗苹果

Ubuntu Linux创始人Mark Shuttleworth敦促开发一种Linux桌面软件以对抗苹果在这个领域的竞争以及苹果发布的软件.

Shuttleworth本周二晚上在俄勒冈州波特兰举行的O'Reilly开源大会上发表了讲话.他敦促开发一种新的收入模式以便资助免费软件.为此,他提出了基于服务的机制.他还强调了与Windows兼容的重要性.

Shuttleworth强调了Linux桌面软件的开发以及移动应用程序的开发.他说,我们在提供的用户体验方面能超过苹果吗?这在未来两年的建立这种类型的桌面软件中是一个重要的挑战.

他说,在桌面体验方面,我们一定要超过Mac计算机.但是,这在移动领域也同样重要.我们的挑战是如何在不牺牲社区流程的情况下提供简洁明快的东西.

Shuttleworth指出,Linux应该与Wondows联系起来.他强调说,他认为Linux是未来的平台.但是,我们学习如何与Windows一起工作是很重要的.有扩展能力的软件必须能够在这两个平台上都能够运行.

JavaScript演化成为一种重要编程语言

自JavaScript从ECMAScript 版本3那里获得重大更新后,JavaScript 这些年来一直在稳步前进。InfoQ.com一直在关注其官方网站对JavaScript的更新修改。

  网景公司为JavaScript 2.0而出品的ECMAScript版本4在网上可以下载了。jQuery项目的创建者,John Resig在自己的博客上发表了一些观点:

  我认为JavaScript语言经历了许多不同的阶段:

  1 我们需要为web页面写脚本的阶段(Netscape)

  2 标准化阶段(ECMAScript的出现)

  3 JavaScript并不是一个摆设阶段(Ajax的出现)

  4 JavaScript成为一种编程语言

  JavaScript在1995由Brendan Eich(Netscape公司的一名工程师)所创建,于1996年早期和Netscape 2一起发布。JavaScript作为一种语言,在过去一直受人们所研究评论,如Douglas Crockford 这么写道:世界上最为误解的编程语言;最近Google的Steve Yegge这么描述:JavaScript是下一代重要的语言。John Resig在它的博客中继续写道:

  ……JavaScript将会被作为一种重要的编程语言——从web开发的概念中分离出来。

  不再基于web使用

  在Rails上使用JavaScript,应该承认这个项目是非常好的,但是不幸的,现在绝大多数人都在谈论下一个流行的语言如何到来,宣布对非常流行的Ruby on Rails框架的重写,没有人去关注它。事实上,JavaScript,运行于Rhino,也是我们应该去关注的。

  Helma——这个web应用程序框架是在服务器端使用JavaScript开发的,很稳定。

  所有这些说法让我认识到:JavaScript最为一种语言还是具有先进性的。虽然它的主要领域将会是web浏览器(新的JavaScript引擎会继续朝这个方向努力);在将来,JavaScript使用在服务器端将会使另外一个很大的领域。

  引用Steve Yegge博客中的话:

  ……因为下一代流行语言将至(或许18-24月,或许更短,我说不准,总之是即将到来)……

  许多人看到Steve Yeggie坚信下一代流行语言就是Javascript或者是ECMAScript。在Mozilla 页面,你就会明白网景公司想让JavaScript 2.0和ECMAScript版本4 作为一样的语言,只是JavaScript2.0提供少许几个额外特性。JavaScript 2.0草案规范在这里可以找到

JavaScript:世界上误解最深的语言

JavaScript,是世界上最流行的编程语言之一。事实上世界上的每一台个人电脑都安装并在频繁使用至少一个JavaScript解释器。JavaScript的流行完全是由于他在WWW脚本语言领域中的地位决定的。


Despite its popularity, few know that JavaScript is a very nice dynamic object-oriented general-purpose programming language. How can this be a secret? Why is this language so misunderstood?

尽管它很流行,但是很少有人知道JavaScript是一个非常棒的动态面向对象通用编程语言。这居然能成为一个秘密!这门语言为什么被误解如此之深?



The Name
名字

The Java- prefix suggests that JavaScript is somehow related to Java, that it is a subset or less capable version of Java. It seems that the name was intentionally selected to create confusion, and from confusion comes misunderstanding. JavaScript is not interpreted Java. Java is interpreted Java. JavaScript is a different language.

Java- 前缀很容易使人联想到Java,并认为它是Java的子集或简化版的Java。看起来最初给它选这个名字是别有用心的,是故意混淆概念、故意制造"误解"的。JavaScript不是解释执行的Java。Java是解释执行的Java。JavaScript是另外一种语言。


JavaScript has a syntactic similarity to Java, much as Java has to C. But it is no more a subset of Java than Java is a subset of C. It is better than Java in the applications that Java (fka Oak) was originally intended for.

JavaScript的语法和Java有相似之处,这就像Java的语法和C很相像一样。但是它不是Java的子集,就像Java不是C的子集一样。它在Java(Oak)最初打算进军的领域中比Java更好。


JavaScript was not developed at Sun Microsystems, the home of Java. JavaScript was developed at Netscape. It was originally called LiveScript, but that name wasn't confusing enough.

JavaScript不是Sun Microsystems的产品,Sun是Java的家。JavaScript是在Netscape被开发出来的。它最初叫LiveScript,嗯……还是这个名字好。


The -Script suffix suggests that it is not a real programming language, that a scripting language is less than a programming language. But it is really a matter of specialization. Compared to C, JavaScript trades performance for expressive power and dynamism.

-Script后缀让人认为他不是一门真正的编程语言,和一门"编程语言"还有相当的差距。但是这只是应用领域的问题。和C相比,JavaScript是牺牲了性能但换来了丰富的表现力和灵活的形态。

Lisp in C's Clothing
披着C皮的Lisp

JavaScript's C-like syntax, including curly braces and the clunky for statement, makes it appear to be an ordinary procedural language. This is misleading because JavaScript has more in common with functional languages like Lisp or Scheme than with C or Java. It has arrays instead of lists and objects instead of property lists. Functions are first class. It has closures. You get lambdas without having to balance all those parens.
JavaScript的类C语法,包括大括号和语句的形式,让它看起来像普通的面向过程编程语言。这是一种误解,因为JavaScript和函数式语言,比如 Lisp 或 Scheme,有更多的相似之处,而不是和C或Java。它使用数组而不是列表,使用对象而不是属性列表。函数是第一位的,它有闭包(closures),另外你还可以使用lambda表达式。





Typecasting
类型转换

JavaScript was designed to run in Netscape Navigator. Its success there led to it becoming standard equipment in virtually all web browsers. This has resulted in typecasting. JavaScript is the George Reeves of programming languages. JavaScript is well suited to a large class of non-Web-related applications

JavaScript最初被设计成在Netscape Navigator中运行,它在Navigator中的成功引领它成为事实上所有web浏览器的标准装备。这就造就了"类型转换"。JavaScript是编程语言中的 George Reeves(超人),是大量非web程序的称职之选。



Moving Target
移动靶

The first versions of JavaScript were quite weak. They lacked exception handling, inner functions, and inheritance. In its present form, it is now a complete object-oriented programming language. But many opinions of the language are based on its immature forms.

JavaScript的最初几版非常弱,没有异常处理,没有内部函数和继承。现如今,它已经成为完全面向对象的编程语言。但是这门语言的许多思想是基于它不成熟的形式的。


The ECMA committee that has stewardship over the language is developing extensions which, while well intentioned, will aggravate one of the language's biggest problems: There are already too many versions. This creates confusion.

ECMA委员会,这门语言的管家,正在对它进行扩展,也在蓄意恶化它最大的问题:有太多的版本。这是混乱的根源。




Design Errors
设计上的错误

No programming language is perfect. JavaScript has its share of design errors, such as the overloading of + to mean both addition and concatenation with type coercion, and the error-prone with statement should be avoided. The reserved word policies are much too strict. Semicolon insertion was a huge mistake, as was the notation for literal regular expressions. These mistakes have led to programming errors, and called the design of the language as a whole into question. Fortunately, many of these problems can be mitigated with a good lint program.

没有什么编程语言是完美的。JavaScript也有它设计上的错误,比如重载的+号随着类型的不同既表示"相加"又表示"连接",和本该避免的有错误倾向的 with 语句。它的保留字策略过于严格。分号的插入是一个巨大的错误,比如作为字面正则表达式的符号时。这些失误已直接导致编程中的错误,也使这门语言的整体设计遭人质疑。还好,这些问题中有许多都可以在良好的 lint 程序中得以缓解。


The design of the language on the whole is quite sound. Surprisingly, the ECMAScript committee does not appear to be interested in correcting these problems. Perhaps they are more interested in making new ones.

这门语言的整体设计(上的问题)是相当明显的。奇怪的是ECMAScript委员会并没有对修正其中存在的问题表现出太大的兴趣,也许他们更热衷于制造新的问题。




Lousy Implementations
糟糕的实现

Some of the earlier implementations of JavaScript were quite buggy. This reflected badly on the language. Compounding that, those implementations were embedded in horribly buggy web browsers.

JavaScript的一些早期实现有许多bug,这反过来对语言本身产生了很坏的影响。更糟糕的是这些满是bug的实现是嵌入在满是bug的web浏览器中的。



Bad Books
糟糕的书

Nearly all of the books about JavaScript are quite awful. They contain errors, poor examples, and promote bad practices. Important features of the language are often explained poorly, or left out entirely. I have reviewed dozens of JavaScript books, and I can only recommend one: JavaScript: The Definitive Guide (4th Edition) by David Flanagan. (Attention authors: If you have written a good one, please send me a review copy.)

几乎所有的JavaScript书都是相当可怕的。它们包含错误,包含不好的例子,并鼓励不好的做法。JavaScript语言的一些重要特性它们要么没有解释清楚,要么根本就没有提及。我看过很多JavaScript的书,但我只能推荐一本:David Flanagan著的 JavaScript: The Definitive Guide (4th Edition)  (《JavaScript权威指南 第四版》)。(作者们请注意:如果你们写出了好书请发给我一份副本,我给你们校对。)



Substandard Standard
“准标准”的标准

The official specification for the language is published by ECMA. The specification is of extremely poor quality. It is difficult to read and very difficult to understand. This has been a contributor to the Bad Book problem because authors have been unable to use the standard document to improve their own understanding of the language. ECMA and the TC39 committee should be deeply embarrassed.

ECMA公布的官方语言规范的质量极其的差。不仅难读而且极其难懂。它可为那些"糟糕的书"做出了不小的贡献,因为那些作者无法通过这个标准文档来更深地理解这门语言。ECMA和TC39应该为此感到非常尴尬。



Amateurs
业余者

Most of the people writing in JavaScript are not programmers. They lack the training and discipline to write good programs. JavaScript has so much expressive power that they are able to do useful things in it, anyway. This has given JavaScript a reputation of being strictly for the amateurs, that it is not suitable for professional programming. This is simply not the case.

使用JavaScript的人大多不是程序员,他们缺少写良好程序的培训和训练。JavaScript有非常强大的表现力,不管怎样他们也能使用它做有用的事情。这给了JavaScript一个”全然适合业余爱好者而不适合专业程序员“的名声。这很明显是一个错误。



Object-Oriented
面向对象

Is JavaScript object-oriented? It has objects which can contain data and methods that act upon that data. Objects can contain other objects. It does not have classes, but it does have constructors which do what classes do, including acting as containers for class variables and methods. It does not have class-oriented inheritance, but it does have prototype-oriented inheritance.

JavaScript是面向对象的吗?它有对象,它的对象可以包含数据以及对数据进行操作的方法,对象也可以包含其他的对象。它没有类,但是它有构造函数来做类的事情,包括声明类的变量和方法。它没有面向类的继承,但是他有面向原型的继承。


The two main ways of building up object systems are by inheritance (is-a) and by aggregation (has-a). JavaScript does both, but its dynamic nature allows it to excel at aggregation.

构建对象系统的两大主要方法是继承(is-a)和聚合(has-a)。这两者JavaScript都有,但是它的动态天性允许有比聚合更好的实现方式。


Some argue that JavaScript is not truly object oriented because it does not provide information hiding. That is, objects cannot have private variables and private methods: All members are public.

一些关于JavaScript不是真的面向对象的争论其理由是它没有提供信息隐藏。也就是说JavaScript的对象没有私有变量和私有方法:它的所有成员都是公开的。


But it turns out that JavaScript objects can have private variables and private methods. (Click here now to find out how.) Of course, few understand this because JavaScript is the world's most misunderstood programming language.

但是事实是JavaScript 的对象可以有私有变量和私有方法(点击这里来看如何实现)。当然,之所以很少有人知道这个是因为JavaScript是世界上误解最深的语言嘛。


Some argue that JavaScript is not truly object oriented because it does not provide inheritance. But it turns out that JavaScript supports not only classical inheritance, but other code reuse patterns as well.

另一些关于JavaScript不是真的面向对象的争论其理由是它没有提供继承。但是事实是JavaScript不但支持经典的继承,而且支持其他一些代码重用的模式。

KDE 4.1 Beta 2:前进两步,后退一步?

鉴于最近桌面上遇到的问题,每个人都同意KDE 4.0是一个错误,4.1被指望能矫正错误。但是关于错误是谁造成的,却持有不同的看法。KDE开发者指责发行版在没做好准备之前匆忙发布,用户则谴责开发者改变了一切。在Fedora邮件列表上,有些人呼吁将KDE 3.5作为未来发行版中的可选桌面。有评论员建议KDE应该分开开发,否则结果将是没人使用KDE 4.x。KDE发言人作出了回应,鼓励用户耐心等待即将推出的4.1。最近发布的4.1 Beta 2也许可以提供一些改进的迹象。Linux专家Bruce Byfield在评测后得出结论:“很有可能,KDE用户将不得不等待4.1之后的另一个或两个版本,才能在功能上匹配早期的版本,尤其是在定制化方面。 ”他指出,KDE 4.1的第二个beta仍然会出现莫名其妙的崩溃。

软件工程师不可不知的10个概念

35公里 写道 "出色的软件工程师善用设计模式,勤于代码重构,编写单元测试,并对简单有宗教般的追求。除了这些,优秀的软件工程师还要通晓10个概念,这10个概念超越了编程语言与设计模式,软件工程师应当从更广的范围内明白这些道理(全文阅读):
接口 (Interfaces )
惯例与模板 (Conventions and Templates)
分层 (Layering )
算法的复杂性 (Algorithmic Complexity)
散列法 (Hashing )
缓存 (Caching )
并发 (Concurrency )
云计算(Cloud Computing )
安全(Security )
关系数据库 (Relational Databases )
10. 关系数据库 (Relational Databases)

关系数据库因为在大规模 Web 服务上缺乏可扩充性而颇受微词,然而,关系数据库仍然是近20年来计算机技术中最伟大的成就。关系数据库对处理订单,公司数据方面有着出色的表现。

关系数据库的核心是以记录表示数据,记录存放在数据库表,数据库使用查询语言(SQL)对数据进行搜索与查询,同时,数据库对各个数据表进行关联。

数据库的标准化技术(normalization)讲的是使用正确的方式对数据进行分存以降低冗余,并加快存取速度。

9. 安全 (Security)

随着黑客的崛起与数据敏感性的上升,安全变得非常重要。安全是个广义的概念,涉及验证,授权与信息传输。

验证是对用户的身份进行检查,如要求用户输入密码。验证通常需要结合 SSL (secure socket layer)进行;授权在公司业务系统中非常重要,尤其是一些工作流系统。最近开发的 OAuth 协议可以帮助 Web 服务将相应信息向相应用户开放。Flickr 便使用这种方式管理私人照片和数据的访问权限。

另外一个安全领域是网络设防,这关系到操作系统,配置与监控。不仅网络危险重重,任何软件都是。Firefox 被称为最安全的浏览器,仍然需要频频发布安全补丁。要为你的系统编写安全代码就需要明白各种潜在的问题。

8. 云计算 (Cloud Computing)

RWW 最近的关于云计算的文章 Reaching For The Sky Through Compute Clouds 讲到了云计算如何改变大规模 Web 应用的发布。大规模的并行,低成本,与快速投入市场。

并行算法发明以来,首先迎来的是网格计算,网格计算是借助空闲的桌面计算机资源进行并行计算。最著名的例子是 Berkley 大学的 SETI@home 计划,该计划使用空闲的 CPU 资源分析太空数据。金融机构也大规模实施网格计算进行风险分析。空闲的资源,加上 J2EE 平台的崛起,迎来了云计算的概念:应用服务虚拟化。就是应用按需运行,并可以随着时间和用户规模而实时改变。

云计算最生动的例子是 Amazon 的 Web 服务,一组可以通过 API 进行调用的应用,如云服务(EC2),一个用来存储大型媒体文件的数据库(S3),索引服务(SimpleDB),序列服务(SQS)。

7. 并发 (Concurrency)

并发是软件工程师最容易犯错的地方,这可以理解,因为我们一直遵从线形思维,然而并发在现代系统中非常重要。

并发是程序中的并行处理,多数现代编程语言包含内置的并发能力,在 Java,指的是线程。关于并发,最经典的例子是“生产/消费”模式,生产方生产数据和任务,并放入工作线程消费或执行。并发的复杂性在于,线程需要经常访问共同数据,每个线程都有自己的执行顺序,但需要访问共同数据。Doug Lea 曾写过一个最复杂的并发类,现在是 core Java 的一部分。

6. 缓存(Caching)

缓存对现代 Web 程序不可或缺,缓存是从数据库取回,并存放在内存中的数据。因为数据库直接存取的代价非常高,将数据从数据库取回并放在缓存中访问就变得十分必要。比如,你有一个网站,要显示上周的畅销书,你可以从数据将畅销书榜一次性取回放在缓存中,而不必在每次访问时都去数据库读数据。

缓存需要代价,只有最常用的内容才可以放入缓存。很多现代程序,包括 Facebook,依靠一种叫做 Memcached 的分布式缓存系统,该系统是 Brad Firzpatrick 在工作于 LiveJournal 项目时开发的,Memcached 使用网络中空闲的内存资源建立缓存机制,Memcached 类库在很多流行编程语言,包括 Java 和 PHP 中都有。

5. 散列法(Hashing)

Hashing 的目的是加速访问速度。如果数据是序列存储的,从中查询一个项的时间取决于数据列的大小。而散列法对每一个项计算一个数字作为索引,在一个好的 Hashing 算法下,数据查找的速度是一样的。

除了存储数据,散列法对分布式系统也很重要。统一散列法(uniform hash )用来在云数据库环境下,在不同计算机之间分存数据。Google 的索引服务就是这种方法的体现,每一个 URL 都被散列分布到特定计算机。

散列函数非常复杂,但现代类库中都有现成的类,重要的是,如何对散列法进行细调以获得最好的性能。

4. 算法的复杂性 (Algorithmic Complexity)

关于算法的复杂性,软件工程师需要理解这样几件事。第一,大O标记法(big O notation);第二,你永远都不应该使用嵌套式循环(循环里面套循环),你应该使用 Hash 表,数组或单一循环;第三,如今优秀类库比比皆是,我们不必过分纠缠于这些库的效能的差别,我们以后还有机会进行细调;最后,不要忽视算法的优雅及性能,编写紧凑的,可读的代码可以让你的算法更简单,更干净。

3. 分层 (Layering)

用分层来讨论软件架构是最容易的。John Lakos 曾出版过一本关于大型 C++ 系统的书。Lakos 认为软件包含了层,书中介绍了层的概念,方法是,对每个软件组件,数一下它所依赖的组件数目就可以知道它的复杂程度。

Lakos 认为,一个好的软件拥有金字塔结构,就是说,软件组件拥有层层积累的复杂度,但每个组件本身必须简单,一个优秀的软件包含很多小的,可重复使用的模块,每个模块有自己的职责。一个好的系统中,组件之间的依赖性不可交叉,整个系统是各种各样的组件堆积起来,形成一个金字塔。

Lakos 在软件工程的很多方面都是先驱,最著名的是 Refactoring (代码重构)。代码重构指的是,在编程过程中需要不断地对代码进行改造以保证其结构的健壮与灵活。

2. 惯例与模板 (Conventions and Templates)

命名惯例和基础模板在编程模式中常被忽视,然而它可能是最强大的方法。命名惯例使软件自动化成为可能,如,Java Beans 框架在 getter 和 setter 方法中,使用简单的命名惯例。del.icio.us 网站的 URL 命名也使用统一的格式,如 http://del.icio.us/tag/software 会将用户带到所有标签为 software 的页。

很多社会网络均使用简单命名,如,你的名字是 johnsmith ,那你的头像可能命名为 johnsmith.jpg,而你的 rss 聚合文件的命名很可能是 johnsmith.xml 。

命名惯例还用于单元测试,如,JUnit 单元测试工具会辨认所有以 test 开头的类。

我们这里说的模板(templates )指的并不是 C++ 或 Java 语言中的 constructs,我们说的是一些包含变量的模板文件,用户可以替换变量并输出最终结果。

Cold Fusion 是最先使用模板的程序之一,后来,Java 使用 JSP 实现模板功能。Apache 近来为 Java 开发了非常好用的通用模板, Velocity。PHP 本身就是基于模板的,因为它支持 eval 函数。

1. 接口(Interfaces)

软件工程中最重要的概念是界面。任何软件都是一个真实系统的模型。如何使用简单的用户界面进行模型化至关重要。很多软件系统走这样的极端,缺乏抽象的冗长代码,或者过分设计而导致无谓的复杂。

在众多软件工程书籍中,Robert Martin 写的《敏捷编程》值得一读。

关于模型化,以下方法对你会有帮助。首先,去掉那些只有在将来才可能用得着的方法,代码越精练越好。第二,不要总认为以前的东西是对的,要善于改变。第三,要有耐心并享受过程。