2021年9月18日星期六

面小厂就比面大厂更容易吗?

在我做 career coaching 的过程中,我发现不少人觉得「如果进不了大厂的话,那就降低一点目标,总能进小厂吧」,然后他们发现小厂 offer 也拿不到,于是怀疑自己能力是不是如此之差。大家从升学考试的经验出发,「进不了这一档次的学校就尝试下一档次的学校吧」,把这种逻辑推广到「进不了大厂就尝试小厂吧」看起来很合理,但很不幸人才和公司的匹配并不适用这种模式。


我时常用这样一个比喻来描述大厂和小厂招聘的本质区别:

大厂招聘,就如同 Walmart(沃尔玛)去采购两吨苹果用来上架。作为一家超市,Walmart 肯定有一套经过长期优化的采购标准,一个苹果只要满足采购标准 Walmart 就愿意要。Walmart 不在乎这些满足标准的苹果之间有什么个体差异,因为绝大部分都会被顾客买走,一小部分会卖不掉然后烂掉,但这早已在营收当中考虑到,Walmart 并不会亏钱。

小厂招聘,就如同个人消费者去买两个苹果。无论你个人对挑选苹果有什么准则,你肯定会按照你的准则挑选两个最好的。每个人的挑选准则都不太一样,如果有足够多的消费者,绝大部分的苹果都会被买走。

应聘时你就如同是一个苹果。如果你想被 Walmart 采购,你就要满足 Walmart 的采购标准。但因为 Walmart 是一个非常成熟的超市,所以采购标准相对稳定和可预测,反而更容易有针对性地做优化。如果你想被个人消费者挑选,反而很难抓住具体的某一个消费者让他挑你。每一个个人消费者的挑选准则都不太一样,你猜不到当前在挑苹果的这一位消费者是怎么想的,如果他不挑你你也没有办法,再等下一位消费者吧。这个过程比较看缘分。


为什么大厂和小厂的招聘模式会截然不同?

小厂招聘往往是针对一个或几个很具体的职位做的。举个例子,公司创业一开始还没找到产品方向,想要招一两个什么都懂但不用太精通的全栈工程师,创始人想要尝试做什么产品,熬个夜第二天就把原型做出来了。尝试了多个产品方向后,公司终于找到了一个靠谱的方向,开始缓慢地有用户积累,顺便招个前端工程师来打磨用户体验。用户增长持续加速,当初熬夜写出来那个单体后端已经支撑不住了,于是要招个有 micro-service 经验的后端工程师来重新设计后端架构,把后端拆成多个服务,并且为将来 sharding 做准备。服务拆了之后,单体数据库通过 replica 还撑了一段时间,终于也要不行了,需要赶紧招一个精通数据库优化的程序员。小厂每时每刻面临的问题都不一样,用固定的标准招通才并不能有效解决问题。

大厂可以用固定的标准招通才,尤其是 Facebook 和 Google 这种全公司统一招聘的。虽然大厂内的每一个团队都好像小厂一样,拥有此时此刻特定的招聘需求,但因为团队数量足够多,所以在统计学上大厂可以无视这些差异按照一个标准来招人。由于大厂的招聘标准如此的稳定和可预测,针对大厂的招聘标准做准备反而更容易。你可以尝试搞清楚大厂的招聘标准,搞清楚后这套标准不会变来变去。一旦你满足了这套标准,你不需要太过关心个体差异。

如果你达不到大厂的标准,要参与小厂的招聘,那马上就会变成跟上述苹果比喻一样看缘分。你不知道具体哪个小厂正好需要你,你要明白到大部分的小厂当前的需求都跟你不匹配,从统计学的角度来说你必须通过大量的小厂去找一个匹配的。这时候你的体验会变得完全不一样,从只需要针对几个大厂做准备变成需要跟很多小厂打交道。


从升学考试经验推导而来的期望在这时候完全不成立。如果你高考差几分上不了北大清华,你很可能还是能去非常好的学校。但在找工作时,差一点进不了大厂并不意味着马上有小厂意识到你的价值把你招走,你需要在茫茫大海中搜索跟你匹配的小厂。这时候设置正确的期望很重要,大量小厂跟你擦肩而过,但这不代表你能力有问题,你需要坚持下去。

小厂的招聘流程并不像大厂那样标准化和可预测,那意味着他们扔掉你简历时并不一定是你简历有问题;他们面试时不像大厂一样按套路出题,他们会针对特定的招聘需求来出题,所以你答不上来不一定是你能力有问题;经验有限导致他们的面试并不一定能有效挑选人才,你觉得自己面得很好但他们不要你,同样不一定是你能力有问题。这个过程的负反馈可能比应聘大厂难受很多,你唯一能选择的就是坚持住继续尝试。

