You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

69 lines
8.9 KiB
Markdown

2 years ago
# 学习路径 | 怎样成为一名优秀的全栈工程师?
你好,我是四火。
每一项综合技术都有自己的特点,基于 Web 的全栈技术也不例外。它五花八门,涉及面广,同类技术多,技术迭代迅猛,技术资料新等等,就如同下山的猛虎,成为了很多程序员朋友迈向全栈大门的一道阻碍。经常听到这样的抱怨:
> 想学 Web 全栈技术,期待能独立交付产品,但真的很迷茫。
> 具体某项技术还好说,可全栈包含了那么多技术,眼都要看花了。
> 我该从哪里开始,遵循哪些原则,学习哪些技术?
今天,专栏伊始,徙木为信,言能践行,就让我带你一起打破这道障碍。想要入门或者正在进阶的你,期待这个专栏能让你产生不一样的理解,收获独特的方法,在全栈技术的道路上迈上一个更高的台阶。
## 怎样修炼全栈技术?
首先,我想说的是,**先成为合格的工程师,再谈全栈**。
就像相声演员的说学逗唱一样,工程师也有自己的必修课,比如数据结构和算法,可以说没有基础代码能力时一切都无从谈起。对于任何一个领域的软件工程师而言,它们都是基础,怎样强调其重要性都不为过。并且无论你是刚入行的程序员,还是打拼了几十年的架构师,标准都是一样的。
就拿我工作过的 Amazon 和 Oracle 来说,我们面试的时候,虽然对技术级别高的程序员候选人,会更多地考察基于经验和思路的系统设计等方面,但代码层面的要求,包括数据结构和算法,对于不同级别的工程师来说 ,基本是一样的。
请注意,这里的要求不只是能够写代码,而是要在面试现场,在有限的时间内,在白板上写代码。而在这个专栏里,我不讲解这些最基础的知识,但并不代表它们不重要。
对于进阶的工程师来说,英文能力是突破天花板的一个必选项。我觉得英文是所有进阶的软件工程师应当强化的能力,对全栈工程师来说更甚。因为基于 Web 的全栈技术迭代很快,新的技术资料一般都是英文的,英文能力,尤其是英文的阅读能力会很大程度地影响知识获取的速度。
其次,**在获取知识的基础上思考,尤其是从比较中思考**。
思考,我认为是一个软件工程师所有习惯中最重要的一项。我们在实际工作中需要解决各种各样不可预料的问题,缺乏思考的人只会用自己所知道的技术生硬地往上套,而不去考虑是否适合问题本身,不去分析和比对不同解决方法的优劣。**对于全栈技术学习而言,由于技术种类多,同类技术多,基于比较的思考就显得更为重要**。但在这方面,我认为入门和进阶的工程师应当有所区别:
* 如果你在这方面入门不久,那么我建议你还是以知识性学习为主,先建立概念,了解全局。在选择要学习的技术时,要找那些经典的、使用的人多,以及接受度高的技术。在此基础上,尝试去思考这些技术的特点,为什么要这样做,好处和坏处各是什么。了解背景,即在所介绍的技术出现以前,程序员都是怎样做的,比较一下二者的区别是什么,或者说,新技术,带来了什么。
* 如果你是这方面的进阶工程师,那么“思考”的比重需要更高。全栈的技术太多太杂,不思考而以知识堆叠的方式记忆,是根本学不过来的。因此需要结合自身经验,尤其是针对同类的不同技术,要不断地去权衡,并强化自己的思考习惯——针对学习材料,哪些观点是自己不同意的,哪些内容是自己需要补充的,哪些部分是自己需要延伸学习一下的。
通过耐心地思考和比较,知识积累能够逐渐形成体系,而它,是帮助你融会贯通和保证记忆的最佳方法。请不要在开始时担心这一点,只有具备一定量的积累才能自然而然地孕育出体系来。
最后,**请不要忽视实践的力量**。
对于感兴趣的内容,请打开浏览器,打开命令行,打开 IDE使用 Google 去搜索,把软件包下载下来,照着学习材料中的例子做一下,按着自己的理解试验一下。
这样的过程听起来很简单,却是能让你形成深刻印象的捷径。有时候你可能对于内容表述不理解,可动手操作一下,往往就突然领悟了。毕竟,最终我们的能力都要落到关于程序代码的实践上去。
## 专栏内容是怎样设计的?
说到专栏,特别是关于内容定位、广度和深度,我必须要做一个说明。这个说明于我们彼此都非常重要,它能够保证你我对专栏文章持有一个正确的预期。
我希望这个专栏的主要目的是介绍原理、分享认识、探讨观点、串联知识,并引发思考,带给你进一步学习和实践的机会,而不是完全一步一步教导具体怎么做。因此,这个专栏最直接的目标不是希望你了解所有的细节,或者一下子精通其中的某一项技术。
比如,我不会具体而全面地讲解 Spring MVC 怎么配置Tomcat 怎么搭建,而是希望能突出某几项有代表性的技术特性来介绍——它们为什么被创建出来,它们的价值在哪里,都有什么优劣,并在整体上着眼于全局,对基于 Web 的全栈技术有一个认识和把握。如果你初涉 Web 全栈技术不久,我更希望你能在阅读学习之后感慨,哇~居然有这么多有意思的技术,技术还能这样玩!
即便没有这个专栏,我相信你也一定可以学习自己感兴趣的全栈技术,但是,这个专栏可以帮助你开拓眼界,将这些知识点逐项整理并系统化,帮助你养成在学习实践中思考的良好习惯。先知道“有什么”,才知道“学什么”,最后才能具体去学习,虽然具体的学习往往是没有捷径的,但是“有什么”和“学什么”却可以充分借由他人经验。
再进一步说说内容广度和深度的问题。
* **内容广度:我会选择每个核心领域的代表性技术来介绍。**全栈的技术集合就像一个大观园,每一个子领域,技术往往都非常丰富,因此我们在学习它们的的时候,代表性技术的挑选尤为重要。专栏中每一讲涉及的技术,都是我精心比较后挑选出来的,它们典型、常用,而且深刻,专注于不同的问题领域,在全栈体系中有非常强的代表性,很适合拿来和同类技术做比较。
* **内容深度:我会把深度控制在合适的位置,让入门到进阶的工程师都有收获。**如果你刚刚入门,你可以看得懂大部分内容,并产生兴趣、建立概念;如果你处于进阶阶段,有的内容可能之前有了解过,但学习以后会有新的认识,或者是能把已经掌握的知识点串联起来。同时,请尽可能不要略过总结思考之后的选修课堂和扩展阅读,它们是可以帮助你快速提升的。
具体内容上,专栏包含网络协议和 Web 接口MVC 架构相关,前端技术,持久层技术和最佳实践等几大章,这些内容会覆盖到基于 Web 的全栈技术最核心的部分。最后还有一章是综合性、自恰性强的专题,比如网站的性能优化、分页技术等。
这里再来个小提示。在文章中,我经常会提到一些工具,也会谈到一些关键的命令执行和配置过程,但具体到某些工具的安装,部分我会给出网址,还有一部分工具则是可以使用常规的包管理工具下载安装,比如 macOS 下的 Homebrew比如 Ubuntu 的 apt-get。通常情况下请尽量使用 \*nix包括 Linux 和 MacOS 而不是 Windows。
最后,我想说每个全栈工程师的学习路径都是独特的,全栈和许多其它软件领域的技术一样,五花八门,日新月异,因此并不好学。我想很少有职业和程序员一样,需要持续、广泛地学习。有诸多品质在学习的过程中都起着至关重要的作用,但是我认为,恒心的作用尤为突出。
我不想提著名的“一万小时理论”,但这个过程也绝不会一帆风顺,特别是在这个专栏的学习过程中,如果你有困惑、茫然,甚至是沮丧,欢迎你和我聊一聊,一起想想办法,让我们把全栈技术学习这件意义非凡的事情坚持下去。
谈到这儿,我很想听听你的想法,进而有针对性地为你讲解,更好地帮助你进阶。请来留言区和我讨论吧:
* 对于全栈技术的学习,和其它技术相比,你觉得有什么样的特点,学习它们最需要做到什么?
* 对于专栏的内容设计,你最想听关于全栈技术哪一部分的知识讲解呢?
现在,就让我们正式开始全栈之旅吧!而故事,就从你输入网址、按下回车的那一瞬间开始……