指望一个凡人掌握开发过程当中各个方面的知识,合理吗?也许不合理,可是Facebook正是要寻找这样的人。在一个OSCON会议上,一名Facebook的工程师告诉个人,他们只聘请“全能(Full stack)”的程序员。那么,全能是什么意思呢?node
对于我,一个全能的程序员应该熟悉每个层面的技术知识,若是不是所有掌握,也要对全部的软件技术有真正的兴趣。程序员
熟悉整个技术体系的程序员,可使得周围的人的生活更加容易。这就是为何我反对在工做场合的技术鸿沟。固然,大公司里的政治和沟通的问题每每会影响他们的发展。我想Facebook招聘策略的目的就在于,若是聪明的人身心俱到,一个好的产品能够在更短的时间内发布。安全
技术知识体系的分层:服务器
若是数据模型存在缺陷,那么业务逻辑和更高的层次将要用奇怪、丑陋的代码来弥补那些模型没有覆盖到的边界场景。
全能程序员知道如何构建合理规范化的关系模型,包括外键、索引、视图、查找表等。
全能程序员熟悉非关系数据存储的概念,理解其比关系型数据存储的优势。网络
明白应用程序提供的核心商业价值。
须要扎实的面向对象知识。
须要理解框架。多线程
理解外部如何与业务逻辑和数据模型进行交互。
框架在这里会用得不少。
全能的程序员有能力写出清晰,一致,简单易用的接口。一些API的复杂得使我感到厌烦。架构
全能程序员
a) 知道如何建立可读的布局,或者
b) 明白本身须要帮助艺术和图形设计师。
不管哪种,实现好的视觉设计是关键。
掌握HTML5/CSS3。
Javascript在未来会是很是重要的一门语言,不少使人兴奋的做品都是用Javascript完成的。(node, backbone, knockout……)框架
全能程序员明白,用户只是想让产品能够正常工做。
一个好的系统不会使得用户患上腕管综合征和眼痛病。一个全能程序员会将一个须要8次点击3个步骤的工序,修改成1次点击。
全能程序员会添加有用的错误信息。若是有什么出错了,要向用户道歉。有时程序员漫不经心写的错误信息会让用户以为很傻。布局
如今咱们模糊的进行的架构设计,但这会远离了真正的需求。
全能程序员会预先看看当用户在使用软件的时候,会发生什么。同时,他们也会关注业务部分。单元测试
可以编写质量单元测试。顺便说说,Javascript如今也能够进行单元测试了。
理解持续自动化集成,包括构建应用,测试,编写文档和部署扩展。
安全意识也很是重要,由于每个层面都会有其易受攻击的地方。
将代码牢牢的绑到一个特定的环境(库,操做系统,硬件等等),是很是糟糕的实践来的。全能程序员理解全部的知识体系,不意味着他们能够走捷径。然而,他们确实会这样作,若是只是创建一个原型的话。
技术型创业公司须要全能程序员的多才多艺。可是,一个成熟的公司,须要更多的是专一的技术。
我不肯定在你使用多种语言,使用多个平台,甚至为多个行业工做以前,你是否能够自称为全能程序员。全能程序员要在“高级程序员”之上,由于他们与通晓多语言的程序员在同一线上,可是对各个模块的关系更有全局的意识。注意我刚刚的列表,只有3-5项包含了编写代码。