我是如何提高自己的「编程能力」的?
上周的投票,大家最关心的还是提高技术,那我们今天就来聊聊这个话题。
之前主要分享的多是算法和数据结构方面(年后继续),因为我认为算法和数据结构是程序员最最最重要的内功,但是并不是唯一。
我自己作为一个非科班的程序员,并且在工作中观察了“这两类”工程师的表现,我认为科班和非科班最大的区别在于:科班的同学知道去学什么,问题出现了他知道自己是哪里有知识漏洞;而非科班的,可能压根不知道自己不知道什么。
(解决方式:建立系统的知识体系、寻求老板、tech lead 的指点,快速补充基础并反复学习。)
因此这篇文章我想粗浅的聊聊成为一个工程师需要掌握的大致学习路线,更多的偏入门一些,不涉及具体的工作方向。欢迎大家在文末分享你的学习心得,正如柏拉图所说:
人只有通过和别人讨论,才能知道我们的经验是不是真实的。
文章略长,如果一次没时间看完,建议先拉到文末参与抽奖送书活动~
如果把学习比作练功的话,我把我的学习内容分为:
修炼“外功”:偏应用 修炼“内功”:偏基础
两者配合,才能仗剑走天涯!
一、外功
1. Linux 操作系统
对于想做开发的同学,如果还是个小白,问我第一件事情该做什么,我会强烈推荐先学习 Linux 操作系统,因为互联网公司基本上大部分业务框架部署都是在 Linux 操作系统上进行的。
我认为学习 Linux 操作系统的重点就在于学习各种强大命令如何组合运用。
一是因为工作中我们经常需要用到,比如对各种日志文件进行分析,写脚本驱动机器帮助我们工作。
二是面试时经常会给出一个需求场景让你编写相关的组合命令,比如统计一段日志中各种 IP 地址出现的次数。
给大家推荐一本 Linux 界的“圣经”。
《鸟哥的 Linux 私房菜》蝉联最受欢迎华语 Linux 书籍第一的位置,无人能撼动。
对于想走开发路线,或者互联网技术路线的同学,学习 Linux 绝对是必须的。
这是一本既能帮助你入门,又能随时备查的工具书。更特别的是鸟哥的写作风格,非常口语化,读起来感觉像是有人在跟你实时互动聊天。
建议想要学习的同学可以收藏一本电子版随时备查。第一次阅读的同学估计会被它的厚度吓到,但其实没有必要去一字一字的全部读完,快速的看完前面十章,你就会对 Linux 有一个初步的认识。以后需要用到哪些命令和知识随时再查就可以了。
2. 学习一门语言和框架
对 Linux 操作系统有了一定的了解之后,大家就可选择一门编程语言及其通用框架进行学习开发。
语言的学习和框架可以借助的资料就很多了,每个人的习惯都不一样。喜欢跟着视频学习的可以去慕课网、极客时间,上面有很多性价比很高的课程。另外推荐大家可以加入一些交流群,嗯,比如我的读者交流群,另外一些框架或者语言的官网里面都会有自己社区和交流群的联系方式,里面会有很多精华帖子和大牛进行分享。
说回我自己,当时入门语言是 C++,研究生课程要用,没基础也只能硬着头皮上了。
但其实很多 C++ 的课程或者书籍都是先讲 C 语言,比如《C++ Primer》前面几章都是讲的 C 语言,所以也还好。
后来刷题的时候觉得 C++ 刷题有些麻烦,听了朋友建议选择了 Java,真心感谢他的建议,在这里我也建议如果你不知道应该选什么语言,自己也没有特殊偏爱的话,那就无脑选 Java 吧。
因为 Java 市面上学习资料非常的多,无论是国内还是国外大厂 Java 的就业面都非常广,对于新人来说目前是个很稳妥的选择。
当然,如果你不放心,可以在任何一个招聘网站上面查一查各种语言给岗位需求,只要不是那种很窄门的语言,我觉得学习都是没有问题的。像 Go、Python、C++ 等等就业面还是广泛的。
现在看来,我认为这三门语言都是需要学习的:
Java 是综合能力很强的语言,很多互联网公司大型的框架或者开源项目都是基于 Java 的,因为它有非常完成的一套轮子,能够快速帮助企业解决业务问题; C 语言偏底层,很多软件都是用 C 来写的或者和它有间接的关系,学习 C 能够帮你更好的理解计算机; C++ 虽然有些复杂,但它在某些应用场景中有很强的不可替代性,很多公司还在用 C++ 开发核心架构,比如腾讯、百度、谷歌等。
如何学习呢?这里拿 Java 举例来说。
A. 基础部分
推荐书籍:
同时推荐 B 站尚学堂的这套免费课程,可以说包含了 Java 的全部内容了。
https://space.bilibili.com/392179313
我自己总结的关于 Java 集合的文章:
另外如何写出高效的 Java 代码,再次拿出我喜欢的这本 Effective Java了,其实我觉得 Effective C++ 会更好些,不过 Java 这本有针对 Java 的内容,具体的介绍可以看我这个视频:
B. 实战部分
学习一门语言和框架我认为最好的方式就是做项目,做项目除了锻炼我们开发能力外,在找实习和找工作时候也是和面试官很好的切入点。
Java 的 Spring 框架是必须要用的,推荐《Spring 实战》这本书。
Spring IoC 和 AOP 是核心,如何理解,看我这篇文章:
你可以去 Github 上找一些感兴趣的项目入手,或者是跟着一些课程视频做项目。
比如我们习以为常的博客系统,你可以亲自动手实现感受一下做一个博客的全过程。
面试时候面试官常常会问:
你做这个项目有什么亮点? 你解决的最难问题是什么?
这些问题都是想考察你知识深度,所以做项目时候要思考一些有趣的点,或者就是别人的东西自己内化一下。
比如说,我使用了几种不同的缓存技术极大的降低了响应耗时,接下来再跟面试官去讲自己的实现思路和对缓存技术的深入理解,做到“年轻人有备而来”。
做开发的同学经常戏称自己的工作就是“增删查改”,那么增删查改自然离不开对数据库的使用,做项目的时候就要学习数据库的使用。
3. 数据库
虽然我是全栈程序员,但是工作中多数处理的还是后端问题,数据库真的非常非常常用。
在我转行成为“专业”的程序员之前,在金融公司里也常用数据库,毕竟交易系统的下游肯定是数据库,数据也是一切模型的前提。
初学者建议由浅入深,先学习怎么用。
推荐这本书《MySQL 必知必会》,是一本稍厚的小册子,书中没有讲太多数据库的底层原理,但是条理清晰、简明扼要的介绍了初学者应该掌握的基础知识。
一个晚上的时间坐下来静静的看,你会发现你对 SQL 语句如何编写会有一个很系统性认识。
面试时候面试官常常问一个需求场景,让你编写相关的 SQL 语句。
比如我面试时遇到的一个问题:写一个 SQL: table(Sno, Sname, classId, grade)查出每个班成绩前三名的同学?
但仅仅是掌握基本的 SQL 语句编写是远远不够的。
“增删查改”里面也有大学问,同样是增删查改,有些人就能把数据库性能玩转到极致。
想玩到极致自然离不开我们对底层原理的把握,这也是面试时候面试官最喜欢考察的内容,下面介绍两本和数据库底层原理相关的书籍。
《MySQL 技术内幕:InnoDB 存储引擎》由国内资深 MySQL 专家亲自执笔。本书的内容不是着眼于基本的语法教学,而是通过对数据库底层数据结构、工作机制的分析,告诉我们如何编写 SQL 语句才是高效的,告诉我们索引如何利用才能发挥最佳效果。
举几个面试常见的问题,联合索引为什么要最左匹配?数据库的隔离级别是怎么实现的?都可以在里面找到答案,数据库绝对是开发适合面试考察的重点。这本书是通过大量的例子和插图进行知识讲解,会给人留下很直观印象。
还有一本书和 Redis 相关的。
Redis 是世界上最受欢迎的非关系型数据库之一,常常用来当作缓存和 MySQL 配套使用。
Redis 本身的语法并不复杂,同学们可以找到很多这方面的语法教学资料。
面试时候常常会被问到,Redis 为什么会这么快?如果只是回答因为它是基于内存的数据库,那么面试就凉凉啦。真正的关键秘诀是在于 Redis 的设计与实现,阅读这本书你会发现,Redis 是通过一系列底层设计来保证它快速存取的性能。
二、内功
1. 算法和数据结构
我认为算法和数据结构是计算机最重要的东西,没有之一。
程序 = 数据结构 + 算法。
学习算法究竟有什么用呢?为什么大厂喜欢考察算法?可以看我这篇文章:
工作中需要分析复杂度,很多性能上的问题都依赖算法和数据结构来解决,并且带给你思维方式上的改变。有没有学过算法,决定了你能否想到最优的解决方案。
同时算法也是计算机的基础,任何一个你使用的软件或者框架中都一定有算法和数据结构。比如数据库索引使用了 B+ 树。
在此先推荐这本书:Algorithms + Data Structures = Programs
而功利一点来说,算法题的考察是进大厂必备的。
国外的不管大中小公司、国内呢像字节跳动,基本上每一轮面试官都会让你“手撕“代码,因为这是对我们写代码能力最直接的考察。
国外面试
对于国外面试的准备,大家可以看我之前写的自己的备考经历:
同时推荐普利斯顿老爷爷的算法课,B 站也有搬运版:https://www.bilibili.com/video/av50599771/
喏,就是这本书的作者,斯坦福的 PhD。
国内面试
对国内的面试,我建议从《剑指 offer》这本书开始学习,然后陆续到牛客网或者 Leetcode 开始你的刷题之旅。
这本书的作者通过 50 多道算法题作为案例,像我们讲解了面试官考察的思路和一些基本数据结构算法的运用,读这本书我们会感觉是一个资深面试官在对我循循善诱,指出我们常见的错误和学习的方向。
刷完这本书之后,就可以在 Leetcode 上继续找各类型的题目进行学习,我个人感觉一般对于面试来说,如果能把两百道中等题目刷的比较熟练是足以找到一份不错的工作了。
各种算法和数据结构我也写过不少了,在我的 Github 上都有分类汇总,大家可以自行取用:
我的 Github:https://github.com/xiaoqi6666/NYCSDE
2. 设计模式
设计模式可以说是写出高质量代码的关键。
我在入职前快速学习了设计模式,入职后看代码就顺畅很多,很多设计如果你不知道这种模式就不能理解为什么要这样做。
我觉得学习设计模式的是一个培养自己“审美”能力的过程,和画作、音乐不同,计算机的世界审美标准比较统一,那么我们首先需要知道游戏规则,然后才能打怪升级。
推荐书籍《设计模式》:
看一遍是不够的,也不需要一遍追求完全看懂。
在这一年里,我反复读这本书,遇到不同的问题时去看,随着代码量的积累,对设计模式的理解也会不同。
同时因为 code review 时会有同事给出意见,这样更能促进我的进步。
所以对于还没有工作的同学,我不建议花大量时间在这上面,因为没有人给你反馈,可能效果有限,而且这项内功是需要我们终身修炼的,不必急于一时。
3. 操作系统
说到这里,我们已经学习了 Linux 操作系统,学习了一门语言和通用框架并且做了一个小项目,学习了一种常见的关系型数据库和非关系型数据库,算法和数据结构也过关了,拿 offer 应该没问题了。
那么后端开发还需要我们学习计算机哪些知识呢?
推荐大名鼎鼎的 CSAPP:Computer Systems: A Programmer's Perspective
这本书我在很久之前的视频里就推荐过了,它把计算机底层原理讲解的非常透彻,同时 CMU 也有配套的课程:http://csapp.cs.cmu.edu/3e/courses.html
,重要性不言而喻。
当然了,书很厚,很难啃,小齐给你划重点章节:
1,2,3,6,7,8,9 章
读不下来?加入自习室,我们一起打卡!
那理解了计算机系统有什么用呢?
很难说具体有什么运用,但其实却是无处不在,比如工作中的性能优化。
如果把开发当作修炼一门功夫这些方面的内容就像是内功,只有内功修炼扎实了,最后开发才能更加稳固,做出来的项目才是可靠的。于我们个人而言,才能走得更远。
4. 计算机网络
面试还喜欢考察什么内容呢?
比如面试常常会问一道经典面试题:**从输入一个 URL 到出现页面的过程发生了什么?**如果你学过计算机网络就会对这个问题起码有一个大概的认识。
那么这个问题有什么用呢?比如当你的访问 web 页面出现了“白页“(web 页面一片空白)这种故障,你会怎么排查?如果你只是着眼于自己的代码和服务端,不清楚整个请求链路发生了什么,遇到一些稍微复杂的故障你就束手无策了。
无论是不是计算机科班学生,我都强烈建议把计算机网络学好。
当然,如果更加“功利“一点,我觉得直接去搜相关的”面经“来看,看看什么问题是最常问的,把相关板块的知识弄懂熟透,形成自己的回答条理,看看自己能不能清晰的回答。
TCP 三次握手说一下? 为什么要三次握手呢?两次、四次不行吗? HTTP 协议哪一层? 说一下 URL 到出现页面的整个过程?
推荐书籍:《计算机网络:自顶向下》
推荐课程:斯坦福大学 CS 144 计算机网络
B 站链接:https://www.bilibili.com/video/av96841516/
5. 计算机发展史
最后一点呢,是我自己感兴趣的,顺便推荐给大家。
计算机是一门非常非常有意思的学科,很好玩的学科,从最早的图灵机、到如今的台式机、笔记本电脑,以及我最近玩的树莓派,都是非常非常有意思的。
学习这些东西是为了激发我的学习热情,保持自己的好奇心的一种方式。
推荐视频:Crash Course Computer Science - 翻译叫“计算机速成课”,但并非那种“速成”。
B 站中英文版本:https://www.bilibili.com/video/av21376839/
字幕组的 Github: https://github.com/1c7/Crash-Course-Computer-Science-Chinese
这门课我真是相见恨晚,每一集只有 10-12 分钟,一共 40 集,主讲人非常激情澎湃,你能够隔着屏幕感受到她对计算机科学的热情,对我影响很大。
三、踏入江湖
如果你能做一个相对不错的项目,对各类面经知识能回答的七八分,算法题做了 200 道,我建议可以开始面试了,那么就真正踏入了江湖。
踏入江湖之后,我们仍需不断反复修炼自己的“外功”和“内功”,不断提高自己的功力,哪怕是同一本书,在工作的不同阶段读,一定会有不同的体会。
当然了,以上这些还只是职场硬实力,而能在江湖混的风生水起,一定也离不开过人的软实力。
但是软实力一定是建立在硬实力之上的,没有雪中送炭的作用,只可以锦上添花。
当然了,如果硬实力强到一定程度,是不需要软实力的,但不适合 99% 的人。
文中提到的所有书籍,我都整理好放在后台了~
获取方式:先在右下角点个在看,然后回复【05】。
路上阳光正好,愿每一位踏入江湖的少年都能潇潇洒洒,仗剑走天涯!