大家好,我是阿秀。
去年、前年和大前年都是美团第一个开奖,而且开奖时间很早,基本都是国庆后就开奖了,完全不给其余公司反应机会,详情请移步前两年的这两篇文章:今年又是美团在校招薪水上开了个好头。、今年居然又是美团率先开奖....
而今年美团开奖时间延迟到十一月,比去年和前年差不多都晚了一个月的时间,即使如此,美团依旧是今年互联网大厂里第一个开奖的!
论大厂里开奖的积极性而言,美团绝对是个显眼包了,在腾讯、字节、阿里、百度、快手等一众大厂小道消息都没几个的时候,美团直接开大了!
而根据一些微信好友私聊的上岸信息以及社交媒体如牛客网、小程序offershow的爆料可知,美团今年的薪资总体与去年持平,无太大改变:算法岗依旧一骑绝尘,普遍集中在32-38k/月;其次是技术开发岗(前端、后端、测开等),普遍集中在18-30k/月,再然后是产品运维等岗位,普遍集中在14-18k/月。
这里分享几个可信度较高的薪资爆料。
这里分享一位cpp技术栈的小伙伴面试美团一面的面经,主要是基础问题居多,但这位面试官针对计算机网络考察较为细致,认真询问了很多关于TCP和UDP相关的内容。
可能很多人都很意外,为什么美团这种Java大厂还会招聘cpp技术栈的应届生?明明技术栈不匹配
其实不只是美团,就连pdd、京东、网易、快手这些Java大厂也会招收cpp技术栈的选手,而字节、腾讯、百度这种cpp、Golang、PHP都有的就更不用说了。
很多人的固有思维就是学什么技术栈就必须投什么岗位,而且习惯以语言为第一要义,但实际上,工作中是以项目为导向的并并非语言,为了项目去学一门新技术是很常见的事。
前几天就有一位学习圈中非科班的同学,使用cpp技术栈拿到很多Java大厂的offer,这位同学一年半前开始学习C++路线的时候就找阿秀私聊问过问题,加之秋招期间也帮他改过简历、教他谈过薪,所以印象比较深。
C++
1、你学C++的?看过哪些书?
是的,断断续续看过《C++ Primer 5th》、《Effective C++》、《More Effective C++》、《深度探索对象模型》、《STL源码剖析》等。
2、C++与Java的区别?
Java用接口(Interface)技术取代C++程序中的抽象类。接口与抽象类有同样的功能,但是省却了在实现和维护上的复杂性 Java语言中没有指针的概念,引入了真正的数组。不同于C++中利用指针实现的“伪数组”,Java引入了真正的数组,同时将容易造成麻烦的指针从语言中去掉,这将有利于防止在C++程序中常见的因为数组操作越界等指针操作而对系统数据进行非法读写带来的不安全问题 C++也可以在其他系统运行,但是需要不同的编码(这一点不如Java,只编写一次代码,到处运行),例如对一个数字,在windows下是大端存储,在unix中则为小端存储。Java程序一般都是生成字节码,在JVM里面运行得到结果
3、new和malloc的区别?
1、 new/delete是C++关键字,需要编译器支持。malloc/free是库函数,需要头文件支持;
2、 使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算。而malloc则需要显式地指出所需内存的尺寸。
3、 new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无须进行类型转换,故new是符合类型安全性的操作符。而malloc内存分配成功则是返回void * ,需要通过强制类型转换将void*指针转换成我们需要的类型。
4、 new内存分配失败时,会抛出bac_alloc异常。malloc分配内存失败时返回NULL。
4、程序的内存模型了解过吗?
分别是堆、栈、自由存储区、全局/静态存储区、常量存储区和代码区。如下图所示
栈:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限
堆:就是那些由 new
分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new
就要对应一个 delete
。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收
自由存储区:如果说堆是操作系统维护的一块内存,那么自由存储区就是C++中通过new和delete动态分配和释放对象的抽象概念。需要注意的是,自由存储区和堆比较像,但不等价。
全局/静态存储区:全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量和静态变量又分为初始化的和未初始化的,在C++里面没有这个区分了,它们共同占用同一块内存区,在该区定义的变量若没有初始化,则会被自动初始化,例如int型变量自动初始为0
常量存储区:这是一块比较特殊的存储区,这里面存放的是常量,不允许修改
代码区:存放函数体的二进制代码
操作系统
5、线程和协程的区别?不是进程哦
进程 | 协程 | |
---|---|---|
定义 | 程序执行的基本单位 | 用户态的轻量级线程,线程内部调度的基本单位 |
切换情况 | 保存和设置程序计数器、少量寄存器和栈的内容 | 先将寄存器上下文和栈保存,等切换回来的时候再进行恢复 |
切换者 | 操作系统 | 用户 |
切换过程 | 用户态->内核态->用户态 | 用户态(没有陷入内核) |
调用栈 | 内核栈 | 用户栈 |
拥有资源 | 程序计数器、寄存器、栈和状态字 | 拥有自己的寄存器上下文和栈 |
并发性 | 一个进程内部的多个线程并发执行 | 同一时间只能执行一个协程,而其他协程处于休眠状态,适合对任务进行分时处理 |
系统开销 | 切换时只需保存和设置少量寄存器内容,因此开销很小 | 直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快 |
通信方面 | 线程间可以直接读写进程数据段(如全局变量)来进行通信 | 共享内存、消息队列 |
6、关于读写锁,你知道多少?
多个读者可以同时进行读 写者必须互斥(只允许一个写者写,也不能读者写者同时进行) 写者优先于读者(一旦有写者,则后续读者必须等待,唤醒时优先考虑写者)
7、如何预防死锁?
破坏互斥条件:例如假脱机打印机技术允许若干个进程同时输出,唯一真正请求物理打印机的进程是打印机守护进程。 破坏请求和保持条件:一种实现方式是规定所有进程在开始执行前请求所需要的全部资源。 破坏不剥夺条件:允许抢占资源 破坏循环请求等待:给资源统一编号,进程只能按编号顺序来请求资源。
计算机网络
8、HTTP的缺点有哪些?
使用明文进行通信,内容可能会被窃听; 不验证通信方的身份,通信方的身份有可能遭遇伪装; 无法证明报文的完整性,报文有可能遭篡改。
9、TCP是如何保证可靠传输的?
确认和重传:接收方收到报文就会确认,发送方发送一段时间后没有收到确认就会重传。 数据校验:TCP报文头有校验和,用于校验报文是否损坏。 数据合理分片和排序:tcp会按最大传输单元(MTU)合理分片,接收方会缓存未按序到达的数据,重新排序后交给应用层。而UDP:IP数据报大于1500字节,大于MTU。这个时候发送方的IP层就需要分片,把数据报分成若干片,是的每一片都小于MTU。而接收方IP层则需要进行数据报的重组。由于UDP的特性,某一片数据丢失时,接收方便无法重组数据报,导致丢弃整个UDP数据报。 流量控制:当接收方来不及处理发送方的数据,能通过滑动窗口,提示发送方降低发送的速率,防止包丢失。 拥塞控制:当网络拥塞时,通过拥塞窗口,减少数据的发送,防止包丢失。
10、TCP的连接状态中有个TIME_WAIT状态,你了解吗?
客户端收到服务端的FIN包,并立即发出ACK包做最后的确认,在此之后的2MSL时间称为TIME_WAIT状态。
11、假如我是使用UDP进行可靠传输,你觉得需要设计那些环节?
最简单的方式是在应用层模仿传输层TCP的可靠性传输。
下面不考虑拥塞处理,可靠UDP的简单设计。
1、添加seq/ack机制,确保数据发送到对端 2、添加发送和接收缓冲区,主要是用户超时重传。 3、添加超时重传机制。
SQL
12、SQL中内连接和外连接有什么关系?
内连接
只有两个元素表相匹配的才能在结果集中显示。
外连接
左外连接: 左边为驱动表,驱动表的数据全部显示,匹配表的不匹配的不会显示。 右外连接:右边为驱动表,驱动表的数据全部显示,匹配表的不匹配的不会显示。
算法
力扣原题:对称二叉树、用两个栈实现队列
你好,我是阿秀,普通学校毕业,校招时拿到字节跳动SP、百度、华为、农业银行等6个互联网中大厂offer,这是我在校期间的编程学习之路,详细记录了我是如何自学技术以应对第二年的校招秋招的。
毕业后我先于抖音部门担任全栈开发工程师,目前在上海某外企带领团队继续从事全栈开发,负责的项目已经顺利盈利300w+。在研三那年就组建了一个阿秀的学习圈,一直持续分享校招/社招跳槽找工作的经验,都是自己一路走过来的经验,目前已经累计服务超过 4000 +人,欢迎点此了解一二。