
Deepseek推荐c/c++后端开发值得学习的一些开源项目
处在这样一个开源崛起的时代,尤其在国内很多顶级项目不断催生,现在正是那些热爱开源理念和开源软件的开发者大展鸿图的时候,他们有的在学生时代就已学习和贡献开源,开源世界为他们带来了荣誉和快乐,而他们在未来也致力于开发和运营开源软件。
学习开源项目好处
首先是提升编程技能。对计算机专业相关的学生而言,在学习编程后,能验证能力的只是一些简单项目,但通过阅读开源项目的源码,你不仅可以学习顶级项目的设计思路,还可以学习顶级开发者的编程思路,比如通过学习提升代码的可读性和简洁性。同时,你也可以提交PR、注释,而社区里的资深工程师会给出直接反馈,这比你自己摸索要成长得更快。
其次能帮你找到满意的工作。如果你在开源项目上留下印记,无论是贡献代码、技术文档、应用案例等等,这些都能证明个人能力,甚至,有时你的简历只需放上GitHub个人账号链接就已足够:)
最后,开源也许会成为你热衷的事业。处在这样一个开源崛起的时代,尤其在国内很多顶级项目不断催生,现在正是那些热爱开源理念和开源软件的开发者大展鸿图的时候,他们有的在学生时代就已学习和贡献开源,开源世界为他们带来了荣誉和快乐,而他们在未来也致力于开发和运营开源软件。
总之,对于高校学生或者已经工作几年同学,只要你能通过开源项目的代码证明自己的实力,这无疑像是拿到了观看球赛的前排门票,你不会再因为“内卷”而发愁,因为你的前方视野足够辽阔。
如何学习开源项目
首先了解整体架构
查找和阅读该项目的博客和资料,通过google你能找到某个项目大体介绍的博客,快速阅读一下就能对项目的目的、功能、基本使用有个大概的了解。
先把项目跑起来
如果该项目有提供现成的example工程,首先尝试按照开始文档的介绍运行example,如果运行顺利,那么恭喜你顺利开了个好头;如果遇到问题,首先尝试在项目的FAQ等文档里查找答案,再次,可以将问题(例如异常信息)当成关键词去搜索,查找相关的解决办法,你遇到了,别人一般也会遇到,热心的朋友会记录下解决的过程;最后,可以将问题提交到项目的邮件列表,请大家帮你看看。在没有成功运行example之前,不要尝试修改example。
如果时间允许,尝试从源码构建该项目。通常开源项目都会提供一份构建指南,指导你如何搭建一个用于开发、调试和构建的环境。尝试构建一个版本。
阅读源码建议
(1)阅读源码之前,查看该项目是否提供架构和设计文档,阅读这些文档可以了解该项目的大体设计和结构,读源码的时候不会无从下手。
(2)阅读源码之前,一定要能构建并运行该项目,有个直观感受。
(3)阅读源码的第一步是抓主干,尝试理清一次正常运行的代码调用路径,这可以通过debug来观察运行时的变量和行为。修改源码加入日志和打印可以帮助你更好的理解源码。
(4)适当画图来帮助你理解源码,在理清主干后,可以将整个流程画成一张流程图或者标准的UML图,帮助记忆和下一步的阅读。
(5)挑选感兴趣的“枝干”代码来阅读,比如你对网络通讯感兴趣,就阅读网络层的代码,深入到实现细节,如它用了什么库,采用了什么设计模式,为什么这样做等。如果可以,debug细节代码。
(6)阅读源码的时候,重视单元测试,尝试去运行单元测试,基本上一个好的单元测试会将该代码的功能和边界描述清楚。
(7)在熟悉源码后,发现有可以改进的地方,有精力、有意愿可以向该项目的开发者提出改进的意见或者issue,甚至帮他修复和实现,参与该项目的发展。
开启自己的开源项目
通常在阅读文档和源码之后,你能对该项目有比较深入的了解了,但是该项目所在领域,你可能还想搜索相关的项目和资料,看看有没有其他的更好的项目或者解决方案。在广度和深度之间权衡。
开源项目
1.Libev
libev是一个全功能和高性能的事件驱动库,基于epoll,kqueue等OS提供的基础设施。其以高效出名,它可以将IO事件,定时器,和信号统一起来,统一放在事件处理这一套框架下处理。基于Reactor模式,效率较高,并且代码精简(4.15版本8000多行),是学习事件驱动编程的很好的资源。
特点
-
不使用全局变量,而是每个函数都有一个循环上下文。
-
对每种事件类型使用小的观察器(一个I/O观察器在x86_64机器上使用56字节,而用libevent的话使用136字节)。
-
没有http库等组件。libev的功能非常少。
-
允许更多事件类型,例如基于wall clock或者单调时间的定时器、线程间中断等等。
更简单地说,libev的设计遵循UNIX工具箱的哲学,尽可能好地只做一件事。
整体架构:
开源地址:https://github.com/enki/libev
2. Redis
Redis 是一种经典的开源内存Key-Value数据结构存储,用作数据库、缓存和消息代理。Redis 提供了数据结构,例如字符串、散列、列表、集合、带有范围查询的排序集合、位图、超级日志、地理空间索引和流。Redis 内置复制、Lua 脚本、LRU 驱逐、事务和不同级别的磁盘持久化,并通过 Redis Sentinel 和 Redis Cluster 自动分区提供高可用性。
代码架构:
开源地址:https://github.com/redis/redis
3. Nginx
Nginx是一款轻量级的Web服务器、反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用。
特点:
-
Nginx可以部署在网络上使用FastCGI脚本、SCGI处理程序、WSGI应用服务器或Phusion Passenger模块的动态HTTP内容,并可作为软件负载均衡器。
-
Nginx使用异步事件驱动的方法来处理请求。Nginx的模块化事件驱动架构可以在高负载下提供更可预测的性能。
-
Nginx是一款面向性能设计的HTTP服务器,相较于Apache、lighttpd具有占有内存少,稳定性高等优势。与旧版本(≤2.2)的Apache不同,Nginx不采用每客户机一线程的设计模型,而是充分使用异步逻辑从而削减了上下文调度开销,所以并发服务能力更强。整体采用模块化设计,有丰富的模块库和第三方模块库,配置灵活。在Linux操作系统下,Nginx使用epoll事件模型,得益于此,Nginx在Linux操作系统下效率相当高。同时Nginx在OpenBSD或FreeBSD操作系统上采用类似于epoll的高效事件模型kqueue。
整体架构:
开源地址:https://github.com/nginx/nginx
4.SQLite
SQLite是一个开源的嵌入式关系数据库,实现自包容、零配置、支持事务的SQL数据库引擎。其特点是高度便携、使用方便、结构紧凑、高效、可靠。足够小,大致3万行C代码,250K。
整体架构:
开源地址:http://www.sqlite.org/
5.Linux
Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 UNIX 的多用户、多任务、支持多线程和多 CPU 的操作系统。Linux 能运行主要的 UNIX 工具软件、应用程序和网络协议。它支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统,目前最为流行后台服务器操作系统。
整体架构:
Linux内核学习分为四个阶段。
-
首先,了解操作系统基本概念。
-
其次,了解Linux内核机制(大的框架和架构,不要在乎细节)。
-
其次,研读内核源码(选择自己感兴趣的方向,比如调度(计算),虚拟化,网络,内存,存储等)。
最后,确定个人的发展方向
-
设备驱动开发方向(嵌入式)
-
云网络开发方向(云计算)
-
虚拟化方向(云计算)
-
云存储方向(云计算)
-
Linux应用开发方向(Linux后台开发)
开源地址:https://www.kernel.org/
6.手撸STL
STL是C++的重要组件,C++开发几乎没有不使用STL的,然而光会用是不够的,还需要明白它的实现原理。
智能指针 vector array stack queue deque map set string 这些常用的数据结构最好自己都实现一遍。
水平高的可以直接参考gcc源码(https://github.com/gcc-mirror/gcc)
刚入门的朋友可以先看看老廖分享的C++ STL面试八股文
视频讲解:C++进阶,要不要看《STL源码剖析》-其实看C++STL八股文面试题就足够了
7.TinyWebServer(初学者)
这是一个帮助初学者快速实现网络编程、搭建属于自己的轻量级Web服务器的小项目。
项目虽小但真的五脏俱全:
-
使用线程池、非阻塞Socket、epoll(ET/LT均实现)、事件处理(Reactor及模拟Proactor)的并发模型。
-
使用状态机解析HTTP请求报文,支持解析GET和POST请求
-
访问服务器数据库实现web端用户注册、登录功能,可以请求服务器图片和视频文件
-
实现同步/异步日志系统,记录服务器运行状态
-
经Webbench压力测试可以实现上万的并发连接数据交换
代码地址:https://github.com/qinguoyi/TinyWebServer
8.WebFileServer文件服务器
项目功能
Web 文件服务器,通过浏览器发送 HTTP 请求管理服务器指定文件夹下的所有文件。主要功能包括:
-
以 HTML 页面形式返回该文件夹下的所有文件
-
可以选择本地文件上传到服务器
-
可以对列表中的文件文件执行下载操作
-
可以删除服务器中的指定文件
整体框架
-
使用 Reactor 事件处理模型,通过统一事件源,主线程使用 epoll 监听所有的事件,工作线程负责执行事件的逻辑处理
-
预先创建线程池,当有事件发生时,加入线程池的工作队列中,使用随机选择算法选择线程池中的一个线程处理工作队列的事件
-
使用 HTTP GET 方法获取文件列表,发起下载文件、删除文件的请求。使用 POST 方法向服务器上传文件
-
服务端使用有限状态机对请求消息进行解析,根据解析结果执行操作后,向客户端发送页面、发送文件或发送重定向报文
-
服务端使用 sendfile 函数实现零拷贝数据发送
源码地址:https://github.com/shangguanyongshi/WebFileServer.git
视频讲解:Linux C++项目推荐:WebFileServer文件服务器+如何快速上手C++大项目
9. OpenSSL
一个强大的安全套接字层密码库,加密HTTPS,加密SSH都贼好用,同时它还可以用于跨平台密码工具。
OpenSSL实现了以下功能:
-
数据保密性:信息加密就是把明码的输入文件用加密算法转换成加密的文件以实现数据的保密。加密的过程需要用到密钥来加密数据然后再解密。
-
数据完整性:加密也能保证数据的一致性。例如:消息验证码(MAC),能够校验用户提供的加密信息,接收者可以用MAC来校验加密数据,保证数据在传输过程中没有被篡改过。
-
安全验证:加密的另外一个用途是用来作为个人的标识,用户的密钥可以作为他的安全验证的标识。SSL是利用公开密钥的加密技术(RSA)来作为用户端与服务器端在传送机密资料时的加密通讯协定。
代码地址:https://www.openssl.org/source
10.LevelDB
LevelDB 是一个由 Google 编写的快速键值存储库,它提供了从字符串键到字符串值的有序映射。
LevelDB 有以下优点:
-
提供应用程序运行上下文,方便跟踪调试
-
可扩展的、多种方式记录日志,包括命令行、文件、回卷文件、内存、syslog服务器、Win事件日志等
-
可以动态控制日志记录级别,在效率和功能中进行调整
-
所有配置可以通过配置文件进行动态调整
-
支持Java、C++、C、python等多种语言
整体架构:
-
MemTable:内存数据结构,具体实现是 SkipList。接受用户的读写请求,新的数据修改会首先在这里写入。
-
Immutable MemTable:当 MemTable 的大小达到设定的阈值时,会变成 Immutable MemTable,只接受读操作,不再接受写操作,后续由后台线程 Flush 到磁盘上。
-
SST Files:Sorted String Table Files,磁盘数据存储文件。分为 Level0 到 LevelN 多层,每一层包含多个 SST 文件,文件内数据有序。Level0 直接由 Immutable Memtable Flush 得到,其它每一层的数据由上一层进行 Compaction 得到。
-
Manifest Files:Manifest 文件中记录 SST 文件在不同 Level 的分布,单个 SST 文件的最大、最小 key,以及其他一些 LevelDB 需要的元信息。由于 LevelDB 支持 snapshot,需要维护多版本,因此可能同时存在多个 Manifest 文件。
-
Current File:由于 Manifest 文件可能存在多个,Current 记录的是当前的 Manifest 文件名。
-
Log Files (WAL):用于防止 MemTable 丢数据的日志文件。
开源地址:https://github.com/google/leveldb
11.C++Linux项目推荐-Web多人聊天+MySQL+Redis+Websocket+Json
功能:
-
支持HTTP请求,掌握HTTP API + json的请求相应
-
支持Websocket,掌握json做序列化和反序列化
-
支持多房间聊天
-
支持多人聊天
-
支持MySQL存储用户信息
-
支持Redis缓存token,存储聊天消息
-
json序列化
-
静态网页支持
-
支持单元测试
-
支持python脚本性能测试
建议扩展功能
-
基于Reactor网络模型构建HTTP服务和Websocket服务,替换现有的协程框架;
-
使用rapidjson做序列化和反序列化;
-
仿写MySQL/Redis连接池;
-
增加房间创建/修改/删除接口,并将房间成员存储到MySQL;
-
单元测试替换为gtest;
-
........可以不断扩展,总而言之,就是比做单纯的webserver项目强
原项目地址:https://github.com/anarthal/servertech-chat.git
项目配套视频简介:C++Linux项目推荐-Web多人聊天+MySQL+Redis+Websocket+Json
12.手撸Json
Json是特别常用的序列化数据结构(https://tech.meituan.com/2015/02/26/serialization-vs-deserialization.html)
之前面试时候还被问过如何实现一个Json(我答的不是很好)。大家可以通过手撸一个Json来提高自己的C++水平哈。
水平高的可以直接参考这个C++中常用的Json三方库https://github.com/nlohmann/json
刚入门的朋友可以参考这个大佬写的简易Json(https://github.com/dropbox/json11)
13.使用 C++ 解决 180 多个算法和数据结构问题
数据结构与算法问题
互联网大厂的薪资确实相对较高,特别是对于技术岗位,如程序员和算法工程师等。在这些公司,工作五年达到年薪百万的情况并不罕见。算法能力通常是评估技术候选人是否适合进入这些大厂的一个重要标准。以下是数据结构与算法面试中可能会涉及的几个方面:
1. 基本数据结构:包括数组、链表、栈、队列、散列表、树(如二叉树、平衡树、堆)、图等。面试官可能会要求解释这些数据结构的工作原理、优缺点以及在不同场景下的应用。
2. 高级数据结构:如B树、B+树、红黑树、跳表等。这些结构在处理大量数据时有更好的性能,面试时可能会考察你对这些结构的理解及其在不同场景下的适用性。
3. 算法设计与分析:包括排序算法(冒泡、选择、插入、快排、归并、堆排等)、搜索算法(线性搜索、二分搜索)、字符串处理算法(匹配、查找、反转等)、动态规划、贪心算法、回溯算法、分治算法等。面试官可能会让你解释这些算法的原理、复杂度分析以及如何应用这些算法解决问题。
4. 系统设计与优化:在某些情况下,面试官可能会提出一些系统设计问题,要求你使用合适的数据结构和算法来设计高效、可扩展的系统,并针对系统的性能瓶颈进行优化。
5. 编程实践:在面试中,你可能会被要求现场编写代码,实现特定的数据结构或算法。这不仅能考察你的理论知识,还能展示你的编程实践能力。
6. 问题解决能力:面试官可能会给你一些实际场景或问题,让你使用合适的数据结构和算法来解决问题。这类问题通常需要你具备良好的逻辑思维和问题解决能力。
为了准备这些方面的面试,建议你不仅要熟悉数据结构和算法的理论知识,还要通过大量的练习来提高你的编程和问题解决能力。
14.分布式缓存系统
项目简介:构建一个分布式缓存系统,支持数据在多台服务器之间的快速缓存和访问。通过这个项目,你将学习如何设计和实现一个高性能、高可用的分布式缓存系统,解决数据存储和快速访问的问题。
涉及技术:C++、网络编程、多线程编程、分布式系统、缓存机制、数据一致性、负载均衡等。
项目亮点:
-
分布式架构设计:实现跨多个节点的缓存数据存储,展示你对分布式系统架构的理解和应用能力。
-
高可用性:通过多副本存储和故障恢复机制,确保缓存系统在节点故障时的高可用性。
-
并发处理:使用多线程技术处理大量并发缓存请求,展示你在并发编程方面的掌握。
-
缓存机制:实现高效的数据缓存和过期策略,确保数据访问的速度和准确性。
-
数据一致性:通过一致性协议和数据同步,确保在分布式环境下缓存数据的一致性。
-
高性能:优化数据传输和访问效率,展示你在高性能系统设计方面的能力。
-
负载均衡:通过负载均衡机制,在多个缓存节点之间分配请求,提升系统性能。
参考资源:参考 Redis 等开源分布式缓存系统的架构和实现方法,学习其设计思路和具体实现细节。结合分布式系统和缓存相关书籍,深入理解分布式缓存系统的原理和技术。Redis 项目链接:https://github.com/redis/redis
15.P2P 文件共享系统(基于UDP)
项目简介:开发一个使用P2P架构的文件共享系统,让多个节点能够通过UDP协议进行文件传输和共享。这个项目将让你掌握如何设计一个高效、可靠的文件共享系统,涵盖从网络通信到数据完整性的各个方面。
涉及技术:C++、网络编程、UDP协议、多线程编程、P2P网络、文件系统操作、数据完整性检查、NAT穿透、分片传输等。
项目亮点:
-
P2P架构设计:实现节点之间的文件共享,展示你对P2P网络架构的理解和应用能力。
-
UDP通信:使用UDP协议进行数据传输,展示你对无连接网络通信的掌握。
-
并发处理:使用多线程技术处理大量并发文件传输请求,展示你在并发编程方面的能力。
-
文件系统操作:实现文件的上传、下载、删除和目录浏览等功能,展示你对文件系统操作的理解。
-
数据完整性:通过数据校验机制确保文件传输的完整性和可靠性。
-
高性能:优化数据传输和处理效率,实现快速文件共享,展示你在高性能系统设计方面的能力。
-
负载均衡:通过负载均衡机制在多个节点之间分配传输任务,提升系统性能和可靠性。
-
NAT穿透:实现NAT穿透技术,使得在复杂网络环境下节点之间能够顺利通信。
-
流量控制:实现流量控制机制,确保网络资源的合理利用和传输稳定性。
-
分片传输:将大文件分割成小块进行传输,提高传输效率和可靠性。
参考资源:
以下是一些可以参考的P2P文件共享系统项目,这些项目在架构实现方面提供了丰富的经验和技术细节:
2sjha/mini-p2p-file-sharing
-
语言:C++
-
简介:一个迷你P2P文件共享应用,适用于初学者。项目结构简单,包含基础的P2P网络编程和Socket通信。
-
特点:适合学习基本的UDP通信和P2P文件共享机制。
bchu7796/p2p-file-sharing
-
语言:C++
-
简介:展示了如何使用多线程处理并发请求和UDP进行数据传输。项目复杂度适中,包含多线程和数据传输优化。
-
特点:适合有一定经验的开发者,深入学习P2P文件共享的实现细节。
Peer2Peer_File_Sharing_System
-
语言:Python
-
简介:一个去中心化的P2P文件共享系统,使用UDP和TCP协议进行信息和文件共享,适合了解基本的P2P文件共享和网络编程概念。
-
特点:高效的P2P文件传输,具有智能文件处理和并发处理能力。
-
下载链接: https://github.com/raghxvnair/Peer2Peer_File_Sharing_System
P2P-File-sharing
-
语言:Java
-
简介:一个为佛罗里达大学计算机网络课程创建的P2P项目,允许任意数量的节点共享文件,涵盖基本的P2P通信和文件共享机制。
-
特点:适合初学者和中级开发者,了解P2P网络架构和UDP编程。
更多推荐
所有评论(0)