Growth: 全栈增长工程师指南

开篇

全栈工程师是未来。因为技术门槛下降,导致一个web应用只需一两个人就可以。组织架构的变迁,也赋予每个人的职责越来越多。

技术的革新史,CGI到MVC到前后端分离的架构模式,不断降低技术的门槛。

组织架构,瀑布式开发到迭代式敏捷开发到精益开发,解决沟通,需求变更等问题。

大公司需要解决性能问题,需要专家式任务,小公司需要活下去,需要近乎全能的人,需要全栈工程师。全栈和专家都符合20/80法则,两种角色都需要20%的时间,达到某一领域80分水平。专家会继续花80%时间深入这个技术领域,全栈会用这个80%时间探索新的四个领域。

基础知识篇

讲几件事,使用怎样的操作系统,如何选择工具,如何搭建响应操作系统上的环境,如何学习一门语言。

工具只是辅助,好的装备确实能带来一些帮助,但事实是,你的演奏水平是由你自己的手指决定的。

WebStorm还是Sublime?IDE及Editor之战,主要精力应该放在学习的东西上,而不是工具。工具是为了效率 寻找工具的目的和寻找捷径是一样的,我们需要更快更有效率地完成我们的工作,换句话说,我们为了获取更多的时间用于其他的事情。而这个工具的用途是要看具体的事物的。如果你负担得起你手上的工具的话,那么就尽可能去了解他能干什么。那些是最实用的,如同我们日常工作中使用的 Linux 一样,记忆过多的不实实用的东西,不如把他们记在笔记上实在。我们只需要了解有那些功能,如何去用他。

语言也是一种工具。我们选择语言一样,选择合适的有时候会比选得顺手的来得重要。需要编译的时候习惯用 IDE,不需要的时候用Editor。以前不知道 WebStorm 的时候,习惯用 DW 来格式化 HTML, Aptana 来格式化JavaScript。

提高效率的工具。在提交效率的 N 种方法里:有一个很重要的方法是使用快捷键。如果是从头开始搭建环境的话, IDE 是最好的——编辑器还需要安装相应的插件。所以,这也就是为什么面试的时候会用编辑器的原因。

DEBUG工具。有些 IDE 自带了 Debug 工具,这点可能使得使用 IDE 更有优势。在简单的项目是,我们可能不需要这样的 Debug 工具。因为我们对我们的代码库比较熟悉,一个简单的问题一眼就知道是哪里的问题。而对于那些复杂的项目来说,可能就没有那么简单了。 Debug 工具——对于前端开发来说,我们可能使用 Chrome 的Dev Tools。但是对于后端来说,我们就需要使用别的工具,如Intellij Idea的 Debug 界面。

终端或命令提示符。在终端上也会有同样的工具——只是你觉得记住更多的命令。并且不同的
工具对于同一实现可能会不同的规范,而GUI 应用则会有一致的风格。不过,总的来说使用终端是一个很有益的习惯——从速度、便捷性。当你使用 Linux 服务器的时候,你不得不使用终端。

包管理。包管理不仅仅存在于操作系统中,还存在着语⾔的包管理工具。在操作系统中
安装软件,最方便的东西莫过于包管理了。我们经常会使用各式各样的包管理工具,来加速我们地日常使用。而不是 Google某个软件,然后下载,接着安装。

学习一门语言的艺术。学习一门新语言的步骤。

应用一门新的技术。学习⼀门新的技术的最好实践就是⽤这门技术对现有的系统⾏重写。

从浏览器到服务器。curl -v https://www.baidu.com。我们会发现解析 DNS 的时候,我们需要先本地 DNS 服务器查询。如果没有的话,再向根域名服务器查询——这个域名由哪个服务器来解析。直⾄最后拿到真正的服务器 IP 才能获取页⾯。当我们拿到相应的 HTML、 JS、 CSS 后,我们就开始渲染这个页⾯了。

从HTML到页面显示

HTML。超⽂本标记语⾔所以我们可以发现其中的关键词是标记——markup,也就是说 HTML 是⼀个markup, head 是⼀个 markup, body 也是⼀个 markup。

CSS。如果说 HTML 是建筑的框架, CSS 就是房⼦的装修。作为三剑客之⼀,它的主要⽬的在于可以让我们⽅便灵活地去控制 Web页⾯的外观表现。我们可以⽤它做出像淘宝⼀样复杂的界⾯,也可以像我们的书本⼀样简单。

JS。JavaScript 现在已经⽆处不在了,也许你正打开的某个⽹站,他便可能是 node.js
+json+javascript+mustache.js 完成的,完整的 JavaScript 应该由下列三个部分组成:核⼼ (ECMAScript)——核⼼语⾔功能;⽂档对象模型 (DOM)——访问和操作⽹页内容的⽅法和接口;浏览器对象模型 (BOM)——与浏览器交互的⽅法和接口

前端与后台

主要讲解 后台语言与选型,前端框架与选型,前端一致化与后台服务化的趋势,前后端通讯。

后台语言选择。

JS。JavaScript 似乎是⼀个性价⽐⾮常⾼的语⾔。只要是 Web 就会有前端,只要有前端就需要有 JavaScript。与此同时 Node.js 在后台中的地位已经愈发重要了。这些应⽤都是基于浏览器来运⾏的,有:
• Electron + Node.js + JavaScript 做桌⾯应⽤
• Ionic + JavaScript 做移动应⽤
• Node.js + JavaScript ⽹站前后台
• JavaScript + Tessl 做硬件
So,这是⼀门很有应⽤前景的语⾔。
Python。
Java。JavaScript 造出各种我想要的东西,但是通常我⽆法保证他们是优雅的实现。过去⼈们
在 Java 上花费了很多的时间,或在架构上,或在语⾔上,或在模式上。由于这些投⼊,都给了⼈们很多的启发。这些都可以⽤于新的语⾔,新的设计,毕竟没有什么技术是独⽴于旧的技术产⽣出来的。
PHP。不得不提及的是 WordPress 已经占领了 CMS 市场超过⼀半的份额,并且它也占领了全球⽹站的四分之⼀。
Go。性能应该是相当可以的
Ruby、 Scala,对于写代码的⼈来说,这是⾮常不错的语⾔。但是如果是团队合作时,就有待商榷。
MVC。⼈们在不断地反思这其中复杂的过程,整理了⼀些好的架构模式。
层次 职责
表现层 提供服务、显⽰信息、⽤户请求、 HTTP 请求和命令⾏调⽤。
领域层 逻辑处理,系统中真正的核⼼。
数据层 与数据库、消息系统、事物管理器和其他软件包通讯。
举例Spring,iBatis。
而在前后端解耦和的系统中,通常系统的架构模式就变成了MVP,或者MVVM。
后台即服务。BAAS backend as a service 是一种新型的云服务,旨在为移动和 Web 应 ⽤提供后端云服务,包括云端数据/⽂件存储、账户管理、消息推送、社交媒 体整合等。
产⽣这种服务的主要原因之⼀是因为移动应⽤的流⾏。流行的原因是移动应用的流行。
数据持久化。view层可以直接从model层取数,⽆遗也会暴露数据的模型。作为⼀ 个前端开发⼈员,我们对数据的操作有三种类型:
1. 数据库。由于Node.js在最近⼏年⾥发展迅猛,越来越多的开发者选择使⽤Node.js 作为后台语⾔。这与传统的Model 层并⽆多⼤不同,要么直接操作数据库,要么 间接操作数据库。即使在NoSQL数据库中也是如此。 2. 搜索引擎。对于以查询为主的领域来说,搜索引擎是⼀个更好的选择,⽽搜索引 擎又不好直接向View层暴露接⼜。这和招聘信息⼀样,都在暴露公司的技术栈。 3. RESTful。RESTful相当于是CRUD的衍⽣,只是传输介质变了。 4. LocalStorage。LocalStorage算是另外⼀种⽅式的CRUD。
说了这么多都是废话,他们都是可以⽤类CRUD的⽅式操作。
数据库,除了对文件的增删改查,我们需要操作用户的操作记录,如果这个也交给文件,那就麻烦了。SQL 是⾼级的⾮过程化编程语⾔,它允许⽤户在⾼层数据结构上⼯作。Node.js的ORM框架Sequelize。
搜索引擎。有相当多的⽹站采⽤了搜索引擎作为基础的存 储服务架构,⽽且他们并⾮⾃动从互联⽹上搜索信息。搜索引擎应该分成三个部分来组 成:1. 索引服务 2. 搜索服务 3. 索引数据。从架构上来说,使⽤搜索引擎的优点是:分离存储、查询部分。从开发上来说,它 可以让我们更关注于业务本⾝的价值,⽽不是去实现这样⼀个搜索逻辑。

前段框架选择。Augular, React,vue,jquery,backone+zepto+mustache

