所謂的編程,找到真正的問題為什么那么難


自以為的理解

當拿到一個需求時,總是自以為是的理解了這個需求以及要解決的問題,再不經過思考就盲然的開始了這個項目,然而往往會遇到巨多的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時的茫然,再到后來前端與后端的混亂,對於大部分人來說,遇到困難,都想逃避,這很正常,但如果想解決這個問題,我們只能硬着頭皮往前走,是的,它之前是我的一道坎,不知困了我多少個日夜,但一切都過來了,而這思考又將會是我的一道坎,但那又怎么樣呢,因為有明天,解決只是時間。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM