后台架构开发136道题,如果你都会,直聘40k月薪大企

583 阅读11分钟

作者:Yt201907162132712 链接:www.nowcoder.com/discuss/208… 来源:牛客网

一.C和C++语言基础 参考书籍:《C++ primer》,《effective C++》,《STL源码解析》,《深度搜索C++对象模型》

extern关键字作用 static关键字作用 volatile是干啥的 说说const的作用,越多越好 new与malloc区别 C++多态性与虚函数表 纯虚函数如何定义,为什么对于存在虚函数的类中析构函数要定义成虚函数 析构函数能抛出异常吗 构造函数和析构函数中调用虚函数吗? 指针和引用的区别 指针与数组千丝万缕的联系 智能指针是怎么实现的?什么时候改变引用计数? C++四种类型转换:static_cast, dynamic_cast, const_cast, reinterpret_cast 内存对齐的原则 内联函数有什么优点?内联函数与宏定义的区别? C++内存管理 STL里的内存池实现 STL里set和map是基于什么实现的。红黑树的特点? STL里的其他数据结构和算法实现也要清楚 必须在构造函数初始化式里进行初始化的数据成员有哪些 模板特化 定位内存泄露 二.数据结构与算法 这一块考察范围太广,主要靠多刷题。

Hash表

Hash表实现(拉链和分散地址) Hash策略常见的有哪些? STL中hash_map扩容发生什么? (1) 创建一个新桶,该桶是原来桶两倍大最接近的质数(判断n是不是质数的方法:用n除2到sqrt(n)范围内的数) ; (2) 将原来桶里的数通过指针的转换,插入到新桶中(注意STL这里做的很精细,没有直接将数据从旧桶遍历拷贝数据插入到新桶,而是通过指针转换) (3) 通过swap函数将新桶和旧桶交换,销毁新桶。 树

二叉树结构,二叉查找树实现; 二叉树的六种遍历; 二叉树的按层遍历; 递归是解决二叉树相关问题的神级方法; 树的各种常见算法题(blog.csdn.net/xiajun07061…); 什么是红黑树? 红黑树与AVL树的区别 Trie树(字典树) 链表

链表和插入和删除,单向和双向链表都要会 链表的问题考虑多个指针和递归 (1) 反向打印链表(递归) (2) 打印倒数第K个节点(前后指针) (3) 链表是否有环(快慢指针)等等。 栈和队列

队列和栈的区别?(从实现,应用,自身特点多个方面来阐述,不要只说一个先入先出,先入后出,这个你会别人也会,要展现出你比别人掌握的更深) 典型的应用场景 海量数据问题

十亿整数(随机生成,可重复)中前K最大的数 十亿整数(随机生成,可重复)中出现频率最高的一千个 排序算法

排序算法当然是基础内容了,必须至少能快速写出,快排,建堆,和归并 每种算法的时间空间复杂度,最好最差平均情况 位运算

布隆过滤器

几十亿个数经常要查找某一个数在不在里面,使用布隆过滤器,布隆过滤器的原理。布隆过滤器可能出现误判,怎么保证无误差?

三.网络与TCP/IP 参考书籍:《图解TCP/IP》,《TCP/IP详解 卷一》,《图解HTTP》,《HTTP权威指南》

TCP与UDP之间的区别 (1) IP首部,TCP首部,UDP首部 (2) TCP和UDP区别 (3) TCP和UDP应用场景 (4) 如何实现可靠的UDP 详细说明TCP状态迁移过程

(1) 三次握手和四次挥手状态变化; (2) 2MSL是什么状态?作用是什么? (3)三次握手为什么不是两次或者四次? TCP相关技术

TCP客户与服务器模型,用到哪些函数 UDP客户与服务器模型,用到哪些函数 域名解析过程,ARP的机制,RARP的实现 Ping和TraceRoute实现原理 HTTP

http/https 1.0、1.1、2.0的特点和区别 get/post 区别 HTTP返回状态码 http 协议头相关 https与http的区别?如何实现加密传输?加解密方式? 浏览器中输入一个URL发生什么,用到哪些协议? 安全相关

SQL注入 XSS CSRF SYN洪水攻击 APR欺骗 四.数据库 主要参考书籍:《数据库系统概念》,《高性能MySQL》

SQL语言(内外连接,子查询,分组,聚集,嵌套,逻辑) MySQL索引方法?索引的优化? InnoDB与MyISAM区别? 事务的ACID 事务的四个隔离级别 查询优化(从索引上优化,从SQL语言上优化) B-与B+树区别? MySQL的联合索引(又称多列索引)是什么?生效的条件? 分库分表 五.Linux 主要参考书籍:《现代操作系统》,《APUE》,《UNP》,《LINUX内核设计与实现》,《深入理解LINUX内核》

进程与线程

进程与线程区别? 线程比进程具有哪些优势? 什么时候用多进程?什么时候用多线程? LINUX中进程和线程使用的几个函数? 线程同步? 进程间通讯方式

共享文件映射mmap mmap建立进程空间到文件的映射,在建立的时候并不直接将文件拷贝到物理内存,同样采用缺页终端。mmap映射一个具体的文件可以实现任意进程间共享内存,映射一个匿名文件,可以实现父子进程间共享内存。 常见的信号有哪些? 虚拟内存的作用? 虚拟内存的实现? 操作系统层面对内存的管理? 内存池的作用?STL里内存池如何实现? 进程空间和内核空间对内存的管理不同? Linux的slab层,VAM? 伙伴算法 高端内存 进程调度

