我是如何提高自己的「编程能力」的?珍藏了四年的经验!分享给你

我自己作为一个非科班的程序员,并且在工作中观察了“这两类”工程师的表现,我认为科班和非科班最大的区别在于:科班的同学知道去学什么,问题出现了他知道自己是哪里有知识漏洞;而非科班的,可能 压根不知道自己不知道什么 。

(解决方式:建立系统的知识体系、寻求老板、tech lead 的指点,快速补充基础并反复学习。)

图片[1]-我是如何提高自己的「编程能力」的?珍藏了四年的经验!分享给你-JieYingAI捷鹰AI

因此这篇文章我想粗浅的聊聊成为一个工程师需要掌握的大致学习路线,更多的偏入门一些,不涉及具体的工作方向。正如柏拉图所说:

人只有通过和别人讨论,才能知道我们的经验是不是真实的。

如果把学习比作练功的话,我把我的学习内容分为:

修炼“外功”:偏应用

修炼“内功”:偏基础

两者配合,才能仗剑走天涯!

图片[2]-我是如何提高自己的「编程能力」的?珍藏了四年的经验!分享给你-JieYingAI捷鹰AI

一、外功

1. Linux 操作系统

对于想做开发的同学,如果还是个小白,问我第一件事情该做什么,我会强烈推荐先学习 Linux 操作系统,因为互联网公司基本上大部分业务框架部署都是在 Linux 操作系统上进行的。

我认为学习 Linux 操作系统的重点就在于学习各种强大 命令 如何组合运用。

一是因为工作中我们经常需要用到,比如对各种日志文件进行分析,写脚本驱动机器帮助我们工作。

二是面试时经常会给出一个需求场景让你编写相关的组合命令,比如统计一段日志中各种 IP 地址出现的次数。

给大家推荐一本 Linux 界的“圣经”。

图片[3]-我是如何提高自己的「编程能力」的?珍藏了四年的经验!分享给你-JieYingAI捷鹰AI

《鸟哥的 Linux 私房菜》蝉联最受欢迎华语 Linux 书籍第一的位置,无人能撼动。

对于想走开发路线,或者互联网技术路线的同学,学习 Linux 绝对是必须的。

这是一本既能帮助你入门,又能随时备查的工具书。更特别的是鸟哥的写作风格,非常口语化,读起来感觉像是有人在跟你实时互动聊天。

建议想要学习的同学可以收藏一本电子版随时备查。第一次阅读的同学估计会被它的厚度吓到,但其实没有必要去一字一字的全部读完,快速的看完前面十章,你就会对 Linux 有一个初步的认识。以后需要用到哪些命令和知识随时再查就可以了。

图片[4]-我是如何提高自己的「编程能力」的?珍藏了四年的经验!分享给你-JieYingAI捷鹰AI

2. 学习一门语言和框架

对 Linux 操作系统有了一定的了解之后,大家就可选择一门编程语言及其通用框架进行学习开发。

语言的学习和框架可以借助的资料就很多了,每个人的习惯都不一样。喜欢跟着视频学习的可以去慕课网、极客时间,上面有很多性价比很高的课程。另外推荐大家可以加入一些交流群,嗯,比如我的读者交流群,另外一些框架或者语言的官网里面都会有自己社区和交流群的联系方式,里面会有很多精华帖子和大牛进行分享。

说回我自己,当时入门语言是 C++,研究生课程要用,没基础也只能硬着头皮上了。

但其实很多 C++ 的课程或者书籍都是先讲 C 语言,比如《C++ Primer》前面几章都是讲的 C 语言,所以也还好。

现在看来,我认为这三门语言都是需要学习的:

Java 是综合能力很强的语言,很多互联网公司大型的框架或者开源项目都是基于 Java 的,因为它有非常完成的一套轮子,能够快速帮助企业解决业务问题;

C 语言偏底层,很多软件都是用 C 来写的或者和它有间接的关系,学习 C 能够帮你更好的理解计算机;

