也许你会觉得该问题会很搞笑,不管是开发者还是程序员他们都是程序员,就像男人和女人都是人(你也可以说都是动物)。首先,开发者和程序员都是程序员没错,这就像下面这个小故事一样:
“驾购狮,射鸡狮,攻城狮和程序猿一起走进酒吧”
酒保:——程序员们来了!
对于非IT行业的人们来说,他们只能对IT从业者只有一个模糊和呆板印象——他们都是程序员,会修电脑,头发很少。如果你是一个IT行业的从业人员,则需要细品开发者和程序员之间的差异(我探讨的目的并不在于界定谁比谁好)。例如,如果你是IT公司负责招聘的工作人员,则必须搞清楚两者之间存在的差异,不然可能招募不到合适的人才,浪费公司的时间和金钱;如果你是一个想要从事软件开发的人,理解两者之间的差异,对你的职业规划也大有帮助,因为只有了解了差异,你才知道什么角色适合你,将来该往什么方向发展。
一、程序员
为了便于理解,我先将程序员比喻成一个技艺高超的厨师(注意强调烹饪技术),他们能够按照菜单上的信息,在既定的时间范围内,烹饪出色香味俱全的菜肴。能完成这样一项任务,这得益于厨师们在刀工,时间和火候上的精湛技艺。
同样的,程序员在既定的时间范围内,按照开发任务(菜单)将别人的想法转化为可执行的软件代码,他们负责编写,测试,调试/故障排除和维护计算机源代码,能胜任这样一类工作,这得益于他们能理解各种计算机编码指令,能熟练使用各种库函数或框架。
如果要用一句简单的话来概况,那就是:和厨师一样,程序员是面向任务/指令型的角色。他们都是根据任务/指令行事。
二、开发者
如果将程序员类比为技艺高超的厨师,那么开发者更像是一个专业的美食家。就像美食家也是一名厨师一样,开发者也是程序员,但区别在于,他们不仅能够烹饪出美味的菜肴,还可以从0到1创造新的菜品。于程序员相比,开发者在创造性和概念性上更胜一筹。
对于同样一个产品,程序员的工作是从任务/指令下达的时候开始的,而开发者的工作是从和客户谈论需求时开始的。开发者需要不断的同客户交谈以获取原始的需求信息,然后对需求进行分析,定位和抽象并找出其中埋藏的问题,最后针对客户的问题,寻求可行的解决方案。
在实际情况中,程序员和开发者并没有很明确的界限。例如,在小规模的公司,一个开发者既要承担需求分析,系统设计,项目管理的工作,又要承担编码,测试,调试/运维的工作。但不管界限如何模糊,他们之间终究有区别,例如,从工作的范围来看:
程序员的工作始终伴随着编码,而开发者的工作更多是处理需求,设计和管理的事情。
如果从工作的时间周期来看:
程序员的工作时间周期是从任务下达到调试完成,而开发者的工作时间周期是从需求谈判到产品落地。
从工作范围和时间周期上来看,我们可以得到第一个直观的概念:
开发者程序员都是程序员,开发者和程序员所承担的角色是整体与部分,全集与子集的关系。
程序员只需关注自身任务的时间周期,而开发者需要关注整个项目周期。
三、程序员 VS 开发者
首先,不管是系统架构师,软件工程师还是软件设计师,他们都是程序员。
在接下来的内容中,我会从工作的职责,时间,能力和领域这四个方向探讨开发者和程序员之间存在的区别和联系。
3.1 工作职责
程序员:
程序员需要对他们正在编写的源代码负责(测试,调试/运维)
根据既定任务行事
专注于代码逻辑和算法
负责业务逻辑的实现和代码组装
开发者:
很少的代码编写量,更偏重于编码规范的制定
负责评定和管理项目代码
对项目的时间,空间和资金成本负责
协调处理整个项目的功能
协调/掌控全局,但没有必要知道各子功能的内部细节。
程序员利用专业知识,将现实需求/问题转化为可执行代码,开发人员则需要利用创造性和概念性来保证程序员的节奏一致,为项目争取时间和空间。这好比一场交响乐音乐会,程序员像演奏者,而开发者像手拿指挥棒的演奏指挥。
3.2 时间范围
程序员:
任务下达——工作开始时间
编码
测试
调试
任务完成——工作结束时间
开发者:
需求谈判——工作开始时间
需求分析
概要设计
解决方案
编码实现
系统测试
系统运维
文档编写——工作结束时间
程序员的的工作好比一个400米的接力往返跑比赛,每个程序员只负责其中一段工作,而开发者更像是马拉松长跑比赛,需要从头盯到尾。
3.3 工作能力
程序员:
使用合适的编码指令和算法,编写经过测试且符合标准的有效代码,以完成任务。
开发者:
发挥自身的创造性和概念性,找到满足客户需求的解决方案,并让程序员能够理解并实现自己的想法。
3.4 专注领域
程序员:
业务逻辑转化为可执行代码
精于某一个或多个编码语言
善于使用各类算法解决问题
善于对代码进行测试、修改和运维
开发者:
需求分析和沟通
资源整合和协调
项目管理与跟踪
风险评估于把控
四、总结
通过对程序员和开发者之间的对比,我们发现了两者之间的差异。简单来说,程序员和开发者之间最本质的区别在于他们的工作范围不同,思考方向不同。开发人员(技术总监,架构师,设计师,项目经理等)会更多的参与到整个项目当中,并对项目有更深入的了解;而程序员(例如:初/中/高级Java程序员或技术专家),他们只参与了项目的特定部分,利用自身的专业知识,解决了某一领域的问题。
回到一开始的那个问题中,开发人员也是程序员,就像美食家也是厨师。但需要注意的是,开发者可以平滑切换到程序员的角色,但程序员并不一定能切换为开发者的角色。为什么这样说?道理很简单,美食家可以切换成厨师的角色,自做美味菜肴,但厨师并不一定能够像美食家一样创造新的菜品,并对没事进行品鉴。同样的,一个技术总监或架构师可以成为一个合格的程序员,去完成编码任务(通常不会这样,杀鸡用牛刀,如果小公司只有一把牛刀,那也没有办法);但一个高级程序员未必能够胜任技术总监或架构师的工作,因为两者要思考的问题是一个父子集合,整体与局部的关系。
认识到这一点后,如果你是一名IT公司的招聘人员,你应该已经明白,一个编程专家未必是你想要寻求的技术总监或架构师,选择需谨慎,用人有风险;如果你是一个码农,也请认清两者区别,做好职业规划,如果你想往技术总监/架构师方向发展,除了必要的编码能力,你还需加强自身在沟通,表达,整合,探索,创新等方向上的能力,规划需谨慎,光阴去不回。