算法死活記不住?大神告訴你秘訣:內(nèi)化它的邏輯
?有網(wǎng)友訴說了自己的苦惱——
我曾經(jīng)非常擅長(zhǎng)用不同的語言寫代碼,可是在一年后,我就完全忘記了如何用這些語言寫代碼。
現(xiàn)在我正在嘗試學(xué)習(xí) Lua,我能看懂每一行的意思,但是到了要寫出來的時(shí)候就不知道該怎么做了。
針對(duì)ta的苦惱,網(wǎng)友大神們紛紛給出建議。
你是說循環(huán)、變量之類的語法嗎?
還是說排序、搜索、遞歸?這兩種情況,我只有一些基本的想法,剩下的由google完成。我不記得代碼,只記得我需要什么。
?
沒錯(cuò),就是這個(gè)方法。
知道你需要在這里使用循環(huán)比記住循環(huán)語法更重要。
一旦你知道你需要使用什么,你就可以根據(jù)需要把語法google出來。
顯然有些東西你應(yīng)該記住語法,比如如何創(chuàng)建一個(gè)函數(shù),如何創(chuàng)建不同類型的變量,如何將輸出放到屏幕上......
不過隨著它變得越來越復(fù)雜,只要理解這個(gè)概念,再google出來就行了。
你是指如何記住怎么寫編程語言的,比如Lua、Python 或 C++ 之類的嗎?
通常,就是通過寫代碼來記住,一段時(shí)間不寫,就會(huì)忘了,然后你就需要重新去學(xué)習(xí)它們。
我做的網(wǎng)頁(yè)設(shè)計(jì)/編程越多,我就越喜歡用「直線」方法。
只需選擇你需要學(xué)習(xí)的下一個(gè)東西,并在你們之間畫出最直、最快的線,然后去學(xué)習(xí)這個(gè)東西。弄清楚這一點(diǎn),然后繼續(xù)下一步。你需要學(xué)習(xí)的只是能讓你完成任務(wù)的極少數(shù)特定的東西。你不需要成為一個(gè)完美的全棧開發(fā)人員,事實(shí)上,你可以將整個(gè)過程分解為大概10到20個(gè)核心步驟,假設(shè)它不是非常復(fù)雜的話。
我確實(shí)會(huì)閱讀和研究了除此之外的編程語言,因?yàn)樗鼈兇_實(shí)有助于在你的工具包中添加更多東西,并且用不同的方法來填充你的記憶,但是當(dāng)涉及到實(shí)際的執(zhí)行, 直線方法可能會(huì)讓你快1000倍。
在條件允許的情況下,就要做減法。如果一個(gè)平臺(tái)/后端主機(jī)很復(fù)雜,你需要5個(gè)小時(shí)才能弄清楚如何做最簡(jiǎn)單的事情,而這本應(yīng)該用幾分鐘就完成,那就退后一步,看看你是否可以以某種方式簡(jiǎn)化它。
你是否需要學(xué)習(xí)3種不同的編程語言并觀看4小時(shí)的視頻才能完成實(shí)際上非常簡(jiǎn)單的任務(wù)?或者你能不能找到一些簡(jiǎn)單的服務(wù)器來存儲(chǔ)你的簡(jiǎn)易數(shù)據(jù)庫(kù)——它的使用和集成如此簡(jiǎn)單,以至于白癡都能很快找到它?我們并不會(huì)因?yàn)閺腁點(diǎn)到B點(diǎn)采取最耗時(shí)、最復(fù)雜的路線而贏得額外積分。?
我靠的是練習(xí)、谷歌和同事:)
我記住得很少,只記得幫助我找到答案的那一點(diǎn)面包屑。如果有好辦法,請(qǐng)指點(diǎn)我一下。
我在面試時(shí)最喜歡聽到的答案是——
「值得記住的東西都加了書簽,其他的東西我現(xiàn)在很容易找到;我不需要所有的答案,但我很擅長(zhǎng)找到它們。」
我在很多算法網(wǎng)站上的排名都很高。在我看來,從記憶的角度理解算法是行不通的。你需要內(nèi)化它的邏輯。想想其他你知道該怎么做的事,你可能可以寫下它的每一步,但你做的時(shí)候不會(huì)特意去想。比如做黃油吐司。想象一下,你有一個(gè)按鈕式烤面包機(jī)。你得先烤面包,然后再涂黃油。順序不只是你記住的東西,它是有意義的。如果你先涂上黃油,它就會(huì)滴入烤面包機(jī)底部的加熱元件中。烤吐司就是一種算法。是的,你記得這些步驟,但是每個(gè)步驟和這項(xiàng)步驟的順序背后都是有原因的。將此應(yīng)用于您的數(shù)據(jù)結(jié)構(gòu)和算法。學(xué)習(xí)簡(jiǎn)單算法背后的原理,以構(gòu)建理解面試問題所需的基礎(chǔ)知識(shí)。閃存卡式的記憶術(shù)將花費(fèi)你大量的時(shí)間,而且?guī)缀鯖]有任何回報(bào)。
我知道算法,因?yàn)樗鼈兪墙鉀Q問題的廣泛技術(shù)。
每當(dāng)我搞不清特定語言的確切語法時(shí),我都會(huì)google,然后閱讀文檔。
Linters 和編譯器錯(cuò)誤消息通常也很有幫助。?
在過去的十年里,我已經(jīng)建立了一個(gè)我稱之為「?jìng)€(gè)人備忘單」的筆記合集,其中包括我需要反復(fù)查找的所有內(nèi)容。
開始,我用它查找rsync命令、Postgres轉(zhuǎn)儲(chǔ)/導(dǎo)入命令、nginx配置等,但現(xiàn)在我只有去查那種一兩年才用到一次的晦澀內(nèi)容時(shí)才會(huì)用到它。
我想說,我現(xiàn)在已經(jīng)記住了這些東西的一半了。但是當(dāng)我學(xué)習(xí)一種新的語言或概念時(shí),擁有備忘單是關(guān)鍵的一步。重新找到你記憶中的SO帖子或博客文章的過程實(shí)在是太太太麻煩了。
如果你是指代碼的語法,那么沒有必要記住它。上網(wǎng)查一下就行了,很容易。
如果你指的是實(shí)際的算法(一段代碼是一個(gè)算法的實(shí)現(xiàn)),那就不要把注意力集中在「記住它」上,要試著去分析和理解它,就像它是某種神秘的公式一樣。
我說的「理解」,不是指 「能夠說出每一行的作用」,而是「能夠說出它為什么是這樣,以及它的原理是什么」。
一旦你了解了它是如何運(yùn)轉(zhuǎn)的,你甚至不必記住如何去做——因?yàn)槟銓碛兄噩F(xiàn)它所需的所有推理能力。
如果你在維護(hù)別人的代碼時(shí),可能會(huì)發(fā)現(xiàn)有些代碼非常晦澀,并且涉及很多間接調(diào)用和/或副作用。在這種情況下,只需問問自己該代碼的輸入和輸出是什么。只有在你需要重構(gòu)一個(gè)東西時(shí),才需要更深入的研究。
老實(shí)說,我記得以前項(xiàng)目的一些部分,但我并沒有太費(fèi)力,相反,我更關(guān)心算法的高級(jí)輪廓,比如合并排序:將一個(gè)數(shù)組拆分為2個(gè)數(shù)組,然后將這些數(shù)組拆分為另外2個(gè)數(shù)組,直到數(shù)組大小降至1,然后按順序合并數(shù)組。
或者快速排序:選擇一個(gè)樞軸,遍歷數(shù)組交換值,如果它們位于樞軸的錯(cuò)誤一側(cè),則大于或小于樞軸,然后對(duì)樞軸的每一側(cè)重復(fù)執(zhí)行此操作,直到每個(gè)值都是樞軸。
我記得算法的主要部分,如果我在理解上遇到問題,我會(huì)將它們放入偽代碼并根據(jù)需要修復(fù)我對(duì)算法的理解。?