专栏名称: 程序员鱼皮
鹅厂全栈开发,持续分享编程技法和实用项目
目录
相关文章推荐
FM93交通之声  ·  “羞于启齿!太痛苦了!”这病最近集中爆发,有 ... ·  14 小时前  
FM93交通之声  ·  46岁章子怡发文!网友:祝福! ·  2 天前  
钱江晚报  ·  冬笋、青菜便宜了!杭城部分蔬菜价格回落 ·  2 天前  
FM93交通之声  ·  冲上热搜!男子用40万转账表情包“套走”​8 ... ·  3 天前  
51好读  ›  专栏  ›  程序员鱼皮

面试官问我为啥用这个技术?我:只学了这个!

程序员鱼皮  · 公众号  ·  · 2024-05-31 11:35

正文

大家好,我是程序员鱼皮。

昨天看我们编程导航的导师 yes 哥给鱼友做模拟面试,其中有一轮问答让我绷不住了。

面试官:看你简历上写了使用 Redis 的 zset 缓存用户的收藏列表,这里为什么使用 zset 数据结构呢?

鱼友回答:因为只学了这个!

这个回答虽然 “心酸”,但对于校招生或者初学编程的同学来说,非常无敌地合理。弹幕里的小伙伴也纷纷打出 “合理” 2 字。

编程热已经持续了十多年,现在无论是前端、后端、还是其他方向,企业的需求和要学习的技术都很明确的,比如前端就是 Vue / React,后端就是一门编程语言 + 一门开发框架 + MySQL / Redis / MQ + 微服务。再加上网上有很多一条龙的学习路线(比如 鱼皮的 Java 学习路线 )和各种教学视频,导致大家时间有限的情况下,学到的技术都是差不多的。

其实这也是很经典的面试题了,下面我们来聊一聊,如果面试官问你::“为什么用这个技术?” 但你又只会这一个技术的时候,应该怎么回答才不拉跨呢?

0、换位思考

首先,要换位思考一下面试官问这个题目的意图。一场面试的时间是有限的,面试官不是吃饱了撑得想故意为难候选人,大家都是从这个阶段过来的,有些情况心知肚明。

那么面试官问这个题目,无非就这几种情况:

  1. 认为你这里的技术运用不合理
  2. 考察你的技术选型能力,以及对技术的理解
  3. 考察你的工程能力,以及解决问题的能力
  4. 考察你的技术广度,是否的学习探索精神

那么基于以上几点,我们可以针对性地去回答。

1、从需求出发

如果面试官是这么问:“咦?为什么用这个技术?” 或者 “诶?为什么用这个技术” 或者咋了咂嘴等等,在提问前加了一些表示疑惑的语气词,那么有可能他觉得你的技术运用是不合理的,或者抱有疑惑。

这个时候,你就要死守一个原则:技术是为业务服务的。

可以从需求出发,说明为什么这个技术是 能满足需求 的,而不是被面试官唬住了。

比如本文提到的 Redis zset 问题,可以这么回答:想要高效地、有序地展示用户收藏列表,所以使用 Redis 进行缓存。具体来说,用户收藏列表需要按时间排序,并且需要快速插入、删除和查找功能。Redis 的 zset 数据结构正好满足这些需求,提供了按分值排序的功能,能够高效地进行插入和删除操作,确保我们的系统能够在高并发下稳定运行。

面试官可能本来想的是 List 或 Hash 等其他数据结构,但听你讲的有理有据,就可能被你征服。

千万不要说你自己都觉得不合理,或者来一句 “别人教我这么做的”,这样就暴露了你的经验不足、并且缺乏一定的自主性。

2、技术选型

这本质上就是一个技术选型问题。很多技术都能满足需求,但为什么你偏偏选择了这个技术呢?为什么这个技术是最合适的呢?要给出你的理由。

面试官虽然没有明着提示你 “为什么用 zset 不用 hash?为什么用 Redis 不用 Caffeine?”,但如果你能够自己把更多可行的技术和方案列举出来,肯定是加分的。

可以把你了解到的同类技术说出来,简单分析一些优缺点。并解释为什么其优点能够满足当前的需求,且其缺点在当前场景下是可以接受的。比如可以按照下面的方法回答:

首先,直面问题,选择 zset 是因为它的以下优点:

  1. 有序性:能够根据分值排序,能满足我们按照时间顺序展示收藏列表的需求。
  2. 高性能:zset 在插入、删除、查找等操作上性能优异,能够快速响应用户的操作。

当然,zset 也有其缺点,比如复杂度较高。但在我们这个场景中,zset 完全能够满足需求,能够有效提升系统性能,并且内存使用较为合理。

接着,可以提一下其他可能的替代方案,并对比其优缺点,说明为什么最终选择了 zset。

比如我们也考虑过其他的数据结构,比如使用 List 或 Hash。但在对比之后发现:

  1. List 的有序性需要手动维护,并且插入和删除的性能不如 zset。
  2. Hash 虽然存储和查找简单,但缺乏有序性,无法满足按时间顺序展示的需求。

综合考虑,我选 zset。

这一通回答下来,有理有据,面试官想必要被你征服了。

当然,如果现在觉得没办法给出上面的回答,没关系的,这个是可以通过做项目、看教程、背八股练习出来的。大多数同学在做项目的过程中欠缺了一些思考,比如教程中用了某某技术,就直接跟着老师写代码了,不妨思考一下 “老师为什么用这个技术”、“有没有其他更合适的方案”。设计教程的老师在使用某个技术时,肯定也是经过仔细考量和选型的。

比如鱼皮的 OJ 判题系统项目 用到了微服务,也给出了合适的理由:

3、工程能力

通过这个问题,其实也能考察到候选人的工程能力。比如是不是在做需求前充分理解了需求、开发前先进行了技术选型和方案设计、有没有考虑到方案的合理性、开发完成后有没有验证效果等等。

很多缺乏经验的同学,知道某个技术能够实现性能优化或者空间优化,但却从来没有测试验证过。

比如对于 Redis zset 的问题,可以聊聊使用 zset 后,经过测试验证,能够存储 xx 条数据,并且操作的 qps / 响应时长为 xx%,在高并发下表现稳定,没有出现性能瓶颈等等。更充分地证明自己的技术运用是合理的。

能想到回答这些,说明你的开发经验还是很丰富的,面试官说不定就被你征服了。

4、技术广度

同一个需求可能有很多种不同的解决方案,你也可以大胆提出一些自己学过的技术,哪怕自己没有那么熟悉这些技术、哪怕其他的解决方案未必合理,也能体现出自己的技术广度、以及学习探索的精神。

比如:除了 Redis 外,我还有考虑过其他的技术,比如 MySQL、Elasticsearch、MongoDB 等。根据我的了解,Elasticsearch 的分词搜索性能很高,MongoDB 更适合存储文档类的数据,比如个人博客。但是由于我本人更熟悉 Redis 一些,所以此处选用 Redis 实现,但之后我会尝试更多的新技术,思考更多的解决方案。

这不比回答 “只学过这个” 更优雅么?虽然很欣赏你的诚实,但是有点过于诚实了,水平暴露地一览无遗,不是什么好事,也得学会给面试官画画饼。




以上就是本期分享,对于在校生或工作经验一年内的开发,以上其实不做强制要求,能多答一点就会多加一分;但对于高级开发、架构师来说,以上几点其实都是必须要回答的。共勉!

👇🏻 点击下方阅读原文,获取鱼皮往期编程干货。

往期推荐







请到「今天看啥」查看全文