什么是软件工程师

软件工程师站在主观世界和客观规律之间,理解主观世界和客观规律,尝试使二者达到统一。

程序员、码农,不能很好的解释软件工程师在做什么。
用程序员、码农描述软件工程师,看起来好像软件工程师的主要工作是写代码,实际上,优秀的软件工程师只有 20% - 30% 左右的时间在写代码。
可惜的是,很多软件工程师,以及与软件工程师打交道的人,也认为软件工程师的主要工作是写代码,希望软件工程师花费 100% 的时间在写代码上,认为除此之外的事情,都是在浪费时间。

软件工程师第一件要做的事情,是理解目标。
理解目标这件事与写代码无关,与采用什么编程语言无关,与用什么数据库无关,与采用什么软件架构无关。
大到实现订单系统,小到实现一个列表页面,软件工程师都需要理解这件事,理解目标是什么,理解为什么做这件事能达到目标,理解为什么自己要做这件事,理解是否有更好的方式做这件事。
因为事情越来越复杂,产生的产品经理这个职位,目的是帮助软件工程师理解要做的事情,不能代替软件工程师理解这件事情。

软件工程师要做的另一件事情,是设计。
好的设计,应当是能达到目标的,应当是容易理解的,应当是可扩展的。
太多的人只会 CRUD,妄图通过 CRUD 解决所有问题。认为工程师的大部分职责,只是思考如何落表和取数,以及提供落表和取数的接口。
达到目标的方式,如果只是简单的存取数据表,只是 CRUD 显然没什么问题。流程复杂、操作复杂时,继续只使用简单的 CRUD,就不是一个好的设计了,难以理解,无法扩展。
应对复杂问题的设计,不是回报复杂的设计,而是用容易理解的设计化解复杂度。化解,不是让复杂性消失,而是让复杂性容易理解。复杂性无法消失,但可以容易理解。
现实世界中,交通规则既要提高通行效率,又要保证通行安全。赶过集的人,应该对人多时通行效率低,深有体会。各国的道路交通法,一般紧紧围绕着路权的概念展开:路上画好线,分好路权;判定交通事故责任时,有路权的责任小或者无责。这是交通规则的设计。
计算机世界里,网络通信也非常复杂,硬件不可靠,通信距离非常长,都让网络通信协议的设计非常棘手。无论是 TCP/IP 还是理论中的 7 层模型,都是通过分层解决问题。每一层各司其职,只解决一部分问题。而不是将所有问题集中在一个地方解决。这是网络通信协议的设计。

软件工程师要做的下一件事情,是分工。
现在的软件工程师,已经很难完全掌握解决问题的所有技能,有前端、后端、测试、运维。
分工,就是约定好各自要做什么,如何配合。
为了提高效率,工程师之间一般并行工作,并行工作结束后,大家的工作成果能不能正常配合,这是要在开始并行工作前,商量好的。

最后,才是编码工作。
没有前面几项工作的铺垫,拿到需求就开始写代码,轻则工作效率低,重则代码写出来不能达到目标,甚至造成问题。

哪里需要只会写代码的程序员和码农呢?

标签: none

添加新评论