第一章:技术之禅
禅,是人生的修行。技术之禅,是技术学习的一种思考与修炼。
本章将和你一起,走进技术世界,聊聊技术的那些事,一起窥探全栈地图的样貌。
1.1 技术改变世界
在过去的十年里,人们的生活方式、衣食住行正发生着翻天覆地的变化。这也是互联网和科技飞速发展的黄金时代。
2007 年苹果公司发布的 iPhone 手机是一款革命性的产品,它彻底改变了人们对手机的设想。随之,移动设备变得更加智能,智能手机也将成为技术发展的重要载体。社交平台开始连接人与人之间的距离,大洋彼岸的一条语音消息,仿佛说话的人就在你身边。移动支付的便捷,彻底改变了人们的消费方式,现金不再是唯一的载体。电子商务的飞速发展,造就如今全民“剁手”的全球双 11 购物狂欢节。
科学技术是第一生产力,科技的进步正改变着世界,而计算机技术正是科学技术的重要组成部分。互联网技术是在计算机技术基础上建立的一种信息技术,通过计算机网络将不同的设备连接起来,构建了一个全球互联的网络。
伴随着技术(本书技术特指互联网相关技术)的发展,国民的衣食住行也发生了巨变,吃饭有美团、大众点评、饿了么等;购物有淘宝、京东、唯品会等;住房有自如、贝壳找房、58 同城等;出行有哈啰单车、滴滴出行、12306 等。通过互联网将社会资源最大程度地利用了起来,方便了人们的生活。
科技产品日新月异,也让生活方式不断变化。这些科技产品逐渐成为我们生活中的“水、电、煤”,变成我们生活中的必需品。
2015 年国务院总理李克强率先提出 “互联网+”,是互联网环境下催生的经济社会发展新形态。通俗的说,“互联网+”就是“互联网+各个传统行业”,但这并不是简单的两者相加,而是利用信息通信技术以及互联网平台,让互联网与传统行业进行深度融合,创造新的发展生态。“互联网+”模式加速“最多跑一次”,浙江是较早推进“互联网+政务服务”的省份,持续拓展政府网站功能、优化服务体验、用数据代替人跑路,线上线下互动互联,极大提升了政务的办事效率。放眼看去,互联网已成为了中国大陆的一种新兴文化现象。
乔布斯有一句非常著名的话,是他劝斯卡利加入苹果时说的,他说:“你是想卖一辈子糖水呢,还是想抓住机会来改变世界?”时势造英雄,正是乔布斯、比尔盖茨、扎克伯格、马云、马化腾等,这些互联网时代的巨人,不仅掌握了科学技术,更有超前的思维,将技术赋能产品,通过科技产品改变人们的生活、改变行业、改变世界。
作为互联网技术学习和技术爱好者的弄潮儿们,掌握着计算机科学技术,掌握第一生产力。不仅是为了学习而学习技术,如果通过技术创造价值?是我们每一个技术爱好者应该思考的问题。
1.2 如何选择技术栈
在计算机技术中,编程是计算机的核心,是我们的神兵利器。在编程的世界里,又该如何选择自己的技术栈呢?
学前端开发?学 APP 开发?学大数据开发?还是学后台开发呢?
对于 Java、C++、C#、Python、PHP 这些编程语言,又要如何选择呢?
现如今人工智能如此火热,是不是机器学习、深度学习更高级一些呢?
想要提升自己,程序员如何修炼内功呢?
1.2.1 有哪些技术栈
在进行技术栈选择之前,需要对当下互联网技术进行调研。先要知道都有哪些技术栈,了解技术的基本,方能找到适合自己的技术栈。
在当前互联网技术中,笔者将核心技术分为以下四个方向,它们都是互联网主要的技术方向。
1. 大前端开发
之所以称之为“大前端”,它不仅仅是网站的界面开发,从广义上讲,用户终端视觉和交互相关的部分,都属于“大前端”的范畴。在当今互联网发展的今天,多场景融合展现技术,日益复杂的界面交互变化,赋予了前端更广阔的能力。
前端技术的核心是 HTML、CSS、JavaScript,它是整个前端的灵魂。同时在前端的技术栈中 Vue、React、Angular 是最值得关注的三个开发框架。在移动端,目前有:HTML5+原生、Javascript 开发 + 原生渲染(React Native、Weex)、自绘 UI + 原生(Flutter)、增强版 Web App(PWA)是当前主流的移动跨平台解决方案。在移动端各种软件平台都相继推出小程序,构建在自身的软件上,即扫即用、用完即走,这些小程序也同样是前端的研究领域。
前端开发是用户看得见摸得着的,它注重用户的体验,是最接进产品和设计的。相比于后台服务端,端测开发可以让你构建一个丰富多彩、所见即所得的软件交互体验。
如果你对构建有趣的界面和处理各种交互逻辑感兴趣,那么前端开发或许是你的兴趣所在。
2. 后台开发
春运 12306 铁路抢票、全球双 11 购物狂欢节,之所以能够抗住巨大的流量洪峰,离不开最核心的后台系统服务。后台服务对用户不同于前端,它对用户来说是无法直接感知的,它不同于前端可见的界面。抢票时用户身份的认证、车次的查询、车票订单的查询、订单支付等等,用户数据的存储、查询、验证等等算法与逻辑,一套在系统服务端运行的程序,这就是后台服务,它是用户无法直接感受到,但是确实随时随地都在使用的。
后台开发,有时也称做后端开发。其中包含:后台编程语言(Java、Python、C++等)、数据库存储(MySQL、Postgre、Redis)、后台服务框架(如最为火热的 SpringBoot 框架)、消息中间件(Kafka)、容器化引擎(Docker、Kubernates)、服务器编程(Linux)等。总而言之,后台开发就是围绕分布式、高可用、高性能、高可靠展开的一些技术工作。
虽然后台开发不像前端一样,所见即所得。但后台开发是一个推动系统具有生命力的根,它包含了很强的架构设计与实现。一个大型的后台服务可以支撑了亿万流量的平台,是一个产品能够运营的基本。
如果你对系统设计感兴趣,热爱 Java、Python、C++、Go 等语言,想要成为一个系统架构师,那么后台开发是一个不错的选择。
3. 大数据开发
随着系统运营的时间发展,一个系统将积累了越来越多的数据,当数据达到 PB、EB 级别时,后台服务将面临了更大的挑战。这些挑战,不是后台技术栈就能够解决的,传统的关系型数据库已经无法存储这么大体量的数据。那么,这就是大数据需要解决的问题。
大数据有三个重要的特征(简称 3V 特征):大量 (Volume),高速 (Velocity),多样化 (Variety),那么面对海量数据,如何接入、如何存储与查询、如何分析?这便是大数据开发领域,需要实现的工程能力。
大数据开发,需要掌握大数据通用处理平台,如:Spark、Flink、Hadoop 等的使用;大数据编程语言,包括 Scala、Python、Java 等;分布式文件存储 HDFS;数据仓库,如:Hive、ElasticSearch;海量数据实时查询,如 Apache Druid、InfluxDB 等时序数据库;大数据计算资源调度,如 Yarn、Mesos 等;在数据接入需要了解消息队列 Kafka、RocketMQ 等;日志收集框架,如:Flume、ELK 等;此外海量数据要进行分析,也需要掌握常见的机器学习工具包,挖掘海量数据中的有用价值。
大数据开发不同于后台开发,也有别于算法。大数据开发工程师需要掌握良好的工程能力,实现从数据的接入,数据存储,数据查询,数据分析。
如果你对海量数据处理、存储、分析感兴趣,并且有一定的后台开发基础,那么大数据开发是一个适合你的选择。
4. 算法应用
你一定使用过高铁站的人脸识别,也一定听说过可爱调皮的小爱同学;你可能对自动驾驶充满向往,也可能对智能家居满怀憧憬;你可能遐想过人工智能技术在医疗领域大放异彩,也可能想象过生活在智慧城市是一种怎样便捷的感觉,但这些仅仅是人工智能领域的冰山一角。总之,人工智能技术已经在我们生活中像医疗、交通、教育、金融、生活、零售、安防、园区、环保、政务等各个方面发挥着举足轻重的作用。目前世界上主要国家都在人工智能领域进行战略布局。在就业方面,国际、国内各大厂也早已打响了人工智能人才争夺战,作为热爱算法的你是否早已跃跃欲试了呢?
算法应用领域包括的方面很多,传统的数据结构、高级算法设计等是基础,在这个人工智能技术风靡全球、飞速发展的时代,人工智能技术早已在算法应用领域占据很大的比重。机器学习是人工智能的基础,机器学习在大的层面上分为传统机器学习和深度学习,从另一个角度又可以分为非监督学习、弱监督学习和强监督学习;从应用场景角度还可以分为自然语言处理(NLP)、计算机视觉(CV),以及二者相互结合。对于机器学习从业者而言,理论层面上需要掌握像逻辑回归(LR)、感知机、最近邻算法(KNN)、决策树(DT)、支持向量机(DT)等传统算法,以及随机森林(RF)、Adaboost、GBDT、Xgboost、LightGBM 等集成学习算法,以及与特征工程相关的相关知识。在深度学习层面主要包含梯度下降反向传播算法(BP)、多层感知机(MLP)、卷机神经网络(CNN),循环神经网络(RNN),强化学习,以及包含 Dropout、Batch Normalization、正则化等优化方法。实践层面主要掌握 Scikit-Learn:,Tensorflow,Keras,Pytorch 等框架。
人工智能技术特别是深度学习技术发展之快可谓日新月异,最新技术早已远超如上所述,正等待着目前作为准技术达人的你们去挖掘探索。假如你也想在阿里云天池、Kaggle 等比赛平台上去刷榜而一展才智,或者你也想去像 CVPR、ICLR 等会议上留下浓墨重彩的一笔,或者你也想去互联网大厂与各路大神做同台竞技,那么还在等什么,算法方向就是你最佳的选择。
1.2.2 选择适合自己的技术
上面列举了互联网技术栈中核心的几个方向,那么如果去选择一个适合自己的技术栈呢?根据笔者多年互联网技术栈学习经验,主要归纳为下面的几点。
第一,找到自己的兴趣。在发现自己的兴趣之前,往往我们都是一张白纸,需要我们进行广泛的学习,通过一段时间的启蒙学习才会发现自己更适合做什么,从中发觉自己的兴趣。回到技术本身,作为一个技术“小白”,我们则可以从自己基本的切入点入手,选择自己的技术栈。如果对视觉、交互体验感兴趣,可以从前端开始,开发设计一个网站、一个 APP 开始。如果对后台架构设计、后台编程语言感兴趣则可以从后台开发开始,如:Python、Java、PHP 等语言开始。如果你有很好的数学功底,喜欢数据分析、概率统计,想要运用数学知识挖掘更大的价值,则可以上手机器学习、深度学习等算法的入门。如果你已经接触过了诸多技术栈,我想你应该已经知道自己的兴趣。通过启蒙学习发觉自己的兴趣,这是我们选择自己技术栈的第一步。
第二,关注一线就业方向。互联网技术日新月异,要结合自己的兴趣和当下的就业市场,不要迷失在技术的海洋中。当下火热的机器学习、Java 后台开发、C++ 开发、前端开发、APP 开发,最热门的岗位,意味着未来的前景。试想一下,一个想要入门互联网技术栈的爱好者,如果还在学习十年前的技术,老旧的技术框架,那么又怎么能迎合互联网发展的趋势呢,势必被时代所淘汰。在中国互联网技术浪潮中,技术爱好者可以关注国内一线互联网“大厂”的技术岗位,关注开发社区,瞄准就业市场、技术方向、自己的兴趣,聚力突破。
第三、洞察技术趋势与发展。技术迭代日益快速的时代下,技术人如何自处?作为一个有追求的技术的爱好者,必须紧跟技术前沿,基于自己的技术能力,关注开源技术,洞察未来的技术趋势。如当下火热的:“5G”、“人工智能”、“云计算”,5G 可以更快地传输数据,人工智能可以智能的学习分析,而云计算是为了更好地进行计算,它们必将成为未来数字经济的基础设施。例如当下的我们可以选择一些优势方向,例如:机器学习、云计算、5G 开发等等方向。洞察技术趋势与发展,才能紧跟潮流脚步。
当然不仅仅只是学会一门技能,也要有自己的辅助第二技术或是第三技术。比如后台思维写前端,算法思维写后台,产品思维写算法。这些都是我们的核心竞争力,懂得更多可以让彼此之间的协作更顺畅。笔者根据自己多年的技术学习经验,从“找到自己的兴趣”、“关注一线就业方向”、“洞察技术趋势与发展”三个方面入手,一定能找到适合自己的技术栈。
1.3 技术学习的方法论
1.3.1 认知世界三个区:舒适区、学习区、恐慌区
美国心理学研究者,诺埃尔·蒂奇(Noel Tichy)把人的知识和技能层次划分为出舒适区(comfort zone)、学习区(stretch/learning zone)和恐慌区(panic zone)。这三个区分别对应:已经熟练掌握的、有一定挑战性的、暂时无法学会的。从入门到熟练掌握,一定会经历从“焦虑区”到“学习区”再到“舒适区”。

