【2023秋招-2024春招】八股系列,共8篇
- 【八股】2023秋招八股复习笔记1(CSBase+部分WXG题)
- 【八股】2023秋招八股复习笔记2(C++底子 & 操纵系统)
- 【八股】2023秋招八股复习笔记3(智力题 & 非技术题50道)
- 【八股】2023秋招八股复习笔记4(MySQL & Redis等)
- 【八股】2023秋招八股复习笔记5(盘算机网络-CN)
- 【八股】2024春招八股复习笔记1(搜索推荐、AIGC)
- 【八股】2024春招八股复习笔记2(大数据开发,Java)
- 【八股】2024春招八股复习笔记3(测试、运维、安全、游戏、客户端)
【2023秋招-2024春招】笔面系列, 共5篇
- 【测评】互联网校招技术岗&非技术岗测评题型(认知测试,性格测试,心理测试)
- 【笔试】互联网校招技术研发岗 & 非技术岗笔试准备方向
- 【笔试】银行校招,信息科技岗 & 金融科技岗笔试准备方向
- 【面试】互联网软件研发岗位,面试内容准备方向(技术面试考察点)
- 【面试】国家公务员考试复试,面试内容准备方向(非技术面试考察点)
【2024应届】转行与混体制系列, 共6篇
- 开发程序员转非技术岗的解决方案(产品、运营、贩卖等)
- 开发程序员转金融finance、量化quant的解决方案(含CPA、CFA、CQF等证书要求)
- 盘算机干系专业混体制的解决方案(考公务员)
- 盘算机干系专业混体制的解决方案(奇迹编之学校与医院)
- 盘算机干系专业混体制的解决方案(国企之银行与券商)
- 盘算机干系专业混体制的解决方案(国企之把持行业)
【2024应届】升学系列,共8篇
- 盘算机干系专业提拔学历的解决方案(本科及以下)
- 盘算机干系专业提拔学历的解决方案(硕士研究生)
- 盘算机干系专业提拔学历的解决方案(博士研究生)
- 关于保研(免试攻读硕士学位研究生)的干系政策
- 【24fall】盘算机免考留学申请,配景提拔方向
- 【考研】考研5大分数线——国家线、院校线、自划线、单科线、录取线的区别
- 【2024考研】报名与择校,部分信息整理汇总(框架)
- 【2024考研】盘算机考研,4轮复习时间安排
【2023应届】就业系列,共3篇
- 互联网公司训练岗位选择与简易版职业发展规划
- 第一次找工作/训练前必要准备的东西(互联网行业)
- 2023互联网干系岗位转行与就业选择的简朴分析
合计30篇
【八股】2024春招八股复习笔记3(测试、运维、安全、游戏、客户端)
我有一个问题,既然测试、运维、安全、运营、客户端都要会开发,同时还要会许多专业范畴的知识,但是报酬和职业发展却都远远不如开发。那为什么不直接投业务开发呢(好吧可能是太卷了)
1、测试开发
1、网络 & 系统(含linux)
2、数据库,MySQL,JAVA
3、测试流程:单元测试、集成测试、系统测试
4、测试用例:筹划用例,加载慢,加载卡。
5、算法题、智力题
测试不即是测试开发
- 软件测试产业近几年一直在技术升级,经济寒冬加速推进近年来,研发盛行敏捷开发,版本高速迭代;运维部署也在逐渐自动化。
- 但软件测试范畴,企业却有两大无法忽视的痛点:
- 痛点1、互联网行业产品对产品质量和速率的诉求;
- 痛点2、市场上占比最多的功能测试工程师在工作经常出现的瓶颈。
- 当前各企业正在实施的办法,是连续建立自动化测试体系,将软件测试从手工密集升级到自动化测试体系中,通过进步测试流程的有用性和效率来消除测试瓶颈。随着“点点点”的手工测试,逐渐被自动化测试技术接受,原来必要10个手工测试完成的工作量,现在自动化测试团队不到5个人就能完成。
测试开发岗位介绍
- 测试开发的本质是助力业务乐成。感觉许多同学一上来就是学习编程技术,技术学习比较枯燥,盘算机底子知识不扎实,很快就陷入了底子知识的泥沼。
- 在我看来了解底子理论后,学习 Python,Git 等必备本领,认识一门自动化框架就可以解决测试干系的面试了。
- 自动化测试框架有:1.Robot;2.Pytest;3.Junit;4.WebDriverIO;5.Citrus;6.Selenium;7.Cypress;8.Serenity;9.Gauge;10.Carina、Junit、Selenium、TestNG、Cucumber、pytest、Appium、ATX, 参考
- Junit(白盒测试、API自动化、UI自动化)、Selenium(Web自动化、爬虫)、TestNG(白盒测试、API自动化、UI自动化)、pytest(白盒测试、API自动化、UI自动化)、ATX(移动端的UI自动化测试)
测试开发八股
- 参考1, 参考2, 参考3,参考4, 参考5
- 2020届秋招面经分类汇总(各个岗位,万字长文,共 1901 篇)
- 测试开发知识图谱,
- 经典网络题
- Python语言高频考点
- Linux常用命令
- 测开常考数据布局
- 操纵系统高频知识点
- 数据库知识点
- 测试干系知识点
- Selenium自动化测试底子实战
- Postman接口测试底子和实战测试
- 测开面试题
请你分别介绍一下单元测试、集成测试、系统测试、验收测试、回归测试,以及这内里那一步最紧张。
集成测试和系统测试的区别,以及它们的应用场景主要是什么?
黑盒与白盒的测试方法
手动测试和自动化测试的优缺点
怎样举行BUG的评测
软件质量的6个特性
请你说一说bug的周期,以及形貌一下不同类别的bug
web测试和app测试的不同点
软件测试实例
给你一个字符串,你怎么判断是不是ip地点?手写这段代码,并写出测试用例。
测试用例筹划:一串数字,闰年的鉴别
简朴的用户登录界面过程都必要做那些分析
请对这个系统做出测试用例:一个系统,多个摄像头,抓拍车牌,识别车牌,上传网上,网上展示
测试开发面经
抖音测开面经,内容许多,值得一看
底子知识
- Java
- 重写与重载
- java集合
- hashmap和hashtable的区别
- arraylist和linkedlist的区别
- map的put方法
- Java gc机制
- 垃圾回收算法:复制算法、标记-清除算法、标记-整理算法。
- 抽象类和接口的区别
- 线程的实现方式有哪些 extend Thread、implement runnable、implement callable
- Integer和int的区别
- String、StringBuilder与StringBuffer
- 内存溢出和内存泄漏
- protected,private,public
- 数据库
- 事务的特性:原子性、一致性、隔离性、持久性。
- 联合主键:设置多个字段同时为主键(PRIMARY KEY(Name, Age))
- 复合主键:多个主键联合形成一个主键组合。(结果表中的学号、课程标号)
- mysql怎么优化
- 数据库的备份是怎样实现的
- mysql创建一个门生表,包罗id(int)和name(string),主键的创建:CREATE TABLE stu(id INT (5), name VARCHAR (100), PRIMARY KEY (id));
- mysql创建索引 CREATE INDEX index_name ON table_name (column_list) CREATE INDEX idx_c4 ON t(c4);
- 数据库查询10-20行内容:select * from stu limit 10, 10;
- 创建数据库:CREATE DATABASE database_name;
- 查找135开头的电话:select * from table where tel like '135%';
- left join, right join和inner join的影响性能的因素。
- 操纵系统
- 死锁的条件、原因,死锁的必备条件
- 程序与历程
- 历程通信的方式 管道适用什么场景
- 并发和并行区别
- 并行(parallel):指在同一时候,有多条指令在多个处理器上同时实行。以是无论从微观还是从宏观来看,二者都是一起实行的。
- 并发(concurrency):指在同一时候只能有一条指令实行,但多个历程指令被快速的轮换实行,使得在宏观上具有多个历程同时实行的效果,但在微观上并不是同时实行的,只是把时间分成若干段,使多个历程快速交替的实行。
- 网络
- tcp三次握手和四次挥手
- 网络七层有哪些,tcp,udp,arp,TCP/IP都在哪一层 http,tcp,ip协议
- tcp和udp的区别、特点
- http请求方式有哪些:GET、POST、HEAD、PUT、DELETE、CONNECT、OPTIONS、TRACE。
- 拥塞控制和快重传
- TCP和UDP区别、怎么让udp实现可靠连接
- socket编程
- session与cookies区别,以及分别存储在什么地方
- 常见的状态码:502 网关错误 (Bad gateway)、504 Gateway Time-out。
- CDN
- 数据布局
- 索引提到了B树
- 数组和链表的区别,树是用什么存储的,可不可以用数组存储
- 快排的时间复杂度(NlogN)、最坏环境(N^2)
- 数据布局上的堆和栈有什么区别、底层布局是什么
- 红黑树
- 最大的K个数用什么排序算法,复杂度、同样是NlogN, 快排和堆排序有什么区别。
- python
- ()代表tuple元祖数据范例,元祖是一种不可变序列。 []代表list列表数据范例,列表是一种可变序列。
- lamda表达式:a = lambda x,y,z
x+8)*y-z
- 闭包
Linux
- VI 表现所有行的行号:vi set number
- 找到共用80端口的线程
- linux根本指令 awk、find、grep
- shell脚本:统计一个文件中重复的行和重复次数
- linux 怎样将文件从一台服务器转移到另一台服务器
- 怎样查找出现频率最高的100个ip地点
测试
- 微信发红包测试用例。
- 测试一个月饼礼盒。
- 测试的维度。
- 对收信发信举行测试
- 怎么测试微信的搜索功能。
- 测试朋友圈发布视频功能
- 假如有一部分用户反馈APP的视频加载不出来,你会从哪里方面去定位问题
- 在一个产品的周期中,你会怎么安排测试工作
- 怎么测试小程序的并发性的
- 对页面的测试、对杯子、电梯系统、三角形这些常规的测试用例,总结一下
- 对聊天举行测试
- 对朋友圈点赞举行测试
- 测试微信朋友圈评论功能
- 认识的软件测试的方法
- 电梯的测试用例
- 测试商场的支付功能,筹划测试用例
- 黑盒白盒测试
- 项目的测试用例
- 游戏的测试维度
- varchar(256) 变为 varchar(1024)测试
- 对抖音的界面举行测试
- 测试微博的革新功能
- 用户登录页面的测试
- 抖音页面怎么测试
- 微信发红包怎么测试
- 登录测试?弱网测试,无网测试怎么做?
- 测试一瓶水、测试一个矿泉水瓶
- 怎样测试用户登录界面
- 测试中怎样模拟网络环境不好的条件 fiddler
- 怎样测试一个登陆案例
- 筹划一个测试方案,生产好的矿泉水瓶要放到流水线上生产的测试方案。
- 一个手机小程序,只能输入1-100的数字,另有一个提交按钮,筹划测试用例
- 为微信的点赞功能筹划测试用例,假如点赞了但是点赞数没有加一,可能报错在哪里?网络精良的环境下,发现数据传输过程出现404的环境,你以为是什么问题。
- 给抖音的评论功能筹划测试用例
- 给你一个QQ登录界面 有一个登录按钮一个自动记住暗码的复选框 账号暗码输入框,你怎么筹划测试用例?
- 一个发帖功能(可以发文字、图片、定位),你会测试哪些方面 功能测试,网络测试,平台测试
- 然后问我假如想要上新一个新尺寸的视频,我会想要测试什么。
问题查找
- 让你筹划一个俄罗斯方块怎么筹划
- web页面空缺有哪些原因
- 测试工具loadrunner,postman,selenium用来测什么
- 分析一下少量联通用户反映刷抖音无法表现原因
算法题
- 写代码,雷同高考结果,一个表中有许多数据(无序的),给你一个结果,查出在表中的排名
- 找出这两个链表是否有相交的点
- 判断链表有没有环,环出发点在哪儿。
- 手撕topk,时间复杂度是多少。
- 写个算法,实现抢红包随机获取金额的过程参考
- 链表反转
- 两数之和(leetcode第一题~、~)
- 判断一个字符串是否为另一个字符串子串(暴力写的)
- 股票最大利润
- 实现单链表前后交织排序:1,2,3,4,5,6 酿成 1,4,2,5,3,6
- 因式分解
- 有序二叉树,一种遍历方法使
其他
- 冲突解决办法
- 假如UI和开发消极怠工,怎么办
- 假如开发以为测试出来的问题不是他的问题,怎么办
- leader堕落,搭档不共同怎么办
- 对测开的理解
- 对测试工作有什么期望
- 为什么想做测试
- 你了解的测试有哪些
- 测试与开发本质区别
- 测试主要运用哪种语言
- 对测试开发的理解
- 你对测试职位的理解
测开高频题
2、运维开发 SRE
运维开发:会点运维会点开发,SRE方向。 好比CICD部署自动化工具的建立。
运维岗:服务器环境搭建与集群部署, 网络 & 系统(linux重点),底子服务(LNMP、LAMP),脚本与工具(shell,py),安全与服务器等。
参考资料
【运维】站点可靠性工程介绍:研发,运维,SRE,Devops的关系
参考1,
Linux运维跳槽必备的40道面试精华题
2022必撸八股!198道K8s/Docker/DevOps面试真题大盘点+答案详解
运维面试题
做一个系统运维工程师必要掌握哪些必备技能?
云盘算架构师/大厂运维工程师
• Haproxy 生产环境应用实战,HaproxyACL 规则及企业级常见用法, HaprOXV 动静分离集群配置方案
• keepalived 高可用集群实战进阶,Keepalived 实现高可用集群,以及联合 Haproxy 实现生产环境常用架构
• Nosql存储Redis、Mongodb
• 监控系统 Prometheus ,用 Prometheus监控系统实现自定义指标应用
• 注册中心 Zookeeper 集群与部署, Zookeeper 完全分布式集群搭建与部署
• 消息队列 kafika,握生产环境kafka 使用场景、核心功能及安装部署
• ELK 企业级海量日记系统实战进阶
• Gitlab 及Jenkins 实现 CI/CD 可连续化集成实战,enkins、GitLab 和 Ansible 等构建自动化CI和CD流水线
• Docker 容器虚拟化实战进阶,Docker 原理、模块使用、安装、部署、生产环境配置、常见应用联合
• 主机虚拟化技术与KVM,生产环境 KVM虚拟化技术安装、部署及优化
• 微服务 Dubbo 分布式框架,服务管理及管理框架的使用,解分布式应用的概念及技术要点
• 必备技能:kubernetes ,Kubernetes安全管理、网络功能、资源应用、调理策略、应用管理及系统扩展企业级实战
美团
- 美团秋招-运维开发一面面经
- 一、面试官介绍自己以及自我介绍
- 二、问实习部分
- 华为实习都干了啥:日志分析
- 分析的流程,怎么获取某些字段
- 三、问项目部分
- 服务端的项目:主要负责哪部分,怎么和客户端通信的?用的什么协议?TCP
- 四、八股部分
- 对计算机网络的学习程度(自己说七层、五层模型、各层的协议)
- HTTP/HTTPS的区别
- TCP是哪层的
- DNS过程(提到了hosts文件,面试官问hosts文件linux在哪放着,windows下在哪)
- ssh使用的端口(22)tomcat的端口号(8080)
- Linux各种命令:grep/egrep、top、ps、如何定时关闭进程
- 有没有用过除了tomcat之外的服务器吗?比如ngnix?
- 五、手撕代码
- 输入n,求1-n每一位出现1的个数(力扣原题)
- 暴力直接秒
- 六、部门岗位介绍
- 问了为啥后端转sre、对sre的理解、要求转正实习的话多久能来?
- 美团-运维开发-二面-零售
- 如题,总共面35分钟。没有八股,全是开放
- 性问题!
- 1.面试官自我介绍,介绍部门
- 2.自我介绍
- 3.根据自我介绍,问实习和项目(主要问项目
- 的扩展开放性问题)
- 4.问1000和100000台服务器,实际情况下你想到什么?(我说了部署)nginx负载均衡
- 5.手撕代码:ab的最大公约数
- 6.目前的面试情况,美团对我的吸引力
- 7.反问:该岗位该部门,除了平常计算机知
- 识,应该学习什么;部门平常工作模式和流程
- nowcoder /creation/subject/b3d122bd313f492c80c88a826e0babb3
复制代码 面经
3、安全开发
安全开发:就加起来就是了呀,会点安全会点开发
安全岗:攻防渗透、代码审计、安全研究、工具开发
感觉比起开发很靠实践,尤其是渗透,还是多训练,多加入国护吧。
安全岗位面试题,写多了怕博客发不出来,发起移步github:
这份很全:2023届结业生-github
补充一些审计知识
- 【岗位职责】
- 参与漏洞扫描器的研发,编写相关漏洞检测 POC 基线检查相关逻辑实现 搭建相关漏洞靶场并输出相关文档 漏洞库相关的维护工作
- 【岗位要求】
- 至少实习 6 个月 熟悉常见 Web 漏洞原理 掌握基础的数据结构与算法,有一定的编程经验 思路清晰,有良好的语言表达能力 积极主动,具备良好的职业素养 加分项: 有个人技术博客或在相关安全社区发表过文章 Github 有活跃开发项目 使用 Golang/Python 开发过中小型项目
- 一面(45min)
- 1.介绍自己
- 2.介绍一下实习
- 3.场景题轰炸,主要针对实习中的场景,主要考察网络安全的基本功底
- > 证书链、TLS、加密解密.....(这一部分比较多)
- 4.开发相关知识
- > 面向对象的特性、Linux相关、Git
- 无手撕
- 二面(40min)
- 偏向于聊天,问Mysql和Redis比较多,同样问了很多密码
- 无手撕
- nowcoder /discuss/601509981006929920
- 0x00 字节跳动-渗透测试实习生
- 自我介绍
- 渗透的流程
- 信息收集如何处理子域名爆破的泛解析问题
- 如何绕过CDN查找真实ip
- phpinfo你会关注哪些信息
- 有没有了解过权限维持
- 说一个你感觉不错的漏洞,展开讲讲
- 输出到href的XSS如何防御
- samesite防御CSRF的原理
- CSRF防御
- json格式的CSRF如何防御
- 浏览器解析顺序和解码顺序
- 过滤逗号的SQL注入如何绕过
- 过滤limit后的逗号如何绕过
- fastjson相关漏洞
- 说一个你知道的python相关的漏洞(SSTI原理,利用过程,payload相关的东西)开放性问答
- 0x01 阿里云安全实习
- 时长:20分钟
- 自我介绍
- 看你简历上说擅长java、php代码审计,也没有类似的经历能够分享一下,比如说独自审的一套代码或者开源项目,从中发现的一些比较高危的问题
- 在审项目的时候,比如一个web网站,简单说说思路
- 简单描述一下什么是水平越权,什么是垂直越权,我要发现这两类漏洞,那我代码审计要注意什么地方
- 解释一下ssrf
- 怎么防御ssrf,场景:ip/?url=image.jpg
- 常见的内网段有哪些,他们的掩码是什么
- 教育系统攻防演练,分享一个渗透的例子
- 除了学校,有没有试过渗透别的系统
- 像这样的场景(给内网靶标),渗透内网系统的思路
- 反问环节(问了工作内容)
- 岗位做的是阿里云云平台安全,内部安全保障,保障阿里云自身的安全不出问题,整个系统的上线前中后过程,每个方向都有人
- 0x02 深信服-漏洞研究员实习
- 时长:15分钟
- 自我介绍
- 在xx实习的时候做什么东西
- 渗透测试的思路简单说一下
- 护网在里面担当一个什么样的角色
- 红队的一些思路
- 拿下系统后有没有做横向
- 前段时间那个log4j有研究吗,可以简单说一下吗
- (继上一个问题)有哪些混淆绕过的方法
- 内存马有没有了解过
- 冰蝎、哥斯拉这些工具有没有了解过
- 做攻击队的时候有没有研究过什么攻击,比如研究一些工具还是魔改什么的
- 那么多漏洞和攻击,比较擅长哪一个
- 说一下shiro反序列化的形成原因、利用链
- 对一些bypass的方法有没有了解过,有什么姿势可以简单介绍一下
- 反问
- 0x04 字节跳动-安全研究实习生
- 一面
- 时长:50分钟
- 你投的岗位是安全研究实习生,你了解我们这边主要是做什么的吗
- 自我介绍
- 现在有什么比较想做的方向吗,比如你写的代码审计、攻防演练、你在学校的研究方向(密码学)其实是三个大方向,现在有什么比较想做的吗
- 说了代码审计、安全研究
- 有没有审过开源框架、cms、中间件之类的
- 面试官介绍了工作内容
- 我看你简历上有几段实习经历和项目经历,先聊一下实习经历吧,在A主要做什么的
- 详细聊聊入侵检测主要在做什么,遇到的问题
- 关于入侵检测产生大量误报的原因,有没有分析过,有没有比较好的解决方法
- 和A比起来,B的应该就比较偏攻击方对吧,有打仗(雾,面试官好像确实是这么说的)有代码审计,聊一下在B主要做了些什么
- 审表达式引擎的步骤和思路
- 刚刚你说的审计听起来好像和普通开发的审计差不多,都是通过程序流、文档去做,有没有从安全方面入手审计一些项目
- xxe是怎么造成的,从代码层面来看
- 我看你简历有很多攻防演练经历对吧,这几段攻防演练经历有没有哪一次印象比较深刻的,挑一个聊一聊
- 你的这次攻击好像更多的是利用弱口令,有没有一些更有技巧的方法
- 这个头像上传的webshell是怎么上传的
- 还有什么其他的检验方式?要怎么绕过?
- 这两天log4j漏洞很火,有没有去了解一下
- 面试官最后介绍业务
复制代码 4、运营开发/应用开发(全栈)
运营开发:前端+后端+测试+数据+运维, 主打一个全栈。面试一般可以参照后端作为标准。
应用开发
- 1、简朴来说,就是内部运营系统,研发职称系统的开发,其实本质上与测试开发、运维开发区别不大,不外更加接近业务一些。 也可以理解为是ToB的业务。
- 2、因为自己不带来贸易代价,以是一般大厂才会养,而且团队比较精简,推崇全栈的方式。 必要干系的专业范畴知识,但又不是涉及业务的那种。 这些特点与上面的那些测试、安全、运维开发都是一致的。
运营开发
- 运营开发是公司中的一种岗位,主要职责是负责开发和维护各种在线应用程序和系统,确保它们的稳定性、性能和安全性。运营开发通常与软件工程师、系统管理员、网络工程师和数据分析师等专业人员互助,以确保应用程序和系统的运行顺畅,并及时解决任何可能的故障。
- 运营开发的工作内容包罗但不限于:开发、测试、部署和维护软件应用程序和系统;监控和分析应用程序和系统的性能和举动,发现并解决问题;编写脚本和工具以自动化各种任务和流程;与其他团队互助,确保应用程序和系统与其他组件和服务的互操纵性。
- 总的来说,运营开发是一种必要高度技术本领和团队互助精力的岗位,必要对盘算机科学和信息技术有深入的了解,并具备一定的编程和系统管理本领。
- 运营开发的说法好像是企鹅特有的,不外其他公司也会有同样性子的岗位,换个说法。
- 运营开发:前端+后端+测试+数据+运维, 主打一个全栈。面试一般可以参照后端作为标准。
牛客话题
面经
5、客户端:PC & 移动 & 游戏
- 根本与后端保持一致,侧重系统 & 网络,数据库mysql&redis部分相对问的较少。
- 重点会问系统干系的开发,PC客户端主要是C++开发经验。
- 移动客户端:前端干系的flutter,Android,IOS等**。
- 游戏客户端:补充一些游戏引擎:UE4、图形学等
客户端就业近况, 奉劝那些想做客户端开发学弟学妹们!
- 客户端通常面临的环境是单机的环境,但是因为直接面临用户的设备,以是环境总是处于一个复杂和不可控的环境中,面临的设备范例比较多,各种设备范例又会有不同的环境,例如不同呆板的屏幕大小不一样,必要做不同的适配,不同厂商的推送服务,配景管理策略等等不太一样,造成体验的不一致,不同设备的内存空间,磁盘大小等也不一样,必要有一些相对应的优化手段。因为客户端通常直接面向用户的体验,以是对UI的展示,用户的操纵等等这块会比较敏感。
- 有后选后 肺腑良言。互联网整体环境不乐观,现在没有新的大型app出现了,没有增量。客户端残留开发人员众多但岗位减少,导致要求越来越苛刻。而且大前端趋势、跨平台方案频出、小程序肆虐,原生客户端不再是应用开发唯一的方案,中小公司已经没有了客户端的需求,大公司新业务也是跨端方案。客户端就是一门江河日下的夕阳技术 再不跳船就要淹死了。
- 另有最紧张的一点,客户端在国企银行证券没有岗位,他们只有系统开发工程师是做系统的,客户端无法上岸只能35被裁。客户端就是画UI的,上限太低,有的大型app会自己造些轮子,但是出去了没需求,不通用。后端做系统才是刚需。劝退不是搞笑,都是血泪凝结的经验总结。
- 无脑后端,前途无量,预定高管;其次前端,需求频仍,温饱有余;算法数据,收入可观,高端饭碗;测试开发,也可一战,顺手一点,月入过万。走投无路,回家种田,日出日落,生活美满。鬼迷心窍,来客户端,技术拉胯,UI切图,面试火箭,不到三年,全部玩完,65在后,绿帽在前,苦口婆心,金玉良言,奉劝诸位,擦亮双眼。
客户端就业市场的供需环境, 关于没有技术壁垒,
客户端八股
- 根本与后端保持一致,侧重系统 & 网络,数据库mysql&redis部分相对问的较少。
- 重点会问系统干系的开发,PC客户端主要是C++开发经验。
- 移动客户端会有,前端干系的flutter,Android,IOS等。
- 游戏客户端会补充一些游戏引擎:UE4、图形学等
——————————————游戏客户端————————————————
——————————————PC客户端+1————————————————
常见JD
- 能力要求:有3年以上使用C/C++进行Windows系统客户端软件开发经验;有工具类,尤其是图片编辑相关业务经验优先;熟悉OpenCL/OpenGL/ CUDA和shader编写优先。
- 能力要求:有3年以上使用C/C++进行Windows系统客户端软件开发经验;有加速器/VPN/SDN等开发经验优先;熟悉Wintun/WFP(Windows Filtering Platform)/openVPN等网络驱动优先。
复制代码 常晤面经
——————————————附PC客户端面经9篇————————————————
岗位JD
- 快手-客户端开发工程师
- 全职
- 工程类 - 客户端
- 北京、杭州
- 2024-03-25
- 职位描述
- 1、负责快手各产品的客户端设计与开发;
- 2、负责基础模块和组件的研发和维护;
- 3、关注性能,提升客户端用户体验。
- 任职要求
- 1、本科及以上学历,计算机相关专业优先;
- 2、有扎实的计算机基础知识,掌握算法和数据结构,熟悉计算机网络知识;
- 3、掌握一种及以上的编程语言,C++/Java/Objective-C语言优先;
- 4、熟悉面向对象的设计思想。
- 加分项:
- 1、有客户端相关实际项目经验或互联网公司实习经验者优先;
- 2、开源社区活跃贡献者优先,有OI、ICPC等相关竞赛经验者优先。
复制代码 1、
- 快手客户端一面
- 1、计算机网络 拥塞控制,http/ https 请求方法
- 慢开始:1、2、4、8 …增长非常快
- 拥塞避免:到达门限后每次+1,超时就门限/2,重新执行慢开始。
- 快重传:收到三个重复确认,例如收到三个 M2,则 M3 丢失,立即重传 M3。
- 快恢复:此时令门限=窗口/2,窗口从新门限开始拥塞避免。
- 2、进程线程,线程有哪些资源,栈中保存什么,函数调用的时候压栈怎么样的,
- 线程私有,线程上下文:所属线程的栈区、程序计数器、栈指针以及函数运行使用的寄存器。
- 栈存储局部变量和函数参数的线性结构。
- 函数调用前,先把返回地址。压栈,然后把当前函数的指针压栈。
- 3、c++项目完整流程,静态链接库和动态链接库有什么区别,动态链接库怎么装载到内存的
- 动态通常用.so为后缀,静态用.a为后缀。
- 动态运行时载入,静态编译时载入。
- 4、虚拟内存,中断,操作系统的锁,自己实现一个读写锁
- 虚拟内存是操作系统提供的一种内存管理技术,它使得应用程序能够访问大于物理内存容量的地址空间。通过虚拟内存,每个进程都认为自己拥有独立的连续内存空间,并且可以访问其中的数据。
- 中断是计算机系统中的一种事件,它可以打断正在执行的程序,转而去执行一段特殊的程序(中断处理程序),以响应某个事件的发生。中断可以来自各种不同的事件,例如外部设备的请求、时钟中断、错误事件等。
- 中断的主要作用是提高系统的并发性和响应性。通过中断,系统可以及时地响应外部设备的请求,而不需要等待设备的完成。当中断发生时,当前正在执行的程序会被暂停,系统会跳转到中断处理程序进行处理,处理完毕后再返回到原来的程序继续执行。
- 操作系统的锁:
- 操作系统的锁是一种同步机制,用于控制多个进程或线程对共享资源的访问。它可以确保在任意给定时间只有一个进程或线程可以访问共享资源,从而避免了并发访问可能导致的数据不一致或竞态条件的问题。
- 常见的操作系统锁包括互斥锁(Mutex)、读写锁(ReadWrite Lock)、条件变量(Condition Variable)等。
- 自己实现一个读写锁:
- 下面是一个简单的读写锁的实现,基于互斥锁和条件变量:
- 在读取状态下,多个线程可以同时获取读取锁,但无法获取写入锁。只有在没有线程获取写入锁时,才能获取读取锁。
- 在写入状态下,只能有一个线程获取写入锁,而其他线程无法获取读取锁或写入锁。只有在没有线程获取读取锁或写入锁时,才能获取写入锁。
- 读写锁的主要方法包括:
- lockRead():获取读取锁,如果有其他线程正在写入或有活跃的写入锁,则阻塞等待。
- unlockRead():释放读取锁,如果没有其他线程获取读取锁,则通知等待的写入线程或唤醒其他等待读取锁的线程。
- lockWrite():获取写入锁,如果有其他线程正在读取或写入,则阻塞等待。
- unlockWrite():释放写入锁,如果没有其他线程获取写入锁,优先唤醒等待的写入线程,否则唤醒等待读取锁的线程。
- 5、算法题 二叉树层序遍历 构建一个二叉树测试
- nowcoder /feed/main/detail/559605511ed54dff8a1e604ccec04d88
复制代码 2、
- 快手客户端开发一面
- 面试官 商业化
- 问题
- 1.浏览器输入网址回车后,都发生了什么
- zhuanlan.zhihu /p/80551769
- dailichun /2018/03/12/whenyouenteraurl.html
- URL 解析
- DNS 查询、TCP 连接(构造请求,三次握手,ARP找路,广播传输)
- 处理请求、接受响应、渲染页面
- a:三次握手
- 1.1三次握手多一次少一次行不行,为什么不行。
- 1.2tcp和udp的区别
- 2.http和https区别,七层模型,http在哪一层?
- 3.了解域名吗,有什么用,了解dns吗。
- CA获取 SSL 证书。这些网站会在交换数据之前先与浏览器共享该证书。默认端口 443
- http无状态:
- 也就是说服务器不维护任何有关客户端过去所发请求的消息。这其实是一种懒政,有状态协议会更加复杂,需要维护状态(历史信息),而且如果客户或服务器失效,会产生状态的不一致,解决这种不一致的代价更高。
- 51cto /article/701195.html
- SSL 3.0 进一步升级,新版本被命名为 TLS 1.0
- 4.进程和线程
- 进程是资源分配的最小单位,线程是CPU 调度的最小单位,一个进程可以有多个线程
- 进程编程调试简单可靠性高,但是创建销毁开销大;
- 线程正相反,开销小,切换速度快,但是编程调试相对复杂。
- 进程通信:管道、系统IPC(包括消息队列、信号量、信号、共享内存等)、以及套接字socket
- 线程通信:临界区,互斥量,信号量,事件。
- 5.线程中的互斥锁和xx锁
- 主要用于线程互斥
- 当进入临界区时,需要获得互斥锁并且加锁;
- 当离开临界区时,需要对互斥锁解锁,以唤醒其他等待该互斥锁的线程。
- 6.cpp的面相对象相比面相过程有什么优势
- a:不用重复造轮子,效率高。继承封装多态
- 7.cpp多态是什么
- 8.写完代码后,代码运行变成二进制数中间有什么过程。
- 算法题:
- 判断链表是否有环
- 怎么判断环的长度。
- nowcoder /feed/main/detail/a4df659040494b8fa4e7bef2ee35abf7
复制代码 3、
- 快手客户端一面
- 自我介绍,然后项目经历不是很匹配,面试小哥让我给他科普一下
- 然后开始问:
- 1.进程线程区别,进程资源类型(不确定),线程切换方式,线程通信方式,线程池概念(到这不会了)
- 2.tcp与udp区别,http与https区别,http1.0 2.0 3.0区别,https概念,packet协议(到这里不会了)
- HTTP1.1继承了HTTP1.0的简单,克服了HTTP1.0性能上的问题(支持长连接)。
- HTTP2.0,二进制分帧,多路复用,头部压缩,服务器推送。
- HTTP3.0,减少了tcp三次握手时间,以及tls握手时间
- 解决了http 2.0中前一个stream丢包导致后一个stream被阻塞的问题
- 优化了重传策略,重传包和原包的编号不同,降低后续重传计算的消耗
- 连接迁移,不再用tcp四元组确定一个连接,而是用一个64位随机数来确定这个连接更合适的流量控制
- 包(Packet)是TCP/IP协议通信传输中的数据单位
- packet协议是由用户构造mac头和数据部分,系统只负责发送和接收,mac头收到数据包的时候,根据mac头判断出上层协议,然后遍历packet_type链表,找出对应的协议,再把数据包分发给他处理
- 3.智能指针,菱形继承,lambda表达式原理,C++11的新特性,C++中锁的类型(到这里不会了)
- 菱形继承:
- 由于最底层的派生类继承了两个基类,同时这两个基类有继承的是一个基类,故而会造成最顶部基类的两次调用,会造成数据冗余及二义性问题。
- lambda表达式原理:
- 创建 lambda匿名类,实现构造函数。创建 lambda 对象。通过对象调用 operator()。
- C++11的新特性:
- auto,nullptr,引用,构造函数初始化列表,智能指针,array 以及tuple。
- C++中锁的类型:
- 多线程中的锁主要有五类:互斥锁、条件锁、自旋锁、读写锁、递归锁。
- 4.设计模式,说了几种
- zhuanlan.zhihu /p/128145128
- 《设计模式:可复用面向对象软件的基础》
- 1、创建对象
- + 单例:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
- + 工厂:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类。
- + 抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
- + 原型:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
- 2、对象之间的组合和关系
- + 适配器:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。(读卡器)
- + 装饰器:允许向一个现有的对象添加新的功能,同时又不改变其结构。(形状装饰上不同的颜色,同时又不改变形状)
- + 代理:(快捷方式,代售点)创建具有现有对象的对象,以便向外界提供功能接口。为其他对象提供一种代理以控制对这个对象的访问。
- + 外观:(接待人员,挂号、门诊、划价、取药)为子系统中的一组接口提供一个一致的界面
- + 桥接:(开关内外)一个作为桥接的接口,使得实体类的功能独立于接口实现类。
- + 组合:(操作数、操作符和另一个操作数)把一组相似的对象当作一个单一的对象
- + 享元:(数据库连接池)减少创建对象的数量,以减少内存占用和提高性能。
- 3、对象之间的通信和交互
- + 观察者:(消息队列),对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新
- + 备忘录:(ctrl+z,后退)捕获一个对象的内部状态,并在该对象之外保存这个状态。
- + 迭代器:(迭代器)提供一种方法顺序访问一个聚合对象中各个元素,而又无须暴露该对象的内部表示。
- + 模板(直接丢一个实体就可以保存):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。
- + 策略:我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的context对象。
- + 中介者:MVC框架,其中C(控制器)就是M(模型)和V(视图)的中介者。
- 5.然后就是一个手撕,给一个"("和")"组成的串,求里面配对的"()"个数,实际上就一个栈,
- 然后面试小哥说还有时间,让我用动归尝试一下,最后尝试出来一个不知道对不对,
- 总之他让我简单说一下就过去了。
- nowcoder /feed/main/detail/fd567863994f4d139aa3a8164b1fcfab
复制代码 4、
- 秋招首面快手-客户端开发工程师一面凉经
- 我本来投的手子都是嵌入式与linux岗位,结果到部门筛选都挂了;就瞎投了客户端软件开发,手子莫名奇妙给了个面,诚惶诚恐!!!下面记录一下面试过程:
- 1、CPU的最小时间周期是什么?(计算机中最基本的、最小的时间单位。在一个时钟周期内,CPU完成一个最基本的动作。)
- 2、CPU的指令怎么使用?(通过改变寄存器中的内容)
- 3、进程间的通信方式(管道,消息队列,套接字)
- 4、介绍一下虚拟内存到物理内存的映射
- 虚拟内存分页:
- 首先,虚拟内存被划分为固定大小的页(通常是4KB)。每个页都有一个唯一的虚拟页号。
- 物理内存分页:
- 同样地,物理内存也被分为固定大小的页,与虚拟内存页的大小相同。每个物理页都有一个唯一的物理页号。
- 页表:
- 操作系统维护一个称为页表的数据结构,用于记录虚拟页号与物理页号之间的映射关系。页表通常以树状结构组织,以支持大型的虚拟地址空间。
- 虚拟内存映射:
- 当应用程序访问虚拟内存时,操作系统会根据页表将虚拟页号转换为物理页号。如果虚拟页号在页表中存在对应的映射关系,那么操作系统会找到相应的物理页号,并使用内存管理单元(MMU)将虚拟地址转换为物理地址。
- 缺页中断:
- 如果虚拟页号在页表中不存在对应的映射关系,那么会触发缺页中断。操作系统会暂停应用程序的执行,并尝试从磁盘或其他存储介质中加载相应的物理页到物理内存中。之后,操作系统会更新页表,建立新的虚拟页号与物理页号的映射关系,并恢复应用程序的执行。
- 内存访问权限:
- 页表中的每个映射条目还可以包含关于内存访问权限的信息,例如读、写、执行等。操作系统可以根据这些权限设置来保护内存的安全性,防止应用程序越界访问或非法操作。
- 5、内存页的大小
- 6、内存页大小越大越好?还是越小越好,大了有什么影响、小了有什么影响
- 7、说一下缺页中断
- 内存页的大小是一个在设计虚拟内存系统时需要仔细考虑的参数,不同的页大小会对系统的性能和内存管理产生不同的影响。下面是对内存页大小对系统性能和内存管理的影响的一般性描述:
- 较大的内存页大小的优点:
- 较小的页表:较大的页大小可以减少页表所需的条目数,因为每个页表条目对应的内存范围更大。这减少了页表的大小,从而减少了内存开销和页表访问的时间。
- 较少的页表缓存(TLB)缺失:TLB是用于加速虚拟地址到物理地址转换的高速缓存。较大的页大小可以减少TLB缺失的概率,因为同一虚拟地址范围内的多个页可能被映射到同一个物理页,从而提高了转换的效率。
- 较少的页面表维护开销:较大的页大小减少了页表的数量,从而减少了页面表的创建、销毁和维护的开销。
- 较大的内存页大小的缺点:
- 内部碎片:较大的页大小可能导致内部碎片的增加。如果一个页面中只有一小部分被使用,那么剩余部分的空间就会被浪费,造成内存的浪费。
- 更新开销:如果一个较大的页面被多个进程或线程共享,当其中一个进程或线程修改了页面的某个部分时,整个页面都需要被复制到新的物理页中,这可能导致较大的开销。
- 较小的内存页大小的优点:
- 较小的内部碎片:较小的页大小可以减少内部碎片,因为更小的页可以更好地匹配应用程序的内存使用模式,减少未使用部分的浪费。
- 较小的更新开销:较小的页大小使得在共享页面进行修改时只需要复制更少的数据,减少了更新的开销。
- 较小的内存页大小的缺点:
- 较大的页表:较小的页大小会导致页表中的条目数量增加,增加了内存开销和页表访问的时间。
- 较高的TLB缺失率:较小的页大小增加了TLB缺失的概率,因为同一虚拟地址范围内的多个页需要映射到不同的物理页。
- 8、说一下什么是内存交换
- 内存交换(Memory Swapping)是一种操作系统中的内存管理技术,它允许将某些当前不活动的进程或进程的部分内容从主存(物理内存)移出,以释放内存空间,并将其存储到辅助存储设备(通常是硬盘)上,从而实现对内存的有效利用。
- 10、说一下ios七层网络模型
- 11、网络层有哪些协议
- 12、DNS了解吗?
- 手撕算法:二维数组顺时针打印输出
- (函数写出来了,最后调试语法错了,被面试官结束)
- #如何判断面试是否凉了##面试中的破防瞬间
- nowcoder /feed/main/detail/0f666dbb4d9945589c3a6c563d8dc8d7
复制代码 5、
- 快手游戏客户端一面凉经
- 挂了就放面经系列.jpg
- 1,自我介绍
- 2,做一道题:一副牌,能不能全凑成顺子和同花
- 3,对C++是什么级别的认知。
- 4,内联函数可不可以是虚函数
- 内联函数的展开:内联函数在编译时被展开,其代码会直接插入到调用处,以避免函数调用的开销。然而,虚函数的调用涉及到一系列复杂的机制,包括虚函数表的访问和函数指针的解引用等。这些机制使得内联函数和虚函数的实现方式存在冲突。
- 虚函数调用的机制:虚函数的调用需要在运行时根据对象的实际类型进行查找,这涉及到虚函数表(vtable)的查找和动态绑定。而内联函数在编译时展开,不需要进行运行时的查找和绑定。
- 内联函数的覆盖问题:虚函数的覆盖是通过在派生类中重新定义相同的函数签名来实现的。而内联函数的展开是在编译时进行的,编译器在编译时无法确定要展开的是基类的内联函数还是派生类的内联函数,因此无法正确实现覆盖的语义。
- 5,New和malloc有什么区别
- 6,多态有几种
- 7,静态多态是什么,动态多态是什么?
- 多态的实现主要分为静态多态和动态多态,
- 静态多态主要是重载,在编译的时候就已经确定;
- 动态多态是用虚函数机制实现的,在运行期间动态绑定。
- 举个例子:一个父类类型的指针指向一个子类对象时候,使用父类的指针去调用子类中重写了的父类中的虚函数的时候,会调用子类重写过后的函数,在父类中声明为加了virtual 关键字的函数,在子类中重写时候不需要加virtual也是虚函数。
- 8,什么是拷贝构造函数
- 9, 什么情况下要自己写拷贝构造函数
- 10, 什么是移动构造函数
- 11, 深拷贝和浅拷贝区别
- 拷贝构造函数(Copy Constructor)是一种特殊的构造函数,用于创建一个新对象,其内容与另一个同类对象完全相同。它的参数是同类对象的引用(通常是const引用),用于指定要进行拷贝的对象。拷贝构造函数通常用于对象的初始化,包括通过值传递参数、返回对象副本、以及在函数中创建新对象等情况。
- 自己编写拷贝构造函数的情况包括以下几种:
- a. 当类中包含指针成员变量时,需要进行深拷贝,确保在拷贝构造过程中创建新的资源副本,而不是简单地复制指针的值。
- b. 当类中包含非静态的引用成员变量时,需要确保在拷贝构造过程中正确处理引用的初始化。
- c. 当类中包含资源管理的成员变量,如文件句柄、数据库连接等,需要确保在拷贝构造过程中正确处理资源的拷贝或所有权转移。
- d. 当需要自定义对象的拷贝行为,例如需要记录对象的拷贝次数或拷贝过程中进行某些特殊操作时。
- 移动构造函数(Move Constructor)是C++11引入的特性,用于高效地将临时对象或将要销毁的对象的资源转移给新创建的对象,而不进行深拷贝。移动构造函数的参数是同类对象的右值引用,并通过使用移动语义实现资源的转移。移动构造函数通常用于提高性能,避免不必要的资源拷贝开销。
- 12, 虚函数表是什么,原理是什么? 对应
- 13, 虚函数表底层是怎么存放的? 链表
- 14, 虚函数表是在什么阶段被初始化的
- 在有虚函数的类中,类的最开始部分是一个虚函数表的指针,这个指针指向一个虚函数表,表中放了虚函数的地址,实际的虚函数在代码段(.text)中。
- 当子类继承了父类的时候也会继承其虚函数表,当子类重写父类中虚函数时候,会将其继承到的虚函数表中的地址替换为重新写的函数地址。使用了虚函数,会增加访问内存开销,降低效率。
- 虚函数表在编译阶段被创建,并在程序运行时被初始化。
- 15, 析构函数为什么要用虚函数
- 析构函数需要使用虚函数是为了实现多态的析构。当基类指针或引用指向派生类对象时,如果析构函数不被声明为虚函数,那么在删除该对象时,只会调用基类的析构函数,而不会调用派生类的析构函数。这样会导致派生类中的资源无法正确释放,可能引发内存泄漏或行为不一致的问题。
- 通过将基类的析构函数声明为虚函数(使用关键字virtual),可以实现动态绑定,确保在删除派生类对象时,会首先调用派生类的析构函数,然后再调用基类的析构函数。这样可以保证派生类中的资源得到正确释放,确保对象的完整析构。
- 16, 构造函数为什么不能用虚函数
- 构造函数不能使用虚函数是因为在对象的构造过程中,对象的类型是逐渐从基类向派生类转变的。在基类的构造函数中,对象的类型尚未完全确定,因此无法实现动态绑定。
- 虚函数的动态绑定是根据对象的实际类型来决定调用哪个函数,而在构造函数中,对象的实际类型正在逐步构建中,无法确定具体的派生类类型。因此,构造函数只能根据静态类型(即构造函数所属的类)进行函数调用,无法实现动态多态性。
- 17, 构造函数里可以用虚函数呢?
- 在构造函数中可以调用虚函数,但需要注意的是,由于对象的类型在构造函数中逐步构建,因此在基类的构造函数中调用的虚函数只能是当前类定义的虚函数,而不是派生类中重写的虚函数。这是因为派生类的构造函数尚未执行,派生类中的虚函数尚未就绪。
- 这种情况下,调用的虚函数会被静态绑定到当前类的版本,而不是派生类的版本。这可能导致意外结果或不一致行为,因此在构造函数中调用虚函数应该谨慎使用,并确保只调用当前类中定义的虚函数,避免依赖派生类的行为。
- C++中的虚函数动态绑定是一种运行时多态的机制,它允许在基类指针或引用指向派生类对象时,根据对象的实际类型来确定调用的函数。这种动态绑定的机制使得程序可以根据对象的实际类型来决定调用哪个函数,而不仅仅局限于基类的声明类型。这样就实现了多态性,即在相同的函数调用语法下,不同的对象可以表现出不同的行为。
- 虚函数动态绑定的关键点是,它将函数调用的决策推迟到运行时,以便根据对象的实际类型来进行动态调度。这提供了更大的灵活性和扩展性,使得派生类可以通过重写基类的虚函数来改变或扩展基类的行为,而不需要修改基类的代码。
- 18, 虚析构函数是动态多态还是静态多态
- 19, 菱形继承怎么解决?
- 虚析构函数是动态多态。动态多态是指在运行时根据对象的实际类型来确定调用的函数,而不是根据指针或引用的静态类型。虚析构函数可以实现动态绑定,确保在删除派生类对象时正确调用派生类的析构函数,以防止内存泄漏。
- a. 冗余数据:派生类中包含了两份相同的基类成员,造成了冗余的数据存储。
- b. 命名冲突:派生类继承了两个具有相同成员函数或成员变量的基类,当通过派生类对象访问这些成员时,会出现二义性和命名冲突。
- 为了解决菱形继承问题,C++提供了虚继承(Virtual Inheritance)的机制。
- 通过在继承关系中使用virtual关键字,可以确保在派生类中只包含一份共同基类的实例。这样做可以解决冗余数据和命名冲突的问题。在菱形继承中,需要将共同基类标记为虚基类,即在派生类对该基类的继承声明中使用virtual关键字。这样,派生类中只会包含一份虚基类的实例,避免了冗余数据和命名冲突。
- 20, map和hashmap有什么区别
- 21, 哈希表的底层原理是什么?
- 22, 你如何构造一个哈希表
- 23, Vector什么时候会访问失效(迭代器失效)(push_back容量不足,搬迁了)
- 24, Vector的扩容机制
- 25, 红黑树的底层原理是什么(红黑树就是AVL树的加强版,满足最长路径一定超过最短路径的两倍,又不要求绝对平衡)
- 26, 红黑树的复杂度,哈希表的复杂度
- 27, 什么时候用map,什么时候用hashmap
- 28, Map,你要从里面删一堆数据,你要怎么做(使用 Iterator 迭代器删除、stream过滤删除)
- 29, 对lua有了解吗(用c实现的开源脚本,比较轻量,用于游戏的快速开发)
- 我C++,只能说确实是平庸,答得很差,TAT,挂了也确实合情合理。
- 希望能找到工作吧。
- nowcoder /feed/main/detail/7816d40f3fdb46a6ba89c890b1ea733a
复制代码 6、
- 快手客户端一面
- 面试官:你这简历好像专门搞 Java 的为什么投客户端?
- 我:那肯定简历在 Java 岗筛不过去啊
- 然后答完 jvm 内存模型,说你既然说到了垃圾回收,那我就来问问你垃圾回收算法
- 我:????我没说啊,啥时候说了??
- 然后全程在问 jvm,然后了 volatile ,都挖到操作系统了,最后一道单例收尾,最后吐槽一下,大众哪哪都好,就是会议室网巨差连续两次了(虽然面试官也差),希望快点挂了我吧,我想从头再来 #如何判断面试是否凉了#
- nowcoder /feed/main/detail/6fd5a38d41e14103abc803b43c2e9661
复制代码 7、
- 快手客户端一面凉经 凉透了
- 全程八股 数据库,框架,中间件一点没问,操作系统一点没问,JVM,并发编程也没问
- 面试官先说我专业技能和这个岗不太匹配,问我有意愿转客户端开发吗(为啥java和客户端开发不匹配啊?面试官说客户端不用框架,所以我简历上的项目在面试的时候也没意义)
- jdk jre jvm关系
- 反射的对象和new的对象的区别
- 一个class文件从编写到执行的过程
- hashmap底层源码
- https原理
- tcp和udp的区别
- tcp如何保证可靠传输,超时重传基于什么协议
- threallocal底层原理,底层用的什么数据结构,扩容过程
- throwable接口
- Serilizable序列化的意义,有什么用
- 如何实现一个类的5个对象中3个对象要序列化,另外2个不序列化
- serialVersionUID是什么
- 数字证书保存在服务端还是客户端(数字证书通常是保存在客户端)
- 对称与非对称加密的区别,都有哪些算法是加密,哪些算法是解密(
- 对称:DES 、 3DES 、 AES
- 非对称:RSA 、DSA(数字签名用)、 ECC椭圆曲线,ECC(移动设备用)
- )
- token session cookie的区别(
- Cookie是由服务器发送给客户端,并由客户端存储在本地的小型文本文件。客户端在每次请求中通过将Cookie包含在请求头中发送给服务器。Cookie可以被客户端修改和删除,但受同源策略的限制。
- Session是服务器端的一种状态管理机制,用于跟踪用户在应用程序中的会话状态。服务器在用户首次访问时创建一个唯一的会话ID,并将该ID存储在Cookie中或通过URL重写传递给客户端。
- 令牌是身份验证和授权的凭证,用于跨请求进行身份验证和授权。
- session会话是服务器端的状态管理机制,用于跟踪用户的会话状态和存储会话数据。
- Cookie是在客户端存储数据的机制,可以用于存储用户信息和状态。
- )
- 手写单例模式(用于确保一个类只有一个实例,并提供一个全局访问点。)
- nowcoder /feed/main/detail/229b0b047c75469e9ac4c910a0983aa2
复制代码 8、
9、
- 快手客户端一面(40min)
- 自我介绍
- 1.ArrayList的扩容机制?
- 2.底层实现?深拷贝还是浅拷贝?
- 3.单例模式
- 4.懒汉线程安全?
- 单例模式分为懒汉式和饿汉式,今天主要来讲讲其中的懒汉式,懒汉式因为要实现懒加载(使用时再创建对象),所以存在线程安全问题。
- 5.多线程下如何保证类的线程安全?
- 单例模式:主要解决一个全局使用的类频繁的创建和销毁的问题。
- 单例模式下可以确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
- 1)饿汉式:基于class loader 机制避免多线程的同步问题,不过,instance 在类装载时就实例化,可能会产生垃圾对象。
- 2)懒汉式:通过双重锁机制实现线程安全。
- 使用锁机制,防止多次访问,可以这样,第一次判断为空不加锁,若为空,再进行加锁判断是否为空,若为空则生成对象。
- 6.CopyOnWriteArrayList底层实现?如何实现线程安全?
- 7.HTTP支持长链接吗?什么时候开始支持的?
- 8.长连接什么时候会释放?
- 如果客户端在完后一个HTTP 请求后,在60 秒内都没有再发起新的请求,定时器的时间一到,就会触发回调函数来释放该连接。
- 9.服务端通过timeout还是探测决定是否关闭长连接?
- 10.TCP有没有这种关闭连接的方式?
- 服务端关闭长连接的方式可以通过两种方式进行决定:timeout(超时)和探测。
- TCP协议提供了一种双向的连接关闭方式,即通过发送FIN(Finish)数据包来关闭连接。TCP连接的关闭是一个经过握手的过程,称为四次挥手(Four-Way Handshake)。
- HTTP 1.0 中默认是关闭的,需要在http头加入"Connection: Keep-Alive",才能启用Keep-Alive;
- HTTP 1.1 中默认启用Keep-Alive,如果加入"Connection: close ",才关闭。
- keep-alive 是客户端和服务端的一个约定,如果开启 keep-alive,则服务端在返回 response 后不关闭 TCP 连接;
- 同样的,在接收完响应报文后,客户端也不关闭连接,发送下一个 HTTP 请求时会重用该连接。
- 在HTTP协议中,Keep-Alive属性保持连接的时间长短是由服务端决定的,通常配置都是在几十秒左右。
- 11.算法题:给你一个数组,和一个数字m,问这个数组中存不存在一个子序列(不一定连续),使得它的和为m,输出true或false
- 12.反问
- 感觉面的挺一般的,没问项目也没问MySQL、Redis、MQ,甚至没问JVM,40分钟就面完了,面试官人很好,全程在引导
- nowcoder /discuss/521996343180599296
复制代码 10、
- ### 项目
- 自我介绍。
- 讲一下github的开源项目
- 好几个项目,讲一下亮点
- 前端后端业务逻辑上的实现(java三层怎么实现的,api请求过程,存在本地后)
- 上传下载功能实现(调api库)
- 怎么分工的
- ### 八股
- #### 计网
- tcp三次握手,为什么不能两次
- tcp和udp的区别
- tcp滑动窗口的过程讲一下
- 浏览器输入url
- 拥塞控制,流量控制的方法,
- dns解析的原理
- 网络层arp怎么找主机
- tcp和http的关系
- socket的流程,进行实现?
- tcp怎么保证安全?
- #### C++
- 栈和队列的区别
- 数组和链表区别,vector扩容,数组添加一个元素
- hashmap了解吗,底层实现,构造类
- hashmap安全怎么实现的
- hashmap扩容实现?
- 多线程下如何保证类的线程安全(单例模式)
- #### 系统
- 互斥量怎么实现的。
- 线程池了解吗?
- 生产者消费者模式
- 拥塞控制是生产者消费者吗
- ### 算法
- 翻转m到n的链表,写完逐行读代码。
- vector存储后翻转,变量名规范,记录3个关键位置。
- 算法基本功很扎实,回答的都很不错,基础知识多了解一些。
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |