2020年4月,由于公司变动,投了简历出来看看机会。这期间面试了好几家公司,在面试过程中发现了自己的很多不足,这里总结一下,算是对自己工作四年的一点反思。
关于表达能力
表达能力这一块,一直知道自己不擅长。但是经过这几次面试更加认识到,清晰和流畅的表达是非常重要的。在面试中,需要向面试官表达清楚你做的项目;在回答面试官的问题时,也需要有条理的表达。而我这的不足表现在,有时候自己脑子里是知道一件事的,但是表达的时候,条理和逻辑就不够清晰,虽然自己知道一个问题的答案,但是自己说完之后,自己能意识到自己刚才说的乱糟糟的。
关于如何提升表达能力,我认为还是要平时多沟通。所以我接下来应该多说说话,可以经常加入同事们之间argue一个问题。和产品同事多多交流,产品同事一般来说表达能力还是不错的。另外,可能沟通还有一些技巧吧,可以找一些书看看,但最重要的还是实践。
接下来自己要主要注意以下几个点,针对性的刻意练习:
- 仔细聆听对方的问题,搞清楚对方想问的是什么;
- 清晰、流畅、有条理的表达;
- 自己的项目和用到的技术要非常熟悉,自己吃饭的家伙都不熟悉的话,就甭谈什么清晰表达了;
在下次面试的时候,希望自己的表达能力有较大的进步,不拖面试的后腿。
关于技术
技术这一块,自己用到的技术自己要熟悉,这是最基本的。此外,最好能熟悉一些相关的技术,比如自己所在的公司消息队列用的是RabbitMQ,那就要思考一下,为何选择RabbitMQ?还有其他哪些消息队列产品?和RabbitMQ的区别在哪里?总之,就是在自己用到的技术方面,多思考为什么,而这个思考的过程,会带你去了解相关技术。
此外,要深入学习一些技术,不能停留在表面。这个月面试下来,发觉自己只是什么技术都会一点,但技术深度很不够,这是接下来需要重点改进的。
技术的应用场景
另外,就是思考技术的应用场景。比如:
- 多线程,在项目里哪些地方用到了多线程?
- 分布式锁,自己的项目里哪些地方用到了分布式锁?用的什么方案?会不会带来哪些问题?
- Java里的AtomicInteger,项目里哪些地方用到了?
- ....
对应用场景的思考,会进一步让你思考为何选择该技术。对于工作经验更丰富的工程师,知道的不应该只是一些技术本身,而是清晰的认识到其应用场景和局限性。
技术的总结 & 思考
最后,就是对技术的总结,并形成自己的理解。比如:
重构 / 设计模式;
你在项目中也不断重构过,那么你对重构有什么自己的理解吗?该怎么去进行重构?
并发
如果系统并发量比较高,该从哪些地方去做优化?这是一个比较大的话题,能反映出一个工程师对系统的整体理解,而不只是知道缓存、消息队列这些零散的知识点就够了,需要把这些知识整合起来。
XX 出问题了,如何排查
这些问题看似又空又大,但是能看出来一个工程师对技术的整体有没有形成自己的理解。此外,当面试官提出这类问题的时候,要意识到他不是在问你某个具体的知识点,而是考察你在项目中有没有思考和总结,以及对系统的整体把握。这部分问题尤其需要清晰且有逻辑的表达。
关于数据结构和算法
这部分从技术中提出来了,想单独说说。
其实对于大部分的公司而言,招聘时候考察算法主要还是为了筛人。所以如果你还在做软件这个行业,还要换工作,那最好是平时就巩固一下算法知识。临时抱佛脚不一定来得及。
个人认为,算法还是要多练习,三分学习七分练习,就和编程语言差不多。
我第一次接触C语言,也觉得很难,甚至毕业了也写不出工程化的代码,但是只要在公司里,在实际项目里用个三五个月,就很熟练了。唯手熟尔。
算法也是,做题的过程就是练习的过程,对我这这样资质普通的人,看了一两遍算法书后,写不出来算法题,是很正常的,不要沮丧,多练习。
总结
希望自己今后能在以上这些方面不断提升自己,不要只埋着头学技术、做项目,在关注技术细节的同时,也多从宏观进行思考。