V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
JobsLong
V2EX  ›  程序员

理解程序员并不是一项简单的任务, 即使你当过程序员

  •  
  •   JobsLong ·
    JobsLong · 2016-09-29 15:01:21 +08:00 · 2762 次点击
    这是一个创建于 2977 天前的主题,其中的信息可能已经有所发展或是发生改变。

    file

    图片来源 Pinterest

    最近在读一本软件团队管理方面的书 :books: ,是两位在软件行业的资深从业者写的,其中有一个章节在讲如何理解程序员这件事。

    理解程序员并不是一件简单的任务,即使你当过程序员也不例外。

    文中提供的多种视角还是蛮有趣的,转述一下,供大家讨论消遣,还有其实想让大家认识到一个事实就是程序员之间的差异真的非常大,只有很了解程序设计的人才能完全了解这一点,而大多数的高层管理者对所有的程序员都一视同仁,而更多的企业更是把程序员当做工具、资源看待。

    程序设计工种

    这其实是常用也是比较简单的方式去理解一个程序员,就是分析他们的程序设计工作可以归为哪些类型:

    • 客户端程序员
    • 服务器端程序员
    • 数据库程序员
    • Web 开发人员及其他脚本编写者。

    其实有许多特殊的程序设计工作其实很那归类到某种类型。但是总的来说,这 4 中类型就可以覆盖世界上的绝大多数程序员,每一种程序员擅长的问题解决方法、使用的工具以及侧重的产品方向都不一样。不排除有比较天才的程序员能胜任所有工作(现在称他们为 全栈工程师),更多的人其实最多只能把其中一种做好。

    客户端程序员

    大部分程序员都属于客户端程序员。这里的客户端( client )术语指的是程序所在的位置,通常指用户的终端设备。个人电脑 :computer: , 移动设备 :iphone:, iPad 等消费电子设备的出现催生了无数的 “客户端程序 “ , Office 系列、电子表格处理程序、游戏机众多的使用工具,以及成为我们现在生活必备的无数精彩的 App (对了,给喜欢的 app.so 做个硬广) 。

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

    服务器端程序员

    服务器端( server )不仅指出了程序所在的位置,还表明编写程序的目的通常是向远程客户端传输信息和数据。服务器端所在的地方通常和终端设备天各一方,而且大多数(几乎所有)程序必须同时处理来自多个客户端的多种行为,这样开发工作会比客户端程序员开发的程序更复杂一些。在编写和部署( deploy )服务器程序时,通常还要求在增加新机器与资源( scalable )时能不用改变程序的基本结构,这又进一步增加了服务器端开发的复杂度(现在有很多技术栈和机构都是在解决这些问题)。

    在互联网时代,其实客户端 /服务器端就成了 Web 浏览器和在某个地方的 Web 服务器之内交互的代名词。去开发一个客户端上的浏览器确实很复杂,但实践证明,创建能够并行处理数以千、万计的终端用户请求,确实更为复杂。构建这样的系统还通常离不开各个服务器系统与程序之间进行接口转发数据传输与同步的工作。这些都是 Server 端程序员的工作内容。

    数据库程序员

    这类程序员现在相对来说很少见 :smile: 。数据库程序员与客户端或服务器端程序员不同。他们使用完全不同的程序设计语言与工具(通常是对应的数据库领域提供),编写的程序给出的结果也截然不同。数据库程序员通常是对终端或应用程序所使用或产生的数据进行组织、存储和提取工作。现在的 大数据工程师 可以归属于此类。

    这些年来,不同数据库之间的差别在减少,数据程序员也可以进行相对 ”平滑“ 的经验迁移。这里先不考虑像 Hadoop 这类的 ”大数据“ 技术,常用的数据库系统仍然是关系数据库,包括 Oracle 、 Microsoft SQL Server 、 IBM DB2 、 MySQL 、 Postgres 等等,以及一些 NoSQL 数据库。这些系统中的多数关键概念是相同的,都是用 SQL 语句(以及等价的 API )来访问数据。因此,有人可能认为,其中某个系统的专家可能是另一个系统的专家。但是目前来看,除了最基本的数据库操作,否则在特定数据库上的实战经验仍然是必需的。

    书中有个很好的比喻,把数据库程序员比作汽车 :car: 修理工。你可能随便找个汽车修理工帮你换轮胎或者雨刮器,但是对于保时捷汽车上的重要问题,你绝对不会让一个完全不了解保时捷的修理工来做。数据库程序员也是如此。阿里在 Oracle 时代,培育了很多优秀的 DBA ,不过已成为往事。

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

    不同于其他程序员,使用 C 、 C++、 C#、 Java 、 Ruby 、 Go 等核心程序设计语言, Web 开发人员通常使用格式化 HTML 语言(如 HTML 、 XML 、 CSS 、 ASP/JSP )和脚本解释语言(如 Perl 、 PHP 「全宇宙最好」、 JavaScript 「一统天下 :)」)。当然有些 Web 开发人员也会使用更高层次的工具(如 Flash 、 Dreamweaver 或 Clod Fusion )来简化脚本编写和部署过程。

    这其实意味着只从事 Web 开发的程序员虽能够从正规的计算机科学训练中收益,但又不像其他程序员那么依赖正规的计算机科学训练「科班出身」。

    鄙人就是学管理出身的。

    但是目前的发展趋势是,终端设备的计算能力越来越强大,更多的处理工作从服务器移至浏览器,通过 JavaScript 和基于 AJAX 的框架来完成(比如现在的 NodeJS 技术栈),这一变化对 Web 开发产生了深远影响。浏览器兼容性问题一直是 Web 开发人员长期面临的棘手问题,而客户端引入更多的逻辑会加剧这些问题,这就要求 Web 开发人员引入跟多的传统程序设计原理,所引发的需求,要求 Web 开发人员引和客户端程序员一样技术精湛。

    通常来讲,大多数程序员都只专精于其中一个领域,或者说只对某个领域感兴趣。只有在编写 ”适合自己“ 类型的代码是才能获得最大的产出。让程序员加入风格不和的项目只会产生灾难,这是真的。即使某些程序员能够胜任其他类型的工作,但是大多数程序员对此 没什么兴趣

    程序员的类型

    还有另外一种看待程序员的方法,我们经常也会遇到,比如经常看到某些程序员的签名是成为架构师。所以从技术知识、实践经验和程序员的专长去考虑也非常重要:

    • 系统工程师 /架构师
    • 系统程序员
    • 应用程序员
    • 非真正意义上的程序员
    系统工程师 /架构师

    系统工程师 /架构师往往都是最有技术和经验的。要想理解所有相关的系统组件(操作系统、通信系统、数据库、在线 /离线访问、安全性、硬件等等,现在可能要懂得更多)之间复杂的关系,需要对所有的这些技术和系统都有丰富的专业知识和经验。一个规模合理的团队里面估计会有这样的 1~2 个人。 Google 的 Larray Page 和 Sergey Brin 就是类似的系统工程师 /架构师,他们在设计和实现上培育的 优雅风格 帮助公司在技术和商业领域都取得了成功。

    系统程序员

    架构师一般都是从系统程序员做起的,系统程序员负责编写与硬件交互的设备驱动程序,创建能够为设备驱动运行程序和应用程序执行提供运行时( Runtime )环境的操作系统,为其他程序员创建编译器和调试工具,通常还为其他程序猿提供工具和服务用于交付程序。有点类似民间宗教中的大祭司,元老级人物。

    很多系统程序猿着装和举止比较非同常人,社交能力可能欠佳,或者他们不愿意和正常人交流。不过有意思的是,现在极客已经成为了流行词。本书的两位作者曾经是系统程序员。

    应用程序员

    在专业程序员、学生以及自称为程序员的业余爱好者中,绝大部分属于应用程序员。应用程序员开发的程序或其结果通常给终端用户直接使用。包括我们常见的桌面客户端应用和 App Store 中的软件和游戏等,都是有应用程序员开发,数据库程序员也会开发一些应用程序,以便对数据库中取出或存入的数据执行特定的操作,比如,财务处理软件、机票预订软件等等。

    还有一些应用程序员能够跳出代码本身的束缚,与应用程序的用户产生同感,真正从用户的角度看问题,从而很好的把握葛总可视化、交互式的设计之间的细微差别。这种人比较适合从事用户界面( UI )开发。如果让具有这样天分的应用程序员和另外一个 UI 设计师(不仅有图形设计背景,而且对人性甚至认知心理学都有所研究)合作,会产生一加一远大于二的效果。 Vue 的作者 Evan You 就是最近我觉得把代码和设计思维搭配的超赞的人。有一些项目侧重于 UI (比如 Mac Finder ),会要求整个团队的成员都有这种天分的程序员组成。

    非真正意义上的程序员

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

    他们使用现有的工具或应用程序,而不是自己直接写代码。

    这类 「程序员」 有其重要性和价值,但他们的技术深度通常不会太高。而且随着程序设计工具的出现和日益强大,这样的程序员会越来越多。再加上人工智能的发展,说不定将来大多数程序员的工作内容会是这样的模式,不再需要去敲代码。

    不过根据本书作者的经验,这部分程序员多数人仅满足于把自己的工作做好,而不像 「真正的」程序员那样渴求学习、动力十足

    个性特点

    左脑型的人和右脑型的人

    大家可能都听说过左右脑理论,这来自于 Roger W. Sperry 的研究,他的研究表明大脑的左半球和右半球具有针对不同人物的专门功能。左脑通常专用于分析任务和语言表达人物。左脑的表达能力比右脑强的多,而右脑主要用户空间感知任务、音乐等。

    程序员或者技术人员,一般是左脑为主型。对于一个程序员来说,强大的左脑分析能力是必不可少的。不过右脑相关的活动往往也同样重要,这是因为程序设计是一门有创意的艺术(我个人更认为像是写小说)。事实上,一些最顶尖的程序员同时也是音乐 :musical_note: 家。大家不觉得音乐创作中的创造性部分和歌曲的演奏学习和写程序非常类似么?

    夜晚型的人与白天型的人

    与多数企业的多数雇员不同的是,多数程序员属于夜晚型的人。他们通常上班时间过了好久之后才到单位,并且工作到下班以后很久,当关键性的项目或自己感兴趣的项目进展到中途是常常能工作到深夜。如果团队里面夜猫子比较多,沟通就非常重要。 不知道大家有没有因为上班时间而离职的 :smile: 。

    内向的人

    有些程序员非常沉默、非常内敛、几乎感觉不到他们存在。他们可以把工作完成的很出色,但是对团队动力或在会议上几乎没有什么贡献。你能和他一对一的进行交流,但是退回到人群以后就几乎消失了。作为一个团队,需要通过一些有效的机制鼓励这些人更多的分享和发言,通过一些小事情建立特殊的联系,比如分享经验或者一本书,总之需要想办法建立更亲密的联系。

    愤世嫉俗的人

    团队应该和愤世嫉俗、充满愤怒、粗鲁、刻薄的程序员划清界限,即便是这些程序员技术很高超。

    从多个视角理解程序员,是非常有必要的,毕竟不同的程序员之间的能力可能相差一个数量级,不管是招聘他们来工作,还是寻找技术伙伴,都需要对程序员有更多的了解。

    推荐阅读

    • 告别失控:软件开发团队管理必读(正在深入阅读并实践)
    • 人月神话(当年学英语的时候,把这本书的英文版抄了一遍 :neckbeard:)
    • 编程之道(还没有拜读过)

    声明:首发于 Laravel China 社区,转载请保留此声明, TKS 。 作者:「 JobsLong.com 」

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2725 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 06:48 · PVG 14:48 · LAX 22:48 · JFK 01:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.