前三篇我们聊了专业能力,今天我们来说说解决问题能力。

我认为整体分为:设计能力、编码能力、问题排查能力,这三方面。

如果说专业能力主要是考察你的知识储备的话,那么**解决问题能力,则是考察你灵活运用专业知识的能力**。

面试官问道,如何设计一个xx功能/服务/系统,这时候,上一篇文章介绍的BeafQPS方法论就派上用场了。

不仅要实现功能和业务,还要准确的识别出功能/服务/系统的难点,可能是需要高性能,或者需要高可用,或者需要高扩展,也可能是三者都要兼顾等等。

 过程中就体现了你的设计能力,**既要有敏锐的洞察力,也要有结构化的全方位思考,以及可实操的落地方**案。

以上,便是可以体现你设计能力的几个关键点~

 下面我们来说说编码能力,有不少工作经验较长的朋友,出去面试前,都不刷题,认为企业不会让自己写代码,这个侥幸心理不能有呀。

 现在越来越多的企业看重候选人的编码能力,有的团队,架构师甚至tl,工作中也时常需要写代码。

 这里推荐大家面试前要至少把经典题目刷一下,比如二分查找、快速排序、反转链表、层序遍历二叉树、给定两数之和求下标、最近公共子节点、爬楼梯的算法等。

 另外比较务实的公司会考些工程类的题目,比如懒加载的单例模式、实现生产和消费的demo、多线程交替打印有序数组、负载均衡算法等。

 还有的公司会考Sql,需要把join、group by having count、sum、avg等用法复习一下,现在leetcode上也有sql的题了,可以刷两道找找感觉。

 也有的公司会考linux,需要把awk、sed、sort、uniq等关键命令熟悉下,典型题目是统计文本中出现次数最多的ip。

 最后来说下问题排查能力,回答相关问题时,要先定位再修复。

 先从监控和异常日志入手。

 如果是业务问题,那么可能是代码bug或者网络抖动造成的业务流程中断,也可能是某种原因造成的数据不一致,现象就是业务不正确或者业务不完整。

 如果是系统问题,比如负载过高、内存不足、磁盘io过高、接口耗时变长、吞吐量降低等问题,需要借助top、jstack、free、jmap、gcutil等命令,以及apm监控和链路追踪系统,完成定位。

 **定位之后,要给出短期和中长期的解决方案**,比如负载过高,短期可以通过扩容机器来缓解,中长期可以去调整线程池参数,减少线程上下文切换次数、优化慢查询,防止请求堆积,消耗cpu和内存等。

 再比如,发现是数据不一致导致的问题,短期的话,可以完善监控,并通过修复接口手动修数据;中长期的话,如果是主从延迟问题,可以核心链路强制读主库;如果是分布式事务问题,可以采取最大努力通知、事务消息、tcc、seata等解决方案。

 解决问题能力,只靠积累专业知识是不够的,需要多实践,多总结。

 下一篇我们来聊聊沟通协作能力、成长潜力以及文化匹配,敬请期待~