图 1-2 认知世界三个区
如果你是一位新手,面对庞大的技术大厦,不知所措。这时候的你会进入“恐慌区”,会感到忧虑、恐惧,不知道从哪里入手。比如,让一个没有项目经验的开发,负责一整套技术架构的实现;又如,在项目中引入很多不曾接触过的技术栈等等。在没有基础的情况下,技术学习就会进入“恐慌区”。
有一定相关经验下,在“学习区”开始接触甚至未曾涉及的领域,在这里可以挑战自我,不断在实践中熟练技能。比如,学习一门新的编程语言;工作中切换到另一个技术岗位等等。在学习区能不断的保持对学习的热情、持续学习,是技能成长最重要的阶段。
在“舒适区”,处于我们最熟悉的环境,做着自己最在行的事情,在舒适区我们变得得心应手,处理问题得心应手。但处在舒适区,学习得东西变得很少,进步也不如“学习区”。如果只局限在自己领域,一旦跳出自己熟悉的环境,又会从新进入“恐慌区”。
技术学习中,你是感觉到很轻松?很有成长?还是很焦虑呢?
本节将通过技术学习方法论,带你逃离“恐慌区”,在“学习区”技术快跑。
只有一个好的技术学习方法 ,才能在如今不断动荡的互联网江湖中,屹立不倒、处变不惊。
1.3.2 为什么要讲学习方法
在学习技术这条路上并非一帆风顺,作为一个技术爱好者,学习是一直伴随着我们。从入行时的“小白”到经验丰富的“老鸟”,在这个过程中一定会遇到很多困难、走很多弯路。常常很多人面对高深的技术难题望而却步,最终选择放弃。一个好的技术学习方法会让我们在学习路上事半功倍,更加自信。
对于立志成为一个技术达人或者对于技术有执着追求的人而言,学习一定是伴随终生的。不管是互联网还是国企,“养老”的说法都是不对的,因为一旦进入所谓的舒适区,下一个末位淘汰的人很可能就是你。技术是科学、是工具、更是理论应用于实践的手段。虽然技术学习是无止境的,但人的精力是有限的,不应该一味地追求新技术。而应该在某一个技术点深度学习,同时不断扩展自己的知识广度。工作中根据项目所需,不断学习扩展。利用业余时间,也可以扩展自己感兴趣的技术栈。有一点需要注意,计算机基础很重要,特别是数据结构与算法、操作系统原理、计算机网络、Linux 基础。这些计算机技术知识在应用层编码中或许不太会被关注,但是计算机基础决定了未来能走多远。
1.3.3 如何学习与技术快跑
1. 技术架构
技术就像一栋大厦,大部分人学习技术都会从大门进入,一步一步往上走,技术能力也一点一点地提高。很多人在这个过程中都会遇到一些技术瓶颈,都会产生迷茫,甚至怀疑自己,变得不知所措。
通常技术的成长可以分成三个层次:我不知道我不知道;我知道我不知道;我知道我知道。对应从技术“小白”到技术“小达人”,再到技术“大牛”。
在这栋技术大厦中,初始阶段就是按部就班地往上爬,但是当学习技术到一定程度的时候,就必须开始了解整栋大厦的框架结构。此时,必须要开始转向系统架构。这里摘抄三段许式伟(WPS 架构师)《架构设计的宏观视角》中的话,也正是我们想要表达的技术学习思想。
“如同造房子有建筑工人(负责搬砖)和建筑师(负责架构设计)一样,软件系统的开发过程同样需要有程序员(负责搬“砖”)和架构师(负责架构设计)。作为架构师,我们需要的第一个能力是宏观的全局掌控能力。”
“如果把应用程序比作一座大厦,那么我们作为大厦的架构师,需要把大厦的结构搭建好,让程序员可以把‘砖’填充进去。我们都知道,一座大厦的结构是否稳固,与地基是否牢固密不可分。”
“所以,我们首先就需要从大厦的地基开始,熟悉这座大厦。毕竟,你对所依赖的基础架构了解得越全面,做业务架构设计就会越发从容。”
想要技术能力得到成长,首先必须在思想上成长,提升自己技术思想的高度。在学习的路上,要学会用宏观视角来解决问题。在自身技术成长的过程中,有时候不需要过分注意某个细节是怎么实现的,而是要有技术判断力,搞清楚技术的可行性,技术的选型策略。
2. 极限编程
接着,来聊聊极限编程。极限,就一个字“快”!
在项目开发中,经常有很多人都没学习相关技术栈就要开始项目开发,造成一种局面:大部分的时间都在复制、粘贴,面向搜索引擎编程,找不到自己的技术核心点。
然而掌握完整的一套技术栈以后再开始项目编码也并不是正确的做法。其实,项目中的技术栈学习也遵循二八定律。只要花少量的时间学会 20% 的技术就可以开始项目开发,剩下的 80% 的技术知识都应该在项目实践中去学习。
在很多项目中,没有太多的时间让我们系统学习。可能一个新的技术,通过短短几天天的学习,就必须应用到项目中去。特别是在互联网的应用场景中,时间就是金钱,一个好的想法,必须在最短的时间内落地实施。极限编程正是这样一种敏捷快速的开发方式,要求团队成员拥有很高的技术素养,在很短时间内学会并且应用相关技术。
笔者在极限编程学习过程中的路线如下所示:
(1)先看技术效果
学会检索一些优质的项目,看看通过这个技术可以达到什么样的效果,判断是否满足自己的需求。
由结果导向的学习,更能提升我们的学习兴趣。
(2)快速视频学习入门
在快速视频学习入门时,视频不宜太长,10 小时左右(2.0 倍速观看)。快速了解该技术的各种情况,掌握基本的核心技术。遇到已经掌握的知识就直接跳过。
极力推荐一些好的学习网站:慕课网、极客时间、哔哩哔哩、极客学院、实验楼、学堂在线。
(3)开源小项目
在视频学习入门之后我们可能还不具备一个项目的编码能力,这时候可以找一些开源项目来“跑一跑”。要学会使用 GitHub 搜索项目,项目不宜太复杂,一个简单的小项目即可。
(4)配合文档同步学习
技术文档不像小说,不要从头到尾读,有目的地阅读部分内容,其余大部分的文档应该作为字典一样的查询工具。当然,一些基础性的文档必须仔细通读。
(5)开始投入项目生产
正式开始项目实践,选择自己的项目框架,配合文档、视频的学习内容开始实施。
(6)项目复盘与重构
重新审视自己的代码。可以让经验丰富的前辈指点一下代码,以便在未来升级改进。
(7)技术进阶,重新回到书本
前面学习的都是比较碎片化的知识。当想要深入底层或是原理相关的知识学习,就应该选择一本大众认可的书籍进行深入阅读。书才是一个最系统和深入的学习载体。当然要看感兴趣的技术点和必须掌握的技术知识,因为不是所有的技术都需要深入了解。此外,在自己的技术领域还是应该不断精进和学习。
3. 学习总结
在技术学习的过程中,我们可能会遇到很多的技术难点,还会遇到很多碎片化的检索工作,死记硬背是肯定不行的。所以,学习总结非常有必要。
好记性不如烂笔头,定期的学习和整理对学习巩固肯定有所帮助。通过索引的方式可以对技术做一个系统分类,方便随时巩固和学习,当然也方便工作面试。在学习这条路上会有很多盲点和学不完的知识,有道无术,术尚可求,拥有强大的思维能力才能应对千变万化的技术。不要把大脑当成硬盘,也不要做高速运转的 CPU,而要成为一个搜索引擎,学会分析和解决问题。
笔者盘点一些学习总结的方式,如下:
(1)技术博客 和 微信订阅号
技术博客是一个非常好的学习途径,可以通过掘金、CSDN、知乎专栏、知识星球等编写自己的技术博客。
更“极客”一点的同学可以自己搭建一个博客,例如:WordPress、Hexo、Hugo。技术博客的编写,首先对知识的回顾很有帮助,其次也是个人技术检索的宝库。把常见的一些问题和解决方案都记录在博客中,下一次遇到的时候就可以随时检索。
很多技术书早期都是通过博客来积累自己的素材。
此外还可以申请个人微信订阅号来编写自己的技术博客,这也是一个很好的传播途径,还可以慢慢积累自己的粉丝。
(2)GitHub 开源项目
GitHub 不仅仅可以分享代码性质的项目,在上面还可以开源自己的博客项目,可以通过 Markdown 来记录自己的技术博客。
很多开源书、文档翻译项目都可以通过 GitHub 来托管。通过 GitHub 还能获取版本控制的文本和图床,这比自己搭建服务器来构建博客更加方便和安全,几乎永不丢失。
3)其他
此外还可以通过为知笔记、有道云笔记等方式进行学习总结。
4. 分享技术
学习金字塔是美国缅因州国家训练实验室的研究成果,它用数字形式形象显示了采用不同的学习方式,学习者在两周以后还能记住内容的多少(平均学习保持率),如图 1-2 所示。
图 1-3 学习金字塔
在金字塔基座位置的学习方式是主动学习,可以记住 90% 的学习内容。主动学习并且学会分享、教授别人如何学习是最好的记忆方式。在教授别人的过程中,我们在输出知识,也在不断地输入问题,看似单向学习的过程,实际上也是双向的学习思考,可以不断地巩固自己的知识积累。
技术学习也是如此。不仅要学会倾听别人的技术分享,很多时候还要学会分享技术。一个好的技术管理者,必须要学会根据团队成员的不同情况,制定不一样的培养方案,这也是技术管理者很重要的一个能力。通过分享技术知识,会不断地加强自己的逻辑表达能力和技术能力。
1.4 技术路线与管理路线
“我是一个算法工程师”、“我是一个 XX 语言开发工程师”、“我是一个产品经理”,很多的技术开发者都在为自己的角色打上一个技术标签。
在学习这条路上,应该首先抓好自己的本职工作,也就是技术深度的学习(例如:开始学会重构自己的项目代码、开始看项目源码),从而在工作之余不断的拓展自己技术的广度和思维的广度,掌握第二、第三技能。很认可一句话,“人人都是产品经理”,“人人都是架构师”。在技术的学习路上,不仅仅局限在自己的技术视野,扩展更多的技术和行业知识。
一个追求用户极致体验的你,为产品而创造的你,未来也可能成为乔布斯一样优秀的产品经理。执着追求技术,那么未来你可能成为某个领域的技术专家或是某个维度的系统架构师。在追求技术的同时,有长远的战略眼光,有可能成为一个技术总监。有广阔胸怀的,赏识人才,能有调理的管理好一批人,有市场洞察力,那么未来可能成为一个的创业者。
在技术这条路上走的远了,才能找到自己的职业规划。作为一个 IT 从事者,从工程师发展为高级工程师,再往后职业发展主要可以分为两种路线:管理路线和技术路线。
管理路线。技术不仅仅只是技术而已,技术管理是技术的第一步,是一个成功的项目离不开一个好的技术领导者。技术管理,并非要完全掌握所有的技术细节,但需要有扎实的技术基础,加上自己对产品的理解,对全流程实现有一个清晰的认识,给出技术解决方案,管理好项目组内的分工协作。
技术路线,往往是一个比较细分的领域。例如,数据开发、音视频开发、网络安全等等比较细分的方向。越往后,需要深入某一个技术细节,熟悉底层实现原理与实现。可以针对相关项目进行技术的调优与定制化。
图 1-4 技术路线与管理路线