后台开发路线

192 阅读18分钟

后台开发路线

当我还是一名计算机专业的大一学生时,我全心投入于Java学习,因为在网上看到很多优秀的博主,他们大多是Java开发,分享很多自资料和方法。然而,在大二上学期,我决定转向Linux和C++。这个决定并非轻率,而是基于对市场需求和个人兴趣的深思熟虑。最终,我在校园招聘中获得了字节跳动的后端开发岗位的offer,这也证明了我选择的正确性。

在这里,我并不打算仅仅列举学习资源和推荐书单。虽然这些资料重要,但更关键的是如何将这些理论知识转化为实践能力。我想分享的是一条学习路线,更准确来说是我这一路走来的经验教训,希望能给大家带来启示。

我的目标是分享一些真正有价值的经验和建议,希望能够让你们在看到这些建议时有种“恨不早遇见”的感觉。我诚挚地邀请你们一起探索这个过程,并希望我的分享能够达到预期的效果。也请大家随时向我提出宝贵的意见和建议,帮助我不断完善这份分享,让我们共同成长。

那就正式开始吧!

后端开发/后台开发/服务器开发、

起初我也是小白,根本不知道什么是前端、后端。现在我简单解释一下:后端开发是软件架构的骨干(处理业务的具体逻辑),它支持前端应用程序(如网页和移动应用程序)的功能。

1. 后端开发的核心

后端开发主要涉及服务器、数据库和应用程序之间的交互。开发人员创建和维护核心逻辑、数据处理、性能优化、API(应用程序编程接口)等方面。他们负责处理用户请求、服务器到服务器的通信、数据库的管理、以及确保用户通过前端发送的数据能够有效处理和存储。

2. 技术栈和语言

后端开发者通常使用各种编程语言,如Java、Python、Ruby和C++等。每种语言都有其独特之处,适用于不同类型的后端开发需求。至于我为什么选择C++是因为他的就业面更广:包含音视频、移动端开发、嵌入式开发、后台开发。

数据库技术也是后端开发的一个重要组成部分。无论是关系型数据库(如MySQL、PostgreSQL)还是非关系型数据库(如MongoDB),后端开发人员需要具备数据库设计和管理的能力,以确保数据的安全、高效和一致性。

3. 服务器管理和架构

服务器管理是后端开发的重要组成部分。后端开发者需要理解不同的服务器架构,如单体架构、微服务架构等,并能在适当的环境中应用它们。此外,对云服务(如AWS、Azure或Google Cloud)的了解也越来越成为后端开发者的基本要求。

4. API设计和开发

API是不同软件间交流的桥梁。后端开发者设计API以使前端应用能够与后端服务交互。他们需要确保API的安全性、效率和可扩展性。此外,了解RESTful原则和GraphQL等技术也是十分重要的。

5. 安全性和性能优化

后端开发者不仅要确保系统的功能性,还要确保其安全性和性能。这包括保护系统不受SQL注入、跨站点脚本攻击等网络威胁的侵害,以及优化代码和数据库查询,确保应用程序的快速响应。

结论

总之,后端开发是一个复杂但极其重要的领域,它要求开发人员不仅要具备强大的编程能力,还要对系统架构、数据库管理、网络安全和性能优化有深入的了解。成功的后端开发不仅仅是写代码,更是关于创建一个强大、高效、安全且可靠的系统基础,以支持前端应用的顺畅运行。

后台开发的技术栈

  • C/C++ 语言
  • 计算机网络
  • 操作系统原理
  • Linux 系统编程
  • 算法与数据结构
  • 数据库使用及原理
  • Linux 常见命令使用
  • 常见工具的使用,比如:版本控制 Git

C/C++ 语言

C和C++作为高效且功能强大的编程语言,其深入学习对于理解计算机科学的底层原理至关重要。以下是对原文中提及的关键概念和学习资源的重新整理和描述:

关键概念和技术点

  1. 语言基础

    • 指针、引用、数组:理解内存地址、引用机制和数据组织。
    • 内存管理:掌握动态内存分配与释放(new/delete, malloc/free)。
    • C与C++区别:比如内存管理、面向对象特性等。
  2. 面向对象编程

    • 继承和多态:包括虚继承和菱形继承问题。
    • 虚函数机制:理解虚函数、虚函数表和纯虚函数的概念。
    • 重写与重载:掌握这两种不同的函数行为。
    • 动态与静态多态:理解编译时和运行时的行为决策。
  3. 智能指针与资源管理

    • 智能指针原理:包括引用计数和RAII原则。
    • 各类智能指针的使用:如shared_ptr、weak_ptr和unique_ptr。
  4. 关键字及类型转换

    • 关键字:static、const、volatile、extern的作用。
    • 类型转换:static_cast, dynamic_cast, const_cast, reinterpret_cast。
  5. 标准模板库(STL)和模板编程

    • STL容器的实现原理:如vector、deque、map等。
    • 模板特化与偏特化:理解模板编程的高级技巧。
  6. 编译与链接

    • 编译链接机制:理解C++的编译过程。
    • 内存布局和对象模型:深入了解对象的内存表示。
  7. C++11及新特性

    • 理解并应用C++11的新特性,如右值引用、完美转发等。

