期望一个凡人掌握开发过程中各个方面的知识,合理吗?也许不合理,但是Facebook正是要寻找这样的人。在一个OSCON会议上,一名Facebook的工程师告诉我的,他们只聘请“全能(Full stack)”的程序员。那么,全能是什么意思呢?

对于我,一个全能的程序员应该熟悉每一个层面的技术知识,如果不是全部掌握,也要对所有的软件技术有真正的兴趣。

熟悉整个技术体系的程序员,可以使得周围的人的生活更加容易。这就是为什么我反对在工作场合的技术鸿沟。当然,大公司里的政治和沟通的问题往往会影响他们的发展。我想Facebook招聘策略的目的就在于,如果聪明的人身心俱到,一个好的产品可以在更短的时间内发布。

技术知识体系的分层:

1. 服务器,网络和主机环境

  1. 这包括理解什么会宕机,为什么会,没有任何资源是理所当然的。
  2. 合理使用文件系统,云存储,网络资源,理解数据冗余和可用性。
  3. 在硬件受限的情况下,如何扩展应用。
  4. 那么关于多线程和竞争呢?你猜怎么着,你在你的开发机器上看不到,但是在现实中却经常发生。
  5. 全能程序员可以与DevOps协同工作。系统应该提供有效的错误信息和日志能力。DevOps会在你之前看到这些信息,使它们有意义。

2. 数据建模

如果数据模型存在缺陷,那么业务逻辑和更高的层次将要用奇怪、丑陋的代码来弥补那些模型没有覆盖到的边界场景。
全能程序员知道如何构建合理规范化的关系模型,包括外键、索引、视图、查找表等。
全能程序员熟悉非关系数据存储的概念,理解其比关系型数据存储的优点。

3. 业务逻辑

明白应用程序提供的核心商业价值。
需要扎实的面向对象知识。
需要理解框架。

4. API层面/Action层面/MVC

理解外部如何与业务逻辑和数据模型进行交互。
框架在这里会用得很多。
全能的程序员有能力写出清晰,一致,简单易用的接口。一些API的复杂得使我感到厌烦。

5. 用户界面

全能程序员
a) 知道如何创建可读的布局,或者
b) 明白自己需要帮助艺术和图形设计师。
无论哪一种,实现好的视觉设计是关键。
掌握HTML5/CSS3。
Javascript在将来会是非常重要的一门语言,很多令人兴奋的作品都是用Javascript完成的。(node, backbone, knockout……)

6. 用户体验

全能程序员明白,用户只是想让产品可以正常工作。
一个好的系统不会使得用户患上腕管综合征和眼痛病。一个全能程序员会将一个需要8次点击3个步骤的工序,修改为1次点击。
全能程序员会添加有用的错误信息。如果有什么出错了,要向用户道歉。有时程序员漫不经心写的错误信息会让用户觉得很傻。

7. 理解用户和业务的需求

现在我们模糊的进行的架构设计,但这会远离了真正的需求。
全能程序员会预先看看当用户在使用软件的时候,会发生什么。同时,他们也会关注业务部分。

能够编写质量单元测试。顺便说说,Javascript现在也可以进行单元测试了。
理解持续自动化集成,包括构建应用,测试,编写文档和部署扩展。
安全意识也非常重要,因为每一个层面都会有其易受攻击的地方。

将代码紧紧的绑到一个特定的环境(库,操作系统,硬件等等),是非常糟糕的实践来的。全能程序员理解所有的知识体系,不意味着他们可以走捷径。然而,他们确实会这样做,如果只是建立一个原型的话。

技术型创业公司需要全能程序员的多才多艺。但是,一个成熟的公司,需要更多的是专注的技术。

我不确定在你使用多种语言,使用多个平台,甚至为多个行业工作之前,你是否可以自称为全能程序员。全能程序员要在“高级程序员”之上,因为他们与通晓多语言的程序员在同一线上,但是对各个模块的关系更有全局的意识。注意我刚刚的列表,只有3-5项包含了编写代码。