2021年6月27日星期日

如何有理有据地说服其他程序员

TL;DR 当两个相对聪明和胜任的程序员对同一个问题持有截然不同的观点时,往往问题出现在大家对问题的定义不一样。争辩观点对错的往往并不能达成一致,这时候必须先确认大家在讨论的是同一个问题。如果没办法对齐(align)问题,尤其是当双方的优先级(priority)不一致时,争辩问题的解决方案是不可能有结果的。

人际矛盾

人际矛盾是行为面试(behavior interview)中常见的考点,作为面试官我自己经常问相关的问题。例如说,我在 Facebook 时就经常问以下两个问题:

  1. 有没有试过你和你的同事各持不同的观点,而且双方都坚持认为自己是对的,最后你成功说服了对方?
  2. 把上面的问题反过来,有没有试过最后你被对方说服了?

对于不同级别的程序员,我们对人际矛盾有不同的期望值。初级程序员,就算不能把矛盾解决,至少不能把矛盾激化。高级程序员,需要有能力把矛盾化解掉,从而推动自己的项目前进。更资深的程序员,需要有能力梳理组织当中错中复杂的利益和矛盾关系,优化组织提高效率。

在这篇文章里,我们的关注点是如何化解人际矛盾,这是很多初级程序员需要学会的技能,也是很多高级程序员需要持续提高的技能。在 career coaching 过程中,我时不时也会遇到客户提出这方面的问题,我给出的方案都是类似的,因此我觉得用一篇文章来解释会更好。

两个聪明人解同一问题……

我还在 Facebook 时,一个非常资深(总监级别)的华人程序员在一次吃饭时分享了一个观点:如果两个聪明人尝试解决同一个问题,但他们各自得出了不一样的答案,往往并不是其中一个人错了,而是他们拥有的信息不一样,各自根据自己拥有的信息进行推理就会得到不一样的答案。这时候双方必须先互通有无,把自己拥有的信息都摆到台面上来,然后再一起利用眼前的信息解决问题。

这一个观点是我的理论基础。我见过很多人因为意识不到这一点而陷入无效的争辩,甚至激化双方情绪。尤其是强调逻辑思维能力的程序员,很容易推理出这样一个结论:因为一个问题必然有且仅有一个正确的答案,又因为我和你的答案不一样,所以我们两个当中至少有一个人是错的。因为我很确信我自己是正确的,所以你必然是错的。因为你是错的,所以你比我笨。

这个推理过程是正确的,但前提是两个人在解决的是同一个问题。否则就如同考试后对答案发现两个人的答案不一样,争辩半天谁对谁错后才发现这场考试分 A 卷和 B 卷,大家做的根本不是同一道题。很多聪明人都犯过这样的错误,也就是跟别人争辩为什么自己的解法是对的,而忘记了检查大家是不是在做同一道题。

先定义问题再讨论解法

对于很多名校毕业或者大厂工作的程序员来说,其实自己和身边的人都已经足够聪明了。如果发现自己在跟别人争辩观点争辩不出来结果时,最好就先审视一下双方是不是在讨论同一个问题,如果不是很确定的话就先把问题定义清楚。当然,复杂的问题不可能方方面面都定义得很清楚,还是会涉及很多假设。如果双方对约束和优先级做了不同的假设,得出不同的结论是很正常的。所以我会建议大家先明确约束和优先级都有哪些。

对约束进行不同的假设

两个人从广州出发去北京,A 说往左走,B 说往右走。这时候看起来「从广州去北京」是同一个问题定义,但可能 A 想着的是去机场搭飞机,B 想着的是去火车站坐火车,所以走了不同的方向。如果两个人对于交通工具没什么看法,那澄清一下自己假设使用的交通工具矛盾就化解了。「我以为我们去搭飞机呢,原来你想着的是坐火车。我其实没什么所谓,你想要搭什么我们就一起走吧。」

但如果有更深层次的原因导致他们做出这样的假设呢?例如说,B 没有钱搭飞机,他只能坐火车。这就是一个约束了,加上了这个约束问题定义就不再是「从广州去北京」,而是「用有限的钱从广州去北京」。如果 A 不知道 B 有这个约束,那 A 和 B 在解决的就不是同一个问题。接着 A 和 B 可以就飞机好还是火车好大战五百回合,但矛盾仍然是解决不了。要化解这个矛盾,就必须要让 A 知道 B 有一个钱的约束,之后问题可能多种解法。A 可以说「那我陪你一起坐火车吧」,也可以说「我多出点钱请你搭飞机吧」。但如果 B 觉得没钱搭飞机是一条必须隐藏起来的信息,那这个矛盾就非常难解决了。(你需要一个情商非常高的 A,在获得这一条信息后按照这个约束来解题,同时又不暴露自己掌握了这一条信息。)


我在管理某个 iOS 的团队时就遇到过由于对约束的假设不一致带来的矛盾。我们在做一个新的 app,一边是两位很资深的程序员,他们拥有丰富的创业经验,他们用创业的风格迅速的写了一版原型;另一边是几个大厂培养出来的高级程序员,他们接过这个原型,把它打磨成最终能发布的产品。这种一边是特种兵另外一边是正规军的配合,很快就出现了矛盾。其中有一个矛盾我印象深刻,因为这个矛盾明显就是由约束不一致造成的。

正规军觉得特种兵写的原型代码是渣渣,接手后就开始大规模重构,按照 iOS 的思路把东西都封装进不同的 ViewController 里面。特种兵觉得正规军在浪费时间重构,正规军觉得这样做才符合大厂规范。这个矛盾我深挖到底,才发现源头来自于哪里。在特种兵打头阵写原型时,他们负责解决的是最难的技术问题,因为这些问题交下去给别人写可能就解决得不够好。其中一个技术挑战是,这个 app 在云端有三万张照片时,客户端要能够流畅地滚动和浏览照片。这个挑战在原型中是解决了的,但重构的过程中为了进行封装,一个原本 O(n) 的算法就被迫重写为 O(n^2),于是客户端在有三万张照片时滚动就不再流畅。

这里的隐藏约束就是「有三万张照片时要能流畅滚动」,这是当初特种兵带头立项时定下来的需求之一。但这没有很好地沟通给所有人,所以当正规军接手后就不知道有这个需求。在没有这个约束时,重构一下能提升接下来的工作效率那当然应该重构,于是就重构到不再符合这条约束了。这个矛盾的本质跟前面的例子一样,「显示云端照片」和「显示三万张云端照片且能流畅滚动」不是同一个问题。

对优先级进行不同的假设

A 和 B 又要从广州去北京了,这时候 B 已经有钱搭飞机了,但 A 反而想要坐火车了。A 尽管有钱搭飞机,但他最近想要存钱投资,觉得坐火车省钱更好。B 则想要快点到北京,多一点时间在北京玩。这时候看起来问题都还是「从广州去北京」,但两个人的优先级是不一样的。A 要解决的问题是「用尽量少的钱去北京」,B 要解决的问题是「用尽量少的时间去北京」,这自然会导致不一样的解法。

不同优先级带来的矛盾更难解决,因为有时候就算双方都把自己的优先级摆上台面了,但因为双方都只在乎自己的优先级不在乎对方的优先级,问题定义无法达成一致,最终问题不可能被好好解决。如果 A 坚持要省钱,B 坚持要省时间,那就算双方把问题定义清楚了,还是不能一起解决。最终的方案可能是,A 提前出发坐火车,最后跟 B 同一时间达到,这样 A 省了钱同时 B 省了时间,但两个人就不能同行了。


这种矛盾在那些前后端明确分工的公司还挺常见的:后端的优先级是自己少干活,最好就是 API 数据结构和数据库直接存在映射关系,复杂的场景就让前端调用多个不同的 API 然后自行组织数据维护状态吧。前端的优先级也是自己少干活,最好前端要做的每一件事情都只需要一个对应 API 调用就能解决,如果多个 API 调用之间需要维持状态那就应该由后端来维持。这种优先级的矛盾,如果双方都隐藏起来不说,再怎么争辩什么是「更好的系统设计」都没有用。如果双方愿意把自己的优先级说清楚,明白到对方的苦处,找个折衷方案,各自承担一部分的负担,那才能把矛盾化解掉。

总结

最后总结一下,当你发现你跟别人争辩不出结果时,尤其是你觉得自己是对的但对方好像也有道理时,你最好检查一下你们是不是在解同一道题。往往你会发现你们在解的不是同一道题,这时候你们就应该先讨论问题的定义,把问题定义清楚往往很快能找到一个双方都同意的结论。当然有时候因为双方优先级不一致,无法接受同一个问题的定义,那就是另外一类问题了。有空我可以再写写如何应对优先级不一致造成的矛盾,大家可以订阅/关注我,这次就先写到这里。

2021年3月7日星期日

SystemsExpert 测评

SystemsExpert 是 AlgoExpert 新出的一系列针对系统设计面试的内容,包括系统设计常见概念的科普型视频,以及若干模拟面试题和答案。它的内容非常适合从来没有面过系统设计的人,用来了解系统设计是面什么的,以及需要用到哪些知识点。

我接触到不少学生,毕业时通过了算法面试、成为了软件工程师,工作一段时间后跳槽时发现需要面系统设计,但因为从来没接触过所以觉得心虚。其实大家工作一段时间后,都或多或少地在实践中接触到了系统设计,要么是看过已有系统被设计成什么样子,要么是自己设计如何把新功能添加到已有系统上。但是可能因为没有非常刻意地做设计、覆盘、沟通,所以知识不成体系。SystemsExpert 能够帮助大家解决这方面的问题,通过二十多个视频系统地讲述每一个常见的系统设计概念。可能你看完后会发现,很多概念是你已经在工作中用到了的,只是现在变成了一个很具体你能拿来跟面试官交流的东西。

现阶段 SystemExperts 包括以下这些概念的视频:

  • 客户端-服务器端模型
  • 网络协议
  • 存储
  • 延时和吞吐量
  • 可用性
  • 缓存
  • 代理
  • 负载均衡
  • 散列化(Hashing)
  • 关系型数据库
  • 键值存储
  • 特种存储(Specialized Storage Paradigms)
  • 复制和分片(Replication And Sharding)
  • 领导选举(Leader Election)
  • P2P 网络
  • 轮询和流式传输(Polling And Streaming)
  • 配置
  • 限速(Rate Limiting)
  • 日志和监控
  • 发布/订阅模式
  • MapReduce
  • 安全与 HTTPS
  • API 设计

除此之外,SystemsExpert 还有一个视频提供系统设计面试的概述,简单介绍系统设计面试是考察什么的。每一个视频十分钟上下,不需要花很多时间看,内容很容易理解,但不会讲得很深入。

以上是 SystemsExpert 的优点,但它也不是没有缺点的。缺点是模拟题不可能好像 AlgoExpert 或 LeetCode 那样给你任何的反馈,唯一模拟了的地方是面试官回答你的 clarifying questions。除此之外,模拟题就提供一个白板,让你自己书写你要怎样回答这道题目。至于模拟题的答案,SystemExpert 跟 AlgoExpert 一样提供了高质量的官方答案,包括一个长视频讲解,和对应的图文解释。

如果此前没有系统设计的面试经验,或者觉得自己没有系统学习过,花 $79 买一年的 SystemExpert 是值得的。如果你决定要买了,可以考虑用我的折扣码。点击以下链接打开 AlgoExpert 的网站,然后选择购买 SystemExpert,或是 AlgoExpert + SystemExpert 的套餐,记得在付费前在「promo code」一栏输入「catchen」,然后就可以享受九折。请记得一定要输入「catchen」这个折扣码,单纯使用链接打开是不会自动打折的。

https://chen.cat/algoexpert-referral

P.S. 如果你不知道 AlgoExpert 是否值得一起买的话,可以去看我之前的《AlgoExpert 测评》。

2020年10月29日星期四

AlgoTogether 算法面试小班(信息更新)

我们三个月前发布的招生信息仍然有效,现在再补充一些新信息。

免费学习材料

我们不提供试听课,但我们免费提供一部分的学习材料,方便大家来了解我们的教学风格。这里面包括两段教学视频,和两道 LeetCode 中等难度题目的解题思路文档。大家可以打开以下链接填写你的基本信息后获得上述免费学习材料:

https://techcareer.typeform.com/to/IKKYnObZ

如果看完免费学习材料后觉得我们的教学风格对你胃口的话,请尽快来付费报名哦,因为我们的第四期马上就要开始了。

教练及助教信息

我们的教练团队越来越大,并且新增了助教角色,所以必须向大家公布一下我们最新的团队信息。以下是我们详细的教练信息:

  • Wilson: ACM/ICPC 金牌选手,毕业后回校训练学生并带队参赛。在 FANG 有多年的面试官经验。
  • Cat: 从小学开始参加编程竞赛,一直参赛到高中获取保送。在 FANG 面试 ~200 名候选人并培养了 ~50 名新面试官。
  • Michael: 在 FANG 拥有丰富经验的面试官。

除了一流的教练外,我们还有非常优秀的助教:

  • Leaf: AlgoTogether 优秀毕业生,成功从非科技行业转入互联网行业。
  • Tiger: 在读计算机博士生,曾在 FANG 实习。

学生评价

以下是我们收到的学生评价,大家可以参考一下,看看我们这个班的强项是否对你有帮助。

jhs:

第二期学员反馈:1. 题目分类清晰内容丰富,一轮项目结束以后对不同类型的算法题会建立起比较直接的大脑反应。对于准备刚开始刷题或者刷了一段时间题摸不清套路的同学很有帮助,对我个人的提升是解题速度更快了。 2. 比较喜欢 mock interview 的环节,能够最大限度的锻炼你 think loud 的习惯,这对于在北美求职的同学来说,这种习惯可能会让你在面试中更有优势。 3. 教练经验丰富,回答很多公司招聘时的实际问题。而这些问题很多时候只有一定经验的面试官才会有,对于求职者来说非常有帮助。

Tianqiang:

第二期学员。之前在知乎上有看到这个项目的介绍,比较感兴趣就报了一期。当时 Leetcode 刷了差不多 200+。项目每周总结的 topic 的题目做下来之后归纳总结,后面碰到类似的很快就有思路。我个人觉得帮助最大的是 Mock Interview,现实生活中很难找到有大厂招人经验的人来 mock,全英文交流以及白板或 codeshare 环境和 leetcode 刷题的感觉完全不同,重点在于与面试官的沟通与交流,习惯后真正面试时也不会过于紧张。推荐刷了很多题但是还不够自信面试的同学尝试这个项目。

Yuqing:

我是第二期的学员,算法知识方面的帮助很多同学都有提到,我也不再多说了,除此之外我觉得这个项目最大的亮点是每周的 presentation 和 mock 都可以得到大厂面试官的点评。面试的时候可能题会做但是怎么能清晰的表达出来自己的想法,把自己的算法和面试官讲明白同样也很重要。在这个项目中能知道专业的面试官希望听到什么样的回答,怎么能更有效的和面试官沟通,这一点是很多其他算法班没办法做到的,对我的帮助也非常大。

FlynnGao:

作为第二期的学员,说一下感受。首先一个给课程结构一个好评,本身预期以为有算法学习讲课,但实质通过模拟面试的讲解和更注重整个面试流程的各种问题,也可以从另外一个方面更加深入理解算法题目。面试过程中可能遇到的各种问题都有解答,有更加全面理解面试流程的效果。算法题的选择上个人觉得整体中等偏简单一些,当然也是为了更加方便整合整个模拟面试流程。对于学员的各种问题回答和表现的评估,AlgoTogether 的几位老师也表现出色。顶着时差基本全部的课都上完了,我给到 85 分。

罗凯:

第一期学员发表一下感想。1.题目归纳的很有条理,基本上跟着项目走下来 leetcode 上大部分题目都有思路了。 2.教练业界经验很丰富,回答了很多关于实际工作的问题,也给出了很多代码风格如何优化的建议。3.同学都很认真,每周一次 mock 的时候听同学讲也收获挺多的。很多题目的想法是 leetcode discussion 里面也没有的。教练也非常有耐心,有一次周二晚上讲一个比较难的题目,一直讨论了快半小时,我这边东边都 11 点多了。4.项目每周大概十个题,要都弄懂还是要花点时间的。做 mock 对真实面试帮助挺大,需要自己思路清晰,代码能跑到把代码讲清楚这之间也是有距离的,需要练习一下。

SKY:

作为第一期的学员,还是非常推荐这个项目的。教练很上心水平也很高,有问必答。每周的资料都很有针对性,涵盖面很广。最后一周还有教练自己收集总结的的最新大厂 OA 以及面试题,受益匪浅,在这里说一声谢谢。

邮件咨询

如果你看到这里了都还犹豫不决,那你发一封邮件给我进行咨询吧,在邮件里说一下你找工作的计划、你对找工作的决心有多大、你觉得现在的瓶颈在哪里,然后附件发送你的简历(或粘贴你的 LinkedIn 地址)。我会回信跟你分析一下你的现状,给你一些建议。

algotogether@techcareer.io

2020年8月23日星期日

AlgoTogether 算法面试小班(第四期招生)

AlgoTogether 上周日宣布第三期招生,不到一周时间就全部报满了!一开始我们开放了 20 个名额,结果到周五晚上就全没了。周五一天之内有 8 个人报了名,把剩下的名额都抢光了。因为还有学生特别想要报名,周五没抢到名额就跟我联系,我周六悄悄加了 5 个名额上去,当天就消耗完了。

考虑到 AlgoTogether 如此热门,仍然有学生想要报名,我决定立即开放第四期的报名和支付。第四期预计 10 月 31 日开始,到明年 1 月 2 日结束。课程格式跟第三期相似,但会在第三期快要结束时根据第三期收到的反馈做轻微调整。如果你原本想要报名第三期但错过了,可以点击以下链接报名参加第四期:

https://techcareer.io/programs/algotogether

如果你还不是很了解 AlgoTogether,以下是第四期的详细信息如下:

这门课程适合什么人?

这门课程适合下定决心要在美国一流科技公司找一份软件工程是(Software Engineer)工作的人。这门课程对于首次找软件工程师工作的人来说价值最大,例如说应届生或从其它行业转专业过来的人。找全职实习都适用。对于有工作经验的软件工程师来说,如果最近一年没有做过面试的准备,通过这门课程来准备面试也是一个很好的选择。

这门课程的价值在哪里?

我们的核心价值是「授人以渔」,因此课程的价值如下:

  1. 学会以面试官的角度进行思考。在面试过程中,公司对你的评价不仅仅在于代码的正确性和性能优化。我们会向你解释面试官是如何评价面试者的,这是你不可能通过 LeetCode 学习和训练的技能,你学会这些技能后就可以用面试官的视角审视自己,找到自己应该提高的地方。
  2. 基于面试场景的训练模式。LeetCode 是训练对着机器做题,面试需要的是对着人解题。我们假设你对前者已经有一定的经验,着重训练后者。后者涉及的技能包括:如果通过提问理清面试官的需求、如何清晰地陈述自己的思路、如何接受面试官的反馈和提示。
  3. 给自己下一个破釜沉舟的决心。如果你想要下定决心,在限定时间内做完指定数量的题目,同时完成指定数量题目讲解和模拟面试,我们会保证你对你自己定下的目标负责任。
  4. 理解解题思路而非背诵面经和答案。一知半解就去大量做题的话会导致背诵面经和答案的现象。我们强调学习和理解解题思路,然后通过适量的练习来学会如何灵活运用。以不变的解题思路去应付不断变化的面试题目。

课程结构是怎么样的?

整个课程总共 9 个星期的时间。每个星期我们有 3 个天会进行 Zoom 视频会议,另外 4 天进行线下各自的练习和 Slack 上的交流。

每周教练挑一个主题,例如说动态规划(Dynamic Programming),然后围绕这个主题布置 15 道作业题。你有一周的时间来完成这些题目并且提交结果,你至少需要提交 10 道题目的代码和 1 道题目的详细解题思路。所有学生都完成提交后,助教会组织大家投票选出最优秀的解题思路,并且安排题目讲解(Presentation)和模拟面试(Mock Interview)的时间和人选。教练会在整个过程中针对学生表现提供反馈。

我们每周三、周六和周日晚上 7 点(Pacific Time)通过 Zoom 视频会议进行教学、答疑 、题目讲解和模拟面试。不进行 Zoom 视频会议的日子每天同样时间在 Slack 上进行专题讨论。

课程教练是什么人?

我们的教练都在一流科技公司拥有多年的工作经验和面试官经验。我们的首席教练曾多次获得 ACM/ICPC 竞赛奖牌,此外还培训其它学生参赛获奖。我们的助教团队都有一流科技公司的工作经验,且近期经历了面试找工作的流程,非常能理解正在经历这个过程的学生需要什么。

课程使用什么语言教学?

为了保证跟面试过程和工作环境一致,整个 AlgoTogether 采用全英语沟通。学生毕业后,可以加入微信校友群,使用中文沟通。

如何报名和支付?

请打开以下链接然后选择第四期(10 月 31 日到 1 月 2 日)进行报名和支付:

https://techcareer.io/programs/algotogether

如果你看到这篇文章时已经错过了第四期,可以打开链接然后选择你需要的那一期进行报名和支付。

2020年8月16日星期日

AlgoTogether 算法学习小组(第三期招生)

我开了一个叫做 AlgoTogether 的算法学习小组,面向在美国寻求软件工程师工作(实习或全职)的人。头两期学习小组的效果不错,第二期学生对项目打分 4.4/5.0 分,对老师打分 4.8/5.0 分(数据),所以我决定继续做第三期学习小组。针对头两期学生的反馈,我对第三期学习小组进行了调整,增加了提供标准化反馈的模拟面试环节,设立了学生共同维护的解题思路库。

我知道仅仅通过 LeetCode 准备算法面试是不够的,因为面试并不以题解的优劣来衡量你。你需要让面试官想要和你共事,这需要说服他你能跟他一起通过编程解决难题。AlgoTogether 是一个有教练指导的学习小组,帮助你训练多方面的面试能力,让你在面试时成为面试官的最佳未来同事。在这个学习小组中,你不仅仅需要解题和编码,你还需要练习沟通你的解题思路、接受模拟面试和倾听来自别人的反馈。我们的教练是 ACM/ICPC 奖牌得主,也曾带队其它学生参赛获奖,此外还是大型科技公司中富有经验的面试官。我们保证你投入到面试准备的每一滴汗水都能有充分的回报。

以下是往期学生对 AlgoTogether 的评价:

SKY:作为第一期的学员,还是非常推荐这个项目的。教练很上心水平也很高,有问必答。每周的资料都很有针对性,涵盖面很广。最后一周还有教练自己收集总结的的最新大厂 OA 以及面试题,受益匪浅,在这里说一声谢谢。

罗凯:第一期学员发表一下感想。1.题目归纳的很有条理,基本上跟着项目走下来 leetcode 上大部分题目都有思路了。 2.教练业界经验很丰富,回答了很多关于实际工作的问题,也给出了很多代码风格如何优化的建议。3.同学都很认真,每周一次 mock 的时候听同学讲也收获挺多的。很多题目的想法是 leetcode discussion 里面也没有的。教练也非常有耐心,有一次周二晚上讲一个比较难的题目,一直讨论了快半小时,我这边东边都11点多了。4.项目每周大概十个题,要都弄懂还是要花点时间的。做 mock 对真实面试帮助挺大,需要自己思路清晰,代码能跑到把代码讲清楚这之间也是有距离的,需要练习一下。

为了保证跟面试和工作环境一致,整个 AlgoTogether 采用全英语沟通。以下是 AlgoTogether 的详细信息及报名链接。$800 的 early bird 价格到 8 月 29 日周六结束,之后将变为 $1,000 的正常价格。

What is this program?

AlgoTogether is an algorithmic problem study group with a coach. The program focuses on all necessary skills for coding interviews: problem-solving, coding, debugging, articulating solutions, taking feedback. The coach leads the meetings and mock interviews and makes sure that students learn these skills in a way that they can reapply to new problems in real interviews.

What is the value of this program?

  1. Understand how an interviewer evaluates you. You are evaluated beyond correctness and optimality. If a company only evaluates these two it will replace human interviewers with LeetCode to save money. You should learn what’s missing beyond your LeetCode practice.
  2. Practice like you are in an interview. You will practice articulating your solution to an interviewer and taking hint or feedback from an interviewer. That’s what you don’t experience if you simply practice with LeetCode.
  3. Hold yourself accountable. Are you willing to commit to finishing a certain amount of problems within a specific time frame? If you can commit, we will hold you accountable and prevent you from slacking.

Who is this program for?

People who are highly committed to getting a software engineer job at one of the well-established tech companies. It’s best for people who are seeking a software engineer job for the first time, for example, newly graduated students. It’s also good for experienced software engineers who haven’t done interview preparation for more than a year.

What is the structure of the program?

The program is 9-week long. We meet in Zoom 3 times a week and practice together offline through other days.

Each week the coach picks a theme (e.g. dynamic programming) and assigns 10+ problems within this theme. You have one week to work on them. Then all students submit their solutions, share their thinking processes, vote on other students’ sharing, practice presenting solutions, and get mock interviews. The coach will provide support and feedback throughout the whole process.

We meet on Wednesday, Saturday, and Sunday 7 pm (Pacific Time) in Zoom to have lectures, office hours, solution presentations, and mock interviews. We convene on Slack on the other days at 7 pm (Pacific Time) to discuss a focus topic.

Who is the coach?

Our coach has many years of experience working and interviewing candidates at well-established tech companies. He is also an ACM/ICPC algorithm competition medalist and has coached other students for the competition.

How much does it cost?

Early Bird: $800. (Before 8/22 23:59 Pacific Time.)

Regular: $1,000. (After 8/23 00:00 Pacific Time.)

We think it’s the right price to identify committed students and hold everybody accountable. You will be able to pay with a credit card. It’s non-refundable once the payment goes through.

When does the program start?

We start on 8/29 Saturday and end on 11/1 Sunday. We plan to stop accepting signup and payment on 8/28 23:59 Pacific Time.

How do I sign up and pay?

Please open the following page and click the “purchase” button to start. We will contact you through email after successful payment:

https://chen.cat/algotogether

Update: Please open the link from above and check out the latest program’s date and price, and then signup.

2020年6月29日星期一

《牛油果烤面包》回顾(Part 5 - 中国)

我在这个系列的第一篇文章里面就说到过,当初为了用最低的成本和最短的时间把节目推上线,我们选择了使用 Anchor 这个平台做发布。它如同 YouTube 一样免费和易用,当然也如同 YouTube 一样无法在中国访问。在节目上线后我们很快就意识到这个问题,于是费了很大功夫进行调整。