推荐学习资源

  1. 书籍

    • 《C++ Primer》:全面覆盖C++11特性,适合初学者和进阶者。
    • Effective系列:包括《Effective C++》等,强调实践和规范。
    • 《STL源码剖析》和《深度探索C++对象模型》:深入理解STL和C++底层。
  2. 视频教程

    • 侯捷老师的系列讲座:涵盖内存管理、STL源码分析、C++11新特性等。
    • B站资源:搜索“候捷 C++”可找到相关视频资源,适合辅助书本学习。
  3. 实践和练习

    • 编写代码实践:通过编写实际程序加深理解。
    • 参与项目或开源贡献:应用所学知识解决实际问题。

计算机网络

计算机网络的学习涉及众多协议和概念,其复杂性常常让学习者感到困惑。为了更好地理解和掌握计算机网络,以下是对原文中提及的内容的重构和整理:

核心网络协议和知识点

  1. 基础网络协议

    • HTTP、TCP、IP、ICMP、UDP、DNS、ARP等,了解这些协议的基本功能和运作原理。
    • IP地址和MAC地址:理解这两种地址的区别和作用。
    • OSI七层模型和TCP/IP五层模型:掌握这两个模型的结构和每层的职责。
  2. 网络安全

    • HTTPS相关知识:数字签名、数字证书、TLS等,理解如何保障网络传输的安全性。
  3. 网络攻击

    • 常见网络攻击类型:局域网ARP泛洪、DDoS攻击、TCP SYN Flood、XSS等,了解这些攻击的原理和防御措施。

TCP协议的深入学习

  • TCP的关键概念:三次握手、四次挥手、状态转换、TIME_WAIT状态、拥塞控制等。
  • 学习思路:不仅要记忆,更要理解其背后的原理和设计思想。

推荐书籍

  1. 《计算机网络:自顶向下方法》:该书以应用层协议开始,逐步深入,帮助读者理解网络各层的作用。
  2. 《网络是怎样连接的》:以浅显易懂的方式描述数据包的发送过程,适合快速理解网络基础。
  3. 《TCP/IP详解卷1:协议》:专注于TCP/IP协议,特别是TCP的细节,适合深入学习。
  4. 《图解HTTP》:通过图解方式,帮助理解HTTP协议的基础知识和工作原理。

推荐视频

  • 湖南科技大学的微课堂,去B站搜索“湖科大教书匠”

操作系统原理

操作系统是计算机科学中的一个核心课程,它涵盖了计算机系统的基本原理和实现机制。虽然操作系统的基础概念相对容易学习,但要深入理解和应用这些概念则需要更多的实践和研究。特别是对于准备校招面试的毕业生,掌握以下内容是非常重要的:

操作系统的四大模块

  1. 进程与线程管理:理解进程状态、进程切换、调度算法,以及线程的实现和区别。
  2. 内存管理:熟悉虚拟内存、内存分段和分页机制,页面置换算法。
  3. I/O与文件系统:了解I/O管理、缓冲技术、虚拟文件系统。
  4. 设备管理:掌握设备驱动、中断处理等基本概念。

Linux内核的实现原理

  • 深入理解Linux内核在内存管理、进程管理、虚拟文件系统等方面的实现。
  • 探索进程的创建和管理,特别是Linux中进程和线程的区别和联系。

深入理解进程和线程

  • 理解进程与线程的基本概念,如进程状态、线程实现方式(一对一、多对一)。
  • 通过Linux内核的角度,探讨进程和线程的创建过程,以及如何共享资源。
  • 研究Linux下的相关系统调用,如fork、vfork、clone、pthread_create等。

推荐书籍

  1. 《现代操作系统》和《操作系统—精髓与设计原理》 :选择其中一本,了解操作系统的全貌。
  2. 《Linux内核设计与实现》 :重点关注进程管理、系统调用、内存管理、虚拟文件系统等章节,理解Linux内核的具体实现。

推荐视频

  • 南京大学,蒋炎岩老师的操作系统概述,去B站搜“绿老师原谅你了”

Linux系统编程

Linux系统编程和网络编程是C++后台开发的重要组成部分。以下是Linux系统编程和网络编程的核心内容重构:

