高薪/大厂程序员要学习哪些东西?

一名合格的程序员,不但要会写代码,会实现业务需求,还应该具备扎实的基本功,了解软件的底层原理和运行细节。从整体上看,大厂/高薪程序员应该掌握/了解以下技能。

1) 计算机四大件

四大件是一个通俗的叫法,具体来说包括以下四门课程。

科目

说明

计算机组成原理

主要研究计算机系统的硬件组成和工作原理,包括数字电路、存储器、中央处理器等内容。这部分大体上了解即可,不是笔试面试重点。

数据结构

主要研究数据的组织方式和处理方法,包括线性表、树、图等数据结构,以及基本的算法思想和分析方法。这部分内容是重中之重,要深入学习。

操作系统

主要研究计算机系统的软件组成和工作原理。包括进程/线程/并发(重点)、内存布局和内存管理(重点)、文件系统和磁盘IO等内容,以及基本的操作系统概念和设计思路。

计算机网络

主要研究计算机之间的通信原理和协议,包括网络体系结构(OSI 模型)、传输协议、网络安全等内容,以及基本的网络概念和技术。重点学习 TCP/IP 协议栈、socket 通信(三/四次握手、select、poll、epoll)、HTTPS/HTTP、长链接等内容。


计算机四大件也是考研要学习的专业课程。

2) 算法(必学)

这是重点内容,一二线大厂和独角兽都会考察算法,不玩算法就不可能入职这些公司。很多算法都是基于某种数据结构的,所以它们是交叉在一起的。

常见的算法有:

  • 动态规划

  • 暴力搜索

  • 贪心

  • 分治

  • 各种查找和排序算法

  • 树相关算法(树的遍历、哈夫曼树/最优二叉树、回溯、红黑树、b/b-/b+树)

  • 图相关算法(DFS/深度优先搜索、BFS/广度优先搜索、最小生成树、Prim算法、Kruskal算法、连通图、关键路径、最短路径、Dijkstra算法、Floyd算法)


先学习常见和主流算法,然后再慢慢刷题(常见的刷题平台有 LeetCode 和牛客网)。刷题没法一口吃个胖子,要保持长期刷题的习惯,这是一个痛苦和煎熬的过程。

3) 对应方向的技术栈(必学)

以上是所有程序员的基本功,只有掌握了这些,才算摸清了软件产业的脉络。不管你从事哪个方向的开发,都得学习这些基本功。学完基本功以后,还需要针对你想从事的开发方向,再学习对应的技术栈。

比如 Java 后台开发要学习的内容包括:

  • Java 基础:包括 Java SE、Java 集合、Java 并发/Java 多线程、JVM、设计模式 等。

  • Java 后台开发/网站开发:包括 Servlet、JSP/Thymeleaf、SSM(Spring + SpringMVC + MyBatis)、Spring Boot、Spring Cloud 等。

  • 中间件技术:包括 Redis、ES/Elasticsearch、消息队列 RabbitMQ 和 Kafka 等。

  • Web 前端知识:包括 HTML、CSS、JavaScript、Node、Vue、React 等。当然,这不是重点,你只需要简单了解,知道它们是什么东西,并能写一点简单的 Web 前端代码,就 OK 了。

3) 数据库(必学)

其实,不管从事哪个方向的开发,都要学习一两款数据库。虽然数据库不算程序员的内功,但它是一种通用的技能,而且是考察的重点内容。

首先是基于 SQL 语言的关系型数据库,推荐学习 MySQL,知识点包括:增删改查、数据类型、事务及其四大特性、关联查询(join)、索引、存储引擎、约束、视图、存储过程、备份与恢复、性能优化。

有余力的话,再学习一种非关系型数据库(NoSQL数据库),比如 MongoDB、Redis 等。

4) 编译原理(选学)

了解程序的生成和运行过程,包括编译、链接、动态/静态链接库、标准库/运行库等。

总结

计算机四件套 + 算法 + 对应方向的技术栈 + 数据库,把这些东西都搞明白了,才是一名合格的程序员,才能拿高薪,进大厂;就算是一名专科生,掌握了这些东西也能拿 20W。

虽然工资高低不仅跟个人能力挂钩,还跟情商、机遇、市场挂钩,但是和半吊子程序员相比,功底扎实的程序员更容易找到高薪工作,更容易走得长远。

把编程当做一种科学吧,不要再仅仅把它当做一种技能了。