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

最近几次 Technical Interview 的复盘

  •  
  •   iintothewind · 2 天前 · 1376 次点击

    我之前看很多资料了解到的情况就是北美面试必须要刷题, 如果不刷,很可能根本就没办法通过大厂的面试.

    因为之前大部分时间我都是在国内外企工作, 虽然也有 coding 面, 但占的比重并不是很大. 而且可能因为 2022 年以前的市场还没有这么卷吧. coding 面的题目都是很常规的题目, 如果你能给出思路, 就算你没有写出 runnable 的完整代码, 也不是大问题.

    北美的 Coding 面现状

    然后就是尝试了北美这边的面试, 可以说完全不同的风格, 这边很多面试的题目就是完全来自 leetcode, 而且是故意隐藏了很多关键细节的题目.

    比如他们会口述一道题目, 只描述基本需求,

    不会告诉你输入输出的数据类型, 当然也不会告诉你方法签名, 也不会告诉你一些具体的条件限制, 比如输入量多大, 输入数据是不是符合规范(空值,大小写,数字正负值), 和具体的边界条件

    以上这些你在实现过程中的很重要的细节, 除非你问, 否则他们一开始就不会给.

    当然, 我理解, 我们实际工作很多需求一开始也是不明确的, 是需要沟通的.

    但是做题不一样, 做题是有时间限制的. 很多细节明明很重要, 面试官是故意藏着不说的, 连 leetcode 上的题目所给的信息都比面试官口述的要多.

    基于以上情况, 可以说 coding 面, 非常非常考验运气. 如果你刷到了类似的题目, 只需要简单沟通, 确认之后你直接就可以背出来了, 两分钟足够了.

    但是如果你没有刷题, 没练习过类似题目, 你就会非常被动. 因为连输入输出你都需要确认, 然后在需要沟通确认思路, 然后再写, 整个过程下来可能你写代码的时间就非常非常短了.

    关键是, 如果对面是一个只认可最优解的面试官, coding 面如果你不练习可以说完全没戏.

    刷题所需能力与实际工作所需能力的严重脱节

    我相信很多人看到这个标题, 其实是像说刷题都不会水平肯定不行的.

    但是我看绝大多数人解题时使用的语言可以是 C,C++,java,Python,JavaScript,Typescript,Go, 好像几乎没有人用 Haskell, Scheme, Lisp, OCamel, COBOL, FORTRAN 的吧, 甚至用 Scala,Racket,Erlang,Elixir 的都很少吧.

    为什么呢? 因为这些题目都是需要你使用命令范式的语言, 临时变量, 可变数据结构, 副作用方法来解题的, 绝大部分时候你所能用的控制流也就只有 assign, if-else, for, while, break, continue 这样的简单的几个. 而且根本不会考虑线程安全问题, 因为只有单线程场景.

    但是我们实际工作中呢, 无论前后端开发, 你面对的就是多线程环境, 甚至是分布式环境, 解决的是业务层问题. 所以开发人员写代码的时候会被鼓励:

    • 使用不可变数据, 不可变数据结构,
    • 尽量减少操作的副作用,
    • 控制流由基本的赋值循环判断改为更加实用的流式输入输出,
    • 相对于声明变量多次赋值改变它的状态,我们只会声明一次, 改变之后会生成新的值
    • 用不可变集合替代可变集合, 用值类型取代可变类型
    • if-else 会被 option, filter 等 monad 取代
    • for, while 等循环会被 foreach, map, flatmap, fold, reduce 等更强大的 operator 取代
    • 为了异步我们会尽量避免副作用, 然后使用 future, promise 等 monad chain 来获取结果

    以上这些无论是前后端开发, 都是现代语言发展的趋势.

    我们使用这些语法特性来降低处理问题的复杂度, 减少代码上下文处理的心智负担, 并且使我们的代码在并发环境中更好的横向扩展.

    但是以上种种你工作中用到的所有能力, 跟 leetcode 的题目所需要的能力是没有关系的.

    另外就是还有语言的因素:

    • java 语言的 String 是不可变结构, 因此输入 String, 然后按 Character 处理的时候就非常吃力
    • 很多静态类型的语言会吃亏, 因为不同类型需要手动转换. 比如每次当你有一串字符串但你需要它是数字的时候不能直接转, 你需要一个转换函数. 动态类型就没这个烦恼.
    • 所有函数式语言在 leetcode 题目面前都得歇菜. 因为他们给出的解决方案, 那些不可变数据结构,尾递归,连时间复杂度计算都很难说清楚
    • 过时的语言比如 COBOL, FORTRAN 连上桌的机会都没有,因为根本不具备最基本的处理能力

    面对问题解决问题

    基于以上分析, 为了做题选择一门合适的刷题语言非常重要:

    • 最好是动态语言, 你就可以很方便的在不同类型之间轻松转换. 因为不是实际工作, 你不必考虑工程性问题.
    • 最好这个语言你足够熟悉, 并且很多操作的 API 你不需要查文档就直接用, 比如排序,查找,过滤,转换,聚合等等, 当然如果有可以直接使用的可变数据结构最好不过了
    • 尽量避免使用偏函数式的语言, 或者笨拙的静态语言, 别给自己找麻烦了

    所以刷题语言, Python, JavaScript, Ruby, 甚至 PHP 都还不错.

    静态语言里面 go 其实也挺适合刷题的, 因为 go 本身对函数式特性相当抵触. 大部分习惯了 Go 语言的人天生对函数式没兴趣, 而且 go 的数据结构非常少, go 的所有操作都是指令式的, 方法基本都是靠副作用实现的, 控制流是典型的 C 风格, 所以应该更习惯刷 leetcode 题.

    其它语言是有点吃亏的.

    然后就是有效刷题, 网上有很多资料教, 按照特定的套路一个类别一个类别的练习就好了, 所以我就不多说了.

    其实我本来对刷题是很不屑的, 认为这是浪费时间. 但现状是你不刷题, 大概率是没办法通过前面几轮面试的, 所以只能刷啊. 刷题就算再不合理再脱离实际, 但你想你每刷的一道题, 就是你将来每月工资的几十上百块 Money, 这是不是就是有意义的,

    所以面对现实, 刷吧, 卷嘛, 都来做小镇做题家.

    16 条回复    2025-03-02 12:48:50 +08:00
    mooyo
        1
    mooyo  
       2 天前
    不是的,你误解了,故意隐藏限制条件就是要你去问,这也是考察你的交流能力和去澄清需求的能力。最优解这个没办法,现在内卷这么严重。

    比较好奇为啥你能直接找北美的工,怎么搞定的工签。
    mooyo
        2
    mooyo  
       2 天前   ❤️ 1
    @mooyo 这个很重要啊,不然你埋头苦干一眼看穿所有的条件和最优解,写出来了也可能会挂的。
    SeaTac
        3
    SeaTac  
       2 天前 via iPhone
    我用 java 习惯了其实刷题还好 面试用 java 接受程度也高
    至于刷题 根据我看到的东西来说来看更像是保下限 即证明你有基本的 coding 能力 剩下的要看你 design / bq / culture fit
    题得刷 但是刷点基本的就好
    遇上个给你出 dp 的 move on 就行
    iintothewind
        4
    iintothewind  
    OP
       2 天前
    @mooyo #1 其实我认为这是内卷早成的, 因为故意隐藏碰上运气好, 那就是简单确认, 然后直接背答案了, 真的很没办法.
    iintothewind
        5
    iintothewind  
    OP
       2 天前
    @mooyo #1 我是已经来了然后骑驴找马, 本来一点都不想刷的, 因为之前的两份工作可能小公司的原因就没考过 leetcode, 我以为不考的多, 结果大厂都要考, 唉 :(
    iintothewind
        6
    iintothewind  
    OP
       2 天前
    @SeaTac #3 对, 刷题就是敲门砖, 所以别的不说, 就是刷就完事了.
    liprais
        7
    liprais  
       2 天前
    你以为刷题是敲门砖,其实人家只是用来把没关系的挡在外面的
    卷是没用的
    iintothewind
        8
    iintothewind  
    OP
       2 天前
    @liprais 不全部是这样的。
    wyntalgeer
        9
    wyntalgeer  
       2 天前
    据我观察国内由于 AI 辅助,风向开始由 leetcode 向工程化转了,北美你辛苦辛苦再多面几家,再探再报
    iintothewind
        10
    iintothewind  
    OP
       2 天前
    @wyntalgeer 嗯,我们再能刷也没有 AI 做的快做得好啊,只能说顺应游戏规则吧。
    RecursiveG
        11
    RecursiveG  
       1 天前
    细节全给你了怎么考察问题分析能力,缺少细节却还能给出解答反而不正常。
    入门岗位你要和大学生竞争,不是所有人都学过函数式语言,而且也不禁止你用函数式的逻辑写代码。
    RecursiveG
        12
    RecursiveG  
       1 天前
    @RecursiveG 高级岗位也有 System Design 或者 BQ ,虽然你也可以把它们当刷题那样去准备(
    iintothewind
        13
    iintothewind  
    OP
       1 天前
    @RecursiveG
    我不是应聘入门岗位。
    “ 不禁止你用函数式的逻辑写代码”,是的,但是用函数式解 leet code 题目不是为难自己吗? 所以说这是“ 刷题所需能力与实际工作所需能力的严重脱节”啊。
    VchentozV
        14
    VchentozV  
       1 天前
    国内一样啊, 面试造航母, 干活拧螺丝. 因为有造航母的能力, 所以拧螺丝大概率是不会出错的.
    ksmiloLove
        15
    ksmiloLove  
       1 天前
    说的好啊,这只是游戏规则而已
    Donaldo
        16
    Donaldo  
       1 天前
    刷题就是程序员的高考
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5349 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 06:57 · PVG 14:57 · LAX 22:57 · JFK 01:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.