外界对程序员的印象就是坐在电脑前面写程序。甚至有人问过我“真的有那么多程序要写吗”这样的话。总体来说,大多数做程序员的都是帮着公司开发一个产品。这个产品按平台分的话可以是一个网站,可以是一个手机APP,可以是传统的桌面程序,也可以是嵌入式系统的软件部分等等等等。但不管是什么,所有产品开发都要经过以下主要流程:产品设计 -> 技术构架 -> 进度计划 -> 产品开发 -> 产品测试 -> 运行与维护。
而程序员,特别是经验丰富的程序员几乎会参与到每一个步骤中。所以很多程序员既要会写文档会画流程图,还要会和客户打交道。根据市场或者特定客户确定这个产品应该满足哪些需求,然后转化为一个明确的需求文档。有了这个文档,程序员才知道要开发什么,怎么样才算开发完成,交付检测的时候也才有依据。
虽然编写需求文档不是程序员的工作,但是资深的程序员在这个过程中要给出很多建议,特别是在开发复杂度上。有些开发难度太大、用时需要很久的功能和需求会被去掉。毫无疑问,开发复杂度精确的估算对于在最短时间内交付一个拥有最佳用户体验的产品至关重要,而这些是需要丰富经验积累的。所以程序员收入包括了这部分经验值的钱。
接下来就要根据需求文档设计整个系统。简单来说就是根据产品特性,选择合适的技术解决方案。这又是一个需要丰富开发经验才能完成的活儿。往往即使一个简单的前端加后端的应用,也是由十几个子系统构成的。而每个子系统都有几种甚至十几种技术可以选择,系统之间的数据传递模式又有很多选择,还有开发工具又有很多选择。
比如前端框架选什么,load balancer选什么,服务器选什么,数据库选什么,开发语言用什么,repository选什么,API的访问流程是什么等等等等。这些随便举的其实都是很基本的东西了,其实很多更实际也更复杂的问题也需要考虑,比如安全性上的,比如系统升级会造成的影响等等。
这个过程中需要写很多文档,记录每种技术stack的优劣,画很多的系统示意图和流程图,要和不懂技术的管理和设计人员沟通。所以程序员收入包括了这部分知识值的钱。
进度计划这部分一般也有专门的项目经理负责,但和产品设计类似,程序员一样要给出很多的建议。这个时候一般技术构架已经完成,可以给出更为精确的开发周期的预估。但毕竟是预估,还是需要丰富的经验才能做到尽量准确。这个进度计划是否靠谱、有多重要就不用赘述。
产品开发这个步骤才是大多数人对程序员的印象。但即使是开发,也不是简单的坐在屏幕前敲敲代码。现在主流的Agile开发,每天要开早会汇报进度,每个两个星期(或者别的周期)都要开会确定下个周期的具体开发任务,评估开发任务的工作量,并分配开发任务。
开发的时候也是经常碰到技术问题需要和别的开发人员讨论,需要和设计人员、管理人员、项目进度人员保持沟通。每个月一般还需要做个成果演示让管理层清楚进度。然后在开发过程中经常会要用到新的技术,所以也经常需要花时间去学习补充。所以程序员收入包括这部分基本技能值的钱。产品测试传统的软件开发经常有专门的测试人员,但现在互联网企业越来越多的DevOps,就是一个人做了以前的开发,测试和运维三个人的活(好吧,其实是一种变相剥削,因为虽然工资高了但也没有三个人加起来的工资高)。
测试也是要写很多代码的,因为现在都是自动化测试。然后测试也是要写很多文档的,所谓test cases,基本上和需求文档是对应的,就是一个checklist,看看是不是需求都开发出来了且达到标准了。所以你看,程序员除了会写电脑语言也还是经常要写人话的。所以程序员收入包括这部分额外任务的钱。
运行与维护本来有专职人员做的事,很多程序员现在也得做。这部分包括写一些脚本或者用软件收集系统数据,各种系统日志,然后生成一个有各种图表的控制面板,方便查看系统运行状态,还要设置各种超出合理范围值就会触发的警报,这种警报往往和手机甚至BP机相连,就算是夜里也会把人给闹醒,然后就得爬起来解决问题。所以程序员收入也包括这部分辛苦钱。
如此几何式高速发展的IT产业,人才根本就跟不上,供需关系决定了IT行业的工资只会越来越高。当然,这是对于跟得上IT发展脚步的人才来说的。IT是一个必须不停地学新技术的行业,因为发展地太快。现在最主流开发框架,各种云端的技术,新的编程语言,老的编程语言的新特性,各种辅助开发和部署的工具,各种运维的工具等等等等没有一个是10年前就出现的,很多都才出现了五年,但已经取代了更老的技术。所以能在IT行业干了八年十年还没被淘汰的,至少都是很努力的人,和很多在传统行业里几十年都吃着大学里学的那一点东西的老本的人相比,他们配得上这份工资。