喜马拉雅是我们的第一个尝试,因为它是国内的平台所以它有义务保证内容可以在国内访问到。在得知 Anchor 在中国无法访问时,我们第一时间去注册了喜马拉雅,并且把我们的节目同步发布到喜马拉雅。之后斯图亚特还去注册了企鹅 FM 和荔枝 FM,但因为手工多平台发布的成本高,但又收获不了多少收听次数,最终放弃了。现在国内的平台就只做喜马拉雅。

提到喜马拉雅就不得不提一下 Apple Podcasts 在中国那一套心照不宣的特殊做法。如果你正常地使用 Podcasts Connect 提交一个播客的 RSS,默认这个节目不会出现在中国区。Apple 通知你节目通过审核时,这仅仅是意味着节目通过了 RSS 格式审核,但这跟中国一点关系都没有。之后 Apple 会默默地审核你的内容,决定你是否能发布到中国区,整个过程不会有任何的沟通,审核不通过也无法上诉。因为我们一开始使用的是 Anchor,它的 RSS 在中国根本无法访问,自然 Apple 不会把我们的节目发布到中国区。

想要把节目发布到 Apple Podcasts 的中国区,民间有一个办法,那就是用喜马拉雅导出的 RSS。因为喜马拉雅本身在中国,所以 Apple 乐意发布任何来自喜马拉雅的 RSS。为此我们专门在喜马拉雅后台申请了导出 RSS,然后把 RSS 添加到 Podcasts Connect。为了避免听众看到我们的 Apple Podcasts 上有两个节目分不清哪个是哪个,我们把喜马拉雅导出的那个叫做牛油果烤面包中国版


考虑到喜马拉雅不是一个泛用型播客平台,为了方便中国的听众使用 Overcast、Pocket Casts、Castro 等泛用型播客应用收听,我们又花钱购买了 Typlog 的服务并且把每一集的内容同步发布到 Typlog。作为付费平台,Typlog 的灵活性比 Anchor 和喜马拉雅都要好很多,而且大多数时候能在中国访问到,不过也有极少数时候用户会报告不能访问。

Typlog 值得一提的是节目文本内容的编辑灵活性。Anchor 和喜马拉雅对内容都是有限制的:Anchor 不允许多层套叠的 bullet points,如果我们写了多层的就必须手工改为一层的。喜马拉雅连 bullet points 都不支持,只能人手在每一行文本前加个星号表示这几行是个 bullet points。Typlog 完全没有这些限制,而且可以用 Markdown 语法来写,非常符合我的编辑习惯。

在建立好 Typlog 发布后,我们就逐步把各个平台收录的 RSS 地址从 Anchor 改为 Typlog 了。这样做是为了保证中国听众就算是通过 Overcast、Pocket Casts、Castro 等平台搜索到我们节目后能正常收听。可惜最近发生了一系列事情,使得很多这些泛用型播客应用被 Apple 中国区下架了,估计这些应用的中国用户将来只会变得越来越少。


最后,为了保证我们的品牌、域名和链接掌握在我们手上,不受任何一个发布平台的干预和限制,我选择了建立我们自己的网站。我们的域名 avocadotoast.live 最初只是简单地指向到我们的 Anchor 页面或喜马拉雅页面(根据访问来源国家智能指向),但这样子我们得不到任何网站分析数据,不知道有多少来自中国的用户因为指向错误而打不开 Anchor。为此我决定利用静态网站生成器编写我们自己的网站,每一集节目都要能在我们的网站上打开和播放。

网站的主体是我一个周末连夜赶工做出来的,之后花了不少时间打磨和提升自动化程度。现在只要我们发布到 Typlog、喜马拉雅或 Anchor,我们的网站就会自动更新,保证最新一集总能在我们自己的网站上看到。为了兼容中国和非中国用户的体验,我们的网站还设计为从多个音频来源进行播放,如果其中一个音频来源播放失败就自动切换到下一个音频来源。这样就算中国听众无法访问某些音频来源,最终还是会切换到喜马拉雅的音频来源从而保证播放。

制作这个网站的详细技术抉择我觉得可以单独写一个系列,就不在这里详细展开。有兴趣了解这个项目背后细节的话,请通过邮件RSS/Atom 进行订阅。如果我接下来还有时间继续写这个系列的话,我会写一写我们进行远程录音的经验。尽管我之前已经写过录音剪辑经验,但现在大家不能面对面录音了所以我们又摸索了一套新方法来做远程录音。这个话题我们下次再聊。