程序员的分类_极悦注册

程序员的分类


从许多方面看,程序员之间的差异都非常大,只有很了解程序设计的人才能完全理解这一点。大多数公司的高层管理者对所有的程序员一视同仁,这是一个可怕的错误。微软公司的Bill Gates和Adobe Systems公司的John Warnock都没有犯这样的错误,因为他们俩本质上也都是程序员。

 

这种差异为什么很重要?也许不应该很重要,但事实上,这种差异真的很重要。历经多年的程序员管理工作之后,我们仍然惊叹于程序员之间的巨大差异,需要有区别地进行问题处理和激励。对我们而言,有一点是毫无疑问的:要想成功地管好程序员,首先必须真正地了解每个程序员。

 

有一点值得重视:我们发现一般情况下,程序员的年龄、性别、种族或文化不会造成太大的差异。根据我们对数以百计的程序员招聘与管理的经验,程序员之间的差异主要来自个人内在因素,而不是外在属性。当然,后天的训练和经历肯定是有影响的,但个人的天赋和与生俱来的特点才是真正的区别所在。

 

理解程序员的方法有很多种,我们从以下几个不同的角度来考虑:

 

程序设计工种;

程序员的类型;

领域知识;

程序员的工作要求与能力;

工作地点与关系;

代系特点;

个人特点。

1.程序设计工种

了解程序员的第一种方法是分析他们的程序设计工作可以归为哪些类型。程序设计工作通常有下面4种类型:

 

客户端程序员;

服务器程序员;

数据库程序员;

Web开发人员及其他脚本编写者。

当然,可能有许多特殊的程序设计工作难以确切地归结为上述某种类型。但总的来说,这4种类型已经覆盖了世界上的绝大多数程序员,其中每一种程序员擅长的问题解决方法、使用的工具以及侧重的产品方向都各不相同。一些极有天分的程序员能够胜任所有工作,但大多数程序员认为自己虽然能完成所有的程序设计任务,但其实只能把其中一种做好。

 

一般情况下,我们建议为不同类型的工作任务安排不同的程序员,不要指望哪个程序员能同时兼任多种类型的工作,否则你很可能会为这个决策感到后悔。因此,在雇用程序员或者为项目安排人手之前,首先必须明确自己需要什么类型的程序员。

 

1.1 客户端程序员

把所有曾经从事过程序设计工作的程序员都统计在内,大部分程序员都属于客户端程序员。这里术语客户端(client)指的是程序所在的位置,通常是终端用户的计算机上。个人电脑的出现催生了无数的“客户端程序”——文字处理软件、电子表格、工作效率程序、游戏以及众多的实用工具(包括微软的Word与Excel、Brøderbund的Myst游戏以及Lemke的GraphicConverter工具等)。而在个人电脑出现之前,程序员所编写的大多数程序都在中央系统中运行。程序的开发者负责把“客户端结果”传输到非智能终端或者智能终端,或者通过打印出的报告提交“客户端结果”。这些程序开发者也是客户端程序员。

 

随着低成本微处理器的普及,客户端程序员逐渐把业务拓展到嵌入式应用领域,所开发和交付的应用可以在游戏控制台、手机、iPad以及其他的消费电子设备和终端用户设备上运行。

 

为什么把这些程序员都归类为客户端程序员呢?因为他们在工作时几乎可以完全控制自己的资源。客户端程序员的任务范围通常是有限的,所需要交付的产品也是明确的。因此,客户端程序员/团队的职责很明晰,除了服务器端传来的数据外也几乎不依赖其他东西。

 

1.2 服务器程序员

你可以通过学习Java视频来成为一名服务器端程序员这里术语服务器(server)不仅指出了程序所处的位置,还表明了编写程序的目的通常是向远程客户端传输信息和数据。服务器程序所在的机器通常离终端用户都很远,而且大多数这样的程序必须能够同时处理来自多个客户端的多种行为,这就使得服务器程序通常比客户端程序员开发的程序更复杂一些。在编写和部署服务器程序时,通常还要求在增加新机器与资源时能不用改变程序的基本结构,这又进一步增加了开发服务器程序的复杂度。

 

随着互联网的出现,术语客户/服务器(client/server)就成了Web浏览器与(“在网上某个地方的”)Web服务器之间交互方式的代名词。基于客户端的Web浏览器很复杂,但实践证明,创建能够使数以百计或数以千计的终端用户同时访问同一台Web服务器的服务器程序,确实是一项更为复杂的工作。构建这样的系统通常离不开在各个服务器系统与程序之间进行接口转发、数据传输及同步的工作。这类工作是典型的服务器程序员需要完成的任务。

 

