第三节、技能的延伸与总结 在前面讲的几个方向中,我们是从专业化工种的角度来对所学习的方向进行了划分,但是实际上,在学习一个方向时,不可避免,会从两个角度来延伸所学的东西。即使在同一段时间,我们专注于一个技术方向上,但是随着技术发展,项目的进展或者我们自身的成长,也会了解得越来越多,所以对于工作多年的程序员而言,学习多种技术,不是被迫,而是自然而然的结果,下面我们来稍加展开来描述。 一个方向就是本身技术链条上的加深,指的是你做的这一行,会牵涉到开发的上下游关系,如果你不想有所作为的话,也可以只专注在手上的那点事情,完成工作就 OK 了,但是这对个人的成长是不利的,你应该沿着上下游戏去了解更多的技术,加深对业务的巩固和了解。 比如 PHP 开发程序员,做到了两到三年,必然就面临着一个新的提升,你如何完成这个提升,需要学习的内容就不仅仅再学一个框架,学会使用 PHP 技术做数据库增删改查的问题了。而是你需要去考虑 PHP 本身在大项目中,代码组织如何更为优雅,如果考虑使用设计模式等技术,让代码本身也更加的规整和漂亮,同时性能也更优化。比如对数据库的了解除了熟练编写 SQL 语句之外,可能还需要加上运维的环节,除了程序本身的部署之外,还需要加上数据库的优化,甚至是结合其他技术来提升整个系统的效率。比如我们可能需要用到 Memcached 来做缓存,需要用到 APC 来做 OpCode 优化,需要用到 Redis 或者 MongoDB 来存储非传统的关系型数据,需要用到全文检索等分离服务,减轻数据库的压力。只有经过这样的一个环节的进步,你的开发水平,才能由一个普通的开发人员,往高级甚至资深的开发人员迈进,否则,可能永远只是一个搬砖的码农。到这里我想起了笔者曾经在讲座上做过一个调查,就是在场的朋友们,有多少人认为编程是一碗青春饭?有多少人认为编程到了一定程度就去转管理?不出所料,在场举手的人数在1/3到1/2,在场的还都是有一定工作经验的程序员,如果要是小白或者大学生,这个举手比例也许会更高。这就是对程序员生涯的一种理解问题。笔者认为,如果我们在学习一个职业方向之后,不去持续学习和做技能的延伸学习,比如学习了 PHP 之后,做的就是简单业务开发和增删改查的工作,那编程就是一碗青春饭,因为你做到了 30 岁,还在做增删改查,你不见得做得过初出茅庐的小伙子。工资还比他们高,公司不淘汰你淘汰谁呢?但是像上面所说,你在技术的链条上,越钻越深,那编程就不是一碗青春饭。至于编程转管理,更是一个伪命题,首先管理者始终是少数,其次,在编程这一行当,做管理的前提是技术牛,如果技术不行,做了管理,也做不好,是服不了众的。 言归正传,这些高级内容的进步和学习,也是基于你有良好的基本功之上的,比如你连基本的增删改查都没有利索,就去追求一些高级的名词和技术,这会让你的高塔起于浮沙之上,这是相当危险的。除了技术上的提升之外,作为程序员,在本身链条上的延伸,还包括一些软性的东西,比如项目管理,比如对业务的分析和组织能力,这些能力也将决定你的高度,如果是资深码农,可能不需要这种能力,但是要作主管或者架构师,业务能力就是必须的了。 二是技术栈上的延伸 技术栈是指完成一件事情所需要的技术,这里分别以移动端应用开发和 Web 前端举例来进行说明。移动应用开发,相对所需要的技术是比较少的,Java 或者 Swift 语言,然后就是控件库、网络库、第三方库等,构成了移动应用。但是一方面为了更好地同项目团队的成员沟通,一方面也为了了解整个项目的运行。所学的东西,就可以移动应用开发为基准点来向后延伸。对 HTTP 协议的了解是第一层次的,更多的包括各种云服务的使用,对于即时通信的部分,使用 HTTP 协议,还是用 WebSocket 协议来建立通信机制,API 的开发和设计规范、实现等也值得去了解。那个这种延伸学习方式就与第一种不同,是完成一件事情在技术栈上的延伸,从移动应用前端延伸到相关的 API 和协议,再从协议延伸到后端技术,甚至从后端技术延伸到后端架构,形成了完整的这样一个技术栈,就达到了所谓全栈工程师的境界。 技术栈的延伸并不简单,这意味着要学习更多的技术、软件,也需要学习新的编程语言。但是对于 Web 前端的开发人员,这种延伸相对更加容易,因为 JavaScript 也能应用在后端开发中。这就是著名的 Node.js。作为 Web 前端的开发人员,前端的学习已经很不简单,各种浏览器兼容、库、响应式设计、动画特效设计等。与此同时,前端开发人员还需要了解如何同后端进行数据通信,包手 Socket.io 这种通信方式也包括 Ajax 这种方式,无论那种,前端人员都可以也应该了解后端是如何实现的,进一步就可以了解后端应用和后端 API 的开发,简单地讲,就是 Node.js 后端应用的开发,学习 Node.js,毕竟比学习一门全新的语言,比如 PHP 成本更低。学习 Node.js 就需要了解异步机制、事件模型、模板引擎、数据库等技术。前后结合,无论是对开发的认识,还是开发水平,都会提升到一个新的层次。在前端优化准则,像缓存、etags、BigPipe 等技术,都是需要前后端结合了解的。 三是技术广度上的延伸 在学习同一门技术时,我们不能仅限于眼下的技术,以此为专业的同时,还需要站在更高的角度看问题。比如移动互联网客户端开发技术,客户端应用的开发也分成了几个方向和开发手段,以平台为例,有 iOS、Android、Windows Phone 方向,比跨平台性为例,有跨平台的 HTML5 WebApp 包装、有 Adode Air 的开发模式、也有跨平台的原生技术,如 Xamarin,在 2015 年,Facebook 还推出了React Native 技术,让我们能使用 JavaScript 实现原生移动应用开发。从开发模式上看,也有纯 WebApp 模式、Cordova 混合开发模式和原生开发模式。尽管我们可能只是从事其中的一方面,但是对其他的了解和关注,也是非常必要的。这里有一种心态,我建议大家慎重对待。笔者相对是比较快接受 Swift 从事 iOS 开发的,但是在同一些经验相对丰富的 iOS 人员交流的时候,他们对此不屑一顾,认为 Swift 目前还远远没有完善,只是玩具。如果这种心态对待 Swift ,我想是不正确的。任何新事物刚刚出现的时候都是比较弱小的,但是不妨碍它已经能适合生产使用,对开发人员更友好,提高开发效率。这也是我推崇在技术的学习上一定要延伸的原因。 四是万变不离其宗 对于各个方向延伸的表述,我并没有针对一个方向一个方向地展开来讲,因为一句话,万变不离其宗。这句话有三层含义: 一是上面分别对于特定技术的延伸的这些描述,放到其他方向上也是适用的,无论你学哪个语言作为后端,或者是前端还是移动端开发,缓存、效率、优化,这些名词都是成为高手的必经之路。而项目管理和业务分析技能更是和使用何种技术没有关系。 另一层含义是学习看起来这么多方向和各种语言,其实核心和精髓都是一致的,这也是很多高手,为什么半天就能学会一门编程语言,一个周末就能开发出应用来的原因,笔者当初就用了一个周末学习了 Swift 语言,并成功地开发出 Swift 2048 这样就小游戏,同时在周一的时候,就录制成视频课程。为什么会这么块?因为技术太相通了。学过了 C、C++、Java、PHP 等语言之后,面对新的 Swift,只需要去了解一些不同的新概念,然后辅助以实例。而不需要一点点地从头学起。所有的语言无外乎都是这样的一个套路。 1、变量、常量定义、数据类型等基本语法,再加上顺序、条件、循环等结构,然后进行函数、面向对象的环节,而面向对象又是封装、继承、多态、重载、覆盖、抽象、静态等术语不同的实现。 2、了解完这些,基本语法就差不多了,我们就进入函数库的环节,无非就是输入、输出、文件、多线程、时间、日期、网络等库和内容需要了解。 3、如果是有界面开发的,无论是 C# 的 Windows Form、还是 Java 的 AWT、Swing 还是 Android 的 View、iOS 的 UIKit,都是相通的。甚至操作方式都相通。 第三层含义,那些基础和核心的东西,包括操作系统原理、计算机组成、网络原理,尤其是数据结构、算法,这是我们做一切程序开发的基本,这些东西的厚度和我们的努力程度决定你在计算机编程行业的高度和深度。尤其是从别的专业转行到计算机编程行业的童鞋,这一块是比较薄弱的,无论如何一定要补上基础的部分。这才是“万变不离其宗”的那个真正的宗。 总结来看,即使延伸,我们看到的也是有依据的延伸,不是今天学这个,明天学那个。同时学东西要抓住核心和本质的内容,然后重点关注不同,这样学起东西来才快。 第四节、全栈工程师与架构师 经过了方向的学习和技能延伸的学习,就可以讨论两个更为高级的技术方向了。当技术栈在一个方向上延伸,同时在技术栈上有一定积累的时候,实现了一专多能,就可以说是全栈工程师了。那到底什么是全栈工程师,全栈工程师好还是不好,也是众所纷纭。 跟谷歌所倡导的“创意型人才”类似,全栈工程师是Facebook 所首倡的人才标准。笔者也有幸同Facebook的早期技术专家蒋长浩和魏小亮有过近距离的交流,了解到Facebook在招人时,招进来的往往是应届生,并且不限岗位,而是用新兵训练营类似的机制发现和选拔人才,并且工程师文化决定了工程师的话语权和相当的工作自由度,导致了人的能力相对全面和从事项目的多样性。至于具体定义下来,什么是全栈工程师,作为国内第一家倡导全栈工程师培训的企业,优才学院自己的看法如下: 全栈工程师(Full Stack Engineer 或 Full Stack Developer),又名全端工程师,是对软件开发人员的一种定义,主要指那些掌握多种技能,并能利用多种技能独立解决各种问题的人才。作为优秀人才的全栈工程师,满足以下四点要求。 * 技术全面 作为全栈工程师,其技术当然要比较全面。从前端到后端、从运维到优化、从PC到移动,都难不倒,即使暂时不会,也能够通过短暂的时间学习能攻克难关。 但又有自己比较精通的一方面。也就是说作为全栈工程师既要有专深,同样也要有广博,这样才能在解决问题时不受局限,融会贯通,但是又不能什么都会,什么都不精,因为这样,他的职业价值就不存在。 * 思维心态 全栈工程师以积极主动的姿态来面对和解决工作中的问题。以全局的观点来看待自己所从事的项目, 而不只是自己负责的一小部分。以做成产品、做成一件事的观点来看待整个开发流程,而不仅仅是技术实现。 因为只能这样的心态和观点,他才会积极主动地去学习其他技术,用其他技术解决问题。否则可能就会局限在自己的技术和工作范围中,不会用心努力地学习更多的技术,用更多的方法来解决问题。 * 上升能力 全栈工程师并不意味着全能,什么都会。但是全栈工程师有良好的基础技能。 这个技能,既包括计算机科学的基础,也包括英语基础,有了这个基础, 加上积极的态度,开放的心胸,就能快速地学习所需要的技术,比如像Swift语言,那都不是事儿。 并应用在所需要的开发工作中,上升能力说到底是一种持续积累形成的学习能力。 * 职业价值 Facebook说,他们只喜欢全栈工程师,创业公司说,我们需要全栈工程师。无论是在大公司,还是创业公司, 全栈工程师都将成为抢手人才!那是因为,全栈工程师不但技能全面,而且心态积极,学习能力强!所以全栈工程师有很好的工作前景。笔者常举的一个例子是,有一个朋友,是做PHP的,曾经在腾讯做微博产品,在腾讯这样基础设施完善的公司,其实做产品开发是很幸福的,难度也不大,因为只需要调 API,写业务逻辑就OK了。但是当他升T3.1的时候,公司还是考核了很多架构方面的能力,这就是说,大公司的资深工程师,也必须是全栈工程师。 我们认为,全栈工程师不是所有的技术都会,才叫全栈工程师,在技术栈上一专多能就可能称为全栈工程师,所以优才把全栈工程师也按 Web、JS、Android、iOS 方向进行区分,但是在课程体系的设计上,在相应的方向上进行技术栈的延伸。比如 Web 全栈方向上以 PHP 为主要语言基础,会对 HTML、CSS、JavaScript 等基本开发功底进行提升训练,同时会从 PHP 延展到数据库的优化、分布式系统和运维相关的内容。对于 JS 方向,则除了浏览器端和移动端前端的学习之外,也会去了解 HTTP 协议以及后端 API 服务等的开发,会从 Node.js 和 PHP 这些方向去延展 JS 学习的视野,而不仅仅局限在浏览器上,当然到了现在这个时代,混合式开发和 React Native 等原生开发技术,也成为 JS 全栈学习的重要内容。Android 和 iOS 同前端开发有些类似,除了应用端业务逻辑的的开发之外,也会去了解后端的内容和跨平台开发的内容。在业务技能之外,优才也会重视基本功的训练和学习,比如特有的OnlineJudge 系统,让学员可以进行算法提升的训练,让其具备一个扎实的工程师基础,尤其是一个全栈工程师的基础。 至于架构师,是全栈工程师发展的下一层境界。对于全栈工程师的要求更多的是在技能的层面。而架构师的要求则上升到一个统筹的层面。我们从做事的层面也分析一下工程师和架构师有何不同。 工程师,由于专注技能,往往是指功能开发和需求实现,而这种实现也是强调局部或者一个版块的。比如前端工程师负责浏览器或者移动端的实现,后端工程师负责服务器端逻辑的实现,即使全栈工程师,也不过是一个人既实现了前端和实现了后端罢了。那么架构师呢?他的侧重点,除了能参与编写整个项目的一部分核心代码之外,更需要理解整个产品的业务结构,从而对项目版块的切分、技术人员的安排、服务器的规划部署、关键技术的选型、技术方案设计有相当的研究,从而使整个产品开发,走在顺利的路上,使项目的生产运营也稳定快速,在重要技术的使用上,也少一些坑,从而降低项目风险。在互联网团队中,项目周期等管理的角色,往往由产品经理来主导,而技术经理的角色往往在于技术人员的分工协调和难题解决,架构师的角色,则为整个项目的开发,提供了强大的技术支持和起到了主心骨的角色。架构师由于在资源有限的环境下规划项目资源的使用,所以常见的看法是架构师在项目中往往起到妥协和平衡的作用。要么空间换时间,要么时间换空间,要么体验换速度,要么速度换体验,当然这个置换下来的体验也是产品经理能接受,用户不易察觉的体验。有关如何成为架构师,如何做好一名优秀的架构师,已经脱离了本书的讨论范畴,这里也不再展开叙述,只想送给大家一句,架构师,应该是任何一个想在技术上有所成就的程序员所追求的目标,而不仅仅是全栈工程师。