zoukankan      html  css  js  c++  java
  • 所谓的编程,找到真正的问题为什么那么难

    自以为的理解

    当拿到一个需求时,总是自以为是的理解了这个需求以及要解决的问题,再不经过思考就盲然的开始了这个项目,然而往往会遇到巨多的bug,让你头疼。

    真正的问题

    是的,真正的问题是什么?这一直是我的一道坎,不幸的是今天又遇到了,幸运的是我开始懂得重视这个问题,如下这个需求:

    是一个进度条,就是当前音乐播放的时间比,一开始的想法是这样的:

    (滑动块的长度 / 音乐总长度) * 进度条的宽

    但这是有很大的问题的,根本行不通,实际上应该是这样:

    (总路程 - 滑块长度)/ 总时间 * 当前播放的长度

    总路程 / 总时间 算出每一秒的路程 然后乘以当前播放的时间,这样就完成了。

    找到问题为什么这么难

    当你真正找到要解决的问题时,所有的问题就会变得简单许多,比如上面我所需要解决的问题是,获取每一秒走了的长度,再乘上当前走了的时间。但往往我们看不到真相,而这其中有很多原因,常见的有下面几种:

    1、没经过思考
    2、想复杂了
    3、理解能力有限
    4、个人技术所限

    这是大部分程序员所会触犯的错误,第一种,比较难发现但一直就在身边,比如说你学一个东西,你有问过自己为什么要学它吗?大部分人没有想过的,工作需要吧?那么问题就来了,你为什么学习前端,不学后端,又如你为什么学后端不学前端,可能觉得前端入门简单,以及等等原因,但如果你当初真的是这么想的,那么就错了,前端可不简单,有时可能比后端还复杂。导致这个情况的出现是什么?当初就没有认真的想过,如果你是想找一门比较简单的语言,那你应该去想哪些语言比较简单啊,而不是直奔前端。又如你学习新技术,往往又出现了这种情况,api,api,看文档,看视频。但真的这是正确的学习方式吗?不一定,为什么你永远不质疑一个问题?以前写的好好的,老来新的api做什么?之所以某个语言不断的更新,很大情况下,都是因为之前版本有bug,或者有些不足,如果你是做前端的,你会发现各种技术再不断的更新,它不断的更新还不是因为之前的不足,比如javascript中的forEach。forEach是es5新增的,确实好用,但es6又新增了一个for of迭代器,假如你没有经过思考,感觉这是理所当然的事,那就大错特错了,forEach虽然好用但它也不是无所不能的,缺陷也很多,比如break;continue;在forEach中这些就不能用,那你可能会想可以使用for in啊,但for in也是有问题的,自己搜索去吧,在这一切的技术中,思考往往比任何都重要,一个语言的设计者,如果思考不当,造成的结果是无数的程序员得背负同样的后果,而我们不思考,那就是只好在原地了,来一个学一个,别人说什么好,什么就是好。

    想复杂了

    这是前几天在网上找的一道题

    其中一个朋友写的代码

    function indexOf(arr, item) {
     for(var i in arr){
        if(arr[i]==item){
            
            return i;
        }else if (i==arr.length-1){
            return -1;
            
        }
        
     }
    }
    

    实际上它的代码可以写成这样

    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方法,而不是原生方法,这里也说明,理解也是一种硬伤,往往产品经理等,他们觉得你应该可以理解,但往往背道而驰。

    个人技术所限

    有位朋友写了如下代码:

    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时的茫然,再到后来前端与后端的混乱,对于大部分人来说,遇到困难,都想逃避,这很正常,但如果想解决这个问题,我们只能硬着头皮往前走,是的,它之前是我的一道坎,不知困了我多少个日夜,但一切都过来了,而这思考又将会是我的一道坎,但那又怎么样呢,因为有明天,解决只是时间。

  • 相关阅读:
    angular----关于注入HTML
    js ---- 时间格式
    JQuery的父、子、兄弟节点查找方法
    js中的时间与毫秒数互相转换
    $.each ---- 跳出当前的循环
    关于ng-model取不到值的问题
    IOS 物理引擎
    斯坦福 IOS讲义 课件总结 三
    斯坦福 IOS讲义 课件总结 二
    斯坦福 IOS讲义 课件总结 一
  • 原文地址:https://www.cnblogs.com/pssp/p/6133612.html
Copyright © 2011-2022 走看看