从零开始学后端开发——入门教程

发表时间: 2024-06-18 11:10

学习后端技术跟学习其他技术其实没有太大区别,所以把本章标题改为如何学习技术也是合理的,总结起来有以下几点建议:

1.3.1 扎实的计算机基础知识

以上就是一些常见的计算机专业基础知识课程。这里必须要说的一点是,虽然各大高校的计算机专业课程相对落后,但是这些基础课程多年来变化不大,所以无论如何都是需要掌握的。可能在学校的时候你并不觉得它们有多大的用处。但是在实际的开发工作中,能否掌握扎实的基础知识,往往决定了一个开发工程师的上限。这也是为什么很多大型互联网公司,无论是校园招聘还是社会招聘,都会重点考查一些基础知识的原因。毕竟你能用到的东西只能决定你的下限,而你的基础知识和学习能力,则决定了你的上限。

另外,日常开发中用到的很多技术都可以类比为一些基础知识。比如我们经常用来提高查询性能的缓存技术,就和CPU Cache一样是为了兼容CPU与IO速度不匹配而设计的;操作系统中的进程间通信方式、服务之间的异步与同步通信也类似。其实计算机科学的基础中体现了很多本质的设计,无论是计算机硬件架构、计算机操作系统还是计算网络。

1.3.2 了解事实比了解背后的原因更重要

我经常会碰到来面试的工程师,简历上写了很多项目,用过很多技术,怎么看都是很不错的人选。但是一旦面试深入到原理或者优化层面,很多工程师甚至一些公司的高级架构师就会犹豫,回答不相关的问题或者说自己从来没有关注过。我听到的最常见的解释就是业务压力太大,没时间研究这个。其实从我自己的经历来看,业务忙是原因,但是没时间肯定是借口,毕竟虽然看一个项目的源码很费时间,但是去网上看看现有的原理分析,并不会花太多的时间,归根结底还是没有一个基本的知道为什么会这样意识。很多东西当你学会使用的时候会让你兴奋不已,但是你有没有想过这么令人兴奋的功能是如何实现的呢?最简单的例子就是Java中的HashMap,大家都在用,但是它是如何实现的呢? 很多人甚至不知道这个和数据结构课程里的哈希表有什么关系,更别说叫他说怎么解决冲突了。

这也能体现出现在的一个现象:很多开发工程师工作时间很长,看上去经验丰富,但基本上是用一年的工作经验在重复做n年的工作,基本上每个岗位、每个项目都在做重复的工作,根本不考虑如何避免重复的工作。

此外,除了遇到问题时阅读源码、研究底层之外,积极阅读经典库、优质开源项目源码、其他同事写的代码,学习好的架构、设计、编码风格、库的使用方法也是促进自身技术进步非常有效的方式。需要注意的是,看到好的代码实现和架构设计时,最重要的是学习思路,而不仅仅是结果。你可以试着问自己以下几个问题:

“知其然比知其所以然更重要”其实就涉及到了技术的广度和深度问题。在我看来,对于刚毕业或者刚参加工作的工程师来说,首先就是深度问题,只有在某一领域有深入的研究和造诣,才能整合并快速拓展知识面,在广度上有所突破。对于有一定工作经验的工程师来说,虽然深度不是那么必要,但遇到的问题和学到的新东西还是要深究到底,否则一旦出现问题,一味地去弥补,会显得很被动,不利于自身的技术发展。毕竟一个什么都做过、什么都用过,却什么都不擅长的人,实在是太可替代了。

1.3.3 动手实践

在学习领域有一个所谓的721模型:个人成长的70%来自于工作实践,20%来自于向别人学习,10%来自于培训。虽然这个理论存在争议,但在我看来,程序员把实践、学习、培训的重要性排在第一位,是有道理的。一个普遍认可的学习技术的最佳实践——“项目驱动学习”,也就是我们这里说的动手实践。对于很多技术,光是看书会让你眼花缭乱,看完就忘了。必须自己实践一下这个技术或者在自己的项目中用到它,才能够快速掌握,熟练掌握。再加上现在微信朋友圈、微博上充斥着各种所谓的干货,很多人看了很多资料,以为自己收获颇丰,但其实里面的东西自己从来没有实践过,有时候只是感叹别人真的太厉害了。真正的干货是需要自己去消化的,而消化的最好方式就是实践,无论是资料里的例子,还是刚刚讲到的知识。

1.3.4 经常练习

亲自动手可以让你快速入门,但只有经常练习才能熟练。

“一万小时理论”说的是,任何行业都需要至少一万小时的实践才能成为专家。不争论这个理论是否正确,想一想,当你很久没有写过代码或者使用过某项技术后,再去做相关开发,那种陌生的感觉想必大家都有体会过。由此可见,频繁的实践对于研发的作用有多么重要。

当然,这里的频繁练习不是指重复劳动。应该是带着自己的思维去练习,多想想自己为什么要这么做?有没有更好的方法?

1.3.5 持续学习

