本节书摘来自异步社区出版社《告别失控:软件开发团队管理必读》一书中的第2章,第2.1节,作者: 【美】Mickey W. Mantle(米奇 W.蒙托) , Ron Lichty(罗恩•利克蒂),更多章节内容可以访问云栖社区“异步社区”公众号查看。
2.1 程序设计工种
了解程序员的第一种方法是分析他们的程序设计工作可以归为哪些类型。程序设计工作通常有下面4种类型:
客户端程序员;
服务器程序员;
数据库程序员;
Web开发人员及其他脚本编写者。
当然,可能有许多特殊的程序设计工作难以确切地归结为上述某种类型。但总的来说,这4种类型已经覆盖了世界上的绝大多数程序员,其中每一种程序员擅长的问题解决方法、使用的工具以及侧重的产品方向都各不相同。一些极有天分的程序员能够胜任所有工作,但大多数程序员认为自己虽然能完成所有的程序设计任务,但其实最多只能把其中一种做好。
一般情况下,我们建议为不同类型的工作任务安排不同的程序员,不要指望哪个程序员能同时兼任多种类型的工作,否则你很可能最终会为这个决策感到后悔。因此,在雇用程序员或者为项目安排人手之前,首先必须明确自己需要什么类型的程序员。
2.1.1 客户端程序员
把所有曾经从事过程序设计工作的程序员都统计在内,大部分程序员都属于客户端程序员。这里术语客户端(client)指的是程序所在的位置,通常是终端用户的计算机上。个人电脑的出现催生了无数的“客户端程序”——文字处理软件、电子表格、工作效率程序、游戏以及众多的实用工具(包括微软的Word与Excel、Brøderbund的Myst游戏以及Lemke的GraphicConverter工具等)。而在个人电脑出现之前,程序员所编写的大多数程序都在中央系统中运行。程序的开发者负责把“客户端结果”传输到非智能终端或者智能终端,或者通过打印出的报告提交“客户端结果”。这些程序开发者也是客户端程序员。
随着低成本微处理器的普及,客户端程序员逐渐把业务拓展到嵌入式应用领域,所开发和交付的应用可以在游戏控制台、手机、iPad以及其他的消费电子设备和终端用户设备上运行。
为什么把这些程序员都归类为客户端程序员呢?因为他们在工作时几乎可以完全控制自己的资源。客户端程序员的任务范围通常是有限的,所需要交付的产品也是明确的。因此,客户端程序员/团队的职责很明晰,除了服务器端传来的数据外也几乎不依赖其他东西。
2.1.2 服务器程序员
这里术语服务器(server)不仅指出了程序所处的位置,还表明了编写程序的目的通常是向远程客户端传输信息和数据。服务器程序所在的机器通常离终端用户都很远,而且大多数这样的程序必须能够同时处理来自多个客户端的多种行为,这就使得服务器程序通常比客户端程序员开发的程序更复杂一些。在编写和部署服务器程序时,通常还要求在增加新机器与资源时能不用改变程序的基本结构,这又进一步增加了开发服务器程序的复杂度。
随着互联网的出现,术语客户/服务器(client/server)就成了Web浏览器与(“在网上某个地方的”)Web服务器之间交互方式的代名词。基于客户端的Web浏览器很复杂,但实践证明,创建能够使数以百计或数以千计的终端用户同时访问同一台Web服务器的服务器程序,确实是一项更为复杂的工作。构建这样的系统通常离不开在各个服务器系统与程序之间进行接口转发、数据传输及同步的工作。这类工作是典型的服务器程序员需要完成的任务。
2.1.3 数据库程序员
数据库程序员与客户端程序员或服务器程序员不同,他们使用完全不同的程序设计语言和工具,编写的程序给出的结果也截然不同。数据库程序员通常是对终端用户或应用程序所使用或产生的数据进行组织、存储和提取工作。
这些年来,不同数据库系统之间的差别逐年减少,数据库程序员在一个数据库系统中积累的“基本”技术技巧也更容易迁移到别的数据库系统了。尽管像Hadoop这样用于访问TB级数据的“大数据”系统已经涌现出来,但最常用的数据系统仍然是关系数据库,包括Oracle、Microsoft SQL Server、IBM DB2、MySQL、Postgres和Berkeley DB。这些系统中的多数关键概念是相同的,它们都使用SQL语句(以及等价的API)来访问数据。因此,有人可能会认为,其中某个系统的专家很可能也是另一个系统的专家。但根据我们的观察,除非是最基本的数据库操作,否则在特定数据库系统上的实战经验仍然是必需的。
数据库程序员就像是汽车修理工。你可能会随便找一个汽车修理工帮你换轮胎或者雨刮器;但是对于保时捷汽车上的重要问题,你绝不会让一个完全不了解保时捷的修理工来做。数据库程序员也是如此:我们可能会随便找一个数据库程序员撰写报告来访问Oracle数据库中的数据;但需要在数据库系统(如Oracle、SQL Server)上进行重要的开发时,绝不会考虑实战经验不足的程序员。
2.1.4 Web开发人员及其他脚本编写者
许多Web开发人员使用的开发工具完全不同于其他程序员,在大多数开发工作中,其他类型的程序员通常使用C、C++、C#、Java、Ruby等核心程序设计语言,Web开发人员通常使用格式化标记语言(如HTML、XML、CSS、ASP/JSP)和脚本工具(如Perl、PHP、JavaScript)。Web开发人员的工作有时可以归纳为“剪切、粘贴和修改”(复制一些现成的代码,进行适当的修改以完成不同的任务)。他们也会使用更高层次的工具(如Flash、Dreamweaver或Cold Fusion)来简化脚本编写和部署过程。这就意味着只从事Web开发的程序员虽能够从正规的计算机科学训练中受益,但又不像其他程序员那么依赖正规的计算机科学训练。
另一方面,更多的处理工作逐渐从服务器移至浏览器,通过JavaScript和基于AJAX的框构来完成,这一变化也对Web开发产生了深远影响。浏览器兼容性问题是Web开发人员长期面临的棘手问题。在客户端引入更多的逻辑会加剧这些问题,要求Web开发人员引入更多的传统程序设计原理,所引发的需求,要求Web程序员像客户端程序员一样技术精湛。Web开发人员越来越需要学习客户端程序设计及其所面临的问题了。
前面描述的4种程序员类型是一般性的情况,一些技术高深的程序员实际上可以胜任所有这4种工作。但是,大多数程序员都只专精于其中一个领域,只有在编写“适合自己”类型的代码时才能获得最大的产出。让程序员加入风格不合的项目往往只会引发灾难。程序员也许能够胜任其他类型的工作,但大多数程序员对此没什么兴趣。而如果程序员对自己所从事的工作没有兴趣,那就迟早要出问题了。