2004年05月07日

http://psyco.sourceforge.net/  
Psyco is a Python extension module which can massively speed up the execution  
of any Python code. 

为什么是python?
专家有专家的想法,我说自己的体会

#1让我觉得程序员生活有趣
用C/C++变程是在无聊,为了完成任务,要做那么多不相干的事情,到头来还要关心内存泄漏,越界。有人说,“编程是对人心智的浪费”,此话不假。最近,我用python写了一些脚本,帮自己完成那些重复性的工作,看者滚动的屏幕,方才觉得自己是这个机子的主人。

#2让我觉得powerful
COM, corba, java还没有来得及涉足,C#,.net又来了,让人应接不暇。python改变了这一切,你可以用python做新技术的切入点,jython, Python.Net等等以及python强大的嵌入和被嵌入能力赋予你这些能力。Catch up the trend.

#3 free
这对待在大公司的人来说,实在是太重要了

#4 跨平台
Linux & Windows都是我的工作环境。Linux有很好console, windows下有很好的IDE

#5 打算用python做的事情
a. 我自己的super memo, 可以用来记录自己每天接触到的英语知识的工具
b. ”Weekly Report”自动生成工具,其实应该是一个programmer’s daily logger,在周末生成Weekly Report只是一个简单的功能而已

1。程序员的效率最重要
pc成本 < 软件成本(你知道clearcase有多贵吗?) < 程序员的人力成本
所以提高程序员的效率是关键

boss们常说,“stop ship”一天的损失,或者推迟一天SA成本很高,翻过来想,如果我们能提前SA呢?

2。我们都说了违心的话
boss说,最后一次“release”大家不许出bug,我说,微软的经验是改三个bug带来一个新的bug。老板很不爽,因为我是那个说“皇帝没有穿衣服”的小男孩。每一级老板可能都对上一级老板说了违心的话,所以大家活得都很累

3。“软件原型”很重要
我们做了很久,很累,到头来用户,UI设计人员说,这不是我们想要的。所以,一个原型是非常必要的,一个面向终端用户,开发周期有一年以上的产品,如果不能有原型去捕获真正的需求,那么整个开发其实非常危险。

4。XP的思想很重要
一个能适应变化,快速调整,及时推出的软件比什么都重要,现实生活中,over-disign和mis-design的软件何其多。什么是好的软件,没有废话的软件,适用的软件

5。“需求”能“lock down”吧?
依现在的经验,never!现在软件开发的挑战是,如何来适应这个变化的世界,而不是要世界来适应你自己

6。我需要加班么?
为什么?老板喜欢!有加班工资!
为什么不?你不必对一个单位产生强烈的依赖性,公司看重你的是你的不断学习和创新的能力,而这一般都是在8小时之外做的,所以,为了自己的将来,少一些被动而无奈的加班。
更重要的,工作不是你的全部。

