作为一名程序员,我有考虑过自己未来的职业发展道路。从刚开始工作的 1 到 3 年内,能够将自己本职工作做好,按时完成给定的业务需求,去思考如何将业务做得更好;4 到 5 年内,争取开始带团队,能够独当一面的完成具体的工作,管理并带领团队成员完成较大的项目;6 到 10 年内,我希望自己能够在技术这条路上越走越远,深究技术原理,用自己学到的知识去为企业解决技术上的难题。

有了目标,下一步就是脚踏实地一步一步去实现了。与其说是制定的目标或计划,但其实也涉及了一些自己在校招过程中学习到的一些书籍、博客。在此,参照皓哥的成长路线,再结合自己对未来成长的思考,现整理出以后需要学习或者用到的一些技术、知识,以及在学习过程中看到的一些优质的技术博客。

计算机基础

不管是考研还是校招,只要涉及到与计算机相关的专业或工作,都需要学习一些计算机基础理论知识,其中包括:算法数据结构计算机网络操作系统数据库,当然,对于科班出身的人来说,还会涉及到编译原理计算机组成原理等。

因此,对于这些理论知识,必须花时间拿下。越是枯燥的内容,越应该将其弄懂,要坐的住板凳。因为这些理论基础不仅是一名程序员应当掌握的技能,它还可以抬高你的天花板,让你的未来有更大的提升空间。要想学好这些知识也是不简单的,如果你很聪明的话,可能不需要太长的时间,而如果你向我一样智商普通的话,可能需要花费别人几倍的时间,就像 Peter Norvig 所说的那样:花费十年的时间自学编程

对于各个基础知识的学习,下面列出了一些学习资源,包括书籍、官方文档、优质博客等。

算法与数据结构

从我今年参加的校招来看,算法与数据结构无疑是这些公司考察的重点。不管是笔试还是面试,基本上所有的互联网公司都会给定几道算法题让你来做。对于笔试来说,最后的几道算法题会帮助你拿到进入面试的资格;对于面试来说,一般情况下,面试官会给你一道或两道算法题,在规定的时间内写出具体的代码,并给面试官讲清楚具体的实现思路即可。因为,算法题能够体现出一个人的思维方式,在解题的过程中,如果能够思路清晰的讲代码实现,那么就可以增加面试官的好感度,进而有机会在当前的面试环节得到一个很好的评价,甚至拿到一个比较满意的 offer。

对于算法与数据结构的学习,在本科时,我们当时使用的是 严蔚敏《数据结构(C语言版)》这本教材。由于当时没有很好的学习资源,所以仅仅就将这本书看完了。而当我在准备校招时,我又重新整理了一下自己所学习过的书籍。

书籍

  • 《啊哈!算法》,这本书以实际应用为出发点,是一本算法入门书。书中在介绍每种数据结构的时候,会配有相应的图片,每个算法步骤都会有详细的解释,涵盖的算法也比较全面,很适合新手阅读。
  • 《漫画算法:小灰的算法之旅》,这本书是 2019 年出版的,书中采用漫画的形式,展示了一些比较常见的算法与数据结构。除此之外,还介绍了许多算法的面试题以及算法的实际应用场景。总体来讲,也是一本适用于算法新手入门的书籍。
  • 《算法》,如果你想系统的学习算法与数据结构,那么这本书可不能错过。该书讲到的算法和数据结构内容极其丰富,非常适合有一定基础的同学研读。书中代码使用 Java 实现,并且每种算法都搭配了相应的图片,便于理解,是一本非常值得推荐的算法书。
  • 《算法导论》,大名鼎鼎的算法导论经久不衰,该书在介绍算法的同时,会着重涉及到算法的理论知识,让你从理论层面加深对每个算法的理解,极力推荐。

此外,还有一些含有大量算法题目的书籍,下面的这些算法书籍不仅可以帮你巩固之前学习到的算法理论,同时还可以提升你的实际动手能力。

  • 《剑指 Offer:名企面试官精讲典型编程题》,不管是校招还是社招,只要是对于找工作的人来说,无疑是必读的一本书。书中不仅介绍了常见的面试技巧、注意事项、代码书写等问题,而且该书中的算法题被许多互联网公司使用。也就是说,在进行面试时,面试官经常在这上面找题让你做。可以说,如果将书中的每个题目都弄懂,那么面试也就成功了一大半。
  • 《编程珠玑》,该书通过对一些典型的算法题目进行展开,介绍了程序设计人员人员面对的一系列实际问题,并对相应的算法原理进行了详细解释。
  • 《编程之美:微软技术面试心得》,书中含有约 60 道算法题,这些题目也是经常在笔试、面试中出现过。该书在具体介绍算法题目时,从问题出发,进而分析问题、解决问题,直到寻找更优的解法,采用步步递进的方式更加深入的理解每道题背后的本质。

