山东标梵讲LinuxC++在大学期间的后台开发该如何走?
我们的人生有涯,而我们的知识无涯。与其如此,不如与其如此,殆!
读者中有许多在校大学生,而且我还经常被咨询LinuxC++后台开发的学习路线。但是,LinuxC++的后台开发,不管是Linux还是C++,都是一个很大的话题,聪明的程序员需要学习如何做减法。
1。
c++
简述C++语言。事实上,要想毕业找工作,熟练使用常用的C++语法就很好,当然,C++11是必须要学的。接着阅读一些C++经典书籍,学习安全编码,高效编码的规范。接下来对C++的基本原理进行一点研究就可以了。别贪小便宜,毕竟大学时间有限,语言只是解决问题的工具。还存在许多高维问题亟待解决。学一门语言本身的高难知识,以后慢慢学就好了,很多时候书读百遍,不如在实际工作中快速解决一个问题,实现一个需求。对于学习C++来说,网上的学习资料太多了,本公众号前、后也有很多相关文章,本文就不做展开。
山东标梵讲LinuxC++在大学期间的后台开发该如何走?
我想好好谈谈Linux。大体上分为两个方面:一方面Linux的使用;另一方面Linux的编程环境。
2。
使用Linux。
linux的用法。只需多用,从自己安装系统开始,多折腾多折腾。熟能生巧之后不想折腾想稳定的话,可以买一台云主机,写上代码,让自己习惯终端,习惯命令行。各式各样的命令,靠背肯定是不行的,必须多用。书籍无需通读,只要有一本工具书籍可以随时翻阅即可。
每天使用Linux其实还是比较难受的,毕竟桌面软件不像Windows和Mac那样丰富。我在大学里,比如Ubuntu,也经常玩,但是无论是GNOME,KDE,还是Ubuntu自己的桌面都经常会崩溃。其它兼容问题也不少,直到有一次更新时,网卡驱动出了问题,无法连接到WiFi,这使我在之后的很长一段时间里苦恼不已。慢慢地,我意识到我脱离了本质。全神贯注地去解决这个不该解决的问题,仍然是一种乐趣。之后我又用回了Windows(大学时没钱买MacBook),买了一台CentOS的云主机作为自己的Linux学习环境(学生可以学习)。
要熟练地使用Vim,Git,在以后的工作中您不能没有这两种工具。SD/awk还可以学习一下,统计,定位问题的好帮手。其它各式各样的小命令都会自动生成(常见用法常被忘记,可记录)。
另外,要了解一些Unix/Linux的基本概念,系统哲学。例如KISS,一切都是文件等等。别认为这是在浪费时间,最好在睡觉前看书或上厕所时看。这更能激发您的学习兴趣,给予您持久的学习动力。从古到今,Unix的发展历程,理清了整个技术发展的脉络,了解了那些辉煌辉煌的人物以及他们的英雄事迹。在理查德,汤普森,或者比尔乔,或者短信,或者Linus。无论是开放源码运动还是普遍的Linux。这篇文章不仅能帮助你学习,还能帮助你了解Unix/Linux背后的知识和设计理念。
建议大家看看这本《Unix和Linux大学教程》,虽然名字和大学教材一样,实际上是一本非常经典的外国书籍。当然你也可以先找一本《鸟哥Linux私房菜》来开胃。这本书更像是一顿饭,从英雄事迹到各种命令的使用,你可以在这里看到。
3。
编程Linux环境。
新手可能对“Linux系统环境编程”有误解。看起来是关于在Linux系统上如何编写代码的?实际上没有,这里指的是如何使用系统的API进行编程。这两种API都是C语言,但是它们与我们课本中的不同。一般情况下,我们所学习的C,都是ANSIC(IOSC)国际统一标准,无论Windows或Linux,但每个操作系统都有自己独特的API进行系统级编程。LinuxSystemAPI来自(兼容)Unix。经过几十年的发展,Unix的API已经形成了POSIX、SUS等标准。在这里,POSIX和SUS的区别不多说,大致上可以认为,Unix环境编程的API是POSIX标准。
就算是POSIX也不尽如人意,在Unix的世界里,还存在着一些非标物。例如,在SystemV和BSD分庭抗礼时期,新生的API出现了分裂。举例来说,我们经常谈论IO复用,select实际上源自SystemV,而poll来自于BSD。许多后期的操作系统都没有严格区分API的起源,默默无闻地兼容了两套API,例如Linux,直到后来Linux2.6推出了它自己的API:epoll。之后,BSD也推出了新的kqueue(而这个Linux已经不再支持了)。此外,我们经常提到的三个最重要的IPC也是值得注意的:消息队列、信号灯、共享内存(当然,IPC也不例外)相应的API:
消息队列
信号量
共享内存
msgget
semget
shmget
msgctl
semctl
shmctl
msgsnd
semop
shmat
msgrcv
shmdt
这些都是出自System V的。其实POSIX后来对这三大IPC也制定过自己的API标准,但是流行度就远远不如以上这几位老前辈了。这里看好像System V占了上风,但其实我们熟悉的socket那套API都是出自BSD,哈哈。
好了,一谈历史我就收不住,重新谈学习。我不建议一上来就找大部头阅读,从A刷到Z。我建议先随便去学校图书馆找一本薄薄的讲Linux C编程的书(尽量500页以内的),逐个章节建立起知识的框架。对系统编程有一个大体的认识。然后再去找一本大部头读一读。Stevens旷世三部曲其二的《APUE》《UNP》都是经典的图书,但其实我这里更建议的是这本《The Linux Programming Interface》(后面简称TLPI):
这本书直译就是《Linux编程接口》不知道为什么被翻译成了《Linux/Unix系统编程手册》,不过这不重要。《TLPI》行文风格,深入浅出。读起来更适合新手入门,作为长期的案边工具书也不错。我个人感觉是比《APUE》读起来更舒服的,而且也更加侧重Linux。另外这本书要比Stevens的那两本书年代要新,TLPI是2010年后出版,而Stevens 1999年就与世长辞啦,虽然其他人也给他的书修订过新版,不过我还是强烈推荐《TLPI》。
可以这么多API怎么学习啊?具体到我个人学习经历,由于我是一个患有重度笔记强迫症(compulsive note taker)的人,在大学期间,我在学习环境编程的过程中,每学一个API,都会去写一个使用demo,并且在github上写一个简要的wiki,久而久之和man手册类似。不过这个太花时间了,不推荐大家效仿了。不过无论如何多写代码总是没错的。
4
道讲完了,再谈一下术
具体到服务端开发,其实主要就是学习各种IPC、socket、IO多路复用(或者说事件驱动)、pthread(多线程),当然socket也是一种IPC,只是它太特殊了,socket的知识复杂度是超过其他IPC方式的,故而单列出来。一言以蔽之,侧重点就是网络编程啦。从多进程到多线程,再到IO多路复用。学完基础,去学一学网络模型,了解reactor(反应堆)和proactor(前摄器)的区别,学一学半同步/半异步模型(或半同步/半反应堆)、领导者/追随者。半同步/半异步模型的知识可以阅读这篇:
高山仰之可极,谈半同步/半异步网络并发模型
这些其实都是经典模型,当然工作之后遇到了brpc,则又是应用了另外一个稍高级的网络模型了。除了上面这些和C++语言之外就够了吗?不不不,还有TCP/IP和HTTP协议的知识。甚至你需要简单学一下HTML和JS。至少要知道前后端是如何交互的。
除了这些,以MySQL为代表的关系型数据库,以Redis为代表的内存KV数据库,还有MQ等等也是需要学习的。可以每一类找一个开源代表学一学。不一定要深入源码,因为组件层出不穷,学是学不完的,但至少要会用,知道如何使用这些组件去解决各种各样的实际问题(比如做个热门榜单,会想到Redis的zset)。
另外很重要一点就是,大学期间对于专业课不要逃课。很多自学编程的同学们总是看不上大学老师那点东西,不去上课。在寝室里自学点Web框架之类的。我不反对学习,但是因为学这些就不去上专业课,真的是舍本逐末。框架本身只是一个经验性的东西,学的就是一个熟练度。培训机构的学生培训三个月玩的比你熟,人家还带项目……当然你也可以去深入研究一下框架的背后实现原理,但我希望你能明白我的意思:学习框架不能成为逃专业课的理由。不要觉得操作系统、计算机网络、数据结构、计算机组成原理这种东西假大空、不实际。错错错,莫莫莫!
其实你把网络编程弄熟,弄一个小的网络库或者RPC框架都是没问题的。或者自己实现一个简易的HTTP Server、FTP Server,或者小Redis(解析几个命令,实现内存存储)之类的。不需要做到工业级别,主要是把核心的想法实现,剩下的很多其实是重复性的工作,以及性能提升的工作。
慢慢来吧,不要想着一口气学完(不可能的)。『以有涯随无涯,殆已!』先建立知识框架,尽量每个知识领域都有涉及,然后逐步填充细节。大学期间不能眉毛胡子一把抓,要把Linux和C++学的比其他的更熟练,其他技术对于大学生面试而言其实要求不高。并且随着工作的沉淀、经验的增长,很多知识其实会像倒排索引一样,慢慢填充到你的脑袋里,而不需要你对着目录从A到Z逐个学习。
消息队列
信号量
共享内存
msgget
semget
shmget
msgctl
semctl
shmctl
msgsnd
semop
shmat
msgrcv
shmdt
这些都是出自System V的。其实POSIX后来对这三大IPC也制定过自己的API标准,但是流行度就远远不如以上这几位老前辈了。这里看好像System V占了上风,但其实我们熟悉的socket那套API都是出自BSD,哈哈。
好了,一谈历史我就收不住,重新谈学习。我不建议一上来就找大部头阅读,从A刷到Z。我建议先随便去学校图书馆找一本薄薄的讲Linux C编程的书(尽量500页以内的),逐个章节建立起知识的框架。对系统编程有一个大体的认识。然后再去找一本大部头读一读。Stevens旷世三部曲其二的《APUE》《UNP》都是经典的图书,但其实我这里更建议的是这本《The Linux Programming Interface》(后面简称TLPI):
这本书直译就是《Linux编程接口》不知道为什么被翻译成了《Linux/Unix系统编程手册》,不过这不重要。《TLPI》行文风格,深入浅出。读起来更适合新手入门,作为长期的案边工具书也不错。我个人感觉是比《APUE》读起来更舒服的,而且也更加侧重Linux。另外这本书要比Stevens的那两本书年代要新,TLPI是2010年后出版,而Stevens 1999年就与世长辞啦,虽然其他人也给他的书修订过新版,不过我还是强烈推荐《TLPI》。
可以这么多API怎么学习啊?具体到我个人学习经历,由于我是一个患有重度笔记强迫症(compulsive note taker)的人,在大学期间,我在学习环境编程的过程中,每学一个API,都会去写一个使用demo,并且在github上写一个简要的wiki,久而久之和man手册类似。不过这个太花时间了,不推荐大家效仿了。不过无论如何多写代码总是没错的。
4
道讲完了,再谈一下术
具体到服务端开发,其实主要就是学习各种IPC、socket、IO多路复用(或者说事件驱动)、pthread(多线程),当然socket也是一种IPC,只是它太特殊了,socket的知识复杂度是超过其他IPC方式的,故而单列出来。一言以蔽之,侧重点就是网络编程啦。从多进程到多线程,再到IO多路复用。学完基础,去学一学网络模型,了解reactor(反应堆)和proactor(前摄器)的区别,学一学半同步/半异步模型(或半同步/半反应堆)、领导者/追随者。半同步/半异步模型的知识可以阅读这篇:
高山仰之可极,谈半同步/半异步网络并发模型
这些其实都是经典模型,当然工作之后遇到了brpc,则又是应用了另外一个稍高级的网络模型了。除了上面这些和C++语言之外就够了吗?不不不,还有TCP/IP和HTTP协议的知识。甚至你需要简单学一下HTML和JS。至少要知道前后端是如何交互的。
除了这些,以MySQL为代表的关系型数据库,以Redis为代表的内存KV数据库,还有MQ等等也是需要学习的。可以每一类找一个开源代表学一学。不一定要深入源码,因为组件层出不穷,学是学不完的,但至少要会用,知道如何使用这些组件去解决各种各样的实际问题(比如做个热门榜单,会想到Redis的zset)。
另外很重要一点就是,大学期间对于专业课不要逃课。很多自学编程的同学们总是看不上大学老师那点东西,不去上课。在寝室里自学点Web框架之类的。我不反对学习,但是因为学这些就不去上专业课,真的是舍本逐末。框架本身只是一个经验性的东西,学的就是一个熟练度。培训机构的学生培训三个月玩的比你熟,人家还带项目……当然你也可以去深入研究一下框架的背后实现原理,但我希望你能明白我的意思:学习框架不能成为逃专业课的理由。不要觉得操作系统、计算机网络、数据结构、计算机组成原理这种东西假大空、不实际。错错错,莫莫莫!
其实你把网络编程弄熟,弄一个小的网络库或者RPC框架都是没问题的。或者自己实现一个简易的HTTP Server、FTP Server,或者小Redis(解析几个命令,实现内存存储)之类的。不需要做到工业级别,主要是把核心的想法实现,剩下的很多其实是重复性的工作,以及性能提升的工作。
慢慢来吧,不要想着一口气学完(不可能的)。『以有涯随无涯,殆已!』先建立知识框架,尽量每个知识领域都有涉及,然后逐步填充细节。大学期间不能眉毛胡子一把抓,要把Linux和C++学的比其他的更熟练,其他技术对于大学生面试而言其实要求不高。并且随着工作的沉淀、经验的增长,很多知识其实会像倒排索引一样,慢慢填充到你的脑袋里,而不需要你对着目录从A到Z逐个学习。
本文来源:标梵互动