第七扎,张五常专题

  • 《中国的经济制度》 张五常著.译,北京:中信出版社,2009.9,ISBN 978-7-5086-1643-8
  • 《多难登临录:金融危机与中国前景》 张五常著.译,北京:中信出版社,2009.11,ISBN 978-7-5086-1724-4
  • 《货币战略论:从价格理论看中国经验》 张五常著,北京:中信出版社,2010.1,ISBN 978-7-5086-1804-3
  • 《五常学经济》 张五常著,北京:中信出版社,2010.1,ISBN 978-7-5086-1836-4
  • 《新卖桔者言》 张五常著,北京:中信出版社,2010.1,ISBN 978-7-5086-1885-2
  • 《佃农理论(英语原著,中文引言),The Theory of Share Tenancy》 张五常著,北京:中信出版社,2010.5,ISBN 978-7-5086-2028-2
  • 《吾意独怜才:五常谈教育》 张五常著,北京:中信出版社,2010.11,ISBN 978-7-5086-2407-5
  • 《重寻无处:五常行游录》 张五常著,北京:中信出版社,2010.12,ISBN 978-7-5086-2505-8
  • 《经济解释,卷一,科学说需求》 张五常著,北京:中信出版社,2010.6,ISBN 978-7-5086-2083-1
  • 《经济解释,卷二,供应的行为(上篇)》 张五常著,北京:中信出版社,2011.2,ISBN 978-7-5086-2638-3
  • 《经济解释,卷三,供应的行为(下篇)》 张五常著,北京:中信出版社,2012.7,ISBN 978-7-5086-3375-6
  • 《经济解释,卷四,制度的选择》 张五常著,北京:中信出版社,2014.3,ISBN 978-7-5086-4404-2
  • 《经济解释:张五常英语论文选,Economic Explanation: Selected Papers of Steven N.S.Cheung》 张五常著,北京:中信出版社,2012.9,ISBN 978-7-5086-3445-6
  • 《经济解释,Economic Explanation 2014 Edition》 张五常著,中信出版社
  • 《多情应笑我:五常散文选》 张五常著,北京:中信出版社,2013.4,ISBN 978-7-5086-3828-7

第五扎,计算机类(二)

  • 《MySql性能调优与架构设计》,简朝阳著,北京:电子工业出版社,2009.6,ISBN 978-7-121-08740-0
  • 《HTML5触摸界面设计与开发》,(美)伍兹(Woods,S.)著,覃介右,谷岳译,北京:人民邮电出版社,2014.4,ISBN 978-7-115-34352-9
  • 《HTML5精粹:利用HTML5开发令人惊奇的Web站点和革命性应用》,(美)高奇特(Gauchat,J.D.)著,曾少宁,张猛,赵俐译,北京:机械工业出版社,2012.9,ISBN 978-7-111-39771-7,书名原文:HTML5 for Masterminds:How to Take Advantage of HTML5 to Create Amazing Websites and Revolutionary Applications
  • 《HTML5和CSS3权威指南(第2版.上册》,陆凌牛著,北京:机械工业出版社,2013.1(2013.7重印),ISBN 978-7-111-41247-2
  • 《HTML5和CSS3权威指南(第2版.下册》,陆凌牛著,北京:机械工业出版社,2013.3(2014.3重印),ISBN 978-7-111-41699-9
  • 《HTML5移动Web开发指南》,唐俊开著,北京:电子工业出版社,2012.3,ISBN 978-7-121-16083-7
  • 《深入理解Bootstrap》,徐涛著,北京:机械工业出版社,2014.5,ISBN 978-7-111-46479-2
  • 《Backbone.js实战》,陶国荣著,北京:机械工业出版社,2014.3,ISBN 978-7-111-45989-7
  • 《Backbone.js开发秘笈》,(乌克兰)米尔哥罗德(Mirgorod,V.)著,王宇译,北京:机械工业出版社,2014.4,ISBN 978-7-111-46080-0,书名原文:Backbone.js Cookbook
  • 《微信公众平台应用开发:方法、技巧与案例》,柳峰著,北京:机械工业出版社,2014.1(2014.3 重印),ISBN 978-7-111-45332-1
  • 《React:引领未来的用户界面开发框架》,卓越开发者联盟著,寸志等译,北京:电子工业出版社,2015.5,ISBN 978-7-121-25936-4,书名原文:Developing a React edge:the JavaScript library for user interfaces
  • 《轻量级Web应用开发》,邱俊涛著,北京:人民邮电出版社,2015.7,ISBN 978-7-115-39152-0
  • 《跨终端Web》,徐凯著,北京:电子工业出版社,2014.6,ISBN 978-7-121-23345-6
  • 《流量的秘密:Google Analytics网站分析与优化技巧》,(英)克利夫顿(Clifton,B.)著,钟镭译,北京:人民邮电出版社,2010.2(2011.8 重印),ISBN 978-7-115-22001-1
  • 《Google:Google成功的七堂课》,罗耀宗著,北京:电子工业出版社,2005.7 ISBN 7-121-01357-6
  • 《拒绝黑客:ASP.NET Web应用程序安全性剖析》,(美)伯内特(Burnett,M.M.)著,良忠译,北京:电子工业出版社,2005.2,ISBN 7-121-00405-4,书名原文:Hacking the Code:ASP.NET Web Application Security
  • 《Node应用程序构建:使用MongoDB和Backbone》,(美)威尔逊(Wilson,M.)著,林冀,范俊,张鹏译,北京:人民邮电出版社,2014.4,ISBN 978-7-115-34629-2
  • 《Web前端开发最佳实践》,党建著,北京:机械工业出版社,2015.1,ISBN 978-7-111-48843-9
  • 《精通 Web Analytics 2.0:用户中心科学与在线统计艺术,Web Analytics 2.0: The Art of Online Accountability & Science of Customer Centricity》 (美)卡希克(Avinash Kaushik)著,郑海平、邓天卓译,北京:清华大学出版社,2011.5,ISBN 978-7-302-25081-4
  • 《UML 基础和Rose建模案例(第2版)》,吴建,郑潮,汪杰编著,北京:人民邮电出版社,2007.4,ISBN 978-7-115-15891-8
  • 《ES6标准入门(第2版)》,阮一峰著,北京:电子工业出版社,2015.12,ISBN 978-7-121-27657-6
  • 《ECMAScript 6 入口》,阮一峰著,北京:电子工业出版社,2014.8,ISBN 978-7-121-23836-9

第九扎,经济学专题(二)

  • 《新结构经济学》 林毅夫著,北京大学出版社
  • 《本体与常无:经济学方法论对话》 林毅夫著,北京大学出版社
  • 《繁荣的求索:发展中经济如何崛起》 林毅夫著,张建华译,北京大学出版社
  • 《解读中国经济:聚焦新时代的关键问题》 林毅夫著,北京大学出版社
  • 《中国经济专题(第二版)》 林毅夫著,北京大学出版社
  • 《薛兆丰经济学讲义》 薛兆丰著,中信出版集团
  • 《代谢增长论:技术小波和文明兴衰》 陈平著,北京大学出版社
  • 《两次全球大危机的比较研究》 刘鹤主编,北京:中国经济出版社,2013.2,ISBN 978-7-5136-2310-0
  • 《八次危机:中国的真实经验 1949-2009》 温铁军等著,北京:东方出版社,2012.10,ISBN 978-7-5060-5557-4
  • 《凯恩斯文集(上、中、下卷)》,(英)凯恩斯著,李春荣,崔铁醴等译,北京:改革出版社,1999.10,ISBN 7-80143-090-5/F.050
  • 《就业、利息和货币通论,The General Theory of employment, interest and money》 [英国]约翰-梅纳德-凯恩斯著,徐毓枬译,译林出版社

第八扎,经济学专题(一)

  • 《财富的起源,The Origin of Wealth》 (英)埃里克-拜因霍克著,俸绪娴,刘玮琦,尤娜译,杭州:浙江人民出版社,2019.10,ISBN 978-7-213-09419-4
  • 《经济学及赋税之原理,On the principles of political economy and taxation》 [英国]大卫-李嘉图著,郭大力、王亚南译
  • 《国富论,An Inquiry into the Nature and causes of the wealth of nations》 [英国]亚当-斯密著,郭大力、王亚南译,译林出版社
  • 《道德情操论,The Theory of Moral Sentiments》(英)亚当-斯密著,赵康英译,华夏出版社
  • 《经济学原理》 (英)阿尔弗雷德-马歇尔著,高建刚编译,北京:中国工人出版社,2016.9,ISBN 978-7-5008-6533-9
  • 《经济学,Ecomomics 第18版》 [美]保罗-萨缪尔森(Paul A. Samuelson),威廉-诺德豪斯(William D. Nordhaus)著,萧琛主译,人民邮电出版社
  • 《经济学原理(第7版)》 (美)曼昆(Mankiw, N.G.)著,梁小民、梁砾译,北京:北京大学出版社,2017.9,ISBN 978-7-301-28608-1
  • 《经济学原理(上册、下册)(原书第3版),Principles of Ecomomics》 (美)曼昆(Mankiw, N.G.)著,梁小民、梁砾译,北京:机械工业出版社,2003.8,ISBN 7-111-12676-9

书法专题

  • 《欧阳询楷书入门基础教程.九成宫醴泉铭》,田英章主编,长沙:湖南美术出版社,2015.6,ISBN 978-7-5356-7262-9
  • 《欧阳询楷书间架结构 100 法(附《九成宫》)》,张永珍等编著,华夏出版社,1996年9月北京第1版,ISBN 7-5080-1047-7/J.108
  • 《欧阳询九成宫醴泉铭(三井本)》,中华书局编辑部编,北京:中华书局,2017.8(2019.4 重印)(中华经典碑帖彩色放大本),ISBN 978-7-101-12641-9
  • 《欧阳询《九成宫碑》技法》,杨树会著,呼和浩特:内蒙古人民出版社,2010(历代名家碑帖技法),ISBN 978-7-204-09417-2
  • 《欧阳询心经》,张波著,合肥:安徽美术出版社,2017.1(经典碑帖笔法临析大全/洪亮主编),ISBN 978-7-5398-7378-7
  • 《唐.欧阳询楷书心经》,安建炜编,西安:西安出版社,2016.12(历代名家书心经墨迹),ISBN 978-7-5541-1955-6
  • 《皇甫君碑》,天津古籍书店编辑室,一九八八年五月 `
  • 《溥儒书金刚般若波罗蜜经》,溥儒书,上海:上海书画出版社,2005.7,ISBN 978-7-80725-040-1
  • 《书法练习指导.八年级.上册》,杨广馨,欧京海主编,北京:人民美术出版社,2014.9,ISBN 978-7-102-06431-4
  • 《钢笔书法创作技法》,李放鸣编著,天地出版社,1998年3月第一版,ISBN 7-80624-158-2/J.11
  • 《清明上河图》,天津人民美术出版社,2009年5月第3版,ISBN 978-7-5305-1283-8
  • 《古典与唯美:西蒙基金会藏欧洲 19 世纪绘画精品》,中华世纪坛世界艺术馆编,北京:文物出版社,2008.2,ISBN 978-7-5010-2424-7

天下武功 唯快不破

引言

这个演讲的标题是《天下枪法 唯快不破》,副标题是《江湖人称二炮十三秒的快枪手分享对快的思考》。如果是在小范围内分享,使用这样的标题,对宅男腐女来说还可以,既可以讨论问题,也可以调剂气氛。如果演讲的现场突然来了好多人,使用这样的标题就不太合适了,毕竟我们中也有纯真的,看到污段子就感觉身体不适,比如我。如果范围再扩大,有各个团队的人,甚至还有一些领导参加,我们的演讲就要正式很多,不能胡云八侃。这些情况往往是到了现场才会知道的,这个时候演讲的标题已经打在了幕布上,临时更换就不太合适。即便要临时更换的话,也要重新思考新的标题、新的副标题,还要打字换上,既需要时间,也显着不优雅。

如何在神不知鬼不觉间,以魔术级别的时间换掉标题?这就引入了我们的主题,“快”。

如何做到这么快呢?其实我提前准备几个标题就可以了。范围稍大,我们演讲的主标题可以是《天下剑法 唯快不破》,副标题可以是《什么叫做快? 如何做到快?》。如果范围再扩大,这种以剑客自居,给事物下定义的做法就显得太狂妄了。在大佬云集的场合做汇报分享,说话要严谨。我这个特定的个人,在一段特定的时间里,通过观察一些特定的人、一些特定的事,对开发速度这件事作了一些思考,现在给大家分享一些思考的片断。主标题也不能乱篡改,还是要恢复到大家都知道的《天下武功 唯快不破》。

其实第一组标题的副标题使用了三个典故,一个污的、一个不污的、一个中性的。至于你看到的是哪个,这是一个知者见知、淫者见淫的事情。我简单讲解中性的这个典故,其他的两个大家可以根据兴趣深入研究一下,限于时间不再一一讲解。二炮,就是解放军第二炮兵部队。当然前段时间军队改革,改成了火箭军。在液体燃料、井式发射的时代,灌装液体燃料从准备到完成要几个小时,甚至以天计,发射井建设要以年计。但是军委下了二炮打击决心,导弹发射从准备到打出去,是要以秒计的。军队的口号是召之能来、来之能战、战之能胜。军委下了打击决心,你说要花几年挖发射井,花几天灌装燃料,那哪行呢。这个项目delay,估计我们都被人团灭好几轮了。

在正式开始之前,我们不能不纪念一下金庸(1924年3月10日—2018年10月30日)先生。我们在这里提到的很多概念,都是读他的小说知道的。

其实这个主题主要讨论的是两个问题,什么叫做快?怎样做得快?归根到底,讨论的是一个POWER问题。什么是POWER,知识,力量,科学,真理,权柄、话语权?知则有权,比如知府、知县、知心姐姐,都是有权柄的。在现实中,不可能、也没有必要做到无限快。我们做到比对手盘的预期快就可以了。比如,比老板的预期快、比产品经理的预期快,比项目经理的预期快,比合作伙伴的预期快。

什么是快?

  • 快是响应的时间短
  • 快是效率高
  • 快是成本低
  • 快是要素结构没有瓶颈
  • 快是生产力发生革命性质变
  • 快的预期需要管理

缩短响应时间

一副神奇的画

当年360和腾讯在3Q大战的时候,腾讯公司迅速封掉80端口的接口,掐死360的网页应用。为了满足大量用户使用网页聊天的需求,腾讯迅速推出了QQ的网页版本。我简单看过这个网页版本的产品,作为一个前端工程师,马上就能判断出,这是一个不可思议的工作量。腾讯公司是怎么在一两天的时间内快速推出这个产品的?

以前经常思考7×24的快速反应团队,他们是怎么做到的?就像一副神奇的画,一个小牧童,牵着一头牛,拿着一把伞,晴天的时候伞是夹着的,下雨的时候伞是撑开的。太神奇了!

2011年5月1日,22名海豹突击队乘坐直升机奇袭本拉登位于巴基斯坦境内的住所。三个月以后,2011年8月6日晚,塔利班民兵用一发RPG火箭弹命中了CH-47直升机,其上乘坐的22名海豹突击队员全部遇难。塔利班发布新闻,宣称他们干掉了袭击本拉登的海豹突击队22人队。美国人紧接着发布新闻,说明遇难的22人是袭击本拉登的22人队,但是不是那22人。这组新闻看得我云山雾罩,啥意思啊?我仔细捋了一下才知道,海豹突击队一支22队是分三组22人的。在同一时间,有一组在执行任务,有一组在战备训练,有一组在休假。从此以后,我对7×24的快速反应就有了深刻的理解。

听刘宝瑞先生说单口相声,那副神奇的画卖20万,买家一番砍价,砍到了10万。拿回家后,趁下雨的时候大宴宾客,想嘚瑟一下神奇画作。但是,伞却没有撑开。然后找卖家理论,卖家说这画是卖20万的,你非得砍到10万,那只好卖给你这一张了。

QQ的网页版本魔术是怎么实现的,我不知道。以理度之,我猜是这样,为了应对市场的需求,腾讯的产品开发团队开发出了一个网页版本的QQ。硬生生的掐断线上已有方案,代价大、阻力大、成本大,所以迟迟不能上线。当此之时,爆发了3Q大战,决策团队审时度势、快速决策,直接把锅甩给了360。

科学没有神奇,神奇都是领域内行表演给外行的魔术。

三家快剑流派

丁坚的一字电剑剑光唬人,是快剑。田伯光刀光闪烁,逼的令狐冲只能招架不能还手,是快刀。这些都不讲,因为太LOW,使起来夺人真气,缺少一种行云流水的美。昆山刀客7秒钟砍5刀,3处骨折,全是开放性创伤。刀法虽然凌厉,也不过是市井斗狠的小角色,不值得效仿。

今天咱们层层递进的讲三种剑法。

第一种,出手都是咄咄逼人的进手剑,特点是环环相扣,一气呵成。想不出金庸武侠里哪家剑法是这个路子,先不起名字了,姑且就叫无名剑吧。以后想起来再说。

第二种是华山派的独孤九剑,不再是连环出剑,只是在对手出招时出手反制。后发先至,也是咄咄逼人。

第三种是全真派的定阳针。一起手,剑气就笼罩自己以防身,笼罩对手随时取其狗命。这剑法温文尔雅,眉目间洋溢着慈悲喜舍,浑身上下散发着真理的光辉。

无名剑

魔教几位PM抬着一口大锅,猛得向武当派FE张五侠砸过来,把素素妹子担心的够呛。翠山在大锅飞至头顶时,一挥手长袖飘飘,五根手指借力使力,扶住大锅一旋,这锅就改变方向往魔教PM们砸去。魔教PM们吓得赶紧四散躲开,那锅咣当就砸在地上摔得粉碎,地面都砸出了尺把深的一个坑。他长袖飞舞,手掌隐在袖中,旁人看来,竟似以衣袖卷起大锅,掷向天空一般。整个天鹰教顿时鸦雀无声,片刻后彩声四起。素素嘴角上扬,得意的笑着扑进了白眉鹰王的怀里。

PM们手脚没有什么轻重,别管看见什么,都会随手扔过来,不能使蛮力硬接。这次他们扔个大锅,你硬接了。下次他们念动咒语,使个遣山之法,把三座大山调过来压你,你何以应对?你就是齐天大圣,也会被压的三尸神诈七窍喷红。

张翠山借力使力的甩锅手段虽然高明,但并不能解决问题,不能有所斩获。甩锅是另一个话题,不是我们今天要讨论的。借力打力能解决问题,但不是剑法,今天也不讨论。

当一个大问题、一个大需求,像一头大活牛被扔过来的时候,产品经理也觉得这个东西像热狗一样,个头并不小。别一方面,主要是觉得是个活的有机整体,并不能分解。

面对一头大牛,我们不可能像王思聪吃热狗一样一口吃掉。要像前辈丁厨师那样,提剑在手,仔细观察大牛的结构,认真思考大牛各部分间的关系,大胆动手切割。根据切割的实践,再调整观察、思考和用剑方法。

这里边有一个知行合一的问题。认识问题各部分之间的结构、动手的先后顺序,以及结构之间、先后之间的关系,这是其知。手起剑落,不胆怯不迟疑,动作麻利,是其行。知行合一就是,用观察思考的认识指导落地行动,以行动的反馈加深、升华认识。队列、优先级加权队列、泳道队列等等,都是问题结构分解、次序解析的好手段。

我们在一件事情上,浸淫日久,对问题的结构和解析次序,一般是有认识的,通常失于迟疑。

当时曹操在官渡,北有袁绍在冀州,东有刘备在徐州,这是问题的结构。先灭刘备,再灭袁绍,这是解决的次序。这一认识,当时熟知时势的人,都能认识到。曹操之所以是用兵如神的军事家,就在于官渡军中虚立丞相旗号,亲自带兵以偏将名义闪击徐州。在袁绍迟疑之间,徐州城破。当事态明朗,袁绍知道怎么回事儿的时候,曹操已经回兵防官渡了。

换我们处理这个问题时,会发生什么呢?对问题的结构和解决的次序没有什么不同,区别是对动作有迟疑。闪击徐州动作不麻利,刘备就有所准备,问题发生变化。钝兵徐州城下,进不能拔,退为所乘。迟疑之间,袁绍主力破官渡,过黄河,历史就为之改写了。

把问题按结构拆开,各个击破,依次解决。在这里,快不但是目的,也是过程和手段。

华山派的独孤九剑模式

我们还是以打仗来举例。先入战地者为主,后入战地者为客,这个大家都是很清楚的。显然你先到达战场,先有所准备,就会更有把握打胜仗。怎么样使用兵力可以快速的抵达战场?答案就是伏兵最快。

老板有一个创意,产品经理提出一个需求,我们开发团队拿出一个事先埋伏好的系统,这个响应时间是不是最快?

我们工程师刚开始写代码的时候,应变能力不足。几次碰壁后就会学乖,会在代码中打埋伏,提前处理需求可能会出现的变化。马上出现的问题也很明显,就是写了大量未来永远也不会用到的代码,而未来实际发生的变化,又在意料之外。这样就会使开发时间旷日持久,代码臃肿。设计过度,事与愿违。

解决的办法,有很多种,其中一种就是独孤九剑模式。了解业务,了解需求,更准确地研判未来的变化。

令狐冲剑法通神,风清扬传授的秘诀之一,就是不管对手准备使用什么招数,一定会有征兆。认真研究这些征兆,准确地判断对手将要使出的招数,就可以提前埋伏,出剑克制。

了解这些征兆并不难,眼观六路,耳听八方,认真观察,认真思考。业务、产品、研发各团队通力配合,及时沟通,就不会有突然出现的大需求,就可以提前打埋伏。

我们很多人比较认真,其实就是杠子头,硬问如果就是没有征兆怎么办?没有征兆,突然出现的东西,里里外外透着一股子妖邪之气,大家可以脑补一下这种现象。西天取经的时候,孙悟空火眼金睛,总能识别妖怪。他看到了什么?唐老官肉眼凡胎,他看不到的是什么东西?其实猴子看到的,就是没有征兆。啥都没有,所以唐老师就什么也没有看到。我们的工程师们,是在各种需求的三昧真火里锻炼过的。只要认真观察,认真思考,你就会看到事情发生之前的征兆。没有征兆的需求,有时间就玩一下,没有时间就一棒子打死。

认真研究征兆,提前有所准备,就可以表现的非常快。

全真派的定阳针模式

在2008年以前,听到过一个做绿植的人抱怨奥运会的绿植招标。 奥运会的绿植招标,需求、方案、预算都是保密的,不能告诉你,但是让你去投标。需求都不知道,我怎么投标啊?当时那个人就是对这种招标方式非常不满,甚至以阴谋论看待,认为这里面有猫腻。后来我认真思考过这一问题,得出了自己的看法,这里分享一下。如果你是一个一流的绿植公司,在这个领域有不可动摇的话语权,那么你就比奥运会的招标委员会更加懂得可能会有什么样的需求、可能会有什么样的技术手段、可能会有什么样的方案、可能会有什么样的预算?

保密单位保密的原因可能是出于保密的考虑,我们的产品经理保密的原因八成是因为没有想清楚。这个也不能全怪产品经理。事情是渐进明晰的,系统没有做完,没有上线,他就不知道想要一个什么东西。也有可能是因为,事情的本身就一直在变。这些是客观的存在,只能在一定程度上解决,并不能彻底的解决。所有的应对策略,都必须应对这种不确定性。

应对这种不确定性,方案有很多种,其中之一就是定阳针模式。

一个领域问题的光谱,都会有两个端点。在这两点中间,数学意义上有无限个点。在这两种极端场景下,很多表现都是不相同的,甚至截然相反。如果见招拆招,头痛治头,脚痛治脚,就会疲于应付永不休止。在这个时候,我们需要找到适用于这两种场景的规律性认识,并找到解决相应问题的方案,用科学的方法给予证明。这些科学的方法,包括并不限于DEMO验证和沙盘推演的思维实验。这里需要强调的是,并不是所有的认识和所有的解决方案,都要在实际项目中落地实施,大部分是给予科学证明后放入工具就可以了。

DEMO验证这一方法,有必要简单展开一下,包括概念验证,生产验证,规模化验证,规模化系统验证。

如果工具箱的工具质量足够高,我们就可以说你这一招定阳针使的精、气、神俱足。两个端点中间的任何一点,都在你的剑气笼罩之下。在实践中,任何一个点冒出问题,你就可以在一瞬间拿出工具解决掉,一剑封喉。这样的状态,才叫做气定神闲,仙风道骨。唯一的毛病就是平时需要做大量的储备,需要厚积薄发。毕竟台上十分钟,台下十年功,没有什么捷径可走。

日常写代码的时候,如果一个功能第一次出现,命令式也好,面向过程也好,都是可以接受的,你并不需要写出来应对未来所有变化的代码。但是,要用你犀利的眼神,注视你面前的这个问题。这个家伙未来的变化,有没有在你的剑气笼罩之下。如果没有,你前进后退左右一步能不能cover他。如果不能,走位几次可以?除了脑补这些低速的、偏于静态的招式变化,还要思考这个家伙变起仓促的可能性。事变之前会有什么征兆,事变之后会有哪些方向,以哪个招数的哪个变式克制?对的,出招就是独孤九剑。五湖四海皆兄弟,天下武林是一家,定阳针和独孤九剑是可以同时使的。

我们以jQuery时代的写法举个例子,让某个ID的元素实现某种效果。第一步就是先实现,毕竟能上线的代码才是好代码。作为一个优雅的前端工程师,你可能想写成一个组件。如果伸头是一刀,缩头也是一刀,不增加什么工作量,写个组件也好。如果要用不少时间,就且住,毕竟鬼才知道这个效果将来还要不要了。当然,不进行组件化并不妨碍你在写代码的时候,在不增加工作量的前提下,把代码写的优雅,易于组件化。写成组件,一般来说第一个参数是元素ID,将来就可以换ID为不同元素实现同一效果。进一步的话,就是配置组件的效果。且住且住,大胸逮不要自己加戏了。顶多加个配置对象作第二个参数,后面的所有写法纯脑补就够了。一定要克制你设计过度的冲动,冲动是魔鬼。

function demo(id, options){}

那些为快所付出的代价

可能大家想得到一种神奇的东西,掐个诀念个咒语,或者断然割掉身体的某一部分,速度就无比的飞快起来。现在讲了这么一大段,似乎是一定要更强,才可以更快。是的,没错!一定要更强。我们通篇的主题是POWER,如果你不能更强,就是被割的韭菜、被宰的羔羊。这就是宿命。

响应快,有成本,有代价。在某个点上响应太快,就会整体效率低下,整体代价高昂。这是后文要讨论的问题。但是,作为Leader、产品经理、项目经理,必须很清醒的认识到这一点。在工作中最常见的问题之一,就是假定响应快的成本等于零。

总而言之一句话,就是要想缩短一点响应时间,就要数量级的增加需要付出的艰辛努力,就要数量级的付出成本。这里只是讨论了努力的方向,和付出成本的方式。

当然,我能理解大家的诉求,提高了效率、降低了成本的快,才是真的快。

提高开发的效率

同样的产出,使用不同的时间,就是不同的效率。效率要不断提高,这个是没有争议的,是有共识的。但是,对时间度量、对效率的观察,有不同的视角,比如项目经理视角、团队视角和架构视角。观察视角不同,就会产生不同的观察结果,不同的观察结论。

项目的效率

项目是对不确定性的管控。管控的效率就是项目的效率。

团队的效率

团队是人的招募、培养、组织和选拔,工具装备的选用。用人的效率,使用工具的效率,就是团队的效率。

架构的效率

架构是不同质要素的结构。各要素的协同效率就是架构的效率。

整体的效率

有视角的效率都是片面的效率。整体效率是从上帝视角观察到的效率。

战区管战讲得是管项目效率,军种管建讲得是团队效率,军委管总讲得就是架构效率和整体效率。

有一个管总的机构,对提高效率是否有效率,以及必要性的程度,都是一个极具有争议的话题。毕竟副主席被斩下两三个,四总部主管被斩下两个,这些都是反面的证据。

提高效率,不一定会降低成本。有的效率提高是以线性的、算术级数的、几何级数,甚至指数级别的提高成本为代价的。

对公司这样的盈利机构来说,降低成本的效率提高,才是有意义的快。哪怕效率没有提高,速度没有加快,只是降低了成本,都是有意义的。

降低开发的成本

我干一天活,公司给我一百块钱,这是会计成本。当然如果一百块钱也不给我,我就不干了。

这里要讨论的成本并不是工资成本,作为一个严谨的经济学家,要讨论的肯定是经济学意义的成本。这里引入经济学,并不是为了吹牛X,而是因为经济学研究的是如何以最低的成本实现最高的效率。

主要讨论五种经济学成本,分别是机会成本、比较成本、边际成本、准入成本、沉没成本。

机会成本是最大的代价,也就是说你为了做这一件事情,而不能做的另外一件最有价值的事情,就是做这一件事情的机会成本。所以最有经济学效率的做法,就是一直做最有价值的事情。当然,什么是有价值,还需要再讨论。

你如果做次重要的事情,那么最重要的那一件就是你的机会成本。只有一直做最重要的事情,机会成本才会降下来。以掐尖策略处理事务,可以快速缓解各方痛点的压力,非常出快的感觉,这是无名剑的路子。如果步步为营,一个一个的死磕问题,非常容易钝兵坚城之下,进不能拔,退为所乘。

曾国藩结硬寨打呆仗的路子,并不是死磕,要诀是结硬寨,是建立基础设施壁垒。

比较成本是机会成本的另一个说法。一强一弱合作共事的时候,非常有意义,比如带人。

大家平时所接触的开发成本,一般是边际成本,就是每新增一个功能所需的成本,通常以PD计算。所以,平时需要降低的也是边际成本。提高效率可以降低边际成本,这里不展开讨论。除此这外,边际成本要想压低,一般就要增加基础设施的投入,形成边际成本壁垒。这一壁垒的投入成本,就是准入成本。

当我们投入了巨大的准入成本,或者获得了边际成本壁垒,或者什么都没有获得,屁都冇得。不管怎么说,这投入覆水难收,是沉没成本,没有经济学价值。这投入是造价,是会计核算需要考虑的问题,是老板心中的痛,咱不管他。

降低边际成本的手段,一般是设计新的架构、可复用的组件、选用新技术等等。我们以架构成本作展开讨论。评价架构的标准主要是对降低边际成本的贡献。架构的成本基本上可以分为几类,开发成本、看守成本、介入成本和推广的成本。

新架构最好的成本结构是,明显的、大幅的降低边际成本,看守成本小于旧架构看守成本,介入成本等于零。由此可能会大幅增加开发成本和推广成本,关键是如果不能上线,覆水难收,就会归零。

破解要素结构上的瓶颈

制约速度的生产力要素是环环相扣的。解决好瓶颈问题,才可以解放生产力。

要素是有结构的,提高效率的方法也是有结构的。在浅水区的时候,一个要素的进步就可以大幅度的提高效率,降低成本。但是,进入深水区,要素结构的研究就是唯一的路了。

要素结构中的瓶颈问题,就是运动的摩擦力。在有动力加速度的情况下,没有摩擦力的世界是不可想象的。我们的速度只可以更高、更快,无限逼近无限快,而不可能,没没有必要达到无限快。

比如要素可以划分为团队、项目、架构和整体管理,比如要素可以划分为工程师、工具装备、制度和流程,等等等等。之所以不提具体的东西,而是说要素结构,是因为不同的要素结构需要不同的理论来定义的。能指导实践的理论,就是好理论,科学的实践需要科学理论的指导。

这里说的理论,是用于识别要素结构、识别短板瓶颈、提出系列问题,并指导补齐短板,解决瓶颈问题的。我们要不断研究,找到这样的理论,统筹协调要素结构,压茬改进。

重点突破,让其他要素全部成为短板当然是坠吼的了。工业革命中蒸汽机出现,就是最好的示例。这种是生产力的革命,后文讨论。

某一要素出现革命性创新,如果事前没有进行规模化系统的验证,系统结构上的其他要素就会形成普遍性的瓶颈,革命性的要素就会出现开工不足,千里马拉车、拉磨骈,骈死于槽枥之间的事情就会大量出现。用老百姓的话说,这叫窝工。

当然,如果假定革命的成本是零,要素效率的革命性提高是天上掉下来的馅饼,那这一切都不成为问题。然而实际上,要素革命往往是系统养的大白象。系统常态中,不但根本就没有产出,而且只会源源不断的产生沉没成本。

提高效率、降低成本、统筹要素结构,都可以促进生产力水平的提高,但只是量的变化。生产工具的革命、生产关系的革命,才可以带来生产力质上的革命。

迎接生产力的革命

革命并不是饥饿和暴力,而是具备压倒性优势的先进生产力取代落后的行为。

在生产力水平基本不变的条件下,改进生产工具,改进生产关系,就可以取得巨大成功。举两个例子。

初汉三杰的韩信,连百万之众,攻必克,战必取,向无败绩,山东六国一个人灭掉四个,这是很厉害的。读史书分析,秦汉之间生产力并没有革命性的变化,以当时的通讯工具、交通运输工具和作战装备来说,能组织运转起几十万上百万的人来,那项目管理和团队管理的能力确实是真的很厉害。这是改进生产关系取得成功的例证。

在项羽之前,马匹是当动力用的,主要是用于运输,运输粮食、运输兵员。所谓兵车,也是马拉的车,步兵拿长矛长戈站在车上对捅。项羽是改革了对马匹的使用,以马匹代步,发明骑兵战法。我们所熟知的使用长杆兵器的骑兵形象,是明朝发明马蹬以后才有的战法。项羽的骑兵战法很LOW,就是人骑在马上,左手抓住马鬃固定身体,右手拎着砍刀挥舞。就是这么LOW的骑兵,项羽组织了三万人,就把刘邦的五十六万大军,从今天的江苏徐州一直追杀到河南的荥阳,老婆孩子都陷落了。直到遇到山地,步兵据险而守,骑兵不易展开,才止住败势。直到韩信的汉军在北方平定了魏国、赵国、燕国和齐国,政治上又争取了彭越和英布,才扭转了荥阳的败局。这是改进生产工具取得成功的例证。

可以想像一下,生产力发生革命,生产工具发生革命、生产关系发生革命,是一幅什么景象。

中国的骑兵战法始于项羽,终于1949年的咸阳阻击战。大家设想一下,三条防线依次发力。首先是第三防线,各种火炮集中开火。依然冲上来的骑兵,其次由第二防线各种轻重机枪、卡宾枪集中开火。还能再冲上来的骑兵,就在第一防线展开白刃搏斗。对方骑兵使用的马刀短、重、钝,解放军这边使用的是在太原战役中缴获的日本军刀。日本军刀从材质到工艺,都有工业化背景,长、轻、锋利。

世界范围内终结骑兵的是马克沁重机枪。有上面的讲解,这里不再展开讲解了。

这就是生产力的革命。

我们绝大多数人没有能力发起生产力的革命,甚至没有机会遇到大革命。小范围内生产力的革命,发生的概率更大一些。如果遇到了,不要迟疑,去拥抱变化。

管理快的预期

掌握了对快定义的话语权,就可以无限快。有人问科学家波普,您是怎么做到一直站在科学的浪潮之巅的?波普笑了笑说,你们没有发现这浪潮是我涌起的吗?《黑冰》。你跑得再快,也不如给快重新下一个定义。可能你会说,哎呀,你不讲规则。是的,这个世界的规则,是由POWER定义的。

洋葱妹子

昨天写完代码下班儿的时候挺晚的,收拾收拾背包,装好电脑,打算去吃个晚饭。楼下食堂平时都结束的很早,估计早就没饭了。但我还想去看看,如果没有饭,就在外面吃个小面,或者回家煮个粉条吃。

坐电梯到B2出来,在食堂门口看了一眼,肯定没饭啦,灯已然全都熄了。转身准备走,食堂的灯突然全部亮了起来。好奇怪,我探头看了一眼,有个妹子从食堂工作间端着一个餐盘儿走出来,穿着暗紫色的工装,衣角和袖口都有些卷,过膝的裙子也是杂乱的紫色,不乍好看。我问他,食堂还有饭吗?他说有的,你要吃什么?我说随便吃一点吧,只要是素菜没有肉就行。

食堂妹把自己的餐盘儿放在桌子上,又从工作间端出来一个餐盘儿放在我面前。看着整饬的还不错,一个冻豆腐,一个面筋,分别炒了一些青菜,一个紫菜蛋花汤,一碗米饭一角饼。我有心逗个闷子,就说妹子你们这儿现在都是剩饭,我是不是就不用刷卡了?食堂妹白了一眼,似笑不笑的说,想占便宜就直说,吃吧吃吧。

我就坐在食堂妹对面,低头吃了几口。一抬头,猛然间发现,他正似笑不笑的盯着我看。我很诧异的问他,乍了?他说,你怎么不吃肉啊?哦,我说我是虔诚的佛弟子,持戒修行。他问,你姓什么吖?我说我姓周,你叫我培公就好了,我喜欢的妹子们都是叫我培公的。妹子你怎么称呼啊?

我姓杨,食堂妹说,既然信佛,有一首锁链锁虚空的偈子,你知道吗?我说是不是这个,有人要锁周培公,犹如锁链锁虚空,虚空若能锁得住,再来锁我周培公。

食堂妹问我,你不吃肉,那你吃洋葱吗?我说,如果嫩得话,我都可以生吃。食堂妹似笑不笑得看着我,嘴角略微往上一撇,洋葱你都吃,合着五荤三厌全不戒啊。那你戒女色吗?我心中一愣,怎么聊这个话题。这时,我略略的注视了一下食堂妹,衣着打扮虽然不甚时兴,但似笑不笑的也有三分姿色。我半开着玩笑,猥琐的说,如果是妹子你这样的,我是不戒的。

哈哈哈,我们同时笑了起来,吃饭的气氛似乎也不再那么沉闷,很快我就把餐盘儿里的饭吃了个差不多。食堂妹突然似笑不笑的说,看你吃得挺香啊,我去给你拿一个水果。一转身,他就进了工作间,似乎是拿了个苹果出来,暗紫红色的,皱皱巴巴,感觉肮兮兮的。别人白送一个水果,我也不好意思拒绝,也不好多说什么。半开玩笑着说,你那儿话也没有洗,让我怎么吃啊?食堂妹似笑不笑说,那就去你家洗洗呗!我呵呵的笑着,顺手把苹果塞进了背包侧兜里。

回到家洗了洗,就直接光着身子上床睡了,最近写代码确实有点累。睡到半夜,我隐隐约约的听着卫生间好像有淋浴喷头的哗哗水声。饧饧着眼睛,我暗想,昨天晚上洗完澡没有关水吗?实在是想不起来,就从床上坐起来,准备去卫生间把水关了。

刚坐起身,卧室门突然被人推开了,居然是食堂妹走了进来。我赶紧拿毛毯挡在身前,吃惊的问,你怎么来了?食堂妹用我的擦脸毛巾搓着湿头发,似笑不笑的说,不是你把我带回来的么,莫非你不想让我睡这儿吗?

呃。。。我有点儿迟疑,你可以睡隔壁房间。但我心里想,这不扯么,哪跟跟啊这是,他乍进来的。

呵,让我睡隔壁啊,呵呵,他似笑不笑的走到我床前说,那你帮我把衣服脱了吧,锁链儿在背后,我够不着。好,我答应着从床沿儿上站起来,举起双手准备去给他拉开锁链儿。这时,刚才挡在身前的毛毯滑到了地上,下意识的我哈腰去捞,不成想脸却伏在了他的胸口上,立马又尴尬的站直了身子。

他似笑不笑的站在我面前,略仰着头说,在自己家里你还挡什么啊,呵呵。我心里想,你让我给你拉后背的锁链儿,怎么也不转过身来呀?但我还是尴尬的环抱着他,从上到下拉开了锁链儿。手里拿着这件暗紫色的连衣裙,我却不知道应该放在哪儿,因为长期就我一个人,也没有衣架什么的。

你就扔在地上吧,他似乎明白了我的难处,这件衣服不要了。我把连衣裙随手扔在地上,气氛似乎缓和了很多,不再那么尴尬。我端详了一下他,身上还穿着一件淡紫色略透明的连衣裙。这衣服前面也没有锁链儿,就问他,妹子你这件衣服的锁链儿是不是也在后面啊?他点了点头。

我环抱着他,又给他从后面拉开了锁链儿。妹子伏在我耳边说,你都把人家衣服脱了,还叫妹子啊,叫我聪聪吧,我叫聪聪。我笑道,好,这衣服也扔地上吧,反正我家里也没有衣架,明天我带你再去买一件。

这时候我不再那么紧张,也不是那么尴尬了。他身上还穿着一件白色的透明连衣裙,还蛮好看的。他冲我笑了笑,我会意的把他揽在怀里,去拉开后背的锁链儿。鼻子拱到了他的头发,有一股淡淡的洋葱味。我心里笑道,晚上居然吃的是凉拌洋葱。

脱完这件衣服,我看他还真是有七分姿色,但是怎么还有一件连衣裙啊。我就坐在床边,把聪聪揽在怀里,轻轻的抚摸着他的后背,给他拉开背后的锁链儿,能感觉到肌肤的凉爽、柔滑、细腻。脱完这件衣服,居然还有一件。我一手揽着他,一手抚摸着调笑说,聪聪你穿多少件儿衣服来的啊,今天晚上咱还能不能睡觉了?

他突然簌簌的流下泪来,我赶紧抱住哄他道,乍滴了,乍哭了?他伏在我怀里抽泣着说,我突然不知道我是谁,也不知道过一阵子还有没有我?一下子,我感觉这个妹子好陌生,似乎并不认识他,也不知道他因何烦恼,也不知道应该怎么哄他。

我略有所思,喃喃的愕然说,生老病死,求不得,怨憎会,爱别离,都是五蕴炽盛的苦。以金作器,器器皆金。虽有分段生死,虽有变易生死,但其实是不断不常的。色不异空,空不异色,色即是空,空即是色。

妹子止住哭声,伏在我怀里说,我懂了,谢谢你小哥哥。我爱抚着他说,天儿也不早了,我给你脱了这件衣服,我们早点睡吧。聪聪脸色酡红,娇羞的说,最后一件衣服人家要自己脱,你转过身去,不许偷看。

我转过身去,躺在床上,背朝着聪聪。也不知道过了有多久,突然听到手机铃声响。我拿过手机看了一眼,我去,啥时候我把闹铃改在八点半了,平时闹铃都是定在七点的。赶紧一骨碌爬起来,我发现不知道什么时候毛毯被我踢到了地上。地面上居然有好多洋葱皮和散乱的纸巾,整个房间都有一股洋葱味。时间太晚了,顾不上多想,我就把洋葱皮和纸巾打扫起来,抓紧时间简单洗漱了一下,就来上班了。

前端异步编程的来龙去脉

这个异步的世界

很多其他语言的工程师,总是讥讽javascript中的异步编程。也有很多javascript工程师,缺乏道路自信,自甘堕落,在编程中以消灭异步模式为能事,异步的做法、异步的写法。

我们的异步编程,真的就矮人一等吗?回答不但是NO,我们还要指着这些人说:图样图森破。

平时,我们不是撸码,就是打游戏。有点钱的宅男宅女们,或许会炒股买比特币甘当韭菜,得了一种医学上被称为投资者幻觉的精神疾病。同学们,这是低级趣味,我们除眼前的苟且,还有诗和远方。让我们睁开眼睛看一看真实的世界吧。

比如,我是说比如,我老婆不在北京。在这里,大家可以自我代入一下,有老婆的想老婆,有老公的想老公。没有结婚的,或者隐婚一族,想一想你各位男朋友、女朋友。单身狗们嘛,YY一下好了,想一想白雪公主,或者那个骑白马的唐僧。

某一天夜里,电话铃突然响了。老婆说明天要来北京,核查一下我自己在北京有没有胡搞乱搞。

接到电话,正常的我们,大体上会有两种反应。JAVA工程师放下电话,会直奔车站,在出站口苶(nie)呆呆发愣,等着明天下午接站。我们javascript工程师当然不会这么二,我们会明天下午提前到出站口,老婆一出来就抱住他痛哭,倾诉衷肠。诉说我们如何昨天晚上一接到电话,就马上来车站等着他,觉也没有睡,饭也没有吃,水都没有喝一口,手机也没有带,朋友圈都没有刷。

当然,要说正常,那是作为一个工程师表现成这样是正常的。真实的我不会这样。注意,这里没有复数,是我,不是我们,因为我并不能代表在座诸位。

接完电话,我会面无表情的把电话装进裤兜里,继续灌满电热水壶烧水,水开了以后水壶会咔哒一声响。烧上水后,从冰箱里拿出一碗剩饭,放进微波炉热一下,热好了以后微波炉会嘀嘀响。完了以后把半个多月没有洗的衣服塞进洗衣机,自动洗好甩干放水,然后嘀嘀响。洗衣服的这工夫得擦擦地,擦完地吃饭,吃完饭喝一杯水睡觉。第二天闹钟响,起床,该干嘛干嘛,该上班上班。老婆车进北京,过了收费站会给我打电话,我就去车站。在附近随便逛逛,毕竟平时都见不到北京的太阳。出了检票口,我老婆会再给我打一个电话,我就慢吞吞的踱到出站口去接他。

当然,你可以说。第一种,同步的做法,表现出了一种痴情,一种童话般的爱情世界。第二种,异步的做法,粘呼呼的都是油腻,一股子庸俗的人间烟火气。但是,不管怎么说,作为一个中年油腻男,我把图样图森破这句话扔给你,你没有意见吧。

言归正传

我们已经认识到了,这个世界本来就是异步的。这个认识很重要。

我们在撸码的时候,最上乘的方法论,就是遵照这个世界自己本来的样子编程。所谓道法自然,如其本来。

那么好,我们言归正传,正式讨论编程中异步的处理。

在讨论异步编程的方案时,我们在这里只讨论方案的轮廓和概况,不讨论具体的设计细节和实现细节。因为这些细节 每一个都需要用一篇长文,或者几篇长文来处理,在我们这里装不下。

在JS中,如何进行异步编程?一些前端新秀,甚至一些后端老油条,都知道了ES6标准中有一个海藏神珍,叫Promise

对这样的人,我们要大声对他们说,同志哥,你out了。在日新月异的前端世界里,我们现在处理异步问题,已经使用ES7async-await方案了。

这个方案长成这个样子:

async function get(){
    let result = await fetch();
    console.log(result);
    return result;
}

这个方案似乎看上去消灭了异步,起码消灭了异步的写法。

但是这个写法,让很多略有经验的前端工程师疑窦丛生。疑问有二:

  • 这个变量赋值是异步的,还是同步的?
  • 在这个讨论的上下文中,大家很容易可以猜到是异步的。问题是,在这个同步的写法下,掩盖了什么细节,有什么坑没有?

经书有云,涉水道路漫水桥,虽有老司机,不敢径过。

先提出一个问题,留下伏笔。在这个方法的赋值过程中,javascript引擎可以不可以同时并发做其他事情?

我们用Promise方案重写一遍,如下:

function get(){
    return fetch().then((result) => {
        console.log(result);
        return result;
    });
}

用更老的callback方案重写一遍,如下:

function get(done){
    fetch(function(err, result){
        console.log(result);
        done(null, result);
    });
}

关于Promise方案和callback方案的进一步讨论,后文再行展开。

async-await方案的本质实现是Promise方案,只不过是javascript引擎替你做了这件事。

需要说明一下的是,async-await方案只是ES6Generator-yield方案的语法糖而已,本质上是一毛一样的。鉴于async只是取代了星号,await只是取代了yield,而且async-await方案可读性更好,这里就不再展开讨论Generator-yield方案。

我主张,前端新司机不急于先使用async-await方案,可以大量使用Promise方案。因为async-await在同步的形式下,掩盖了很多异步的内容,一不留神就会踩到坑、崴到脚。

异步是这个世界的本质,需要用心的去理解和体会。而名实相副,形式和内容保持某种一致的方案,显然更适合当新司机的教练车。

当然,有些峨冠博带奇装异服的老司机,注意,这里不是说生理年龄老,而是说心理年龄老,拢一拢没有几根的油腻头发,睁开满是眼屎的眼睛,睡眼惺忪的争辩道:“我们是年青人,要和最新的语言标准保持一致,要使用最前沿的技术方案”。

没错,async-await这种猥琐的解决方案,就是给你们这些猥琐的老司机提供的,大量使用就好了。总踩着油门也挺累的,定速巡航很不错,蛮好用。毕竟,你们这些老司机,即便开车睡着了,遇到异常时,也能在睡梦中一脚刹车踩死。

最后再看一组代码:

async function get(){
    try{
        let result1 = await fetch1();
        let result2 = await fetch2();
        let result3 = await fetch3();
        let result4 = await fetch4();
        let result5 = await fetch5();
        console.log(result1, result2, result3, result4, result5);
    }catch(ex){
    }
}

这组代码疑问有二:

  • 发生了异常怎么办?同步过程中、异步过程中的异常和回调中的异常地位相同吗?我想区分处理这三种异常怎么办?
  • 这几个方法是顺序依次执行的,没问题。问题是,很多时候,我们并不关心执行的顺序,反正都执行完了告诉我,我做我想做的事情就好。

如上代码处理异常是可以的,主要毛病还是同步的形式掩盖的异步的内容,新司机容易踩坑。比如,我不管发生了什么异常,总是执行某些代码,怎么办?当然可以用finally处理,问题是这个代码执行的时间点在什么时候?

使用Promise.all处理并发问题当然是可以的,但是Promise对象作为javascript王国中的当朝一品大员,难道就只是负责站在门口计数,等常委们到齐了喊主席来开会吗?这样的工作虽然挺重要,但一介哨兵足矣。

王国一品

javascript王国的一品大员有很多,这里的主角是Promise对象。所以,什么是Promise对象呢?

先看一下Promise对象的方法:

  • Promise.prototype.catch()
  • Promise.prototype.finally()
  • Promise.prototype.then()
  • Promise.all()
  • Promise.race()
  • Promise.reject()
  • Promise.resolve()

其中,实例方法有3个,静态方法有4个。

Promise对象给一个定义很简单,网上多的是。我们主要从哪个特征是Promise对象的本质特征来看待这个问题,从这个角度来讨论。

什么是本质特征呢?就是说,一个对象具有某种特征,他就是Promise对象。当把这种特征抽离后,他就不称为Promise对象。我们认为,这种特征就是Promise对象的本质特征。

Promise对象又被称为thenable对象,就是遵循规范实现了then方法,是thenable接口的一个实例。也就是说,遵循规范实现了then方法,是Promise对象的本质特征。

在讨论Promise对象的本质特征时,我们有必要回顾一下十八层回调地狱。对于前端老帮菜来说,当然是一种缅怀和凭吊。对前端新司机来说,那就像在太湖上的小姑娘黄蓉一样,感慨一下国破家亡的故国情怀也不错。

step1(function (value1) {
    step2(value1, function(value2) {
        step3(value2, function(value3) {
            step4(value3, function(value4) {
                step5(value4, function(value5) {
                    step6(value5, function(value6) {
                        step7(value6, function(value7) {
                            step8(value7, function(value8) {
                                step9(value8, function(value9) {
                                    step10(value9, function (value10) {
                                        step11(value10, function(value11) {
                                            step12(value11, function(value12) {
                                                step13(value12, function(value13) {
                                                    step14(value13, function(value14) {
                                                        step15(value14, function(value15) {
                                                            step16(value15, function(value16) {
                                                                step17(value16, function(value17) {
                                                                    step18(value17, function(value18) {
                                                                        // 地狱不空,誓不成佛
                                                                        console.log(value18);
                                                                    });
                                                                });
                                                            });
                                                        });
                                                    });
                                                });
                                            });
                                        });
                                    });
                                });
                            });
                        });
                    });
                });
            });
        });
    });
});

在历史上,有一位大菩萨,为了超度十八层回调地狱中的前端冤鬼,他说:我与你们立一个约。

处理异步问题时,大家无论什么时候都要遵守一个承诺。当正常执行异步任务后,把返回值传递给then方法的回调函数,任务失败后也要以类似的方式给予明确的回应。而且,一个异步任务要么是一个等待回应的状态,要么是成功,要么就是明确拒绝,此外不能有任何第三条道路可走。

在地狱中,有一只叫尾生的冤鬼说:南无大菩萨,弟子没听明白,求解释。

菩萨说,譬如娑婆世界无限有情众生,今天爱这个,明天爱那个,没有个定性。今天爱,明天不爱,反反覆覆。三角四角有很多,脚踩两只船的也不少。

我在这里定下一个《南海行为准则》。其略曰:别人向你求爱,你可以犹豫也可以考虑考虑。但是如果同意,要给人明确的答复。如果不同意,也要明确的拒绝。不要在那里态度不明半推半就,出了事情报异常。还有就是,同意了就同意,别回头又拒绝。拒绝了就不要再吃回头草,别来回反覆让人心神不宁。约会的时候,别人在等你,你要去就去,不想赴约的话,也给人一个明信。别你又不想去,让人在桥底下干等着。

尾生闻法欢喜,信受奉行。

在这里,有必要对Promise对象实例方法和静态方法作一个简要的说明。

实例方法,示例如下:

function get(){
    try{
        return fetch().then((result) => {
            console.log(result);
            return result;
        }).catch((err) => {
            console.error(err);
        }).finally(() => {
            // 同志,这是我的党费
        });
    }catch(ex){
        // 乍会走到这儿了呢?这不科学啊!
    }
}

静态方法,简要介绍:

  • Promise.resolve:遇到心仪的人表白,立马要答应,不想再考虑,但是又不能违了南海菩萨定下的行为准则。
  • Promise.reject:逻辑同上,只是立马要拒绝。
  • Promise.all:约几个朋友去K歌,不管先来后到,到齐了K起。到不了的也要电话确认下。
  • Promise.race:小朋友想出去玩,请示爸妈,有一个人同意就可以出去,有一个人拒绝就玩不成。SO,这个规则告诉我们,想出去玩的话,要先请示最可能同意的那个,想不出去玩的话,要先请求最可能拒绝的那个。当然爸妈里有一个嘴快的,这个策略就破功了。

没落的贵族

在异步编程中,回调函数无论如何都是要提及的。其一是因为他功勋卓著的历史地位,其二是因为在编程实务中依然扮演着的重要角色。Promise对象的then方法接受的参数本身就是一个回调函数。

回调函数在平时编程中用的很多,简单列举如下。

Promise对象的then方法中的回调:

fetch().then((data) => {
    console.log(data);
}).catch((err) => {
    console.error(err);
}).finally(() => {
    console.log('说完最后一句话');
});

Document事件回调:

document.querySelector('body').addEventListener('click', function(e){
    console.log(e);
});

jQuery ajax请求的回调

$.post('', function(res){
    console.log(res);
});

Node.js中的回调

fs.readFile('/etc/passwd', (err, data) => {
    if (err) throw err;
    console.log(data);
});

回调函数在javascript王国中的重要地位,是由函数在javascript王国中一等公民的地位决定的。

函数作为javascript语言中的灵魂,是可以脱离肉身而独立存在的。不像在一些弱鸡语言中,方法只能依附于对象存在,不是实例方法,就是静态方法。

我这么说,穿长衫的孔先生就会踱过来争辩,呃。。这个。。。我们强类型语言是世界上最好的语言,怎么能说是弱鸡语言呢?他还会继续说什么不变的形式具有西方逻辑美,等等,一些半懂不懂的话。

这个时候,我就会问他,是七十二般变化的孙悟空法术高强,还是你这种形式不变的肉眼凡胎法术高强?既然不变的形式在你西方逻辑中那么地位崇高,你西方哲学的起始为什么却是主张世界具有唯一本原的泰勒斯。然后,孔先生嘴里就会继续嘟囔着什么,回到工位埋头写BUG了。

具有七十二般变化的函数,是函数式编程的话题,在这个回调函数的主题里不展开讨论。

说到回调函数,有两个事情非常值得一提。

  • Node.js给出了回调函数约定,function(err, data){}。这个约定给异常以出口,是非常好的最佳实践。
  • 流程控制库Qasync,在属于他们的那个时代,一直都是最火的NPM包,可以很好的处理回调函数的依次执行、并发执行,等等流程控制的问题。现在回过头来看,没有ES标准中的方案那么简洁流畅,主要是还抱有彻底同步化的邪路思想,所谓炖鱼要炖出牛肉味来,比如异步的循环什么的。不过现在他都实现成了Promise

我们以倒叙的形式,讨论了前端异步编程的来龙去脉。在这里,具体的语法、具体的用法不是那么重要。最重要的是通过讨论,要确立一种信念,一种道路自信。这个世界本来就是异步的,异步编程是人间正道,既不是因循守旧的老路,也不是改旗易帜的邪路。

旁门源流

异步编程,从回调函数和流程管理的方案,发展到Promise对象和Generator-yield方案,再到ES7async-await方案,基本上是javascript中处理异步问题的正统源流。

除了这一支主流,还有一些旁门。菩提祖师曾对孙悟空说,三百六十旁门,皆可成正果。所以,有必要对异步处理的旁门做个简单介绍。

在这些旁门中,值得介绍的设计模式是观察者模式和中介者模式。常见伎俩如下:

  • 钩子回调,早期第三方库常用。常见的生命周期的概念,也可以称为钩子,只不过稍微复杂。
  • 事件回调,使用诸如addEventListeneron等方法注册回调函数,由dispatchEventemit等方法触发事件,向回调函数分发事件数据。
  • 发布订阅模式、观察者模式、中介者模式。

前端处理异步编程的这一支源流第三方库有很多,比如RxJS

参考链接

新时代的教育

作为投资的教育

教育是一种投资,这个观点基本上都是认可的。但是,要说教育是最好的投资标的,也许就不再能得到广泛的一般认可。

其实论证这个观点也简单。一笔够首付的钱,是拿去买房,还是投资教育,做一个简单的对比就可以证明。一个人,但凡有足够的提升空间,或者自己的子女有足够的成长进步空间,这笔钱不管是投资在自己的继续教育上,还是投资在子女的教育上,得到的投资回报显然都超过买房的回报,即便是在房子价格连年迅速增长,甚至翻番的时代也是如此。

这个论证的理论基础也很简单。房子虽然是优质资产,被人们乐于接受,甚至作为大资金的一般等价物,但毕竟只是死的资产,只是比其他死的资产更加优质而已。然而,教育投资的是劳动力。劳动是价值的源泉。劳动力在被教育投资后,可以源源不断的输出高附加值,是活的资产。房子作为优质资产,可以相对其它资产更增值。劳动作为价值的源泉,则相对一切资产增值,包括优质的房子。

既然是投资,就有不同标的的投资回报率问题,就像不同的房子有不同的回报率一样。

鉴于子女教育在教育中的重要地位,尤其是在家庭教育中的重要地位,后文提到的教育,如果没有特殊说明,就是指子女教育。

本文旨在进行能够提高教育投资回报率,或者选择投资回报率较高的教育标的的分析。

新时代思想指导下的教育

要想提高投资回报率,莫过于能够预知未来。在这里所做的分析,都是试图搞明白未来的教育是什么样的?其实,没有人能够真正的预知未来。我们所真正分析的,只是未来的教育应该是什么样的。

新时代思想被提出后,影响将是方方面面的,而且是极其深远的。

这一思想的科学性,并不是我们首先要讨论的。我们首先要讨论的是,这一思想能不能对教育产生深远的决定性影响。如果没有什么影响,我们当然就没有必要再对其进行郑重其事的分析。是什么决定影响力呢?我们假定是科学性。毕竟,相信真理的力量,是我们讨论问题的前提。

除了科学性,政治现实也是不容忽视的。作为一个执政党的指导思想,一个写入党章和宪法的思想,其影响必然是巨大的,尤其是党领导一切这一政治观点被贯彻后更是如此。

我们将试图解读,在新时代思想的指导下,未来的教育应该是什么样的?如果其具有科学性,我们就假定这是未来的教育。

当然,解读的准确性,以及这一思想在未来的影响,都是影响分析结果的重要因素。但是在这里,我们只能不得已的忽略这两个因素。

对重点教育的认知

集中力量,重点突破,是长期以来解决问题的一个重要思路,体现在教育上的就是重点教育。

重点突破,是一个时代的特征,满足了在资源匮乏的背景下取得成就的要求。比如。在经济治理上的,让一部分人先富起来。在体育上,争取那些重点培养运动员个人就可以取得奖牌。在教育上,广泛深入地开展重点教育,重点中学,重点大学,等等。

重点教育的特征,就是集中优秀的生源,集中优秀的师资力量,在培养人才上取得突破。

在进入新时代后,重点突破的思路在效率上钝化、在边际效用上递减。让一部分人先富起来,在这一部分人的财富以亿计的时候,这些人的财富再大量增加,哪怕是翻番再翻番,也不过是EXCEL表上的数字增加。对这些人的边际效用极大的趋近于零。这些增加的数字,在全社会的经济治理中效率钝化,也很难惠及广大的民生。在体育项目上,国家重点砸钱给个人运动员,就可以夺得金牌的那些项目,基本上全包了。即便是再砸更多的钱,也很难取得更多的金牌,只能追求体育场个人的更高更强。考试本来是测量的尺度,可以用来遴选人才。然而发展到了,为了进重点学校,杀鸡取卵涸泽而渔的压榨生源。这种对应试技术极致的挖掘,既违反了人性,也违背了教育的初心。总之一句话,就是重点突破的思路,几乎走到了尽头。

让人民普遍地受到教育,让人才有效的被遴选,是教育的初心。未来的教育,不再有重点学校。如果一定说有重点的话,那么所有的学校都是重点学校,所有的学校都将配备重点学校的硬件设施,所有的学校都将配备重点学校的师资力量。未来的教育,学校的重点痕迹将被取消或弱化,考试状元的称呼将被取消,对生源个人的应试压力将减轻。

山穷水尽疑无路,柳暗花明又一村。峰回路转,新时代的教育,为国家的教育资源打开了从点到面的投放空间,为教育事业提供了三五十年高速发展的可能。

教育中的家族竞争

所有的学校都是重点学校,在这种背景下,人才的遴选将更加苛刻。因为在这种背景下,具备优秀素质的生源大量涌现。

标准的重点教育场景是把各地优秀的尖子生汇聚一堂。在这种场景下,学生的学习积极性、学习氛围,都不是短板,老师只管认真的教学就好。在自我强化的索罗斯反身性作用下,优秀的硬件设施、优秀的师资力量都向这里汇集。这是重点教育的重要因素,但不是最重要的因素,更不是唯一的因素。蒸沙做饭,只得热沙。重点教育,最重要的因素是尖子生的汇聚。

大部分学生的可塑性很强,在好的学习氛围中学习成绩就好,在不好的学习氛围中学习成绩就不好。这样,重点教育的一个副影响就是,如果能够通过花钱,或者调动其他资源,把一个普通的孩子塞进重点学校,在良好的学习氛围下,就会产生好的学习成绩。当然,重点学校的优秀硬件设施和优秀师资力量的作用也是很大的。但是我们分析时,也把这一因素归入学习氛围因素中。

新时代思想指导下的教育,硬件设施趋同,师资力量趋同,尖子生散布在各学校,学习氛围就必然趋同。家庭的学习氛围,家族对教育的重视程度,将成为在人才遴选中胜出的决定性因素。在教育作为基础服务均等化的背景中,获取外部环境优势的代价将是高昂的,那种花一点钱就可以取得优势的时代一去不复返了。

教育作为基础服务的均等化

人民有普遍受到更好教育的权利,这是新时代崇高的教育理想。在这一理想的光辉指引下,12年级义务教育、高等教育、本科教育,必将得到普及。作为基础服务的教育机会将会均等化,机会的取得将是低成本的。

人才的遴选目标

除了崇高的教育理想,教育还有为国家、为社会遴选人才的职责。在新时代,人才遴选的目标是什么呢?一个人,出淤泥而不染,在一般化的学习氛围中,能够积极主动的学习,甚至通过自己影响力的作用,带动其他人认真学习。这样的人,放在任何地方,都会闪闪发光,这就是人才遴选的目标。当然这种主动,也许是出自对学习本身的热爱,也许是对学习改变自己命运的认知。

选择生源成为禁忌

选择各地尖子生作为生源,是新时代教育的禁忌,因为这是学校间的不公平竞争。学校需要研究的是,如何在无差别的生源条件下,取得教育成绩。当然,学校在提高了教育水平,增强了基础设施,汇集了更优秀的师资力量,能够提供更好的教育产品时,通过高收费教育选择愿意出钱的家庭生源,这是可以的。

选择师资力量的代价

除了家族的努力,能够选择较好的师资力量,较好的教育产品,是取得竞争优势的途径。但是在基础教育均等化的条件下,这种优势的取得代价是高昂的。当然,这也是家族竞争的一个方面。一笔同样的钱,同样的资源,边际效用较低的家庭会在这一竞争中胜出。

ES6 技术栈

文档

ES5 to ES6

构建工具 Gulp

构建工具 Rollup

ESLint

React