几个系统设计问题的解决思路

曾经写过一些系统设计方面的思考(比如 这个这个),但是最近准备面试,又接触了更多系统设计方面的问题。这里我想简单记录一些典型系统设计问题的思路。通过学习常见的系统,在心中形成一些问题解决的套路,以在思考和分析新问题的时候提供一些既定思路。很抱歉时间关系写得很简略,主要是提示一些思路和方向。

设计 Tweeter
两种常见模型的 trade off:

  • Pull on demand: merge x timelines
  • Push on change: async, read once to get them

缓存的设计,cache through

设计 Web crawl[……] 阅读全文

近期面试求职的经历和感受

好久没有更新了。回来报个到,也向关注和提醒我 blog 更新的朋友们道个歉。原因在于,最近非常忙,忙于找工作。现在下家还没有定下来,手头有几个 offer,还在考虑中,但是很快会决定下来,然后更新更进一步的信息。无论如何,blog 的更新已经恢复正轨。
通常人的一生中不会有太多属于自己的求职季节,尤其像我这样的,总觉得在一个地方需要积累,因而并不是频繁跳槽的粉丝。第一份工作在华为, 我干了三年半 ;第二份工作在亚马逊,直到现在,超过了五年半。职业生涯的前方就将是第 10 个年头。

为什么是现在?

三年半前我通过 L 签证来到西雅图,而 L 签证是不能够更换雇主的,因而自然也不用考虑工作变更的可能性。去年 [……] 阅读全文

求第 K 个数的问题

一道经典的题目。给一堆乱序的数,如果它们从小到大排好,求第 k 个是多少。假设排列的下标从 1 开始,而非 0 开始。

这个问题如此之简单而熟悉,可它却可以是很多现实问题的某一个子问题的抽象。它本身相关的问题其实就不少,而且还可以不断演进,成为不同复杂程度的问题。

看到这个问题,脑海里的第一反应是一左一右红蓝两条分支——堆排序或者快排。Java 中快排用 Arrays.sort 就可以了,如果是堆排序需要用到 PriorityQueue。 用 Arrays.sort 写起来最简单(这里的参数校验都省掉了):

public int getKth(int[] nums, int k) {
    int[

[……]阅读全文

分布式系统中唯一 ID 的生成

其实老早就像写一点这个话题。几乎我见过的所有大型系统中,都需要一个唯一 ID 的生成逻辑。别看小小的 ID,需求和场景还挺多:

  • 这个 ID 多数为数字,但有时候是数字字母的组合;
  • 可能随机,也可能要求随时间严格递增;
  • 有时 ID 的长度和组成并不重要,有时候却要求它严格遵循规则,或者考虑可读性而要求长度越短越好;
  • 某些系统要求 ID 可以预期,某些系统却要求 ID 随机性强,无法猜测(例如避免爬虫等等原因)。

独立的生成服务

比如数据库。最常见的一种,也是应用最多的一种,就是利用数据库的自增长序列。比如 Oracle 中的 sequence 的 nextVal。有多台 application 的 h[……] 阅读全文

React+Redux 组合使用之感受

最近完成了一个使用 React+Redux 组合的项目,以前仅仅是接触了解以及学习,并未正儿八经地使用过,因此这一次可以说是第一次完整地再一个项目当中使用。因而对于认识之浅显请轻拍。

从架构和层次的层面,这个组合给我最好的感受是干净利落的解耦。有不少 JavaScript 框架尝试解决解耦问题,但是到了落实的层面上很容易出现分层分模块不容易严格控制,缺少清晰标准等问题。但是 React+Redux 的组合没有这个问题,我们把应用中 JavaScript 的部分分层为 action、client、config、constant、reducer、store、util 和 view 几个部分,其中 view 又进一步划分 [……] 阅读全文

再谈谈工程师

IMG_1989 昨天去参加了一个公司内的 expo,大致就是以团队为单位组织起来,做广告,招呼各种工程师去看,有团队介绍,产品介绍,技术介绍;有披萨、啤酒和零食;也有一些填方格的活动供参与和纪念衫可以领取。我们组也大张旗鼓地伴着各种搞笑的口号和宣传材料上阵了。挺有趣的一件事情,也是很有工程师文化的事情。

以前谈过不少关于工程师的话题,比如 这个这个这个 ,今天想再谈谈。

其实自我工作以来,软件工程师这个职位变化很大,无论是职责、技术、待遇,但是不变的是,我看到优秀的工程师至始至终非常抢手,而且需求量很大。不扯没用的,任何行业优秀的角色都受欢迎,但是就我熟悉的 IT 公司来说,软件工程师始终处于特别的存在 [……] 阅读全文

谈谈于丹

对,就是百家讲坛那个号称研究古文的“学者”于丹。

鸡汤满世界都是,我很少在意;知识分子谈论观点和看法千千万,多么奇葩有趣的都有,我很少痛恨知识分子。但是于丹是个例外。

与我而言,知识分子如果只专注分内之事,执着于学术范畴,无疑是所谓的“本行工作”,无论正误,都是无可过度指摘的。毕竟观点迭出才有万象世界,只有反复质疑才有科技与社会之进步。

还有一类知识分子,他们不甘寂寞,他们涉足传道授业,他们涉足启迪民智,通常他们更令人尊敬。因为这并非本行,当然也不可说越俎代庖,毕竟没有人专职干这个。

但是有一些人,他们传“道”,但是愚民,他们的面皮撕下来,就是一张维护统治阶级少数人的嘴 [……] 阅读全文

关于中国的学校教育,我的几点杂乱的看法

来美国工作生活已经三年了,早就过了适应期,一些酸甜苦辣也尝到了。经常和同事讨论各个国家的趣事,经常涉及到的话题是教育。事实上这也是个敏感话题,而且似乎是个永久热门的话题。我不想扯得太远,只想表达对于国内学校的课程教育,我的其中几个观点。

英语从高考中撤走?

众所周知,国内的应试教育决定了,如果高考不考,基本上课程就和放松之用的选修课差不多。无数的父辈都教育我们要把英语学好,可是每当我们跟上问一句“为什么”的时候,除了“高考要考”之外,并没有什么强有力的理由,在耳边来回倒腾的无非是“要和外国人对话”啊,“中国要国际化”啊云云自己都不太相信的鬼话。这就好像很多家长要逼着小孩子学琴一样,[……] 阅读全文

一个前端项目,到底要集成多少库和工具

最近忙于一些新做的项目,由于新入手,就想着往最佳实践去靠,也寻找一些可以借鉴的模板。其中前端的部分,有很成型的模板可以借鉴。大幅度减少了自己调查和集成的工作量。但是仔细看看,发现这里头的概念太多了,各种开源的库和工具,有人说“前端玩的是广度”是有道理的。

这个新项目并不算特别复杂,大致的技术是基于 React+Redux 的,但是大体上集成完毕以后,完成了几个 demo 的代码之后,粗粗地过了一遍,除了传统意义上的 HTML+CSS+JavaScript(遵循 ECMAScript 6 的标准)三大件,居然涉及到了那么多技术,把自己吓了一跳:

  • React: an open-source dec

[……]阅读全文

继续说说“在家办公”

我在几年前写过一点对于 在家办公 的理解,经过最近几年的感受,时不时地需要在家办公,零零散散陆陆续续有了一些新的感受。

首先要明确的是,团队的支持是最重要的。需要一个宽松的团队氛围,能够获得足够的信任,这些都是软基础。如果同事和上司不信任,这件事情是不可能办成的。对于那些把员工视为不可靠、不安全因素的公司,在家办公也是难以实现的。

开发环境。以往我一个不愿意在家办公的重要原因是,我的开发环境都部署在 desktop 上面,从家里无论是通过 Microsoft Remote Desk 还是 NoMachine 之类的连接(我还试过一些别的持有图形界面连接的方式),都不够理想,一顿一顿的,写代码很难受 [……] 阅读全文

写在老梁事件发生之际

一个我很喜欢的时评人,老梁(梁宏达)最近被 封杀 了。原因只是用质疑的语言评价了一些传统意义上的正面光辉形象,比如雷锋、焦裕禄等等。他的观点与官媒背道而驰,于是伟光正的广电总局终于无法忍受,封杀了他。事实上,他还没太敢触及更尖锐的话题,涉及更惊人的人物春秋。你我都明白,他是收着说话的,他是说好听话的,他还是尽量缓和地在歌功颂德中揭露一些丑恶。

  • 我记得最近一年来,我喜欢听这么几个人的评论或者脱口秀节目:
  • 罗辑思维的罗振宇,听他讲历史、讲社会问题挺有趣,生动而且视角独特,但是他不太讲尖锐的社会问题,不太讲当今国内的政治问题;
  • 大唐雷音寺的老梁,我最喜欢的地方在于,对于社会时事热点,能够

[……]阅读全文

克罗恩病

这是一个关于自己的故事。

大概是去年我被诊断出克罗恩病的,要说以前,大概只是大概知道它是什么,我想对于大多数人来说,这只不过是一个名词而已吧。

去年 9 月份的时候,吃完虾以后,突然感到恶心腹痛,吐了又吐,难以忍受。实在没招了,凌晨的时候,我老婆开车把我送去邻近医院急诊。CT 显示小肠末端处于发炎状态,有严重的狭窄,因此食物下不去。为这事儿住了两天院观察,做了一堆检查,严格禁食,等到炎症缓和一些,就出院了,但是医生告诉我,但愿只是病毒引起,也可能是别的疾病,但必须去完善肠镜。

一个月以后,除了巨额账单,肠镜的结果更令人失望,除了小肠末端狭窄依然存在以外,活检发现一些肠壁的损伤,包括 [……] 阅读全文

LeetCode 题目解答—— 第 311 到 371 题

[Updated on 9/22/2017] 如今回头看来,里面很多做法都不是最佳的,有的从复杂度上根本就不是最优解,有的写的太啰嗦,有的则用了一些过于 tricky 的方法。我没有为了这个再更新,就让它们去吧。

老规矩,跳过需要付费的题目。题目是越来越不好做,我尽量把自己的思路写下来。

371

51.9%
Easy

368

31.9%
Medium

367

36.9%
Medium

36[……]阅读全文

一些前端框架的比较(下)——Ember.js 和 React

JavaScript framworks

这是前端框架比较和吐槽的第二篇。

Ember.js

Ember.js 的 extend 的写法很类似于 JQuery 或者是 Backbone.js,创建 Application,然后在它下面创建相应的 Model(Object)、Controller、Router、View 和 Template,这些都是非常类似的。但是它更为先进的地方在于,一些重复的样板代码,比如给 template 注入上下文并渲染,如果命名按照 CoC 的原则正确完成的话,都由框架自动完成,这就省去不少体力活 。CoC 还体现在 URL mapping 上面,比如”/books/book_id” 配置在 books.index 的 Router 里,Contro

[……]阅读全文

一些前端框架的比较(上)——GWT、AngularJS 和 Backbone.js

JavaScript framworks

和一些前端框架打过交道,想起来这也是技术选型中经常面对的内容。我把我的经验、思考、感受,甚至是吐槽,记录在这里,有些零散,并且更多的是个人的感悟。而且由于技术所限,可能部分内容不够深入,或者不甚客观。当然,网上有很多分析对比,视角可能更为全面和系统。如果你在技术选型,或者在考虑要学习使用哪一款 MVC/MVP/MVVM 框架的时候,此文能够给你有价值的信息,就更棒了。如果你觉得我哪些部分说得不正确,或者需要补充,也烦请告知。

需要预先说明的是,这篇文章不是教程,因此如果你对其中某一框架知之甚少,可能需要先去简单学习了解以后才能和我产生共鸣,或者产生反驳的冲动。

以下是第一部分,先谈谈 GWT、An

[……]阅读全文

技术光谱

compare

最近在做一些技术选型的工作,忽然想到,可以把接触过的一些技术通过“相互比较”的方式整理起来,知其利弊,也把知识内容线索化。这其中大部分是我使用过的,但是也有一些是因为某些原因而学习过的。有一些文章因为时间的关系,比较起来现在我的看法已经发生了改变,但我还是原封不动保留着。对于想做但还没有完成的部分,我会放置一个“TODO”的标记。这个列表会不断更新。

编程:

系统:

[……]阅读全文

文档那些事儿

还记得在 2008 年我做毕业设计的时候,自己心里有一个朦朦胧胧的概念,大概是说,要规范,制度上有标准,流程上有遵循。于是噼里啪啦整了软件工程十项文档,再加上一些辅助性文档就有了下面这个清单。我以为那样的全面会带来更好的评价,但是老师说,“太多了”,我很困惑,难道文档全面、综合,而且完备,这不好么?

image

在 Amazon 有一个大家都知道和反复自黑的事情。所有 team 都用 wiki 来记录和维护项目、产品有关的事情,但是绝大多数 wiki 的内容都是过时的和不准确的。有几次和其他互联网公司的朋友讨论过这个话题,大家都付诸呵呵一笑,原来大家都差不多。这让我思考,是不是文档这样的东西,和代码不同,它更容易过时,它

[……]阅读全文

游戏中的货币和通货膨胀

Image result for 通货膨胀忽然想谈谈这个话题,是因为最近开始接触一款游戏《Path of Exile》。它可以说是市面上最接近暗黑 II 的游戏,甚至比暗黑 III 还要接近。作为一个暗黑 II 的十多年的爱好者,它自然引起了我的兴趣。我渐渐发现它有许多吸引我的地方,而其中关于游戏中货币的设计和对通货膨胀的压制都很值得玩味。

不可否认《暗黑破坏神 II》影响了一代人,也影响了无数后续的游戏设计制作人,其中不少独创性的设计都让人印象深刻。比如从 1.10 开始成熟的技能树和技能加成系统,比如地图自动生成系统,比如怪物、武器装备的生成规则(前缀、后缀等等),再比如真实化打击感的设计(打击感即便放到今天依然先进)等等。毫无疑问我从太多的游戏后

[……]阅读全文

写在孩子出生以后

IMG_0038 最近这一年可谓五味陈杂,各种起伏波动陆陆续续袭来,有时候感到生活艰辛,身心疲惫。就在一周前,也就是 11 月 8 号的时候,我们的孩子 Lucas 诞生了。整个降临过程持续了一昼夜,也折磨了他妈妈 24 个小时。好在最后母子平安健康。古人说,三十而立,而在 30 岁这一年同时也做了爸爸,这对我来说是一个巨大的变化。以往总在说成长,现在要说成熟,有了孩子以后,有许多生活上的琐事需要去做,而教育更是一个无比重要神圣的事情。我相信会多一些欢声笑语,也会多不少困难烦恼。无论如何,这是一个人生旅途上的重要节点,我也开始思考一些过去不曾思考的问题。我想用朴素的文字,记录一点内心的感受。

对 Lucas 的祝愿

IMG_0052 在微信朋友圈里

[……]阅读全文

从工具使用的痛苦说开去

painful

是因为最近团队里的数据分析师(data analyst)向我抱怨,为了分析数据,要跑 job,要执行 pipeline,要用 Spark 来算结果,但是期间遇到各种问题,虽然我们一起研究问题的解决方法,但是依然非常耗时而且令人沮丧。这些问题大多并非数据本身的问题,而是工程问题。换言之,我认为数据分析师的价值在于数据思维,他们有我们软件工程师不具备的数据敏感性,他们能从海量的数据中获得有价值的信息——但是如今他们却陷入了因为工具问题而导致才华无法施展的境地,确实令人叹息。而工具的问题,正是应该由软件工程师来解决的。

上班同车的同事 Kai 和我说,现在和几年前不同的是,“全民 dev 化”了。除了上面说的数据

[……]阅读全文

back to top