2021年12月25日星期六

互联网选大厂还是小厂:读了本书还是写了本书

这个系列上次写到《互联网选大厂还是小厂:数据中心里有朵云》,这次简短地写一个小一点的区别。在小公司,你更容易遇到同事说「我读了本书,书上说的这个事情能解决我们遇到的问题。我把书上说的事情投入实际应用后,得到了这么好的效果。」在大公司,你更有可能遇到同事说「我是这本书的作者,有问题欢迎来问我,我也可以定期组织相关的研讨。」

有资格写书的大神门往往聚集在大厂中,小厂很厉害的话或许能抢到一个这样的大神。这些人已经工作很多年了,积累也很深了,有心情就把知识整理出来写本书。科技理论的前沿往往发生在学术界,但科技落地的前沿是在大厂。大厂把学术界早就搞明白的事情拿过来,然后进行从来没人实践过的落地。在这方面,大厂提供了更多的机会去做探索。因为前人没做过,就算理论摆在那里,也不可能有书把这件事情描述清楚。

小厂正好是反面,走的路往往是无数前人已经走过的路,成长过程中遇到的问题很多其它公司早就遇到过,已经有人把解决问题的方法抽象出来写成书。这即是优点又是缺点,要看你站在什么角度去看。从创造影响力的角度来看,这是优点,一个应届生新人,不需要很强的原创性,不需要很好的研究能力,读本书就有机会为公司解决大问题,然后得到升职加薪之类的回报。在大厂,这是不可能的,写书的作者都在这里了,如果有利用这本书上的知识就能创造影响力的机会,早就已经做了,怎么可能轮到你呢?但在大厂里,你可以直接接触到作者哦,你可以跟他一起工作,直接从他身上学习,这是小厂没办法提供的。

2021年12月4日星期六

互联网选大厂还是小厂:数据中心里有朵云

时常会有人来问我,应该加入大厂还是小厂。提问的方式有时候是很具体的,例如说「我有这几家公司的 offer,他们规模不一样,这会对我的职业发展产生什么影响呢?」有时候是很抽象的,就是讨论一下以后找工作到底应该专注于大概是什么规模的公司。我曾经想要写一篇长长的文章,从不同的角度来对比大厂和小厂的区别,最后发现很难完成。现在我决定换一个方法,想到哪里就写到哪里,写完一个具体能进行对比的角度,我就发一篇文章。

在这篇文章里,我想要对比的是大厂和小厂在规模上的本质区别。如果你希望接触到一些特大规模的技术问题,你就只能选择进大厂,因为小厂不会遇到这类问题,也就没有机会让你去接触这类问题。这里有一个很有意思的故事,叫做「数据中心里有朵云」,是个很好的例子。

Facebook 早期跟那个年代的其它公司一样,也是在别人的机房租机位开始的。后来做大了,就有了自建机房的需求。机房需要廉价的土地、电力和制冷,荒漠能够很好的满足这三个需求。Facebook 为了节能,专门设计了利用荒漠低温空气对服务器进行降温的通风系统,一旦发现室外温度比室内空调温度还要低,巨大的风扇就会启动,吸入室外温度更低的空气进来降温。

荒漠通常是零降水的,但有一次傍晚真的下雨了,导致室外气温迅速下降,机房开始从室外吸入冷空气降温。因为刚刚下过雨,室外空气虽然温度低但湿度非常高,进入室内后迅速被服务器温度加热升温。数据中心天花非常高,高温度高湿度的空气自然会往上跑,最终空气中的水分冷却后变成云。据说当时在数据中心的人听着服务器发出霹雳啪啦的火花声音,但没有任何办法去抢救服务器。他们把这次事故描述为「There is a cloud in the data center」。

Facebook 后来学聪明了,不能简单根据室外空气温度来判断是否应该吸入室外空气来降温,还要加上室外空气湿度作为限制条件。这种类型的问题,现在世界上也就只有几家公司能够遇到,因为现在绝大多数互联网公司只需要用别人的云服务,不需要自己拥有物理机器,更不需要自建数据中心。如果你想要接触到这类其它公司都没解决过的前沿问题,那只有大厂能够有足够的规模去触发这类问题,小厂根本触发不了。

类似的问题在 Facebook 其实不少,但也就只有这种规模的公司能遇上。举个例子,Facebook 曾经用 BitTorrent 来部署 web 服务器的更新,因为 web 服务器数量过多(百万级别),向每一台 web 服务器单独上传几个 GB 的编译文件效率太差。更新不是就覆盖几个 PHP 文件吗?为什么是几个 GB 的编译文件?因为 Facebook 那时候使用 HPHP 把 PHP 转译为 C++ 再编译为二进制文件。那为什么 Facebook 要发明 HPHP?因为 PHP 执行效率太差,当时有人根据历史数据进行拟合,发现 18 个月后 Facebook 的用户服务器比(用户总数除以服务器总数)将会下降到 1.0,就算 Facebook 有那么多钱买服务器,世界上也没有那么多机位放服务器,所以必须想办法提升执行效率。

所有这些规模导致的问题都是一环扣一环的,一个发明创造解决了上一个规模导致的问题,同时也带来了机遇给下一个发明创造。这种类型的发明创造只能发生在大厂里,因为小厂触发不了这个级别的规模问题,也没有充足的资源去进行发明创造。

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 进行订阅。如果我接下来还有时间继续写这个系列的话,我会写一写我们进行远程录音的经验。尽管我之前已经写过录音剪辑经验,但现在大家不能面对面录音了所以我们又摸索了一套新方法来做远程录音。这个话题我们下次再聊。

2020年6月28日星期日

《牛油果烤面包》回顾(Part 4 - 选题)

之前写了 3 篇《牛油果烤面包》的满月回顾(1 2 3),现在准备继续写下去。当然满月早就过了,甚至连半年都不止了,然而又没到一周年,所以文章标题就不再提及时间啦。上次我们说到了我们从个大平台都能获取到什么样的收听数据,那这次我们就说一说我们是怎么做选题的吧。

要说选题,那必须先说一下我们的受众定位。这在我们几位主播之间其实没有非常统一的观点,我们有人更在乎在美国的中文听众,也有人更在乎来自中国的听众。来自中国的听众又可以细分为更多的类型:有些是已经接触到比较多英文信息和海外信息的,那就比较类似在美国的中文听众;有些技术研究得很深入但只熟悉中文的术语,遇到英文的就比较难听进去;有些技术了解不深,希望多听听浅显易懂的科普内容,对深入话题不感兴趣。因为我们在这方面没有统一,所以选题时也没有刻意针对哪一种中文听众类型来做,每一期的受众会略微不一样。


我们选题一般会有两种风格:一种是侧重专业性的,一种是侧重娱乐性的。前者的目标是让听众爽,后者更多是主播和嘉宾自己爽。

我们先说说前者吧,我们在做这类选题时一般优先从我们身边的朋友里找专业人士,想想他们熟悉的专业内容如何能够塑造成相对科普一点的话题,保证讲述过程中的趣味性和故事性。然后我们就会跟这些朋友说,希望找他们来录一期节目,问一下他们是否愿意,然后再协商什么能说什么不能说。因为他们工作领域和公司的限制,可能有些事情他们能多说,有些事情他们不能说,这些都是要提前说好的。

因为我们强调自己是一个科技性的节目,所以我们找的很多专业人士都是自己的同行,也就是科技行业的从业人员。推荐系统人工智能硬件加速人工智能在传统行业的落地搜索引擎计算机视觉激光雷达都属于这种类型的节目。当然我们身边也有不少朋友在非科技领域有非常深入的见解,我们也会请他们来介绍他们的专业。私人飞行执照美国公务员美国个税疾控中心Airbnb 短租房东桌游电子游戏都属于这种类型的节目,因为作为主播我们自己也不是很懂,所以录制节目的过程也是我们自己学习的过程。

至于娱乐性节目,主要就是我们自己想要说,说完了还想要分享给大家听,所以我们就录了。这方面的选题是非常随性的,总之有主播想要录,我们有档期就录。这类型的节目包括互联网信息获取在家办公台北旅游托斯卡纳旅游伊朗旅游。此外还有一些选题是介于专业性和娱乐性之间的,我们做不到非常有深度的专业内容,但我们觉得嘉宾有独到的经历和见解非常值得分享,于是我们就会去录:中美互联网公司异同美国裁员冻卵硅谷春晚

最后还有一类特殊的选题,叫做蹭热点。我们还是希望我们的节目能够获得快速增长的,而蹭热点有时候是个很有效的办法,虽然不一定能成功。(这是我在知乎回答问题的经验啦,回顾了一下得票最多的答案,有一部分是蹭热点而来的。)这部分选题的时效性非常强,某个事件发生后必须尽快完成录音、制作和发布。我们的第一期节目iPhone 11 发布会就是这种类型,后面还有BlizzCon、CES(1 2)以及下周马上要发布的 WWDC。


回顾我们的选题,从播放量来看最可靠的是专业性题材的节目。这些节目我们可以持续做,只要我们能够一直找到新的专业话题,在一定程度上来说我们可以「量产」这种类型的节目,而且每一集都会有比较高的播放次数,但并不是最高的播放次数。那最高的播放次数来自什么呢?这需要的不是专业见解,而是情绪上的刺激。要让听众一看到题目就能产生情绪上的反应,以下是一些例子:

  • 美国裁员这一集刺激的是大家恐惧的情绪。在美国拿着工作签证的人都知道,一旦被裁员那就有可能被迫离开美国,之前那么多年投资在留学和工作上,就差那么一点拿不到绿卡是一个巨大的损失。这一集的播放次数非常高。
  • 中美互联网公司差异成功的刺激到了中国程序员对行业内卷的负面情绪,大家都想了解一下其它国家的互联网行业从业体验是怎样的,所以播放次数也很好。
  • 搜索引擎通过在标题中提及百度的没落而刺激到了中国网民对百度的厌恶情绪,很多人不仅仅收听了这一集的节目,还在评论种表达了对百度的不满。

有意思的是,人类确实更容易受负面情绪的驱动,在收听播客时也如此。这是现代市场推广所才去的一个常见手段,当然最终会导致民众两极分化,这又是一个新的问题。我们在选题时不会刻意的去选择挑起负面情绪的话题,但从结果上来看确实这样的话题效果更好。

2020年6月22日星期一

为什么美国网银转账那么慢:ACH 详解

我刚刚来到美国时就发现美国网银的转账速度很慢,往往中国网银一天甚至实时能完成的转账,在美国需要三天甚至更久,不过后来习惯了也就没再仔细思考这件事情。我最近加入了 Robinhood 的 Funding 团队,我们团队负责用户资金转进、转出 Robinhood 账户,为此我好好学习了一下美国网银转账背后所使用的 ACH Transfer 机制。现在终于可以来向大家解释一下为什么美国银行的转账速度那么慢了。

我这篇文章主要参考了 Gusto 关于 ACH 的系列博客(1 2 3 4 5),大家喜欢看原文的话可以去看看。在开始之前,我们来解释一下下文要用到的概念:

  • ACH:Automatic Clearing House。这是一套自动清算系统,是金融机构之间使用计算机进行自动清算的协议。
  • NACHA:National Automated Clearing House Association。这是一个制订 ACH 标准协议的机构,并且负责管理 ACH 网络。
  • Federal Reserve。美联储,实际运营 ACH 网络的机构。
  • ODFI:Originating Depository Financial Institution。这是代表发起 ACH 操作一方的发起方银行。
  • RDFI:Receiving Depository Financial Institution。这是代表 ACH 操作接受一方的接受方银行。

在美国的金融机构之间进行金额不是很大的转账,往往使用的都是 ACH。一个 ACH 操作中通常会涉及到 5 个参与者,他们分别是:发起方、发起方银行(ODFI)、美联储(Federal Reserve)、接受方银行(RDFI)、接受方。举个例子,Alice 是 Bob 的雇主,Alice 要发工资给 Bob,那么 Alice 就是发起方,Alice 的银行就是发起方银行,Bob 的银行就是接受方银行,Bob 就是接受方。

假设 Alice 发工资给 Bob 的那天算作第 1 天,Alice 的银行会要求 Alice 在特定时间(假设是 7:00 PM)之前发起这个操作,超过这个时间就算是下一个工作日的操作了。为此 Alice 必须在第一天的 7:00 PM 前发起一笔 ACH 操作转出 Bob 的工资,与此同时 Alice 的银行会在 Alic 的账户余额上减去 Bob 的工资。这是第一步。

Alice 的银行(也就是发起方银行)会在午夜把记录了这一笔 ACH 操作的 ACH 文件发给美联储,然后美联储把这个 ACH 文件转发给 Bob 的银行(也就是接受方银行)。这是第二步。

