心流

最近在看《驱动力》这本书,其中有提到「心流」这个词,只是从描述来说,有点太抽象,不过刚好最近感受了几次「心流」的感觉,所以记录一下。

先说下概念,心流主要是指一种自动的、非刻意的、高度集中、全情投入并享受其中的的忘我精神状态。

我自己感受到的「心流」状态是最近在学习 python 编程,通过编写一些工作中需要用到的工具的过程。

这个过程中的带来的特殊感受有:

自己制定目标,自己规划目标,并自觉的持续达成;
达成目标过程中的所有问题都有耐心并积极的寻求问题的解决办法;
时间过得特别快,甚至愿意花费自己的休息时间来保证目标达成;
持续的改进动力,且没有对回报的渴求,更加享受这个过程;

其中有三次典型的心流峰值,下面分别说明。

第一次是解决一个编码的问题。

这是一个工具的需求,需求是使用字符串形式读取一个 PE 文件,然后暴力搜索其中的字符串。

同样的实现语句,在 Python2 中的输出是正确的,但是在 Python3 中的输出却不正确,检查发现和默认编码有关系,Python2 默认使用的 ascii,而 Python3 默认使用的是 utf-8,如果使用记事本打开的话,默认也是使用 ascii,所以和 Python2 的效果一样。

为了让实现效果一致,在 Python3 的实现中我显式设置 encoding 为 gbk 了:

1
f = open(readFile, 'r', encoding='gbk')

结果就是这个语句报错了:

1
'gbk' codec can't decode byte 0x90 in position 2: illegal multibyte sequence

也就是这个错误导致我纠结了很久,花费了不少的时间,甚至有一段时间都搁置了,最终我把问题提交到了 stackoverflow,同时继续查资料,也就是提交问题后不久,就在 python 官方文档中找到了解决方案:

1
2
3
4
5
The errors parameter is the same as the parameter of the decode() method but
supports a few more possible handlers. As well as 'strict', 'ignore', and
'replace' (which in this case inserts a question mark instead of the unencodable
character), there is also 'xmlcharrefreplace' (inserts an XML character
reference) and backslashreplace (inserts a \uNNNN escape sequence).

其实还是蛮讽刺的,因为基础没打牢,一个基本的函数实现却耗费了不少的时间,虽然解决问题后,那种兴奋的感觉还是蛮让人激动,不过最大的收获还是发现问题先看官方文档

上述问题的详细描述可以 看 stackoverflow

第二次是解决一个打包的问题。

因为我的工具会分发给大家使用,但不是每个人的环境都安装了 Python3,或者即使安装了,相关的依赖库也不一定完备,所以我是使用 pyinstaller 进行了打包后再进行分发的,但是因为 pyinstaller 自身的 Bug,让我打包的 exe 总是没法自动提权,网上搜了下,很多人碰到这个问题,但是都没有很完整的解决方案,自己在尝试多次后,都有点要放弃了。

最后突然想起来自己使用的某些工具也是使用了类似的功能,所以问了下这些工具的打包流程,要了打包脚本看了下,突然了恍然大悟了,没有问题的这个是使用的 pyinstaller 提供的另外一个方式而已,只是会稍微麻烦点,需要单独准备资源文件,然后把资源文件进行嵌入,自己拿来改造优化一下,最终实现了预期效果。

这件事给的教训就是,很多问题,一定要站在前人的肩膀上去看问题,这样可以是事半功倍,当然,拿了别人的解决方案也不能仅仅是拿来主义,需要搞明白其中的原理,方便自己举一反三,或者优化改进。

另外,对于自己在过程中付出了努力、时间和精力的问题,最终解决的时候,还是十分令人激动的,我认为这就是「心流」的感觉。

第三次是解决一个父子窗口联动的问题。

这次和第一个问题有点类似,就是有一个实现的效果,明明知道可以实现,但就是不知道怎么去写代码实现,或者说不知道方法怎么合理去利用。

我大概描述一下吧:我新建了一个窗口,是在主窗口上点击按钮后弹出的,现在我要在新窗口修改主窗口的内容,但是一直不知道怎么调用主窗口的控件。

和第一个问题类似,我也知道需要利用父类继承的逻辑来达到效果,但就是不知道怎么去写。

在尝试了多种实现方案,在网上看了所有能看到的资料后,最终还是把问题提交到了 stackoverflow,结局和第一个问题类似,在我提交了问题后不久,自己就又找到了问题的解决方案,仅仅是在自己之前的方法中多增加一个初始化字段:

1
self.parent = parent

问题是简单的,道路是曲折的,问题解决了,心情是高兴的,留给自己更大的反思还是对于一些基础的巩固一定要加强,只有某一些理论知识丰富了,后面的实践才能更得心应手。

当然,本次主要想说明的是解决问题的兴奋感,不管问题大小,只要是自己觉得有价值的,那么问题带来的不是挫折、不是困难、不是灾难,是兴奋、激动和「心流」的感觉。

上述问题的详细描述可以 看 stackoverflow

简单做下总结。

发现问题和解决问题的过程是最有意义的,有些问题解决后才发现原来只是某一点没有想到而已,但是在没有想到之前,这就是一个盲点,而解决这个盲点就是这个过程中最大的意义。

比如最后一个问题,其实我之前也尝试过用父类的方法进行传递和调用,但是方法不正确,导致结果也不正确,最后就尝试其他方法,最后却还是兜兜转转转回来了。

另外一点感触就是,基础知识太重要了,有些盲点仅仅是因为太注重实用过程,所以疏于基础的巩固,那么一些很基础的特性可能就不会被想到,那么导致的就是问题解决的复杂度提高了,比如第一个问题的 ignore 参数问题,理论来说,是个函数的基本参数而已,不应该因此耗费太多时间。

最后一点,「问题」不仅仅是「问题」而已,他是一个契机、一个场景、一个过程、一种经历,只有经历了「问题」,才能享受到解决问题的「心流」的感觉。

人生不也是如此?

Enjoy it!

sylan215 wechat
十年测试老鸟的原创干货,扫码关注我,一起涨姿势

相关文章: