当我们谈论“全栈”开发者时,我们在谈论什么?

“全栈”开发者是近年来出现的一个热词。究竟什么是“全栈”开发者,怎样才能成为“全栈”开发者?我将在本文中谈谈对这几个问题的理解。

  • 什么是“全栈”开发者

"全栈"(Full Stack)一词包含了两个字 - “全”和“栈”。我们先来看看什么是"栈",它一般有以下几个方面的含义,并且常常被混用:

  1. 一种后进先出的线性数据结构
  2. 函数调用栈(Callstack)
  3. 函数调用栈反映出的系统的层次结构和依赖关系

"全栈"一词中的"栈"是含义3. “全栈”开发者就是能够全面理解和操控自己开发的系统的栈的开发者。

那么,到底栈上都有什么?理解到什么样的程度才能算得上全面?我们举两个例子来看一看。

先看一个简单的栈,以一段经典的Hello World C代码实现 :)

#include <stdio.h>

int main() {
    printf("Hello World!\n");
    return 0;
}

在一个普通开发者的眼中,这个程序的栈是很简单的,大概是下面这个样子:

图1
printf()
main()

C代码从main函数开始运行,main函数调用printf函数打印出"Hello World!",over.

对C语言运行时和操作系统有更多了解的开发者能看到一个更全的栈,至少是下面这个样子 (本文采用Linux的系统术语,各主流操作系统的进程模型和系统调用接口设计差别不大,读者可自行类比):

图2
a.out ----------
write()
printf()
main()
crt0()
shell ----------
fork()

当上面的C代码编译链接生成binary a.out后,在终端中运行a.out时, shell会fork出一个子进程并在其中通过exec()系统调用将a.out的代码覆盖自身。C链接器在生成a.out时会链接C运行时初始化代码crt0.o并以crt0()作为代码镜像入口,该代码会初始化动态分配内存的堆,处理环境变量和命令行参数,并把它们作为参数传给main函数,main()函数返回后接着处理通过atexit()注册的回调,最后调用exit()使自己的进程退出。printf()库函数通过write()系统调用打印出"Hello World!",而它写入的文件句柄在不同的场景下可能完全不同,例如,当我们把stdout重定向到一个本地文件时,它是一个本地文件句柄;当运行在ssh连接的终端时,它是一个TCP socket.

尽管图2的栈比图1多了几层,它仍然是一个高度简化的模型。对内核和软硬件接口有更深了解的开发者至少还能看到:

  • 进程的虚拟内存模型: .text, .data, .bss, 堆和栈的映射地址以及读写属性的不同,其中.text是只读的,无法修改。虚拟内存需要CPU的MMU硬件配合才能实现。
  • fork()可能因为进程数超限或内存不足失败
  • exec()加载另一image对cpu cache的影响
  • write() (如果是ssh连接的终端) 由于send buffer占满而阻塞
  • 不同ISA的CPU可能有不同的word size和不同的寄存器使用惯例
  • ...

综上,即便只是一个最初级的编程教学示例代码,要深入全面理解它的栈,也需要对数据结构,操作系统,编译原理,网络,系统结构这些方面有基本的掌握。

下面我们再来看一个更实际的例子,小博无线官网( www.rippletek.com )的栈(图3)。由于小博无线官网基于阿里云计算平台,下图的云计算工具名称均采用阿里云官网的命名,但这些基础工具在全球各大云计算平台均有相同功能的实现。

图3
动态页面 -------
公网4层转发负载均衡 (1)
nginx容器组 (2)
内网7层转发负载均衡 (3)
rails容器组 (4)
云数据库RDS版 (5)
静态资源 -------
对象存储 (6)

全站采用动静分离以及前后端分离的建站方案。栈的各个层级说明如下:

  1. 域名www.rippletek.com指向一个公网4层转发负载均衡器
  2. http请求通过公网负载均衡器进入nginx容器组
  3. nginx反向代理到内网7层转发负载均衡器
  4. 反向代理请求通过内网负载均衡器进入rails容器组,rails渲染完成带资源版本号的页面
  5. 页面通过ajax请求动态数据, rails应用从RDS中读取数据并返回
  6. 静态资源都存放于对象存储

对于这样规模的系统的栈,深入讨论到上一个Hello World的例子不现实的,也是不必要的,仅掌握基本的系统层次结构即可,在必要时再深入探索细节。下图为rails容器的实现层级。