Linux系统编程核心内容

  1. 进程间通信

    • 包括信号量、管道、共享内存、socket等通信方式。
  2. 多线程编程

    • 掌握互斥锁、条件变量、读写锁、线程池等多线程技术。
  3. IO模型和高性能IO

    • 理解五大IO模型:同步、异步、阻塞、非阻塞、信号驱动。
    • 高性能IO模式,特别是Reactor模式;Linux中缺乏Proactor模式的支持。
  4. IO复用机制

    • 掌握epoll、select、poll等机制,这些是解决C10K问题的关键技术。

推荐书籍

  1. 《Unix网络编程》和《Unix环境高级编程》 :这两本书被认为是网络编程和Unix系统编程领域的经典,虽然篇幅庞大,但包含了丰富的知识。
  2. 《Linux高性能服务器编程》 :书的前半部分回顾了网络编程的基础知识,后半部分深入讲解了高性能服务器程序框架、IO复用、多线程编程等。强烈介意把这本书的源码都手打一遍!!!
  3. 《Linux多线程服务器端编程》 :这本书详细讨论了C++多线程系统编程,特别是线程安全方面的内容,并介绍了Muduo网络库的设计与实现。

实践项目

  1. HTTP服务器

    • 构建自己的HTTP服务器,可以参考现有的项目,并扩展功能如代理、日志库、CGI支持等。
  2. 网络库开发

    • 通过研究Muduo网络库源码,开发自己的网络库,采用one loop per thread + thread pool模式。
  3. RPC框架

    • 实现一个RPC框架,涉及序列化、网络传输、服务发现等知识。可以参考grpc、brpc等现有框架。
  4. 网络聊天室

    • 开发一个网络聊天室应用,从简单的局域网群聊、单聊到更高级的P2P聊天功能,涉及UDP打洞、NAT转换等技术。

这些项目可以去github上搜索,有很多开源的

算法与数据结构

算法与数据结构是计算机科学中最基础也是最重要的领域之一。无论是准备面试还是提高编程能力,掌握常见的数据结构和算法都是必不可少的。以下是对原文的重构和整理:

基础数据结构

  1. 线性结构:包括线性表、数组、链表。
  2. 栈和队列:理解它们的基本操作和应用场景。
  3. 树结构:包括二叉树、多叉树、AVL树和红黑树。重点是理解树的实现和遍历方法,AVL树的插入和删除过程。
  4. 图结构:理解图的实现方式和遍历算法。
  5. B树和B+树:了解它们的基本概念和应用。
  6. 堆结构:理解堆的实现及其在排序和优先队列中的应用。
  7. 散列表:掌握散列函数的设计和散列表的实现。

常用算法

  1. 排序算法:包括冒泡、插入、快速、希尔、堆排序、基数和归并排序。
  2. 字符串匹配算法:比如KMP算法。
  3. 算法思想:递归、枚举、递推、分治、贪心和动态规划等。

视频课程

  • ACwing的模板可以多打一打
  • 清华大学邓俊辉老师的《数据结构与算法》(学堂在线)

推荐书籍:

  • 入门级:《啊哈算法》、《算法图解》
  • 进阶级:《算法第四版》
  • 高级:《算法导论》

刷题实践

  • 《剑指offer》 :建议必刷,适合面试准备。
  • LeetCode:按类别刷题,先从易到难,比如先从数组、二分、二叉树、动态规划开始。

数据库使用及原理

数据库技能是计算机科学领域的重要组成部分,它不仅涵盖了SQL语言的使用,还包括数据库的设计、原理和性能优化等多个方面。以下是对原文内容的重构和整理:

基础学习:SQL语言

  • 推荐书籍:《MySQL必知必会》。这本书适合初学者,涵盖了SQL的基本操作,包括数据查询、更新、删除等。

数据库原理与设计

  • 推荐书籍:《数据库系统概念》。这本书内容全面,覆盖了关系模型、数据库设计(包括三大范式)、数据存储和组织方式、索引和并发控制等。

  • 学习重点

    • 数据库设计:了解如何设计一个高效、可扩展的数据库。
    • 数据存储:理解数据在磁盘上是如何存储和组织的。
    • 索引:学习不同类型的索引,如B树、B+树索引、Hash索引。
    • 并发控制:理解锁机制(包括乐观锁和悲观锁)、事务的ACID特性。

索引和并发控制

  • 关键知识点

    • 索引使用:包括主键索引、覆盖索引、最左前缀原则和索引下推。
    • 锁机制:表锁、行锁、意向锁、读写锁等。
    • MySQL的InnoDB MVCC(多版本并发控制)实现机制。
    • 存储引擎:比较InnoDB和MyISAM等存储引擎的优缺点。

进阶学习:性能优化

  • 推荐书籍

    • 《高性能MySQL》:深入讲解了索引、InnoDB存储引擎、锁、并发控制等。
    • 《MySQL技术内幕》:提供了MySQL数据库的深入理解,特别是对性能优化方面。

推荐视频:

  • 尚硅谷的数据库基础篇+高级篇