现在编程序时,总会遇到”合法性”检查.真的是很头疼.
做吧,很繁琐,似乎又没有什么好处
不做吧,说不定什么时候来一个run-time error.
今天在写一个例程时,看到如下代码:
=================================
self.hour = 0     # 0-23
self.minute = 0   # 0-59
self.second = 0   # 0-59
=================================
(代码是python写的, ”#”表示注释)
让人头疼就是hour, minute, second的合法值域,这个代码算比较好的,还算有注释.但是问题,这个注释放在这里有什么用?!根本不能用于运行时的合法性检查.

数据库应用中在表格设计时有比较成熟的方案,但是在其他程序语言中我还没有见到来表达这种合法性约束的.DBC(Design By Contract)是一个途径,但是目前只有effel支持.主流语言还没有加入这个特性.合法性检查,说到底,并不是程序员作不了,而是不应该这样用”if then”去做.本来就是静态的语义.现在的办法真是很笨拙.

想起以前学函数时的情景,大家一半都把注意力放在”表达式”或者”映射关系”上,往往求出表达式便以为万事大吉了.每每此时,老师便跳出来当头一棒”定义域”呢?

是啊,没有关系式成立的条件,后面的一切都没有基础.

现在,这群孩子长大了,开始走入社会,部分去写程序了,他们还象当初一样,总是着眼于粗糙的逻辑解决方案,而往往忘掉了合法性问题.他们激动于”it works!”,可是客户其实更关心”it always works well!”. 老师当初的话还是继续有效的.

在主流程序设计语言还没有成熟的解决方案之前,我们还是得继续头疼一段时间,真是没有办法.

看了这篇文章,发现自己前一段时间做csv解析时的方法比较笨,用2.3中提供的标准方法能又快又好的做到.看来还是得及时更新自己得知识库,否则是抱着金砖要饭吃.

下面文章对2.3得新特点有比较全面得介绍,部分还有例子.总的来看,2.3版本不是一个里程碑式的版本,但是有很多小的特点上的改进,另外在性能上也有不小的提高
Python 2.3

另外,对于python关注的朋友可以参考一下ddj的python urllist.好处呢?这个列表每周更新一次最近一周python的相关信息,有文档,讨论,软件等等.而又不必频繁的被mailing list 打扰.

去年有一本书,英文名叫build for last,中文名应该是”基业长青”
这句话反映到软件上就是”复用”
虽然最初人们的理想”软件IC”看来是很难实现了,但是,”复用”的思想还是在我们的生活中时时处处体现着.

普遍的形式是copy+paste,然后修修改改.高档一点的形式是Net等基于二进制的复用.具体到我们个人,如果我们写代码的目标不是”能转就行”,那么我们应该瞄准”复用”,基于这个目标,我们思考软件的写法会有差异.

如果我们希望,自己的code能被别人以copy+paste的形式复用,那么至少因该清晰,简洁,有适当的注解.

如果我们希望自己的code能别人以类库的形式复用,那么应该保持接口的清晰,功能完整,并且各个接口测试充分.最好有相应的sample code.

至于各种各样的基于二进制上的复用,如unix下的small & sharp的工具理念和Net的想法,都需要具体的平台支持,已经超出个人所能干预的范围,这里就不说了

练武的人常说境界,编程也一样.
层次一:会用C++等OO语言编出面相对象的软件
层次二:能写出封装严谨,接口完善的类库,这是一个人说”我掌握了面相对象思想”的基本条件
层次三:理解Frame Work,能解析流行的Frame Work, 最好能写出MFC Lite和VCL Lite.候捷,3721的CEO据说都能做到这个层次.普通的人,能努力做到层次三就很不错了.
层次四:当然是设计Frame Work了. MFC, VCL, 以及Emacs的作者无疑都是具有这方面功力的人
更高的层次我目前还看不到,就不造次了.

只为了写出”能转”的程序,那么你只是以写程序谋生

能主动去写可以复用的软件,那么你有更高的精神追求.

如果说一个物的生命价值在于它所能惠及的范围和时间,那么,程序员,如果你珍惜自己的职业生涯的话,就请不断追求更高的”复用”层次吧.

By燭im燩eters?BR>
Beautiful爄s燽etter爐han爑gly.?BR>Explicit爄s燽etter爐han爄mplicit.?BR>Simple爄s燽etter爐han燾omplex.?BR>Complex爄s燽etter爐han燾omplicated.?BR>Flat爄s燽etter爐han爊ested.?BR>Sparse爄s燽etter爐han燿ense.?BR>Readability燾ounts.?BR>Special燾ases燼ren’t爏pecial爀nough爐o燽reak爐he爎ules.?BR>Although爌racticality燽eats爌urity.?BR>Errors爏hould爊ever爌ass爏ilently.?BR>Unless爀xplicitly爏ilenced.?BR>In爐he爁ace爋f燼mbiguity,爎efuse爐he爐emptation爐o爂uess.?BR>There爏hould燽e爋ne–燼nd爌referably爋nly爋ne?-obvious爓ay爐o燿o爄t.?BR>Although爐hat爓ay爉ay爊ot燽e爋bvious燼t爁irst爑nless爕ou’re燚utch.?BR>Now爄s燽etter爐han爊ever.?BR>Although爊ever爄s爋ften燽etter爐han?right*爊ow.?BR>If爐he爄mplementation爄s爃ard爐o爀xplain,爄t’s燼燽ad爄dea.?BR>If爐he爄mplementation爄s爀asy爐o爀xplain,爄t爉ay燽e燼爂ood爄dea.?BR>Namespaces燼re爋ne爃onking爂reat爄dea?-爈et’s燿o爉ore爋f爐hose!

+++++++++++++++++++++++++++++++++++++++
程序员的credit(1)——何谓credit
+++++++++++++++++++++++++++++++++++++++
By ZhangHui


credit可以理解为”信用”,但又不止于此,它还包含又周围的人对你能力,特点的认同和其他看法。以前看一本有关微软的书,里面就讲到一个程序员应该有意识的建立自己在团队的credit。让其他人信任你,认同你,能交给一些有价值的事情。


当然,有好的“credit”也必然有坏的“credit”。谁都不愿意背上“bug制造者”的恶名,但事实上每个团队都有这样的人。一传十,十传百,你就建立了很不好的印象。


如果你一辈子只想老老实实的在公司里当一个程序员,那就就应到小心翼翼的逐步建立自己良好的credit。这是保证你在公司生存的哲学。个人的待遇,机会并不是总随着年龄的增长而增长,相对应,当一个人能不断增加自己好的credit时,那么增长是自然而然的事情。


典型的credit如下:
好的:
1。他的代码很少出bug
2。他总能接受挑战,承担难的任务
3。他的交流能力很好
4。他很善于学习,能学以致用
。。。


坏的:
1。他总是出bug
2。他的代码写的实在是太糟糕了
3。他做事的方法不对,总是事倍功半
4。他不能虚心听取意见
5。他总是挑活,而分给他的任务却总是做不好
。。。


你可以自我评价一下,看自己的credit是什么,好的多还是坏的多。credit的建立是长期的,渐进的。但是如果你能有意识的注意这一点,或许还能做的更好。当然,这建立在认真的基础上,如果你只想做一些表面文章,那么你只会更累,弄巧成拙。



+++++++++++++++++++++++++++++++++++++++
程序员的credit(2)——同事之间
+++++++++++++++++++++++++++++++++++++++


你可能认为,所谓的评价都是平面的,千篇一律,走过场的。但事实上,现在的公司,无论大小,在评价人这一点上都比较认真。有硬性的,量化的指标;也有软行的,感性的东西。说句实话,你和一个待久了,对这个人自然就有了认识。这点很容易理解。


公司里,具体到一个团队里,credit的评价有两个层次,一个是在同等的同事之间,一种是manager对你的评价。


前者是自发的,偶然的,之多影响你和某些同事之间交流的进展。抛开竞争关系不谈,基于这种同事之间的credit,很能影响
“哪些人经常在一起”
“他们经常讨论什么事情”
“谁经常会向谁求助”


后者呢,是自觉的,经常性的。因为现在无论是team leader还是manager,他们的一个重要角色就是做下级员工绩效的评价者。你在他心中的credit直接影响了他对你的重视,培养程度。这些credit会影响到
“他会不会给你机会”
“他是否能把重要的事情交给你”等等
至于待遇上的变迁,那只是结果,不在讨论之列。


+++++++++++++++++++++++++++++++++++++++
程序员的credit(3)——特立独行
+++++++++++++++++++++++++++++++++++++++


人是有区别的,相互差异的。在公司的credit也是如此。除了满足公司的基本标准,尤其应该注意个人特点的培养。你与他人不同之处,会在你的credit重占据很大的成分。因为人们总是习惯于从差异入手去记住一个人,评价一个人。


“他特别有创造性”
“他总能解决难题”


如果你的credit中能有其中一项,那么恭喜你,你有了不错的根基。以我的经验,这种差异性的建立,保持和增强,可能在最初都是不经意的。但是随着时间的推移,随着一些有意无意的阻力的产生,要把这点保持下去,还是需要自觉的认识,坚定的信心。


我的习惯是,把自己感兴趣的一些资料发到邮件列表上,记忆很深的是,有一次的邮件引起了leader的重视,后来我就有了一个不错的机会-“做不同的事情,做别人没有做过的事情”。几个月后,这个“难题”解决了。在这个过程中,我得到的是更多经验,更多的机会。所以,事后我总会想,如果我没有这个与大家“share”的习惯呢。如果我没有发那封信呢?要知道,在一个大的团队中,要获得一个好评价是不难的,但是要获得一个不同于他人的评价是很难的。想起以前看过的一句话-“一个人的特点决定了他的机遇”,此言诚哉!


当然,后来总有人,有意无意的跑到我这里抱怨,说那些信是垃圾邮件,说他们看不懂。我能说什么?其实那不能怪我,因为邮件这种share方式本来就有问题。当让,后来我也注意尽可能把信发给可能关心这个问题的人。而这个习惯呢,还是要坚持。


通过这件事情说明,一个人,一定要破处阻力,自觉有效的培养自己的特点。如果别人一想到你,就想到这些特点,那么你还怕没有机会吗?



+++++++++++++++++++++++++++++++++++++++
程序员的credit(4)——把信交给加西亚
+++++++++++++++++++++++++++++++++++++++



把信交给加西亚--现在是一本很流行的小书。知道这个书,是2000年毕业后在华为培训的时候。不知为什么,3年后,社会上才开始流行这本书。


我没有看过整本书,但我知道大概的情节。其实每个公司都希望自己的职员具有这种精神,危难时刻,挺身而出;克服困难,完成任务。


知易行难,说道里大家都明白,但是一旦遇到问题,更多的是推诿和抱怨。所以我们的manager经常挂在嘴边的一句话是“我不想知道是谁的问题,我只想知道谁能解决问题!”所以说,在混乱而艰难的情况下,如果你能挺身而出,那么你的credit中会留下重重的一笔财富。


当然,就我的理解,把信交给加西亚的故事中,至少包含了两方面的意思:一是关键时刻要挺身而出;二是一定要负责到底,完成任务。


需要“挺身而出”的机会实在是少,但是需要你负责到底的时候却非常多。“对自己的任务有责任心”,“能把简单的事情做好”是每个程序员的基本素质。


无论你的credit有多好,你都不能失去”负责任”这一条。
无论你的credit有多差,你至少要有“负责任”这一条。



+++++++++++++++++++++++++++++++++++++++
程序员的credit(5)--更广阔的职业空间
+++++++++++++++++++++++++++++++++++++++



前面讲的都是credit在公司内部的一些体现。其实对大多数程序员来说,credit还有着更深刻,更广泛的含义。


公司,无论多大,毕竟只是一个小小的空间。这种说法有两个原因:
一。你可能会不断的换工作,但是你的兴趣却能一直保持下去。
二。公司里和你做类似的事情,有类似兴趣的人不会太多


所以,对程序员来说,“社区”才是更广阔的空间。职业策划,培养的重要步骤就是在社区建立自己的credit。举几个例子:
“候捷”,大家马上会想到C++方面的一些精品书。大陆程序员书籍有“精品”概念,当始于此君。还有一些比较知名的ID 如“gigix”“梦魇”等等。姑且不论人(我不喜欢评价人),但就名而言,在我们这个社区还算比较知名。
另外,就news group,mailling list而言,每个社区都有些知名人士。有些人好斗,有些人乐于助人,有些人知识渊博。我们现在看到的一些著名的“programmer to programmer”的书籍,很多就缘起于这些纷繁的社区。


建立,培养,壮大自己在某些社区的credit,就是为自己将来的职业生涯进行最好的拓展。随着你的良好的credit的建立,你就能的接触更多的人,做更深的交流,承担更多的责任,从而在各方面得以进步。



+++++++++++++++++++++++++++++++++++++++
程序员的credit(6)--如何建立自己的社区credit
+++++++++++++++++++++++++++++++++++++++


1。找一个好的ID,或者实名。那种随便的ID或者有很多人都用的ID最好不要选
2。始终用这个ID去做事情
3。及早的确立自己的兴趣范围。围绕这个范围核心去做事情,最终建立自己的专长。
4。做积极的参与者,贡献者。不一定是非得写出emacs这样的软件的人才能为社区做贡献。回答一些问题。参与一些讨论,提交一个小的但却有用的软件。这些都是积极的贡献之道
5。少说废话。其实是想说,多做精品。可是造化弄人,精品注定难做,所以想多也不行。据说C++的作者一年只写5篇文章,可谓惜墨如金,但是每篇都是精品
6。建立自己的个人主页。这是你在社区真正的家
7。多做一些原创,稍一些翻译,更少一些转载。程序员应该习惯用英语,所以要稍一些翻译。至于转载,因为现在有google,所以,转载自身的价值很小。大家一般都只能记住原作者。而且,如果你的文档列表中都是“转载”和“翻译”,那么人们对你自身能力的认同度就小
8。练习写作。程序员应该经常用清晰简洁的语言去发表观点。所谓credit,大多数时候都是通过写来建立和表达的
9。练习写软件,从小的做起。贡献出去,并完善它



+++++++++++++++++++++++++++++++++++++++
程序员的credit(7)——专注的力量
+++++++++++++++++++++++++++++++++++++++


在建立credit的方面,个人主页起了非常大的作用,在我印象较深的个人主页有如下几个(国内的)


程序员小辉的主页
候捷的主页
zhuyi的主页(hi-pda.com)


统一的印象就是“专一”,由专及精,由精而深。从而树立了他们鲜明的形象。这都是成功树立credit的典型。


记得毕业前找工作时,看到的简历都是千篇一律“精通VC++,VB,Java”。那是缺乏credit的,因为写这样简历的人根本还没有自知之明。工作几年后,在找工作时,便会老老实实的写上自己做过什么项目,写过什么软件。这时,你的credit就相对提升了。因为你在用事实证明自己的能力。


当然,如果你能自觉的认识的建立credit的重要。注意道专注对于建立credit的重要性,那么恭喜你,你已经走上正途!

今天早晨有个朋友向我请教有关学习VC的资料。回答完这位朋友后,我还有话要说。
以前用过一段时间MFC,现在又在Linux平台下工作,所以对”VC”这个名称,比较敏感,今天简单解剖一下。

我的理解,VC是一个专有的IDE
所谓IDE,就是一个编辑器+调试器+代码管理工具等等。
以前有些所谓的VC高手,不过是IDE用得比较熟吧。

说他专有,在于
1。语言:C/C++
2。Framework:MFC

另外,因为都是基于WIN32API上的,所有用的是通用的Windows开发的SDK。

所以,从IDE环境,C++语言,MFC framework,Windows SDK几个层次,几个方面去理解VC这个词要更好一些。

初学VC,首先熟悉IDE,然后深入理解一下MFC就可以了。

差距在根上,现在看新的语言,看新的系统不断涌现,容易陷入焦虑。其实这些新概念的技术根源,都可以追究到操作系统,编译原理。

所以说,如果说最近一段时间可以用来学习,那么我宁愿重新学一遍基础。当然,不是重复原路,而是做实际的project。

无论是耳闻还是目睹,我都知道,国外讲授os之类的课程,从来不会只念课本。都是有一定的项目实践,而亲身体会,总会让你脱去浮华,深入下去,从而受益良多。

2001年的时候,我关注过一段时间国外在这方面的project,看到几个有意思的用C,C++,Java开发的小型教学用os。minix的初衷也是教学,但是实践起来还是太庞大了。所以当时就有冲动想给以前的老师,系主任写信说出这方面的想法,希望在校的学生也能参与进来,而不是仅仅背一下概念就能考个高分。后来因为种种原因,这个想法没有实现。

现在,因为是一个再学习的机会,看到选课单上那些新名词,那些时髦的东西,不禁暗想,为什么我们不重拾一下基础呢?

对于软件行业的学生,如果能做一个virtual machine的项目,在上面再加上os层,然后是语言和编译原理,哪怕是一个简单的p-code也好。那么他对整个系统把握的程度就足够好了。基础好了,做一切都就游刃有余。

大学里如果有这一个系列的实践,那么你的起点就远远高出同侪!

virtual machine——《程序员》杂志就用两期实现了一个简单的虚拟机,有了这个功底,将来你分析jvm就有了很好的起点,想想看,别人还在争论语言语法的特点,你却已然从实现的角度理解了这个语言本身,你们的层次有多么大的区别!

operating system —— minix用于教学好像还是太大了,实践点不多。国外大学的几个项目是RCOS,该项目有C++版和Java版(Java版我下过,挺好玩,把进程调度,资源使用用动态的图示演示出来,而且有一个简单的语言,可以协议些进程间通信的小程序)。更流行的是NACHOS,任务管理,内存管理等从理论的全局,从框架上都要理解,实践上,自己时间有限的话写一个任务调度或者内存分配就可以了。

程序语言和编译原理——其实上面的两个项目都涵盖了,基本的要求就是要懂得lex和yacc,能够构筑实现基本要求的解释型小语言就行。

无论是borland还是microsoft,商家的东西总是显得很复杂,不是你学习写入的地方。在试图理解复杂问题之前,好习惯是先去真正理解一个简单的系统,学习真正实质性的东西。

《程序员》杂志有一期试图讨论程序员为什么焦虑?依我看焦虑是因为程序员被众商家的纷繁概念迷住了眼睛,而且国内的大学教育的确没有真正把那些核心的东西教给学生。一个人,没有根,风吹草动,怎么能安心呢?

Jvm,Web Service,EJB都是有根的,你不从根上去找问题,去理解,怎么能不难受呢?

所以,我宁愿重拾基础!以实践来真正引导自己的学习

一些相关的链接
Technical Resources and Course Web Site for Operating Systems, Fourth Edition
NACHOS
RCOSjava
rcos