重复的力量

走出校门参加工作后,发现在很多高中以前学的东西还是概念很清晰,而大学学的东西则有些不甚牢靠。

想了想最大的原因可能就是大学学的东西其实信息量远远大过高中的,但是总的学时不长,再加上自己当年不如上高中时目标明确,没有方向感也就没那么努力,所以对所学的材料其实总共没有看几遍,而高中的那点知识,可是经过了反反复复的练习的。

虽然我觉得高中那种强度的练习对学习知识本身是过度的,纯属为了把人划分三六九等分配大学而进行的军备竞赛。但是事情往往从一个极端走向另一个极端,被重复练习恶心坏了,进了大学则变得厌恶一切练习。及时反馈的练习,适当的重复是建立永久概念的有效方法,不但实践证明了有效,也符合脑神经科学的研究结论。

我们可以研究各种学习方法,去寻找省时省力的捷径,但是方法往往不是最重要的,最重要的还是那些说烂了的道理,比如要坚持下去,比如要重复练习,在这些基础之上,才有谈方法的意义。

其实随着年龄的增大,理解力是不断增加的,而且如果在一个领域深耕细作,知识体系已经建立起来,面对新增加的知识,需要重复的次数会少一些,但这一切,都建立在之前的知识是牢固的基础上。

所以学习这个东西,来不得半点自我欺骗,缺下来的东西都是会有现世报的。这个道理当然是越早知道越好,但是没有人生目标的时候,知道也没什么用吧。

.Net框架中的算法与数据结构

最近复习基础算法,顺带浏览了一下.Net框架的源码,通过本文简要总结一下.Net框架中常见数据结构和算法的实现。

1 集合类

1.1 List

List<T>使用动态数组实现,列表为空时,数组长度为0,加入第一个数据后,数组长度为16,以后当长度不够时会加倍,这时需要新建长数组,并完成复制操作,所以数据量预计很大时,建议指定初始化时的capacity,否则会进行很多复制操作。没有进行数组的自动缩减,而是提供了显式的TrimExcess方法,当数组使用率低于90%时,会去除数组中未使用部分,此外也可显式设定Capacity,这些方法都会产生复制操作。支持二分查找和排序,算法都使用数组的。

1.2 LinkedList

使用双向环形链表实现,内部直接保存的只有一个head节点。

1.3 Stack Queue

基本类似List,都使用动态数组实现,默认大小均为4,

1.4 Dictionary<TKey,TValue>

字典使用散列表实现,具体使用的是桶加链表的实现,键值对使用数组存储(初始大小和桶大小相同),链表指针使用的是数组的index,桶的大小由大于指定capacity的一个最小质数确定,最小为3,最大为7199369。Tkey的哈希值去除符号位后对桶大小取模得到Hash位置,当键值对数组不够用时需要扩大(使用质数数组中的下一个大小),桶的大小也随之扩大,如果冲突数超过100,则重新进行Hash。

1.5 SortedSet SortedDictionary<TKey, TValue>

SortedDictionary<TKey, TValue>本质上使用SortedSet<T> 实现的,而SortedSet<T> 则是经典的红黑树结构。

待续…

最好的搜索

最近想要复习一下基础算法,主要方法除了刷题就是看书,刚刚我默默数了一下,一共是八本书同时看,创了我同时看书的新纪录。

以前上大学的时候,除开努力的因素,单看学习方法,一是目光短浅二是穷,根本不会去找资料辅助学习,学习资料只会使用老师的课件和指定的教材。工作以后,大多数的人则是很少再看书,遇到问题上网搜索一下救急了事。

从头到尾看一本书存在一定的问题,你的思维就被这本书的作者禁锢了,尤其是想要主题式学习的时候,每本书提供的可能都只是主题的一个侧面。以计算机领域的基础算法来说,红黑树是一种经典的数据结构,几乎每本算法书都会详细讲解,但是讲得最清楚的是它的发明者写的那本《算法》,从背后思想的出发点娓娓道来,远胜最广泛使用的《算法导论》。每本书都有它的可取之处,也有通读一遍时可以先略去不读的部分。

上网搜索也有它的优势,会有不同人的不同看法,但是问题是大部分看法都不值一看,资料的质量太差。通过搜索可以获得一些引用,但是真正有知识沉淀的还是论文和书籍,而书籍比论文更成体系,好的作者会阅读无数领域内的论文,把它们写到一本书里。而网上的文章,有真知灼见的还是比例很低,而且筛选起来太费时间。

所以想要知道一个领域内的必备知识,最好的搜索可能是在这个领域内所有的经典教材之中搜索,这样筛选资料的成本很低,按平均50块钱一本书来看,买10本书,也就是500块钱。如果实在太穷,无耻一点看盗版书成本简直为零。通过这些最优秀的资料构建自己的知识体系,获得知识的各个侧面的解读,而不是仅仅学习了一遍作者的思路,才能做到融汇贯通。

说了这么多,这么变态的读书方法我也是刚刚开始,目前感觉良好,仍需继续努力。

管理向下

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

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

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

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

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

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

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

学习中的自我欺骗

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

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

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

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

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

个体经验与中医

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

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

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

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

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

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

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

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

都是你自己的错

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

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

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

面向巧合编程

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

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

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

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

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

这是一份草稿

不要傲慢

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

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

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

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

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

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

中医是个伪概念

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

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

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

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

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

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

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

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

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

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

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