管理向下

今天是春节后第一天上班,单位开了好几个会,主题都是“假已经放完了,大家要切换状态,好好工作啊!”。

对我来说,我已经过了快半年没有假期的生活,每天都安排得满满的,无论是学习还是陪家人,都很尽力,年过三十的人,越来越感觉光阴催人。

结果就是,这些试图让人认真工作的会议完全变成了对我的困扰,严重浪费了我的时间。站在管理者的角度来看,他很难分辨谁需要这种提醒,即使分辨出来了,出于情面考虑也得大家一起吃药,管理者为了“照顾”最需要管理的人的情况,把大家都要拖入一个不必要的浪费模式。

实际情况可能更糟糕的是,管理者本身的出发点可能总体上是为了整体利益,但是也夹杂了自己的权力欲,很多管理者的个人爱好就是对人训话,教别人怎么做人,再加上管理是为了保住底线,向表现最差的人看齐,最后这样的管理就变成了灾难,对优秀的人来说,只有彻底滚蛋才能好受一点,天天用有则改之无则加勉欺骗自己毕竟不是长久之计。

从这个角度反思,如果成为一个管理者,在面对参差不齐的成员时,首先最好能区别对待,一人生病,大家吃药的事情不见得都有预防作用,也可能有反作用;其次说话要言简意赅,点到即止,不要把教育别人当成严重成就感,好为人师是一种病,管理团队的主要目的是把事情做好,当然团队文化的培养也很重要,但那不是光靠嘴上说出来的,而应该渗透到做事的标准上。

当然一个更加完美的反思角度应该是,如果能选择团队成员,永远记得宁缺毋滥,好的人才只需要很少的管理,管理往往会把所有人往团队中最低水平的人去塑造,虽然口头上会让大家学习先进典型,但这些话永远是最适用于最糟糕的那些人的。

甚至最最讽刺的事情时,有的人溜号了,结果其他人莫名其妙挨一顿骂,该挨骂的人却不在现场。

学习中的自我欺骗

现代人生活在变化飞快的时代,所以随时有被时代抛弃的焦虑感,这未尝不是好事,会激励人活到老学到老,但是我发现带着焦虑干学习很容易陷入自我欺骗的窘境。

要想深刻的学习,需要把整个大脑全方位的调动起来,这是一件很累的事情,适应远古时期部分的大脑会觉得其他部分的大脑在浪费时间和能量,做一些根本不重要的事情,它不见兔子不撒鹰。这种潜意识弥漫开时的后果就是,你好像在认真学习,但是脑子有一大半在晃神,每当你觉得需要深入理解一下,需要动手验证一下,这部分大脑会劝你说,没必要钻牛角尖,差不多得了。

当然不是说学习时对知识的每个犄角旮旯都要一一弄清,但至少很多时候时需要钻研一下的,可惜更多的时候,大脑习惯于作出努力的样子就自我满足了,你看你看,我又看了10页书呢,至于理解了多少就不管了,本质上时因为这样比较轻松啊,大脑是一个时刻想偷懒的器官。

所以好的学习状态,跟舒服闲适的状态是很难兼容的,要打破这种自我欺骗,可能有以下一些方法。

  1. 场景转换,找一个干扰少的环境学习,不要将学习和娱乐的环境混在一起,比如找自习室、工作间;
  2. 寻找意义,及时奖励,甚至只需要假装奖励自己都行,比如弄懂一个算法奖励自己,告诉自己赚了1000块钱,想象得越逼真越有效果;
  3. 带着问题学习,为了通过测试而学习,为了完成一个项目而学习,总之要以输出带动输入。

个体经验与中医

我听说过无数关于治疗感冒的偏方,有喝酒的,有吃生鸡蛋的,有喝姜汤的。

对现代医学来说,感冒基本上还是一种“不治之症”,没有针对感冒病毒的有效药物,而完全要靠人体自愈,所以多喝开水多休息就是最合理的治疗方案,在没有细菌并发感染的情况下就使用抗生素简直是自取灭亡之道,而市面上的感冒药真正的有效成分都是用于缓解感冒症状的,如果你没办法休息,需要坚持工作,那么吃点感冒药缓解一些流鼻涕之类的症状无可厚非,但感冒药广告中声称的消灭感冒病毒就是胡说了。

