程序员生涯带给我的几个思维习惯

一天,数学家觉得自己已经受够了数学,于是他跑到消防队去宣布他想当消防员。
消防队长说:“您看上去不错,可是我得先给您一个测试。”
消防队长带数学家到消防队后院小巷,巷子里有一个货栈、一只消火栓和一卷软管。
消防队长问:“假设货栈起火,您怎么办?”
数学家回答:“我把消火栓接到软管上,打开水龙,把火浇灭。”
消防队长说:“完全正确!最后一个问题:假设您走进小巷,而货栈没有起火,您怎么办?”
数学家疑惑地思索了半天,终于答道:“我就把货栈点着。”
消防队长大叫起来:“什么?太可怕了!您为什么要把货栈点着?”
数学家回答:“这样我就把问题简化为一个我已经解决过的问题了。”

这是一个流传很广的段子,如果把其中的数学家换做程序员也同样成立,程序员绝对不允许自己重复去做一件相同的事情,他会将做这件事情的方法变成一个函数或者抽象为一个对象,然后在解决类似问题时,直接调用函数或实例化,将新的问题转化为自己解决过的问题,这样不费吹灰之力就能解决新问题,干脆利落。道理是这个道理,但不同段位的人去使用所产生的效果就不一样,段位较低的程序员会产生一种“手里拿着锤子,看什么都是钉子"状态,段位高的程序员不会为了使用这个方法而使用这个方法,他们会思考问题的本质原因,从而决定使用什么方法。

可以看出来,程序员做的事情也并不复杂,程序员使用的编程语言也只是一种和这个世界交流的方式,方式背后的方法论还是一致的,只不过新的应用环境,新的时代需要新的交流方式,也需要一种新的方式去解决新的问题罢了。重要的还是其背后的方法论,我的理解为程序员是一个载体,载体内部承载的是更深层次,更本质的东西,就像其他工作一样,每一份工作背后都有一定的方法论在支撑,也可以理解为工作经验,工作不同,但工作经验,就是工作背后的方法论倒是可以提炼和迁移的。

那么于我而言,由之前的程序员生涯转到如今的能源电力行业,两段工作性质截然不同的工作该如何衔接?大学和研究生期间的编程经历给我带来了什么?或者说我能从中提炼出了哪些可以迁移的方法论和习惯,进而延续到现在的工作,让这两段经历做一个完美的衔接,这是一个值得深思的问题。

1、怎样快速去学习一门技能

按照对一个技能掌握的水平而言,可以简单地分为入门,高手和专家三个级别,对一个什么都不懂的菜鸟来说,如果想达到专家的级别,需要经历入门,慢慢成为高手,最后达到专家的水平,级别不同所需要的进阶方法也不同,分别为:

a、马上去做

对一门技能来说,快速入门的方式就是马上去做。你不需要去了解非常多的背景知识再动手去做,不必等所有的条件具备了才采取行动,只是入门而已,放下心中的各种包袱,包括我以前没有接触过,我可能学不好这些观念等等。简单了解基本的东西后,马上就去做,磕磕绊绊的去做,碰的头破血流也好,犯错也好,都无伤大雅,因为你只是想入门而已。

b、学习前人的套路

入门之后,你可以自学,但如果你想快速的成为高手,马上找一个在此领域有丰富经验的老前辈,向他请教,他会传授给你一大堆经过实践检验有效的套路。你需要做的就是对别人的套路进行模仿和刻意练习,让这些套路融入到你的行为习惯和思考模式中。这时最忌讳的是过多思考套路本身和背后的方法论,因为你的实战经验不足,所以做这样的思考只会拖慢自己学习的进度。去驾校学车就是一个鲜明的例子,在驾校学车比较慢的人很多时候都是学历非常高的在校大学生,这是因为教练在传授很多实用的套路给学员时,大学生过早的去思考套路背后的原因,去习惯性地思考为什么这样做,其实完全不必做这样的无用功,教练教给学员的实用套路是经过多少次的实践检验过的,学员只需要照搬过来,直接使用即可。

c、知其所以然

随着经验的累积,你会慢慢明白套路为什么有效,你使用套路越来越纯熟。你开始思考套路背后的方法论,去思考为什么是这样,去思考技能背后的理论知识,而你现有的认知能力和知识储备难以回答自己的疑问,所以你自己去补充相关的知识,并针对其中的几个关键点做深入的研究,融会贯通,最后你根据自己的实践经验和理论知识对原有的套路进行改进或推倒重来,建立了你自己的套路,基本上你就是专家了。

对一个技能而言,学习技能是为了使用技能,并且越使用水平越高,那么最好的学习技能的方式就是练中学,即从一开始的学习中就是在使用这个技能,不管你是入门,高手和专家,你都在练中学,都在不断实践和使用。以学习一门新的计算机语言为例:

