周报 2021W21
这次的内容与上周周报有所关联,来简单说说我所认为的「软件工程师」是什么——
与「程序员」的区别
大家都会有的疑惑——「程序员」和「软件工程师」有什么区别?他们到底是同一类人的两顶帽子,还是压根儿就是两类人?
从构词角度
我们在理解一个名词时,首先要看这个词的词根是什么,也就是它是由哪个词衍生出来的——「程序员」的词根是「程序」,「程序员」就是「编写程序的人」;「软件工程师」是由「软件工程」派生而来,「软件工程师」就是「从事软件工程相关工作的人」。
不难看出,「程序员」和「软件工程师」之间的差还挺大的,除非「程序」和「软件工程」差不多或是一回事。
从关注点来看
软件生产流程的主要环节有需求分析、产品设计、软件开发、软件测试和部署维护。
「程序员」基本只关注软件开发相关的事情,有的人也许会稍微关注下自己上下游环节的事情,但让他们去分析业务需求或把控产品走向几乎是不可能的。
软件工程涉及到了软件生产流程的整条链路,即便「软件工程师」的关注点主要放在软件开发相关的事情上,但其他环节也是要关注并考虑的,尤其是所有上游环节。
软件开发相关问题基本可以归结为四个方面:业务、人、技术和工具。
在软件开发所面临的上述四类问题中,「程序员」对技术及其关联的工具更感兴趣,容易醉心于某个语言、某种技术或某个工具——时不时地在争论哪个语言更好,哪个库/框架更好;他们只关心自己代码写得咋样,技术有没有提升,不去想做的功能有没有用,有没有人用,对业务是否起到助推作用。
而「软件工程师」更看重的是业务和人的问题,技术与工具就相对次要很多——
经常会听到「技术是服务于业务的」或「业务的发展促进了技术的进步」之类的话,目前我是赞同的——业务是企业生存之本,如果技术不能给企业带来更多的利润,甚至降低了,那么企业为什么要用?
在需求本身符合并能促进企业业务的前提下,软件开发中遇到的其他问题实质上基本是人的问题,如:代码写得规不规范;程序设计和实现得好不好;工作和协作效率高不高。
业务和人才是软件开发相关问题的核心,技术和工具则是为了解决业务和人的问题而采取的手段。也就是说,是根据要解决的业务和人的问题去选择合适的技术和工具,而非凭喜好选择技术和工具从而带来了更多的业务和人的问题。
技术和工具的产生是为了满足人的需求,在组织中,这个「需求」不是选择技术和工具的人自己的,而是组织里大部分人的——从哪个点去出发也是「程序员」与「软件工程师」的区别。
职责与能力
软件工程师的职责是什么?一句话概括就是——「Engineers are creative problem-solvers」。这句话道出了任何工程师的本质——解决问题的人。既然是「解决问题的人」,那就先得不要制造问题,然后去发现并解决问题。
发现问题
发现问题是解决问题的前提,其途径主要是两个:直观感受和观察思考。
直观感受是最本能的发现问题的方式,那些让自己感到不适的事情都是「问题」;但这些都只是表象,实际是不是一个问题有待商榷。如果仅凭表面现象去解决「问题」,也许不但没真正解决,反而制造了更多问题。
在观察到现象之后,对其分析并思考更深入、更本质的原因,提出被验证后的方案才是真正的解决问题之道。在这个过程中,必须尽可能得开放、客观和理性。
解决问题
虽然软件工程师是「解决问题的人」,但并不是任何问题都需要被解决,因此需要辨别哪些问题是需要被解决的「关键问题」。所谓的「关键问题」,就是本质性的问题,或者影响业务发展和人员协作的问题。
在确定了要解决的问题之后,在自己的知识与经验的基础上尽可能多地调研,选择合适的技术和工具,形成一套不仅能解决当前问题还能在未来一段时间(几个月到几年不等)依然有效的解决方案。
发现问题的能力是无法培养的,完全取决于个人是否爱观察和思考,在此基础上优化方法;而解决问题的能力一定程度上是可以培养的——多看,增加知识储备;多做,积累实战经验;多交流,发现思维盲点。
一个人不应想着自己解决所有问题,而是要很好地解决自己擅长领域的问题,不擅长领域的问题交给其他擅长的人去解决。
等级划分
能力有高下,自然就会出现等级划分。
对于软件工程师来说,技术能力的水平高低固然重要,但到达一个临界值之后,技术能力就不再是决定等级的关键指标了,而是看待和处理问题的思维方式。也就是说,一个在技术上登峰造极的人不一定比另一个技术比他弱很多但更有眼界且能有效解决痛点的人等级高。
如果把所有从事软件开发的人都叫做「软件工程师」,那么它就是广义的「软件工程师」。
按照当前的理解简单画下前端人员的天花板层级
粗略地看,上图中在第一层天花板之下的就是「程序员」,主要从技术细节和实现角度看问题;在第一层天花板之上的是狭义的「软件工程师」,更多的是从体系结构和设计角度看问题;而突破第二层天花板的人也可被称为「软件架构师」,则又把很多企业、业务和人的因素纳入了考虑范围之内。
综上所述,等级越低的人越发纠缠于具体的、微观的事情,而等级越高的则更加在意抽象的、宏观的事情。
结语
总的来说,「程序员」和「软件工程师」实际是两类人,硬要说的话,那「程序员」和「初、中级软件工程师」是一类人的两顶帽子。
「软件工程师」是「解决问题的人」,要针对问题选择合适的技术和工具,从需求和问题出发,按需取用,而不是像「程序员」一样从对技术和工具的喜好出发。
作为一个合格的「软件工程师」,不应该拿「前端工程师」、「后端工程师」等身份自我限制,应当作为「解决问题的人」给出自己最专业的「问题解决方案」。