所以只要你好好休息,只要你身体强壮,几乎吃任何东西都可以当成治疗感冒的偏方。这里可以看出个体经验的不可信之处,把时间上的先后关系等同于因果关系是人类思考时的简化模式,但常常会犯错误,我吃了一个生鸡蛋,第二天感冒好了些,再吃一个,第三天彻底好了,所以吃生鸡蛋治疗感冒是有效的,甚至不单单对我有效,我把这个经验推广给别人发现也是有效的。一部分中医的有效就是这么来的。

西学东渐的一百多年中,中国几乎全盘接受了西方的科学技术,唯独在医学上扭扭捏捏,这里面有好几重原因。

第一,现代医学本来起步就晚,很多理论还不完善,还有很多不治之症,给中国传统医学留下了空间;

第二,经济原因,中国传统医学讲的是万物皆可入药,“赤脚医生”不管能不能治病,至少花很少的钱给了患者一点希望,毕竟先进合理的医疗不是人人都能享有的;

第三,可能是最重要的原因,医学很难和个体经验剥离,每个人都认为自己很了解自己的身体,尽管医学可能不比物理学简单,但物理学是抽象的,与普通人距离很远,而医学研究人的身体,人人都觉得自己很熟悉,虽然这可能是一个幻觉。既然“人人都懂医学”,中国人为什么不能比西方人更懂医学?坚持一套独特的医学体系已经成为一种文化上的抵抗,让一门本应该是科学的学科成为了泛泛的文化,这是中国人的悲哀。中医成了文化,绑架了现代医学,然后再搭上民族自尊心和爱国主义,所以问题变得越发复杂。

剥离不了个体经验的学科是难以成为一门科学的,或者说是不具有普遍意义和推广价值的,吃生鸡蛋治感冒这样的经验,是不能治病的。所幸,现代医学已经发展出一套合理的方法,来剥离个体经验,下次我们再谈谈安慰剂和双盲测试。

都是你自己的错

前几天跟某个人约好,让他帮我一个忙,他满口答应了,今天晚上再确认的时候,他说情况有变,搞得我很被动,计划都被打乱了,事实上,如果我早几个小时确认,还有很好的补救措施。

当然我也在内心里埋怨了几句这个人的不靠谱行为,当初答应的事情,如果情况有变,应该通知我的。可是仔细想想,这又有什么用呢?需要把一件事情做成的人是我,抱怨是自己无能的表现,人生在世,难免需要别人帮忙,但是对不可控因素没有预估,造成了损失,骂娘也没什么用了。千错万错,错在我没有及时确认,让自己陷入了被动的局面。虽然这是一件小事情,但是以小见大,值得三思。

及时的确认很重要,有备用方案很重要。

面向巧合编程

比起面向过程编程或者面向对象编程,其实很多程序员最常用的编程范式是面向巧合编程。当然我们可以站在高处批判这种作法,但是我想这里面的原因也值得追溯一下。

一个理想的程序员当然是热爱编程的人,所以它会对自己写的每行代码都较真,要去弄清背后的事情,但是更多的程序员只不过是打一份工而已,完成老板交待的任务就好了,然后打卡下班,所以软件工程才显得那么重要,一个函数可以写得很烂,但如果它通过了所有的测试,也就变得可以接受了。

有很多项目,不过是领导上拍脑袋想出来的,出生的一刻就注定了被丢弃的命运,虽然我们说不要写学生代码,但是毕业了不见得就不要写一次性的演示代码。工程师思维的特点之一是也解决问题为主要目标,至于为什么解决了问题,相对没有那么重要,所以你发现很多面向巧合编程的最终似乎也解决了问题,It just works。

面向巧合编程的巧合来自两个层面,一个是原理层面的,代码原理未彻底搞懂,但是实现了效果,这里面的主要风险在于测试不充分,真正运行起来面对复杂的应用方式总会有跪掉的一刻。其实还有另外一个层面的巧合,就是未彻底理解用户需求,按自己理解瞎搞了一番,结果用户接受了,原因可能是往往用户自己也不知道自己的需求是什么,所以现在都强调迭代开发,用户参与。

面向巧合编程无疑是相当危险的,它通过放弃深究原理来赢取时间,稍有不慎就更加浪费时间,作为一个有追求的程序员应该彻底摒弃这种范式,如果面对不得不写这种代码的窘境,最好的出路是换份工作,作为管理者,自然是优先去招有追求的程序员,把测试等外部监管手段作为最后的防御。毕竟,我们生活在一个现实的世界,追求有美感的东西可以帮助工程师更好的解决问题,但解决问题是最终目标。

这是一份草稿

朝闻道家庭基金201701月报

本月新投入资金若干,持仓产品互有涨跌,净值基本持平。新股元祖股份抢开板买入后,直线下跌了近30%,相当惊醒人的一次买入,但是现在这个价格也找不到理由卖出了,除非找到更合理的标的,今年后续没有十二分充足的理由不会再买入任何新的股票了。比特币经历6000->8000->5000->6000的剧烈变化,由于找不到充分的操作逻辑所以一直当观众,果然价格还是回来了。买入你财富小活宝,这是360品牌下的互联网金融产品,由于在推广期平台补贴4%,所以活期利率达到8%,春节期间暂时作为现金管理工具使用。

时间 净值
20160101 1.0000
20161231 1.2526
20170126 1.2566

期末持仓品种:

  1. A股市场:继续持仓上期末的贵州茅台、双汇发展、伊利股份、恒瑞医药、格力电器、美的集团、老板电器、丽江旅游、中青旅、张家界、宇通客车、福耀玻璃、万科A、雅戈尔、平安银行、科大讯飞、鼎泰新材,新买入分众传媒、元祖股份。
  2. 基金:小幅加仓广发中证养老产业指数A、小幅加仓富国中证红利指数增强、继续持仓的博时安怡6个月定开债券。
  3. 其他:继续持仓上期末的拍拍贷、比特币,新买入你财富小活宝。

不要傲慢

最近其实上网闲逛很少了,但是偶尔看看,感觉中文互联网上弥漫着一股傲慢的气息,感觉非常不好。表现有以下几点:

  1. 不容许任何对中国的批评,认为批评的人都居心不良,要不是拿了黑钱就是内心阴暗;
  2. 认为西方在不断衰退,中国在不断强大,西方都要开始跪舔中国,西方领导人以及西方人都是白痴,比如美国人就选出来了川普这样的白痴;
  3. 随时都敢跟美国干一架,至于收拾日本、台湾,更是分分钟不在话下;

中国最近几十年经历了高速发展,可能是世界上进步最大的国家了,90后,00后出生在经济高速发展的年代,确实有自傲的资本,可是自豪变成了傲慢,是相当可怕的事情。

站在国家的角度来看,中国无论是硬实力还是软实力,仍然和发达国家有客观存在的差距。硬实力主要看科技,真正的科技工作者都会明白这中间还有很多差距,以互联网行业而言,中国企业几乎还没有过真正的创新,都是把硅谷成功的模式抄到中国,当前大热的深度学习等理念,依然是美国在主导。软实力可以看国民素质,哪些屡见不鲜的中国游客的新闻提醒我们,我们离一个文明的族群还有一定距离。把川普看作白痴的人,估计大概率要被打脸的。

站在个人的角度来看,年轻人失去了知耻而后勇的尽头,中国的发展也就要告一段落了,一个真正努力的人,必然不会把爱国挂在嘴边,当成自己最大的资本,看了几篇几百字的分析文章,就开始对世界局势指点江山,一副老子天下第一的架势,借的不是自己有本事的底气,而是身处一个族群的虚无的荣光,这样的人如果占了主体,就真的完蛋了。

傲慢带来的,无论是发展的停滞,还是战火的危险,都不是个人之幸,国族之幸,但愿我只是神经过敏,杞人忧天。

中医是个伪概念

一直想写一写中医的话题,主要是想给家人看看,可是一直都不敢写,因为这个话题太大,它不单单是个科学问题,也牵涉到民族自尊心,政府在有意识的推广,甚至给予了立法支持,医学院有中医的课程,制药企业、医学界、媒体都牵涉其中,中医药是一个产值4100亿的产业,我有什么资格去谈呢?我觉得我学养不够,既不懂中医的阴阳五行,也不懂西医的循证医学。好在我还有理性思维,有些问题其实不必要掌握所有的细节,仅凭理性分析与随处可见的事实就能得出很多结论。

对中医的认识,和很多人一样,我曾经是很模糊的,我跟很多人都聊过这个话题,包括各种学历层次各个地域的中国人,其实很多人并没有细想过这个问题,生病就去医院看医生,然后医生开药,一般多是西药夹杂一些中药,少数人被慢性病折磨时会想到去看中医,抓几副药去吃,有吃了没效果的,也有吃了觉得效果很好的。

是的,一个国家的医学的一半,至少试图是一半,都在讲望闻问切、针灸配伍,一个普通人,有什么能力去分辨这一切的是非呢?可是当我不幸或有幸不断思考中医的问题后,就发现生活在一个巨大的有意无意的4100亿产值的骗局之中,这么多钱,这个产业中已经没有几个是干净的了。某一天,我突然想明白中医是个伪概念,突然觉得豁然开朗,即使还有很多技术性细节问题,但是只要明白这一点,一个人对中医的认识也会发生天翻地覆的变化,朝着科学理性的方向发展。如果不能接受这个观念,也几乎不能再一起讨论下去。

为什么说中医是个伪概念呢?

我们听过无数遍这样的广告词“中西药结合疗效好”、“西医治标,中医治本”。可见,中医这个概念和西医这个概念是伴生的,在中国人见识所谓的西医之前,是没有中医的概念的,而只有医学的概念。任何国家、任何族群的人都会生病,他们都会想办法去治病,这些经验或理论总结出来就形成了医学。类比一下,在接触西方的数学体系之前,中国人也有自己的数学,有祖冲之这样的数学家,但是奇怪的是,现在的中国,没有所谓的中数、西数之分,而只有一门学科,就叫数学。

中医、西医两个概念是伴生的,但是这里的思维陷阱在于中医应当是中国传统医学,而西医则是西方现代医学,如果有兴趣读一读医学史就知道,现代这套打针吃药输血做手术的医学,在西方兴起也不过几百年,在此之前,西方人(欧洲人)是怎么治病的呢?有草药,有放血疗法,甚至也有类似针灸的做法,只不过后来他们发现这些方法不科学,而找到了一套更加科学的理论和方法,逐渐形成了所谓的现代医学。

中国人几乎接受了所有的现代科学理论,比如物理化学生物等等,并且将自己的科学史也纳入到整个科学史的一部分,无数的科研人员也投入了现代科学的建设,没有人去区分那是中国的物理还是西方的物理。

可是由于历史的原因,学科的特殊性等等,唯独医学,被区分成了中医和西医。这里不想展开产生这个区分的原因,而是想从逻辑上厘清这样区分的谬误。中医对应的应该是其他国家的传统医学,比如西欧的传统医学,印度的传统医学,而西医这个概念也不应该存在,有的只是现代医学,中国有无数的现代医学研究者,他们研究的不是西医,而是全人类的医学。

总结一下,简单画一个表应该是这样:

  传统医学 现代医学
中国 1中国传统医学(中医) 2中国现代医学(西医?)
西方 3西方传统医学(西方草药学等) 4西方现代医学(西医?)

概念1只和概念3有对比,概念2和概念4应该是同一个概念。下一次再谈谈谈为啥唯独医学这门学科在中国被分为中西医,而物理化学没有。

记一次AccessViolationException异常的排查

前几天,同事出差说程序遇到一个偶发的bug,程序会报告内存错误然后崩溃掉。今天终于有时间仔细排查了一下。

背景:这是一个C#和C++/CLI混合编程的程序。

1 复现

首先按同事描述的操作方法复现了bug,发现虽然是偶发的,单其实很有规律,在操作的某个时间点后必然出现。

2 基本原理

内存错误显然是非托管代码带来的,在.Net环境中被封装为AccessViolationException。

首先看看AccessViolationException的MSDN文档,它是”在试图读写受保护内存时引发的异常”。具体说明如下:

当非托管或不安全代码尝试读写未分配或不具有访问权限的内存空间时,就会产生访问冲突。 这种情况通常因为指针具有错误的值而发生。 并非所有通过无效指针的读或写操作都会导致访问冲突,所以访问冲突通常指示已经通过无效指针进行多次读或写操作,并且内存内容可能已损坏。 因此,访问冲突几乎总是指示存在严重的编程错误。 AccessViolationException 明确标识这些严重错误。

在完全由可验证托管代码组成的程序中,所有引用都有效或者为空,因而不会产生访问冲突。 AccessViolationException 只在可验证托管代码与非托管代码或非安全托管代码交互时才会引发。

如果发生异常在公共语言运行时,会保留的内存不足 .NET Framework 4开始,公共语言运行时本身引发的 AccessViolationException 异常没有被在结构化异常处理程序的 catch 语句处理。 为了处理这种 AccessViolationException 异常,则应用 HandleProcessCorruptedStateExceptionsAttribute 特性到引发异常的方法。 用户代码不影响 AccessViolationException 异常的此更改,可以继续用 catch 语句捕获。 对于针对要重新编译并运行,而无需修改.NET Framework 4.NET Framework 的早期版本编写的代码,则可以添加元素到 应用的配置文件。 注意也可能收到异常的通知,如果定义 AppDomain.FirstChanceException 或 AppDomain.UnhandledException 事件的处理程序。

看完先给发生问题的函数加上了HandleProcessCorruptedStateExceptions,捕获到异常了,但是没什么实际作用,这种错误明显不应该发生的。

3 发现错误源头

刚开始用VS2010调试,对C++/CLI太不友好了,看不到太多有用的信息,后来改用VS2015调试,能在崩溃时看到C++/CLI代码的详细信息了,然后发现了一个空指针,程序试图在空指针上进行结构体的访问,必然会崩溃啊。

对空指针的来源进行了仔细的回溯排查,发现在某个查找操作中返回了空指针,这个空指针还传递了好几个函数,衍生出好几个空指针,直到最后试图使用指针时崩溃了。

到这里发现了第一个问题,C++/CLI代码中的托管对象封装了传统C++的指针,对托管对象的操作,实际上会转发到指针上去,如果指针为空,这个托管对象实际上没有存在的意义,但是之前的代码忽略了这个问题。

在构建托管对象时,应当检验其封装的指针,如果为空指针,那么对象也应当初始化未null。

此时,AccessViolationException已经变成了C#程序员天天见的NullReferenceException,如果封装时注意一点,就不会这么辛苦找源头了。

4 出现空值的原因

产生空值的查找操作,按理说不应当出现,而且它的出现也是有一些偶发性的,如果把异常截获,程序还能继续跑下去也没什么问题,也就是,待查询的对象集合在大部分时间都是正常的,但在某个瞬间出了问题。

仔细排查了一下哪些操作可能更动这个对象集合,发现了一个重启操作,包含了清空与加载两步,而且这个重启操作与出问题的查询操作在不同的线程中。

到这里,发现原来是典型的操作原子性未保持导致的多线程错误,清空后还没加载时去查询,自然会出现空值,给对象集合所在对象加了个锁总算没有异常了。当然,后来我发现这个重启的必要性很可疑,那是另外的话题了。

5 小结

总计一下:

  1. 应当让错误早点暴露,限制空指针的传播范围,具体到C++/CLI中,要把它封装成null。
  2. 多线程的坑层出不穷,行为难以预料,要谦虚谨慎。

屁股决定脑袋

有句说出来不甚雅观的俗语叫“屁股决定脑袋”,我近几年越来越觉得这句话很有道理。我亲眼看见某些人对同一件事情的看法发生天翻地覆的变化,只是因为他前后两次所处的地位不一样。

每个人倾向于将自己的思想和行为变得融洽,而一个人所处的位置往往决定了他会有哪些行动,所谓“人在江湖,身不由己”,即使刚开始,他可能不大情愿去做某些事,但是时间长了次数多了,他必然要修正自己的三观去匹配自己的行为,这就是行为反作用于思想的可怕之处。如果不修正自己的三观,那么他就面临时时刻刻的矛盾,自己不认同自己所做的事情,陷入痛苦不堪的境地。电影《朗读者》中的女主角参与了屠杀犹太人,但她只把那当成了自己的日常工作,她不会让自己意识到自己的行为有多么罪恶,这就是典型的屁股决定了脑袋。

还有句俗话叫“不要因人废言”,但是仔细想想,一句话从谁嘴里说出来与这句话的可信度还真是有很大的关系,我们首先得看看说这句话得人屁股在什么地方,看清楚他得利益所在,再去判断这句话有没有意义,比如我们为什么会觉得“五毛”和“美分”说的话不可行,因为他们拿钱发帖,显然不会发自真心的去考究自己的话。又比如罗振宇在跨年演讲时说了一堆趋势,可是仔细想想他的屁股在自媒体和知识服务上,所以他的说法都是对应这些来说的,那么我们作为听众就得看清楚自己的屁股可能不再那里,所以参考价值可能比想象中低多了。

超越自己的屁股相当困难,至少有两个障碍,一是认知上的障碍,每个人的视角都是有限的,观点自然都是从自己熟悉的领域出发,向外辐射时肯定会有局限,二是利益上的障碍,少有人会发表对自己所处地位不利的观点,即使他能分辨所谓的善恶对错,但是谈论的可能还是利弊,更可怕的时他还会修正自己的三观去适应自己的利益。

所以,要想少被人在脑子里跑马,听人说话时得看看他的屁股在哪里。而自己的思想想要超出自己的位置,那是需要反复的修炼的,就像《无间道》中道明叔说的:从来都是事情改变人,而少有人改变事情。通过改变思想改变自己的行为和位置很难,而因为自己处在一个位置就改变了思想则是不知不觉的。