当前位置: 首页 > 科技观察

如何在LinuxC++服务器端处理这一行?一年半可以做什么?

时间:2023-03-14 11:22:55 科技观察

说到LinuxC++服务器开发,Linux和C++都是一个很大的话题。聪明的程序员需要学习做减法。0.C++简单说一下C++。事实上,为了毕业后找工作,熟练使用常用的C++语法就足够了(C++11至少要知道一些基础知识)。然后看C++基础的经典书籍,学习安全编码和高效编码的规范(知乎上关于C++的讨论太多,就不推荐了)。然后稍微研究一下C++的底层原理就OK了。勿贪奇技淫秽。毕竟大学时间有限,语言只是解决问题的工具。我们还有更多的高维问题需要解决。有利于以后学习语言本身的难点知识。很多时候,书看一百遍,还不如在实际工作中解决一个问题,实现一个需求来得快。当然,也有很多技术在实际工作中是不会用到(或不允许)的……1.Linux关于Linux,我想说说。大致分为两部分:一是Linux的使用;二是Linux的环境编程。1.1Linux的使用关于Linux,我想说说。大致分为两部分:一是Linux的使用;二是Linux的环境编程。1.1Linux的使用关于Linux的使用。就是多用点,从自己装系统开始,多添麻烦。熟练之后,如果不想折腾,想要稳定,可以买个云主机,在上面写代码,习惯终端和命令行。各种指挥眼花缭乱,靠背肯定不行,一定要多用。书不需要通读,有一本随时可以翻阅的参考书就够了。Linux的日常使用其实还是挺痛苦的,毕竟没有Windows和Mac那么丰富的桌面软件。大学时经常玩Ubuntu等游戏,但是无论是GNOME、KDE还是Ubuntu自带的桌面,都经常死机。还有很多其他的兼容性问题,直到更新后,网卡驱动连不上WiFi,折腾了好久。我逐渐意识到我失去了本质。沉浸在解决这种不该解决的问题中,自己还乐此不疲。后来又回到了Windows(上大学的时候没钱买MacBook),买了一台CentOS云主机作为我的Linux学习环境(学生有优惠)。你需要熟练使用Vim和Git。在您以后的工作中,您离不开这两个工具。sed/awk也要学学,是统计数据和定位问题的好帮手。其他各种小命令会自然而然地出现(常用的用法经常被遗忘,可以写下来)。另外,学习Unix/Linux的一些基本概念和系统哲学也是很有必要的。比如KISS,一切都是文件等等。不要认为这些是浪费时间,将它们用作睡前或厕所阅读即可。这样可以激发你的学习兴趣,给你持久的学习动力。从Unix到Linux的发展史,理清整个技术发展的脉络,了解那些光辉的人物和他们的英雄事迹。从Rich、Thompson到billjoy,从SMS到Linus。从开源运动的兴起到Linux的普及。这些故事不仅可以帮助你产生学习兴趣,还可以让你了解一些Unix/Linux背后的知识和设计理念。推荐阅读《Unix & Linux大学教程》虽然名字看起来像大学教科书,但其实是一本很经典的外文。当然,你也可以找本来做开胃菜。1.2Linux系统环境编程初学者可能对Linux系统环境编程这个名词有误解。这个好像是介绍在linux系统上怎么写代码的?其实不是,它指的是如何使用系统API来编程。这些API都是C语言的,但是和我们课本上的不一样。我们平时学习的C是ANSIC(IOSC),这是一个国际统一的标准,Windows和Linux都适用,但是每个操作系统都有自己独特的系统级编程API。Linux系统API源自(兼容的)Unix。UnixAPI在几十年里逐渐形成了一个标准:POSIX、SUS。POSIX和SUS的区别这里就不讨论了。可以大致认为我们要学习的Unix环境编程的API就是POSIX标准。当然,不全是POSIX。在Unix世界中,仍然存在一些非标准的东西。比如在SystemV和BSD争锋相对的那段时间,新的API是支离破碎的。比如我们常说的IO多路复用,select其实起源于SystemV,poll则来自BSD。很多后来的OS并没有严格区分API的来历,默默地兼容这两套API,比如Linux,直到Linux2.6推出了自己更高效的API:epoll。当然BSD也推出了新的kqueue(这个linux就不再支持了)。此外,它指的是我们常说的三大IPC对应的API:消息队列、信号量、共享内存(当然IPC不止这些):这些都来自于SystemV。事实上,POSIX后来为这三大IPC制定了自己的API标准,但其知名度远不及上述前辈。看起来这里SystemV占了上风,但其实我们熟悉的socketAPI都是来自BSD的,哈哈。嗯,说到历史就停不下来了,那我们再说说学习吧。不建议一上来就找大部头看,从A刷到Z,建议去学校图书馆找一本关于LinuxC编程的薄薄的书(尽量500页以内)),逐章搭建知识框架。对系统编程有一个大致的了解。然后去找一本大部头读一读。《APUE》《UNP》是史蒂文斯杰作三部曲的第二部,是一本经典之作。《Linux编程接口》不知道为什么要翻译成《Linux/Unix系统编程手册》,不过没关系。《TLPI》文笔通俗易懂。比较适合初学者阅读,作为长期的副业参考书也是不错的。个人感觉比《APUE》读起来更舒服,也更侧重于Linux。另外,这本书比史蒂文斯的两本书都要新。TLPI是2010年后出版的,1999年史蒂文斯去世了。虽然其他人修改过他的书,但我还是强烈推荐《TLPI》。2.讲座结束后,我们来谈谈具体到服务端开发的技术。其实主要是学习各种IPC,socket,IO多路复用(或者事件驱动),pthread(多线程)。当然socket也是IPC的一种,但是太特殊了,socket的知识复杂度比其他IPC方式要多,所以单独列出来。一句话,重点是网络编程。从多进程到多线程,再到IO多路复用。学完基础,学习网络模型,理解reactor(反应器)和proactor(前摄器)的区别,学习半同步/半异步模型(或半同步/半反应器),leader/follower。blabla...除了这些和C++语言就够了吗?不不不,还有TCP/IP和HTTP协议的知识。甚至你需要简单地学习HTML和JS。起码知道前后端是怎么交互的。除了这些,还需要学习以MySQL为代表的关系型数据库,以Redis为代表的内存KV数据库,MQ等。您可以找到每个类别的代表来学习。没必要深入源码,因为组件层出不穷,学无止境,但至少你要知道如何使用这些组件解决各种实际问题(比如做一个热门榜单,你会想到Redis的zset)还有一个很重要的一点就是大学期间专业课不要逃课。很多自学编程的学生,总是看不起大学老师的东西,不去上课。在宿舍自学一些web框架之类的。我不反对学习,只是因为学了这些东西而不去上专业课,实在是浪费钱。框架本身只是一个经验的东西,学到的东西是一种熟练。培训机构的学员经过三个月的培训,对游戏的熟悉度比你还高,而且还带了项目……当然你也可以深究框架背后的实现原理,但希望你能明白什么我的意思是:学习框架不能成为逃课的理由。不要认为操作系统、计算机网络、数据结构、计算机组成原理是假的、不切实际的。错错错了,沫沫沫。一年半可以做出什么?其实,如果你熟悉网络编程,弄个小型的网络库或者RPC框架是没有问题的。或者实现一个简单的HTTPServer,FTPServer,或者一个小型的Redis(解析几条命令实现内存存储)之类的。不需要达到工业水平,主要是实现核心思想,剩下的很多其实都是重复性工作和性能提升工作。事实上,没有必要自己制作一些东西。大学的时候没有做出像样的东西(缺乏创造力和耐心,我可能更喜欢命题作文。。。),但是熟悉环境编程,另外计算机基础也比较好。后来大三的时候面试了腾讯的暑期实习生,和面试官聊得很开心。慢慢来,不要想着一口气学完(不可能)。“若有极限,从无到有,一切都结束了!”先建立一个知识框架,尽量涵盖每一个知识领域,然后逐步填充细节。大学期间,眉毛胡须都抓不住。你必须比其他人更熟练地学习Linux和C++。其他对大学生掌握的要求不高。随着工作的积累和经验的增长,很多知识其实会像倒排索引一样慢慢填满你的脑袋,而不是要求你在目录前从A到Z一一学习。如果你是在校学生,编程语言和数据结构基础还不错的话,我觉得你应该在《操作系统》和《计算机体系结构》的课程上下功夫,然后看APUE,UNP等编程方面的书籍.学习操作系统的目的,不是为了让你发明自己的操作系统内核,打败Linux;不是要成为内核开发人员;就是了解操作系统为用户态进程提供什么样的运行环境,作为程序员如何充分利用它。改善环境,哪些做法是有益的,哪些是无用的,哪些是无益的。学习计算机体系结构的目的不是让你设计自己的CPU(新的ISA或微体系结构)来打败Intel和ARM;也不参与CPU设计团队改进现有的微架构;但要了解现代处理处理器的能力和特性(例如流水线、多问题、分支预测、乱序执行和其他指令级并行方法、内存局部性和缓存、多处理器内存模型、可见性,重新排序等),在编程时通过正确组织代码和数据来充分利用CPU并避免陷阱。现代微处理器。