伤不起的全栈程序员

这里有更好的阅读体验:伤不起的全栈程序员javascript

前段时间据说一个新名词:"全栈程序员",google了一下,被引导到了知乎的一个讨论上: http://www.zhihu.com/question/22420900 。楼主提出了一个问题:怎样成为全栈程工程师,本人也在上面不由自主地回复了一下。回头想来彷佛还有话要说。因为这个话题很容易跑偏,本文只把范围限定在全栈Web软件工程师,简称FSD(Full Stack Developer)css

 

把技术当成生活,本身逼本身的结果

其实在任何公司工做,光凭工做的内容,很难成为FSD。有朋友可能不一样意了,说在创业公司有不少机会作不一样的工做啊,我想说的是,即使是创业公司,公司老是有主营的业务和方向的,就算能从前到后一我的作一个网站,那又怎样,从技术上说,无非也就是掌握了一种或几种数据库,一门或几门后台语言,掌握了html,js,css...大公司呢?更难了,大公司虽然方向不少,可是越是大的公司,我的的螺丝钉效应越明显,你可能成为领域专家,但很难有机会成为完整的机器的。那么全栈程序员的磨练靠的是什么?靠的是一种打心底里的执着和毅力,把技术当成生活,本身逼本身不断的猎取知识。html

 

难以界定,每一个人都有不一样的理解

刚才其实没有鄙视可以完整作网站的人,相反,非常钦佩。至少本人如今在css上还不能算能彻底独立。不过每一个人对FSD的定义其实不同,这跟我的的阅历有必定的关系。只想说,既不要对本身过度自信,也不要过度贬低。一方面,人外有人,天外有天,每一个人覆盖到技术领域是有差别的;另外一方面,FSD其实挺不容易的,不只不容易达到,并且不容易得到存在感。正由于见的多,因此就越以为本身眇小,咱们常常说的,真正的大牛历来就是低调和谦虚的。而FSD在任何领域都不是那种呼风唤雨的专家,别人在讨论的时候可能永远都没有你插话的机会,其实你内心知道,本身还很肤浅。我的自认为是比较接近这么一个性质的程序猿,能够从个人博客的文章内容略窥一二。可是正如我不敢斩钉截铁地将本身定性到这么个层次,恐怕不少全栈程序员也不能将本身明确在这个定位上,由于总有人能站出来给你一个"反例"。前端

 

何去何从

从知乎上的回答来看,FSD彷佛并不吃香。纵观人类发展历程,更细致的社会分工造就了生产力的提升。就程序员行业而言,愈来愈趋于细分话,彷佛也是正常的趋势。做为FSD,实际上挺难的,主要是由于精力的限制,没法在广度和深度上兼顾。尽管如此,我的以为FSD仍是有很明显的优点的:java

  1. 见多识广,解决问题的手段比较多,并且每每可以举一反三的思考;
  2. 不容易被某种技术的新衰而左右,很容易转型;
  3. 合格的FSD每每具备超强的毅力和极客精神,这在某些状况下是颇有用的;
  4. 因为能力普遍,又吃苦耐劳,适合创业;

 

我的理解

针对Web开发的话,稍稍谈一谈我的对全栈程序员能力的界定,大牛们轻拍:mysql

  1. 用户体验层面,html45javascriptcss23,各类前端的框架...
  2. 后台业务逻辑层面,各类编程语言,如今主流的有JavaC#PythonRubyPHPNode.js...,以及配套的各类开发框架...
  3. 辅助层面可能会涉及到CC++等较为古老的编程语言,须要必定程度上熟悉掌握...
  4. 数据库,会设计和使用几种经常使用的数据库,mssqlmysqloracle...,数据库分析和优化
  5. 架构层面,可以设计灵活可靠,易扩展的软件架构和硬件架构。这个层面上要掌握的东西就不少了,网络、存储、操做系统、web服务器、web架构,安全等等...
  6. 一些基础理论层面的东西,算法数据结构、编译原理、网络基础...
  7. 数据分析,数据挖掘
  8. 管理层面,众人拾柴火焰高,一我的再牛b,精力是有限的,若是可以汇集并领导更多的人,那就更全面了。这包括项目管理,持续集成,敏捷开发,版本控制...
  9. 移动开发

若是你是FSD,有什么想说的呢?欢迎全栈程序员们留言交流程序员

 

程序员能力矩阵

一个挺有意思的程序员能力界定,从程序员能力矩阵转载:web

注意:每一个层次的知识都是渐增的,位于层次 n,也蕴涵了你需了解全部低于层次 n的知识。
计算机科学 Computer Science
  2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3)
