软件开发的那些事
2011-03-03 10:19:59 阿炯

想成为一名优秀的软件开发人员需要很长时间的培训和实践。但是如果不遵循合适的原则,即便是再好的程序员也会成为失败的牺牲品。不经意间你就会养成一些可怕的坏习惯,它们可能会一而再再而三地出现,甚至对于经验最为丰富的程序员而言也是如此。我认为软件开发至少存在七宗罪。那么,就请看看欲望、暴食、贪婪、懒惰、愤怒、嫉妒和骄傲会为你的最新编程项目带来哪些意想不到的损失吧。

程序员七宗罪



软件开发七宗罪,你有几条?

软件开发第一宗罪:欲望(过度设计)

现代编程语言趋向于不断增加更新的功能让其臻于成熟。程序员们一层一层地往上堆叠抽象的代码,用新设计的关键字和结构来增加代码的可读性和可重用性——只要你肯花时间去学习如何正确地使用它们。
与此同时,编程的原则在这些年里有所改变。今天,你可以饱览到成千上万的设计方案和模式,而且每几个月就会有人想出新的开发方案。此外,开发人员总是信誓旦旦地宣称这些开发方案会让你成为程序员中们眼中的佼佼者。

但是纸上谈兵往往不见得在实际操作中奏效,这个道理很简单,打个比方来说就是你可以去做某些事情但是并不意味着你应该去这么做。就像编程大师Joel Spolsky所说的,那些盲目迷恋自己工具的程序员们都不可避免地忽略了这一点,甚至于最简单的项目也可能葬送进开发的地狱。所以,必须抵制这种不可取的冲动,那么首先要做到的就是坚持你最初的设计方案。

软件开发第二宗罪:暴食(不进行重构)

没有比开发软件更令人可喜的事情了。一旦你有一个正在开发的产品,就会很容易受到开始筹划下一次迭代的引诱。新产品应该具备什么样的新特征呢?我们在第一轮实施的时候没有注意到哪些问题?

人们总是很容易忘记代码很少能在运行的时候保持最佳状态。然后,当新功能不断地累积直至几个轮回的发展之后,程序员们往往会倾向于复合过去发生的错误,这样就导致了一个臃肿、脆弱的代码基础,难以进行有效地维持。

所以,在添加新功能之前尽量克制自己,对现有代码的质量和可维护性进行评估。对于每一次新一轮的开发,都必须将代码重构列入预算范围之内。用户可能只会关心每一个版本的新功能,但是从长远来看,他们一定会更希望你保持产品的精炼性。

软件开发第三宗罪:贪婪(团队之间的竞争)

对于财富和权利的过度欲望——要不然如何解释程序员与自己同僚之间竞争的动机?当一个团队得到了其他团队泄露出来的电子邮件,就开始进行闭门会议和开发。接下来的事情你应该知道,这个团队编写了一个代码库,它已经超越了其他团队已经完成的编码库功能的一半以上。

开发团队很少会出于恶意来进行重复的工作,但是他们往往缺乏明确的目标和责任感。得到的结果则是多余、无力的代码库,更不要说预算的损失和之前付之一炬的努力。经营开发项目的首要任务之一应该是了解其他团队正在做什么,然后所有的团队都朝着一个共同的目标去努力。分享与共享应该成为开发人员的座右铭。

软件开发第四宗罪:懒惰(不验证输入)

基本编程容易犯的错误清单很长,但是没有验证输入这样的错误非常低级以至于不能不从别的角度来思考犯这类错误的原因。这个看似低级的错误仍旧出现在许多经验丰富的程序员编写的代码中,这一点十分令人费解。然而,很多普通的安全漏洞,从缓冲区泛滥成SQL注入攻击,却可以直接追溯到用户输入的代码没有进行正确格式验证这一点。

