所谓的编程,找到真正的问题为什么那么难
本文作者: 东方联盟 - 追梦子 。未经作者许可,禁止转载!
欢迎加入东方联盟 专栏作者。
自以为的理解
当拿到一个需求时,总是自以为是的理解了这个需求以及要解决的问题,再不经过思考就盲然的开始了这个项目,然而往往会遇到巨多的bug,让你头疼。
真正的问题
是的,真正的问题是什么?这一直是我的一道坎,不幸的是今天又遇到了,幸运的是我开始懂得重视这个问题,如下这个需求:
是一个进度条,就是当前音乐播放的时间比,一开始的想法是这样的:
(当前播放的长度 / 音乐总长度) * 进度条的宽
但这是有很大的问题的,根本行不通,实际上应该是这样:
(总路程 / 总时间) * 当前播放的长度
总路程 / 总时间 算出每一秒的路程 然后乘以当前播放的时间,这样就完成了。
找到问题为什么这么难
当你真正找到要解决的问题时,所有的问题就会变得简单许多,比如上面我所需要解决的问题是,获取每一秒走了的长度,再乘上当前走了的时间。但往往我们看不到真相,而这其中有很多原因,常见的有下面几种:
1、没经过思考
2、想复杂了
3、理解能力有限
4、个人技术所限
这是大部分程序员所会触犯的错误,第一种,比较难发现但一直就在身边,比如说你学一个东西,你有问过自己为什么要学它吗?大部分人没有想过的,工作需要吧?那么问题就来了,你为什么学习前端,不学后端,又如你为什么学后端不学前端,可能觉得前端入门简单,以及等等原因,但如果你当初真的是这么想的,那么就错了,前端可不简单,有时可能比后端还复杂。导致这个情况的出现是什么?当初就没有认真的想过,如果你是想找一门比较简单的语言,那你应该去想哪些语言比较简单啊,而不是直奔前端。
又如你学习新技术,往往又出现了这种情况,api,api,看文档,看视频。但真的这是正确的学习方式吗?不一定,为什么你永远不质疑一个问题?以前写的好好的,老来新的api做什么?之所以某个语言不断的更新,很大情况下,都是因为之前版本有bug,或者有些不足,如果你是做前端的,你会发现各种技术再不断的更新,它不断的更新还不是因为之前的不足,比如javascript中的forEach。forEach是es5新增的,确实好用,但es6又新增了一个for of迭代器,假如你没有经过思考,感觉这是理所当然的事,那就大错特错了,forEach虽然好用但它也不是无所不能的,缺陷也很多,比如break;continue;在forEach中这些就不能用,那你可能会想可以使用for in啊,但for in也是有问题的,自己搜索去吧,在这一切的技术中,思考往往比任何都重要,一个语言的设计者,如果思考不当,造成的结果是无数的程序员得背负同样的后果,而我们不思考,那就是只好在原地了,来一个学一个,别人说什么好,什么就是好。
想复杂了
这是前几天在网上找的一道题
其中一个朋友写的代码
123456789101112 | function indexOf(arr, item) { for(var i in arr){ if(arr[i]==item){ return i; }else if (i==arr.length-1){ return -1; } }} |
实际上它的代码可以写成这样
12345678 | function indexOf(arr, item) { for(var i in arr){ if(arr[i]==item){ return i; } } return -1;} |
为什么他会那样去写,首先他写了一个for in,再想他为什么使用循环对象的方式来写,而不直接用for来写,我猜测是因为,他觉得直接写for循环,看起来代码多了一些,还需要加啊,减啊之类的。另外一方面,对for in理解的比较浅。这还不足以引起我的好奇,而是下面那一段它用了else if,顺着他的想法就是,如果当前项等于传进来的值,那么就返回,否则接着判断它是不是最后一位(因为如果它走到了最后一位,说明前面都没有成立的),如果是,那么就说明这个数组中没有我要找的东西,可以返回-1。
这种思维方式,看似很清晰,但如果细想就很容易发现问题,他这里每次都去判断是不是最后一项,但这完全没有必要,因为如果说它整个循环完了都没有返回出去,那么就说明这个数组中没有匹配的项,我们在循环外部直接返回就可以了。看似一个很小的问题,但在其他方面,我们同样也会犯很多这样的错,我并不觉得写这个代码的人很笨,如果说他笨,我觉得自己笨的要死了。正如写这篇文章,是我犯了无数的错误之后才开始重视起来的,可想而知,我想那位朋友一定忘了思考吧。在编程的生涯中,想复杂的事情远远不止这一个,有些严重些,也有些微不足道,但我想只有真正的开始学会思考以后,我们才能在这场战争中,看的清,看的明。
理解能力有限
评论:
这个题虽然没有说出是用原生的方法还是自己模拟一个,但如果我是一个面试官,大部分情况是想让你模拟一个数组的indexOf方法,而不是原生方法,这里也说明,理解也是一种硬伤,往往产品经理等,他们觉得你应该可以理解,但往往背道而驰。
个人技术所限
有位朋友写了如下代码:
12345678910111213 | var ary = [ 1, 2, 3, 4 ];function indexOf(arr, item) { for(var i=0;i<arr.length;i++){ if(arr[i]==item) { return i; break; } } return -1;} indexOf(ary, 3) |
但有点javascript经验的,肯定能看到这里面有个多此一举的代码块,break;是不需要的,因为函数一旦返回,后面的代码不会被执行,这或许是因为对技术了解的比较少吧。
沉静
在实际工作中,找到问题所在确实不易,但也唯有解决这个问题,我们才能前进,反之,永远也在原地,难道不是吗,所谓的编程不过是突破那重重的阻碍,一开始我们以为学习语法是一切,但后来,发现那只是很小的一部分,我们需要有很多突破,比如刚接触AJAX时的茫然,再到后来前端与后端的混乱,对于大部分人来说,遇到困难,都想逃避,这很正常,但如果想解决这个问题,我们只能硬着头皮往前走,是的,它之前是我的一道坎,不知困了我多少个日夜,但一切都过来了,而这思考又将会是我的一道坎,但那又怎么样呢,因为有明天,解决只是时间。
- 09-29工作3年和工作7年的程序员到底差在哪里?
- 09-29身为网络工程师,你能说清楚网络的概念吗?
- 09-29IT运维没做好这一点,恭喜你,这个锅你背定了
- 08-01浅谈Web经典三层架构和MVC框架模式
- 08-01作为首席架构师,我是如何选择并落地架构方案的?
- 08-01互联网架构的演变,看了好多这个讲的确实清楚!
- 08-01架构师教你如何设计一个高并发系统?
- 08-01分布式系统中Session共享的五种方法
- 01-11全球最受赞誉公司揭晓:苹果连续九年第一
- 12-09罗伯特·莫里斯:让黑客真正变黑
- 12-09谁闯入了中国网络?揭秘美国绝密黑客小组TA
- 12-09警示:iOS6 惊现“闪退”BUG
- 12-05亚马逊推出新一代基础模型 任意模态生成大模
- 12-05OpenAI拓展欧洲业务 将在苏黎世设立办公室
- 12-05微软质疑美国联邦贸易委员会泄露信息 督促其
- 12-05联交所取消宝宝树上市地位 宝宝树:不会对公
- 12-04企业微信致歉:文档打开异常已完成修复