臧成威的博客

不要让惯性影响你的未来

关于一个小问题引发的感慨

首先先来看这样一个问题,大家在向后翻之前,先思考一下:

现在有一本书,里面纸的颜色不同,现在让你想办法找出,这里面有多少种颜色,每种颜色多少张纸?

这个小问题,我问过很多个人,我发现这个问题程序员回答的结果五花八门。我先来列举一下:

  1. 将书看成数组,放到set里面,就可以知道有多少种颜色了,然后用两个for循环找出每个颜色有多少张
  2. 我没有懂这个问题,你再说明一下?
  3. 我想想啊~恩,要有个数组,来存颜色,不对,应该是个字典,用颜色做key,个数做value,然后……………………
  4. ………………不知道
  5. 额,好像我没有见过这样的例子啊。
  6. 这是数据结构的问题么?是问最优解么?我来想一想…………额……
  7. 首先写一个程序………………,然后……

上面的回答都不大令人满意,下面的回答有趣很多:

  1. 把书一页页扯下来,然后一样颜色的堆一起,最后查一查数
  2. 测一页纸的厚度,然后从书的侧面来测各个颜色的厚度
  3. 用个小本子记下出现的颜色,一页页翻过去,然后在颜色上画正字

最后的答案应该说相当准确和简单了,它很好的解答了这个问题。可实施性很高,而复杂度很低。

大家有没有想过,为什么我们程序员在思考这个问题的时候,会这么复杂?那么我就来一一分析一下:

首先是回答不知道,或者半天没有憋出来的人,这种人不在少数。这类人的问题就是,老是把问题想的很复杂,面对这样的一个问题,老是觉得不够明确,没有开发环境,没有工具,没有API,还可以没有好多。所以无从下手,似乎解决问题就一定要有趁手API,有设备,有算法,有开发环境。当这些没有的时候,很多的程序员就解决不了问题。

然后再来说一说那些专门寻求最优解的人,这些人往往最后没有回答了问题,只是陷在求解的这样一个过程中。他们想建立更好的模型,具有更好的扩展性,却很少注意到问题的本质和场景。你可以做一个拾取颜色的机器人,然后计数,但是真的有必要么?很多时候,我们直观的解决问题就好了。等待问题扩大,再来想复用和扩展,不是更好么?

最后是这些,用set,字典给出答案的人,首先不能说他们是错的。但是,面对这样一个简单的问题,你真的有必要建立一个工程,写上几行代码来搞?而且,这要怎么实施呢?你的程序怎么把书当输入弄进去?程序员首先要学会思考,然后再编程,如果这样的问题,因为是我问的,就去找数据结构,找算法。并没有把解决问题放在首要,而是拘泥于已学的知识。

至于那些没有找到类似的例子,回去google和百度也没找到答案的同学,已经算是重度病症了。似乎开发的久了,很多程序员已经不会了独立思考,对他们来说,解决问题不过是google和百度,不过是找以前的例子。这到底是人类的进步,还是一种退化了呢?

那个测量厚度的回答,很有意思。这个答案完全没有提及程序,的确是分析之后的结果。但是有几点小问题,第一个问题就是,这个回答是不可实施的,因为没有办法很精确的测量纸的厚度,另外,纸的厚度也不尽相同。第二,这书如果是新的还好,中间空隙少,要是旧的呢,那不是测量出来的比实际多好多页么?第三,一切的假设都在同一颜色的页连在一起上,实际上题目中并没有说是连在一起啊,或者说,这个答案,解决不了随机颜色的问题。

这也侧面反映了我们程序员有时分析问题,不够全面,对可能的输入情况判断不全的缺点毛病。

那个把书撕下来是我问完这个问题,最先想到的答案,直观,简单。是因为我故意没有说这个书让不让破坏。可以在现有的条件下,用撕开书页来解决问题的,应该算另辟蹊径了。这不是一个标准答案,不过我还是觉得这样回答很有趣。

程序员是一群使用计算机来解决问题的人,大致可以分两种,一种是以知识来解决问题的,一种是以思维来解决问题的。而前者占大多数,这也让这个浮躁的IT圈蒙上了一层灰暗,这也是为什么公司甄选人才的时候,更看重经验、学历、背景公司的主要原因。因为大多数的人,是靠着做过,了解过很多的知识来解决问题的。知识的多寡正好体现了一个人的价值。然后,真正改变程序界的,是后一小撮人,他们用思维来解决问题,旁征博引,创新,并且根据问题来分析解决方案,找到很多简单且有效的方法。

我相信,很多的程序员一开始都是很聪明的,但是这个浮躁的圈子,这些复杂的概念,让我们渐渐忘却了思考,忘却了自己的能力,分析问题,解决问题,动手的能力。当我们遇到了问题,只要抛开我们固有的知识,抛开google百度,抛开API,抛开数据结构,就用心去思考,一定可以得到更好的答案的。

那么把这个问题延伸开来,你会发现很多相似的问题:

  1. 班上要选举班长,每个人写了一个名字,最后要统计谁最高和大家的票数
  2. 你有一个字符串,试着统计里面每个字符出现的次数
  3. 你有一个关于老师数据库,里面存着老师户籍的数据,试着分析老师的来源地区的分布

其实我们还可以举很多例子,能把复杂的问题,想象得简单,这本身就是大家有的一种能力。只是因为我们的知识在增长,工具在进化,而我们变得懒惰了。很多时候,我们都沦为了罗列API的产业工人。大家不觉得悲哀么?

编程思想来源于思想,希望大家不要忘了本质,我们真的可以更多的发挥自己的潜质!

Comments