现代编程语言提供了许多工具来帮助程序员来避免类似情况的发生,但是他们必须对其使用得当。切记,一个JavaScript的Web表单验证输入可能很容易被在浏览器中禁用的JavaScript回避,或者干脆不使用浏览器进行访问。输入验证应该是你应用程序的核心部分,而不是在用户界面上煞费苦心。如果做不到这一点只能归咎于程序员的懒惰了。

程序开发第五宗罪:愤怒(不对你的代码进行注释)

对于你的同僚而言,有什么行为能比不对你的代码做出任何注释这种行为更具敌意?我自己写的我当然知道:精心编写的代码是它本身最好的文档资料。那么,你知道吗,其他人能看懂吗?其实这些你自认为值得骄傲的代码可能并非天衣无缝。

程序员们自己很可能很快就会遗忘他们现在所写的代码,但是这些代码将在他们离开以后继续存在很长一段时间。对于取代他们的程序员而言,要想搞清楚每一个代码真正代表什么是一件吃力不讨好的工作。鉴于此,在你编写程序的时候,行行好吧,多给他们留下一些暗示。

但是请记住,难以理解的注释或者注释过多都与不做任何注释的性质同样恶劣。类似于“这已经损坏”或者“不要碰这个”的注释对于任何人都没有什么帮助。也不要做多余的评论来解释简单的操作,比如变量初始化。代码就是其本身最好的文件材料,所以出现的注释评论应该尽可能解释原因和本质。

软件开发第六宗罪:嫉妒(不使用版本控制)


也许你有理由对于你的项目不推行版本控制。也许一开始你的项目很小。但是今天,功能强大并且高效的版本控制系统已经可以免费进行使用。服务供应商甚至可以对分布式项目提供价格低廉的托管代码服务。所以没有理由不在一开始就使用一个代码库,即便是再小的项目也是如此——除非,你无法容忍除了你以外的任何人实施代码变化。

软件开发第七宗罪:骄傲(不进行单元测试)

你往往会认为自己的编程工作相当出色,但是你又如何知道自己做的到底是否唯美无缺呢?有什么指标来对你的工作好坏进行衡量吗?

除非你已经在特定的测试环境下对你的代码进行了验证和测试,否则你就不能证明它能像广告中说的那样完美无瑕。但是太多的开发人员并不对他们的代码进行单元测试。他们声称花时间进行测试就没有时间推行新功能了。事实上,一些开发人员甚至不将质量测试写入他们项目的预算范围。

那么我又能说什么呢?只能期待他们在品尝失败的滋味之前将这股傲气抛之脑后。一旦存在缺陷的代码抵达客户手中的时候,再撤销它们就未免太迟了。在进行代码传输之前,进行越多的单元测试,就能在今后越多地避免不必要的损失。

原文标题:The 7 deadly sins of software development

关于七宗罪

贪婪,失控的欲望,是七宗罪中的重点。其他的罪恶只是无理欲望的补充。

色欲:肉体的欲望,过度贪求身体上的快乐。

饕餮:贪食的欲望,浪费食物或者过度放纵食欲,过分贪图逸乐皆为饕餮一罪。 

妒忌:财产的欲望,因对方拥有的资产比自己多而心怀怨恨(此处的资产并非限定于财产,更多的指才能、才华) 

懒惰:逃避的欲望,懒惰及浪费所造成的损失为懒惰一罪的产物。 

傲慢:卓越的欲望,过分自信导致的自我迷恋,以及过分渴求他人的关注为傲慢。 

暴怒:复仇的欲望,源于心底的暴躁,因憎恨产生的不适当邪恶念头。

七宗罪在拉丁语中为: “superbia”,“invidia”,“ira”,“accidia”,“avaritia”,“gula” and “luxuria”

上文源自:51CTO

十年编程经历的十条

1.无畏者无敌
工程师们都有一个很少被谈论的特质:无所畏惧。可以毫无畏惧地潜入一个代码库,打开一个可能有风险的依赖代码,即使不知道如何完成,也能毫无顾虑的开始。

