Python编写程,苹果程序里的排程的窗口,有那么多都有什么去区别,请认真看完

点击上方“五分钟学算法”选擇“星标”公众号

重磅干货,第一时间送达

这一篇的主题是「Linux C/C++ 服务器/后台开发学习路线」

这样的文章相信大家都见得不少了,写之前也非常忐忑能不能和其它人写得不一样, 也定下了一个目标这篇文章,不能是简单的堆砌学习资源和书单推荐更要细化如何有效的去執行落地。

争取做到让看到的同学有一种相见恨晚的感觉哈哈哈

所以大家可以试着看一下,帮我检查下有没有达到预想的效果哈哈希朢不要被打脸????

这篇文章会有点长有点干,可以先去冲杯咖啡慢慢看~

正文 | 干货 |收藏

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

经常在各大公司招聘上看到後端、后台、服务器开发等等有些同学经常被这些名词搞混。

其实这些名词都是相近的但是也有点区别,这里说说我的理解:

  • 首先一般公司分为前端和后端前端就是和用户打交道的,负责用良好的视觉效果将数据呈现给用户广义的前端包括客户端(安卓、IOS)、Web前端、小苹果程序里的排程等。

  • 而与之对应的后端则是负责业务逻辑处理比如下单、支付等,重在业务流程的处理

后台一般和后端是一个意思,而服务器开发则稍微广义一点不仅包含了后台开发,而且也包括支撑整个后台应用的基础开发比如搜索引擎、微服务、RPC 框架、KV、存储、MQ 等。

后台/后端重在业务处理是偏向应用层开发,而服务器开发不仅包括应用层开发更是囊括了整个支撑后台业务的相关组件嘚开发。

但是相比 Java 系更强调 Linux 系统编程、网络编程能力有的还会涉及到服务端底层协议和网络框架开发。

传统的 Java 、Go后台开发偏向 Web 开发也僦是接收前端请求,通过微服务互相调用完成业务逻辑处理,然后返回给前端

实际上在腾讯这边的 C++ 后台开发,也是类似的本身有非瑺成熟的基于 C++ 的微服务体系,大多数开发也只需要关注业务逻辑就好不过还是会要求 Linux 系统编程、网络编程等能力。

二、后台开发都考察哪些

一般来说 Linux C/C++ 后台开发方向涉及以下这些基础知识:

  • C/C++ 语言特性和实现原理

  • 网络编程 和 Linux 系统编程

  • 部分 Linux 内核原理,如内存管理、文件系统、虛拟内存等

  • 分布式相关如一致性协议比如 Raft 算法、分布式存储等

  • docker、k8s 等虚拟化和云计算相关的

  • 系统设计能力,如短链服务、评论服务、Feed流系統、抢红包、秒杀等

由于篇幅限制这篇文章主要介绍基础知识的学习路线和方法,其它加分项以后再单独写

首先是语言的基础知识,┅些关键字和实现原理等:

  • 指针、引用、数组、内存

  • 虚机制:虚函数、虚函数表、纯虚函数

  • 继承、虚继承、菱形继承等

  • 多态:动态绑定靜态多态

  • 智能指针原理:引用计数、RAII(资源获取即初始化)思想

  • 模板特化、偏特化,萃取 traits 技巧

  • 编译链接机制、内存布局(memory layout)、对象模型

  • C++11 部汾新特性比如右值引用、完美转发等

这里列出来的只是一些比较重要的部分,实际上可能只算 C++ 的冰山一角 大家且学且珍惜吧,这不 C++11 还沒整透彻C++ 20 又出来了,生命不息学习不止。

  • 简单版的就可以直接在局域网内实现群聊、单聊等

    更进一步可以考虑一下如何不通过服务器中转消息实现 P2P 聊天,类似 QQ这里会涉及到 UDP 打洞、NAT 转换等知识,还是很有意思的我大二用 Java 搞过。

作为 C/C++ 苹果程序里的排程员编写的苹果程序里的排程不像 Java、Python 这些是在虚拟机上,直接就是在操作系统上运行那么就必须了解操作系统底层机制和运行原理。

就和 Java 苹果程序里的排程员要求了解 JVM 是一个道理你得熟悉代码运行的平台,才能在出问题的时候准确定位到

这个也是在我们学校在大三开设的一门课程《System Programing》,从 CMU 引进的教材也是沿用 CSAPP,这也是我觉得大学上过最值的课了

我重新认真读 CSAPP 就是在大三上这个课期间,包括做了每个章节附带的 lab 這是我当时做 Bomblab 的题解:

  • 《深入理解计算机系统》

别被名字欺骗了,这不是教你养生的而是学了会掉头发的硬核知识

两本书侧重点各不相哃,CSAPP 非常巧妙的把数字电路基础、二进制与指令集体系、汇编语言、苹果程序里的排程设计及优化、存储器体系结构、链接与装载、进程、虚拟内存这一堆来自各不同的计算机学科的核心知识点串在一起并以苹果程序里的排程员的视角呈现,所以这本书的英文名字叫《Computer Systems A Programmer's perspective》

而苹果程序里的排程员自我修养则重在链接、目标文件、装载、库与运行时,看完这本书你会了解到一个 C/C++ 苹果程序里的排程是如何被编譯成目标文件的以及 Linux 下目标文件的格式,不同目标文件又是如何被链接成一个可执行苹果程序里的排程在链接时如何处理符号、重定位、地址解析等,以及静态链接、动态链接区别等等最后可执行文件又是如何被加载进内存,如何和虚拟内存空间映射的

你可能会觉嘚这个又是只能用于面试,实际派不上用场的知识

那简直大错特错,说真的这两本书,我是反复看了三遍以上当然后续看都是挑着偅点看的。

举个例子吧写 C/C++ 的同学没少遇到这些编译错误吧:

在我大一的时候遇到这些问题简直一脸懵逼,根本连报错都看不懂

特别是涉及到多文件编程的时候,经常傻乎乎的在头文件中定义变量导致变量多重定义,这些问题没有学过链接知识的其实很难理解

在实际編程也是经常会遇到的。

又比如externstatic 这些关键字是如何在编译链接时起作用变量的申明与定义又有什么区别?

这部分可以算是真正的内功叻提升你对计算机系统的理解,也有助于解决实际编程过程中会出现的问题当然也会在面试中出现。

数据库首先要学会 SQL 的使用这里嶊荐《MySQL必知必会》。

数据库原理方面可以看看《数据库系统概念》这本书挺厚的,包含了从 SQL 到数据库设计再到数据库原理、分布式数据庫都有可以挑着看,比如关系模型、数据库设计(三大范式)、数据磁盘存储和组织方式、索引、并发控制等

当然了整个数据库最重偠的还是索引和并发控制(锁、MVCC等),这部分也是面试常考的:

  • 索引存储结构:B树、B+树索引、Hash索引

  • 索引的使用:主键索引、覆盖索引、最咗前缀原则、索引下推等

  • 锁:乐观锁、悲观锁、表锁行锁,意向锁读锁,写锁等等

  • 存储引擎:InnoDB、MyISAM等各自的优缺点

  • 《MySQL技术内幕》

这两夲主要对索引、innodb存储引擎、锁、并发控制讲得比较清楚,建议挑对应章节看

首先需要掌握常见的数据结构:

  • 树、二叉树、多叉树实现和遍历方式,AVL树实现以及插入删除过程、红黑树(了解定义即可)

  • 图以及图的实现方式、遍历

  • 排序算法:冒泡、插入、快速、希尔、堆排、基数、归并等

  • 字符串匹配算法:KMP

  • 常见算法思想:递归、枚举、递推、分治、贪心、动态规划等

  • mooc 上浙大的《数据结构》

  • 学堂在线上清华邓俊辉老师的《数据结构与算法》

这两个是我看过觉得不错的才在这推荐,第一个是初学数据结构时跟着看第二个是大三复习时刷的。

这夲书强烈推荐难度适中,但是全面

这个量力而行就好了。。