数据结构 不知道数组和链表的差别 可以解释和使用数组,链表,字典等,而且可以用于实际的编程任务。 了解基本数据结构时间和空间的折中,好比数组vs 链表,可以解释如何实现哈希表和处理冲突,了解优先队列及其实现。 高等的数据结构的知识,好比B-树、二项堆、斐波那契堆、AVL树、红黑树、伸展树、跳跃表以及前缀树等。
算法 不可以找出一个数组各数的平均值(这使人难以置信,可是个人确在应聘者中遇到过) 基本的排序,搜索和数据的遍历和检索算法。 树,图,简单的贪婪算法和分而治之算法,可以适度了解矩阵该层的含义。 可以辨识和编写动态规划方案,良好的图算法知识,良好的数值估算的知识,可以辨别NP问题等。
编程体系 不知道何为编译器、连接器和解释器。 对编译器、连接器、解释器有基本的了解。知道什么是汇编代码以及在硬件层如何工做。有一些虚拟内存和分页知识。 了解内核模式vs用户模式,多线程,同步原语以及它们如何实现,可以阅读汇编代码。了解网络如何工做,了解网络协议和socket级别编程。 了解整个程序堆栈、硬件(CPU+内存+中断+微码)、二进制代码、汇编、静态和动态连接、编码、解释、JIT(just-in-time)编译、内存碎片回收、堆、栈、存储器编址…
软件工程 Software Engineering
  2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3)
源码版本控制 经过日期备份文件夹 VSS和初级的CVS/SVN用户 熟练地使用CVS和SVN特性。知道如何分支和归并,使用程序库补丁安装特性等 有分布式VCS系统的知识。尝试过Bzr/Mercurial/Darcs/Git
自动化编译 只知道在IDE下编译 知道如何编译在命令行下编译系统 可以安装一个脚本构建基本的系统 可以安装一个脚原本构建系统而且归档,安装程序,生成发布记录和给源码控制中的代码分配标签。
自动化测试 认为全部的测试都是测试员的工做。 可以编写自动化的单元测试,可以为正在编写的代码提出良好的测试用例。 按照TDD (Test Driven Development)方式编写代码。 了解而且可以有效自动化安装,载入/性能和UI测试
程序设计 Programming
  2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3)
问题分解 只有直线式的代码,经过复制粘贴来复用 可以把问题分散到多个函数中 可以想出可复用的函数/对象来解决大题的问题 使用适宜的数据结构和算法,写出通用的/面向对象的代码来封装问题的易改变的层面。
系统分解 N想不出比单一的文件/类更好的层面 若是不在同一平台或没采用相同的技术,可以把问题空间和设计方案分解。 可以设计跨技术/平台的系统。 可以在多个产品线和与外部体系一体化中虚拟化和设计复制的系统。同时也可以设计支持系统监视、报告、故障恢复等。
交流 不能向同伴表达想法/主意。匮乏拼写和语法的能力。 同伴能了解你在说什么。有良好的拼写和语法能力。 可以和同伴进行高效的交流 可以使用清晰的方式了解和交流想法/设计/主意/细则,能适应每种环境的交流
同一文件中代码组织 同一文件中组织没有依据 按照逻辑性或者易接近的方法 代码分块和对于其余源文件来讲是易因而释,引用其余源文件时有良好的注释 文档头部有许可声明,总结,良好的注释,一致的空格缩进。文档外观美观。
跨文件代码组织 没够想过给代码跨文件组织 相关文件按文件夹分组 每一个物理文件都有独立的目的,好比一个类的定义,一个特性的实现等。 代码在物理层组织紧密,在文件名上与设计和外观相匹配,能够经过文件分布方式洞察设计理念。
源码树组织 一切都放在一个文件夹内 初步地将代码分散进对应逻辑的文件夹。 没有循环依赖,二进制文件,库,文档,构建,第三方的代码都组织进合适的文件夹内。 源码树的物理布局与逻辑层次、组织方式相匹配。能够经过目录名称和组织方式洞察设计理念。
代码可读性 单音节的名称(在国内应该是那些相似用汉语拼音命名的习惯) 对文件、变量、类、方法等,有良好的命名。 没有长函数、注释解释不常规的代码,bug修复,代码假设。 代码假设验证使用断言,天然的代码流,没有深层嵌套的条件和方法
防护性编码 不知道这个概念 检查代码中全部的参数,对关键的假设进行断言 确保检查了返回值和使代码失败的异常。 有本身的库来帮助防护性编程、编写单元测试模拟故障
错误处理 只给乐观的情形编码 基本的代码错误处理,抛出异常/生成错误 确保错误/异常留在程序中有良好的状态,资源,链接,内存都有被合适的清理。 在编码以前察觉可能出现的异常,在代码的全部层次中维持一致性的异常处理策略,提出整个系统的错误处理准则。
IDE IDE大部分用来进行文本编辑 了解其周围的接口,可以高效地经过菜单来使用IDE 了解最常操做的键盘快捷键 编写自定义宏
API 须要频繁地查阅文档 把最频繁使用的API记在脑子里 广阔且深刻的API知识。 为了使实际任务中经常使用API使用更加便捷,编写过API的上层库,填补API之间的缺口。
框架 没有使用过主平台外的任何框架 听过但没用过平台下流行的可用框架 在专业的职位中使用过一个以上的框架,通晓各框架的特点。 某框架的做者
需求分析 接受给定的需求和代码规格 能对规格的遗漏提出疑问 了解全面状况,提出须要被规格化的总体范围。 可以提出更好的可选方案,根据经验的浮现给出需求
脚本 不具有脚本工具的知识 批处理文件/shell脚本 Perl/Python/Ruby/VBScript/Powershell 写过而且发表过可重用的代码
数据库 认为Excel就是数据库 知道基本的数据库概念,规范化、ACID(原子性Atomicity、一致性Consistency、隔离性Isolation、持久性Durability)、事务化,可以写简单的select语句 可以牢记在运行时必要查询中设计良好的规范化数据库模式, 精通用户视图,存储过程,触发器和用户定义类型。知道汇集与非汇集索引之间的差别。精通使用ORM(Object Relational Mapping对象关系映射)工具 能作基本的数据库管理,性能优化,索引优化,编写高级的select查询,可以使用相关sql来替换游标,理解数据内部的存储,了解如何镜像、复制数据库。知道两段数据提交如何工做
经验 Experience
  2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3)