Bob 的银行会在第 2 天清早(假设是 5:00 AM)处理这一笔 ACH 操作,把工资加到 Bob 的账户余额上。这是第三步。如果一切顺利的话,事情到这里也就结束了,工资成功从 Alice 的账户转到 Bob 的账户上。但是如果发生异常的话,那就还有两步要走。

什么情况可能导致异常呢?Bob 可能填错账户号码了,Bob 可能把 checking account 错误标记为 savings account 了,Bob 还可能注销账户了,有各种原因可能导致异常。这些都叫做 ACH Return,会导致一笔 ACH 操作失败。值得注意的是,跟中国的网银不一样,Alice 作为发起方不仅仅可以转钱给 Bob,只要 Bob 签署了正确的 ACH 授权,Alice 还可以要求从 Bob 那里收钱回来。这时候 Bob 余额不足或者是 Bob 撤销授权等等的情况,都会导致异常。

在第三步里,Bob 的银行在第 2 天清早会处理这一笔 ACH 操作,如果它发现有异常的话它可以把 ACH Return 发给美联储,但这个 ACH Return 最晚可以在第 3 天结束之前发出。按照最坏的情况考虑,ACH Return 会在第 3 天和第 4 天之间的午夜由 Bob 的银行经过美联储发送给 Alice 的银行。这是第四步。

Alice 的银行会在第 4 天清早(再次假设是 5:00 AM)处理这一笔 ACH Return,然后把 Bob 的工资归还到 Alice 的账户余额上。这是第五步。整个过程耗费了 3 天的时间,准确来说是 3 个银行工作日(bank day)的时间。

一般来说,Alice 发工资给 Bob,如果 Bob 的银行没发生异常,Bob 是不会提出异议的,毕竟钱是多了而不是少了。但如果 Alice 发起的 ACH 操作是从 Bob 那里收钱,Bob 的银行没有遇到异常不代表 Bob 不会提出异议。跟 Bob 的银行不一样,Bob 本人有 60 天的时间提出异议(dispute),然后就会导致 ACH Return。Alice 的银行收到 ACH Return 之后,就要把已经给了 Alice 的钱拿回去。如果 Alice 的账户已经没有那么多钱了,Alice 的银行就赔钱了。

因此 Alice 的银行进行 ACH 操作向 Bob 收钱后,收回来的钱该不该给 Alice,是全额个 Alice 还是部分给 Alice,具体什么时候给,这些都是开放性问题,不同的银行会做不同的策略。有些银行会等到第 4 天才把钱给 Alice,因为第 3 天结束后 Bob 的银行就不再可能因为异常(如 Bob 账户余额不足)而返回 ACH Return 了。

有些银行会因为 Alice 长期的良好表现而信任 Alice,在第 2 天就提前把全额或部分给 Alice。如果金额比较大,Alice 的银行担心 Bob 在第 3 天结束后提出异议,那 Alice 的银行还可能要进行更多的沟通协调,向 Bob 的银行确认这真的是 Bob 授权了的,那就会拖更长的时间。


希望上述信息能够解释清楚为什么美国的网银转账这么慢。

如果大家对 ACH 文件的格式感兴趣的话,可以读一读这篇文章,里面做了简单介绍。实际的文件格式,请以 NACHA 官方手册为准,那是一本几厘米厚的砖头书籍,我们 Funding 团队就有一本今年最新版本的。

2020年4月30日星期四

Real Dev 测评

Real Dev 是一个我称之为「实战项目的 LeetCode 平台」。跟 LeetCode 相似的地方是,Real Dev 也是一个 OJ (Online Judge);跟 LeetCode 不同的是,Real Dev 不需要大家解决算法难题,但要大家解决工业界常见的实战问题。举个例子,Real Dev 的 Hello World 问题要求大家做一个最简单的 web 服务器,打开 /hello 页面的话服务器要返回 "REAL WORLD"

以下一些是 Real Dev 的问题:自动完成组件(Autocomplete/Typeahead)、短地址生成服务、数据分页 API、响应式配色、JavaScript 到 TypeScript 迁移、克隆 Yelp。这些项目比 LeetCode 的算法题更贴近工业界,更像是软件工程师日常工作需要做的事情。做这些项目时需要用到的技术框架也是工业界所用的:Node.js + Express 或者是 Python + Django。

优点

  • 解题过程更像是软件工程师日常工作。
  • 能够练习使用常见框架,例如 Express 和 Django。
  • 有官方的问题讨论板块

缺点

  • 题目数量不够多。
  • 每道题都要从头开始搭架子。

这次的测评不附送任何折扣链接。Real Dev 是我以前在 Facebook 的同事离开 Facebook 之后做的,他们现在正在做全站打折,由每个月 $20 打折到 $10,这已经是非常便宜的价钱了。大家想要试用的话,直接打开 https://real.dev/ 就可以了,有一部分题目是免费也能访问的。

2020年4月24日星期五

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

更新:请访问 AlgoTogether 新版网站,了解最新一期的时间和价格,并进行报名。

我开了一个叫做 AlgoTogether 的算法学习小组,面向在美国寻求软件工程师工作(实习或全职)的人。第一期学习小组的效果不错,学生对项目打分 4.3/5.0 分,对老师打分 4.7/5.0 分(数据),所以我决定开第二期学习小组。针对第一期学生的反馈,我对第二期学习小组进行了调整,最主要的区别是增加了模拟面试的环节。

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

为了保证跟面试和工作环境一致,整个 AlgoTogether 采用全英语沟通。以下是 AlgoTogether 的详细信息及报名链接:

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 make the commitment, 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 8-week long. Each week the coach picks a theme and assigns problems within this theme. Students have one week to work on them. Then they present their solutions and get mock interviews at the weekend meeting. If they need help they can join the mid-week meeting to discuss. The coach will lead both meetings.

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?

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

How do I sign up and pay?

Please fill out the information in the following signup form:

https://chen.cat/algotogether–2020q2

We might not be able to accommodate everybody. We will contact you through email with payment instructions if you are selected.

Update: Please visit AlgoTogether’s new website for the latest program’s date and price, and then signup.

2020年2月11日星期二

System Deep Dive 系统设计小班

System Deep Dive 系统设计小班

我开了一个叫做 System Deep Dive 的系统设计小班,面向在美国寻求软件工程师工作的人。系统设计面试跟算法编码面试有相似的地方也有不一样的地方。相似的地方是,你都需要让面试官想要和你共事,这需要说服他你能跟他一起解决复杂系统的设计难题。不一样的地方在于,系统设计问题没有标准答案,不存在 LeetCode 这样的系统为你的训练提供实时反馈。

System Deep Dive 采用教练带领学生探索复杂系统的小班教学模式,帮助你接触常见的系统设计面试题,模拟真实面试过程——鼓励你多提问题了解系统需求,引导你把问题分解成子问题,给机会你独立解决具体子问题。教练会对你的解题过程提供反馈,最后还会展示部分系统代码,帮助你加深对设计难点的理解。

我们的教练曾在大型科技公司中担任 tech lead,有丰富的系统设计经验和面试经验。此外他还创办了自己的 startup,帮助其它科技公司通过实战项目筛选候选人。我们保证你投入到面试准备的每一滴汗水都能有充分的回报。

为了保证跟面试和工作环境一致,整个 System Deep Dive 采用全英语沟通。以下是 System Deep Dive 的详细信息及报名链接:

What is this program?

System Deep Dive is a system design practice group with a coach. The program not only teaches you all the necessary skills to excel at a system design interview but also practices designing complex systems together. In each session, the coach would lead the students to dive deep into a complex system problem and explore different design choices together. Students are encouraged to ask questions and deliberate trade-offs because that’s the best way to learn.

What is the value of this program?

  • Get a feel for the real system design questions asked in interviews. We’ll pick the most popular system design questions asked in industry and elaborate on different paths they lead to. You will learn how to design a real system. We’ll explain in-depth about the usual structure to answer such design questions.
  • You will ask questions and lead discussions like in a real interview. System design interviews are open-ended by nature. In a real interview, candidates will do most of the talks. We will tackle the problem together as a team and you will ask questions and get answers from the coach or other students. In this way, you can understand deeply and learn the trade-offs better among different design choices.
  • You can see how a complex system works in real life. Interviewers often dive deep into the system design to see whether you were actually involved in the project. You might get stuck if you haven’t seen the real thing. We will demo some code and configuration of different system components. In this way, you will understand better, for example, what load balancer does and how the cache is built.

Who is the program for?

People who are committed to getting a software engineer job, have coding experience but lack the experience of designing a complex system.

What is the structure of the program?

This program is structured session by session. Each session will take 2 hours talking about one or two similar system design questions in depth. There will be 4 parts in a session:

  1. In the first part, you’ll be asked to discuss and walk your thoughts out for the question just like in an interview.
  2. In the second part, the coach would challenge you and guide you through different directions of the problem. Students are also encouraged to discuss and it’s a perfect time to explore the pros and cons of design choices.
  3. In the third part, the coach will talk about the common strategy to tackle such a design problem so you can learn the framework tackling it yourself.
  4. Lastly, the coach will demo with real code to illustrate different parts of the system in real life.

Who is the coach?

Our coach has many years of experience designing complex systems and interviewing candidates at well-established tech companies. He’s also the CEO and founder of a startup specialized in helping tech companies hire engineers through practical projects.

How much does it cost?

We’ll be running a series of sessions as a pilot program and charge by each session. A session will cost $200 with a limit of 8 students. Once a session is full, we’ll stop accepting registration and move candidates to the same session of a later date.

What sessions are available?

We will offer the following sessions in the pilot program:

  1. System Design Interview Skills: understanding the problem, breaking it down, exploring each subproblem, deliberating trade-offs and articulating decisions. (3/4 7pm–9pm Pacific Time)
  2. Design an Autocomplete. (3/11 7pm–9pm Pacific Time)
  3. Design a Facebook/Instagram/Twitter Newsfeed. (3/18 7pm–9pm Pacific Time)
  4. Design a Customer Service Center. (3/25 7pm–9pm Pacific Time)

We plan to offer each session once in the pilot program. We will adjust them based on feedback and repeat these sessions after the pilot program.

How do I sign up?

Use the following link to sign up for the pilot program and pick the sessions you are interested in:

https://chen.cat/system-deep-dive-pilot-program-signup

If you are interested in the sessions after the pilot program (or if you are reading this after the pilot program signup is closed), sign up for the wait list with the following link:

https://mailchimp.catchen.me/system-deep-dive-wait-list

We will contact you through email after you signed up.

2020年2月1日星期六

CoderPro 测评

CoderProAlgoExpert 的竞争对手,既然我写了《AlgoExpert 测评》,那就让我再写一篇 CoderPro 的测评吧。先说结论:我不推荐大家独立去购买 CoderPro,因为其价格跟 AlgoExpert 差不多但功能远没有 AlgoExpert 那么多。如果你原本就购买了或打算购买 Tech Interview Pro,免费赠送的 CoderPro 倒可以看一看。

优点

  • 视频容易消化。(每道题的视频控制在 15 分钟内且有些小幽默。)
  • 只用 Python 来做讲解。

缺点

  • 只有视频讲解,缺乏自己做题和测试的过程。
  • 只用 Python 来做讲解。

因为我个人认为练习和反馈的过程十分重要,所以我不建议大家买来通过看视频来学习。如果你已经通过 LeetCode 进行练习,只是有时候有些题目解不出来,那往往你能在网上找到别人的答案,包括 YouTube 上的视频解答。


CoderPro 背后的八卦估计比产品本身更有趣。原本 Tech Lead 是 AlgoExpert 的一个 affiliate,通过自己的 66 万粉丝的 YouTube 频道推荐 AlgoExpert 并从中赚取售价的 50%。后来做 AlgoExpert 的把 affiliate 的费用从 50% 降低到了 40%,然后 Tech Lead 就不干了。

Tech Lead 做了 AlgoPro 这样一个竞品,也就是现在的 CoderPro。然后他注册了 AlgoExpert.com 并指向自己的 AlgoPro。(AlgoExpert 用的是 AlgoExpert.io。)这导致 AlgoExpert 的 Clement 在自己的 YouTube 频道跟 Tech Lead 怼了起来。

Tech Lead 回应说,这都是因为 Clement 贪心,把 affiliate 的费用从 50% 降低到了 40%。Clement 说 AlgoExpert 的题目数量增加后售价也涨了,新售价的 40% 并不比原售价的 50% 少。Tech Lead 悄悄把 AlgoExpert.com 指回去 AlgoExpert.io,但 Clement 仍然不满意,表示不欢迎一个别人的域名指向自己的产品。

现状就是,AlgoPro 不再叫 AlgoPro,改名为 CoderPro,不再跟 AlgoExpert 的名字有重合的部分,事情告一段落。作为吃瓜群众,想要去了解当时的八卦的话可以看那时候的视频。

既然我在这里提到了 Tech Interview Pro,接下来我也会写一写测评,想要关注的话欢迎通过邮件RSS/Atom 订阅我的博客。

2020年1月29日星期三

AlgoExpert 测评

AlgoExpert 是一个我称之为「LeetCode 精选」的服务,因为 LeetCode 现在的题目实在是太多了,但解答、提示等内容的质量又参差不齐。AlgoExpert 解决了这些问题:首先,它提供不到 100 道算法题,覆盖不同难度和不同知识点;其次,每道题都有一系列循序渐进的提示,使得你可以从毫无头绪开始一步一步做到最优解;最后,每道题最后都有视频讲解,从最笨的解法开始一步一步讲解如何优化,最后达成最优解。

因为我不需要通过刷题来准备面试,所以我买了之后并没有真的去做题,只是打开题目想想自己会怎么做,然后看看提示验证一下自己的想法。我有测试过用它的界面来写代码,感觉还不错。以下是我试用后的评价:

优点

  • 模拟面试过程中的提示,而且是每一道题都有提示,不像 LeetCode 那样有些题目没有提示。我觉得提示是模拟真实面试的总要环节,因为在真实的面试过程中你也可能会卡住,但一旦获得一个小提示后你就能解决剩余的部分。
  • 内置编码环境,支持常见的语言(C#、C++、Go、Java、JavaScript、Python、Switch)。
  • 内置测试环境,可以跑自己的测试数据,也可以查看官方的测试数据。
  • 视频讲解多种解法并对比它们的时间、空间复杂度。

缺点

  • 视频讲解比较慢。(不过内置视频播放器可以用 1.5x 或 2x 速度播放视频。)
  • 支持的语言不如 LeetCode 多(缺了 C、Ruby、Scala、Kotlin、Rust、PHP)。

如果是为了找工作而刷题,我觉得 AlgoExpert 是一个比 LeetCode Premium 更好的选择。AlgoExpert 是 $85 一年,但 LeetCode Premium 需要 $159 一年。尽管 LeetCode Premium 提供的内容更多,但如果你不准备花时间做那么多题其实没用。而且我觉得通过 LeetCode 把各大公司常见面试题死记硬背一遍不是正确的做法,我更倾向于 AlgoExpert 这样子的,用少量题把不同的知识点覆盖到了,然后学会在面试时灵活变通更重要。

如果你想要买 AlgoExpert,你可以考虑用我的折扣码。点击以下链接打开 AlgoExpert,然后记得在付费前在「promo code」一栏输入「catchen」,然后就可以享受八五折。请记得一定要输入「catchen」这个折扣码,单纯使用链接打开是不会自动打折的。

https://chen.cat/algoexpert-referral

2020年1月17日星期五

AlgoTogether 算法学习小组

更新:请访问 AlgoTogether 新版网站,了解最新一期的时间和价格,并进行报名。

我开了一个叫做 AlgoTogether 的算法学习小组,面向在美国寻求软件工程师工作(实习或全职)的人。我知道仅仅通过 LeetCode 准备算法面试是不够的,因为面试并不以题解的优劣来衡量你。你需要让面试官想要和你共事,这需要说服他你能跟他一起通过编程解决难题。

AlgoTogether 是一个有教练指导的学习小组,帮助你训练多方面的面试能力,让你在面试时成为面试官的最佳未来同事。在这个学习小组中,你不仅仅需要解题和编码,你还需要练习沟通你的解题思路和接受来自别人的反馈。我们的教练是 ACM/ICPC 奖牌得主,也曾带队其它学生参赛获奖,此外还是大型科技公司中富有经验的面试官。我们保证你投入到面试准备的每一滴汗水都能有充分的回报。

为了保证跟面试和工作环境一致,整个 AlgoTogether 采用全英语沟通。以下是 AlgoTogether 的详细信息及报名链接:

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 meeting 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 certain amount of problems within a specific time frame? If you can make the commitment, 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 existing software engineers who haven’t done interview preparation for more than a year.

What is the structure of the program?

The program is 8-week long. Each week the coach assigns a set of problems. Students have one week to work on them. Then they present their solutions at the weekend meeting. If they need help they can join the mid-week meeting to discuss. The coach will lead both meetings.

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?

It’s FREE! We are going to run our free pilot program in 2020Q1. However, we will ask for a $500 deposit and we will refund it when you finish the program. If you fail to finish the program you will forfeit this $500. It’s our way of identifying committed students and hold everybody accountable.

How do I sign up?

Please fill out the information in the following form:

https://chen.cat/algotogether-pilot-program-signup

We might not be able to accommodate everybody. We will contact you through email if you are selected.

Update: Please visit AlgoTogether’s new website for the latest program’s date and price, and then signup.

2020年1月7日星期二

Career Coaching 市场的思考

我在上一篇文章(《Career Coaching 价值的思考》)里说到了我对 coaching 价值的思考,接下来我想说说我对 coaching 服务市场的思考。我可以从我的定价策略开始聊。


基于市场订价

我设置每小时 $300 的价位,基本上就是比行业底线稍微高一点。还在 Facebook 工作的时候,我就跟公司的学习与发展中心(Learning & Development Center)聊过,了解到了为员工采购外部 coach 的价格。最高端的 executive coach 可以高达每小时 $1000 左右,最便宜但仅提供远程视频服务的 career coach 也要每小时 $200。基于这个信息,我觉得我把自己定价为每小时 $300 是合理的。

我可以理解为什么有人觉得这个价格太高(或者是认为总体上 career coaching 就是太贵)。我经常遇到的观点有以下几种:

  • 你教的知识我可以免费在网上获得,为什么我要付费买你的服务?我在《Career Coaching 价值的思考》里面说到了,知识获取的成本确实趋近于零,但复杂的知识不容易消化,所以真正值钱的服务在于帮助别人把知识变得容易消化,保证最后知识能被吸收。
  • 如果你真的那么擅长做你教的事情,你怎么会愿意花时间来教别人?最好的教练往往不是最好的球员,最好的球员往往也不是最好的教练。球员专注于把自己发挥到极限,经验主要来源于自己踩过的坑;教练需要帮助多名球员发挥得更好,经验来自对多名球员踩坑的观察。这两个角色是不一样的。我对于我教的事情擅长到一个程度,但我更喜欢去教别人,观察别人在学习过程中会遇到什么问题,然后创造性地去解决那些问题。
  • 跟你有类似资历的人其实不少,凭什么你可以收那么贵?跟上一条说到的类似:优秀的球员不一定想要成为教练,优秀的球员也不一定有能力成为优秀的教练。因为想要做教练并且有能力做教练的人不多,所以教练市场的供应由教练数量决定而不由球员数量决定,不能用球员的数量来估算教练的价值。跟我有类似资历的人大部分要么不想做教练要么做不好教练,暂时来说市场还是供不应求地,所以价格并不便宜。

如果大家能够站在宏观的角度看待整个 coaching 市场,就会发现教练暂时还是稀缺资源,所以定价不会便宜。我自己有一个愿景,是希望 coaching 这个市场能越做越大,教练越来越多,同时也有越来越多的学生消费得起。


定价的主观因素

除去上述市场供需的客观因素,coaching 的定价也有主观因素在内,也就是消费者主观地认为服务值多少钱。

据我观察,coaching 的定价非常难跟效果挂钩。因为 coaching 是针对每个人定制的,无法形成对比,所以也就无法对效果进行定量分析。(定量分析是指:如果这位学生获得了 coaching 服务将会得到结果 X,如果他没有获得 coaching 服务将会得到结果 Y,所以 X - Y 就是 coaching 创造的价值。)我们只能对 coaching 进行定性分析,也就是调查学生本人和身边的人是否觉得 coaching 让学生变得更好了。这个「更好」值多少钱,是消费者主观进行的评估。

这使得 coaching 的价值有点像是艺术品的价值,我把这称之为「主观的为才是用(subjective meritocracy)」。一方面,这个市场具备为才是用的性质,也就是越优秀的人能够获得越高的回报。另一方面,因为「优秀」是一个主观定义,所以参与者获得的回报高低也就受它人主观评价的影响。举个例子,两个画家各自画了一幅油画,他们分别能把自己的油画卖到什么价钱要看买家的主观评价,这不是由他们客观的绘画技能高低决定。

这意味着不同的人有着不同的 career coaching 心理价位。我的定价就像是一个过滤器:心理价位比我定价高的会选择购买,心理价位比我定价低的不会购买。这样的过滤器会帮我筛选出那些理解并认同 coaching 价值的学生,这些学生会以更积极和更开放的心态拥抱 coaching,结果当然是 coaching 效果更好。

如果我纯粹只是想要优化收入的话,我应该根据我能接收的学生数量来定价,使得愿意购买的人数正好等于我愿意接收的学生数量。实现手段可能就像艺术品拍卖一样,在一个时间段内拍卖一批名额,按照拍中的最低价格对所有拍中的学生收费。当然,这只是个虚无的构想(thought experiment),我并没有真的打算这样做,因为收入还不是我的主要目标。


价格对学生的反向激励

不仅仅消费者对 career coaching 的定价存在主观因素,反过来 career coaching 的定价也会影响学生主观能动性,这是非常有意思的一件事情。因为定价是主观的,所以定价偏高的话会让学生觉得这应该是物有所值的,因而更努力的吸收知识和练习技能;定价偏低的话反而会让学生觉得就算花了钱没学到也没浪费多少钱,因为有时候会松懈,并且更容易中途放弃。

我自己有花钱参加游泳教练的小班训练,至今已经两年多了。我已经游了二十多年的自由泳,但仍然觉得教练能给我带来比我自己摸索更高效的提升。然而因为一节课的价格不到 $20,有时候天气太冷了我就会选择逃课,因为感觉浪费 $20 也就是在湾区吃一顿放的价格,而且真有需要的话我可以再去插班补课。(我实际补课的次数肯定少于逃课的次数。)我觉得这就是价格偏低的问题,让人觉得错过了损失不大。

据我所知,有一些高端的健身房和健身教练收取较高的费用就是为了让消费者狠下决心,既然花了钱就必须把应有的价值给赚回来,所以健身才会更努力,结果自然也会更好。从这个角度来看,越贵的 coaching 越有效果在一定程度上是自证预言(self-fulfilling prophecy)——因为贵,所以学生更投入,所以效果更好。我在跟我的学生讨论价格上调时说到这个观点,有一个学生开玩笑地跟我说「那你应该尽早的涨价啊,那样子我会更加投入」。


总结一下,career coaching 并不是一个完全竞争的、由边际成本决定价格的市场,因为供应还是远小于需求。(在我看来,人人都可以从 coaching 获益,因为效率比自学更高,所以需求理论上是非常之大的。)价格跟成本的关联性很弱,更多的是看消费者主观的心理价位。现在 career coaching 的价格都不低,但高价在一定程度上更能激发学生的主观能动性。

我的愿景是让更多人获得 coaching。我暂时没有一个清晰的思路如何能达成这个目标,但我会去尝试。我此时此刻的想法是学习 Tesla 的模式——先做只有少数人买得起的电动跑车 Roadster,只需要有小规模的成功就能赚到足够钱做高端豪华车 Model S,在 Model S 能够获得大规模成功并验证市场后再用赚到的钱做低端豪华车 Model 3,最终通过 Model 3 把电车普及给大众。只做 Roadster 无法改变世界,但一开始就做 Model 3 也不切实际,所以这必须是一个分多阶段来实施的计划。

最后,如果你喜欢我的文章,欢迎通过邮件RSS/Atom 订阅我的博客。

2020年1月2日星期四

把我的个人网站推倒重来(Part 9 - 精简 Bootstrap 编译)

我在很久之前一篇文章里讲述了我为何选择 Bootstrap 作为样式框架,在那篇文章的结尾我提到了一个我当时没做的优化:去掉我不使用的 Bootstrap 模块。

我现在终于有时间把这项优化做了,我可以先说说做好的效果:Bootstrap 全部的 CSS 共 152kb,在优化后变为 72kb,节省了一半的体积。(压缩后的网络传输体积由 23kb 优化到了 11kb。)这个优化的效果还是很明显的,接下来我说说我具体做了什么吧。(具体代码可以参考我的 pull request。)

引用 Bootstrap 源代码

我们要去掉了不需要的 Bootstrap 模块,就要手工选择 Bootstrap 的 SCSS 文件,然后只编译和引用我们需要的。我们当然可以下载 Bootstrap 的 SCSS 文件,不过更好的做法是直接用 Git 的 submodule 概念引用 Bootstrap 源代码。在我的源代码目录下执行以下的命令就可以添加指向 Bootstrap 官方 GitHub 的 submodule:

git submodule add https://github.com/twbs/bootstrap.git

不过官方 GitHub 的 master 分支并不总能通过编译,这是我后来才发现的。修复的办法也很简单,就是强迫 submodule 指向特定 Bootstrap 版本的 commit。在 Bootstrap 源代码我们可以找到 v4.4.1 tag,然后定位到它的 commit 是 dca1ab7

接下来进入 bootstrap 子目录,里面就如同另外一个 Git 仓库一样,我可以用 git reset v4.4.1 --hard 把它的 HEAD 从 master 上最新的 commit 指向到 v4.4.1 的 dca1ab7。因为这个子目录是个 submodule,改变它的当前 commit 会修改我项目源代码的状态,这个改变在本地 commit 和 push 后就能在别处 pull 出来。这保证了 Netlify 在编译我的项目时使用的是同样的 Bootstrap v.4.4.1。

导入 Bootstrap 模块

Harp 内置了对 SCSS 的支持,所以我们不需要自己安装任何工具来编译 SCSS。现在 Bootstrap 已经以子目录的形式存在了,如何在我的项目中引用呢?我删除了原来直接引用的 bootstrap.min.css,然后添加了一个 bootstrap-custom.scss,并在页面里引用 bootstrap-custom.css。Harp 会发现这个 CSS 文件不存在但存在同名的 SCSS 文件,然后就编译同名 SCSS 文件并把输出结果保存到同名 CSS 文件。

bootstrap-custom.scss 件里,我直接复制粘贴了 Bootstrap 自己的 bootstrap.scss。这个文件本身不包含任何 CSS 规则,它只通过一大堆 @import 指令引用 Bootstrap 的所有模块。在我更新所有 @import 指令的路径后,引用 bootstrap-custom.css 的效果就跟引用完整的 Bootstrap 一样,包含了所有的模块。只不过这次我们不是用 Bootstrap 编译好的文件,而是让 Harp 从源代码开始进行编译。

精简 Bootstrap 模块

接下来要精简 Bootstrap 模块就很简单了,我可以一个一个地剔除我不需要 @import 的模块,只留下我需要的。精简后的 bootstrap-custom.scss 只用到不到原来一半的模块,体积自然下来了。

很可惜的是,这些模块不能进一步地分拆和精简了。例如说 _variables.scss 这个文件,其实它为大量我用不到的模块提供了常量定义,但就算我用不到这些常量我也无法把它们剔除。只要我用到的模块依赖于其中某些常量,我就必须把所有的常量带上。因此,尽管精简后 CSS 体积减半,但仍然有大量不需要用到的 CSS 被打包进去了。

配置 Autoprefixer

尽管 Harp 能够编译 Bootstrap 的 SCSS 文件,但还有一件事情是 Bootstrap 官方编译做了但 Harp 不会做的,那就是 Autoprefixer,这个工具会为 CSS 规则加上浏览器厂商前缀,保证 CSS 的兼容性。例如说,如果我们手写了 user-select: none,Autoprefixer 会自动添加 -webkit-user-select: none-moz-user-select: none 等等。

Autoprefixer 自己不能直接在命令行里使用,必须通过 PostCSS 调用。也就是说,调用 PostCSS 处理 CSS 文件,然后指定使用 Autoprefixer 插件。为此我们需要安装 PostCSS 和 Autoprefixer,这强迫我把我的项目变为一个 NPM 模块,这样我才有 package.json 文件,然后才能安装我所需的 NPM 模块。

需要注意的是,Autoprefixer 必须在 Harp 编译之后调用。Harp 编译先把 SCSS 编译为 CSS,然后再把输出的 CSS 交给 Autoprefixer 处理一遍。Harp 把项目目录里面的 public/ 编译后输出到 www/,然后我让 Autoprefixer 编译 www/css/ 并原地覆盖就好了。最后我写出来的编译命令如下:

harp compile .
npx postcss www/css/*.css --use autoprefixer -d www/css/

配置 Netlify 执行上述命令进行编译,我们的工作也就完成了。如果你对这类技术文章感兴趣,欢迎通过邮件RSS/Atom 订阅我的博客。

2019年12月19日星期四

Career Coaching 价值的思考

我是从 2018 年开始做 career coaching 服务的,从深度打折的每小时 $100 开始做起到现在每小时 $300 的行业价位。我在做这件事情的过程中学习到了不少东西,也深入思考过一些问题,可以拿来分享一下。


首先,大多数人最想知道的估计是我的 career coaching 适合哪类人群。从我现在的学生群体来看,主要有两个大的类别,但也有少数学生是在这两大类别之外的。

第一大类别是大公司里面的 junior 到 senior 的群体,也就是 Facebook 或 Google 的 IC3 到 IC5 级别。他们已经有很好的工作和很好的收入,技术往往不是他们晋升的瓶颈,他们也有很强大的意志力来完成高强度的工作。他们需要的更多是软技能方面的培训:

  • Communication:如何保证对方确实理解了自己的意思。如果保证对方对自己承诺的事情有一个正确的期望值,不会因为期望过高而最终失望。中国人比较常见的一种问题是在无法理解对方意思时一路 yes 到底,就希望尽快结束这个对话,结果连自己答应了对方什么承诺都不知道。
  • Alignment:如果一件事情需要多方合作才能完成,如何保证大家能达成共识。如果大家已经存在明显分歧,各自想要的事情各不不同,甚至是有你就就没我的零和博弈,那该如何解决。
  • Planning & Execution:如何做规划和如何执行。我经常说:IC3 和 IC4 做的项目是可以用贪心算法的,但从 IC5 开始就要以动态规划的方式去做,有时候往前走是为了获得新的信息,获得新的信息后有可能最佳的选择是倒回来再往另外一个方向走。
  • Product & Business:技术是服务于产品和商业的,解决错误的问题就算问题很难也无法产生价值,所以大家必须理解背后的产品和商业价值是什么。
  • Mentorship:如何掌握辅导别人的度。一方面,你不希望帮得太多,导致你帮别人把事情都做了。另一方面,你不希望帮得太少,别人自己折腾很久都没有多少进展,拖累团队进度。

这方面软技能的培训跟我之前在 Facebook 时为其它人提供的培训很类似。Facebook 内部有一个面向工程师的 coaching program,叫做 Good to Great。在这个 program 里,学生提出的问题 80% 是软技能相关的,只有 20% 是技术相关的。这个状况很容易理解,因为 Facebook 招来的人已经非常优秀,技术上的事情绝大部分都可以自学,更需要的是在自己原来的盲点进行一些点拨。

第二大类是一流高校里在读的学生,例如 Stanford 和 University of California 系列的学生,他们希望优化他们找工作的战略。

假设目标就是大公司软件工程师职位,学生找工作为什么不直接刷题解决?因为刷题只触及了这个问题最浅层的一面,如果我们再深入一些我们可以把这个问题分解为多个阶段:

  1. 熟练地编写代码:只要想得到的逻辑,都能转化为正确和高质量的代码。
  2. 熟练地运用常见算法:见到难度相当于 LeetCode Medium 的问题,都能够想出来正确的算法,并且条例清晰地描述该算法。(然后再利用上一个阶段的能力编写代码。)
  3. 参与团队合作:能够跟一两个人合作完成一个编程项目,互相协调分工,交叉 code review,解决一些意见上的分歧。这是很多学校都不教也不提供实践机会的技能,就算课程项目要求多人合作学校也不强调合作过程的质量只考察最终结果。如果拥有同等的算法和编码能力,简历上能展现出团队合作能力甚至是团队领导能力的人在求职上更有优势。
  4. 展现自己:在简历上和面试过程中展现自己的上述能力,表现出自己最优秀的一面。有些人并不是能力不行,但因为展现出来时打了折扣,别人就会低估他的能力。拥有实力是根本,没有实力就没有东西可以展现的,但展现自己本身也是一项重要的能力。
  5. 向上管理:在实习阶段向上管理自己的经理(包括 intern manager 和 team manager),确保他们理解实习项目的进度和最终结果的价值。如果有幸拿到实习,并且所在公司通过实习表现决定全职 offer 的话,实习期间展现自己的能力就很重要,但这跟简历和面试时的表现又不完全一样,因为这是跨度几个月的汇报关系。
  6. 职业战略规划:明白自己毕业两三年后想要成为怎么样的人,让毕业后的第一份工作服务于这个目标。有很多人没有想过这个问题,有些人想了也暂时没有答案,但有些人其实是有明确的答案的。对于有明确答案的人来说,就应该做战略规划,避免走弯路。就算是没有答案的人,也应该避免用贪心算法往前走掉坑里,至少要大致知道坑在哪里。

刷题本身非常重要,但我们应该意识到刷题只覆盖了头两个阶段应该掌握的技能,后面的几个阶段需要用到完全不一样的能力,仅仅靠刷题是不够的。我做 career coaching 往往会从学生最终想要的长远目标出发,也就是毕业几年后想要成为怎么样的人,然后再反向规划路线,最终决定接下来立即需要优化的能力是什么。


上面说了我做 career coaching 的主要两大类学生,接下来我可以说说我对 career coaching 价值的思考。这里包括我之前做 manager 时深入思考过的一些问题,也包括现在跟 coaching 和 training 同行交流时获得的心得。

根据我过去做 manager 的经验,我觉得 coaching 的第一步是教练和学生一起找到学生的职业愿景(career vision),也就是学生几年之后那个「更好的自己」是长什么样子的。学生可以说说这个世界上什么事情是自己最在乎的、什么事情是自己擅长做的、什么事情是自己喜欢反复做的、手上有多少资源可以动用来追求自己的目标。教练可以根据自己过去对其它人的观察提供参考信息,告诉学生什么样的目标是前人已经抵达过的并有已知的可靠路线,什么样的目标从来没有人做成过所以风险较高,如果学生给自己订的目标太低教练还可以提出一个更高但切实可行的目标。

双方把各自的信息摆到一起来,然后找到一个学生能下决心执行的长远目标,这其实是 coaching 的核心价值。这跟传统的传道受业解惑不完全一样,不是简单地把知识和技能从一个人身上转移到另外一个人身上,而是帮助一个人变成他想要变成的更好的样子。在这个过程中,知识和技能的转移只是其中的一部分,但不是全部。教练和学生都必须真心相信这个愿景可以达成而且值得达成,然后共同发力来帮助学生达成这个愿景。如果中途遇到了障碍,两个人应该共同想办法解决,学生不能被动地等待教练传授知识解决难题,教练也不能假设学生获得知识后就能自行解决所有难题。

既然说到了解决难题,我就想说一下教练对学生在情绪上提供支持(emotional support)的价值。其实做 coach(或者是 manager)一段时间后你就会发现,有时候学生做不成一件事情并不是能力问题,而是心理上有一道坎没办法迈过去。心理上这道坎,往往是对未知的恐惧,害怕自己失败,而不敢踏出自己的舒适感区域(comfort zone)。这时候教练的角色非常重要,既需要有同理心(empathy)理解学生为什么没办法迈出这一步并且关怀学生的情绪,又要在恰当的时机下得了狠心强迫学生走出这一步。学生走出这一步的过程可能会相当地痛苦,但抵达彼岸时他会想明白为什么这是必须的,同时也会感谢教练。

如果人类好像机器一样没有情绪永不倦怠,其实学习能够变得高效很多。机器学习的算法你想跑就能跑,机器永远不会说「我今天学累了,明天继续吧」。但正因为我们不是机器,一个好的教练要能帮助学生避免倦怠的情绪。通过对同行的观察,我发现保持教学内容简短和有趣非常重要,这也是现在短视频(10 分钟左右)教学的趋势。我之前在《牛油果烤面包》播客节目上采访过飞行员教练 Simon,他告诉我 FAA(美国联邦航空管理局)沉甸甸的手册上有丰富的知识,但大家很难看得进去,于是纷纷上网购买其它飞行员教练录制的视频课程,因为视频里的各种冷笑话让学生保持兴趣。在获取知识的成本无限趋近于零的今天,所谓「知识付费」并不是付费给知识本身,真正的附加价值存在于对知识的加工,使得知识变得容易消化。

总结一下,career coaching 的价值往往不在于知识本身,而在于帮助学生变成更好的自己。在这个过程里,知识很重要,但往往并不是价钱的主要部分,因为现在网上无数成本接近于零的知识。真正值钱的是如何保证学生能够消化和吸收正确的知识,最终达成自己的目标。


最后,我对于 career coaching 在经济学和社会学的大环境下还有一些思考吧。接下来我会再写一篇《Career Coaching 消费的思考》来跟大家聊聊。如果你不想错过下一篇文章,欢迎通过邮件RSS/Atom 订阅我的博客。