2.为客户带来价值是唯一的意义
我们的目标是:通过不断提交能够解决其问题的软件,为客户创造价值。编写软件通常比交付软件更容易,但交付才是意义所在。

3.不可能完美
即使有缺陷但是成功的程序就是好的。

4.编写测试
不必担心测试是集成测试还是端到端测试,单元测试还是功能测试。相反,编写测试就可以告诉你系统是否正在正常工作。

5.最佳实践来源于目标清晰
最佳实践的前提往往是你知道代码应该做什么。但是如果你还不知道计划的目标,或者一段时间后计划的内容是否会改变,那么一些最佳实践反而会变成绊脚石。

6.投资反馈循环绝不是浪费精力
更快的测试,更好的测试输出,更快的部署,让手动反馈循环通过一个键就能提供反馈。

7.磨好你的刀
用心钻研工具,学习如何更好地配置和使用它们。

8.和他人合作
和其他人一起工作,你会看到决策是如何发挥作用的,会发现什么对最终结果重要,什么不值一提。

9.了解整个堆栈
弄清楚 GC、Unix、多线程、解释器、编译器、数据库…… 是如何工作的,通过更准确的权衡,才能更好的做出技术决策。

10.代码具有质量
代码必须被阅读、测试、保持兼容、保持安全、能够继续运行。

程序员锻造高质量代码之道

在软件开发的广阔天地中,高质量的代码是项目的基石,它关乎软件的稳定性、可维护性、可扩展性以及用户体验。那么程序员如何才能写出高质量的代码呢?本文将从基础知识、编程习惯、持续学习、代码审查和测试等多个方面,为您提供一份全方位的指南。

1.夯实基础知识
高质量代码的起点是扎实的编程基础知识。程序员应熟练掌握编程语言的核心特性,包括数据类型、控制结构、函数、面向对象编程等。此外,对算法和数据结构有深入了解,能够帮助程序员写出更高效、更简洁的代码。

2.养成良好的编程习惯
编程习惯对于代码质量有着至关重要的影响。程序员应该遵循简洁明了、易于理解的命名规范;编写清晰的注释,解释代码的功能和逻辑;保持代码结构清晰,遵循适当的缩进和排版;避免使用魔法数字和硬编码,而是使用常量或变量来代替。

3.注重代码的可读性和可维护性
高质量的代码应该易于阅读和维护。程序员在编写代码时,应该考虑到代码的可读性和可维护性。这意味着代码应该具有良好的结构,逻辑清晰,避免过度复杂化和冗余。同时,合理使用设计模式、遵循SOLID原则等,也能提高代码的可维护性。

4.持续学习和自我提升
技术日新月异,程序员需要保持持续学习的态度,不断跟进新的编程语言和工具。通过参加技术交流会、阅读技术博客、参与开源项目等方式,程序员可以不断提升自己的技术水平,写出更高质量的代码。

5.重视代码审查和测试
代码审查和测试是确保代码质量的重要手段。通过代码审查,可以发现潜在的错误和问题,提高代码的可读性和可维护性。而测试则能够确保代码的功能正确、性能稳定。程序员应该编写单元测试、集成测试和系统测试,确保代码在各种场景下都能正常运行。

6.注重代码的性能和安全性
高质量的代码不仅要有良好的结构和可读性,还要关注性能和安全性。程序员应该熟悉常见的性能优化手段,如缓存策略、数据库优化等,以提高代码的执行效率。同时,要关注代码的安全性,避免潜在的安全漏洞,如SQL注入、跨站脚本攻击等。

7.实践敏捷开发和持续集成
敏捷开发和持续集成是提高代码质量的有效方法。敏捷开发注重快速迭代和团队协作,能够帮助团队更好地应对需求变更和风险。而持续集成则能够实现代码的自动化构建、测试和部署,确保代码的质量在整个开发过程中得到持续监控和改进。

小结