此外,还有 《程序员面试金典》《程序员代码面试指南》等含有大量算法题目的书籍,可以很好的帮助你进行算法练习。

资源

在整个校招的过程中,我自身在学习算法的过程中也收集了一些优质的网站、博客,这些资源都与算法相关,所以均在下面给出。

  • 力扣,算法 OJ(Online Judge)平台,该算法网站包含近 1800 道算法题目,按照标签分类有:数组、字符串、动态规划、数学、哈希表、贪心、二分查找、排序、栈…..涵盖了大量常见的算法和数据结构,绝对是你练习算法的最佳网站。
    • 此外,我的 GitHub 上也整理了许多算法题目,这些都是我在准备校招的过程中总结的常见算法。平时没事的时候,可以做几道算法题解解闷。
  • 牛客网,这是一个大学生校招与社招经验分享平台,参加面试的同学会经常在该网站分享一些面试经验。此外,该网站也有「在线编程练习」部分,也可以帮助你增加自身的刷题量。
  • labuladong 的算法小抄,这是我在力扣的题解区看到的一个用户写的算法总结博客,该博客详细介绍了动态规划系列、数据结构系列、常用算法技巧、高频面试系列等,算法题都来源于力扣,大部分常见的题目都有题解,非常推荐。
  • Data Structure Visualizations,该网站通过使用动画的形式来介绍某种数据结构或算法的运行流程,可以更形象的帮助你理解算法的执行过程。
  • OI Wiki,这是一个适用于竞赛编程(CP,Competitive programming)选手的知识整合网站,该网站涉及许多与算法竞赛相关的、有趣又实用的知识,如图论、计算几何、离散化等,比较适用于专门搞算法竞赛的选手。
  • ACWing,北大学长闫学灿创办的一个算法交流社区,该网站也含有大量的算法题目。此外,对于「活动」板块,学长也录制了一些算法课程,值得学习。

如果你觉得算法题刷得不够多,还有一些常见的 OJ 平台供你选择。例如:计蒜客LintCodecodewarscodeforces洛谷HDU OJLibre OJhihoCoder,足够帮助你练习算法题目。

计算机网络

对于计算机网络,本科学的是谢希仁《计算机网络》,书中内容丰富,是一本被纳入普通高等教育“十一五”国家级规划教材。不过,遵循从易到难的原则,我推荐以下几本书籍。

  • 《图解 TCP/IP》,该书通过采用大量图画来介绍 TCP/IP 的基础知识,包括网络基础知识、IP 协议、TCP 与 UDP、路由协议、网络安全等,比较适合新手阅读。
  • 《图解 HTTP》,该书对 HTTP 协议进行了全面系统的介绍,讲述了 HTTP 协议的结构,也是使用大量的图画来帮助读者更好地理解 HTTP 的通信过程。同 《图解 TCP/IP》一样,适合新手入门。
    • 在学习 HTTP 时,也可以参见 Mozilla 官方文档中介绍的 HTTP
  • 《TCP/IP 详解 卷 1:协议》,这本书堪称经典,主要讲解了 TCP/IP 协议的实际工作原理,类似于《算法导论》,主要从原理出发,帮助你深度理解计算机网络中的各种 RPC、访问控制、身份认证等知识。像这种比较经典的书,要认真研读。
  • 《计算机网络:自顶向下方法》,该书从最顶层的应用层出发,逐步向下介绍计算机网络的基本原理,深入浅出,介绍的内容非常详细。但推荐该书的英文原版。

其它的知识点,例如三次握手、四次挥手、拥塞控制等,都有在我的博客中写过文章。针对 TCP 部分,推荐看看皓哥的两篇文章:TCP 的那些事儿(上)TCP 的那些事儿(下)

此外,还需要读的是:《UNIX 网络编程》《UNIX 环境高级编程》。还需要明白 「C10K」 问题以及文章 「The Secret To 10 Million Concurrent Connections -The Kernel Is The Problem, Not The Solution」