1.3 数据库程序员

数据库程序员与客户端程序员或服务器程序员不同,他们使用完全不同的程序设计语言和工具,编写的程序给出的结果也截然不同。数据库程序员通常是对终端用户或应用程序所使用或产生的数据进行组织、存储和提取工作。

 

这些年来,不同数据库系统之间的差别逐年减少,数据库程序员在一个数据库系统中积累的“基本”技术技巧也更容易迁移到别的数据库系统了。尽管像Hadoop这样用于访问TB级数据的“大数据”系统已经涌现出来,但较常用的数据系统仍然是关系数据库,包括Oracle、Microsoft SQL Server、IBM DB2、MySQL、Postgres和Berkeley DB。这些系统中的多数关键概念是相同的,它们都使用SQL语句(以及等价的API)来访问数据。因此,有人可能会认为,其中某个系统的大牛很可能也是另一个系统的大牛。但根据我们的观察,除非是很基本的数据库操作,否则在特定数据库系统上的实战经验仍然是必需的。

 

数据库程序员就像是汽车修理工。你可能会随便找一个汽车修理工帮你换轮胎或者雨刮器;但是对于保时捷汽车上的重要问题,你一定不会让一个完全不了解保时捷的修理工来做。数据库程序员也是如此:我们可能会随便找一个数据库程序员撰写报告来访问Oracle数据库中的数据;但需要在数据库系统(如Oracle、SQL Server)上进行重要的开发时,一定不会考虑实战经验不足的程序员。

 

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种工作。但是,大多数程序员都只专精于其中一个领域,只有在编写“适合自己”类型的代码时才能获得较大的产出。让程序员加入风格不合的项目往往只会引发灾难。程序员也许能够胜任其他类型的工作,但大多数程序员对此没什么兴趣。而如果程序员对自己所从事的工作没有兴趣,那就迟早要出问题了。

 

2 程序员的类型

为了选择合适的职员,我们还需要理解另一种看待程序员的方法。在上一节讨论的几种类型中,我们侧重考虑了程序员所从事的工作的类型(即客户端、服务器、数据库、Web)。实际上,从技术知识、实践经验和程序员的专长角度去考虑也是很重要的,按这样的思路可以把程序员分类为:

 

系统工程师/架构师;

系统程序员;

应用程序员;

非真正意义上的程序员。

2.1 系统工程师/架构师

在所有开发类职员中,系统工程师/架构师是更有技术和经验的。要想理解所有相关的系统组件(操作系统、通信系统、数据库、在线/离线访问、安全性、硬件等)之间的复杂关系,需要对所有这些技术和系统都有丰富的专业知识和经验。通常,在一个规模合理的团队中,只会有一两个“真正的”系统工程师/架构师。杰出的系统工程师/架构师可以使团队中的其他人表现得更好。他们的系统工作起来会更可靠,通常看起来也更简洁。

 

Gracenote就是由一个技术和经验都很丰富的系统工程师/架构师创立的,纯粹由他完成的设计和实现创造出了一种令人难以置信的可靠、可扩展而且灵活的服务。Google公司的联合创始人Larry Page和Sergey Brin也是类似的系统工程师/ 架构师,他们在设计和实现上培育的优雅风格帮助Google公司在技术和商业领域都取得了成功。

 

2.2 系统程序员

大多数系统工程师/架构师都是从系统程序员做起的。系统程序员理解系统中所有组件的工作原理,包括客户端和/或服务器端的操作系统和通信系统。Alan Kay在他的博士论文中引用了Bob Barton对其他程序员如何看待系统程序员的总结:

 

系统程序员相当于民间宗教中的大祭司。

 

——Bob Barton

系统程序员负责编写与硬件交互的设备驱动程序,创建能够为设备驱动程序和应用程序执行提供运行时环境的操作系统,为其他程序员创建编译器和调试工具,通常还会为其他程序员提供工具和服务用于交付程序。

 

在过去,对社交能力正常的人来说,被称为系统程序员几乎可以说是一种侮辱。我们认识许多系统程序员,他们的着装和举止如今已成为代表性的极客造型并流行开来。每当我们想起自己认识的那许多系统程序员,就会想到“我当极客的时候,极客还不受欢迎”这句话(顺便提一下,我们两位也曾经是系统程序员)。

 

