记一次当面试官的心得体会

229 阅读8分钟

前言

最近两个月当面试官,面试了几个面试者,发现都遇到了一些问题。针对二面(领导面)写了一些总结和心得体会,也算是对自己这两年的日常工作的一次总结吧,技术方面的不多说,非技术方面的是我们程序员的通病,大部分都是我平时跟领导的交流当中学习到的。

这篇文章并不是只针对面试者,平时日常工作也应该按照这些思路去做,相信应该会对程序员的个人成长和升职有所帮助,也告诉大家平时应该以什么样的心态来完成任务和解决问题、要思考哪些方面,而不是永远当一颗没有思想的螺丝钉。

技术相关

技术相关的不多说,根据来笔者公司的面试者的情况,二面可以重点关注一下

  1. 可以适当补充自己一面里面比较薄弱的热门技术,比如:

    • 多线程,线程同步、RxJava、Kotlin协程(了解)
    • 算法和数据结构,可以重点看一看LRU算法还有HashMap
    • 设计模式可以看看一下常用的
    • 性能优化,重点关注卡顿分析、ANR
  2. 源码阅读分析能力(领导比较看重源码阅读分析和学习能力)

    • 源码相关的,可以看一下Framework源码、三方库的可以看下OkHtpp、Glide、Retrofit之类的,不详细展开

    • 如何学习源码:

      按照最简单的API用法,顺藤摸瓜,先把时序图画出来,总结归纳整个调用流程,然后可以尝试画类的架构图,了解各个类直接的关系 看不懂的情况下可以结合其他人的博客、书籍等等 从源码里面提取一些设计思想,应用到实际项目当中(领导应该会比较欣赏这种知识借鉴能力)

    • 要有学习热情

非技术相关

  1. 团队角色划分

非技术相关的情况,首先要关注你公司或者团队的人员组成,这个相信大家都比较熟悉。通常来说,一个团队的组成和职责划分如下:

部门经理
管理下面很多东西,一般不需要跟部门经理打交道

技术主管
负责技术团队管理,沟通、解决组里面技术问题、组织会议/分享、解决疑难杂症、成员的心理辅导等

项目经理
负责协调不同部门、负责项目进度的把控等

产品经理
负责提出和设计产品需求

交互设计
负责程序功能的人机交互设计,如动画效果、点击跳转流程等,输出交互设计稿

视觉设计
负责视觉设计,输出视觉设计稿,比如文字多大、用什么颜色、字体等

动效设计
负责动效设计,输出动效设计稿,比如动画类型、动画时长、插值器等各个参数

开发
一般分为服务端和Android客户端、前端等

测试
负责功能测试、稳定性测试、外网稳定性问题收集等,一般会给我们提交BUG单

2. 需求如何分析

一般会涉及三大评审(实际工作中不一定都会有)

  • 需求评审
  • 视觉交互评审
  • 技术评审

评审过程中需要思考以及提出的点(纵观大局,以项目负责人的思维、把自己换成不同角色去思考)(重点)

  • 涉及到广告、与三方合作涉及营收相关的时候,需要考虑:财务结算方面是否对接好,可能需要财务的同事再进一步沟通
  • 涉及到第三方SDK、第三方内容接入的:合同是否签好;资质审核是否通过(比如说某个SDK对接入方有日活的要求);应用的隐私协议是否需要法务同事帮忙修改;第三方内容(比如音视频)是否有经营许可证;考虑需要哪些应用敏感权限,SDK是否已经提供详细说明;SDK与目前的APP的兼容性问题(比如说Android版本、是否为AndroidX);考虑接入某些SDK后安装包体积问题;SDK与目前的APP的视觉和交互是否符合规范,SDK能否作出适配和修改等等
  • 风险预知、风险预估和把控能力:某些特殊的需求上线后用户是否会投诉,是否需要服务端动态配置上架下架
  • 遇到不明白或者有疑惑、产品考虑不周全的点,要及时记录、提出、修正、讨论,及时与不同项目角色沟通(沟通能力)
  • 考虑需求的整体进度:需要考虑并预留到视觉、交互、服务端的时间,然后还有自己的时间进安排、预留BUGFIX/突发情况(比如其它任务的并行介入)的时间等(项目整理把控能力)
  1. 需求如何设计