专业语言经验 命令式语言和面向对象语言 命令式语言,面向对象语言和说明型语言(SQL),若是了解静态类型vs动态类型,弱类型vs强类型则有加分 函数式语言,若是了解延缓求值,局部套用函数,延续则有加分 并发语言(Erlang, Oz) 逻辑语言(Prolog)
专业平台经验 1 2-3 4-5 6+
专业经验年龄 1 2-5 6-9 10+
领域知识 没有该领域的知识 在该领域中曾经至少为一个产品工做过 在同一领域中为多个产品工做过 领域专家。在该领域设计和实现数种产品/方案。精通该领域使用的标准条款和协议
学识 Knowledge
  2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3)
工具知识 仅限于主要的IDE(VS.Net, Eclipse等) 知道一些流行和标准工具的备选方案 对编辑器、调试器、IDE、开源的备选方案有很好的了解。好比某人了解大多数Scott Hanselman的威力工具列表中的工具,使用过ORM工具。 实际地编写过工具和脚本,若是这些被发布则有加分
语言接触 命令式语言和面向对象语言 命令式语言、面向对象语言和说明型语言(SQL),若是了解静态类型vs动态类型、弱类型vs强类型则有加分 函数式语言,若是了解延缓求值、局部套用函数、continuations (源于scheme中的一种高级控制结构)则有加分 并发语言(Erlang, Oz) 逻辑语言(Prolog)
代码库知识 历来没有查询过代码库 基本的代码层知识,了解若是构建系统 良好的代码库工做知识,实现过几回bug修复或者完成了一些细小的特性 实现了代码库中多个大型特性,可以轻松地将多数特性的需求变动具体化,从容地处理bug修复。
下一代技术知识 历来没据说过即将到来的技术 据说过某领域即将到来的技术 下载过alpha preview/CTP/beta版本,而且读过一些文章和手册 试用过预览版并且实际地构建过某物,若是共享给其余人的话则有加分
平台内部 对平台内部毫无所知 有平台基本的内部工做的知识 深度的平台内部知识,可以设想平台如何将程序转换成可执行代码。 编写过加强平台或者为其平台内部提供信息的工具。好比,反汇编工具,反编译工具,调试工具等。
书籍 菜鸟系列,21天系列,24小时系列,蠢货系列... 《代码大全》,《别让我思考》, 《精通正则表达式》 《设计模式》,《人件》,《代码珠玑》,《算法设计手册》,《程序员修炼之道》,《人月神话》 《计算机程序设计与解释》,《事务处理:概念与技术》,《计算机程序设计模型》,《计算机程序设计艺术》,《数据库系统导论》 C.J Date版,《Thinking Forth》 ,《Little Schemer》(没找到其中译本)
博客 听过可是历来抽不出空去接触 阅读一些科技/编程/软件工程的博客,而且常常的收听一些播客 维护一些博客的连接,收集博主分享的有用的文章和工具 维护一个在编程方面,分享有我的看法和思考的博客
相关文章
相关标签/搜索