为了提高软件系统开发的效率、可靠性和可维护性,软件工程包括各种技术和过程。
我们来了解一下个人软件流程(Personal Software Process,PSP)和团队软件流程(Team Software Process,TSP)。以足球为例,个人足球流程强调体能、技术和意识;团队足球流程则更强调阵型、配合和临场。流程本身不是目标,赢球才是目标。
绝大多数软件模块都是由个人开发和维护的。个人贡献者(Individual Contributor,IC)需要了解当前的情况并找到解决方案,估计工作时间,确定模块的依赖关系,和相关人士讨论解决方案并不断迭代,执行解决方案(包括代码复审、更新测试等具体工作),和其他队友一起维护软件,并对结果负责。个人的工程质量将极大地影响软件的质量。
作为一个(未来的)软件工程师,你是否有这样的体会:理论和实践往往有差距,开发项目的时候会发现实际情况和书上讲的内容有一些出入,一些重要的细节书本中并不会提及。而且很多软件工程师是边看Python相关书籍边开发Python项目。这说明个人的知识储备还很不够,需要继续成长。
那么一个软件工程师如何成长?如何证明自己的成长?可以采用PSP衡量这些核心数据:任务的大小,如有多少行代码(Line of Code,LoC);需要多少努力,花了多少时间;产品中有多少质量问题;日程是否按时交付等。
PSP的弱点在于这些评价指标很难量化,也会被很多因素影响,举例如下:
●在小型的创业团队很难找到高质量的需求分析文档,这会导致后续的活动非常随机,开发活动随时可能变化;
●依赖于数据,要求开发人员手动记录所有活动,对于丢失的数据或者不准确的数据应该如何处理?
●利益冲突,是否应该如实记录花了很长时间处理的简单问题?
●记录工作量大小时,代码行数是否作为唯一度量指标?重用代码、用别人的类库,自己从头写,或者开发者删除了200行有问题的代码,该如何计算绩效?
●是否衡量最终的结果?目前只衡量工程师如何有效地实现了软件需求,但是没有衡量用户对产品是否满意。例如,Windows 8系统开发人员把“开始”按钮取消了,完美地执行了任务,但用户是否满意?
在实践中要衡量个人贡献者的成长,可以从以下5个方面着手。
●积累软件开发相关的知识,提升技术技能,如对具体技术的掌握、动手能力等,包括:对Java、C/C++、C#等编程语言的掌握;对诊断/提高效能的技术的掌握;对设备驱动程序(Device Driver)、内核调试器(Kernel Debugger)的掌握;对某一开发平台的掌握。
●积累问题领域的知识和经验,如对游戏、医疗或金融行业的了解。
●对通用的软件设计思想和软件工程思想的理解。
●提升职业技能(区别于技术技能)。职业技能包括自我管理的能力、表达和交流的能力、与人合作的能力、按质按量完成任务的执行力,在IT行业和其他行业都很重要。
●实际成果。绝大部分软件工程师的工作成果都是可以公开的。你参与的产品用户评价如何?市场占有率如何?对用户有多大价值?你在其中起了什么作用?这些实际的工作成果是最重要的评价标准。
再来看团队软件流程。团队对个人的期望通常体现在以下几个方面。
●交流:能有效与其他团队成员交流,既有大的技术方向,也有看似微小的问题。
●说到做到:按时交付,言出必行。
●接受团队赋予的角色并按角色要求工作:要完成任务,团队有很多事情要做,能接受不同的任务并高质量完成。
●全力投入团队的活动:对于一些评审会议、代码复审等,都要全力以赴地参加,而不是游离于团队之外。
●按照团队流程的要求工作:团队有自己的流程,一个人即使能力很强也要按照团队制订的流程工作,不要认为自己可以不受流程约束。
●准备:在开会讨论、开始一个新功能或新项目之前,都要做好准备工作。
●理性地工作:软件开发有很多个人的、感情驱动的因素,但一个成熟的团队成员必须从事实和数据出发,按照流程理性地工作。
现实中,软件工程师通常有若干思维误区,具体表现在:过于保守,等有100%的把握再出手时,往往是行不通的;依赖链条过长,表现在不分主次、想解决所有问题,结果是什么也做不成;过早优化,与现实格格不入;过早泛化,很多学生热情高涨,在学了一些编程语言、读了一些技术博客后,都豪情万丈,开发一个项目时恨不得展现自己平生所学,这固然值得鼓励,但实践表明这些往往都不能成功。因此,我们要尽量避免走入这些思维误区,才能少走弯路。
下面再简单说一下不同的职业观。职业只是人生的一部分,但不同的职业观,对应的工作动力也有很大的差异。希望大家都能找到自己理想的、愿意为之奋斗的事业。
●临时的寄托或工作(Temporary Work)。在大学里,你会看到很多人选IT专业的原因和“热爱”没有什么关系,有些人是因为专业调剂,有些人是因为要拿一个文凭作为敲门砖,有些人是临时找到这样一份工作,并不打算做长久。这些人往往处于低动力、低技能的状态。
●工作(Job)。有些人留在这里,只是因为他不会做别的。这些人会经常问“软件开发人员做到35岁以后怎么办?”这样的问题。当然,如果了解和体会了软件开发的投入和回报关系,这些人的心态会进入下一个阶段。
●职业(Profession)。在工作的基础上,如果有足够的职业道德和职业规划,那么工作就是一个“职业”。只有在这个层次上,才可以开始谈有意义的“职业发展”。职业人士对“30岁以后”“35岁以后”都有一定的规划。
●投身的事业(Commitment/Vocation)。把软件项目相关的目标作为长期的承诺,碰到困难也不退缩,一直坚持到完成任务。
●理想的呼唤(Calling)。一些人觉得通过软件可以改变世界,他们主动寻找机会,实现自己的理想。
事实上,即使是数据库的“增删改查”操作也并不容易,需要的基本技术、扩展技术和进一步的扩展技术如表2.1所示。
表2.1 实现“增删改查”功能所需的各种技术
如图2.3所示,目前全栈开发中的典型技术包括数据库、云服务器、服务和前端几个方面,也有很多优秀的产品。随着技术的不断进步,全栈+AI是否能有一些结合点?AI又应该在哪一个层面上?请大家思考。
图2.3 全栈开发相关技术示意图