图4
rails
ruby
passenger
apache
docker
Ubuntu
云主机
  • 怎样才能成为“全栈”开发者

计算机系统的整体概念,对于软件开发者来说,至关重要。

只有将数据结构,操作系统,编译原理和系统结构融汇贯通,才能全面深入的理解系统的各个层级,进而随心所欲的操纵计算机。这样的程度,不是任何21天的速成培训可以达成的,21个月亦不可能。至少需要10年坚持不懈的学习,思考,探索和实践。

从随心所欲控制计算机这个角度来看,所谓"全栈"开发者,和《人月神话》中的首席程序员,以及《黑客与画家》中的黑客级开发者,似乎并没有什么区别。但为何最近几年才出现了“全栈”这个新词呢?这是由于全开源栈(上面的图4就是一个很好的例子)在最近几年兴起并被大量的互联网创业公司广泛采用。而云计算的兴起,又大幅降低了互联网创业的资金和技术门槛。全开源栈出现后,整个系统的所有知识都可以通过阅读源码和文档获得,这才使得“全栈”开发者的出现成为可能,而黑客级的开发者可以在短时间内成为“全栈”开发者。

对热爱技术的人们来说,我们目前所处的这个时代是一个前所未有的好时代。google + github + stackoverflow 可以让我们不用去bookkeeping各种trciks, 而是专注于思维框架和内心机器的训练。

然而,必须记住的是,在成为“全栈”开发者的道路上,绝无任何捷径,这是一条只有静下心来死磕才能走通的路。结合我自己的经历,有下面几点建议:

  1. 一定要有完整的作品。哪怕只是一个很小的东西,自己一个人独立完成框架设计,功能实现,测试并发布,也会对能力提升有很大帮助。当然,在绝大部分技术公司,开发人员不可能有这样的机会。这说明了在业余时间进行编程训练的必要性。
  2. 尽可能多学习几种不同类型的编程语言。要理解计算机系统的运行方式,对C语言的纯熟掌握是必不可少的。而C语言归根到底只是汇编语言的速记形式,所以还需要掌握一种主流CPU,如x86或ARM的常用指令。ISA的设计不会有太大的差别,掌握一种后,其余都可类推。至少学习一种能快速开发验证自己想法的语言,推荐python或ruby, 性价比都很高。至少学习一种面向对象以及面向函数的语言。
  3. "食不厌精,脍不厌细"。遇到问题多追细节。例如上面图1的Hello World callstack, 多问几个为什么,就能把计算机系统几乎一切方面的知识都包含进去。
  4. 掌握本质,方能举一反三。以数据结构中的散列表为例,它可以是lua中的一个table, php里的一个array, javascript的一个object, ruby的一个class, golang里的一个map。而一个大型分布式散列表,就是阿里云对象存储。
时间: 2024-09-11 20:03:57

当我们谈论“全栈”开发者时,我们在谈论什么?的相关文章

全栈 JavaScript 程序员的崛起

JavaScript 无处不在 在以前,JavaScript程序员就是前端开发者的同义词,永远与浏览器绑在一起.但那已是昨日往事.Node.js的崛起开启了一个新纪元,从此,JavaScript 程序员可能不再是被局限于浏览器的前端开发者了. 相比其他高级程序语言,作为一名 JavaScript 程序员,你可以在更多的平台上发挥才能.但是现在让我们将目光放在两大主流领域上:浏览器和服务端. 为什么我非要在这两者中做出选择呢? 做为一名全栈 WEB 开发人员需要面对的问题 有句古话说得好:"什么都

你是否应该成为一名全栈工程师?

Asaf Yigal是Logz.io的联合创始人与产品副总裁.在Logz.io之前,Asaf与他人联合创立了Currensee,这是一个社会化交易平台,后来在2013年被OANDA收购.在 Currensee之前,Asaf在Akorri负责管理和开发一款端到端的性能监控平台,在Onaro开发过一款存储资源管理平台.后来,Akorri 与Onaro都被NetApp收购了.在Onaro之前,Asaf在以色列海军带领一个研究团队,从事人工智能系统的开发与军事化应用相关工作.近 日,Asaf撰写了一篇文