2.3 应用程序员

在专业程序员、学生以及自称为程序员的业余爱好者中,绝大部分都属于应用程序员。应用程序员开发的程序或其结果通常给终端用户直接使用。应用程序员开发的程序包括文字处理软件、电子表格、日历、Web浏览器、iTunes与Windows Media Player之类的媒体播放器、游戏等。应用程序也可以由数据库程序员开发,以便对数据库中取出或存入的数据执行特定的操作。数据库应用程序包括财务软件、机票预订系统以及Oracle Financials之类的数据挖掘工具等。

 

一些应用程序员能够跳出代码本身的束缚,与应用程序的用户产生同感,真正从用户的角度看问题,从而很好地把握各种可视化、交互式的设计之间的细微差别。这样的应用程序员很适合从事用户界面(UI)的开发。如果让这样一位有天分的应用程序员与一名UI设计师(通常不仅有图形设计背景,而且对人性甚至认知心理学都有所研究)合作,将产生一加一远大于二的效果。

 

有一些项目(如MacOS的桌面UI——Mac Finder)侧重于UI,要求整个团队都由这种有天分的应用程序员组成。因此,Ron在苹果公司领导Mac Finder团队时,在寻找和面试候选人的过程中,特别看重程序设计技巧和用户视角。他认为:“只懂得程序设计技巧的程序员在那个团队中是无法取得成功的。”

 

2.4 非真正意义上的程序员

开发团队中有一些被称为“程序员”的技术人员其实并不是真正意义上的程序员。他们当中有些人使用图形用户接口(GUI)指定程序逻辑或商业逻辑,然后生成用户可访问的应用程序;有些人则通过创建脚本或修改配置文件来定制显示的内容。这些“程序员”与真正的程序员之间的主要差别在于:他们使用现成的工具或应用程序,而不是自己直接写代码。

 

这类“程序员”有其重要性和价值,但他们的技术深度通常不能与我们所讨论的其他类型的程序员相提并论。随着程序设计工具的出现和日益强大,像这样的程序员正变得越来越多,但在本书中我们不会直接讨论他们。

 

我们所介绍的许多程序设计技术也适用于这种另类的“程序员”。但根据我们的经验,他们中的多数人仅满足于把自己的工作做好,而不像“真正的”程序员那样渴求学习、动力十足。

 

3 领域知识

程序员在组织所处领域或行业的背景与知识也各不相同。

 

我们发现职位的分类、描述和需求中对经验的要求是随着经济状况而变化的。经济状况较好时,组织需要具有宽广领域知识的技术人员和技术经理,希望他们能贡献出创造性的思维、集体的智慧以及在其他领域已经得到运用的实践。例如,Ron受雇从产品领域进入金融服务IT行业时,他的团队已经有了丰富的交互计算经验(Mac操作系统)和娱乐产品(游戏与多媒体工具)。Web在1996年属于新生事物,Schwab需要一个外部技术大神来领导其团队为投资者构建具有高度交互性的Web工具。

 

而当经济状况不好时,组织则会控制规模、缩减开支,只在核心领域功能方面进行快速、有限的发展。企业在这一时期只能够招聘很少数的新雇员,为了降低风险,它们倾向于招聘在特定领域具有多年知识背景的专业人士。

 

不管经济状况如何,每个团队都可以由具有程序设计天赋、领域知识、分析能力以及技术交流能力的人员混合构成。其中领域知识在雇用程序员团队时是一个重要的考量因素。

 

4 程序员的工作要求与能力

要想成功地招聘和管理程序员,首先要认识到每个程序员都有其自身的能力。就像雪花一样,任何两个程序员都不会是完全一样的。我们常常会说,程序员之间写代码的能力可能相差一个数量级。这种差异是怎么出现的呢?教育、经验、天赋以及直觉,还有其他无形的因素,都有可能导致这样的差异。

 

多数程序员不需要借助显式的排名或者头衔,从直觉上就能理解同行之间的差异。但是如果能把程序员的类型与等级正式记录下来,并简要描述每种类型与等级的职位要求与能力,那么管理工作将会轻松很多,项目经理将更容易找到各种任务和项目的较好人选,高级管理层也将能对组织及其构成有更深刻的认识。

 

上一篇:为什么很少见到工资高的程序员炫富?-Java程序员趣谈丨极悦注册
下一篇:Java异步回调机制实际案例讲析-Java项目案例丨Java技术

开班信息