Linux进程分为两种,实时进程和非实时进程; 优先级分为静态优先级和动态优先级,优先级的范围; 调度策略 交互进程通过平均睡眠时间而被奖励; 死锁

死锁产生的条件; 死锁的避免; 命令行

与CPU,内存,磁盘相关的命令(top,free, df, fdisk) 网络相关的命令netstat,tcpdump等 sed, awk, grep三个超强大的命名,分别用与格式化修改,统计,和正则查找 ipcs和ipcrm命令 查找当前目录以及字母下以.c结尾的文件,且文件中包含”hello world”的文件的路径 创建定时任务 IO模型

五种IO模型 select,poll,epoll的区别 Linux的API

fork与vfork区别 fork和vfork都用于创建子进程。但是vfork创建子进程后,父进程阻塞,直到子进程调用exit()或者excle()。 对于内核中过程fork通过调用clone函数,然后clone函数调用do_fork()。do_fork()中调用copy_process()函数先复制task_struct结构体,然后复制其他关于内存,文件,寄存器等信息。fork采用写时拷贝技术,因此子进程和父进程的页表指向相同的页框。但是vfork不需要拷贝页表,因为父进程会一直阻塞,直接使用父进程页表。 exit()与_exit()区别 exit()清理后进入内核,_exit()直接陷入内核。 孤儿进程与僵死进程 Linux是如何避免内存碎片的

共享内存的实现原理 系统调用与库函数(open, close, create, lseek, write, read) 同步方法有哪些? 六.设计模式 单例模式线程安全的写法 STL里的迭代器模式,适配器模式 七.分布式系统 map_reduce原理 负载均衡 CDN 相信你可能经历过这些:

已经工作两三年了,每个项目都会加班加点全力以赴去完成,薪资增长幅度却不如人意。

听说年后离职的老同事,跳槽刚拿下高薪offer,年薪直奔50万了。

由于现在的公司接触不到新技术,对自己的市场竞争力无比焦虑,未来职业道路怎么走?

这个凛冽寒冬,你终于明白,现在的工作机会很少,薪资很难有较大涨幅,IT工程师的薪资是技能决定的,是时候去提高技能,提前规划未来职业发展路径了。

现在竞争这么激烈难道真的准备转行吗?能送的了外卖,搬得了砖吗?

作为it从业者,谁不忙,谁不加班。你说你没时间,家人能理解,领导和市场是不会理解你的。那如何提升技术,保值提升自己的价值,如果在有限的时间高效的提升?我们一起来看看过来人的经验。供大家参考一下。

成为一名c++Linux开发工程,不同于其他语言,因为它的保值性,所以很多时候就像是在温水煮青蛙,等你反应过来的时候,你已经丧失掉了反抗的能力。

在Lee哥十余年的开发生涯中,这一点深有体会。而让Lee哥坚持下去的动力,主要源于3个方面。

1、 不断增值自己,拥有更多选择权

如果将技术比做一棵树,每学会一门语言,就点亮树上一个果实,你会得越多,技术树的果实就越多,价值就越大。当技术树的果实积累到一定程度,你就能纵向往高阶技术方向晋级,职业发展之路更上一层楼。

2、 互联网没有舒适圈,止步不前便是退步

计算机技术更新迭代快、新技术层出不穷,如果想要成为一个优秀的c/c++Linux后台工程师,就要做好随时学习的准备,并持之以恒,这样才能跟上互联网日新月异的发展节奏。

3、 学习是面对竞争、度过中年危机的最好方法

it工程师是高薪职业,近年来互联网的高速发展下,更是一度成为抢手的热门职业,以至于投身到这个职业的人越来越多,千军万马过独木桥,想要不掉队,唯有努力学习,成为互联网公司高薪争抢的中高端工程师,才能不惧寒冬。

目前互联网寒冬让很多互联网人清醒了,众多大企裁员、招聘需求收缩,主要还是针对基础岗、温水煮青蛙给煮死的那波人,中高端工程师在市场上依然紧缺。

怎么选择自我的提升路线就很重要。

互联网公司主流技术选型 很多做c/c++Linux后台开发的程序员有时候就感到很困惑,说不想提升吧,在公司来回就是那三板斧。说想提升,一是担心自己时间不够,看书啥的,坚持一段时间之后,项目一来,就断了,再想继续的时候前面的有有点忘记了。而是怎么高效的学习,要学的一想大多了,望而却步。

这7大模块就是在进阶架构必要掌握的技能点了,就像打怪升级,技能点都没有点满的话,boss你一碰就会挂掉。

所以希望这里的整理能真正帮助到想要从程序员进阶为高级架构师之路的朋友。

1.组件编程配置专栏

包括zerMQ,Redis,MySQL,Nginx,ZooKeeper,MongoDB.

2.工程化管理专栏

包括工程架构,代码管理。

3.网络IO专栏

包括IO复用,IO框架,IO类型。

4.Linux系统专栏

包括系统命令工具,网络参数工具,日志监控工具,参数监控工具。

5.实战专栏

包括项目需求,工程代码,功能测试,产品发布。

6.开源框架专栏

包括网络,协议,并发,媒体,语言,数据,压缩,国际化,安全,日志。

7.调试与性能专栏

希望大家能用心理解,整理不易。Lee哥最后也想说,职场也好,人生也罢,都是一个不断变得优秀的过程,在这个过程中,会不断的遇到挫折与困难,一个个需要我们去翻越的山峰。只有坚持前行,才有机会看见更美的风景。

学好技术+面试分析,软硬兼施,才是全面提升的良方。