一名全栈设计师的MAC工具箱(设计/开发/效率)

  一个同时拥有开发/设计/高执行力技能的设计师会用哪些软件来帮自己提高工作效率?今天这篇软件推荐的文章作者是一个架构师,业余喜欢用自学的设计技能开发网站和App,一起来看看他的工具箱. 我喜欢把自己定义为一个会一些设计的全栈工程师.在一些大型企业项目中,我一般担任架构师的角色,而到了我自己负责的个人或开源项目中,我就成了一名全栈设计师 .我喜欢用自学而来的那些设计技能进行网站或App设计,然后自己动手实现前端和后端.这能帮助我有效节省成本并减少因多人沟通带来的工作效率问题.但我也很清楚,我不可

全栈必备Log日志

Log日志,不论对开发者自身,还是对软件系统乃至产品服务都是非常重要的事情.每个开发者都接触过日志,以至于每个人对日志的了解都会有所不同. 什么是日志 日志是什么呢?老码农看来,日志是带有明确时间标记的信息数据记录. 根据不同的使用场景和视角,日志的分类也多种多样.针对生成日志的主体,如果是开发者,可以有工作或学习日志,如果是代码,可以是程序日志.根据应用程序的使用领域,可以有系统日志和应用日志,还可以进一步细分,例如消息日志,事件日志,数据库日志等等. 记日志的方式 对于开发者而言,随手记日志

未来物联网全栈开发 —— JavaScript OR Python?

未来物联网全栈开发 -- JavaScript OR Python? 物联网开发涉及面庞杂,开发周期长,所以我们必须寻找一种覆盖面广的编程语言和方法. JavaScript 支持 HTTP 和 JSON .支持函数式编程.可提供交互式环境等特点堪称适用于物联网全栈开发: Python 作为一种胶水语言,可在物联网及嵌入式系统中承担大量任务,并部分替代以上语言.   物联网是新一代信息技术的重要组成部分,也是"信息化"时代的重要发展阶段,不太清楚的可以看上篇文章<IoT领域的故事.

如何成为一名优秀的全栈工程师?

写在最前 我的前一篇文章<给职场新人的 10 点建议>发表后,得到了很多网友,特别是年轻程序员朋 友们的喜爱,这令我颇感意外,但又很受鼓舞.同时,我也收到了一些私信,大多来自那些毕业不久,刚步入工作岗位的职场新人.询问的内容也大多是如何选择职业方向,如何成为一名优秀的软件工程师,以及怎样快速提高自身的技能等.我在一一回复的同时,不禁想结合自身的经历,谈谈如何才能成为一名优秀的全栈工程 师. 什么是全栈工程师 全栈工程师一词,最早出现于Facebook工程师Calos Bueno的一篇文章 - 

假如你想成为全栈工程师…

让我来发挥一下剪报君的特长,下面是百度百科对[全栈工程师]的说明: 全栈工程师,也叫全端工程师,英文Full Stack developer,是指掌握多种技能,并能利用多种技能独立完成产品的人. 上面的定义,基本上已经比较直白了,我们再举两个例子就更明白了. 假如你是一个Web开发者,如果你既能做前端(需要熟悉HTML.CSS.JavaScript.H5以及Bootstrap.EasyUI等各种前端框架),又能做后端(需要熟悉Java或ASP.net或php或Node.js或Go,选项太多就不一

Meteor:快到飞起来的全栈JavaScript开发平台

"meteor"这个单词的意思是"流星",流星的特点是快,一闪而过:同样,Meteor作为一个开源的全栈JavaScript开发平台,特点就是快,目标是为开发者提供一个快速开发的平台. 本文选自<Meteor全栈开发>一书,将向您介绍Meteor为何如此之快! Meteor是什么 Meteor是一个开源的全栈JavaScript开发平台,构建在 Node.js和 MongoDB 之上.全栈开发平台已经有不少了,Meteor有什么特色呢? 虽然Meteor

为什么未来是全栈工程师的世界?

技术在过去的几十年里进步很快,也将在未来的几十年里发展得更快.今天技术的门槛下降得越来越快,原本需要一个团队做出来的Web应用,现在只需要一两个人就可以了. 同时,由于公司组织结构的变迁,也决定了赋予每个人的职责将会越来越多.尽管我们看到工厂化生产带来的优势,但是我们也看到了精益思想带来的变革.正是这种变革让越来越多的专家走向全栈,让组织内部有更好的交流. 你还将看到专家和全栈的两种不同的学习模式,以及全栈工程师的未来. 技术的革新史 从开始的CGI到MVC模式,再到前后端分离的架构模式,都在不