C++ 虽然有些复杂,但它在某些应用场景中有很强的不可替代性,很多公司还在用 C++ 开发核心架构,比如腾讯、百度、谷歌等。

做开发的同学经常戏称自己的工作就是“增删查改”,那么增删查改自然离不开对数据库的使用,做项目的时候就要学习数据库的使用。

图片[5]-我是如何提高自己的「编程能力」的?珍藏了四年的经验!分享给你-JieYingAI捷鹰AI

3. 数据库

虽然我是全栈程序员,但是工作中多数处理的还是后端问题,数据库真的非常非常常用。

在我转行成为“专业”的程序员之前,在金融公司里也常用数据库,毕竟交易系统的下游肯定是数据库,数据也是一切模型的前提。

初学者建议由浅入深,先学习怎么用。

推荐这本书《MySQL 必知必会》,是一本稍厚的小册子,书中没有讲太多数据库的底层原理,但是条理清晰、简明扼要的介绍了初学者应该掌握的基础知识。

图片[6]-我是如何提高自己的「编程能力」的?珍藏了四年的经验!分享给你-JieYingAI捷鹰AI

一个晚上的时间坐下来静静的看,你会发现你对 SQL 语句如何编写会有一个很系统性认识。

面试时候面试官常常问一个需求场景,让你编写相关的 SQL 语句。

比如我面试时遇到的一个问题:写一个 SQL: table(Sno, Sname, classId, grade)查出每个班成绩前三名的同学?

但仅仅是掌握基本的 SQL 语句编写是远远不够的。

“增删查改”里面也有大学问,同样是增删查改,有些人就能把数据库性能玩转到极致。

想玩到极致自然离不开我们对 底层原理 的把握,这也是面试时候面试官最喜欢考察的内容,下面介绍两本和数据库底层原理相关的书籍。

图片[7]-我是如何提高自己的「编程能力」的?珍藏了四年的经验!分享给你-JieYingAI捷鹰AI

《MySQL 技术内幕:InnoDB 存储引擎》由国内资深 MySQL 专家亲自执笔。本书的内容不是着眼于基本的语法教学,而是通过对数据库底层数据结构、工作机制的分析,告诉我们如何编写 SQL 语句才是高效的,告诉我们索引如何利用才能发挥最佳效果。

举几个面试常见的问题,联合索引为什么要最左匹配?数据库的隔离级别是怎么实现的?都可以在里面找到答案,数据库绝对是开发适合面试考察的重点。这本书是通过大量的例子和插图进行知识讲解,会给人留下很直观印象。

还有一本书和 Redis 相关的。

图片[8]-我是如何提高自己的「编程能力」的?珍藏了四年的经验!分享给你-JieYingAI捷鹰AI

Redis 是世界上最受欢迎的非关系型数据库之一,常常用来当作缓存和 MySQL 配套使用。

Redis 本身的语法并不复杂,同学们可以找到很多这方面的语法教学资料。

面试时候常常会被问到,Redis 为什么会这么快?如果只是回答因为它是基于内存的数据库,那么面试就凉凉啦。真正的关键秘诀是在于 Redis 的设计与实现,阅读这本书你会发现,Redis 是通过一系列底层设计来保证它快速存取的性能。

图片[9]-我是如何提高自己的「编程能力」的?珍藏了四年的经验!分享给你-JieYingAI捷鹰AI

二、内功

1. 算法和数据结构

我认为算法和数据结构是计算机最重要的东西,没有之一。

程序 = 数据结构 + 算法。

工作中需要分析复杂度,很多性能上的问题都依赖算法和数据结构来解决,并且带给你思维方式上的改变。有没有学过算法,决定了你能否想到最优的解决方案。

同时算法也是计算机的基础,任何一个你使用的软件或者框架中都一定有算法和数据结构。比如数据库索引使用了 B+ 树。

在此先推荐这本书:_Algorithms + Data Structures = Programs_

图片[10]-我是如何提高自己的「编程能力」的?珍藏了四年的经验!分享给你-JieYingAI捷鹰AI

而功利一点来说,算法题的考察是进大厂必备的。

国外的不管大中小公司、国内呢像字节跳动,基本上每一轮面试官都会让你“手撕“代码,因为这是对我们写代码能力最直接的考察。

对国内的面试,我建议从《剑指 offer》这本书开始学习,然后陆续到牛客网或者 Leetcode 开始你的刷题之旅。

图片[11]-我是如何提高自己的「编程能力」的?珍藏了四年的经验!分享给你-JieYingAI捷鹰AI

这本书的作者通过 50 多道算法题作为案例,向我们讲解了面试官考察的思路和一些基本数据结构算法的运用,读这本书我们会感觉是一个资深面试官在对我循循善诱,指出我们常见的错误和学习的方向。

刷完这本书之后,就可以在 Leetcode 上继续找各类型的题目进行学习,我个人感觉一般对于面试来说,如果能把两百道中等题目刷的比较熟练是足以找到一份不错的工作了。

2. 设计模式

设计模式可以说是写出高质量代码的关键。

我在入职前快速学习了设计模式,入职后看代码就顺畅很多,很多设计如果你不知道这种模式就不能理解为什么要这样做。

我觉得学习设计模式的是一个培养自己“审美”能力的过程,和画作、音乐不同,计算机的世界审美标准比较统一,那么我们首先需要知道游戏规则,然后才能打怪升级。

推荐书籍《设计模式》:

图片[12]-我是如何提高自己的「编程能力」的?珍藏了四年的经验!分享给你-JieYingAI捷鹰AI

看一遍是不够的,也不需要一遍追求完全看懂。

在这一年里,我反复读这本书,遇到不同的问题时去看,随着代码量的积累,对设计模式的理解也会不同。

同时因为 code review 时会有同事给出意见,这样更能促进我的进步。

所以对于还没有工作的同学,我不建议花大量时间在这上面,因为没有人给你反馈,可能效果有限,而且这项内功是需要我们终身修炼的,不必急于一时。

3. 操作系统

说到这里,我们已经学习了 Linux 操作系统,学习了一门语言和通用框架并且做了一个小项目,学习了一种常见的关系型数据库和非关系型数据库,算法和数据结构也过关了,拿 offer 应该没问题了。

那么后端开发还需要我们学习计算机哪些知识呢?

推荐大名鼎鼎的 CSAPP:_Computer Systems: A Programmer's Perspective_

图片[13]-我是如何提高自己的「编程能力」的?珍藏了四年的经验!分享给你-JieYingAI捷鹰AI

这本书我在很久之前的视频里就推荐过了,它把计算机底层原理讲解的非常透彻,重要性不言而喻。

当然了,书很厚,很难啃~

那理解了计算机系统有什么用呢?

很难说具体有什么运用,但其实却是无处不在,比如工作中的性能优化。

如果把开发当作修炼一门功夫这些方面的内容就像是内功,只有内功修炼扎实了,最后开发才能更加稳固,做出来的项目才是可靠的。于我们个人而言,才能走得更远。

4. 计算机网络

面试还喜欢考察什么内容呢?

比如面试常常会问一道经典面试题: 从输入一个 URL 到出现页面的过程发生了什么? 如果你学过计算机网络就会对这个问题起码有一个大概的认识。

那么这个问题有什么用呢?比如当你的访问 web 页面出现了“白页“(web 页面一片空白)这种故障,你会怎么排查?如果你只是着眼于自己的代码和服务端,不清楚整个请求链路发生了什么,遇到一些稍微复杂的故障你就束手无策了。

无论是不是计算机科班学生,我都强烈建议把计算机网络学好。

当然,如果更加“功利“一点,我觉得直接去搜相关的”面经“来看,看看什么问题是最常问的,把相关板块的知识弄懂熟透,形成自己的回答条理,看看自己能不能清晰的回答。

TCP 三次握手说一下?

为什么要三次握手呢?两次、四次不行吗?

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享