现在的我也比十年前的自己多了更多业余生活和爱好。有句英文叫 live a little,说的就是我现在的心态。我逐渐把之前放在工作上的时间匀出来一些,用来阅读、旅行、追剧看电影、听演唱会、看体育比赛等等。同时为了刻意维持自己的身体状态且避免每天坐在家里盯着屏幕一整天,我在疫情过后也恢复了上学和刚工作的时候定期踢球的习惯,并开始跑步。我第一次只能跑一公里,而且上气不接下气,但只要坚持,进步是肉眼可见的,直到上个月我跑完了新加坡马拉松42公里195米的全程,算是一个里程碑。自己非常开心。
我的家庭生活总体上是富足而充实的,但未来尤其在育儿方面是模糊的。作为一个在典型的中国式家庭长大的人,我很容易凭借自己的亲身经历,从童年的所谓创伤中找出那些 DON'Ts,但没有人告诉我相应的 DOs 是什么。那些书本上或其他文化里的 DOs 跟现在的时代以及你身边的其他生活情况放在一起也未必那么适用,未必能够形成一个新的平衡的系统,就更别说那些 DON'Ts 不是你想避免就一定能避免的。有的时候你找不到替代品,就只能硬着头皮做下去。或者他们根本就是你的 DNA 的一部分,在不经意间从你的身体里冒出来。随着孩子慢慢长大,有了自己的想法和主见,那些副作用都会像回旋镖一发一发飞回来砸到你的头上。
有一期节目录完之后,跟 Randy 和 GeekPlux 二位主播 after cut 闲聊,他们都鼓励我做个一对一私人咨询的服务,觉得我的观点和经验会帮助到更多的人,尤其是我们都意识到,现如今听众来信里的很多话题,都逐渐从小众转化为了大众、甚至社会性的话题;同时一对一私人咨询也可以做得比节目更深入,更好的保护当事人或公司的隐私需求,因为节目的时间和机会毕竟有限,且是公开形式的,很难针对性 + 回合式地聊太深。于是我打算抱着试试看的心态做起来,也许近期就会有进展跟大家再分享。
比如把“特性”换回“attribute”之后,如果“特性”一词的两边也都还是中文,那么“attribute”两边就都需要加一个空格,而如果是标点符号就不需要,而如果是英文,那理论上这个空格已经加过了。所以情况很多很复杂。你读到这里可能觉得那我们稍微加个正则表达式也许可以解决,那我会在告诉你,如果这个词的边上还可能有 HTML 标记或 Markdown 标记,那这个正则该如何写呢?或许也不那么容易了。
第一版尝试把 token 从线性结构转变成树形结构,但这棵树并不是规范的树,尤其是括号,所以我把括号从树形结构中抽离了出来,改为记号 (mark)。记号不会影响树形结构本身,可以单独识别和处理。这有点类似 HTML 之于 text 的区别,也就是某种“超文本标记”。事后证明 mark 这个结构和思路对后续的功能研发还有很大帮助。
把需要 lint 的格式细节整理成一个一个独立的规则,然后轮流处理,这样庞大的“travel and process tokens”就有机会变成 const rules = [...]; rules.reduce(processRule, str)。这个思路其实我一开始想到过,但觉得把每条规则都抽象并独立出来是很有难度的,所以一直没有下定决心做。经过这次深思熟虑之后我鼓起勇气试了一下,看起来还是可行的,效果也还可以。
一线员工为他们自己及其工作负责。因为他们以一线员工的方式取得了长足的发展,所以他们的影响力变得更加广泛。一个在 Moz 的好的例子就是 Dr. Pete,他判断公司的战略指示并随之协力投入。他通过审查来协助大数据操作,通过战术指导和策略输入来辅助市场,发表如此高质量的博客和指南,甚至从头开始设计整个项目并基于他们的创意执行。他的影响遍及整个公司,横跨多个团队,和他们一同成长。他通过自己的影响力定义了这个角色,这比其它方式都好。
// old version of Weex JS Runtimefunction createInstance(id, code) { const customComponents = {} function define(name, definition) { // todo: register a weex component in this Weex instance ... customComponents[name] = definition ... } function bootstrap(name) { // todo: start to render this Weex instance from a certain named component ... sendTasks(id, [...]) ... } // run eval(code)}
我们在闭包中设置了这么几个东西,保障隔离效果:
define: 用来自定义一个复合组件
bootstrap: 用来以某个复合组件为根结点渲染页面
这样的话,假设有一个 Weex 页面,它的代码是这样的:
js
// 伪代码,并不能实际运行// A Weex JS Bundle File// define a component named `foo`define('foo', { type: 'div', children: [ { type: 'text', attr: { value: 'Hello World' }} ]})// render the page with `foo` componentbootstrap('foo')
之后我们在最终执行 Weex JS Bundle 代码时,从略显简陋的 eval 命令改写成了 new Function,即:
js
// old versionfunction define() {...}function bootstrap() {...}eval(code)// new versionimport { aaa, bbb } from 'xxx' // place and name your methods as you likeconst fn = new Function('define', 'bootstrap', code)fn(aaa, bbb)
用 new Function 的前几个参数定义了即将执行的 Weex JS Bundle 中“伪装”的几个全局变量或全局方法,然后运行的时候把那些背后的“伪装”传递进去,形式上更灵活,运行时更安全。
同时也是因为闭包中需要准备的变量和方法也逐渐多起来了,new Function 的写法更便于清晰的管理和对应这些内容。
这样的话我们先通过 prepareInstance('x') 创建一个属于 x 这个 id 的方法,然后通过 function (__weex_define__, __weex_bootstrap__) 创造一个闭包,把 JS Bundle 的源代码放进去,效果和之前的实现是等价的,但是由于没有用到 eval 和 new Function,性能有了一定的提升,在我们实验室数据中,JavaScript 运算的时间缩短了 10%~25%。
我在 web 领域工作越长时间,我就越意识到区分人才和顶尖人才的并不是他们的知识——而是他们思考问题的方式。很显然,知识在很多情况下是非常重要而且关键的——但是在一个快速发展的领域,你前进和获取知识的方式 (至少在相当长的一段时间里) 会比你已经掌握的知识显得更加重要。更重要的是:你是如何运用这些知识解决每天的问题的。
Firefox implemented the spec change in version 34 on December 1, 2014. Chrome implemented it in version 44 on July 21, 2015, which means Opera will get it shortly. Edge shipped with this implemented on July 29, 2015. A Safari implementation appears to be in progress.
You can refer to Flexbug #1 for a future-friendly, cross-browser workaround to this issue.
CEO 无意识的激励甚至有时刺激了政治行为,办公室政治由此而生。举个非常简单的例子,我们想象一下薪酬决策。作为一个 CEO,资深的员工会反复找你索要加薪。他们会提醒你自己得到的回报已经比市场行情低多了。他们甚至已经手握外面的 offer 了。你大可给他们加个薪。这听起来没什么问题,但你就这样强烈刺激了大家的政治行为。
我之前描述的例子可能卷入了有目标,但本质并不关心政治的人。并不是所有的情况都是这样的。毫无疑问,把你的公司政治搞成美国参议院级别的方式就是雇佣错误目标的人。正如 Andy Grove 所说,正确的目标是把主管的个人成功和公司成功和公司产品的胜利息息相关。错误的目标是把主管的个人成功和公司的收入划清界限。
2. 为潜在的政治行为建立严格的机制并坚持贯彻
某些行动会助涨政治,比如这三点:
绩效评估和薪酬调整
组织结构设计与调整
晋升
我们来审视在每一种情况下,你该如何制定程序来杜绝不好的行为和政治的动机。
绩效管理和薪酬调整
公司的绩效管理和薪酬调整通常都有一些滞后。这并不意味着他们没有认可员工或不给员工加薪,这仅仅是因为他们仓促特许此事在政治手段面前是非常脆弱的。通过规范合理的结构、正规的绩效评估和薪酬评估,你会在更高的高度明确薪水和股票的涨幅情况。尤其对高管的薪酬调整尤为重要,因为这样做会杜绝政治。在上面的例子中,CEO 应该有一套滴水不漏的绩效和薪酬政策,并且跟高管明确他的薪酬会被其他所有人评估。理想状态下,高管的薪酬体系应该有董事会的参与。这会 a) 有助于更好的管理 b) 让意外更难出现。