首先,最好的入门方法就是,先大致过一遍这门计算机语言,最好找本书,只看前几章基本的介绍和语法规则,之后给自己提出一个问题或要实现的功能,然后使用这门编程语言想方设法把这个功能实现。一开始会很痛苦,但对技能而言,这是一个最快速的打开方式,作为初学者,最不能做的就是去记忆计算机语言教科书上所有的知识点和语法规则,全部记忆之后才开始使用计算机语言实现一些功能,如果这样的话,可能你永远都熬不到入门的这一刻。

其次,从入门到成为高手,不只是做到要不断的练习,同时找一个优秀的实例去练习,把例子中的代码从头到尾敲到IDE中,最后经过调试能够让这个例子顺利运行,然后修改例子中某个函数的参数,搞明白每一步是用来干什么的。同时,去总结出实例中的套路,并加以使用和实践。学习套路的方式还有去看前人写的关于设计模式的书籍等等。

最后,成为专家,绝大多数的程序员都处在入门到高手之间,极少数人能够达到高手的水准,更别提专家了。成为专家的程序员也必定是一个哲学家,因为他们都问了自己太多的为什么,同时,他们也积攒了足够多的行业经验,甚至成为专家的程序员因为不满当前计算机语言的设计,而自己动手设计了一门新的语言。因为他们思考过为什么设计这门计算机语言,为什么设计语言中的各种规则,他们知道本质的东西,所以他们才能从本质上创造出新的东西。

2、解决问题的能力

在计算机编程中,每天都会遇到无数的新问题等待去解决,一个常见的流程是:有一天,领导交给你一个任务,让你开发一个系统或者实现一个功能,假设领导提出的需求你都明白是怎么回事,这个假设很重要。你需要去思考怎么实现这个功能,有可能是你完全没有接触过这个功能,不管怎样,你百般思索,绞尽脑汁有了具体的行动思路,你就解决了第一类问题。你根据自己列出的思路和步骤去进行一步步的实现,过五关斩六将,突然你在一个问题上卡壳了,你冥思苦想,遍寻高手,最后解决了第二类问题。最后,你按照预想的思路和步骤一一进行,得到的最终结果却不是你想要的,和最初要求的功能相差非常大,你慌了,你不知道问题出在哪里,遍寻高手,结果没人搭理你,不得已,你不得不仔细梳理每一步,逐个排查,最后发现了问题出在了哪里,然后你解决了第三类问题,最后的最后你漂亮的完成了领导交代的功能。

上面的过程是一个典型的解决问题的流程,是一个人解决问题能力的集中体现,解决问题的能力包含了多种能力,诸如分析能力和执行力等,是对人全方位的要求。本节主要阐述解决问题的过程,按一件事情的发展程度来说,其中涉及到三类问题:

第一:对什么都一无所知的菜鸟来说,怎么从0开始起步,有具体的行动思路和步骤

编程中的功能实现就是解决一个问题,你需要去拆解问题,去思考问题背后的真正含义,思考问题想达成的目标,思考问题的根源。然后用算法去映射解决问题的步骤,同时用数据结构来代表所涉及的各方代表,最后利用计算机编程语言去实现。从表面上来看,编程语言是一种工具,是人与计算机交流的一种工具,同时编程语言是一种抽象方法,也是一种看待世界的方式,用于将现实的问题转化为计算机中可以理解的一种方式,最后利用这种抽象的方法去解决现实中存在的问题。这里最关键的是通过编程语言,算法和数据结构,得到一个可执行的解决问题的思路和步骤。为了得到思路和步骤,需要做到两方面的工作,其一对我的问题进行拆解和思考,其二使用一种抽象化的工具去映射问题的本身。

第二:根据形成的思路和步骤逐个去执行和实现时,遇到了卡壳

这里遇到的问题其实是相对比较好解决的,因为这些问题大多时因为背景知识缺乏导致的,同时我们对问题出现的位置和原因很清楚,那么解决的时候只要去查找相关资料来弥补背景知识的空缺,或者求助一位在本领域经验丰富的人就可以把这类问题解决掉。

第三:将每个已经实现的思路和步骤连接在一起时却没有出现预想的效果

代码调试过程去有调试工具可以帮助开发者迅速找到出现问题的地方,对一般的问题而言,我们要找到这个调试工具,尽快找到问题的症结点,比较快的方式就是“控制变量法”,将可能出问题的点罗列出来,逐个将这个点作为变量,利用控制变量的方法逐个测试每个变量的变化对最终结果的影响,迅速就能找到解决问题的根源,然后将其解决掉即可。有的时候,当你找到问题的根源并且解决之后,你还是没有得到你预期的效果,很有可能就是一开始的思路和行动策略出了问题,那你只能去思考之前的思路是否正确,对其修正或推倒重新建立,最后事情的真相也就会在这样的循环往复中逐渐浮出水面。

3、如何有效地得到高人的帮助?

编程中经常会遇到一些即使使用搜索引擎也无法解决的问题,这时就需要向高人请教,而高人通常也是很愿意帮助菜鸟的,但为什么还有很多菜鸟的问题得不到解答,贴吧论坛中的问题没人回,群消息没人理,根据经验来看,可能有三个原因:

其一,态度问题,请教对方问题时,你的态度是怎样的?傲慢的?理所当然的?还是感恩的?虚心的?别人帮你是情分,不帮是本分,别人也非常忙碌,也有一大堆事要做。我们在请教别人问题的时候,能不能一开始把态度摆的端正一些。其二,问题太大,问题越大越不容易得到被人的帮助,因为别人帮助你的成本太大了,需要花费的时间很多。你必须通过自己的思考和查相关资料,将这个大的问题缩小某个关键步骤,或者从这个大问题中抽出一个本质的问题出来,然后把这个问题抛出去就好了。其实,很大的一种可能是当你把一个大问题抽丝剥茧,从中看到本质的问题时,你自己也就解决了。学会细化你的问题,把问题进行分解为一个个小的可以立马解决的问题。我们抛出一个很大的问题就代表我们没有深入的思考这个问题,还没有搞清楚问题在哪里,那么拿这样一个问题又怎么能够得到答案。其三,懒得行动和思考,和第二点的原因有点类似,别人拿到我们的问题后,不会像解答复杂的数学题一样,从开始到最后得到答案的每一步都写给我们。一般情况是,对方会提供给我们一个大概的思路或者指出一个方向,具体怎么做还需要我们自己去一步一步摸索找到答案,不要指望别人能够手把手教你。假如你对自己遇到的问题思考良久,苦苦挣扎,始终找不到答案,换一个角度来看,其实你离答案已经非常近了。

4、换位思考

之前是做Web前端开发多一些,所做的很多程序开发工作都会被非常快速直观的展现在浏览器中,而用户在使用产品过程中建立起来的一种纯主观感受叫用户体验。我体验过用户体验非常差劲的网站,同时我作为开发者也深刻理解我的每一个设计与开发的逻辑和用户理解之间的鸿沟有多么的大。作为程序员认为理所当然的事情,认为理解起来非常简单的逻辑,到用户那里,可能就被骂娘了。如果程序员开发出了用户体验非常友好的产品,他必须站在用户角度考虑,就是换位思考。

现在大家都在强调换位思考,叫嚣着理解万岁,可换位思考真的很难做到,很多人所谓的换位思考还是我站在自己的立场上去为对方思考问题,你完全没有站在对方的立场去思考问题,这里面的差别特别大。

赵周老师在他的书《拆出你的沟通力》一书中讲到换位思考的三个维度很有启发性,换位思考也就是受众分析,分别为分析受众的期望,分析受众的价值观和分析受众的利益。不管是商业谈判还是一般形式的交流,双方在任何形式的交流之前,都已经在心中形成了自己关于这个话题的期望,那你是否去思考过对方的期望是什么。其次,人们做出的任何决定,说出的每句话,做出的每件事情背后都有其个人价值观在支撑,如果你想更准确的理解这个人,你就要通过多种途径去分析对方的价值观,如对方的成长经历,家庭环境等先天要素都会深刻的影响到一个人的价值观。最后,可以说每个人都是一个自私的动物,他们都有自己内心的利益考量,所谓无利不起早,你不知道对方的利益攸关点在哪里,你怎么把事情做到点子上,把话说到点子上。

5、多问一个为什么

程序员做久了,就会像其他工作岗位进入一种例行公事的状态,工作岗位上的所有工作都已熟稔。编程多了就进入这样一种状态,习惯性的按照以往的套路去思考问题和解决问题,因为其中的编程语言、算法和数据结构都用起来非常顺手了,倒是很难有闲情逸致回头去思考编程语言本身,比如算法和数据结构这些工具背后代表的一些东西。所以就处于一种知其然不知其所以然的状态,所做工作的也仅限于使用这门编程语言,没有去思考编程语言的由来,这样就很难会从本质上理解编程,进而达到炉火纯青的境界。想起了大一学习c++课程时,艰难地学习循环,条件判断,面向过程和面向对象等,吃力地去理解这些概念,同时去磕磕绊绊地使用编程语言去做出一些东西,却没有去思考编程语言的设计者为什么去设计这门语言,为什么设计循环?为什么提出了面向对象的概念?当时作为入门级选手不去思考也就算了,后来浸润编程多年也未做本质上的思考就说不过去了,所以我的编程水平就经常止步于一定的水平,卡在一个瓶颈上。

