Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

简单写一个Linux 系统软件开发方向的 RoadMap #1

Open
hurley25 opened this issue Jan 2, 2022 · 15 comments
Open

简单写一个Linux 系统软件开发方向的 RoadMap #1

hurley25 opened this issue Jan 2, 2022 · 15 comments

Comments

@hurley25
Copy link
Collaborator

hurley25 commented Jan 2, 2022

image

下面简单介绍下每个关键节点的学习资料和程度要求,最后的〔〕里是资料推荐:

计算机导论:很重要,学校的课程学的懵懵懂懂的很正常。但是大二了找个空闲的下午重新读一遍这本书,你会有新的理解和收获。另外这只是第一阶段,后面会再次提到”计算机导论“。〔大一的导论课本〕

编程语言:无论是学的 Python 还是 C 入的门,另外一门要补上。C 从语言特性上来说是最简单的”高级“语言,基本上没有什么语法糖或者无用的特性。Python 作为常用的”胶水“语言,有着丰富的标准库和三方库,掌握一门脚本语言在很多场景下都用得到。进一步的学习可以考虑 C++/Java,Go 和 Rust 发展也挺快的,可以适当了解,看个人兴趣。〔《C Primer Plus》、《C ++ Primer》、《C++ 程序设计语言(Bjarne的)》之类的都行,其他的也没关系,我入门就不是《C Primer Plus》,也不妨碍我 C 的底子还凑合。至于更高级的,建议有一定的代码量之后再阅读,比如《Effective Modern C++》之类的〕

Linux 操作系统:这个不解释,小组有《鸟哥》作为基础学习基本上够用了,剩下的靠 man 文档和具体系统的官方文档检索问题或者直接 google 即可。〔资料就是鸟哥,有余力的话再说〕

数据结构和算法:很重要,学校课程里学习的是一方面,自己接触一点 LeetCode、ACM 之类的也不错。无论是从训练自己编程的实用角度,还是为了考研、面试或者打比赛的功利角度都蛮重要。这里不反对从”功利“角度去学东西,只要取得的结果有正面意义。〔我当时看的是《算法(第四版)》,这本书是 Java 语言描述的,我一边看一边拿 C++ 改例子。别的书都行,但是《算法导论》不建议拿来入门,这本书可不是”导论“,有基础了而且自己数学底子不错,想研究算法证明的话可以考虑〕

设计模式:首先,不要神化设计模式,也不要丑化设计模式。这就是在一些常见的需求设计过程中,总结出来的经验公式。学习经验公式可以帮着自己在设计类似的场景时提供思路和借鉴,也能在阅读大型项目时里很快理解某些有模式特征的代码。比较忌讳的是学了之后哪里都想用一下。就像手里拿着锤子,看哪里都是钉子。所以需要合理的理解这些设计经验,并学会在具体的场景下分析和组合、并针对性的进行设计。没有捷径,多思考多看吧。〔有很多书,我看的是《设计模式之禅》,其他的也行吧,也不知道有没有更好的书可以推荐。从个人喜好角度不喜欢《大话 XX》之类的书,所以没推荐。当然这只是个人喜好,如果适合自己的话看看也行的〕

Linux 系统编程:这是有本方向特征的第一个学习内容,TLPI、APUE 如果觉得看着累,可以先找个入门的书打打底子。这里不仅涉及到之前 Linux 系统的知识,还涉及到『操作系统』的知识,可以对照着学习。之后系统学习『操作系统』的时候要结合这里复习,但是要注意 Linux 只是操作系统的一个实现,有余力的话了解下 Windows 之类的系统编程。〔推荐 TLPI、APUE,入门看其他的也行,但是这两本选一本作为提高,我推荐前者(后者之前的版本都不介绍 Linux 特有的一些机制比如 epoll,当然人家就书名就是 Unix 环境对吧)〕