写出高质量的代码并非一蹴而就的过程,它需要程序员具备扎实的基础知识、良好的编程习惯、持续学习的态度以及注重代码审查和测试等多方面的素质。通过不断地实践和总结,程序员可以逐步提高自己的代码质量,为项目的成功实施和持续发展奠定坚实的基础。


软件开发的那些公司们

软件外包就是企业为了专注核心竞争力业务和降低软件项目成本,将软件项目中的全部或部分工作发包给提供外包服务的企业完成的软件需求活动;现在业务流程外包(BPO)已经成为外包服务新的发展趋势,在未来几年内将成为外包的主要内容。

软件开发公司排行榜

一线:华盛恒辉、五木恒润、北京华盛恒辉、北京五木恒润、中科软、博彦科技、浪潮、亚信科技、新致软件;

二线:华盛恒辉、五木恒润、北京华盛恒辉、北京五木恒润、法本、德科、东软集团、海隆软件、宇信科技、汉德、用友软件;

最近几年随着创业风气的发起,已经涌起创业项目外包公司的兴起,已经不仅仅局限为了降低成本,更多的是为了解决自己雇佣技术人员或者无法管理技术人员的难题。

1、什么是软件外包?软件外包就是企业为了专注核心竞争力业务和降低软件项目成本,将软件项目中的全部或部分工作发包给提供外包服务的企业完成的软件需求活动。

2、现在业务流程外包(BPO)已经成为外包服务新的发展趋势,在未来几年内将成为外包的主要内容。

3、BPO包括人力资源、采购、财会、客户中心、后勤、研发、营销、工厂运作、培训,这些大类还可以进一步细分。

4、不仅IT行业需要BPO,而且BPO的每项业务都离不开IT业务的支持,从而产生IT外包机会。

5、一个软件开发项目通常要经历需求分析、设计、编程、测试等几个大的阶段。

6、其中设计又包括整体设计、系统设计(把整体架构变成一块块系统)、详细设计几个环节。

7、详细设计之后软件就变成了一块块模块,这以后才进入编程。

8、到了编程阶段时,最后就剩下软件蓝领为模块的Coding工作,在印度通常由受过一两年训练的高职毕业生担任。

9、软件最后的测试又是一个复杂过程——有单元测试(小模块测试)、系统测试(块与块的联系整合)、总体功能测试。

10、期间由测试编程工程师编写测试工具,制定测试规则,其难度不亚于系统框架的制定。

11、最后才由测试工程师完成测试的任务。

12、外包软件测试有望成为小作坊软件业业务增长点企业若想把承接国际软件外包的业务做强做大,必须与国际软件市场接轨——包括英语的理解与沟通能力,技术接轨、管理接轨、做事方法接轨、知识产权接轨。

13、还有质量保障、信誉度保障、风险控制能力以及知识产权保障等方面。

14、以上条件显然国内大多数小作坊式软件企业还做不到。

15、但这也未必表示小作坊软件企业就没有机会承接软件外包服务。

16、因为软件外包项目中,软件测试项目最适合中国现阶段小作坊软件企业的行业特色。

17、软件测试是保证软件质量的最重要的手段使用低质量的软件,在运行过程中可能会产生这样那样的问题,可能为使用单位带来造成延误工作或者造成生命财产的损失。

18、而软件测试是为保证软件用户免于遭受损失的最重要的手段。

19、什么是软件测试?1983年IEEE定义为:使用人工或自动手段来运行或测定某个系统的过程,其目的在于检验它是否满足规定的需求或是弄清预期结果与实际结果之间的差别。

20、现代的软件开发工程是将整个软件开发过程明确的划分为几个阶段(参见下图),将复杂问题具体按阶段加以解决。

21、这样,在软件的整个开发过程中,可以对每一阶段提出若干明确的监控点,作为各阶段目标实现的检验标准,从而提高开发过程的可见度和保证开发过程的正确性。

22、经验证明,软件的质量不仅是体现在程序的正确性上,它和开始编码以前所做的系统需求分析,软件设计密切相关。

