编程给我带来的思维提升
为什么写这篇文章?
我发现 很多程序员都不想做一辈子的程序员,包括我周围的程序员朋友也跟我说 当他看到公司来了一名四十多岁的程序员时,他心情是焦虑的,因为他不想自己四十多岁了还坐在电脑面前写代码。
听了之后,我不知道该怎么接?
这种想法会产生一个阻力,这个阻力会阻碍我们成为更优秀的程序员。当然这种想法或许已经透漏出 成为优秀的程序员 已经没有诱惑力了。
那么,既然没有诱惑力,为何你还在苦逼编程?
我写这篇文章并不是希望你转行,而是想说 其实编程不仅仅是编程。
不管从事什么行业,也不管学的什么专业,其实它们之间都是互通的。
例如编程,不要只看编程本身,看到更多的应该是在编程过程中如何提升我们的认知的。或者 如何通过编程来提升我们的认知?
根据芒格的格栅理论,我认为就是所谓的跨界学习。也就是说 不同的专业学术,都有它的思想理念,掌握这些思想理念,将其纳入自己的思维格栅中,它能帮助我们在多个维度来分析问题,从而作出更理性的决策。
我目前差不多近三年的编程经验了(不多也不少吧),下面我分享一下 编程给我带来了哪些思维上的提升:
这里我分了三个小节,分别是:
- 程序设计过程
- 程序编码过程
- 程序测试过程
程序设计过程
在一开始程序编写过程也许不存在设计过程。但慢慢会发现 如果没有良好的设计,程序在未来维护起来是很困难的。
甚至不需要等到维护阶段,在测试过程中 就会发现各种偶然性问题,偶然性问题的根本原因不是出自偶然,而是程序流程混乱导致的。
想到这种问题的根本原因在于:
一种思维模式:
程序的一种特征是 指定一个输入 必然会有一个对应的输出。程序是单纯的。
所以 一个错误的输出 肯定来源于一个错误的输入。
而程序又是一段一个接一个的执行过程,所以错误的输出 肯定是因为这个流程中出了问题。
这种思维方式对我们测试程序很有帮助。
这应该算是一种看待世界的方式既:
如果要解决问题 就要找到问题的根本原因。
就像我们分析源码的目的一样,“知其然 也要知其所以然”,相信所有事物运转正常都有它内在原理。
偶然性问题也许是因为:
- 它也许不是真的能工作
- 你依靠的边界条件也许只是一个偶然,在不同情形下 它的表现可能就会不同
- 也许你都不知道它为什么能工作
...
解决偶然性问题的方法就是在编码之前做好程序的设计工作。
主要设计包括:
- 程序结构设计
这种设计 可以提升我们的抽象思维。
这种结构设计 就是我们经常说到的 模块化、组件化等架构相关的内容。
它需要我们将一个复杂的东西 拆分成具体可实施的小模块。
这也是一种思维模式:
将复杂问题 分解成多个可解决的问题。
这种思维模式同样也可以运用在其它领域。
如何运用的呢?
碰到一个难解的问题,就试着分解这个问题,分解到具体可以实施的地步,再一个一个的解决。
模块化、组件化等架构设计的目的是为了解藕。解藕的目的是便于管理。
这种思维模式可以运用到管理中,就是我们经常见到的 各司其职。
上到国家管理 下到公司的管理,都是如此。
- 程序流程设计
简单来说 就是如何让程序跑起来正常、可控。
首先就是如何保证正常,比如:处理同步异步问题的方法。
让整个流程是正常的,也就是上面所说的 非偶然性的正确输出。
可控,在以后新增、更改需求也能保证流程正常。
这里就涉及到了各种设计模式,以及一些编程语言
(很多编程语言之所以能提升效率 我认为就是它的设计能让程序更加可控,例如:函数式编程里函数作为一等公民,可以像普通变量一样传递,让我们省心去设计一些复杂的东西,因为每多写一行代码 可能就会多一个bug)
在其它领域中的应用:
比如:工厂的流水线设计、各种流程手续的办理等。
正常 就类似于 流水线能够正常运转;
可控 就类似于 在流水线中间加入一个环节或者减少一个环节 不会干扰到其它环节。
程序编码过程
有了设计过程,编码过程就应该是按照设计合约来完成的。当然设计也不能保证完美无缺,所以在编码过程中 如果发现设计有问题或者是设计过程未想到的场景,应该更新设计(刚开始做设计会经常出现设计不完善问题)。
在这个过程中能让思维更加谨密。
在其它领域也一样,这种谨密的思维 能减少出错的机率。
测试过程
我们程序员都知道,不管代码写得多优雅、流程多风骚,都需要来一场测试拼杀。
测完得到了一堆bug,往往能给我们更多反思,测试之前的自信哪来的?
或者是,
我就知道会有这么多bug,因为我写得烂嘛~
然后就是一个一个的解决它,BUT,没那么容易
在 bug 的解决过程中,你又会发现 如果一个问题解决方法不对 这个解决方法又会产生新的问题。
也或许是因为对问题的定义不对而导致的。
所以说,问题的定义决定了问题的解决方法,而问题解决方法又决定了新问题的来源。
所以 “我们有必要对方案实施后可能产生的后果进行预判”
但 就算进行了预判,之后又可能出现其它问题。
不过 就算永远无法确定已经找到的问题定义是正确的,但是永远不要停下来寻找正确定义的脚步
这是不是也算一种人生的态度呢?
回到开头,为什么 不想做一辈子程序员?这个问题的本质是什么?
是因为程序员太累?还是觉得做一辈子程序员没出息,工资太低?或者是觉得自己应该干一番大事,而做程序员格局太小了?
问题的本质其实就是在于理想与现实之间的区别。
如何解决这个问题,就看你怎么定义这个问题了。
我觉得编程确实可以给我们程序员带来很多提升,能有多大提升 这就在于你有多在意它。而把编程思维纳入到我们自己的思维格栅中 不管未来从事什么行业,都是很有帮助的,所以说了这么多 其实就是好好的对待你的代码吧。哈哈~