计算机网络:基本的协议和概念不难理解,重点协议是 TCP/IP 相关的内容,核心是理解如何基于分组交换的不可靠网络设计一个可靠的高层通信协议。实践中学着自己抓包和分析,多了解下网络相关的系统命令。〔我读过谢希仁的《计算机网络》、《TCP/IP 》第一卷、《计算机网络:自顶向下方法》我觉得都不错,自己多抓包研究,抓包的结果和书上有一点点出入太正常不过了,硬核点自己看内核协议栈代码的变化〕

Linux 网络编程:其实没有特别好的书来学习,现有的是厚如字典的《 Unix 网络编程》。不是说这本书不好,而是这类面向【知识体系】本身,而不是面向读者的书没有人引导的话很容易陷入细节的海洋里丧失重点,而且很容易丧失兴趣。《muduo》这本书可以看看,但是《 Unix 网络编程》和《muduo》之间需要一本书过渡,但是我自己没读到特别好的,都是靠自己零敲碎打的学习总结过来的。我暂时没时间和精力写书,啥时候有时间给你们直播捋一捋主干。〔就写个《Linux 多线程服务端编程——使用 muduo C++ 网络库》(就是前面说的《muduo》)吧,我自己没怎么看 《 Unix 网络编程》这本书,至于中间的过渡,实在不行你们凑够十来个人我直播给你们讲讲,就不一个个私聊了〕

操作系统、微机原理、 计算机体系结构、编译原理(这个图里没画):这几个拉一起说吧,这都是专业核心课程(编译原理是计科必修)。其实前面的学习过程中,或多或少的都学习了这里的相关内容了。那么对自己的要求就不能是简单的局限于课本了,要进行一定程度的拔高学习。比如自己写个简单的 x86 或者 ARM 的操作系统 demo 之类的。然后 CSAPP 是一本介于这些课本之间的黏合剂,建议精读。其实 CASPP 只是一本『计算机导论』性质的书,压根谈不上”深入“。这本书英文名直译不过是程序员视角的计算机系统而已。〔《现代操作系统》,经典的那本黑皮书和国产的那本白皮都叫这个名字,都不错的,再就是 CSAPP了,推荐精读有些章节,但是读这本书不是按顺序一章章读的,没兴趣或者太难的先跳过去没关系〕

数据库系统:挺重要的,但是具体到这个方向,在 roadmap 的哪个阶段学习随意。这个领域经典的就帆船书,如果觉得太厚的话这本书还有个【本科教学版】比较薄。数据库从应用角度讲重点是学会库表的建模,SQL 语言的使用、优化,从原理角度是关系模型和关系代数,数据库的设计和抽象,数据可靠性的实现方式等。其实这门课多少有些类似『操作系统』,越是纯理论的章节,越需要一个具体的系统实现来理解理论。〔推荐帆船书,以及某些具体数据库的经典读物,比如 MySQL 相关的,PG 相关的都行〕

Linux 内核:最后说 Linux 内核,只是因为知识承载上需要前面所有的知识铺垫的,但是不代表最后才能学习这里的内容。在之前学习系统编程以及操作系统、微机原理的时候,就可以相互印证着去了解一些内核实现了。学习内核最怕的是畏难心理,以及一头扎进去摸不着北的学习方法。先抓住主线、理解主要机制和原理,在学习系统编程的时候,针对性的学习某些子系统的工具方式和原理能帮助自己做出更好的设计。〔书我就不推荐了,我并不精通这个领域,只是喜欢玩玩而已,我们相互学习吧〕

系统软件设计:算是对这个领域大多数知识的一个总结和实践,写个简单 KV 存储或者发布订阅系统,内存/磁盘的存储自己写或者多看看开源的现有设计。Hash、B+ Tree、LSM Tree 等各种数据结构可以来个总结和提高了,当数据结构结合系统原理后会怎么互相影响彼此的设计。〔读代码吧,可以读一个简单的存储引擎的代码比如 LevelDB,也可以读一个简单的完整服务端的代码,比如 Redis (抓住主要思想而不是细枝末节的东西)。自己尝试设计实现的时候,按照软件工程的模式去设计和实现,先把调研和设计文档写好,图画好,用甘特图规划好你的开发计划;开发阶段规规矩矩写好测试(功能测试,性能测试,黑盒、白盒、回归都学习下),最后跑起来了思考下这个东西好不好部署,好不好运维。怎么做发布,怎么做资源隔离。当然这些等你去实习了都会学到,也可以到时候再学。再就是性能调优的一些知识,这就很考验功力了,几乎用得上之前提到的所有领域知识〕

分布式系统理论和系统设计:这里不想过多的阐述了,等学习到了这个阶段,恐怕你应该对计算机相关知识的学习有了自己的理解和方法论了,也该学会如何检索资料和梳理 roadmap 了。〔去看看 MIT、CMU 的分布式系统课程吧,看最新版本的,数据我推荐一本吧,DDIA,看不懂别勉强,需要一定的经验的,工作了继续学吧〕

总结下,这个依赖图只是个大致的 roadmap,只是告诉你知识点是有怎么个依赖关系。具体研究一个东西的时候,很可能需要贯穿整个知识体系。完整的知识体系可不是上面这个有向无环图,而是一张大网。所以学习的过程就是在这个网上绕来绕去的。有向无环图是什么意思?学数据结构的时候你会知道的,现在只需要从字面意思上理解就行了。另外具体到每个节点,学有余力想进一步深入的话我再推荐点更深度的资料吧。但是说实话,能把〔〕给出的东西掌握好已经是本科生里的 top 1% 甚至更高了,贪多嚼不难呐。

@hurley25 hurley25 changed the title 简单画一个Linux 系统软件开发方向的 RoadMap 简单写一个Linux 系统软件开发方向的 RoadMap Jan 2, 2022
@adlternative
Copy link
Member

LGTM

@yegetables
Copy link
Member

@hurley25 我在上面那张图的基础上画了一个现在比较适合我们的学习路线图,能不能看看有什么画的不对的地方,谢谢

image

@yegetables
Copy link
Member

最后大三的部分和大二的部分画的不是很满意,可能我对于一些方向还没有足够的了解,请指教

@hurley25
Copy link
Collaborator Author

@ajian2002 没问题的,因为各个专业的课程时间不太一样,我没有划分具体的大二和大三怎么学。对于计算机专业的同学来说,你的这个没问题的,结合专业课程安排是最好的。至于其他专业同学也可以参考,或者根据自己情况定制。

@adlternative
Copy link
Member

adlternative commented Jan 11, 2022

Linux 网络编程:其实没有特别好的书来学习,现有的是厚如字典的《 Unix 网络编程》。不是说这本书不好,而是这类面向【知识体系】本身,而不是面向读者的书没有人引导的话很容易陷入细节的海洋里丧失重点,而且很容易丧失兴趣。《muduo》这本书可以看看,但是《 Unix 网络编程》和《muduo》之间需要一本书过渡,但是我自己没读到特别好的,都是靠自己零敲碎打的学习总结过来的。我暂时没时间和精力写书,啥时候有时间给你们直播捋一捋主干。〔就写个《Linux 多线程服务端编程——使用 muduo C++ 网络库》(就是前面说的《muduo》)吧,我自己没怎么看 《 Unix 网络编程》这本书,至于中间的过渡,实在不行你们凑够十来个人我直播给你们讲讲,就不一个个私聊了〕

《Linux 高性能服务器编程》就在这个衔接位置。

@Super-long
Copy link

编程语言:无论是学的 Python 还是 C 入的门,另外一门要补上。C 从语言特性上来说是最简单的”高级“语言,基本上没有什么语法糖或者无用的特性。Python 作为常用的”胶水“语言,有着丰富的标准库和三方库,掌握一门脚本语言在很多场景下都用得到。进一步的学习可以考虑 C++/Java,Go 和 Rust 发展也挺快的,可以适当了解,看个人兴趣。〔《C Primer Plus》、《C ++ Primer》、《C++ 程序设计语言(Bjarne的)》之类的都行,其他的也没关系,我入门就不是《C Primer Plus》,也不妨碍我 C 的底子还凑合。至于更高级的,建议有一定的代码量之后再阅读,比如《Effective Modern C++》之类的〕

这里双手双脚赞成,开始把C++“高深”的书看那么多并没有实际用处,一本《C++ primer》入门足矣,此时看看优秀的cpp项目我认为性价比更高(事实上我个人认为看工业代码学语言才是最快的最好的),平时写写python也不错

@Super-long
Copy link

(就是前面说的《muduo》)吧,我自己没怎么看 《 Unix 网络编程》这本书,至于中间的过渡,实在不行你们凑够十来个人我直播给你们讲讲,就不一个个私聊了〕

@hurley25 期待!!!

@Super-long
Copy link

Super-long commented Jan 13, 2022

开发阶段规规矩矩写好测试(功能测试,性能测试,黑盒、白盒、回归都学习下)

我认为很重要的一点在于现在我们的同学在写一个cpp项目的时候要学会引用三方库,这是我当时没做到的一点,随便找一个受欢迎的cpp项目,去看看third_party,学着往自己的项目里面引用一些优秀的三方库。不要步我的后尘,什么都想从零开始....

@Super-long
Copy link

以欢神描述的知识为基础,自发拓展深入自己热爱的方向(上述基础知识做的一般好,我想什么方向你都可以一试了,不过“基础”不基础),不要人云亦云。

@adlternative
Copy link
Member

我认为很重要的一点在于现在我们的同学在写一个cpp项目的时候要学会引用三方库,这是我当时没做到的一点,随便找一个受欢迎的cpp项目,去看看third_party,学着往自己的项目里面引用一些优秀的三方库。不要步我的后尘,什么都想从零开始..

git submoudle 平时都没有咋用,,,还好 pacman 打包足够新 :-)

@hurley25
Copy link
Collaborator Author

hurley25 commented Jan 17, 2022

《Linux 高性能服务器编程》 游双那本么?以前翻了下看到几处比较明显的错误就没再看下去了(我应该是看到锁、条件变量的封装那里就扔掉书的,不客气的讲,作者不懂条件变量,看看 c++ 标准库的 std::condition_variable 就懂了),部分章节罗列文档的行为也不太好。从目录上有点价值吧,梳理了一个先后顺序和相关知识点。 @adlternative

@Super-long
Copy link

构建工具bzael也可以用,比较现代的分布式编译工具,语法也简单,比较好入门

@adlternative
Copy link
Member

adlternative commented Jan 17, 2022

《Linux 高性能服务器编程》 游双那本么?以前翻了下看到几处比较明显的错误就没再看下去了(我应该是看到锁、条件变量的封装那里就扔掉书的,不客气的讲,作者不懂条件变量,看看 c++ 标准库的 std::condition_variable 就懂了),部分章节罗列文档的行为也不太好。从目录上有点价值吧,梳理了一个先后顺序和相关知识点。 @adlternative

为这本书辩护一下。对刚学会那一套 linux network api 并刚刚上手 c++ 的小弱鸡们而言,直接上手 muduo 略显生硬,拿《高性能》来了解流行的网络框架模型挺合适的,俺记得当时 看 unix 网编 没有 epoll 资料而且当时不会科学上网,,,还是看这本《高性能》有一点了解。可能书部分有错误,这的确当时没有注意到。。。书中亮点还是有的,比如有讲如何关闭超时连接的方式。。。

@Super-long
Copy link

看起来重写一本才是终极解决方案的办法,可惜没有人力

@hurley25
Copy link
Collaborator Author

hurley25 commented Jan 18, 2022

epoll 可以看 TLPI ,甚至直接看 muduo 代码都比这个强。在这本书出第二版或者修订版前看的时候每个东西都要思考是不是对的。我暂时不会直接推荐新人这本书,对于新人来说很难判断作者说的是不是对的,有一定基础的话可以思考辩证着看。

@Daz-3ux Daz-3ux pinned this issue Apr 6, 2023
@Daz-3ux Daz-3ux unpinned this issue May 3, 2023
@Daz-3ux Daz-3ux pinned this issue May 3, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants