这是程序员应该具备的最基本的,也是最重要的安身立命之本。即使成为了高水平程序员,也不表示以后要以独行侠的姿态来工作。那些遍布全球的为Linux写核心的高手们,没有协作精神,这样的合作简直是不可想象的。一旦进入某些大系统的研发团队,进入商业化和产品化的开发任务,缺乏这种团队精神和合作素质的独行侠们就完全不合格了。
2:文档习惯
良好的文档是正规研发流程中非常重要的环节。作为代码程序员,30%的工作时间写技术文档是很正常的,而作为高级程序员和系统分析员,这个比例还要高很多。缺乏文档,一个软件系统就缺乏生命力,在未来的查错、升级以及模块的复用时就都会遇到极大的麻烦。
3:规范化,标准化的代码编写习惯
作为一些外国知名软件公司的规矩,代码的变量命名,代码内注释格式,甚至嵌套中行缩进的长度和函数间的空行数字都有明确的规定。良好的编写习惯,不但有助于代码的移植和纠错,也有助于不同技术人员之间的协作。代码具有良好的可读性,这是程序员基本的素质需求。
4:需求理解能力
程序员需要理解一个模块的需求,很多人写程序往往只关注一个功能需求,他们把性能指标全部归结到硬件、操作系统和开发环境上,而忽视了对本身代码的性能考虑。事实上,在性能需求的各项指标中,稳定性、并访支撑能力以及安全性都很重要。作为程序员,我们需要评估该模块在系统运营中所处的环境,将要受到的负荷压力,以及各种潜在的危险和被恶意攻击的可能性。就这一点,一个成熟的程序员至少需要2到3年的项目研发和跟踪经验才会有更深刻的心得体会。
5:复用性,模块化思维能力
复用性设计和模块化思维就是要求程序员在完成任何一个功能模块或函数的时候,要多想一些,不要局限在完成当前任务的简单思路上,而是应该想想,该模块是否可以脱离这个系统存在,是否可以通过简单的修改参数的方式在其他系统和应用环境下直接引用,这样就能避免某些重复性的开发工作。如果一个软件研发单位和工作组能够在每一次研发过程中都考虑到这些问题,那么程序员就不会在重复性的工作中耽误太多时间,就会有更多时间和精力投入到创新的代码工作中去。
6:测试习惯
作为一些商业化、正规化的开发而言,专职的测试工程师是不可少的,但是并不是说有了专职的测试工程师,程序员们就可以不进行自测;软件研发作为一项工程而言,一个很重要的特点就是问题发现得越早,解决的代价就越低。程序员在每段代码、每个子模块完成后进行认真的测试,就可以尽量将一些潜在的问题尽早地发现和解决,这样,整体系统建设的效率和可靠性就有了最大的保证。
测试工作实际上需要考虑两方面:一方面是正常调用的测试,也就是看程序是否能在正常调用下完成基本功能,这是最基本的测试职责;第二方面就是异常调用的测试,比如高压力负荷下的稳定性测试,用户潜在的异常输入情况下的测试,整体系统局部故障情况下该模块受影响状况的测试,频发的异常请求阻塞资源时的模块稳定测试,等等。当然,程序员也不需要对自己的每段代码都进行这种完整的测试,但程序员必须清醒认识自己的代码任务在整体项目中的地位和各种性能需求,有针对性地进行相关测试,并尽早发现和解决问题。
7:学习和总结的能力
善于学习,对于任何职业而言,这都是前进所必需的动力,对于程序员,这种要求就更高了。善于总结,也是学习能力的一种体现,每次完成一个研发任务,完成一段代码,都应当有目的地跟踪该程序的应用状况和用户反馈,随时总结,找到自己的不足。这样逐步提高,一个程序员才可能成长起来。
具备以上全部素质的人,应当说是够格的程序员了。请注意,以上的各种素质都不是仅仅由IQ决定的,也不是从大学课本里就可以学习到的,需要的是程序员对自己工作的认识,是一种意识上的领悟问题。
那么,作为高级程序员,以至于系统分析员,也就是对于一个程序项目的设计者而言,除了应该具备上述全部素质之外,还需要具备以下素质:
第一,需求分析能力
对于程序员而言,理解需求就可以完成合格的代码。但对于研发项目的组织和管理者,他们不但要理解客户需求,更多时候还要自行制定一些需求,为什么这么说呢?
一般而言,进行研发任务,或者是客户提出需求,或者是市场和营销部门提出需求。这时候,对于研发部门,他们看到的不是一个完整的需求,而仅仅是一些功能上的要求,或者更正规些,可能获得一个完整的用户视图。但这些都不够,因为客户一般非技术因素多一些,可能很难提出完整和清晰的、专业性的性能需求,但是对于项目组织者和规划者,他必须能够清醒认识到这些需求的存在,并在完成需求分析报告的时候适当提出,同时要完整和清晰地体现在设计说明书里面,以便于程序员编码时不会失去这些准则。程序设计者必须正确理解用户需求所处的环境,并针对性地做出需求的分析。
第二,项目设计方法和流程处理能力
程序设计者必须能够掌握不少于两到三种的项目设计方法(比如自顶至下的设计方法、快速原型法等等),并能够根据项目需求和资源搭配,选择合适的设计方法,进行项目的整体设计。设计方法上选择不当,就会耽误研发周期,浪费研发资源,甚至影响研发效果。
一个程序设计者还需要把很多功夫用在流程图的设计和处理上,他需要做数据流图以确立数据词典;他需要加工逻辑流图以形成整体的系统处理流程。一个流程有问题的系统,无论代码多漂亮,每个模块多精致,也不会成为一个好的系统。当然,做好流程分析并选择好项目设计方法,都需要在需求分析能力上具有足够的把握。
第三,复用设计和模块化分解能力
作为一个从事模块任务的程序员,他需要对他所面对的特定功能模块的复用性进行考虑;而作为一个系统分析人员,他要面对的问题复杂得多,需要对整体系统按照一种模块化的分析能力分解为很多可复用的功能模块和函数,并针对每一模块形成一个独立的设计需求。一个成熟的软件行业,在一些相关项目和系统中,不同的部件是可以随意换装的,比如微软的许多桌面软件,在很多操作模块(如打开文件、保存文件)都复用了同一套功能模块,而这些接口又通过一些类库提供给了桌面应用程序开发者,方便挂接。这就是复用化的模块设计明显的一个佐证.
将一个大型的、错综复杂的应用系统分解成一些相对独立的、具有高度复用性的、并能仅依靠几个参数完成数据联系的模块组合,是作为高级程序员和系统分析员一项最重要的工作。合适的项目设计方法,清晰的流程图,是实现这一目标的重要保证。
第四,整体项目评估能力
作为系统设计人员,必须能够从全局出发,对项目具有整体的、清醒的认识,如公司的资源配置是否合理到位,比如工程进度安排是否能最大化体现效率又不至于无法按期完成。评估项目整体和各个模块的工作量,评估项目所需的资源,评估项目可能遇到的困难,都需要大量的经验积累。换言之,这是一种不断总结的累计才能达到的境界。在西方一些软件系统设计的带头人都是很年长的,比如四、五十岁,甚至更老,他们在编码方面已经远远不如年轻人那样活络,但就项目评估而言,他们几十年的经验积累就是最重要和最宝贵的财富。
第五,团队组织管理能力
完成一个项目工程,需要团队的齐心协力。作为项目设计者或研发主管人,就应当有能力最大化地发挥团队的整体力量。技术管理由于其专业性质,不同于一般的人事管理,因为这里涉及了一些技术性的指标和因素。
首先是工作的量化,没有量化就很难做到合适的绩效考核,而程序量化又不是简单的代码行数可以计算的,因此要求技术管理人员需要能真正评估一个模块的复杂性和工作量。其次是对团队协作模式的调整。根据程序员之间的能力水平差距,以及根据项目研发的需求,选择合适的组队方式,并能将责权和成员的工作任务紧密结合,这样才能最大发挥组队的效率。
那么,一个软件项目研发的设计流程是怎样的呢?
第一个步骤是市场调研。技术和市场结合,才能体现最大价值。
第二个步骤是需求分析。这个阶段需要出三样东西:用户视图,数据词典和用户操作手册。用户视图是该软件用户(包括终端用户和管理用户)所能看到的页面样式,这里面包含了很多操作方面的流程和条件。数据词典是指明数据逻辑关系并加以整理的材料,完成了数据词典,数据库的设计就完成了很大一部分。用户操作手册是指明了操作流程的说明书。请注意,用户操作流程和用户视图是由需求决定的,因此应该在软件设计之前完成;完成了这些,就为程序研发提供了约束和准绳。
第三个步骤是概要设计。将系统功能模块初步划分,并给出合理的研发流程和资源要求。作为快速原型设计方法,完成概要设计就可以进入编码阶段了。快速原型法在完成原型代码后,根据评测结果和经验教训的总结,还要重新进行详细设计的步骤。
第四个步骤是详细设计。这是考验技术专家设计思维的重要关卡,详细设计说明书应当把具体的模块以最“干净”的方式(黑箱结构)提供给编码者,使系统整体模块化达到最大;一份好的详细设计说明书,可以使编码的复杂性减低到最低
第五个步骤是编码。在规范化的研发流程中,设计过程完成的好,编码效率就会极大提高,编码时不同模块之间的进度协调和协作是最需要小心的,也许一个小模块的问题就可能影响了整体进度,让很多程序员因此被迫停下工作等待。因此,编码时的相互沟通和应急的解决手段都是相当重要的。
第六个步骤是测试。测试有很多种:按照测试执行方,可以分为内部测试和外部测试;按照测试范围,可以分为模块测试和整体联调;按照测试条件,可以分为正常操作情况测试和异常情况测试;按照测试的输入范围,可以分为全覆盖测试和抽样测试。完成测试后,完成验收并完成最后的一些帮助文档,整体项目才算告一段落。