摘录-软件行者


软件行者

胡健
2006年4月15日

当年曾熟读毛主席的光辉著作“实践论”,毛主席教导我们,对事物的认识是“由浅入深,由片面到更多的方面”的,要经过一番“去粗取精、去伪存真、由此及彼、由表及里”的功夫的,“实践、认识、再实践、再认识,这种形式,循环往复以至无穷”,是辩证唯物论的知行统一观。回顾这些年软件技术的发展似乎是循着这条路在走。大概主要原因是因为软件领域,或更广泛一些说,计算机领域中学术界和工业界的关系和其他领域不同。一般来说,学术界是更富于创新的。但在软件技术领域,例如,在面向对象技术领域,过去10多年来几乎所有的创新都是来自工业界。作为软件从业者,必须力行实践。同时,软件技术日新月异、五花八门,软件从业者还必须要活到老、学到老,否则真是会被时代淘汰(或曰饭碗不保)。

孔夫子提出的“博学之、审问之、慎思之、明辨之、笃行之”,似乎特别适合软件开发实践。从本人的经历来看,每参加一个新项目,都是一个“学、问、思、辨、行”的“迭代”过程。学习新的知识和技术,叩问业务专家和用户,思考业务需求在技术上的可行性,辨析不同方案的适用范围,当然最后是施行落实。

这里“博学之”,不仅是要广泛学习新的软件技术,同时也是要广泛学习应用领域知识。最切实际的方法当然是在干中学。曾是毛主席的亲密战友,后来又被裁定是孔老二的孝子贤孙的林副主席在“毛主席语录”的前言中写到:“学习毛主席著作要带着问题学,活学活用,学用结合,急用先学,立杆见影”。把“毛主席著作”换成软件技术与应用领域知识,林副主席的教诲倒也是在软件实践中的一种有效的学习方法。

强调在实践中学习,并非就是说在学校学习基础知识不重要。恰恰相反,不管软件技术如何发展,有些最基础的东西,如数理逻辑、模块化设计、以及抽象与信息隐藏等原理却是不变的(至少为本人的经历所证实)。同时,也要看到一个研究者和实践者的工作性质不同。作为一个学者/研究者,在做学术性较强的题目时,一般来说可以有时间进行充分、严密的推演。而实践应用中出现的问题则很有可能是零散的、具体的。问题如何解决常常是需要在很多的限制条件(如时间、资源限制)作出即时而有效的(也许理论上不是最佳的)决定。这取决于理论知识的拥有和理解,更取决于实践经验的积累。

本人多年一直从事软件开发工作,深感作为一个称职的软件从业者,既要有坚实的理论素养和广博的知识,更需要在实践中培养正确地应用理论知识、不断地总结提高的能力。不仅要是一个善学者,更需是个力行者。所以,有此网站域名SoftwarePractitioner.org,而中文名之“软件行者”。


核心问题

胡健
2006年5月13日

中国的新民主主义革命之所以能取得成功,一个很重要的原因正如毛主席指出的是有一个“领导我们事业的核心力量”。看来一项事业是否能兴旺发达,关键是要有一个核心力量。中国的软件业如何兴旺发达,众说纷纭。但有一点似乎是共识,那就是要有自己的核心技术。那么什么是软件的核心技术呢?本人在网上用“软件核心技术”搜索了一番,从搜得的网页来看,软件核心技术似乎主要是指一些通用系统软件的生产技术,典型的象:操作系统,数据库,中间件,也有观点认为还应该包括编译系统。

从这点核心往外推,有些产品是针对一个特定的行业,如通讯、银行、零售等。生产这些产品,除了一般的软件技术而外,还需要这个某个行业的专业知识。也许这类产品的生产,需要“偏心”技术吧。

再往外推,大概应该是专用系统了,用户根据自己的需要而量身订做的,这可以通过自己的IT部门来开发(所谓的in-house开发),也可以通过发包给专业的IT服务公司来开发。本人最近这些年做过一点in-house开发,大部分时间还是在IT服务公司,参加的项目是给不同行业的客户设计开发应用系统。这类系统开发,既非核心,也非偏心,只能是“无心”了。在有个IT服务公司工作时,有次一个高级经理作简报,提到和IBM在有些项目上竞标,他说我们的优势之一便是我们是完全独立的服务商,所以在给客户选择软件产品时是非常客观无偏向的(言下之意是说象IBM有自己的产品,所以在为客户选择产品时很难做到无偏向)。如此一说,倒是不以无核心技术而心虚,反以无核心技术而气壮了。

