---
title: 我是如何提高自己的「编程能力」的？
shortTitle: 我是如何提高自己的「编程能力」的？
author: 小齐本齐
category:
  - 博客园
---

球友们好。今天我们来聊聊如何提高自己的编程能力。

作为一个科班程序员，我认为科班和非科班最大的区别在于：科班的同学知道去学什么，问题出现了他知道自己是哪里有知识漏洞；而非科班的，可能**压根不知道自己不知道什么**。

如何知道自己该学习什么呢？

如果你有一个好的老板，可以大胆地向他请教，不要不好意思，遇到积极好学的员工，老板是很乐意的。除非是沙比老板。

leader 最好，毕竟关系比较近，没有包袱。

这篇内容我们就聊聊成为一名工程师需要掌握的大致学习路线，更多的偏入门一些，不涉及具体的工作方向。欢迎大家在留言区分享你的学习心得，正如柏拉图所说：

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

如果把学习比作练功的话，学习内容可以分为：

*   修炼“外功”：偏应用
*   修炼“内功”：偏基础

两者配合，才能仗剑走天涯！

## 一、外功

### 1\. 学习一门语言和框架

初学者可以选择一门编程语言及其通用框架进行学习开发。谁上来还不敲个 hello world 呢。

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

* * *

说回我自己，当时入门语言是 Java，零基础，真的是硬着头皮上的。学习资料就一本《Java 编程思想》，真上头。