操作系统

对于操作系统,本科时学习的是汤小丹的《计算机操作系统》,可以看到豆瓣的评分并不是很高。这是因为这本书是国内流行的经典计算机教材,虽然属于高校指定用书,但是其理论及内容介绍的不是很通顺,没有娓娓道来的指导,错误甚多。因此,我比较推荐国外的书籍,尽量看英文原版。

  • 《深入理解计算机系统》,豆瓣热门编程图书 No.1,程序员必读书籍。该书在介绍计算机系统本质的同时,还为程序员描述了计算机系统的实现细节,从最底层的数据在内存中的表示到流水线指令的构成,最后到用户态的应用,能够帮助你更好的理解计算机系统的整体结构。
  • 《现代操作系统》,说实话,这本书我也没看过。不过可以当作备选书,有余力的可以看一下。

当然,也可以结合视频进行学习。这里推荐北大陈向群老师的《操作系统原理》课程,重点讲述了操作系统内部结构、工作原理及典型技术的实现。

此外,还有浙江大学李善平老师的《操作系统》课程,讲授的内容也很清晰,如进程管理、进程同步、死锁、内存管理、虚拟内存等。

数据库

本科读的是王珊的《数据库系统概论》,虽然有老师上课教学,但自己在看这本书的时候,里面还是会有一些语句晦涩难懂,对于某些知识点的讲解也是琢磨不透。所以说,对于计算机类的书籍,最好还是看国外原版,一方面可以提高自己英文阅读能力,另一方面能够获取到正确的、容易理解的知识。对于这种第一手资料以及没有被加工过的知识才是最珍贵的。

  • 《数据库系统概念》,这本书的内容由浅入深,既包含了数据库系统的基本概念,也反映了数据库技术的新进展。
  • 《MySQL 必知必会》,一本很小的册子,主要介绍了 MySQL 的基本使用,包括 SQL 语句的增删改查、子查询、存储过程、游标、触发器等。虽然页数不多,但通过重点突出章节,条理清晰且系统,较为全面。
  • 《MySQL 技术内幕:InnoDB存储引擎》,该书从源码的角度深度解析了 InnoDB 存储引擎的体系结构、实现原理以及工作机制,较为推荐阅读。
  • 《高性能 MySQL》,属于 MySQL 的中高级教程书籍,重点可以看一下第五章(创建高性能的索引)、第六章(查询性能优化)以及第七章(MySQL 高级特性)。

对于 MySQL,也可以去官网学习它的参考手册。对于 Redis 来说,一方面可以通过官网查看常用的命令以外,还可以读一下《Redis 设计与实现》,这本书很好的解释了 Redis 各种数据结构的实现原理以及 Redis 内部运行机制,比较适合入门。

Linux

前面也提到过 Unix 相关的书籍,这里推荐的是《鸟哥的 Linux 私房菜》,可以将其当作 Linux 入门书籍。这本书很厚,全面而详细地介绍了 Linux 操作系统。包括 Linux 的起源、安装、文件系统、目录与磁盘管理、shell 脚本等知识。从整体上看来,这本书的语言活泼生动,非常值得一读。

当然,有关 Linux 的内容远不止这些,例如与 Linux 系统相关的内核、底层性能调优等,都十分值得关注。而对于 Linux 操作系统相关的内存管理知识,可以参见系列文章 「What every programmer should know about memory.」

编程语言

Java

由于之前学习的都是 Java,并且我对 Java 还是非常热爱的。因此,对于今年的校招,我走的是 Java 后端开发路线。在接触 Java 这门语言的几年时间内,我也有一些自己的学习方法。我比较推荐的是学习官方文档和经典书籍,下面会列出一些学习资源。

  • 《Java 核心技术·卷 Ⅰ》,适合 Java 新手的入门书籍。该书的第 10 版使用了 JDK1.8,全面讲解了 Java 语言的核心概念、语法、特性等,其中第 10 章到第 12 张与 Swing 图形设计程序有关,可以不用看。
  • 《Java 编程思想》,这本比较偏原理,也是从 Java 的基础语法一直讲到高级特性,这里面包括的内容非常多,信息密度比较大,是一本必读书籍。
  • 《Effective Java》,这本书涉及的内容是在编写 Java 时的一些经验之谈,包含 90 多个规则,这些规则反映了最有经验的程序员在实践中常用的一些有益的做法,值得一读。
  • 《深入理解 Java 虚拟机(第 2 版)》,参加过校招的同学都知道,JVM 这一块内容是面试官必问的知识点,其中 Java 内存区域、JVM 垃圾收集算法、JVM 垃圾收集器与内存分配是重中之重。这部分内容在我的博客中也有相关的文章。
  • 《Java Language and Virtual Machine Specifications》,Java 官方文档,包括 Java 各个 JDK 版本的语言规范和虚拟机规范。