前些时候和一个朋友电话聊天,此君曾在国内成功地经营过IT集成企业。聊天时,我提起我关于“核心技术”的困惑,朋友认为,象这些老牌的IT服务商,以及象目前很多印度的软件外包商,之所以成功,不是因为所谓的“核心技术”,而是 因为企业具备复杂系统的设计与建造能力,拥有相关行业的业务专门知识和行业专家,以及有效的管理方法,这些就是企业之所以成功的“核心竞争力”。真是一语点醒梦中人,本人顿时一扫因为手上没有核心技术而带来的惶惶不可终日之感。回头想想,我曾工作过的两个IT服务公司在英国都有七八千人的规模,可以算是很大的企业了,经几十年发展壮大,一个重要的原因的确是因为有自己的核心竞争力,有为客户作好系统的独到手艺,看来还是老话说得好:“天干饿不死手艺人”。


软硬兼施

胡健
2006年4月29日

这几年敏捷软件开发运动,非常强调人的作用,提出开发过程应该“以人为本”,应该充分相信群众(开发人员)。那么,从另外一方面看,开发人员应该具备什么样的素质才值得充分相信和依靠呢?

首先,开发人员必须具有合格的技术能力,这包括严密的逻辑思维能力,对基础概念如软件设计原则的深入理解,对编程语言与工具的熟练掌握和运用,等等,这些可以归为开发人员的硬技能。所谓“练就一身过硬本领”,大概就是指这些硬技能吧。

软件开发中,开发人员光有硬技能还是远远不够的。因为现代的软件开发是一种群体活动,开发人员需要和其他开发人员,和业务人员,和用户,以及和项目经理等打交道,交流沟通当是开发人员的首要软技能。Alistair Cockburn在“Agile Software Development”一书中注意到,开发人员其实喜欢和同事谈论他们的程序、探究更好的设计方案来解决一个问题。而现在应该更进一步让他们从和程序员讨论程序方面的问题扩展到和业务人员及用户讨论业务方面的问题。Cockburn更进一步提出程序员应该是交流沟通的专才(“Programmers as communication specialists”)。

首先是口头交流。不要怕被别人觉得自己不懂,没有人什么都懂。特别是和业务人员和用户讨论时,要发扬无知者无畏的精神。其实,反过来说,和别人交流讨论时,认真倾听,及时发问以澄清自己的理解,适时说出自己的看法,这其实是展现自己的学习能力,思维能力和表达能力的一个机会。所以,当说不说,当问不问,是不可不戒的。

其次是书面交流,这不是要求能长篇大论地写论文、写报告(如有此能力当然最好)。

作为软件开发人员,主要是在作需求“分析”时,把与同事,或业务人员,或用户讨论的内容,清晰的记录下来,把自己的理解、假设等清楚地表达出来。这不是要“口说无凭,立此为据”,更不是“一字入公门,九牛拨不转”(软件开发中,不要九牛,只要用户动动手指头,千百字就可能被拨得稀里哗啦)。书面的东西主要是为了避免口头交流的模糊性和易失性。

还有,作为开发人员,还得需要写设计或实现文档,要陈述作出一个设计方案的理由,如一些因素的平衡(尽管这个设计可能很小,如在OO系统中,可能只是几个类的设计与实现)。所以,懒得写字,只想编码,也是不可不戒的。

作为团队的一分子,要努力帮助营造团队的一堂和气。另一方面,“君子和而不同”,要能容纳别人与自己的不同,也要敢于表达自己的不同意见。要团结同事,特别是“历史上反对过自己并反对错了的”(当然也应包括反对过自己而反对对了的)。“三人行,必有吾师焉”,要善于向同事学习,除了知识技能,还有好的思维方法和工作习惯。孤芳自赏,或全无主见,都是不可不戒的。

软件开发项目中,可能经常都处在压力之下,作为开发人员,应该在平时就要注意情绪调节,保持良好的心境。特别是项目要赶期限时,一级压一级,一直压到编程的。客户虎吼狼嚎,经理额烂头焦,处处鸡飞狗跳,人人气浮心躁。这时更要控制自己的情绪,要有“死猪不怕开水烫”的气度。情绪失控,“怒从心头起,恶向胆边生”,那更是“理所当然,不可不戒”的。






你可能感兴趣的:(摘录-软件行者)