“活到老学到老”这句话用在程序员这个职业上再合适不过了。IT技术,特别是互联网开发中的技术,迭代非常快,也许你今天学到的东西,过几年就被抛弃了。虽然后端技术相对于前端技术来说,相对稳定,但是相对于其他行业来说,还是更新很快的。像Struts这种以前很火爆的技术,现在也已经过时了。所以,一定要对新事物、新技术保持敏感,不断探索行业内最新的知识点,扩充自己的知识面。在学习新知识的时候,相比于看一些书籍、网上博客,直接看相关知识的官方文档是我比较推荐的方式,毕竟经过两遍加工的书籍、博客,经常会因为作者的水平或者个人理解,出现错误或者偏离原作者的意思。由于现在的IT技术大多来自欧美,欧美的技术水平也远远领先于中国,所以对IT技术从业者的英文要求也比较高。 他们需要熟悉各种计算机术语,流利阅读各种英语材料,以免学习落后。

这里需要提到的另外一点就是“逃离舒适区”。人们对于自己熟悉的东西比较熟悉,一般可以自信地运用自己熟练掌握的技术。但是当需要使用自己从未接触过的技术时,很多人都会望而却步,不敢尝试,从而失去了学习新知识、扩大知识面的机会。最好的方法应该是敢于“逃离舒适区”,敢于使用新技术,这样才能有持续的学习兴趣,促进自己不断进步。

另外,业界有很多技术会议,经常被称为全球性的或者世界性的,经常参加这些会议的人肯定是好学的,但是这些会议充斥着肤浅的东西,专注其中的人的知识也容易肤浅。笔者建议通过多看书来学习,喜欢看书的人也习惯于深度思考,而深度思考可以更新形成自己的知识体系。特别是对于处于技术上升阶段的程序员来说,应该少参加会议,少在圈子里混日子,多看书,多做能提升技术能力的事情。除非资金压力很大,否则尽量避免做一些没有技术含量的外包项目。

1.3.6 计算思维

这主要是指我们要学会用计算机思维去思考问题,所谓计算机思维的本质就是冯·诺依曼系统所描述的:程序存储,顺序执行。

常见的程序员买苹果的笑话是,他们用 for 循环、if else 逻辑来判断苹果的质量、计数、做防御性检查等。这就是计算机思维的体现。在热门电影《天才枪手》中,如果用计算机思维来记忆多项选择题的答案,两位可以代表四个答案,然后四位就可以转换成十六进制数。记住答案可以减少一般的存储容量。

这样二进制存储、防御性编程、循环遍历、位操作、多进程/线程以及常用的数据结构和算法都应该成为无意识的意识,遇到问题的时候可以下意识地用这些东西去思考,把人类语言的需求转换成计算机语言。

1.3.7 自我总结

相信很多人在日常工作中经常会遇到一些问题,然后通过查阅网上资料、询问同事、翻看源码等方式解决,当再次遇到类似问题甚至同样的问题时,还是一头雾水。不说记忆的问题,造成这种情况的很大一个原因就是没有总结。当然这里的总结不仅仅意味着记录自己日常遇到的问题,还包括找到问题的本质原因,如何避免同样的问题,从中能得到哪些启发和收获。更进一步来说,需要把自己在一段时间内的知识收获整理成体系或者融入到自己的知识体系中,这样在遇到同样的问题时,才能举一反三,有据可循。

总结自己的方式包括记笔记、写博客、分享。其中,写博客和分享是我比记笔记更推荐的方式。毕竟与他人交流能帮你把控总结的质量,而与他人分享知识所带来的“荣誉感”反过来会产生某种正向反馈,让你更愿意去总结和分享。

1.3.8 学会规划

我跟很多工程师聊过职业规划,有的人对自己的职业道路有清晰的认识,但大部分人根本就没概念,觉得只要能挣钱养家就行了。显然前者是有计划的人,这样的人,努力是有针对性的,走的路会更加踏实,更加可持续。

对于研发岗位来说,学会规划是很重要的特质。规划可以分为长期规划和短期规划。上面提到的职业规划是长期规划,需要有远见来确定自己前进的方向。比如说,五年内成长为后端服务架构师,就可以算是一个长期规划。笔者自己的长期规划如下:

至于短期规划,则是针对具体技能、晋升、学习等方面的规划。比如我过去一年的计划包括:

需要注意的是,这些短期计划的制定要合理、可实现,并根据优先顺序确定优先事项、分步完成,另外计划不能僵化,可根据实际情况灵活调整。

1.3.9 如何学习一门新技术

上面主要从宏观上讲了如何学习技术,但真正要学习一门新技术,其实也是有规律可循的。如下图所示:

由于很多技术模块很多,源码又很复杂,你经常会在源码中迷失。因此,这里有一个典型的“读源码”流程:

阅读该技术的架构文档,了解其整体架构和组成。 按照整体架构,将源码文件分成模块或者上下级。 从从未读过的模块中,选出最独立(依赖性最小)的模块代码阅读。 阅读该模块的功能介绍文档。 阅读该模块的源码。 边读边整理调用关系(以表格或者树的形式)。 转步骤3。

1.3.10 总结

程序员职业是一个金字塔结构的职业,越往上层,人数越少,越难晋升。如下图所示:

一步一步,你需要不断学习和提高才能到达金字塔的顶端,包括正确的态度、正确的方法和持续的努力。本文描述的只是我自己的经验和我一直在实践的东西。此外,肯定还有很多其他优秀的方法和理念可以推动这个过程。