編程是靠記憶嗎?
語言表達能力笨一些,希望大家將就看一下。如果你是第一次接觸某些功能的代碼,比如說上傳。需要用到fileItem對象,可是因為你是第一次接觸,你可能不了解。如果這時候你去搜索答案,發現了別人寫好的代碼,然後你發現上傳的代碼幾乎是固定好的,需要調用工廠解析吧啦吧啦,這些功能都已經由別人寫好的對象方法實現了,你只要用就好了,那你以後要實現這個功能的話,不是只要記住當時用過哪些對象哪些方法,使用它們的順序,這些不都是靠記憶的東西嗎?或者也可以說你只要記用過的對象然後查文檔,可是這樣都用不到什麼邏輯之類的知識啊,怎麼去吸收和融會貫通呢?
其實是這樣的:
- 經驗不足的時候,你並不知道哪些庫和調用可以直接用,會自己去試著去實現,這是不經意重新發明輪子的過程,是有好處的
- 最後你發現,啊,原來這個東西別人已經封裝好了,於是你直接拿來用了,這個封裝的名字你留下了映像,以後有幾次也就直接拿來用了
- 很多時候你只需要對某幾個包的名字有大概映像,要用的時候Google一下,然後讀一下文檔,就能很快拿起來實現個東西
- 很多時候,對一個局部功能,能用一個包解決問題,是很好的,你不會因此失去機會,因為一個項目是由很多很多個局部構成的,而且大部分局部往往是很難有現成的包解決的,因為每一種業務邏輯很可能都是特殊的,所以根本沒有一般的方法,你的邏輯能力,是在這些時候得到鍛煉的
- 但是,有一天需求突然要求說要改個什麼東西,而你發現用熟悉了的包並不提供這個功能,於是你要麼找到一個替代的包,要麼自己挖下去,把熟悉的包這個黑盒子打開來,自己做一個fork,把需要的功能實現了,你可以決定是否PR給包的原作者
- 實際上那樣一來,你已經不知不覺在參與開源軟體的開發了,你在做patch的時候,不僅理解了原軟體的代碼結構,而且在此基礎上對它進行了自定義,這就是吸收和融會貫通啊
編程不需要死記硬背,需要的是理解背後的機制。
永遠將這個問題高懸於腦:「它是如何工作的?」,慢慢的你就會養成求知慾,只要理解了背後的機制,你說的那個上傳功能用什麼編程語言寫都一樣。一個項目的層次結構,要是分的細點可以是這樣的,或者說隨意分吧
從小到大是這樣的:關鍵字--變數-代碼行-代碼塊-函數-類-包-層-模塊-編程模型-開發架構那麼網路上能夠搜索到代碼呢,就搜索頁面返回結果比例來說,大部分是函數,少量類,以及極少量更高層次的內容。
而這些非常常見的,能夠經常搜索到的內容。只是對某個技術點如何使用,或者如何操作的代碼。在一個完成的項目中,或者公司內部的一些代碼庫中往往都已經包含進去了。 甚至都不需要記憶,直接使用就OK了。
所以從這個層面來說,編程不是靠記憶的!但是應用框架代碼,或者按某種代碼模型編寫,線程,非同步,消息,事件,委託,你沒點邏輯能力,能用的好?這個就不是邏輯了?就醬!不是。編程更像是搭積木,不過根據你的條件約束和抽象層次和性質,這個積木多少是你自己創造的,多少是別人創造的,這個比例會不同。通常如果如果別人創造的比較多的話,那就是靠記憶了。
當然了最基礎的數據結構演算法範式之類的,是需要理解和一定的記憶的,但通常使用的時候不會原封不動,而是因地制宜。
難道不是靠複製?
(⊙▽⊙)我連方法名都記不住…
不是還在編程…不過,是靠記憶……記得不是方法名,對象名…記得是原理和流程當然不是。能用txt寫程序的不一定是好的程序員,還是看你最終能做出什麼樣的東西,其他的都只是手段。對各種技術能快速上手,融會貫通、提高效率才是重點,再加上對需求和設計有較強的理解能力。花時間精力去記每個實現細節,甚至API里的類名是小學生做法,有些用得多了自然就記住了的確能減少開發時間,但每個人精力腦容量都是有限的,應該用在關鍵地方。對技術的東西要記的是主要思路,有些東西看到有個印象就行,以後要用到的時候能馬上想起到哪裡去查閱。
「使用他們的順序」當然不是死記的,記住這一個下次稍微一變就不知道了,原理了解清楚了,自然知道為什麼要這麼用,可以舉一反三。網路上現成的開源的東西是很多,但是很多也是有bug的,如果只會用不知道原理,稍微出個問題就不知道怎麼解決。當然這個經驗也很重要,初學的時候依葫蘆畫瓢比較多,知其然不知其所以然,遇到的問題解決的問題多了,自然也就能明白一些原理。看和什麼比,本科的時候我經常objc,python, PHP, shell, js, R 各種語言換著寫,一直用一種語言還好,一旦中間換了種語言或者庫,再換回來就要重新查各種API和語法。自己的記憶里真是跟不上。
後來去搞計算機理論,然後就感覺記憶力夠用了。任何跟你說靠理解的,我都認為是扯蛋。
你必須靠記,然後還得靠理解!
記什麼?基本語法、語法糖、一定量的API
理解什麼?理解你背下來的東西怎麼用!
編程本質上跟學外語一樣,沒單詞量你理解個什麼。
當是新手的時候就是靠記憶,你記的越多,你知道的就越多,就能走在別人前面,所以寫程序的人要不斷學習。不斷學習除了有記憶的意思之外,還有就是要應用。說到底,計算機是應用學科,最終還是要應用,有了知識的基礎才能談應用。
哪天coding這件事情能夠讓你忘記時間,你就不會有這些疑問和煩惱了。
我一直覺得編程就是匹配腦子裡的固有模式,而這些模式是從各種學習當中或顯式或隱式的記下來的。
沒有記憶肯定是不行的,就像參加了培訓班的那種人,缺少思維習慣和思維模式,與那些本科就學了這些內容的人相比,肯定是會有很大差距的,任何學科都是一樣的,沒有記憶,肯定是不行的,但是如果只靠記憶,也肯定是不行的,最多做一個低端的碼農,邏輯和架構,理解力和組織力,包括抽象學習能力,對於一個學習編程的人都還算重要,也都是可以通過學習獲得的,並非天生!
編程不依賴於記憶,但優秀的記憶力是成為優秀程序員的必備條件,因為只有擁有優秀的記憶力,才能熟知項目整體與各個部分的細節並形成系統的認知,面對功能需求的時候才能做出合理和正確的設計與實現。如果沒有這種優秀的記憶力,做到後面忘了前面,做到這個部分忘了那個部分,越到後期越會bug遍地,並且每次調試到某個模塊,都需要對該模塊進行或多或少的重新學習,效率低成本高,這樣的程序員在技術上的發展前途肯定是受限的。
不是必須,但記憶好明顯能提高些效率。
代碼量上去了,靠的是感覺,愛一個人久了,感覺就不可複製
當然需要記憶,你可以通過不斷地練習來獲得。死記硬背是記不住的。
這是個演算法題,如何高效查找. 當然是建立索引和字典了. 用 evernote 吧. 一個模塊一個文件夾,需要的時候去裡面查. 有助於建立良好的知識體系而不是變成一個儲藏罐.
理解的基礎上記憶,對於演算法的學習我是這樣的。
我認為這叫經驗...
推薦閱讀:
※0基礎學編程應該學哪種語言更迅速,看哪些書?
※C語言會被解釋成彙編語言,為什麼C會比彙編慢呢?
※如何學習開源代碼?有什麼好的書籍可以引導初學者學習?
※用 C++ 實現大整數的加減,思路是什麼?
※為什麼計算機語言中的變數名都不能以數字開頭呢?