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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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