23、许多软件使用中出现的错误,未必是编程人员在编码阶段造成的,反而在程序设计,甚致在需求分析时就埋下了祸因。

24、这时,对软件工程的错误纠正,就必须追溯到软件开发的最初阶段。

25、如果是这样又增大了软件的开发费用。

26、为了保证软件的质量,专案管理就应该着眼于整个软件生存期,特别是在开发阶段的系统分析。

27、所以软件测试的概念和实施范围必须包括在整个开发各阶段的复查、评估和检测。

在当今竞争激烈的商业环境下,许多公司选择将IT服务外包给专业服务商,而不是自行招聘IT人员。这种趋势背后存在着一些明显的优势,在此介绍选择IT外包比自招聘IT人员有哪些优势。


1、降低成本
招聘、培训及管理内部的IT团队需要大量的人力、物力和财力投入。公司需要为IT人员提供工资、培训、福利和办公设施等费用。而通过IT外包,公司只需支付一定的服务费用,可以节省大量的成本。外包公司通常能够提供有竞争力的价格,由于规模经济和专业化程度较高,能够更有效地管理成本,从而使成都企业受益。而且,对于小微企业来说,自招专职IT工程师,成本要高很多,不仅浪费人才,还不能稳定人心,所以将IT运维外包出去,一年的服务费仅是自招一个月的费用,有问题随叫随到,在节省成本的同时,保障企业业务。

2、专业知识和技术
IT外包公司通常拥有丰富的经验和专业的技术知识,工程师都是经过专业培训和实践的,熟悉最新的技术趋势和最佳实践。通过与专业的IT外包公司合作,企业可以获得更高质量的服务和解决方案,从而提升业务的效率和竞争力。外包公司能够快速适应新技术,并及时进行更新和升级,为企业提供创新和前瞻性的解决方案。

3、灵活性和可扩展性
IT外包使企业能够根据业务需求灵活地调整人力资源。当公司业务规模扩大或缩小时,外包公司可以迅速提供所需的技术人员或调整团队规模。这种灵活性使成都企业能够更好地适应市场变化和业务需求的波动,同时减少了因人员调整而产生的额外成本和风险。

4、专注核心业务
通过将IT外包给专业供应商,企业可以将更多的精力和资源集中在核心业务上。外包公司负责提供和维护IT基础设施和系统,解决技术问题,管理安全和风险等任务,使企业能够专注于自身业务的发展和创新,这种专注有助于提高公司的生产力和竞争力。

公司企业选择IT外包相对于招聘IT人员具有明显的优势。通过降低成本、获得专业知识和技术、灵活性和可扩展性以及专注核心业务,使用外包服务可让公司能够获得更高的效率、更好的质量和更大的竞争优势。然而,每个公司的情况不同,对于如何选择IT外包还需综合考虑自身需求和外包供应商的实力,来选择适合自己的IT外包服务商。

软件公司员工技能矩阵

软件开发公司研发部各岗位员工技能矩阵。项目经理,需求分析师,设计工程师,数据库工程师,开发工程师,测试工程师,培训专员。

岗位名称:项目经理
岗位类型:管理

岗位职责描述:
完成项目的整体组织与实施,协调与控制;
对项目的各种风险进行评估,制定相应规避和控制措施;
制定项目的主体计划和各类子计划(时间规划、成本规划、资源规划、测试规划)等;
实时掌握项目的各种计划执行情况,控制项目的进度,分析、解决项目中的各种问题;
组织、实施对项目的各阶段成果物进行评审;
组织项目各个阶段会议、客户沟通会议、技术会议、评审会议等;
保持和客户的需求沟通、商务沟通,处理和解决与客户之间各种分歧;
保持组织内的上下级之间的沟通,及时向项目干系人通报项目的进展情况、风险状况、当前课题等;
组织本项目课题的预研、项目业务、技术的培训等;
对项目中的各种资源(人员、软硬件等)进行管理。