对于 Java 并发编程的学习,可以参看这两本书:《Java 并发编程的艺术》《Java 并发编程实战》。这两本书我都有读,前者给我的感觉是很容易理解书中的理论及概念,它更像是一篇篇的博客一样,每个知识点理解起来并不是很困难;而对于后者,就像它的书名一样,更加偏重于实战,理解起来要稍微困难一些,有条件的话,可以看英文版的《Java Concurrency in Practice》。

对于 Spring 来说,可以看《Spring 实战》《Spring Boot 实战》,前者是传统的 Spring,后者是微服务式的 Spring,都是通过 Spring 构建 Web 应用程序。

C/C++

第一次接触的编程语言就是 C 语言,然后用 C 语言写了一些类似于管理系统之类的程序。到后来才学了 Java,有了 C 语言的基础,在学习 Java 时是很快的。虽然我目前所使用的语言主要是 Java,但如果想要理解更加底层的东西,那么 C/C++ 是必须要拾起来的。因此,这一部分将会制定一个学习 C/C++ 的计划。

  • 《C 程序设计语言》,豆瓣热门编程图书 No.3,C 语言作者的作品。该书通过简洁的描述、典型的示例,全面、系统地讲述了 C 语言的各个特性以及程序设计的基本方法。书不厚,能够很快读完。
  • 《C++ Primer》,久负盛名的 C++ 经典教程,用它作为新手学习 C++ 准没错。其中,第 5 版也是对之前的 C++ 做了大量的更新,基于全新的 C++11 标准改写,无论是初学者还是中高级程序员,均是学习 C++ 的首选资料。
  • 《Effective C++》,如同《Effective Java》一样,这本书也是给程序员提供了关于改善程序与设计的 55 个具体的做法,给出了许多有效的 C++ 编程技巧,值得一读。
  • 《深度探索 C++ 对象模型》,该书专注 C++ 底层机制与代码优化,它会告诉你编译器底层到底干了什么事,就像 Java 中的 JVM 一样。

此外,C++ 的作者 Bjarne Stroustrup 所写的关于 C++ 的 FAQ中文版) 也值得一读。

还有一个是近期发布的一本书《现代 C++ 教程:高速上手 C++ 11/14/17/20》,这本书适用于已经熟悉了传统 C++、长期使用 C++ 进行编码并渴望在短时间内迅速了解现代 C++ 特性的人。

Go

由于我研究生的方向是与深度学习相关的图像处理技术,因此对于 Python 来说,之前也学习过并一直都在使用,写一些脚本还是挺方便的。而 Go 也是我下一步需要学习的编程语言,一方面 Go 语言有大厂背书,另一方面 Go 的生态、社区都很丰富。所以,这里也对 Go 的学习做一个规划。

  • 《Go Tutorials》,对于入门的话,首先还是推荐官方文档。这里面包括 Go 的安装与基本语法使用,可以快速上手 Go 语言。
  • 《Effective Go》,该文档能够帮助你写出清晰地、惯用的 Go 代码,涉及 Go 语言规范,必读。
  • 《Go 语言设计与实现》,这是一位博主写的 Go 语言学习指南,通过大量的配图帮助读者理解语言实现细节,适用于学习过 Go 语言并且想要理解背后设计与实现的程序员,或者有过其它语言的开发经验,想要学习 Go 语言的开发者。
    • 顺便一提,该作者博客中的文章质量非常高,值得一读。

Go 语言的优点是并发编程,许多开源框架(Kubernets、etcd 等)都使用 Go 语言开发,近年来的微服务架构和云原生技术也为 Go 语言社区带来了很大的活力。因此,除了了解一些并发编程模型以外,还可以看一下 「Go 语言在操作系统层面是如何调度的」系列文章:Scheduling In Go

此外,GitHub 上也有许多关于 Go 的学习资源,在此列出:

对于其它的,如编程范式、软件设计、分布式、微服务、容器化和自动化运维等技术,将会在以后进行同步更新。