Linux常见命令

学习Linux操作系统和其命令行是开发人员的基本技能,尤其对于后台开发和系统运维人员来说尤为重要。掌握Linux常用命令不仅可以提高日常工作的效率,还能在处理复杂的系统问题时起到关键作用。

  1. 基础命令:如ls(列出目录内容)、cd(改变目录)、pwd(显示当前目录路径)、touch(创建文件)、rm(删除文件或目录)、mkdir(创建目录)等。
  2. 文件操作:如cp(复制文件或目录)、mv(移动或重命名文件)、cat(查看文件内容)、more、less(分页查看文件内容)、grep(文本搜索)等。
  3. 系统管理:如ps(查看进程)、top(动态查看进程和系统状态)、kill(结束进程)、useradd/userdel(添加/删除用户)、chmod(更改文件权限)等。
  4. 网络通信:如ping(检测网络连接)、ssh(安全远程登录)、scp(远程文件复制)、netstat(网络统计)、wget(网络下载)等。
  5. 磁盘管理:如df(查看磁盘空间使用情况)、du(查看文件或目录的大小)、mount(挂载文件系统)、fdisk(磁盘分区)等。
  6. 文本处理:如sed(流编辑器)、awk(文本处理工具)、sort(排序)、uniq(去除重复行)、tr(字符替换)等。
  7. 脚本编程:bash脚本的编写和使用,以及常见的脚本命令。

推荐书籍

  • 入门书籍:《鸟哥的Linux私房菜:基础学习篇》。这本书适合Linux初学者,以浅显易懂的语言介绍了Linux系统的基本使用和管理。
  • 进阶书籍:《Linux命令行与Shell脚本编程大全》。这本书更适合有一定基础的读者,深入讲解了Linux命令行和Shell脚本编程。

推荐视频

  • 韩顺平的一周学会Linux

版本控制 Git

版本控制是软件开发的重要组成部分,而Git是当前最流行的版本控制系统之一。为了有效地使用Git,以下是学习Git的建议路径和资源:

Git基础知识

  1. Git的基本原理:了解Git的工作原理,包括本地仓库、暂存区和工作区的概念。
  2. 常用命令:熟悉常用的Git命令,如git init, git add, git commit, git push, git pull, git branch, git checkout, git merge等。
  3. 分支管理:理解分支的概念及其如何在Git中工作,掌握创建、切换和合并分支的技巧。
  4. 合并冲突的解决:学习如何处理合并时出现的冲突。

进阶使用

  1. 远程仓库管理:理解如何与远程仓库(如GitHub、GitLab等)交互。
  2. 版本回退和标签管理:掌握如何回退到特定版本,以及如何使用标签标记重要版本。
  3. 高级功能:如交互式rebase、cherry-pick、bisect等。

推荐书籍

  • 《Git入门指南》

如何学习

学习计算机科学和技术的过程中,正确的学习方法和策略是极为重要的。面对大量的经典书籍和丰富的学习资源,如何高效地学习,成为每个学习者都要面对的问题。以下是对上述内容的重构和整理:

学习方法

  1. 抓住主线:首先要对整个领域的知识结构有一个宏观的认识,然后围绕这个领域的核心内容学习。重点学习那些构成知识主干的部分,避免在细节上花费过多时间。
  2. 集中时间,速战速决:不要把学习时间拖得太长,应集中精力在较短时间内完成学习任务。这样可以保持学习的连续性和深度,避免拖延和效率低下。
  3. 实践中学习细节:在具体的实践中去学习和掌握细节知识。理论学习应更多地关注知识的体系性和框架建设。

常见问题解决

  1. 如何阅读经典书籍:对于那些厚重的经典书籍,不必一字不漏地阅读。可以先浏览目录,对书的整体框架有一个大致的了解,然后根据自己的需要选择重点章节阅读。
  2. 处理难以理解的内容:遇到难以理解的内容时,可以查阅前置知识或相关的辅助资料。不要强迫自己去理解超出当前水平的复杂内容。
  3. 跨书籍学习:将不同书籍中的相关知识点串联起来,形成完整的知识体系。比如在学习操作系统时,可以结合《操作系统:精髓与设计原理》、《Linux内核设计与实现》和《计算机系统要素》等书籍,形成对某一主题的全面理解。

结论

学习计算机科学的关键不在于读了多少书,而在于是否能够构建起完整的知识体系,并且能够将学到的知识应用到实践中。不同的学习者可以根据自己的基础和需求,选择合适的学习路径和资源。重要的是保持持续的学习兴趣和动力,通过实践不断加深理解和应用。

有什么问题现在可以问ChatGPT,无论是技术问题还是路线都可以,不会注册的可以参考这篇文章国内ChatGPT账号注册教程,免费(2024年1月更新) - 掘金 (juejin.cn)