软件开发人员应有的思维方式

在我很小的时候,曾梦想着哪一天能成为世界知名人士,能够为这个社会贡献自己的力量。曾看到黑白电视机上有关对计算机的强大功能的介绍,那时的我心中已点燃了致力于计算机应用事业的火花,虽然计算机在当时中国的农村还只是一个传说。高中毕业,我义无反顾地报考了计算机相关的专业。在那时间极其宽松的大学时代,总是让一些学生迷失了自我。想来我也是一个普通人啊,起初因为身体上的原因,我渐渐地落下来了,人也变得焦躁起来,想奋起直追,然而却又陷入了无奈,──要补的东西太多了,不知如何是好了!渐渐地开始沉沦了,维系着考试不挂课的状态,直到毕业。在那段时间,我依旧保持着对计算机的热爱。在刚入大学不久后,就已经能非常熟练地操作所有Microsoft产品了,我可以凭着自己的判断解决许多的计算机问题,成了班级名副其实的“计算机医生”,同学给了我一个代号“网管”。那时候的学生大概都只有一个认识,那就是在网吧处理那些上网相关的人应该有相当的水平,依次类推,我也就有了这个“美誉”了。同时,我还在其他学院“挂职”了:)。然而,在计算机专业课的学习中,我依旧没能有很大的突破。现在想起来,也就是陷入了与大部分同学有着同样的困惑中,──不知道该怎样去学习这样一门与其他学科有着很大差异的学科。

 

自大学毕业已有3年有余了,一路走来,有着种种艰辛,也伴着许多的喜悦。刚找工作的那阵子,也许是我人生中极其痛苦的一段时光。简历发出去不知道多少份,然而多半是泥牛入海,杳无音信。事实上,我自认为自己还是一个相当有能力的人。我是一个极其感恩的人,我一直想着,如果哪家公司聘用了我,我一定用优异的业绩去报答。然而,事与愿违,我在这所繁华的都市飘荡了一个多月。直到有一次,我走到foxconn的招聘隔间前,畏畏缩缩地递上了自己的简历,一位女士拿了简历粗略地看了一下,并马上填写好了复试的邀请函。我知道,如果换成了其他的专业人士,我可能又得有一番折腾了。后来当我们在同一个部门工作后,我知道了她不懂开发,只是临时替我的主管去招聘员工,看到简历上的说明与要求一致,也就给了我机会。从这之后,我一有空就努力巩固知识。

 

工作这么久,渐渐也悟出了一些道理,写程序如同做事,这里有着高度的一致性。在开始写代码之前,请先忘记自己是在coding,更应该当作是在完成与日常事情无任何差异的任务。在这里,我姑且提出以下三个程序员应该具备的思维能力:

 

一、抽象思维

这种思维能力在日常处理问题中经常用到。现在我拿汉诺塔的代码做演示,有3个位置A,B,C。很多人在学校学习这个算法的时候觉得异常不可思议,于是乎去网上Baidu或Google一下,很容易找到如下的代码:

 

Move这个函数似乎没有什么任何特别的。OK,来看递归函数,懵了!怎么一会儿n,一会儿n-1,后面还有一个n-1,这是怎么递归的呢???看不懂了。

 

那么我这里给出我的代码,

看看了,这时候可能有人就稍稍有点明白了,或许有些人也还是不清楚为什么这样去写。还是我那句话,忘记自己是在写代码,自己是在完成一件事情!现在我领着您来分析一下这个流程。我们姑且这样来看,我们要把A上的盘子移动到C上去,因为要移走底部的盘子的话,只有把上面的盘子移开,那么,我们就把B拿来借用一下,临时存放上面的这些盘子。也即这n个盘子分成了上半部分的(n-1)个盘子和第n号盘子(从1开始编号)。把n个盘子或n-1个盘子移到B上,没有本质区别,依旧是一个汉诺塔问题,只不过,这时候我们的目的发生变化了,我们没有直奔主题,我们要把n-1个盘子从A移动到B上去,那么C就可以用作辅助的了。好的,那这一步,把n-1个盘子移动到B上就独立出来了,也是一个汉诺塔问题了。下一步,移动第n号盘子到C上去。这些是完成了,可好像没完吧!B上还有n-1个盘子呢,怎么办?那么下一步就是把B上的盘子移动到C上去,依旧是一个汉诺塔问题,只不过这个时候的A改变了角色,成了辅助的了。现在说了这么多了,您在看看我给出的代码呢?是不是要清楚多了呢?如果依旧不清楚,可以给我留言,我们私下交流。

 

二、困难问题能有“置之死地而后生”的本事去创造条件,思维应足够发散

曾记得在网上看到这样的一个智力题:有一间黑屋子,里面有3盏灯,但是它们的控制开关在门外。现要求只进去屋子一次,就把这些开关和灯的对应关系找准确。有很多人左思右想的,难!你看,一个开关,开一下对应的灯也跟着亮了。如果是2盏灯,我可以只开一盏,进去后,我就可以很快找到对应关系啊!可是偏偏多了一盏。有很多人把能解答出来这道题的人归结于聪明的一类,或者说是智商高的一类。但我不这么认为,因为这道题完全可以依照常规思维解答出来。试想,开和关两种状态固然只可以判断两组对象的对应关系,我姑且把它们两种状态都视为一种独立的状态,那么这里有了二维的变量。我现在已经被逼到了死胡同里去了,除了这二位变量,没有更为清晰的因素了。真的这样么?开关?没有更多关联的东西了,只有开和关与它串联的灯了,这不转回去了么?灯?灯!兴奋ing!灯不仅可以亮和熄灭,它还有热量。对呀!这个第三维的因素出来了。山重水复疑无路,柳暗花明又一村。问题迎刃而解了。相信各位已经有了正确的答案了,我就不赘述了。

类似的还有一个问题:要求不引入第三个变量的情况下将a、b的值交换。相信您可以依照上面的同样的手法,给出您的答案吧。

三、迁移能力

最后一个,就是一种迁移能力。需要平时的一些积累,不放过一些很细小的东西。比如,现要求您用一个一个表达式去完成一个数组的往后遍历操作,要求到尾部后跳转到头部。如果你有心记起模运算的特征的话。你可以很容找到这样的一个答案: nNextIndex = (nCurrentIndex+1)%length。

 

希望我的这3点能对那些正处迷茫的人有所帮助。谢谢!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值