【面试】互联网软件研发岗位,面试内容准备方向(技术面试考察点)
文章目录
-
-
- 1、简历筛选与面试评价
- [2、面试内容(通用 & 沟通表达)](#2、面试内容(通用 & 沟通表达))
- [3、面试内容(八股 & 基础知识)](#3、面试内容(八股 & 基础知识))
- [4、面试内容(项目 & 解决问题)](#4、面试内容(项目 & 解决问题))
- 5、面试内容(后端)
- 6、面试内容(前端)
-
1、简历筛选与面试评价
HR部门捞简历的流程
-
简历的细选
- 职位、职责、学历、工作年限、地点等等。关键词可以帮助招聘官迅速判断应聘者是否符合JD要求。
- 应聘者的主要数据。应聘者的名字、目前的职位和公司、目前职位的起始时间、以前的职位和公司、以前的职位的起始日期、应聘者教育背景。
- 应聘者最近工作经历中与JD相匹配的内容。这里有三个核心词:最近、大致、匹配 。这就是说,细选时只看重最近经历中与JD中相吻合的经验;只求"大致"匹配,不要求严格吻合。
-
细选简历的关键要点有:
- 只看"有没有",不看"配不配"。
- 在细选简历阶段,不必纠结在关键要素是否匹配上,而只是关注是否有我们需要的核心元素。在简历中所描述的职责和经验中,有没有我们在JD中所设定的"关键词"。不要"鸡蛋里挑骨头"。
-
简历的精读
-
应聘者既往经历的主要职责和工作内容;应聘者既往取得的成就和成功经验;应聘者既往的管理幅度和管理经验;简历中存在的疑问和瑕疵。
-
辨别和确认应聘者解决问题能力和经验、领导风格和经验、文化适应性、书面沟通能力、团队精神和团队建设、效率改善能力和经验等等。
-
一个在外企工作多年的应聘者转到民营企业,可能存在"水土不服"问题。再者,在日韩台企工作多年的候选人工作风格多偏于严格、服从、执行;在民企出来的应聘者抗压能力和实操能力明显强于其它,但可能缺乏高度和深度;而外企工作多年的候选人专业度、职业精神更出色。
-
既往的角色和职责:不仅仅要看应聘者做了哪些事,还要特别关注他在其中担任的角色是什么,承担的责任有哪些。"主持"项目和"参与"项目的责任不同,获得经验也不同。 对角色和职责的判断有两个关键词:"相关性"和"最近"。相关性是指应聘者在既往的工作经历中与所应聘职位的角色、职责的吻合度
-
一个既有国企、外企又有民企工作经历的应聘者,对文化的适应性肯定高于只有单一性质的企业工作经历的应聘者。在国企工作多年的应聘者可能对处理复杂人际关系得心应手;而外企应聘者自我意识会更强烈;有民营企业工作经历的应聘者抗压、抗击打能力则明显高于在其他企业的应聘者。
-
工作期间和职业发展
应聘者每一段工作经历少于三年,通常意味着应聘者的稳定性 较弱。
两段工作经历之间存在 "工作间隔" 需要引起重视。
另外,应聘者的职业发展线路是上行、下行或波浪式 ,对判断应聘者的能力和整体素质有积极意义。
当然,如果高职位是在小公司,而后来的较低的职位是在大公司,是符合职业发展逻辑的。
-
用人部门捞简历的流程
- 目标:尽可能低的成本找到更大概率能通过全部面试且和当前团队匹配的人选。
- 来源:
- 公司内部招聘网站,会对接司外主流的招聘站点,周期性同步新的简历到系统里。
- 招聘系统简历先到先得,谁先找到并发起面试流程谁就能先拥有这份简历的面试资格。
- 公司内其它部门同事沟通,任何时候都可以联系。
- 如何过滤简历(面试评价) :
- 有3个或以上团队面试过且都不通过的一般不考虑,因为多个团队都不要,一般多少有点问题
- 其它团队面试记录里反馈有比较恶劣情节的不考虑。最近一个月连续两个以上团队沟通都表示没意向的不考虑。
- 重点关注只有一个团队面试过,且初试通过,复试不过的候选人, 这个时候已有评语很重要
- 其次看有多个团队且多次通过面试记录的人选。
- 历史面试只有1次,放弃理由里没有硬伤,可以考虑再发起。
- 通用流程:
找到觉得值得面的后马上发起面试,锁定简历。
选择非正常工作时间联系,比如中午,晚上8点后。
说明自己是谁(面试官),问候选人是否方便通话,说明是从简历库里找到简历,看是否有看新机会的意向,再介绍我们做什么,问候选人是否有意向,有的话约一个时间,系统里点击安排。 - 外包流程:
外包供应商开始筛选简历并录入系统进行推送(可以要求供应商提前面试和笔试)
岗位职责:负责XXX项目的开发。
岗位需求:熟悉python编码语言和django框架,思维活跃,逻辑性强,主动性好。
备注:供应商推送简历时注意,为了加快招聘过程,提升成功率:
1.必须要先做笔试,笔试题目可以找XXX,笔试可以在线方式也可以现场,但要保证独立完成。
2.必须要在供应商侧先做一轮面试,保证基本沟通能力没问题,基本的python语言熟悉度和具备实际项目经验
3.简历推送时需要附上笔试结果和面试评价,如果没有,则部门不会筛选简历和安排面试。
2、面试内容(通用 & 沟通表达)
灵魂三连问
- 你觉得人怎么样? 【表达能力、沟通能力、学习能力、总结能力、自省改进能力、抗压能力、情绪管理能力、影响力、团队管理能力】
- 如果让他独立完成项目的设计和实现,你觉得他能胜任吗? 【系统设计能力、项目管理能力】
- 他的分析和解决问题的能力,你的评价是啥?【原理理解能力、实战应用能力】
考察目标
- 候选人的技术基础:
技术基础是基石(冰山之下的东西),占七分, 解决问题的思路和能力是落地(冰山之上露出的部分),占三分。 业务和技术基础考察,三七开。 - 分析和解决问题的能力:
技术层面:深度 + 应用能力 + 广度。 对于校招或社招 P6 级别以下,要多注重 深度 + 应用能力,广度是加分项; 在 P6 之上,可增加 广度。 - 校招:
基础扎实,思维敏捷。 主要考察内容:基础数据结构与算法、进程与并发、内存管理、系统调用与IO机制、网络协议、数据库范式与设计、设计模式、设计原则、编程习惯; - 社招:
经验丰富,里外兼修。 主要考察内容:有一定深度的基础技术机制,比如 Java 内存模型及内存泄露、 JVM 机制、类加载机制、数据库索引及查询优化、缓存、消息中间件、项目、架构设计、工程规范等。
面试内容:
- 自我介绍 : 覆盖籍贯, 爱好, 个人经历, 掌握的技能;
可以借此判断性格, 沟通表达能力, 是否有认真准备 - 项目陈述: 背景, 问题,解决方案,难点,亮点
- 工程能力: redis, mq, 缓存,性能优化, 设计能力,业界各问题类型的最新的一些组件,web安全漏洞攻防;开源项目的跟进了解和参与;一些组件源码的熟悉等,实际github上的项目分享
- 专业基础: 操作系统,数据结构,网络基础,算法基础,编码语言基础;计算机相关专业书籍的阅读
- 技能考察: 前端和后台特有的技能知识点考察
- 笔试: 在系统里约了后,如果选择方式面试,在操作界面里有推荐的笔试题入口
问题设计与面试过程
- 提前阅读候选人简历,从简历中筛选出关键词,根据这些关键词进行有针对性地问题设计。
- 比如候选人简历里提到 MVVM ,可以问 MVVM 与 MVC 的区别; 提到了观察者模式,可以谈谈观察者模式,顺便问问他还熟悉哪些设计模式。
- 可遵循"优势-标准-随机"原则:
- 首先,问他对哪方面技术感兴趣、投入较多(优势部分),根据其优势部分,阐述原理及实战应用;
- 其次,问若干标准化的问题,看看他的原理理解、实战应用如何;
- 最后,随机选一个问题,看看他的原理理解、实战应用如何;
- 对于项目同样可以如此:
- 首先,问他最有成就感的项目,技术栈、模块及关联、技术选型、设计关键问题、解决方案、实现细节、改进空间;
- 其次,问他有挫折感的项目,问题在哪里、做过什么努力、如何改进;
- 学会倾听:多问少说,让候选者多表现。根据候选者的回答适当地引导或递进或横向移动。引导候选人表现他最优势的一面,让他或她感觉好一些:毕竟一场面试双方都付出了时间和精力,不应该是面试官 Diss 候选人的场合。
- 记录重点:认真客观地记录候选人的回答,尽可能避免任何主观评价,亦不作任何加工(比如自己给总结一下,总结能力也是候选人的一个特质)。
- 作出判断:面试过程是一种铺垫,关键的是作出判断。
- 作出判断最容易陷入误区的是:贪深求全。总希望候选人技术又深入又全面。实际上,这是一种奢望。如果候选人的技术能力又深入又全面,很可能也会面临两种情况:1. 候选人有更好的选择; 2. 候选人在其它方面可能存在不足,比如团队协作方面。
- 一个比较合适的尺度是:1. 他或她的技术水平能否胜任当前工作; 2. 他或她的技术水平与同组团队成员水平如何; 3. 他或她的技术水平是否与年限相对匹配,是否有潜力胜任更复杂的任务。
- 不同年龄看重的东西不一样
- 对于三年以下的工程师,应当更看重其技术基础,因为这代表着他的未来潜能;同时也考察下他在实际开发中的体现,比如团队协作、业务经验、抗压能力、主动学习的热情和能力等。
- 对于三年以上的工程师,应当更看重其业务经验、解决问题能力,看看他或她是如何分析具体问题,在业务范畴内考察其技术基础的深度和广度。
高效考察
- 考察内存管理及算法、数据库索引、缓存、并发、系统设计、问题分析和思考能力等子主题。
- 如果候选人答不上,可以问:如果你来设计这样一个 XXX, 你会怎么做?
- 时间占比大概为 : 技术基础(25-30分钟) + 项目(20-25分钟) + 候选人提问(5-10 分钟)
3、面试内容(八股 & 基础知识)
考察思路
- 为什么不能单考察业务维度?
因为业务方面通常比较熟悉,可能就直接按照现有方案说出来了,很难考察到候选人的深入理解、横向拓展和归纳总结能力。
这一点,建议有针对性地考察下候选人的归纳总结能力:比如, 微服务搭建或开发或维护/保证系统稳定性或性能方面的过程中,你收获了哪些可以分享的经验? - 为什么要考察业务维度?
技术基础考察,容易错过的地方是,候选人的非技术能力特质,比如沟通组织能力、带项目能力、抗压能力、解决实际问题的能力、团队影响力、其它性格特质等。
考察方法:
-
是什么-为什么
是什么考察对概念的基本理解 ,为什么考察对概念的实现原理 。
比如 索引是什么? 索引是如何实现的?
-
引导-横向发问-深入发问
引导性,比如 "你对 java 同步工具熟悉吗?" 作个试探,得到肯定答复后,可以进一步问: "你熟悉哪些同步工具类?" 了解候选者的广度;
获取候选者的回答后,可以进一步问:" 谈谈 ConcurrentHashMap 或 AQS 的实现原理?"
一个人在多大程度上把技术原理能讲得清晰,包括思路和细节,说明他对技术的掌握能力有多强。
-
深度有梯度和层次的发问
设置三个深度层次的发问。每个深度层次可以对应到某个技术深度。
第一个发问是基本概念层次 ,考察候选人对概念的理解能力和深度;
第二个发问是原理机制层次 ,考察候选人对概念的内涵和外延的理解深度;
第三个发问是应用层次,考察候选人的应用能力和思维敏捷程度。
-
跳跃式/交叉式发问
比如,讲到哈希高效查找,可以谈谈哈希一致性算法 。 两者既有关联又有很多不同点。也是一种技术广度的考察方法。
-
总结性发问
比如,你在做 XXX 中,获得了哪些可以分享的经验? 考察候选人的归纳总结能力。
-
实战与理论结合
比如,候选人叙述 JVM 内存模型布局之后,可以接着问:有哪些原因可能会导致 OOM , 有哪些预防措施? 你是否遇到过内存泄露的问题? 如何排查和解决这类问题?
比如,候选人有谈到 SQL 优化和索引优化,那就正好谈谈索引的实现原理,如何建立最佳索引?
比如,候选人有谈到事务,那就正好谈谈事务实现原理,隔离级别,快照实现等;
-
熟悉与不熟悉结合
针对候选人简历上写的熟悉的部分,和没有写出的都问下。比如候选人简历上写着:熟悉 JVM 内存模型, 那我就考察下内存管理相关(熟悉部分),再考察下 Java 并发工具类(不确定是否熟悉部分)。
-
死知识与活知识结合
比如,查找算法有哪些?顺序查找、二分查找、哈希查找。这些大家通常能说出来,也是"死知识"。
这些查找算法各适用于什么场景?在你工作中,有哪些场景用到了哪些查找算法?为什么? 这些是"活知识"。
-
学习或工作中遇到的
有时,在学习和工作中遇到的问题,也可以作为面试题。
比如,最近在学习《操作系统导论》并发部分,有一章节是如何使数据结构成为线程安全的。这里就有一些可以提问的地方:如何实现一个锁?如何实现一个线程安全的计数器?如何实现一个线程安全的链表?如何实现一个线程安全的 Map ?如何提升并发的性能?
工作中遇到的问题,也可以抽象提炼出来,作为技术基础面试题。
考察中的注意点:
-
技术栈适配度发问
如果候选人(简历上所写的)使用的某些技术与本公司的技术栈比较契合,则可以针对这些技术点进行深入提问,考察候选人在这些技术点的掌握程度。如果掌握程度比较好,则技术适配度相对更高一些。
当然,这一点并不能作为筛掉那些没有使用该技术栈的候选人的依据。比如本公司使用 Mongodb 和 MySQL, 而一个候选人没有用过 Mongodb, 但使用过 MySQL, Redis, ES, HBase 等多种存储系统,那么适配度并不比仅使用过 MySQL 和 Mongodb 的候选人逊色,因为他所涉及的技术广度更大,可以推断出他有足够能力掌握 Mongodb。
-
应对背题式面试
首先,背题式面试,说明候选人至少是有做准备的。当然,对于招聘的一方来说,更希望找到有能力而不是仅记忆了知识的候选人。
应对背题式面试,可以通过 "引导-横向发问-深入发问" 的方式,先对候选人关于某个知识点的深度和广度做一个了解,然后出一道实际应用题来考察他是否能灵活使用知识。
比如 Java 线程同步机制,可以出一道题:线程 A 执行了一段代码,然后创建了一个异步任务在线程 B 中执行,线程 A 需要等待线程 B 执行完成后才能继续执行,请问怎么实现?
"理论 + 应用题"的模式。敌知我之变,而不知我变之形。变之形,不计其数。
-
实用不生僻
考察工作中频繁用到的知识、技能和能力,不考察冷僻的知识。
比如我偏向考察数据结构与算法、并发、设计 这三类。因为这三类非常基础非常核心。
-
综合串联式发问
知识之间总是相互联系着的,不要单独考察一个知识点。
设计一个初始问题,比如说查找算法,然后从这个初始问题出发,串联起各个知识点。比如:在每一个技术点上,都可以应用以上发问技巧,导向不同的问题分支。同时考察面试者的深度、广度和应用能力。
4、面试内容(项目 & 解决问题)
一般面试的开头,都是让候选人自我介绍,还是介绍最近所做的项目。
考察方向:
- 这个环节可以考察两点:
1、沟通表达能力,候选人能否清晰、准确、简练的介绍自己和项目。
2、业务理解能力,候选人能否用简短的几句话,介绍项目的实现架构、业务模型、以及所使用的技术栈。 - 遇到过不少候选人,简历上写的一堆项目,大部分都是参与开发,深入问一些细节问题,就开始支支吾吾,把锅甩到队友身上:这块功能是xxx开发的,具体细节我没去了解过。
考察目标:
- 项目经历考察不宜超过两个。因为要深入考察一个项目的详情,所占用的时间还是比较大的。
- 一般来说,会让候选人挑选一个他或她觉得最有收获的/最有挑战的/印象最深刻的/自己觉得特有意思/感受到挫折的项目。然后围绕这个项目进行发问。
- 通常是从项目背景出发,考察项目的技术栈、项目模块及交互的整体理解、项目中遇到的有挑战性的技术问题及解决方案、排查和解决问题、代码可维护性问题、工程质量保障、重来一遍可以改进哪些等。
实习与项目经历描述(简历)
- 参与XXX技术方案制定与评审,完成后端接口设计与编写,通过联调测试并上线供各部门使用;
编写XXX脚本与XXX查询接口,完成XXX前XXX资源查询;
使用Gin+Gorm+PostgreSQL与N8N工作流构建后端服务,使用XXX关联工单id解XXX问题。 - 使用XXX+XXX作为基本框架,分层编写RESTful APl(controller、service、dao)
使用Dokcer技术打包并完成API部署,编写Shell脚本保障容器正常运行。
解决问题能力考察
-
仅仅只是技术基础还不够,通常最好结合实际业务,针对他项目里的业务,抽象出技术问题进行考察。
-
解决思路重在层层递进。这一点对于面试官的要求也比较高,兼具良好的倾听能力、技术深度和业务经验。首先要仔细倾听候选人的阐述,找到适当的技术切入点,然后进行发问。如果进不去,那就容易考察失败。
-
常见问题:
性能方面 ,qps, tps 多少?采用了什么优化措施,达成了什么效果 ?如果有大数据量,如何处理?如何保证稳定性 ?
你觉得这个功能/模块/系统的关键点在哪里?有什么解决方案?
为什么使用 XXX 而不是 YYY ?
长字段如何做索引?
还有哪些方案或思路?各自的利弊?第三方对接,如何应对外部接口的不稳定性?
第三方对接,对接大量外部系统,代码可维护性?
资损场景?严重故障场景?
线上出现了 CPU 飙高,如何处理? OOM 如何处理? IO 读写尖刺,如何排查?
线上运行过程中,出现过哪些问题?如何解决的?
多个子系统之间的数据一致性问题?
如果需要新增一个 XXX 需求,如何扩展?
重来一遍,你觉得可以在哪些方面改进?
-
系统可问的关联问题:
绝大多数系统都有性能相关问题。如果没有性能问题,则说明是小系统,小系统就不值得考察了;
中大型系统通常有技术选型问题;
绝大多数系统都有改进空间;
大多数业务系统都涉及可扩展性问题和可维护性问题;大多数重要业务系统都经历过比较惨重的线上教训;
大数据量系统必定有稳定性问题;消费系统必定有时延和堆积问题;
第三方系统对接必定涉及可靠性问题;
分布式系统必定涉及可用性问题;多个子系统协同必定涉及数据一致性问题;
交易系统有资损和故障场景;
设计问题
- 比如多个机器间共享大量业务对象,这些业务对象之间有些联合字段是重复的,如何去重? 如果字段比较长,怎么处理?
- 如果瞬时有大量请求涌入,如何保证服务器的稳定性?
- 组件级别:设计一个本地缓存? 设计一个分布式缓存?
- 模块级别:设计一个任务调度模块?需要考虑什么因素?
- 系统级别:设计一个内部系统,从各个部门获取销售数据然后统计出报表。复杂性体现在哪里?关键质量属性是哪些?模块划分,模块之间的关联关系?技术选型?
5、面试内容(后端)
21届
先笔试:考察能不能做出来,编码习惯,调试技巧,异常处理意识等
再面试:
-
引入环节:
- 个人介绍, 兴趣爱好
- 是否有工作经历
- 哪里人, 工作地点&时间是否有问题
-
项目考察
-
工程能力考察:
-
redis及其应用
-
消息队列及其应用
-
缓存更新策略
-
SOLID设计原则
-
web安全漏洞攻防
-
系统的性能优化思路: 索引,缓存
-
哈希冲突解决, 一致性哈希算法等
-
IO多路复用
-
数据库容灾,主从同步等
-
-
专业基础:
-
操作系统
-
计算机网络: https TCP状态
-
数据结构基础: 红黑树,B+树,
-
数据库基础
-
编码语言基础
-
-
其它:
-
平常看的非课本的书籍
-
总结的习惯
-
对最新的一些技术热点的了解,是否有好奇心
-
是否有阅读一些组件或常见的开源项目的源码
-
是否有问题要问面试官(不能评价面试表现,统一答复需要综合简历,笔试,面试情况再看或有规定不能回答)
-
-
网络
-
数据库:
-
mysql 默认事务隔离级别 可重复读
-
乐观锁,悲观锁的区别: 排他性, ABA
-
主从同步怎么实现,MVCC
-
索引: 回表,非主键存储, B+树, 叶子节点
-
哪些字段上建索引,频繁,组合索引,性别不合适,过滤性,匹配东西很多,建立索引比较核心的考量点
-
-
数据结构:
- 哈希冲突那些解决办法:拉链法,开放定址法
-
java:
-
AOP: 干嘛的,java的做面向切面的操作, 执行特定的业务做一些切面,比如说某一个任务,完成之后设定定时任务,切面,加注解,操作完后执行完某一个行为
-
双亲委派,加载类的时候,从上往下查,类的重复加载,核心的API不会被篡改
-
GC:需要解决哪些问题
-
不同的代上去做,对于哪个代去完成任务,标记复制
-
内存的使用情况: 管理内存,了解到新建的对象是否释放, 哪些空间是空余的; 查,有的话,分配给他,没有则, GCRooter去查,不可达的要清理掉,让对象所在空间释放回收
-
stop 的worker,暂停其它线程去做内存的检索和清理,释放内存需要查到用的是哪块内存空间
-
jvm内存结构, java会有,线程私有会有程序计数器,
-
一个java文件编译出多少个class文件,一一对应,内部类
-
-
面向对象: 单一职责,开闭原则,里氏替换原则,在用面向对象时,子类只有能替换基类时才能使用这么一个基类
-
redis:
-
解决什么问题, 第三方服务,缓存,存信息,分布式锁
-
缓存: 惰性删除,定期删除,取一些key进行删除的操作,定期删除加惰性删除,内存淘汰机制
-
缓存穿透,恶意请求, 怎么防: 布隆过滤器,判断是否在这里面,没有则不请求,查明确定没有的,生成键值
-
redis: 为什么那么快,处理速度快,数据结构,内存,单线程的处理
-
常用数据结构: string , hash, set, zset, list, zset的底层实现 跳跃表, 压缩链表,跳跃表,查某一个正常查询时,挨个遍历或通过索引进行搜索,索引的方式
-
-
消息队列: 生产者,消费者模型,去做一个操作,比如说,
-
分布式事务, 解耦,限流,削峰,流量控制
-
异步处理:rabbitmq, kafka< rocketmq
-
常见的web安全漏洞,中间人攻击,https会有这样的 SQL注入,xss
-
SQL注入怎么防, mybatis,只要用到了敏感信息不能让,输入一些字段替换,而是应该通过字段,只处理数据,不让sql逻辑的一部分就可以避免
-
经典一些的计算机书籍:
linux操作系统, 并发编程,重构,讲代码的规范,设计模式,介绍灭一种设计模式的应用场景,实现的场景
github上overflow, 书
-
写文章的习惯, 常见的错误会记录,会记录不用的, word文档
-
docker 封装, GPU, docker, java 等开源项目
-
开源组件的源码, spring 的源码, MVC, spring booter, 大概的调用情况, bin的生命周期, 网上,还是和google搜的会多一点
python后台
- python GIL,性能优化,multiprocess
- python装饰器实现原理
- fun(args,**kwargs)中的args,**kwargs什么意思
- with语句的作用,原理,如何实现支持with语句的对象。ContextManager enter , exit
- python2和python3的区别
- python3的Type-Hints类型注解是什么
- python支持协程吗?
- 异常处理:
- 有语法错误的代码能运行吗?会有异常吗?什么异常?语法错误能被try except 捕获吗?: 执行时才会报错,SyntaxError,可以被捕获。
- 如何自定义异常?:集成Exception类
- 标准库有哪些常见的异常?
- 包管理
什么是python package, 什么是python module
Python 解释器是如何查找包和模块的:sys.path, site-packages,PYTHONPATH...
python
有一个查询指定用户的订单ID的http服务接口 http://a.b.c/querytrade
接受Post json格式数据 {"username": "abc"}
返回格式为json: {"success": true, "message": "error message if failures.", "data": [11111, 22223, 33333,]}
请实现一个分装实现一个函数,通过该接口查询返回对应的的订单列表,要注意函数的可靠性与健壮性。
考察点: PEP-8风格,异常处理,http请求处理,json
import requests
URL = "http://a.b.c/querytrade"
def get_user_trades(username, timeout=3):
data = {"username": username}
resp = requests.post(URL, json=data, timeout=timeout)
resp.raise_for_status()
try:
result = resp.json()
if result["success"]:
return result["data"]
else:
raise Exception(result["message"])
except ValueError as e: # if result not json format.
raise Exception("...")
写一个程序,该程序接受控制台输入两个数组,合并两个数组,并进行去重、排序
需考虑异常情况,例如输入不是数字等
6、面试内容(前端)
工程能力考察:
- git版本管理
- web安全漏洞攻防
- webpack等编译
- 编码规范(eslint)
- 本地开发调试、性能调优
- 独自搭建前后端一体化项目
专业基础:
-
js常见操作、es6新知识
-
异步编程的基础概念
-
事件循环概念
-
操作系统
-
计算机网络: https TCP状态
-
数据结构基础: 红黑树,B+树,
-
数据库基础
-
编码语言基础
-
数据库:
-
mysql 默认事务隔离级别 可重复读
-
乐观锁,悲观锁的区别: 排他性, ABA
-
主从同步怎么实现,MVCC
-
索引: 回表,非主键存储, B+树, 叶子节点
-
哪些字段上建索引,频繁,组合索引,性别不合适,过滤性,匹配东西很多,建立索引比较核心的考量点
-
-
常见的web安全漏洞,中间人攻击,https会有这样的 SQL注入,xss
- SQL注入怎么防, mybatis,只要用到了敏感信息不能让,输入一些字段替换,而是应该通过字段,只处理数据,不让sql逻辑的一部分就可以避免
- 经典一些的计算机书籍: linux操作系统, 并发编程,重构,讲代码的规范,设计模式,介绍每一种设计模式的应用场景,实现的场景
笔试题
-
请将数组[1, 2,1,...] 进行去重,不少于两种方法。
-
请写出以下代码的输出;并说明为什么(常见题)
-
有一个学生id数组:[1,2,3,4], 请写一个函数function getStudentInfo(studentIdArr),返回4个学生的额外信息。(1. 使用async await; 2.不允许出现Promise)
-
请分别提供两个函数,将下面的数组和树形结构相互转换,
-
有个页面url: 请分别使用原生js代码获取以下值
-
实现cookie的工具CookieTool,有三个方法
1)set(name, value, hours): 设置cookie的值, hours为多少小时后过期
2)get(name): 获取cookie的值
3)remove(name): 删除cookie的值
-
编写一个函数, 使得其被以下任一方式调用都可得到预期结果
1)sum(1, 2, 3) = sum(1)(2)(3);
2)sum(2, 3) = sum(2)(3)();
-
假设一个非空数组,找出出现次数最多的数字
-
写一个3列的布局,第一列和第三列都是固定宽度200px,第二列自适应铺满宽度
面试题:
-
Vue2.x 生命周期
系统自带: beforeCreate created beforeMount mounted beforeUpdate updated beforeDestroy destroyed
一旦进入到页面或者组件,会执行哪些生命周期,顺序。 beforeCreate created beforeMount mounted
-
父子组件的created和mounted的执行顺序。
执行顺序如下:父组件 created → 子组件 created → 子组件 mounted → 父组件 mounted
-
如果有多个子组件:
- 父组件created钩子结束后,依次执行子组件的created钩子
- 多个子组件的created执行顺序为父组件内子组件DOM顺序
- 多个子组件的mounted顺序无法保证,跟子组件本身复杂程度有关
- 父组件一定在所有子组件结束mounted钩子之后,才会进入mounted钩子
-
谈谈你对keep-alive的了解
- 是什么 vue系统自带的一个组件,功能:是来缓存组件的。===》提升性能
- 使用场景 就是来缓存组件,提升项目的性能。具体实现比如:首页进入到详情页,如果用户在首页每次点击都是相同的,那么详情页就没必要请求N次了,直接缓存起来就可以了,当然如果点击的不是同一个,那么就直接请求。
-
v-if和v-show区别
- 展示形式不同 v-if是 创建一个dom节点 v-show 是display:none 、 block
- 使用场景不同 初次加载v-if要比v-show好,页面不会做加载盒子 频繁切换v-show要比v-if好,创建和删除的开销太大了,显示和隐藏开销较小
-
v-if和v-for优先级:v-for的优先级要比v-if高
-
ref是什么?来获取dom的
-
nextTick是什么?获取更新后的dom内容
-
scoped原理:
- 作用:让样式在本组件中生效,不影响其他组件。 2. 原理:给节点新增自定义属性,然后css根据属性选择器添加样式。
-
Vue中如何做样式穿透
-
Vue组件传值
-
computed、methods、watch有什么区别?
- computed vs methods区别 computed是有缓存的 methods没有缓存
- computed vs watch区别 watch是监听,数据或者路由发生了改变才可以响应(执行) computed计算某一个属性的改变,如果某一个值改变了,计算属性会监听到进行返回 watch是当前监听到数据改变了,才会执行内部代码
-
props和data优先级谁高?
props ===> methods ===> data ===> computed ===>watch
-
面试题:Vuex有哪些属性?
state、getters、mutations、actions、modules state 类似于组件中data,存放数据 getters 类型于组件中computed mutations 类似于组件中methods actions 提交mutations的 modules 把以上4个属性再细分,让仓库更好管理
-
Vuex是单向数据流还是双向数据流?
Vuex是单向数据流
-
Vuex中的mutaitons和actions区别
mutaitons : 都是同步事物 actions : 可以包含任意异步操作 ***在调试中就看出来
-
Vuex如何做持久化存储
Vuex本身不是持久化存储 1. 使用localStorage自己写 2. 使用vuex-persist插件
-
Vue设置代理
module.exports = { publicPath:'./', devServer: { proxy: 'http://localhost:3000' } }
-
Vue项目打包上线
- 自测==>修改路由模式 2. 代理不生效,使用ENV 3. 修改路径
-
Vue路由模式
路由模式有俩种:history、hash
区别: 1. 表现形态不同 history:/about hash:/#/about 2. 跳转请求 history : /id ===>发送请求 hash : 不会发送请求 3. 打包后前端自测要使用hash,如果使用history会出现空白页
-
介绍一下SPA以及SPA有什么缺点
SPA是什么?单页面应用 缺点: 1. SEO优化不好 2. 性能不是特别好
-
Vue路径传值
- 显式
http://localhost:8080/about?a=1 1.1 传:this.$router.push({ path:'/about', query:{ a:1 } }) 1.2 接:this.$route.query.a
- 隐式
http://localhost:8080/about 2.1 传:this.$router.push({ name:'About', params:{ a:1 } }) 2.2 接:this.$route.params.a
- 显式
-
路由导航守卫有哪些
全局、路由独享、组件内 1. 全局 beforeEach、beforeResolve、afterEach 2. 路由独享 beforeEnter 3. 组件内 beforeRouteEnter、beforeRouteUpdate、beforeRouteLeave 使用场景:判断是否登录,如果登录就next否则就跳转到登录
更多面试题:
1.js语言:
问题 | 答案 | 考察点 |
---|---|---|
构造函数和原型链 | 1 | 考察原型到原型链 |
es6相对es5, 有哪些变化,你工作中常用的有哪些? | 考察js的基础掌握情况 | |
generator是什么? 为什么它可以实现同步写代码的能力? | 考察js的深度 | |
Promise是用来解决什么问题?前端浏览器api中,有哪些返回的是Promise实例? | 考察Promise的原理和掌握程度; | |
你喜欢用ts吗?为什么 | 对新东西的拥抱度 | |
前端页面加载优化 | 1.接口个数设计 2.并发 |
2.页面前端:
问题 | 答案 | 考察点 |
---|---|---|
跨域请求解决方案有哪几个?现在最常用的是什么? | 考察对浏览器同源策略的掌握 | |
前端发起ajax请求,常用的有**"浏览器原生api fetch"和"业界封装的axios",**优劣点是什么 | 考察ajax的掌握水平 | |
前端单页面路由实现有hash和history?各自是怎么实现的,各有什么优缺点 | 考察是否只是依赖框架,是否能独立解决路由带来的个性化难题 | |
两个按钮,点击后,请求图片并展示,如何解决网络请求延迟不确定性,导致第一个请求晚于第二个请求时,展示图片错误 | 综合设计、编码 | |
cookie、localStorage和sessionStorage 三者之间的区别以及存储、获取、删除等使用方式 | 1 | 前端本地存储方式知识点的掌握 |
3.后端nodejs
问题 | 答案 | 考察点 |
---|---|---|
nodejs是i/o密集型的,还是cpu密集型的?nodejs如何处理高并发? | 对nodejs使用的姿势 | |
nodejs是单进程还是多进程?是单线程还是多线程? | 属于nodejs经典干扰问题,答什么都是错的。nodejs即是单进程,也是多进程;即是单线程,也是多线程;关键看面试者从什么角度去看待并解答这个问题。 | |
async和await的原理 | ||
nodejs有哪些经典的"反面样例",会导致服务性能变差? | 考察实际编码能力,以及对服务的调优能力 |
4.vue和框架等
问题 | 答案 | 考察点 |
---|---|---|
vue和react的区别?以及二者通传统前端框架/库的区别 | 是否只是无脑使用框架 | |
vuex中,actions, mutations, modules的作用分别是什么 | 对vue框架的掌握和大型项目的操控 | |
双向绑定和单向数据流的区别,以及现有哪些框架采用了哪种方式?vue里面有双向绑定的例子吗? | ||
父created,父mounted,子created,子mounted 执行顺序是怎么样的 | 生命周期了解程度 | |
webpack是怎么工作的 | ||
koa框架相对express,有什么优势 | ||
项目要重构,你是怎么选择技术方案的? | 做项目的套路 |