思维认知

编程思维的本质究竟是什么?

谈编程不可避免的要谈到编程语言,而编程语言之所以出现,其最终的目的仍然是 提供一种抽象方法来解决现实中的问题 ,问题本身的复杂程度往往取决于抽象的种类和质量。

从汇编语言的出现解决了最初的抽象,而类似c或fortran语言出现则可以看做是对汇编语言的进一步抽象。这一步抽象的完成其实是很重要的一个进步,即我们在解决问题的时候不再需要关系复杂的机器模型或机器码,而是可以更多的关注问题和解决方案本身。

在这个阶段,从 编程本身来说最核心的还是算法和数据结构 。这也是任何程序最重要的两个基本要素。既把问题域本身涉及到的数据映射到合适的数据结构,把通过程序解决问题的过程映射为具体的算法逻辑。

那么编程实际的难点在哪?

不是算法本身或数据结构本身,而是 当你拿到问题域的时候知道如何理解和分解问题,并将其映射到最适合的算法或数据结构上 。这个映射其实本身不是程序解决的问题,还是人脑在思维,程序本身仅仅是在实现自动化的过程。

那么程序在算法实现过程中最基本的是什么?

我们看不同的程序片段可以看到的还是if/else,或者for/while,然后才是数据或数据类型定义。而前者即写任何一个程序中最重要的控制逻辑。那么编程里难的实际上不是控制语句本身,而是在把问题域分解后知道如何理解判断逻辑,如何将问题域中重复的东西抽象为循环,如何从问题域中抽象出数据结构。

一个人编程能力本身的好坏,或者说编程思维能力,重点其实是体现在这种映射能力,也可以称这种映射能力为数学建模能力。

举个例子来说,如果一个问题你已经知道了可以映射到构建二叉树,然后通过遍历的方式来解决了,那么可以说然后一个掌握了语言语法的人都可以写出程序来。那么实际编程思维或能力的强弱则在于前面谈到的映射和建模。

对现实世界的抽象理解,从抽象归纳到演绎泛化

面向对象思想和面向对象编程语言的出现,可以说也是编程思维本身的第二次重大提升。

即原有的编程语言可以看到我们关注更多的已经是抽象后的解决方案,而面向对象的编程语言则首先关注的是通过类,通过继承,通过接口定义等首先对现实世界进行很好的抽象描述,其次才是如何去解决问题。现实世界中所有的一切都是对象,而面向对象语言中的类本身就是对现实世界中对象的很好的抽象。

对于面向对象的核心特征谈的比较多的是封装,继承和多态。这些可能比较偏技术词汇,那么再简单点来说面向对象编程思维其核心则是 找到问题域中的对象,将其抽象为类,识别类应该有的属性和方法特征,同时去理清类和类之间的关联和交互关系,将问题本身的解决过程映射到类和类之间的方法交互上。

如果从这个意义上来说,好像也不是很复杂,那么实际面向对象编程的难点实际在为了保持代码足够的健壮性,可维护性,可扩展性而做出的各种抽象,包括接口的提取和组合,控制或逻辑类的增加等,这些本质已经转换到技术域类本身。

另外编程里面有一个重要的思想即是复用 ,从最简单的函数,到模版库,类库,再到更上层的公共组件等,都在体现复用的思想,而复用本身的目的则主要是提升开发效率,提升可维护性和代码的可读性等。复用可以理解为编程过程中的编程思想更加恰当。

编程的思想是自动化 ,不要简单的理解为编程语言能够帮助你解决建模和映射的难题,编程的自动化更多的还是体现在机器可以自动化的进行大量计算和运算,而这个运算是通过我们的程序进行的。程序中体现的一个重点我更喜欢把它理解为循环,从抽象中去发现一种可自动化的循环,这种循环的处理正是程序的强项。

任何人都应该有这种自动化的编程思维,即懒人思维,重复的事情一定不要手工重复完成。

接着再谈下架构思维,对于架构思维本身仍然是类似系统思维,结构化思维,编程思维等诸多思维模式的一个合集。由于架构的核心作用是在业务现实世界和抽象的IT实现之间建立起一道桥梁,因此架构思维最核心的就是要理解 业务驱动技术,技术为最终的业务服务。要真正通过架构设计来完成业务和技术,需求和实现,软件和硬件,静态和动态,成本和收益等多方面的平衡。

分解是最基础的 ,架构的重点就是要对复杂问题进行分而治之,同时保证分解后的各个部分还能够高内聚,松耦合,最终又集成为一个完整的整体。分解核心是定义问题,因此架构首先仍然需要理解清楚需求。

集成是配合分解完成的动作 ,最终分解完成的各个组件或子系统,通过合适的接口设计,最终还能够集成为一个完整的整体,分解仅仅是加速开发和降低问题复杂度,如果分解后的内容无法集成在一起,那么分解就没有任何意义。
View All

优秀标准

才能

才能是速度、工作记忆、品味、工具链知识,对计算机工作机制的了解,以及编程能力的综合体。这属于IQ,但这是专门针对工程师的IQ。智商50-80%是遗传的,没法提高,呈正态分布,并且跟科学和工程等领域的成功密切相关。

这对应聘者的选择很重要,因为虽说人是可以改进的,但这种改进只能在其才能范围内,但改进没法超出那个范围。智商145(σ= 3)的人比智商115(σ= 1)的人要好太多。如果你同时看着两个人工作,感觉就仿佛是来自来自不同的星系一样。因此,作为面试官,你的工作是找出应聘者的能力范围。

