杂谈 错误收集器

把最近犯的一些错误,自己和自己的对抗过程,摘录一部分下来。

有意思的是,记录犯错的过程本身,就是在和自己对抗。自己会阻止自己回忆,阻止自己再揭开。

1.

从一件很小的事情说起,

曾经拆卸一个水管构件,这个构件总共由7个部分组成,当时看着拆卸之前的整体构造,以及零件的总数,我自信地觉得,这个构造已经把它记在脑子里,可以开始放心地拆卸。

整个拆卸的过程用时10分钟。组装回去的过程,用了约两个小时。

而如果当时我给各个部件标个号,记录下来拆卸的顺序,哪怕只是在开始动手之前,拍一张照片,也能让整个组装的过程,恢复回10分钟。

当坐在地上,凭着记忆盲目尝试,一筹莫展的时候,我问自己,SOP是个好东西,但为什么没有遵守?

潜意识里,认为SOP是在工作中使用的东西,而且在某些情况下,是用于“约束”人的。

懒惰和自满是一对好兄弟,经常一起出现。

如果面对的是重要的决策,或者复杂的决策,没有应用SOP而犯下的错误,就应该自己吃进。

举的是小小的例子,因为没有遵循SOP而犯下的错误还有更多。

对于某些事情,我给自己定下了一些规矩,就按照规矩按部就班地做。这样做的原因就是能够避免犯一些明显的、愚蠢的错误。

后面更重要的问题是,怎么样才能让自己遵守SOP?

2.

今年2月份的时候, 在写一个涉及近百万份文件的整理工具。

初始的选择是python,估计用python写会很快完成,工程量可以锁定在两周内。

也曾经用过shell,处理一些常用事务,但是没有用shell写过多线程以及相对复杂和完整的工程。

摆在面前有两条路,一条路熟悉而且进程相对可控,另一条路则不那么熟悉而且不知道会持续多久。后面这一条路,是一个非常好的通过实际项目来学习的机会。

我当时的做法是,跟自己慢慢地“讲道理”,一点一点地“引诱”到陌生的道路上。当时的过程比较痛苦,特别是遇到tricky的问题的时候。shell的学习路线非常陡峭,有的时候仅仅是文件路径中的一个特殊符号,比如空格,就会让人调试很长时间。工具需要运行于双系统,而Mac是基于BSD,而不是GNU,所以和 Ubuntu shell的命令集会有差异。

项目完成的时候,我学习了 xargs 和 parallel 在实际使用上的差别。

类似的例子,在近期还有一个,在设计知识库应用的时候,面临数据库选择,我更熟悉MySQL和 MariaDB,但是应用场景需要灵活地添加和更改表字段,而且在项目发布以后,字段仍然会更改。

MySQL能够解决,但MongoDB是更好的选择。也能感觉自己当时的纠结,总是倾向于回到“老路上”,呆在舒适区。

在技术上,呆在舒适区,则意味着技术生涯的结束。

3.

呆在舒适区的表现,除了使用习惯的工具和用法之外,还有沿袭习惯的看法。

今年2月份,还经历了一场长长的项目语言框架选择的纠结和调研。

作为系统开发语言,有几个主要的候选:python, php 和 javascript;在web开发方向上,更熟悉php,但这一次,在心里自己却排斥php。原因是因为自己使用了php很长的时间,认为它没有什么“新颖性”。

但这个时候把握项目的发布进度,是一个重要的考量因素,因此强迫自己对这一门语言进行重新审视。

确定开发语言以后,基本上都要考虑框架选择以及MVC中的模板选择。

Laravel, Smyfony, Zend, Yii, Swoole, 有一大堆框架和模板的候选集。

而有意思的是,php语言的作者Rasmus曾公开批评市面上的php框架,而同时,几乎所有的php产品开发,都在使用某一个框架。

我也是从一个极简的前端模板开始使用php的。当我开始看Laravel的时候,觉得好像开始了学习另外一门语言的过程。

我看了Rasmus对于模板的描述,他说道:spend your time building a lean and reusable pattern that fits your requirements directly.

php本身就是一种模板语言,而现在的框架在做的,都是在模板语言之上再用一层模板,把它封装起来。

另外一篇文章是这么说的:

In short, the point of template engines should be to separate your business logic from your presentation logic, not separate your PHP code from your HTML code.

翻译过来,直白地说,是因为我们有某种类型的“强迫症”,为了实现MVC,而设定了 html页面里面只能有 html 代码。

因此,几乎所有人都在做的事情:在php之上,再选择一个框架,把php从html页面里剥离干净。这么做,只是因为多数人都在这么做。

Rasmus的话语非常精炼,Lean and Reusable,极简、不浪费、可复用,首先面向解决的问题,而不是外在的工具。

我扔掉了原来使用的只有几百行代码的小框架,开始直接在html页面里写基于展示的php代码。写“原生”的php的感觉很好。

这个过程,重新刷新了我对于php的认识,在10余年之后。

这个过程,让我明白,于人于事,总有着根深蒂固的偏见。

对自己不熟悉的领域,即使自己是个门外汉,但自己心里会以为自己“懂得”;

而对于另外一些领域,比如经常使用的语言、工具、甚至是接触过的人,也会以为自己“懂得”。

没有玩过游戏的人,也许会认为游戏行业是浪费时间;

没有做过投资的人,也许会义为炒股票是不务正业;

我之前确实有上面这样的观点。

以为大脑是自由的,其实一旦开始思考,束缚无处不在。

在今年还遇到几个教训,它们让我反省:

并不是在某个行业从业的人,他们就拥有了专业的优势;

并不是在某个行业树立了某种程度的口碑的人,他们就拥有了更强的判断力;

我不迷信权威,但是权威的声音却时时影响着我,不论是接受,还是拼命拒斥;

如果是重要的决策,在依赖他人的判断之前,自己必须先经过学习。

给自己立下了一个小小的规矩,在对某一个领域,或人或事物,达到100个小时以上的学习之前,不在心里做预设的结论。

那些通过他人口中、畅销书籍、公众号、知乎得来的知识,很可能不是真正的知识,它们只是在我心里树立起来一个个安全壁垒,从而极大地束缚和限制了我所看见的,和我所能去做的。

上面3个是和技术多沾一些边的例子,在生活和工作中,还犯过更严重和离谱的错误。

上面的这些例子,所以能够记得,是因为我依然保留着每天记录工作内容,每个月写工作和生活总结的习惯。

我感谢生活给予的一次次的学习的机会,在7月份的时候,投入近1个月的时间,开发了我个人的“错误收集器”,一个小小的学习系统。

这个小小的系统,能够让我保持反省和自我检视。

让自己每年能够发现并纠正一个主要的缺陷和问题。

犯错->疼通->愈合->忘却 和 犯错->疼痛->反省->纠正 是生活的两条道路,either one,都是选择。

生活像是一个个小盒子,我把自己犯的各种错误收集起来,让自己离真相更近一点点。

tag: 学习 方法