前台与后台交互。在我们把后台服务化后,前端跨平台化之前,我们还需要了解前台和后台之间怎么 通讯。从现有的⼀些技术上来看,Ajax和WebSocket是⽐较受欢迎的。
Ajax。返回的内容可以是多种格式,如 XML 和 JSON,但是从近年的趋势来看, XML 基本上已经很少看到了。这⾥我们以 JSON 为主。。JSON 采⽤完全独⽴于语⾔的⽂本格式,但是也 使⽤了类似于 C 语⾔家族的习惯(包括 C、C++、C#、Java、JavaScript、 Perl、Python 等)。
JSON WEB tokens。JSONWebToken(JWT)是⼀种基于token的认证⽅案。
WebSocket。

 

编码。展示了一种编码过程。

web应用的构建系统。构建系统(buildsystem) 是⽤来从源代码⽣成⽤户可以使⽤的⽬标的⾃动化 ⼯具。⽬标可以包括库、可执⾏⽂件、或者⽣成的脚本等等。常⽤的构建⼯具包括GNUMake、GNUautotools、CMake、ApacheAnt(主要⽤于 JAVA)。此外,所有的集成开发环境(IDE)⽐如QtCreator、MicrosoftVisualStudio 和Eclipse都对他们⽀持的语⾔添加了⾃⼰的构建系统配置⼯具。通常IDE中的构建系 统只是基于控制台的构建系统(⽐如Autotool和CMake)的前端。 对⽐于Web应⽤开发来说,构建系统应该还包括应⽤打包(如Java中的Jar包,或 者⽤于部署的RPM包、源代码分析、测试覆盖率分析等等。
Gulp入门指南。

Tasking。讲了Tasking的流程,以tasking写书和 tasking 代码为例。

如何编写测试。写测试相⽐于写代码来说算是⼀种简单的事。多数时候,我们并不需要考虑复杂的 逻辑。我们只需要按照我们的代码逻辑,对代码的⾏为进⾏覆盖。从结构上来说,上⾯的⾦字塔可以分成三部分:1. 单元测试。2. 服务测试 3. UI测试
测试替身。stub 和 mock
测试驱动开发。红-绿-重构。,通常来说测试代码和功能 代码的⽐例可能是1:1,或者是2:1等等。
可读的代码。
代码重构。降到 Intellij Idea 重构。用IDE功能。
过度设计与设计模式。在软件迭代的过程中需求总是不断变化的,这就意味着如果我们对我们的代码 设计越早,那么在后期失败的概率也就越⼤。设计会伴随着需求⽽发⽣变化,在当时看 起来合理的设计,在后期就会因此⽽花费过多的代价。

上线。
隔离与运行环境。讲到了几层,真机,虚拟机,虚拟容器,servlet容器,虚拟环境,语言虚拟机,DSL。

数据分析
借助 Google analytics 收集用户的数据。新的想法在适当的时候就会变成一个产品,接着我们就
开始收集用户数据,然后循环。

构建-衡量-学习。我们根据我们的想法去创建我们的产品,在使用产品的过程中我们收集一些数据,再依据这些数据来改进我们的产品。想法实际上便是解决一个痛点的解决方案。我们并不缺少Idea,我们只是一直没有去记录。我们需要快速地构建出一个 MVP 产品, 也就是最小可用的产品。

产品-衡量。客户开发可以分成五个步骤:
• 形成假设。即我们觉得有用
• 找到可以交谈的潜在客户
• 提出恰当的问题
• 从答案中找到有⽤的信息
•弄明白现阶段需要构建什么样的产品来保持下一个学习循环。
我们其实就是在了解我们的客户是谁,以及他们的需求。并且在这
个过程中,我们可以为我们的开发确认出清晰的假设,我们可以一点点地打造出用户喜
爱的产品。

数据-学习。在分析数据之前,我们需要确定我们的增长模型,即:
• 黏着式增长引擎——其重点是让用户成为回头客,即让客户持续使用我们的产品。
这就意味着,我们在分析数据和学习的过程中,我们要侧重于关注流失率和使用频率。
• 病毒式增长引擎——其只做一件事:让名声传播出去。即通过用户间的不断传播来
扩散产品,我们需要考虑所谓的病毒式传播系数,还有用户之间的特定行为。
• 付费式增长引擎——赚钱是识别商业模式是否可持续的指标。
针对不同的增长引擎有不同的学习过程。

数据分析。简单地将这个过程分成四个步骤:
• 识别需求
• 收集数据
• 分析数据
• 展示数据
在这个跨越多个领域的过程中,回归敏捷是个不错的选择。1. 通才高于专长, 2.小团队大于大团队3.使用高阶工具和平台:云计算、分布式系统、 PaaS 4.持续、迭代地分享工作成果,即使这些工作未完成

用户数据分析: Google analytics。 不仅仅可以用于web 应用,也可以用于移动应用。

应用性能指数。任务响应事件定义为: 当用户操作(鼠标点击、输入、回车)开始到系统(客户机、
网络、服务器)响应从而用户能继续这个过程所经过的时间。这些等待时间定义了应应用程序的 “响应度”。该指数是基于应用程序响应度的三个方面:满意,容忍,挫折。

网络性能。针对网站性能优化。如以下。
减少HTTP请求。合并JS和CSS,CSS SPrites,拆分初始化负载,划分主域。
页面内部优化。HTML页面优化的目的就是尽快渲染出页面。常见策略: CSS放在顶部,将JS放在底部,压缩HTML。
减少下载量。也就是减少对服务器的请求。如使用CDN,使用外部 JS和CSS,缓存。
网络连接上的优化。主要是对域名到服务器进行优化。如DNS域名解析加速,减少DNS查找。

SEO。



持续交付。交付管道的建立和自动化是持续交付的基础。
持续集成系统。
持续集成流程。
持续交付。持续交付依赖于一系列的工具和实践,还有一系列与开发无关的技能:
1. 自动化
2. DevOps
3. 云基础设施
4. 以软件为中心的哲学

基础设施。
持续集成环境。
测试环境。

遗留系统与修改代码。

 

posted on 2017-02-05 14:55  chenb  阅读(667)  评论(0编辑  收藏  举报

导航