V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
balabalaXMX
V2EX  ›  职场话题

后端面试—关于系统设计与项目难点

  •  
  •   balabalaXMX · 2023-02-20 09:38:04 +08:00 · 5704 次点击
    这是一个创建于 650 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近想要跳槽,找了一些面试,八股文基本上都是临时抱佛脚可以抱一下,但是项目亮点和系统设计有点不知道如何下手,有几个疑问想问问大佬们的想法。

    1. 老生常谈的项目亮点和遇到的难点是什么,这个需要说到什么粒度?比如我优化了一个本地缓存,本来是全局一个前缀树,解析字符串,根据 xxxx 的业务场景,改成了二级 map ,减小了锁的粒度。这么说是不是过于简单了?

    2. 面试官问了一个系统设计相关的题目:用户注册的用户名唯一,你会怎么设计。(原话,我想问一下上下文或者业务,面试官说要我自己想。)我说实现可以是插入 mysql 的时候使用主键来约束唯一性,问我还有没有别的办法,我没想出来。这种到底需要一个什么思路?要说得非常全面吗?

    3. 平时的工作中应该怎么挖掘和积累这种面试加分的东西?

    33 条回复    2023-02-23 10:51:57 +08:00
    silencil
        1
    silencil  
       2023-02-20 09:55:31 +08:00
    借题问一下遇到场景面试的概率大吗?我个人也没去积累系统设计相关的问题。第二个问题,我想用 hash 算法来去重是否可以,类似布隆过滤器,如果不存在才可以注册,虽然会导致一些可用的名不让注册。
    carmark
        2
    carmark  
       2023-02-20 10:02:53 +08:00
    分享下我的经验,我作为面试官期望得到的结果:
    carmark
        3
    carmark  
       2023-02-20 10:06:45 +08:00   ❤️ 3
    > 老生常谈的项目亮点和遇到的难点是什么,这个需要说到什么粒度?比如我优化了一个本地缓存,本来是全局一个前缀树,解析字符串,根据 xxxx 的业务场景,改成了二级 map ,减小了锁的粒度。这么说是不是过于简单了?

    是的简单了,我的思路是:
    1. 实际过程中,在线上业务或者 perf 测试时候发现了问题,如何发现的?这里涉及到了可观测性工具,以及 perf 工具,以及 debug 思路
    2. 找到了问题,那么就要考虑原有的结构, 如何调优,如何测试,有没有更好地思路,是否去做了探查,业界有哪些方法来解决这个问题(方法论问题)
    3. 解决完成后,看收益,要具体到数字指标
    4. 如何持续性优化思路
    EdwardXia
        4
    EdwardXia  
       2023-02-20 10:07:19 +08:00
    第二题用字典树行不行啊
    业务亮点难点这个要看运气的,感觉公司遇到棘手的技术问题了主动顶上去,解决了就是简历加分的东西
    EdwardXia
        5
    EdwardXia  
       2023-02-20 10:07:54 +08:00
    @silencil 同想到布隆过滤器,但是不知道大厂的解决方案是什么
    sadfQED2
        6
    sadfQED2  
       2023-02-20 10:24:20 +08:00 via Android
    1.没什么简单不简单的,好用才是硬道理
    2.肯定是 MySQL 查库啊,你注册接口能有多大 QPS 啊,就算被爬了,分库后查的都是从库,能有啥影响。
    3.面试官说我设计简单啥的,我一般都是直接 dis 回去
    ddzm
        7
    ddzm  
       2023-02-20 10:27:38 +08:00
    想问布隆过滤器
    echoless
        8
    echoless  
       2023-02-20 10:45:52 +08:00
    @sadfQED2 dis 回去之后, 怎么立即结束面试比较好? 有些面试确实很不舒服, 想走人.

    回楼主, system design 也有八股文, System Design Interview. 出了两版了, 而且 youtube 上也有视频版.
    agagega
        9
    agagega  
       2023-02-20 10:52:53 +08:00   ❤️ 3
    我觉得系统设计的八股文比什么 JVM 八股文或者算法题恶心多了,语言内部实现相关的坑日常工作里还可能遇到,系统设计几乎是遇不到的。如果是问刚毕业的学生这种题就更无聊了,人家念书的时候可以搞算法,可以折腾开源、看源码实现,但是谁给你接触什么高并发?
    zzzzz001
        10
    zzzzz001  
       2023-02-20 10:54:04 +08:00
    布隆过滤器因为 hash 冲突会被误判吧,直接用 mysql 唯一索引就好了吧。
    zzzzz001
        11
    zzzzz001  
       2023-02-20 10:54:24 +08:00
    @zzzzz001 这种估计面试官也水平有限
    zzzzz001
        12
    zzzzz001  
       2023-02-20 10:57:06 +08:00
    @zzzzz001 阿里规范上,对于全表唯一的数据推荐就是唯一索引,他说的意思在外层再怎么约束,基于墨菲定律总会出现相同数据,mysql 的写操作,QPS 几万也是小意思吃住
    dlmy
        13
    dlmy  
       2023-02-20 11:07:03 +08:00   ❤️ 1
    1 、首先你要吃透你自己所做的项目,然后抽取业务中最核心最难的一个模块(最好是业务闭环),用你所知道的所有方式去实现一遍;
    2 、经常性的总结复盘,多去思考如果业务体量扩大一百倍,一千倍,该怎么办?
    echoless
        14
    echoless  
       2023-02-20 11:12:21 +08:00
    @lscbqr 我花了半年时间, 把公司的慢接口基本上消灭了, 体量扩大百倍顶得住没啥问题, 然后公司业务量断崖式下跌, 被裁了.
    awalkingman
        15
    awalkingman  
       2023-02-20 11:12:56 +08:00   ❤️ 1
    @sadfQED2 我觉得 diss 的时候也可以注意下方法,不卑不亢,有理有据,不然显得咱没职业素养。
    不能因为对面没水准,就降低自己的水平。设计一个东西的时候不仅要考虑当下实现的复杂度,也要考虑后续维护的成本。通常来说越简单的东西越好维护。而且对于系统管理者而言,可维护性可能会是一个更重要的指标。
    awalkingman
        16
    awalkingman  
       2023-02-20 11:20:49 +08:00   ❤️ 4
    @wuhaoecho 客气礼貌地说,要不我们今天的面试就先到这里吧。如果对方还问,就说面试是一个双向选的机会,公司在考察个人的同时个人也在考察公司,交流下来我觉得我和这个岗位可能不太适合。说完礼貌示意直接走就行了。
    dethan
        17
    dethan  
       2023-02-20 11:23:10 +08:00 via Android
    @newskillsget #15 正解
    8355
        18
    8355  
       2023-02-20 11:47:59 +08:00   ❤️ 4
    1. 项目亮点和遇到的难点
    项目亮点主要是说你项目的特殊性 跟普通的 curd 有哪些不同 你可以说业务上有哪些特殊需求 然后技术方案上怎么处理的,难点部分主要针对你自己解决的问题,需求开发或项目运营周期内有哪些棘手比较难解决的问题例如 bug 、接口告警、性能问题等等,最后通过什么方案(不一定是技术方案)解决了,面试官想通过你解决问题的方式了解你的能力水平。

    很多人写在简历上的项目就是白开水,就算真的是你也可以有一些自己的思考,可以是你自己没有真的实现但技术能力范围可以实现的,可以介绍一下给他听,比如说你的想法需要协调很多资源最终没能实现,但你自己做过了什么调研可以确认如果按照这个方案是可以解决某些问题的,这也相当于解决了。

    2.系统设计相关的题目,当你给出一个可以实际解决问题的回答时如果面试官追问有没有别的方案,你可以说以往的工作中是这样处理的,是不是有哪里不太完善希望面试官给一些提示。

    这里有一部分问题是他自己经历过的问题最终解决了,可能你说的没有他想听到的答案或者细节,最好是反问下他到底想听什么,大部分的人都会给一些提示引导一下方向毕竟太开放了也没办法回答,实在答不出也可以邀请对方聊一下,从对方后续的回答中也可以理解下对方想问的方向如果你能继续聊两句 你也可以顺着他的思路再补充一下说刚才没完全理解题目之类的,尽量不要在这种题目把话题聊死说不会答不出等等 尽量沟通上平滑过度 不然很容易快速结束面试。。。 这种题展示的是你的思路和思考的过程,简答题知道吧。。。别空着瞎聊也聊几句

    3.平时的工作中应该怎么挖掘和积累这种面试加分的东西
    没办法只能去业务体量足够大的公司,很多这种东西没实际做过写不出来的,需要公司提供一个这样的工作环境才能成长,看视频看书学不到的。比如说 mysql 单表十亿数据就一定有性能问题吗?就一定要分表吗? 这种方案让你给你没做过你给不出来的,所以去到一个体量大的公司,公司会有架构和 DBA 以及运维联合出一个方案,你只要应用体会和学习,简历上就能写出东西了,菜鸟的成长速度除了自己努力之外还要看是否能够站在巨人肩膀上。

    后端值钱的地方就在这里,从纯 CURD 的数据库表设计者转为后端方案设计者是真的实实在在上了一个台阶。
    hyperdak288
        19
    hyperdak288  
       2023-02-20 11:53:15 +08:00
    @wuhaoecho 来自 jeff dean 的建议:面向 5x ~10x 扩展来设计系统,而不是 100x~1000x
    过多的考虑不存在的战术问题,就会耽误战略
    dlmy
        20
    dlmy  
       2023-02-20 11:53:52 +08:00   ❤️ 1
    @newskillsget 道理谁都明白,但有时候,实在是忍不了

    我去年在某头部大厂面试,二面的面试官开场就问这几个问题:
    1 、你在上家公司工作时有哪些亮点?
    2 、你为上家公司创造了什么价值?
    3 、你简历上的项目在设计上有很多缺陷,你有没有发现?
    ...

    然后各种 pua ,各种贬低跟歧视,顺便带上了我前公司(前公司也是大厂),最后我差点跟他打起来了。
    8355
        21
    8355  
       2023-02-20 12:01:27 +08:00
    其实单看问题二 一个简单的问题再加上海量的 QPS 和现存的海量数据方案一定是不一样的.

    方案的最后一层可能就是个唯一索引是没错的.
    但是你不能让所有的请求都在写库的时候才报错返回
    整个库 其他业务也一样要读写
    起码应该回答一下从缓存读取已有用户名

    那如果访问量就是大到你的用户名专用 redis 都顶不住的查询量怎么处理?
    所以公司希望你做需求给出的设计方案是考虑过这种问题
    而不是你觉得现有资源可以随意 cover 糊一糊 搞一堆屎山代码以及大量技术债务最后干不下去离职跑路其他人再来花大量时间精力擦屁股.....
    yangzhezjgs
        22
    yangzhezjgs  
       2023-02-20 12:56:17 +08:00   ❤️ 1
    其实这一块也有一些学习资料,不多大多是英文,可以去找电子版
    System Design Interview https://book.douban.com/subject/35246417/
    System Design Interview: Volume 2 https://book.douban.com/subject/35803094/
    Software Architecture: The Hard Parts https://book.douban.com/subject/35587139/
    Designing Data-Intensive Applications https://book.douban.com/subject/26197294/
    amazon 上搜 system design 还有很多其他的
    vitoliu
        23
    vitoliu  
       2023-02-20 13:34:30 +08:00
    个人认为;
    1.对项目的难点可以侧重于思考下,因为业务而选择了什么技术,而不是为了炫技,非要用厉害的技术。半个小时能让面试官清楚了解你的业务以及你的角色就行。
    2.考虑场景可以周全一些,用户名全局唯一,如果一开始就这么设计,可以通过唯一索引,ascii 码表等方式去实现。
    如果是全局改造,类似微信更换 uid ,淘宝更换用户昵称那种,那用户名肯定是不太方便用来做主键的,得站在拓展性的角度去思考。
    3.多看看竞品,每个项目多少都会有自身竞品,或者说有效仿的目标,跟着他们进行架构演进的思考——怎么去做,为什么要这么做。自然而然就能成为该领域的专家。
    caiji11
        24
    caiji11  
       2023-02-20 13:39:28 +08:00
    @lscbqr 一看这问题就是阿里吧
    gwent
        25
    gwent  
       2023-02-20 15:30:33 +08:00
    doodle123
        26
    doodle123  
       2023-02-20 20:07:35 +08:00
    如果回答数据库唯一索引的方案,要顺便说出来,逻辑删除的时候怎么处理,是不是要加上删除时间字段,用 user_name, del_flag, del_time 做个联合唯一索引
    dlmy
        27
    dlmy  
       2023-02-20 21:14:03 +08:00
    @caiji11 这你都知道,面的 国际事业部-跨境业务运营中心,pua 味道不是一般的浓,张嘴就问你有什么价值
    abelmakihara
        28
    abelmakihara  
       2023-02-21 12:31:24 +08:00
    balabalaXMX
        29
    balabalaXMX  
    OP
       2023-02-23 10:39:18 +08:00
    @lscbqr 看完你这个我觉得我也被 cpu 了,二面的时候就是一直不停地打断我,然后揪着一些字眼问,但是最后又突然很客气。三面的时候语气就更差了,经常一个问题我话还没说完,可能有一点停顿,他就立马说不要扯别的,你就是不知道对吧,然后就问下一个问题。还说那你就是普通的程序员,项目也没啥亮点和难点,可是我投递的岗位也就是普通的程序员啊....又没有投技术总监。
    balabalaXMX
        30
    balabalaXMX  
    OP
       2023-02-23 10:42:12 +08:00
    @carmark 感谢大佬,我觉得这个思路我懂了,但是这个持续性优化思路是指什么?是指加上日志和监控指标这样吗?
    balabalaXMX
        31
    balabalaXMX  
    OP
       2023-02-23 10:43:03 +08:00
    @silencil 不要太多,基本都会问的。不过有些面试官会指引你,你每次集中解决一个问题,一步一步走就好了。最怕那种上下文啥都不给你,然后就让你设计的。
    balabalaXMX
        32
    balabalaXMX  
    OP
       2023-02-23 10:49:43 +08:00
    @ddzm 我当时也想到了布隆过滤器,但是布隆过滤器只能判断一定不存在或者可能存在,那遇到可能存在的时候怎么办呢?这个只是能加快一点效率,最后还是要 MYSQL 主键去兜底。当时面试官的意思可能是我理解错了,他想问我有没有一套不用 mysql 主键的方案。
    balabalaXMX
        33
    balabalaXMX  
    OP
       2023-02-23 10:51:57 +08:00
    @doodle123 这个确实,得考虑一个数据的生命周期。学到了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2589 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 06:10 · PVG 14:10 · LAX 22:10 · JFK 01:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.