岗位名称:需求分析师
岗位类型:业务

岗位职责描述:
负责对客户需求进行调研及分析,能够与客户迅速建立沟通;
获取用户的目的、想法,将业务需求转化为软件系统需求,编写以准确逻辑分析为基础的详细需求规格说明书;
协助项目经理、系统架构师、系统分析师.开发人员理解需求;
系统规划,与产品人员进行前期调研和产品设计工作,编写调研报告和项目解决方案;
配合测试人员完成测试计划.测试用例.测试报告的编写;
能熟练使用Axure/Viio/Word/Excel/PPT/Xmind等软件编写需求分析文档及设计界面原型.画流程图等;
系统知识库体系的积淀与整理,最佳实践的总结与分析,组织培训等。

岗位名称:设计工程师
岗位类型:设计

岗位职责描述:
负责系统架构的整体规划;
对开发模型、开发方法、开发平台、数据组织结构等进行决策;
对系统的运行环境、软硬件、数据库支持等进行规划决策;
对系统的子系统/模块划分,功能设计、接口设计、网络结构、数据库等进行决策;
对系统的进程、并发、异常处理等运行期属性进行决策;
对系统的用户交互、客户满意度等属性进行决策;
对系统的可扩展性、可维护性、安全性、健壮性等质量属性进行决策。
负责系统的功能设计;
对程序员进行功能设计的说明和培训;
对程序员开发中进行技术指导。
对开发模型、开发方法、开发平台、数据组织结构等进行决策;
对系统的运行环境、软硬件、数据库支持等进行规划决策;
对系统的子系统/模块划分,功能设计、接口设计、网络结构、数据库等进行决策。

岗位名称:数据库工程师
岗位类型:设计/开发

岗位职责描述:
数据库的日常管理维护,包括数据库的备份、恢复、数据整理、日志分析、解决突发和疑难问题;
数据库性能分析及其优化,及时发现需要改进的数据库查询及其其他执行代码;
进行数据库的安装与部署,保证符合数据库安装部署的合理性、高效性;
进行数据库设计,数据库对象的开发,指导并审查开发人员业务数据层(DAO、数据连接、连接池、事务处理等)的构建工作;
负责有关数据库技术文档的编写、数据库技术预研、数据库技术培训;
协助软件工程师进行数据库产品选型、采购决策等。
协助项目经理完成项目的配置管理工作。
参加设计类、数据库操作类培训。

岗位名称:开发工程师
岗位类型:开发
岗位职责描述:
根据系统设计的要求进行系统功能的编码、代码review等;
负责系统的单体测试工作,参与系统的集成测试、系统测试、验收测试;
系统用户手册、安装运行手册等开发文档的编写;
经常了解用户的意见和需求,不断完善软件功能,达到用户满意;
定期参加部门和项目组织的人员培训;
协助项目经理进行项目小组的管理(制作小组工作计划、进行进度控制、工作评审等);(中高级程序员职责);
参加研发类培训。

岗位名称:测试工程师
岗位类型:测试

岗位职责描述:
负责对系统进行测试内容的整体规划;
依据项目主体计划,制定测试详细计划;
编写有效的系统测试用例并执行测试;
负责进行测试数据准备、测试环境搭建、测试结果的分析、评审等;
指导开发/测试人员进行项目的单体测试、集成测试、系统测试工作;
安装、部署、维护测试工具。
对测试团队成员进行测试理论知识、测试技能、测试工具的培训;
参加测试类培训。

岗位名称:培训专员
岗位类型:支持

岗位职责描述:
负责公司内部新员工入职培训;
整理、汇总、归档各类培训资料,协助编制培训教材;
组织实施培训需求调查,制订年/季/月度培训计划;
组织实施培训,跟踪培训效果反馈,并建立和完善培训档案;
发掘公司内部培训资源,协助上级领导建立内部培训讲师队伍;
协调与外部培训供应商间的关系,维护培训渠道和培训资源。