你被安排一个相对比较大的需求的时候,在需求评审之后到需求发布这个阶段,你可能需要精力下面这些阶段,考虑下面这些问题:

  1. 可行性分析:列出不同的方案以及优缺点对比、列出大概需要哪些API/接入哪些SDK

  2. 设计阶段:业务逻辑/流程比较复杂的情况下,可以进行UML建模,可以画流程图、时序图、类的架构图(一定要回答上来);任务如何拆分、如何与其他同事合作

  3. 代码编写:分支管理(比如在哪个分支节点去做)、注意代码格式/命名规范、代码的边界(比如判空)、关注程序的性能问题、稳定性和健壮性、可扩展性(比如通过抽象出接口来适配不同的情况)

  4. 提测阶段:及时关注静态代码扫描,及时发现代码质量问题;及时关注自动化测试问题;及时修复测试指出的BUG

  5. 发布阶段:及时关注线上的崩溃率,及时修复各种稳定性问题

  6. 其它:

    • 整理各种文档和资源,根据不同版本存放到不同的文件夹里面,方便日后翻阅和日后的项目交接,包括需求文档、视觉稿、交互稿、动效参数稿、埋点文档
    • 有时间可以编写技术文档,分为两种,一种是项目/需求设计相关的文档,比如上面提到的UML建模,可以画流程图、时序图、类的架构图;一种纯技术点相关的文档,比如需求用到了事件分发拦截,也可以写写文档
    • 考虑团队的整体技术水平的提高:有时间可以把文档整理起来,做成简单的PPT,进行技术分享(建议回答上来)
    • 考虑团队的整体效益和效率:除了写文档总结和分享经验之外,还可以把一些通用的繁琐的东西做成一个工具(形式诸如一个插件、SDK等等),分享给团队或者公司的其他同事,提高大家的效率;团队应该是合作关系而不是竞争关系

总结

面试的时候一定要根据不同情况随机应变,一定要根据不同的面试阶段预测面试官想听什么,对于二面,应该比较看中:

  1. 你个人的学习能力、学习热情、学习方法
  2. 你思考问题是否周全
  3. 你的项目经验怎么样
  4. 文档的编写和整理能力
  5. 组织技术分享能力,是否能够帮助提高给团队的整体技术水平
  6. 沟通能力、协调能力

抓住这些核心点,把上面的说出来,面试官应该会比较满意,其实这些能力在日常工作中也是比较重要的。

最后,无论是面试还是日常工作,一定要揣测领导关心什么,领导想听你说什么、领导想看你写什么:

比如说领导需要你写工作汇报的时候:

  1. 你除了写你某段时间完成了什么内容
  2. 还需要标注这些内容的进度情况如何、时间节点如何

比如说领导需要你写工作绩效的时候:

  1. 你除了写你某段时间完成了什么内容
  2. 还需要标注这些内容给公司/团队带来了哪些实际收益
  3. 考虑团队的整体技术水平的提高:你可以写你做了哪些技术分享、写了哪些项目文档/技术文档
  4. 考虑团队的整体效益和效率:你可以写你做了哪些工具/SDK、整理了哪些踩坑经验、为其他人节省了时间/提高了团队效率
  5. 学习、引入了哪些新技术、新SDK(这个需要看你领导是激进还是保守),保持平时学习的态度

比如说领导跟你一起去参加各种评审的时候:

  1. 你一定要思考周全(按照我上面说的那些,什么财务、隐私权限、法务、视觉规范、兼容性等等)
  2. 及时指出和讨论(体现你的沟通、协调能力)

总体来说,考虑团队整体效益、思考问题是否周全、架构设计、沟通协调、写文档等非技术相关的能力的欠缺往往都是程序员的通病,日常工作当中,最好以团队管理者的角度,从上往下去看待工作当中遇到的各种问题,相信你一定会为团队里面的中流砥柱甚至是管理者,共勉!