《软件工艺师:专业、务实、自豪》一3.7.6 《软件工艺宣言》及讲解-阿里云开发者社区

开发者社区> 华章出版社> 正文

《软件工艺师:专业、务实、自豪》一3.7.6 《软件工艺宣言》及讲解

简介: 本节书摘来华章计算机《软件工艺师:专业、务实、自豪》一书中的第3章 ,第3.7.6节,[英]桑德罗·曼卡索(Sandro Mancuso)著 爱飞翔 译, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

本节书摘来华章计算机《软件工艺师:专业、务实、自豪》一书中的第3章 ,第3.7.6节,[英]桑德罗·曼卡索(Sandro Mancuso)著 爱飞翔 译, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.7.6 《软件工艺宣言》及讲解

我们是有理想的软件工艺师,立志践行软件工艺并帮助他人学习软件工艺,以提升软件开发的专业水准。在此过程中,我们形成如下理念:
不仅要开发出可行的软件,还要做工精良。
不仅要应对变化,还要持续提升软件价值。
不仅要注重个体与交互,还要打造专业的社团。
不仅要注重客户协作,还要培养高效的伙伴关系。
也就是说,在追求左侧价值的同时,我们也认为右侧那些价值是不容忽视的。
软件工艺的实质就体现在宣言里“提升专业水准”这一表述之中。有一群经验丰富且才华卓越的开发者,他们根据自己提倡的价值、遇到的挫折,以及所持理念,总结出了这份宣言。他们不想再看到项目因管理不善或流程不合理而失败,当然更不想看到项目因为质量低劣的代码而垮掉。
开发者正在逐渐掌控编程工作,并试图改变业界对软件开发的看法。他们不仅提出新颖的流程,还向客户展现自己对软件开发工作的珍视。开发者愿意与客户一起工作,以开发出优秀而长效的软件,并帮助客户获得真正符合其需求的产品。
不仅要开发出可行的软件,还要做工精良
比方说有个运行了五年的程序。没有人针对它写过测试,也没有人准确掌握它的工作原理,代码里全都是底层技术用语,没有包含业务领域里的概念,类和方法的代码就算没有上千行,也至少有几百行。现在,你需要修改这个程序,但是编写测试的工作量实在太大了。你当然会想着和团队中的其他开发者结对编程,但是很抱歉,根本就没有开发团队,所谓的团队只有你一个人。写这个程序的开发者都离职了,你是一位几周前才入职的毕业生,现在只有你一个人负责这个程序。
处理这种应用程序时,主要的问题就是恐惧。笔者并不是说你是胆小鬼。笔者只是想说,作为一个负责任的开发者,你一定知道把这种代码改错了会带来什么后果。你不敢碰这份代码,因为你根本不懂它的原理,你也没法确定自己不会出错。
这款应用程序确实是一款可以运行的软件,但是它好吗?所谓做工精良,就是说,无论应用程序有多旧,开发者都能轻易理解其原理;程序的副所用都在明确掌控之中;测试用例的覆盖度很高,测试代码也写得比较可靠,程序的设计清晰而简洁,业务逻辑也都很好地表述在代码之中。尽管现在的代码量比项目刚开始的时候要大,但为这样的程序添加新功能,或修改其现有功能,所花的时间不会比原来更长。
代码必须可维护,其行为也必须可预知。开发者必须知道修改某部分代码所产生的后果,这样一来,他们就不用再担心会把什么地方改错了。修改代码所带来的影响应该是小范围的,不会牵动应用程序其他部分,也就是说,不会产生连锁反应(ripple effect)。只需按下按钮,等待几秒或几分钟时间,整个程序就可以测试完,并得知刚才修改的那部分代码会不会令程序出错。
为了完善程序,开发者必须敢于修改代码。以测试驱动的方式来开发程序,令设计保持简洁,并把业务语言表述在代码之中,可以最好地保持代码的整洁与精良。
不仅要应对变化,还要持续提升软件价值
大家有没有想过软件项目的开销到底有多大?首先得考虑参与项目的开发者,其次要考虑项目内的其他专业人员,比如测试者、产品服务员、操作员、业务分析师、产品所有者、项目经理等。此外还有销售人员、市场人员、后勤人员等等。光这些人的工资就不是个小数目。接下来,加上购买电脑和设备的花费、通信费、办公室租金、市场费用、销售费用、客户服务费用、伙食费、保洁费和其他费用。没错,这些当然都要算进去。在这些费用的基础上,还得考虑因分布式团队和分布式办公而引发的差旅费,以及由此而生的其他费用。
软件项目的投资一般都比较大,而且与普通的投资项目一样,公司也需要从中获得回报。公司之所以会投资软件项目,为的就是赚钱、省钱或保持营收。明白了这一点之后,开发者就该想方设法为公司达成这一目标。
所谓持续提升软件价值,不仅是指添加新功能和修复bug。它也包括持续改善代码结构,令代码整洁、易于扩展、易于测试,并易于维护。
软件工艺师应该保证:软件做得越久、做得越大,公司从中获得的收益就越多。在项目中添加新功能或修改现有功能的速度,应该和项目创设之初一样迅捷。这样一来,无论软件有多老,公司都能够快速应对市场变化。持续时间越长的软件,应该越有价值才对,这种软件不应该带来麻烦,也不应该持续耗费公司的资金。
延长软件的使用期,保持快速变更的能力——这就是软件工艺师的主要任务。完成这项任务要有良好的软件设计能力,要有编写自动化测试的技能,同时也要成为热情而有才华的开发者。
童子军(Boy Scout)有条纪律:离开营地时,应该把它打扫得比来时更干净。Bob大叔最先把这条纪律套用到软件开发上面,那就是:修改完代码时,应该把它整理得比修改前更干净。
要想编写能够持久运行的程序,必须首先关注软件质量。大型程序在开发出来几年之后,又重写一遍,这是相当不划算的。许多时候,决定重写程序的原因在于,继续维护下去的代价实在太高了。
反复做同一件事,却盼着能有不同的结果,这是精神错乱的表现。
——阿尔伯特·爱因斯坦
写程序时也是这样,如果还用原来那套糟糕的技术去写新的程序,那写出来的程序在几个月或几年之后又会变得和老程序一样差。现在要打破这种恶性循环,用精良的代码来构建应用程序。
不仅要注重个体与交互,还要打造专业的社团
分享并传授知识是软件工艺的核心理念之一。软件工艺师总是饱含热情,并力求上进。然而,软件工艺师还有一项更重大的任务,那就是培养下一批软件工艺师。
令业界持续进步的绝佳方式,就是在培养并鼓励初级开发者的时候分享知识。这也和“学徒”“熟练工”及“师傅”等概念有关,一位软件工艺师会督导学徒并帮助他们掌握软件工艺理念。为了推动业界持续向前发展,软件工艺师应该在社团里分享知识和想法,并探讨自己所经历的成功与失败。
某些开发者和敏捷教练说,软件工艺社团应该是由一群顶尖开发者自我组织的小圈子,这让我十分惊讶。如果某位开发者觉得软件工艺只是顶尖高手才能掌握的理念,如果某位开发者不够谦虚,不善于学习他人的优点,或不愿意与初级开发者分享知识并培养他们的技能,那么这位开发者不是软件工艺师。从笔者的个人经验来看,软件工艺社团应该是极为开放和友好的社团。从本质上来说,它是和语言无关的,而且应该接纳所有开发者,无论其资历与技术水平如何。
目前为止,相互学习是提升开发者水平的最佳方式。撰写博客文章、为开源项目做贡献、公开发布代码、参与本地社团、与其他开发者结对编程——这些都是促进软件行业发展的好办法。
从2010年起,欧洲和美国出现了很多软件工艺社团,它们每月都会组织一些自由开放的活动。此类活动欢迎各种技术背景、各种行业、各种水平的开发者参加。这些社团提倡创建一种开发者可以当面交流想法并且能够坐下来一起写代码的氛围。
宣言里的这一条不仅针对外部社团,还包括平常的工作环境。优秀的开发者总是想和其他同样优秀的人在一起工作,想在优秀的公司里工作,想和能够提升自己水平人一起工作,想和愿意分享并学习他人优点的人一起工作。这些人不仅仅是同事,还是朋友——彼此都是热情而有理想的专业人员。
不仅要注重客户协作,还要培养高效的伙伴关系
笔者首先要说的是,单纯的雇主/雇员关系在此不宜提倡。合同上面会规定你是一位正式雇员或承包商,顾问或生产商,或是一位按天、按小时或按月领取薪水的员工,等等,但这些都是公式化的条款。这里首先需要建立的是一种伙伴关系,是一种专业化的工作风格。如果你是一位正式雇员,那么应该把雇主当成客户对待,如果你是一位承包商或顾问,那么也应该这样对待雇主。而雇主这一方则要尊重自己的雇员,随时为他们提供良好的服务,对承包商或顾问也应该如此。专业的开发者不应该是那种每天只顾按时上班、埋头工作,并按指令办事的人。
软件工艺师不是工厂工人。软件工艺师想积极参与项目并帮助其成功,想对需求提出质疑、理解业务、提出改进方案,也想与客户或雇主更有效率地合作。这与传统的雇主/雇员模式是不同的,这种方法对雇主来说好处更多。积极性高的团队更有可能顺利完成项目。热情而有才能的开发者总是渴望成功,而且总是能找到克服困难并绕开繁琐规章制度的办法。
软件工艺师需要也想要以成功的项目来提升自己的名望,希望因自己的成就而自豪。交付高质量的软件并令客户满意,这对软件工艺师的职业生涯来说尤为重要。
把代码写好是特别关键的技能,然而它只是项目得以成功的因素之一。此外,还要帮助客户改进流程,为他们提供多种可行的方案,帮助他们删减毫无必要的规定,理解他们的业务领域,考虑他们所提出的需求是否真能提升软件产品的价值,给他们提供准确的信息和知识,帮助他们规划各项任务,帮助他们设定各任务的优先级,并参与那些虽与编码无关,但却对项目很重要的事务。所谓“建立高效的伙伴关系”,意思就是要给客户提供全方位的增值服务。
许多客户的核心业务并不是做软件,所以软件工艺师应该帮他们尽量把软件项目运作得好一些。这样才对得起自己所领的这份薪酬。有些开发者认为,凡是与代码无关的事就不用操心,这样的开发者不是真正的软件工艺师。
某些客户尚未准备与开发者建立高效的伙伴关系
遗憾的是,某些公司还没有准备好扮演这种角色。他们依然把软件开发视为一道生产工序,并把它当成整个项目里面无关轻重的一部分。对于某些公司来说,软件开发者就和流水线工人一样,只管服从聪明人的指挥就行。
在这一类公司之中,某些公司专门雇用一批薪水很低的开发者,并且总是找一些非技术出身的管理人员,对这些开发者进行事无巨细的监督。某些公司做业务决策时不欢迎开发者参与,或者不听取开发者的建议。还有些公司会雇用一位开发技能早已过时的技术主管,或者请这样一个人过来对开发者发号施令。
在这样一种企业文化之下,软件工艺师很难在公司里发挥效用。软件工艺师应该尽力改变这种情况,并向客户证明:只要有充分的发挥空间,开发者就能为公司做出更大贡献。
然而,正如公司需要优秀的开发者一样,软件工艺师也想在优秀的公司上班,而不想把所有精力都消耗在那些不肯接受帮助的公司上。为了帮助客户而付出的精力是有限度的。善于选择客户或雇主也是软件工艺师的一项重要能力。如果客户对软件工艺师的技能不感兴趣,或者觉得那些技能没什么价值,那么为这样的客户工作就没有意义了。
软件工艺师要想提升自己的名望并在职业生涯中取得进步,就得谨慎选择客户。伙伴关系实际上是双向的。对双方都有益的伙伴关系才是良好的伙伴关系。如果你觉得与某位客户合作对你没有好处,那恐怕就该另寻客户了。
《软件工艺宣言》的问题
《软件工艺宣言》遭到了相当多的批评。与《敏捷软件开发宣言》不同,其中一个主要问题是《软件工艺宣言》中所提倡的理念几乎不可能遭到反对。在《敏捷软件开发宣言》中,左边那组价值与右边那组价值形成了强烈反差,这清晰地指明了宣言所提倡的理念。非常重视编撰开发文档的人,基本上很难完全接受“可行的软件重于完备的文档”这一说法。习惯了固定价格和详尽合约的公司基本上也很难认同“客户协作重于合约洽谈”这一理念。而在《软件工艺宣言》中,左边那组价值与右边那组价值之间却没有强烈反差。右边那些价值只不过是对左边那些价值的推进。如果某人认为“可行的软件重于完备的文档”,那他肯定不会反对这款可行的软件应该“做工精良”。已经接受“客户协作重于合约洽谈”这一理念的公司,也不会反对建立“高效的伙伴关系”。
这种意见很有道理。笔者也觉得赞同敏捷软件开发理念的人不太可能反对《软件工艺宣言》中的话。然而,如果这些人都不反对《软件工艺宣言》,那么就有理由相信,赞同敏捷开发的人,也同样会赞同软件工艺所提倡的理念。果真如此,那就应该反思一下平常的做法是不是真的符合宣言中的话。你真的做到自己所赞同的那些要求了吗?
笔者认为,不应该只把宣言看成一系列条文,而是应该深入并全面地理解它。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:

华章出版社

官方博客
官网链接