怎么找呢?提前告诉应聘者准备一台适合自己喜欢的开发环境的笔记本电脑。他们可以用任何操作系统,任何编辑器,任何编程语言——自己觉得怎么合适就用什么。

面试开始时,让他们共享自己的屏幕。你会看着对方敲键盘。然后,给他们一个问题让对方解决。这么多年来我都是让他们编个井字棋的程序,让程序穷尽所有的走法,再打印出有效游戏的数量。当然,你应该自己设计问题,但要争取问题的难度大致就是这样。应聘者的目标是写出程序、编译、运行程序,然后得到正确答案。

记一下时间,让他们自己做。回答他们可能遇到的任何问题。程序输出正确答案的那一刻,再次记录一下时间。评估应聘者的才华的全部工作就是这些。面试技术方面的工作已经结束。(是的,你没有看错!)

以下是接下来会发生的事情。最有才的应聘者会考虑几秒钟,然后用自己最快地速度敲程序(他们会敲得很快)。快到你几乎可以感觉到他们的沮丧,他们跟计算机的接口跟不上他们的思考节奏。敲键盘的速度是他们的瓶颈。敲完程序之后,他们可能会遇到一些编译错误和运行时错误,然后会立马修复。让他们把自己的结果跟Google到的答案进行比较。如果答案不匹配,他们会检查自己的程序,几秒钟之后他们会大叫一声“我知道了!”,然后修复错误,重新运行程序并得到正确的答案。从开始到结束,整个过程大概需要10分钟。

判断力

判断力跟才能之间的关系往往很弱,这可以归结为:修补匠跟工程师之间有差别。这两种人很接近,但是不是一回事。修补匠造的是鲁布·戈德堡(Rube Goldberg,比喻小题大做、简单事情复杂化)机器,那纯粹是为了乐趣。工程师是要发现(往往是不直观的)约束并满足那些约束。修补匠替机器工作。工程师让机器替自己工作。

大多数工程师都不是修补匠,他们做事是为了钱。不要雇这些人,因为他们没有灵魂,围着这帮人转,你会被潜移默化,灵魂会受到毒害。反过来,很多的修补匠都不是工程师。这样的人也不要雇,因为他们会建造出精美而复杂的结构,但那些结构除了自身的存在外没有任何其他用途。你要的人是既非常喜欢建造鲁布·戈德堡机器,又知道如何让机器不要偏离目标的人。

或者我们还可以这么看,人才是综合能力和编程策略的结合。判断属于编程策略。

不是非得团队的每一位工程师都必须是孙子,但是你的确需要他们具有以下两种特质之一。应聘者要么应该具有良好的策略直觉,要么至少必须意识到策略的存在,并且愿意听从具有更好判断力的人的意见。最糟糕的情况是有着可怕的策略直觉但又自我感觉良好的应聘者。这种最终会浪费大家的时间,进行毫无意义的讨论,最后还会因为不满而退出。

如何去测试判断力呢?一种思路是向应聘者提出一系列揭示性问题。这是“你的弱点是什么”这个问题的2.0版。你应该问应聘者类似这样的问题,比方说“你觉得自己有多幸运?” 或者“说说看,你有没有哪一次是出乎意料地采取主动的?”他们的回答可以揭示出藏在内心深处的心理结构的重要信息。

有一个很好的经验法则,如果一个问题HR的实习生也可以提出来的话,那就是一个无特异性的信号问题。好的信号问题是有特异性的。比方说,聪明人发出智慧的信号要愚蠢的容易得多。但是,任何人编造个自己采取主动的例子也同样容易。他们的回答传递出来的唯一一个信息是看对方是否愿意遵守这种面试仪式。这个问题的字面解释是“你会不会成为公司一架很好的无人机?”应聘者的回答可以浓缩成 “是”或者“否”。即便如此,对自己的意图撒谎是很简单的事。需要一份工作的人一直都这么干。

性格

怎么评估呢?最简单方法是从五型人格入手。着有点像MBTI测试(迈尔斯-布里格斯性格分类法MBTI)。你特别关心的三种特质是责任心、亲和性以及神经质。心理学家对这些术语有精确的技术定义,但是用通俗易懂的话来说,你要找出(a)应聘者喜欢偷懒还是努力工作?(b)他们是令人讨厌的人吗?(c)他们会被分析瘫痪和生活的紧急情况所困扰吗?这里说的不仅仅是工作。

好消息是,就面试而言,人格的心理框架很简单。坏消息是,只用在聘用了那个人之后,你才能找到所有这些信息。不过你可以设置一个低通滤波器来捕捉到一些坏苹果,但是在面试的时候几乎每个人都会拿出最佳表现。很少会表现出个人缺陷,除非工作量很长一段时间才会露出马脚。

如果应聘者在面试过程表现得很好斗的话,显然不能雇用他们。如果你找推荐人了解发现这个人几乎没干过什么,或者如果推荐人根本就不认识这个人的话,也不能雇用他们。如果对方的反应很怪异或者多少让人感觉不舒服,请不要雇用他们。但是除此之外,面试过程你能做的事情寥寥。

我面试过好几百人,也招过好几十人。我识别才能和判断力的第六感非常好。但是性格嘛,就只能比随机好一点了。因此,除非你这这方面有魔力,否则请设置一个低通滤波器,然后在应聘者暴露出不好的个性时再炒掉对方。

立刻见效