好在自己坚持了下来，万分幸运。如果你是Java 初学者的话，那就无脑上《[Java 程序员进阶之路](https://tobebetterjavaer.com/home.html)》就好了，从头刷到尾，基本上 Java 的核心知识就全部掌握了。

你甚至都不用去看书或者看视频。当然了，如果你需要，我后面也会推荐。

入门编程的话，建议的首选语言有四个：Java、C语言、Python、JavaScript。

>学习路线戳这个链接：[https://tobebetterjavaer.com/xuexiluxian/](https://tobebetterjavaer.com/xuexiluxian/)

国内的大部分高校会选择 C语言，但其实 Python 和 JavaScript 也是非常不错的选择。

在这里我也建议如果你不知道应该选什么语言，自己也没有特殊偏爱的话，那就无脑选 Java 吧。

因为 Java 市面上学习资料非常的多，无论是国内还是国外大厂 Java 的就业面都非常广，对于新人来说目前是个很稳妥的选择。

当然，如果你不放心，可以在任何一个招聘网站上面查一查各种语言的岗位需求，只要不是那种很窄门的语言，我觉得学习哪个都没有问题。像前端、Go、Python、C++、前端等等就业面还是非常广泛的。

现在看来，我认为这几门语言你可以按需去学习的：

*   Java 是综合能力很强的语言，很多互联网公司大型的框架或者开源项目都是基于 Java 的，因为它有非常完成的一套轮子，能够快速帮助企业解决业务问题；
*   C 语言偏底层，很多软件都是用 C 来写的或者和它有间接的关系，学习 C 能够帮你更好的理解计算机；
*   C++ 虽然有些复杂，但它在某些应用场景中有很强的不可替代性，很多公司还在用 C++ 开发核心架构，比如腾讯、百度、谷歌等。
* JavaScript，走前端路线、走 Web 全栈路线的，必学，像 Vue、React 等前端框架都是基于 JavaScript 完成的。
* Python，如果打算走人工智能、数据分析，学历比较硬核的话，Python 是必学的，也非常容易入门上手。
* Go，这些年收到很多读者要求进公司后转 Go 岗，就能间接的说明 Go 语言这些年发展是非常迅速的。

为了照顾大家的学习方向，Java 程序员进阶之路把所有的学习路线都整理了出来，戳链接：[https://tobebetterjavaer.com/xuexiluxian/](https://tobebetterjavaer.com/xuexiluxian/)


![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/cnblog-wosrhtgzjdbcnld-1c762f54-f797-4880-b327-98b9cf1893b2.png)

里面也备有一些必须的学习资料可供下载和在线免费优质资源（视频/网站）。


* * *

如何学习呢？这里拿 Java 举例来说。

#### A. 基础部分

推荐书籍：

无（必须的话就 On Java 8）

不过，看 [Java 程序员进阶之路](https://tobebetterjavaer.com/home.html)不香吗？

同时推荐 B 站尚学堂的这套免费课程，可以说包含了 Java 的全部内容了。

[https://space.bilibili.com/392179313](https://space.bilibili.com/392179313)


#### B. 实战部分

学习一门语言和框架我认为最好的方式就是做项目，做项目除了锻炼我们开发能力外，在找实习和找工作时候也是和面试官很好的切入点。

[二哥的编程星球里有一份编程喵🐱的实战（Spring Boot+Vue 的前后端分离）项目笔记，戳链接加入](https://tobebetterjavaer.com/zhishixingqiu/)


![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/cnblog-wosrhtgzjdbcnld-b194758a-53cf-4c5f-8533-12e4ed603f46.png)


Spring IoC 和 AOP 是核心，如何理解，看我这篇文章：

- 👉 [Spring AOP 扫盲](https://tobebetterjavaer.com/springboot/aop-log.html)
- 👉 [Spring IoC扫盲](https://tobebetterjavaer.com/springboot/ioc.html)


你可以去 Github 上找一些感兴趣的项目入手，或者是跟着一些课程视频做项目。比如我们习以为常的博客系统，你可以亲自动手实现感受一下做一个博客的全过程。




面试时候面试官常常会问：

*   你做这个项目有什么亮点？
*   你解决的最难问题是什么？

这些问题都是想考察你知识深度，所以做项目时候要思考一些有趣的点，或者就是别人的东西自己内化一下。

比如说，我使用了几种不同的缓存技术极大的降低了响应耗时，接下来再跟面试官去讲自己的实现思路和对缓存技术的深入理解，做到“年轻人有备而来”。

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

### 2\. 数据库

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

我职业生涯的初期，做过大宗期货交易平台，交易系统的下游肯定是数据库，数据也是一切模型的前提。

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

先推荐一本《[MySQL 是怎样使用的，快速入门 MySQL](https://book.douban.com/subject/35670862/)》。


![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/cnblog-wosrhtgzjdbcnld-bf863acd-dff1-450b-9793-46cc6cd412ab.png)

视频的话推荐《[3 小时学会 MySQL](https://www.bilibili.com/video/BV1iJ411m7Fj)》


![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/cnblog-wosrhtgzjdbcnld-3ca2be41-e92e-4a4f-be46-a9776c24306e.png)



觉得英文吃力的话，推荐一个女老师的 MySQL 课：[https://www.bilibili.com/video/BV12b411K7Zu](https://www.bilibili.com/video/BV12b411K7Zu)


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

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

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

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

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

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

一本《[MySQL 是怎样运行的：从根儿上理解 MySQL](https://douban.com/book/subject/35231266/)》。


![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/cnblog-wosrhtgzjdbcnld-1a0e3385-5616-4d1f-9de7-4e45b809fd3b.png)

还有一本《[MySQL 技术内幕：InnoDB 存储引擎](https://douban.com/book/subject/24708143/)》。


![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/cnblog-wosrhtgzjdbcnld-221b4051-7ab9-449f-aad5-6d295e3b1049.png)


举几个面试常见的问题，联合索引为什么要最左匹配？数据库的隔离级别是怎么实现的？数据库绝对是开发适合面试考察的重点。

还有一本书和 Redis 相关的《Redis 设计与实现》，有读者评价说“作者有点大陆版侯捷老师的意思”。


![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/cnblog-wosrhtgzjdbcnld-cc0294d8-1862-4bfa-8c71-970cd2ac72bd.png)

博客的话推荐二哥的《三剑客》团队之一一灰灰的博客：[https://hhui.top/spring-db/08.redis/](https://hhui.top/spring-db/08.redis/)

视频的话，推荐狂神说的《[Redis最新超详细版教程通俗易懂](https://www.bilibili.com/video/BV1S54y1R7SB)》。 

Redis 是世界上最受欢迎的非关系型数据库之一，常常用来当作缓存和 MySQL 配套使用。Redis 本身的语法并不复杂，球友们可以找到很多这方面的语法教学资料。



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

### 3\. Linux 操作系统

对于想做开发的同学，我会强烈推荐学习一下 Linux 操作系统，因为互联网公司基本上大部分业务框架部署都是在 Linux 操作系统上进行的。

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

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

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

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


![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/cnblog-wosrhtgzjdbcnld-e20af367-911b-460e-b00c-3413cef064a1.png)


《[鸟哥的 Linux 私房菜](https://book.douban.com/subject/4889838/)》蝉联最受欢迎华语 Linux 书籍第一的位置，无人能撼动。

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

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

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

视频的话推荐[韩顺平老师的一周学会Linux](https://www.bilibili.com/video/BV1Sv411r7vd)


![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/cnblog-wosrhtgzjdbcnld-c3a6c806-115a-4e57-8adc-5ddfd2d3d5ef.png)


## 二、内功

### 1\. 算法和数据结构

我认为算法和数据结构是计算机非常重要的东西：程序 = 数据结构 + 算法。

学习算法究竟有什么用呢？为什么大厂喜欢考察算法？

互联网大规模的兴起，需要大量的工程师去解决问题，那么面试的核心就变成了如何选拔出能够解决普通问题、写出有效代码的人。

一个基本功扎实，思维逻辑强，能够写出有效代码的人就能够胜任这些职位，因此互联网公司的面试规则也随之改变。

互联网行业的大规模扩张降低了行业的门槛，虽然目前依旧是高薪行业，但对个人的门槛已经大幅降低了，甚至不问背景和专业，每个人都有机会进入顶尖的公司。

大部分互联网公司认为，算法是非常有效的筛选出他们想要的工程师的。

**算法，一是能够考察面试者思考解决问题的能力，二是考察写代码的基本功**。

一个能通过算法面试的人大概率是能够胜任工程师的职位的；一个不能通过算法面试的人大概率是无法胜任这项工作的。

当然了，可能会漏掉某些优秀的人才，但真相就是，**大厂不在乎**，所以国外的互联网大厂会考算法，国内的互联网大厂也在跟进。

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

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

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

#### 国外面试

对于国外面试的准备，球友们可以看好朋友小齐之前写的自己的备考经历：👉 [从小白到 6 个 offer，我究竟是怎么刷题的？](https://mp.weixin.qq.com/s/B9ttml8KX7kn7K1mvbRbng)

推荐普利斯顿老爷爷的算法课，B 站也有搬运版：[https://www.bilibili.com/video/av50599771/](https://www.bilibili.com/video/av50599771/)

喏，就是这本《[算法 4](https://douban.com/book/subject/19952400/)》的作者，斯坦福的 PhD。


![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/cnblog-wosrhtgzjdbcnld-278cf8b8-a75f-4160-b44f-1d37cdf8cb7a.png)


#### 国内面试

国内的面试，我建议大家跟着星球的专栏《Java 版 LeetCode 刷题笔记》走，通俗易懂。我们计划周一到周五至少每天更新一篇，周六周日更新一篇，目标 300 道 LeetCode 经典题。


![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/cnblog-wosrhtgzjdbcnld-08f44605-8174-4079-8319-e1b8d49602df.png)

有算法天赋的选手可以从《[剑指 offer](https://douban.com/book/subject/35543447/)》这本书开始学习，或者直接到牛客网或者 Leetcode 开始你的刷题之旅。


![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/cnblog-wosrhtgzjdbcnld-ae5eaa49-cd5f-4403-8ff3-803da9b421de.png)


我个人感觉对于一般面试来说，如果能把两百道中等题目刷的比较熟练是足以找到一份不错的工作了。


### 2\. 设计模式

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

我在入职后的第三年才开始学习设计模式，之后看代码就顺畅很多，很多设计如果你不知道这种模式就不能理解为什么要这样做。

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

推荐好朋友小傅哥的书籍《[重学 Java 设计模式](https://douban.com/book/subject/35451185/)》：

![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/cnblog-wosrhtgzjdbcnld-68ec93ac-1855-4813-affe-b3b6484ca157.png)

电子版的话可以[戳这里](https://tobebetterjavaer.com/nice-article/weixin-shejmsnb.html)。

也可以直接到这个网站 [Refactoring Guru](https://refactoring.guru) 刷设计模式，制作的真心不错。


![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/cnblog-wosrhtgzjdbcnld-37b13245-b14b-4d04-8dee-b193a7c3c523.png)


设计模式看一遍是不够的，也不需要一遍追求完全看懂。随着代码量的积累，对设计模式的理解也会不同。

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

### 3\. 操作系统

在此之前，我们已经学习了 Linux，学习了一门语言和通用框架并且做了一个小项目，学习了一种常见的关系型数据库和非关系型数据库，算法和数据结构也过关了，拿 offer 应该没问题了。

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

推荐大名鼎鼎的 CSAPP：*Computer Systems: A Programmer's Perspective*


![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/cnblog-wosrhtgzjdbcnld-3d79c0f7-168b-4e1a-8f67-774624eda1b3.png)


这本书我在很久之前的视频里就推荐过了，它把计算机底层原理讲解的非常透彻，同时 CMU 也有配套的课程：`http://csapp.cs.cmu.edu/3e/courses.html` ，重要性不言而喻。

当然了，书很厚，很难啃，二哥给你划重点章节：

> 1，2，3，6，7，8，9 章

我在《Java 程序员进阶之路》网站上也分享有[操作系统的学习路线](https://tobebetterjavaer.com/xuexiluxian/os.html)，可以围观。

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

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

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

### 4\. 计算机网络

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

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

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

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

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

*   TCP 三次握手说一下？
*   为什么要三次握手呢？两次、四次不行吗？
*   HTTP 协议哪一层？
*   说一下 URL 到出现页面的整个过程？

推荐书籍：《[计算机网络：自顶向下](https://douban.com/book/subject/26176870/)》


![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/cnblog-wosrhtgzjdbcnld-c0604bad-423e-40e7-a81f-e51f09656e77.png)

视频推荐：斯坦福大学 CS 144 计算机网络

B 站链接：[https://www.bilibili.com/video/av96841516/](https://www.bilibili.com/video/av96841516/)

还有湖科大教书匠的这个视频课，也是非常的顶。

[https://www.bilibili.com/video/BV1c4411d7jb](https://www.bilibili.com/video/BV1c4411d7jb)


![每次我来截图，看的人都很多](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/cnblog-wosrhtgzjdbcnld-756b8098-ecb9-43a1-93aa-497608f4b1b4.png)


### 5\. 计算机发展史

最后一点呢，是我自己感兴趣的，顺便推荐给大家。

计算机是一门非常非常有意思的学科，很好玩的学科，从最早的图灵机、到如今的台式机、笔记本电脑，以及我最近玩的树莓派，都是非常非常有意思的。

学习这些东西是为了激发我的学习热情，保持自己的好奇心的一种方式。

推荐视频：Crash Course Computer Science - 翻译叫“计算机速成课”，但并非那种“速成”。

B 站中英文版本：[https://www.bilibili.com/video/av21376839/](https://www.bilibili.com/video/av21376839/)

字幕组的 Github: [https://github.com/1c7/Crash-Course-Computer-Science-Chinese](https://github.com/1c7/Crash-Course-Computer-Science-Chinese)

这门课我真是相见恨晚，每一集只有 10-12 分钟，一共 40 集，主讲人非常激情澎湃，你能够隔着屏幕感受到她对计算机科学的热情，对我影响很大。

![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/cnblog-wosrhtgzjdbcnld-e061a7ea-151e-44b5-bda0-c4c4539e8212.jpg)

## 三、踏入江湖

如果你能做一个相对不错的项目，对各类面经知识能回答的七八分，算法题做了 200 道，我建议可以开始面试了，那么就真正踏入了江湖。

面试之前，强烈建议你把星球专栏《Java 面试指南》刷完，做到有的放矢。

![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/cnblog-wosrhtgzjdbcnld-3979663f-660c-4163-9a31-58c4fc9dcceb.png)


踏入江湖之后，我们仍需不断反复修炼自己的“外功”和“内功”，不断提高自己的功力，哪怕是同一本书，在工作的不同阶段读，一定会有不同的体会。

当然了，以上这些还只是职场硬实力，要想在江湖混的风生水起，一定也离不开过人的软实力。

但是软实力一定是建立在硬实力之上的，没有雪中送炭的作用，只可以锦上添花。

当然了，如果硬实力强到一定程度，是不需要软实力的，但不适合 99% 的人。


路上阳光正好，愿每一位踏入江湖的少年都能潇潇洒洒，仗剑走天涯！

>参考链接：[https://www.cnblogs.com/nycsde/p/14176574.html](https://www.cnblogs.com/nycsde/p/14176574.html)，原作者小齐，也是二哥的朋友之一，之前在国外，回国后在北京一家互联网大厂。

----

最近整理了一份牛逼的学习资料，包括但不限于Java基础部分（JVM、Java集合框架、多线程），还囊括了 **数据库、计算机网络、算法与数据结构、设计模式、框架类Spring、Netty、微服务（Dubbo，消息队列） 网关** 等等等等……详情戳：[可以说是2022年全网最全的学习和找工作的PDF资源了](https://tobebetterjavaer.com/pdf/programmer-111.html)

关注二哥的原创公众号 **沉默王二**，回复**111** 即可免费领取。

![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/xingbiaogongzhonghao.png)
