提到工程,我们容易想到一些耗时耗力的大型项目,而项目的成功都是一个团队齐心协力,同舟共济取得的成果。
工程是什么。结合近年流行的STEM教育,我们来看看科学(Science),技术(Technology),工程(Engineering)和数学(Mathematics)的关系结构。数学作为基础,推动着科学的进步(有句话叫科学的尽头是数学,数学的尽头是哲学,哲学的尽头是"神学")。科学的发现让我们认识了世界,从而产生技术发明来改造世界。工程则是运用科学知识和技术工具,有组织、系统化的去改造客观世界,目的是为人类服务的具体实践活动。具体到IT行业,软件工程是应用数学、计算机科学及管理科学等,以系统性的、规范化的、可定量的过程化方法去开发和维护软件的工程。简单说就是关于如何低成本、高效率、按时按质量完成既定的软件研发工作。
大型软件系统开发中,工程化的团队协作过程成为软件系统成功的保证,一个编程高手不一定是优秀的工程师。对于一个成功的工程项目,
首先要求的是成本可控的前提下效益最大化。由于在工程活动中存在许多不确定因素和相互矛盾的要求,只有进行系统的综合平衡,才能最大限度地提升效益。这对程序员提出了更高的要求,需要具备风险意识,成本意识,质量意识,团队意识。那些拥有大局观的工程师,其目光是放在整个项目的成功上来看待的,而不只是把眼光局限于编码上。如果带领一个项目,软件工程师可能有更多的思路及办法,而程序员可能就会陷入茫然。
工程师除了具备基本技术素质外,还需要工程素质,包括沟通能力,思考能力,解决问题能力,团队协作能力,创新能力。
沟通能力。如果你在工作中碰到过与人讨论事情总不在一个频道,相信会有深刻感悟。如何提高团队沟通带宽也是每个管理者需要重点思考的问题。前面【面试篇】和【架构篇】已经提到过沟通的重要性。
思考能力。思考能帮助你更好发现问题和理解问题。比如工作中只有找到了最重要的事情,才能更高效;只有理解了需求问题的本质,接下来的设计和开发才有意义。
解决问题能力。它可以帮助你及时消除工作流程中的阻碍,对于推动工作及时往前进行具有重要作用。
团队协作能力。每个研发团队都有自己的一套流程,不管是瀑布还是敏捷模式,你都需要遵守规范。不要小瞧了规范,一个简单的命名就可能评判出一个工程师的能力(命名之所以这么难是由于你得清楚这个名字代表什么业务含义,还要让别人见名知义)。好的命名等规范能极大的提升团队的沟通效率。关于团队精神,“400米个人世界纪录43秒03,4*100接力世界纪录36秒84”足以说明问题。这里再分享一下我们团队的scrum实践过程,见下方的图片。
创新能力。创新的解决方案和思路往往能带来事半功倍的效果。不管是创新型人才还是创新型公司,往往都是行业中的佼佼者。
通过技术架构和工程能力的配合,我们才能快速去响应业务的需求,提供更优质的工程师服务。后面的三篇【业务篇】【产品篇】【数据篇】中我们再重点围绕服务展开讨论。