21届秋招7面字节iOSer小白菜终于上岸
谨以此贴,记录我挣扎的秋招经历。 同时回馈牛客,喝水不忘挖井人! 感谢牛客上各位朋友无私的分享,让我少走了很多弯路,得到了很多帮助! 长文预警~
自我情况介绍
- 北邮本科+专硕,专业是通信工程+电子通信工程;
- 无实习经历,实验室项目不相关;
- 本科学过C++,玩过一点iOS开发;
- 算法基础薄弱;
- 投递的都是iOS移动客户端开发。
简述一下实习准备的过程,实习面经计划另写一篇贴以作记录,也方便大家按照阶段参考。
- 2020-2-10 ~ 2-20,这段时间把C++过了一遍,b站上找的讲课视频;
- 2020-2-20 ~ 3-13,在leetcode中开始了《剑指offer》第一题,把主要的题都写(抄)了一遍,大概四五十道的样子,比较花哨的题就没写了,基本上每道题写了自己的题解;
- 2020-3-3 开始,整理牛客上的C++面试宝典,然后还有github上搜的知识点汇总,比如CSNotes 、Skill-Tree 。git上有很多优质的知识点整理,我复习的主要是操作系统和计网,设计模式和数据库都抛了。
- 2020-3-15 开始投递实习,第一个面试是字节跳动,安排在3-31。
2020-3-31 ~ 4-14,连续面试,字节、腾讯、小米、蘑菇街等。
最后拿到了小米iOS的实习,但是后来北京疫情反复,又不能远程,就干脆投奔秋招了。在如今看来是一个相当后悔的决定。
实习一定要去! 实习转正 = 多一次秋招机会,而且秋招什么神仙打架难度,实习转正真的容易多了。
以上是找实习的总体时间线过程,详细内容和感受以后再展开~
秋招准备
实验室的工作持续到07-15才完全放人,但是在7月初就开始着手准备了。
- 07-07 ~ 07-15(项目):找了网上的课程做个简单项目,但是iOS真的不好找。时间都比较久远。最后做了个简单的新闻类iOS APP项目。
总结:这部分的时间显然花的太少了,面试的展开基本从项目开始,上来就是问项目有什么难点?其实不一定项目要全部完成,面面俱到。可以在一定完成度的基础上,专注于研究一两个点,从优化的角度做一些改善。在碰壁的过程中才会总结出自己的东西,这样面试有话说,过程真实,只跟着课程走,会缺少那种困扰好几天尝试很多办法才把问题解决的经历。而且面试问你难点,不是真要有什么技术突破,体现你研究问题解决问题的思维过程比较重要。 - 07-06 ~ 08-13(刷题):由于找实习期间笔试感觉很多倒在了动态规划上,所以七月份有大约20天在集中攻克动态规划专题。然后按照专题来,链表专题,树专题等。最后leetcode大概120道左右,通过的提交次数是230左右(有一些重复刷的题)。
总结:刷题要求看个人情况,算法后端通过算题刷人很严重。但是客户端来说,现在看来,当时刷的那么多动态规划基本没用上过。客户端面试基本不会问那么难,而笔试遇到的动态规划又不是我能在两个小时内写出来的。所以就有点鸡肋,当然动态规划本身还是很好玩的,以后能用到也不一定。面试最多的还是《剑指offer》,leetcode上的hot 100中的树、链表、字符串和数组,外加排序,都是基础中的基础。 - 08-15 ~ 08-25:计网和操作系统重新整理,深入理解。
总结:梳理完知识点后,多看面经。面经里会出现一些更深入和细节的问法,多看看,面试的时候才能快速反应过来,不至于尬住。 - 08-15这几天花时间重新改了简历,开始投递秋招。投递公司按照自己的医院列了个优先级,因为我想去南方,所以优先选择的是广东和上海的岗位。
总结:简历上措辞要慎重,要确保任何一个点,以及它横向纵向扩展的内容,你都是了然于胸的,不然写上去就是送命题。 - 08-04 ~ 08-11:iOS的OC语言知识点复习:新浪于海老师的一个课程梳理了一遍完整的。
- 8月底就返校了,开始宿舍里面试的日子了
- 我秋招面试过的公司是:腾讯(一面挂)、字节(offer)、虎牙(一面挂)、京东(二面挂)、网易(一面挂)、shopee(一挂)、58同城(offer)和金山WPS(没面了)。
秋招面经汇总(长文)
这里主要讲字节的7次面试吧,其他公司的单独写好了,方便大家搜索公司名字的时候能查到吧。
1、08-26-字节飞书一面
- 自我介绍,还问过是否了解swift语言。。。
- 问了UITableView使用时的感受?有什么优缺点?
- 代码的布局是用的代码还是什么?是否做过机型匹配相关的工作?
- 然后问了网络请求用的什么做的,我回答了session和AFN,然后顺势问了用过哪些第三方库。回答还用过SDwebimage。
这里好像还问了做的项目是否是有后台的?- 然后就问了sdwebimage做了什么工作,和我们直接从网络上拉图片相比有什么不同?
- 然后是get和post的区别,还是幂等性和安全性的问题,这次针对的是安全性,问:我回答post会上传数据修改服务器资源,所以是不安全的,然后反问,难道get不能上传数据吗?
- 问http有哪些头部字段?
- 问了keep alive,keep alive怎么工作?
- 有没有做过断点续传的相关工作?
- https的工作机制?
- notification的post与响应会在哪个线程?大概是这么一个问题,这个正好之前被tx问了通知是否为线程安全的?然后回去查了一下。
- 然后具体问了,如果一个类被销毁了,然后给他发送通知还会响应吗?
- 然后开始C++大礼包
- C++中的new与malloc有什么区别?
- C++虚函数工作原理
- 构造函数析构函数是否可以为虚函数
- 重载与重写?
- vector与list的区别,访问和插入的速度哪个快?为什么?
- memcopy个strcopy有什么区别???
- 算法题,数组中超过一半的数字。不能用map和set这种可以直接排血的数据结构。剑指原题。
一面比较基础,但是当时C++没来得及复习,好在算法题秒了,应该是三天内通知过了约下一面。
2、09-04-字节飞书二面
周五上午11点,飞书二面。
- 开篇自我介绍针对第三个项目,为什么要做这个项目,是怎么学习这个项目的?感觉是考察做技术的动机,和钻研的热情之类的,
- 三个项目中的难点,以及如何解决
- h5网页播放是否有性能测试(项目里的)
- C++ linux项目这个是如何做的,他的意思应该是问系统设计,但是我主要的是回答硬件设计。。。
- 自相关循环是怎么做?(通信里的)
- 第一个新闻的app,代码规模有多大?数据来源是什么?
- 有没有做过性能优化方面的工作,加载图片,多线程拉取。。。
- 多线程遇到什么问题?回答了死锁
- 多线程访问同一个资源的冲突问题,加锁,互斥锁信号量。
- 回归到基础问题了:
- iOS系统分为哪些架构?
- 遇到过哪些crash的情况?
- 了解哪些设计模式?
- delegate是如何实现的?这个是要怎么回答?我回答的委托机制如何实现,但是感觉他问的是,delegate这个代码逻辑上如何实现的。
- 沙盒机制了解吗?
- swift了解吗?如果要你用swift,自己开发一个项目,开发周期为一周,你如何做?
- 算法题,链表环入口,用了双指针,分析了一下时间复杂和空间复杂度,问进一步有没有优化空间,回答不知道,面试官解释是希望每个问题都有自己的理解,如何去提升
- 最后补充问了,要设计一个内存池,如何设计?应该实现一些什么功能?
- 知道内存碎片是什么吗?
- 职业规划?
- 反问环节:
3、09-14字节飞书三面
自我介绍;
有哪些View
用view的时候如何选择?
项目难点;
如何解决项目难点,怎么想出解决方案?
有没有实习?
死锁,死锁避免?
算法:最大连续子数组的和。
dp,优化空间,我用了原数组,然后不让用,结果改成其他变量的时候出了问题,没调试出来。。。。
三面感觉挂在了算法?09-16问了HR未通过,09-24二志愿捞。
4、09-29 字节抖音创作工具 一面
1. 最近的这个新闻APP,你负责的是什么工作?
2. 有什么难点?这里应该有一个简洁版的说法
3. 有没有用第三方框架?图片缓存?
4. NSCache有什么特点?
5. NSCache和字典有什么区别?
6. 多线程,访问会有什么问题;
7. 信号量和互斥锁
8. 互斥锁的特点以及和信号量的区别
9. 属性的多读单写
10. 然后getter方法中sync的话,不是同步吗,怎么多读?然后说现在往广度扩展一下,实际上就是深度不挖了的意思。
11. 死锁是什么?条件?避免?
12. 举一个OC中死锁的例子,或者写一段代码?这里我举例例子是dipatch_sync main queue
13. 内存映射?mmap是个什么函数?
14. 计算机是怎么存储0.1这个数的?
15. 怎么理解TCP的连接 ,可靠和字节流
16. 拥塞控制
17. 什么时候进入Close Wait状态?
18. c++中vector 和 list 有什么区别
19. map和unoder _map实现原理有什么区别?为什么有了map还要由一个unoder map?
20. 快排的复杂度,简述,然后是否稳定?
21. 算法题,池塘面积,输入输出debug遇到了一点点问题。
5、09-30字节抖音创作工具 二面
下午三点
无自我介绍,直接开怼;
- 先评价之前的面试有哪些表现不足?
- 我说广度和深度上都有不足,然后让我举例。
- 我 说浮点数这个,他说这是基础。。。
- tableview的优化有总结吗?在性能和内存上
- 内存复用,背后的数据结构,设计原则中一般会设计一个对象池,这个是怎么做?
- cell高度动态计算
- KVO的原理
- C++ 11 了解吗还是停留在03,左右值引用。
- 引用和指针的区别?
- 如果一个类存在父类,基类的虚构函数要用virtual修饰为什么?
这里我回答时举例了,如果子类具有父类没有的一些成员变量,需要调用子类的析构函数去释放空间- 如果子类没有额外的成员变量,如果子类是个空实现,没有变量没有方法,会有问题吗?
- 声明为虚函数有什么变化?
多了虚表指针和虚函数表- 虚表生成和地址引用发生在什么时期?
- OC里面怎么解决多态问题?
- 先问了多态的定义是什么?
- 分类为什么可以用来做多继承?怎么实现?
- 菱形继承问题怎么解决?什么是菱形继承?
- OC内存管理了解?引用计数的原理是什么?(OC有更高级的GC,但是iOS上只考虑引用计数)
- 引用计数为什么会导致循环引用?
- 一般怎么解决循环引用?
- weak怎么置nil?原理了解吗?
- 其他的高级内存管理,其他的GC了解吗
- JAVA的GC机制了解吗?
- 深浅拷贝?
- C++怎么做深拷贝?
- OC深拷贝
- 对于string 的copy和array的copy 是一样的吗?面试官的意思是,copy实际上调用的是copywithZone,所以不同子类复写的实现应该是不一样的。
- 限定NSArray的copy
- 那引用一个NSArray 和copy 一个NSArray的区别在哪?
- IOS怎么加载一个进程?
- iOS的虚拟内存了解吗?不了解的话说一下普通的虚拟内存。
- 缺页中断和页置换算法
- 用户态和内核态切换发生在什么时候?切换时机?
- 智力题
1、random7 求 random5
2、3L 5L 杯子 4L 水- 算法题:
给定一个char数组,使用字符+次数的方式进行压缩,次数为1时只保留字符。 返回新的char数组
in:['a','a','b','b','c','c','c','d']
out:['a', '2', 'b', '2', 'c', '3', 'd']
问:如果某个字符超过10个怎么处理?
6、10-15 字节抖音创作工具三面
上午十一点,终面面试官不是做iOS的。。。
- 这次是一个简单的自我介绍;
- 项目难点
- 缓存大概的策略,什么时候使用缓存,缓存的什么周期
- 二级缓存是还没有实现吗?我应该说还没有实现完
- 如果实现这个二级缓存的话要考虑到哪些点呢?
- APP的开发周期大概是多久?
- 代码量大概多少?评估过吗?
- 过程中有哪些收获呢?
- 项目中新闻视频的资源怎么获取的?
- Json和XML有什么区别,优劣势?
- Cell复用的原理
- 和MVC MVP MVVM?
- 了解过设计模式吗?
- 项目中有用到过观察者模式吗?
- 还有其他的设计模式吗?
- 工厂模式,描述一下?
- 依赖注入了解吗?
- iOS学习过程?通过哪些途径去学习呢?
- 看过第三方库源码吗?
- 最近有在学什么吗?
- 接触iOS多长时间了?什么时候开始学?
- git的命令了解吗?
- git的机制,怎么实现代码的管理的?思想?
- C++智能指针
- 网络里边HTTP状态码?
- 断点续传的概念?
- 输入网址的过程,DNS解析
- 数据库了解吗?查询语句之类的?
- 写个代码
反转单词,hello word变为word hello,空间复杂度O(1)
这次真的很可惜,隔了一个国庆假期都还是倒下了。最后算法题其实很简单,可是我太紧张了。。。设计模式答的也不好。本来到这里打算放弃了,第二天HR告诉我没通过,但是另一个部门有意,我想着还要煎熬三轮就想婉拒了,但是HR告诉我是另个部门的业务终面,然后我又打起精神刷了几天题,开始第七面。
7、10-21 字节跳动抖音影像终面
自我介绍
1、tableView和collectionView,如果有数据变更的时候,是这个数据源的reload还是有定向的更新?
2、开发的环境是linux的C++,c++的标准?
3、写了一段C++的代码,返回一个对象然后赋值,大概类似下面:
class A 是一个类 A GetTest() { A a; return a; } A s; s = GetTest(); 问,这个过程中调用了哪些函数?
4、操作系统的文件系统?
5、还记得操作系统的哪些内容?
6、项目中多线程场景
7、对自己的评价?在这个软开的领域有什么擅长的地方?优势
我答了比较喜欢钻研原理。然后让举个例子
8、举个例子,我就说了之前研究事件响应链的时候,在进入到APP的响应链之前,操作系统怎么做的,IOKit 到SpringBoard,然后mach port的这个流程。
9、coding了。。。。灾难
题目:S-expression解析和计算 s-expressions, sexprs, sexps是一种数据表示方法,在lisp语言里发明并流行 An s-expression is classically defined as an atom, or an expression of the form (x . y) where x and y are s-expressions. 例如,使用s-expression来表达计算: (* 2 (+ 3 4)) 结果是14 下面请写出代码来计算下面这种的s-expression的结果: atom: + - * int 第一个label一定是计算操作符:+ - * 后面一定是数字,或者expr,注意:数字可以是多个。
最后没有完全写出来。。。
10、其他公司的offer情况?什么时候能来实习?
11、后面对自己的定位,想发展成为什么样的工程师?
12、觉得读研究对自己的最大的帮助是?
13、反问,工作时间安排之类的
14、面试官补充问:喜欢什么样的工作的团队氛围和节奏?沟通上的倾向。
15、哪里人?
11-03号HR谈了offer,如释重负,一瞬间有些恍惚,我真的熬过来了。
总结一下
还是按照时间线来总结一下吧?
- 对于将来要找工作的朋友们,有一个较为明确的职业规划,或者职业方向真的很重要。
对于通信电气大类的伙伴们,无非就是
- 互联网(算法、后端、前端、客户端、测开);
- 通信类设备公司(华为、中兴、高通、OPPO、VIVO),职能种类更多大家可自查;
- 国企、央企、事业单位等(不要小看这个选择,隐形福利很多很多,而且国企大牛同样很多,只是确实氛围和互联网不一样,考验人的自我驱动能力,但是轻松不少。能不能解决户口看具体公司)
- 公务员系列(不同地区有各自的公务员岗位校招分配政策,要求一般有:党员、成绩排名前30%,国奖得主等,满足其一即可,大家多去学校的就业指导中心了解,老师们知道很多信息)
- 其他,比如外企,我身边没有直接例子的我就不展开了~
身边有提前想好要去互联网工作的同学,早早的在考研的时候就选择了偏向互联网的实验室,项目经历与工作岗位匹配,研一就开始刷题,最后不出意外轻轻松松拿到阿里的offer。
也有开始就想好去国企的,提前准备申论和行测的考试。
机会真的只留给有准备的人。而我的时间都花在偏向通信的项目,最后又不想去搞通信。且通信的话,基本上只能去华为的无线通信,中兴的基带软开,OPPO的通信协议等岗位。相对来说岗位少,待遇还是比互联网差点。而且身边充斥着去互联网的氛围,也算是被迫驱动,随波逐流吧。一如我考研的时候一般,随大流考个通信原理。本科和研究生一直没有长远一点的职业目标和方向,时间投入很分散,最后找工作就比较被动。
如果你不知道想干什么,那更不应该每天混日子了
你应该去花时间了解自己适合什么,最好的方式就是去实习。不知道自己是否适合互联网奋斗,那花几个月时间找个实习感受一下。有不少同学就是互联网实习了之后被劝退,转头就去国企的。而且多看看公司的招聘网站,了解职位要求的技能,对自己哪些方面欠缺也能有个概念。
- 对于互联网秋招本身,总结一下踩过的坑和个人的心得,希望能改大家带来些许帮助。
- 互联网秋招开始的时间:
往年都说金九银十,但是实不相瞒,我今年听到的最早的提前批,是06-05的VIVO研发招聘。我当时都惊了。然后应该是7月份的字节提前批,8月初的腾讯提前批,至此秋招全面开启。因此,大佬们都是金8银9的。当然,10月也是主要招聘时段,只是大厂少了些坑。11月基本上接近尾声,开始全面开奖,比offer、毁offer、签三方等等。
所以秋招是一个比较漫长的持久战,首先复习要开始的早。而且对于有些在实习的同学来讲,这是最艰难的时候,可能论文+实习+准备秋招都堆在了一起,但是似乎大家都是这么过来的。
其次是抱好团,信息共享,面试问题集中讨论,一人面试等于多人都有收获,互相模拟面试,查漏补缺。对了,牛客网上有个ai模拟面试,可以多试试,听听自己回答的录音,肯定会有收获的。
然后心态要平和,不要因为一时的面试表现而妄自菲薄,面试成长性也是一个重要的特质。
最后坚持就是胜利。 - 投递简历的顺序安排
我其实是想按照自己的意愿,将想去的公司分梯队投递,先面小公司练练手。奈何大厂开始的早而且普遍效率高,最后先面试的一般都是大厂。而像tx这样的基本就只有一次机会(大佬除外),所以还是要珍惜好每一次面试的机会,并且每次面试的表现都会被记录在案的哈。 - 关于内推
现在内推一般不免笔试,所以内推最大的作用是帮你了解团队内部如何,以及靠谱的查进度。因此,内推人比内推本身重要,牛客上的内推我遇到过很靠谱的,也有没什么反馈的,看选的好不好了,肯建群留微信的一般是不错的,因为你至少能找到他。当然最最最最靠谱的还是直系师兄姐了~ - 面试本身
- 现在一般都是视频远程面试,牛客网上撕代码。我一般会录个音方便后续复盘。
- 自我介绍可以稍微简要一些,重在表现概括能力,稍微引导一下前面的几个问题。
- 然后对自己的项目要熟悉,各种引申的知识点要覆盖到。
- 基础知识点就是背诵八股文了,不过也不能完全照着网上的背诵,理解过这个知识点然后用自己的话概括是最好的,回答的时候要有一些停顿。但是真的要熟练,如果问了个基础题然后还支支吾吾想半天,真的挺减分(比如我,背的太差了)。
- 常见的算法题也要刷的熟练,最好是看到就有思路。不然,面试的时候写代码真的超级紧张,跟平时写题的水平差挺多。这个就无他,唯手熟尔。不知道怎么开始的先在leetcode上多混迹一段日子,有很多大佬经常出现在高赞题解中,他们一般有自己的公众号,跟着学学套路也是不错的。
- 面试完马上复盘总结,你不知道下一次面试是不是就在明天。基本上面来面去问题都在哪些范围里,从自己的面试经历沉淀自己,提升来的最直接。
- 面试究竟集中在一段时间好,还是分散好。这个事情我觉得可以拿出来说一下:
- 集中的好处在于,背过的知识不用每次都重新捡起来,还热乎着,坏处是没有太多时间复盘,上次不会的这次又不会,很亏。
- 分散的缺点就是上次背过的这次又要拿出来背一背。我之前面试的时候总喜欢把面试推迟,安排的错开,但是这样感觉并不好,每次复习的也不会问,反而丢了面试状态。
- 我个人觉得,还是准备的差不多就冲了,拖拖拉拉也不是个事。
- 互联网秋招开始的时间:
收尾了
好像讲得够多了,先到这里收一收吧,希望大家都能拿到心仪的offer~
任何问题欢迎私信留言,知无不言~