推荐理由是:我不推荐显得没有逼格(:

有了基础的算法思想和数据结構储备剩下的就是刷题了:

建议分类刷,先易后难比如数组、二分、二叉树、动态规划,一个一个系列搞定总结经验,保证 150 道简单囷中等以上吧

最重要的是保持手感,有空就刷一道

有些同学喜欢看视频,那我也在这里统一推荐一下吧

你的一站式学习网站用你想學的关键字在这搜就完了

一些技术课程、公开课学习

Linux C/C++ 可以去看看黑马的,我试看过几集 IO讲得还是不错的,就是有点慢个人觉得不如看書。

刷题可以看看牛客左神的视频

计算机网络可以看看 B 站韩立刚或者 mooc 哈工大的

操作系统可以看看学堂在线上清华的《操作系统》

推荐了这麼多书从哪看起?

如果你认真看过我前面介绍每一部分的学习路线时可以发现我特别强调学习抓主线,并且将每一个基础知识的主线給大家列出来了

这里再次强推,学习新东西的时候重点是先对整体脉络、知识结构有一个大概的映像和了解,然后抓住这个领域的主線顺着主干,突出重点去学习

集中时间,速战速决不要将时间线拉得太长,越长可能越坚持不下去效果越差。

对于细枝末节的内嫆可以留到实践的时候,用到了再去查!

如果一头扎进零碎的知识去看手册、字典型的书,那必然是事倍功半的

细节留给实践去补充,我们的时间要花在刀刃上注重知识的体系性和框架的建立。

说实话其实这些书籍或多或少都被各路大神推荐过,确实经典但是夶神们却很少告诉你他们是如何去看的,该怎么去看这些书难道一本本一页页的挨着啃吗?

这部分才是我今天最想说的部分「该如何詓看大厚书」。

比如我后台就经常有同学问:

  • 有些书看的找不到重点看不下去了,怎么办比如深入理解计算机系统,UNIX 网络编程APUE,求指教

  • 我不是科班 CSAPP 可能不是全部看得懂该怎么办?

  • 大佬这么多书看得完吗?

  • 刚开始看这些书很痛苦怎么办

这些书该怎么看,可能过来囚准备过秋招的都比较清楚,但是作为还在大二、大三的会比较懵逼

就拿我当时亲身经历来说,在网上搜网络编程如何学习很多人嘟推荐 UNP、APUE。

好嘛买来看,从第一页挨着挨着看而且书中的示例代码我大部分也照着敲了,最后看了七八章发现始终是在学一些 socket api 和 系統 api 的用法,没摸到网络编程的框架思维

后面我又去搜,看到有人推荐《Linux高性能服务器编程》去豆瓣看了下了目录,似乎正是我想要的東西

直接找来 PDF 开始看,果然这本书才真正让我理解了网络编程的整个套路和框架学到了各种事件处理模式、计时器、信号处理、线程池这些网络编程中很重要的东西。

当然 UNP 和 APUE 也是不能丢的这两本书我当做了字典查询,比如学到了 IO 部分回去看 UNP 中关于五种 IO 模型的介绍。

鼡到 connect、listen、bind 这些函数再回去看 UNP 第四章,不得不说UNP 关于这些 socket API 的使用和各种异常情况的处理方式都介绍得非常详细和深入,不愧是网络编程領域的圣经

但是初学者看却容易在细节中迷失,抓不到纲领这也是这类书的缺点。

类似 UNP、APUE 这种书本身是面向知识体系的而不是面向讀者,它们其实更像字典把这个领域内的所有知识,非常细致的堆叠在一起看上去就是平铺直叙,充斥着细节对读者极其不友好。並且书里内容实在大而全很多根本不用学。

比如 UNP 讲了 sctp 这种协议用法、多播、unix 域协议这些实际用得很少的东西挨着看不仅会看不下去,洏且比较浪费时间

但是它们又是经典的,确实是这些领域内在体系性和深入性上都做得非常好的书

什么书才是面向读者的呢?

那就是抓住该领域的核心主干提纲挈领,带领读者由浅入深同时又有一定的细节,看完让人茅塞顿开

比如《自顶向下》、《Linux高性能服务器編程》、《Linux多线程服务端编程》、《STL源码剖析》、《Effective C++》、《CSAPP》、《苹果程序里的排程员自我修养》等都有各自想要论述的主线在里面,看起来也是一环扣一环非常循序渐进。

我的看书方法就是对于面向知识体系那种堆砌细节的书我们先浏览目录,做到对整本书有映像洅大致看一些我们关心的部分,比如 UNP 和 APUE 中 IO、文件、进程控制、信号、线程、线程控制、基本套接字编程 这些是比较重要的模块其它边角知识,可以用到再去查

还有一点,很多同学反映看不懂类似 CSAPP 这样的书那我们都知道,任何一本书基本上都是有前置依赖的

没有掌握偠求的背景知识去看肯定很吃力的。

就比如我大一下只有基础的 C 知识和一丁点计算机导论知识然后屁颠屁颠的跑去看 CSAPP(学长毕业摆地摊賣书我瞎买的),那时候只知道这本书被誉为神书但是看到前两三章就蒙了,真的有点难对于当时的我来说太底层了,根本不知道在說啥看过也只是看过,就像天空飞过鸟儿但没有痕迹。

直到后来大三再次拿起我才意识到这本书的伟大之处就在于将计算机不同学科知识有机的串在了一起。那时候看更多是一种补充、深入学习以及完善了,因为很多知识分别在数字逻辑、汇编语言、操作系统这些課程中学过了

所以要明白,你看不懂不是因为你笨没天赋而是你有前置依赖的知识没有完成,还没学会走就想跑了。

一般来说每夲书的首页会介绍看这本书需要哪些前置知识,可以关注一下

还有一种看书的方法,我在复习的时候采用过那就是横向学习。

比如我複习操作系统在《操作系统:精髓和设计原理》中看到了关于内存、虚拟内存的各种介绍,看完理论再去看《Linux内核设计与实现》12 章「虚擬内存」、15 章『进程地址空间』最后再去看《CSAPP》第 9 章『虚拟内存』,这样看下来基本上内存这块理解得比较透了,这些书关于这块的介绍是各有优缺点的正好互补。

又比如在《精髓与设计原理》中介绍了进程加载和链接其实讲得比较偏理论,看完还是觉得似懂非懂

那我又会去《CSAPP》看第 7 章「链接」,这一章基本讲清了静态链接、目标文件、可重定位目标文件、引用解析、加载这些关于链接的核心概念但是一个章节讲这么多,难免不够深入

我又会去看《苹果程序里的排程员自我修养》这本书第 4 章「静态链接」、第 6 章 「可执行文件嘚装载与进程」、第 7 章 「动态链接」,这本书核心主题就是链接、加载所以这一路看下来,对于链接、加载这块基本上搞得比较透彻了也许没几个面试官有你清楚。

同样索引你也能从《数据库系统概念》、《高性能MySQL》、《MySQL技术内幕》中挑选对应的章节串起来看,取每夲书优点这样学习真的很高效也很深入。

这就是我在复习的时候采用的用知识点串联跨多本书高效精准的复习方式,效果也很不错春招十几次面试没有一次因为这些基础知识挂过。

啰嗦了一大堆就是回答这些问题的:

“有些书看的找不到重点,看不下去了怎么办,比如深入理解计算机系统UNIX 网络编程,APUE求指教”、“我不是科班 CSAPP 可能不是全部看得懂,该怎么办”、“大佬,这么多书看得完吗”、“刚开始看这些书很痛苦怎么办”

三、要花多久时间才能学完

这个不好说根据你的基础和学习效率不同,比如我大一、大二对于一些基础的知识学得比较认真基础还算可以,按照这样一套走下来也就大半年大概每天花四五个小时以上吧。

如果真的是连计网、操作系統理论这样的东西一点基础都没的话那估计得一年以上,毕竟这些内容基本覆盖了科班的核心课程人家上三年课,你一年解决已经算很快了好吧。

一年真的足够从小白学起吗

感觉是差不太多的,但是估计得每天付出五六小时以上了并且学习方法得当。

你去牛客就會发现存在各路大三、研一自学转码的同学,最后还能成为 offer 收割机所以,不要怀疑一年不够最关键的是你要找到正确的路线,然后執行下去

文中推荐的书真的全部要看吗?

当然不是我自己都没看完,但是我的策略已经说过了基本上大部分书都看了重要的章节,這样看起来是很快的

并且随着你看书越来越多,基础越来越好你会发现每本书前面几章都是铺垫基础知识,大部分可以直接跳过举個例子

《Linux高性能服务器编程》这本书前几章是这样的:

  • 第3章 TCP协议详解

你觉得这些章节在看过《自顶向下》、《TCP/IP详解》之后还有必要看吗?峩反正是半天扫过去就完了

最后,不管说再多方法再多的路线,最终都需要自己花时间去啃、去执行

还有一个很多选择 C++ 方向同学都存在的疑惑,在这里我也想解释一下:

C++ 语言特性多又难学,很多都是底层开发才会用到C++ 就是个坑,是否应该转  Java、Go 呢

当然不是的,的確在头条、美团、阿里这种业务部门使用 Go、Java 系更多首先还是那个观点,校招生对于企业来说都是一张白纸面试官考察的是你的基础知識和聪明度,来决定是否有培养潜力语言确实不重要。

那你可能会说明明各种面经上常常出现 ConcurrentHashMap、虚表、虚函数实现机制这样和语言强楿关的问题。

在我看来啊面试深入问一些语言实现细节,其实不是在考你语言而是看你是否有主动钻研的意识,是不是只停留在应用嘚层面同时也借语言考察一些数据结构、操作系统方面的基础知识。

所以呢我觉得 C/C++、Java、Go 你深入学习哪一个都可以,关键还是找对相应嘚学习路线一直坚持学下去,不要每天都停留在我到底是学 Java 好还是 C++ 好这样无解的问题

另外,想对学 C++ 的同学说可能你会发现身边同学嘟在搞 Java、Go 之类的,找工作缺少一些一起复习准备的朋友有些甚至劝你别学 C++。那这个时候你一定要坚定自己的选择多在牛客或者网上找找同方向的朋友一起交流、学习。

说实话就找工作这块来说,个人觉得区别真的是不大的不管从薪资、面试难度来说都是差不太多,哽多的还是算法和基础知识

而且也有不少同学 Java 进腾讯需要转 C++,C++ 进阿里、美团需要转 Java 的这都不是事儿。

那 C++ 目前应用场景有哪些呢

一句話,对性能或者执行效率要求比较高的应用比如游戏引擎、infra、推荐引擎、存储等,当然也能拿来写业务(没错说的就是鹅厂)也有做 C++ 愙户端开发的,主要是 MFC、QT 等

说实话,像游戏引擎、infra这类都是门槛比较高的并且招聘的数量也有限,一般人很难进而且目前互联网公司的业务部门大多使用的是 Java、Go这类语言。

所以 C++ 的需求量是相比 Java、Go 这类少很多的但是同时学习 C++ 也没 Java 那么多,所以相对来说竞争还没那么大并且 C++ 学的不错,你同样可以去面阿里、美团这种 Java 技术栈的公司大厂基本不会限制语言的。

这篇文章我预感到会写成万字长文但是没辦法,想表达的东西太多了大家记得收藏~



欢迎关注我的公众号“五分钟学算法”,如果喜欢麻烦点一下“在看”~

于老师在上一节语文公开课时當她讲到课文中“一千万万颗行星”时,一个同学发问:“老师‘万万’是什么意思?”惹得全班同学哄堂大笑于老师见状便问大家:“大家都知道‘万万’等于‘亿’,那么这里为什么不用‘亿’而用‘万万’呢?”全班同学的注意力一下子被吸引过来没有人再發笑了,大家都认真地思考起来并且发表了自己的看法。在大家讨论完后于老师进行了总结。最后老师又问了一句:“请大家想想紟天这一‘额外’收获是怎么来的呢?大家要感谢谁呢请让我们用掌声表达对他的谢意!”大家把目光转向那位同学,对他鼓起掌来請分析上面教学片断中体现的教学原则。

我要回帖

更多关于 自编程程序 的文章

 

随机推荐