抛开编程来说,在其他工作中,领导吩咐你干一件事情,这是what,应该做什么事情,你很勤奋努力的去完成了,是how,是怎么做好这件事,很多人都止步于怎么做好领导交办的事情这个阶段。还有一部分人会思考的深入一些,他们会去思考怎么做才能做的更好,才能超出领导的预期效果,能达到这一步的思考已经非常优秀了。最后,可能还有一两个人会去思考为什么要做这件事和为什么让我做这件事,就是why,如果你这样想的话,你就开始关注更高一层次的东西了,开始思考超越你目前工作层面的东西,甚至能够和你的领导思考在一个层面,其中的好与坏,你是知道的。

从编程中可以抽出来的东西太多了,这里只给出对我来说比较有益的几个习惯,当然也有不好习惯,这些坏习惯偶尔会跳出来恶心自己一把,比如自动化,程序员想要呈现给用户的都是一个自动化的流程,特别是涉及到数据处理和多个模块进行衔接时,程序员讨厌手动的将两个模块进行连接,他们要求的是计算机为他们做一切工作。但现实生活中,要把很多模块自动化的连接起来做到无人值守,实在是太难了,成本也非常高,并且很多问题也不适合去做自动化处理。

另一个明显的例子时,程序员完成的一个功能和系统中,会涉及到算法的很多步骤,而每一步骤必须准确定义好步骤间的所有接口规则,这样才能保证功能的正常运行。而在实际工作生活中,工作与工作之间的衔接要求并不是那么高,工作与工作之间必须有规则来限定,但因为有人的成分存在,就不可能穷尽所有的规则,试图这样做的人都是强迫症,而程序员就几乎是这样。

我觉得我做了一件很滑稽的事情,已经毅然决然地离开了编程转向了另一个工作岗位和行业,却开始思考编程给我带来了什么,开始思考计算机语言是为什么设计的。那么当初我在日日夜夜沉醉在码代码的世界中不能自拔的时候我在想什么,可能我在想着如何实现某个新的功能,连停下来思考一下的功夫也没有,这又是一件悲哀的事情,竟然忙碌到不能停下来思考正在做的事情和思考一些本质的东西。身处其中的确很难以一个旁观者的角度去审视和观察当前的状态,如果不能时不时地停下来思考走过的路、正在走的路和将要走的路,你就根本不知道你要走向哪里?只能被动的被推着往前走,或者被动的在一个地方来回打转,难以上一个新台阶。

好在趁我离开编程的时间还不长,还能够想起来什么,我还可以去思考,思考过去的经历、思考怎样将过去与现在与将来的工作很好地衔接在一起,让每段的人生都不会白过。其实,任何一个工作都有其背后的方法论做支撑,不同的工作有不同的方法论,但不同的工作也会有共同的方法论,思考和提炼一些工作背后涵盖的方法论,去为下一个工作,下一段人生打开更多的门。同时,去思考怎么将工作中使用的方法论,进行再一步的抽象,往更高层级抽象,然后你就可以将这个方法论应用到更多的领域,比如其他工作和生活中,我相信最高级的抽象是道,道生一,一生二,二生三,三生万物,这个理论相对复杂的多,还未思考成熟,暂不做展开。

题外话:随着计算机技术的发展,AlphaGo的出现,标志着人工智能的水平已经达到了一定的水平,深入了解计算机是怎么工作的并与计算机直接交流就显得非常重要,人工智能时代怎么能够不懂得与计算机交流呢?而编程是最为直接的交流方式,现在市场上已经出现了很多教授孩子的编程软件和课程,可以想见的是,未来,编程可能和口语一样重要和普及,不然人工智能时代,下一个被淘汰的可能就是你。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,050评论 25 707
  • 本文把程序员所需掌握的关键知识总结为三大类19个关键概念,然后给出了掌握每个关键概念所需的入门书籍,必读书籍,以及...
    dle_oxio阅读 11,054评论 6 244
  • 仙历725年,梨梦山被魔族攻陷,惨遭屠山。 仙历745年,梨梦山魔族被斩杀殆尽,无一生还。 仙历750年-----...
    雨后芦苇阅读 397评论 1 0
  • 1 江河翻腾 山岳摇晃 是谁动了乾坤 2 月迷茫 星凌乱 是谁拨动了琴弦 3 饮尽了千觞 再斟满 放纵豪情又何妨 ...
    童心_8c86阅读 694评论 28 57
  • 每日工作单 | 类别|功能|解决状态|优先级|说明|负责人|序号|提出|提出日期|解决日期||:----|----...
    东方常德阅读 708评论 0 51