【左神是我學習算法的引路人,我很喜歡他講的課程和風格丢胚,目前正在刷書与纽,希望自己在software工程師的道路上走的越來越踏實吧? ? ?----Maugham】
以下為采訪正文
CSDN:請簡單介紹下您和目前所從事的工作余舶。
左程云:之前在IBM和百度工作,為了寫書從百度辭職了一年发绢,這期間在線下開辦了50多次算法交流活動硬耍,線上講了20多次直播課。最主要的目的是通過學員反饋找到每個題怎么講才好理解边酒,然后把好的解釋寫進書里经柴。寫書期間非常累,但是現(xiàn)在終于出版了墩朦,目前剛剛閑下來坯认,出去旅游了一下放松了心情。目前剛剛投入到工作狀態(tài)中氓涣,在GrowingIO做后端工程師牛哺。
CSDN:在算法方面,您是如何和學習成長的劳吠?
左程云:本科在華中科技大學計算機學院引润,這一期間能在學業(yè)上讓自己滿意的可能就是沒有掛科而已。碩士在芝加哥大學痒玩,出國之前就了解到想要在國外找工作的話淳附,面試時幾乎只考算法和數(shù)據(jù)結構的題目议慰,于是開始了刷題,也就是搜集這方面的題奴曙,并且代碼實現(xiàn)出來别凹。就這樣從2010年到今天,刷了5年算法和數(shù)據(jù)結構的面試題洽糟。剛開始其實只是為了找工作才開始刷題炉菲,但是半年之后就上癮了,根本停不下來坤溃。最開始是把能找到的所有這方面的書全部看懂颁督,并且實現(xiàn)了好幾遍,然后開始刷LeetCode和CareerCup這兩個網(wǎng)站上的題浇雹,去網(wǎng)上搜各種各樣的分析文章沉御,總之是把一切有關代碼面試的東西都搜來學習。其實并不是一夜之間變得這么勤奮的昭灵,完全是因為學費很貴吠裆,一門課的學費高達5000美金,也就是聽一個小時的課烂完,差不多650元人民幣就沒了试疙。這件事情對我來說很刺激,覺得不好好學習真的沒臉活下去抠蚣,當時就是這么極端的想法祝旷。因為錢的刺激,我一年內(nèi)走出校園的次數(shù)都屈指可數(shù)嘶窄,用了大量的時間好好刷題怀跛。
剛開始代碼實現(xiàn)算法和數(shù)據(jù)結構的題目真的非常痛苦,因為這部分的內(nèi)容相比其他方面的知識絕對算高門檻柄冲,而我最開始的基礎也并不好∥悄保現(xiàn)在我經(jīng)常在網(wǎng)上給同學們講題,看到同學們表達的抱怨现横,那簡直就是當年的我漓拾。這是一個脫胎換骨的過程,但好在會迅速上癮戒祠,堅持半年之后就能一直堅持下去了骇两。
算法和數(shù)據(jù)結構問題的技術累積非常需要長期堅持,因為內(nèi)容又多又雜姜盈。如果大家看一下每年大公司的算法和數(shù)據(jù)結構面試題低千,就可以了解到這個特點。剛開始準備的時候贩据,肯定是先把書本上基礎的內(nèi)容熟練掌握栋操,把時間復雜度和空間復雜度的基礎分析方法熟練掌握。把基礎打實之后饱亮,接下來我技術累積的路線就是所有坑全跳進去矾芙,掉到坑里還不愿輕易出來,還在坑里打滾近上,哈哈剔宪,這和我的性格有關,就是很難聽人勸壹无。一直分析到筋疲力盡葱绒,終于明白自己的方法就是不如書上的或網(wǎng)上的,然后還要想很久這個更好的方法實質上到底是什么斗锭。每一道題基本上都是這樣做的地淀,總之就是進步非常緩慢,但好處是學的堅實岖是。差不多代碼實現(xiàn)到200題的時候帮毁,感覺自己有了很好的感覺。這里要對大家有一個提醒豺撑,刷完一道題其實是一件很難的事情烈疚,因為普通解法很容易,但是最優(yōu)解真得去耐著性子研究好久聪轿,去查資料爷肝,去做優(yōu)化,這個過程很漫長陆错。刷題圈流行一句話灯抛,“刷200道題之后,再無庸手”音瓷,說的就是用必須找到最優(yōu)解的心態(tài)去刷200道題之后牧愁,進步真的非常大。我就這樣折騰了好幾年外莲,每天都刷題猪半,每天都想解法,最后終于發(fā)現(xiàn)沒啥新鮮的面試題了偷线。最近覺得有意思的題磨确,都是ACM競賽題,這里就不再介紹這方面的內(nèi)容了声邦,因為與準備代碼面試的同學離得比較遠乏奥。在刷題這么長的時間中,代碼實現(xiàn)能力和對經(jīng)典算法的學習是共同進步的亥曹。
CSDN:不久前您出版了《程序員代碼面試指南》一書邓了,為什么寫這本書恨诱?寫書一種怎樣的體驗?有哪些心得和體會可分享骗炉?
左程云:其實現(xiàn)在拿到自己寫出來的書照宝,還是挺震撼的,沒想到能寫成句葵,還能寫這么多厕鹃。其實就是有一天我看到自己刷題的文件,好多啊乍丈,不出書似乎有點難受了剂碴,于是就開始寫。當時在百度轻专,平時工作很多忆矛,為了寫書常常熬夜,后來真的吃不消了请垛,就辭了工作洪碳,專心把書寫出來。期間還有一個很大的變化叼屠,就是開始辦一些算法交流班瞳腌,因為會做題和能把解法講清楚之間差別很大。所以我就給剛開始準備面試的人講很多題镜雨,這也是我對這本書最自信的地方嫂侍,因為在很多同學的反饋中,我修煉了自己的表達荚坞,怎么講最好懂挑宠,怎么舉例子最能說明問題,在辦算法交流班的過程中我也學到了很多颓影,教學相長的感覺很不錯各淀。寫書期間辦了60多次講座,把想寫進書里的題全講了一遍诡挂,然后根據(jù)反饋來寫書碎浇,就是這么過來的。我覺得這本書最大的特點是題目很全璃俗,涉及的代碼技巧也很多奴璃,最關鍵的是解釋清楚,難懂的地方都舉了例子城豁。這里要感謝李曠世先生和殴赌拢客網(wǎng)CEO葉向宇先生,他們給我提供了很好的平臺。
CSDN:您這本書最大的特色是什么雳旅?
左程云:題目非常多跟磨,基本上把近些年IT企業(yè)的高頻代碼面試題目一網(wǎng)打盡了。但讓我最自信的是對實現(xiàn)的技巧介紹非常全攒盈,直到今天我依然會關注新出現(xiàn)的代碼面試題抵拘,但發(fā)現(xiàn)解法的原型幾乎都跑不出我這本書的范圍。另外就是所有的解法都有完整的Java實現(xiàn)沦童。
CSDN:您這本書是介紹面試中遇到的算法和數(shù)據(jù)結構的高頻題,及其解法叹话。請問以面試為目的算法學習和我們正常理解的算法學習有什么區(qū)別和聯(lián)系偷遗?
左程云:在網(wǎng)絡上流行一句話:算法分三種,競賽的算法驼壶、面試的算法氏豌、算法。雖然我覺得這么分非常讓人無語热凹,但其實可以去這么理解泵喘,因為競賽、面試和純理論的要求和限制是不同的般妙,所以算法在不同的要求中展現(xiàn)了不同的樣子纪铺。
對于競賽來說,每道題對輸入?yún)?shù)和樣本量的要求都是非常明確的碟渺,同時規(guī)定的非常明確的還有空間的限 制和運行時間的限制鲜锚。
而對于面試來說,限制往往并不明確苫拍,造成這個現(xiàn)象的原因也很好理解芜繁。競賽中當然是分數(shù)最重要。在面試的過程中绒极,與面試官的交流和體現(xiàn) 自己想事情的方式骏令、體現(xiàn)自己邏輯的嚴密更重要。所以同一道題垄提,在競賽中必須寫清楚限制榔袋,而在面試中一道題剛開始的限制沒那么多,目的就是縮短你理解題目的時間铡俐,讓面試者先寫出一點什么摘昌,然后和面試官展開討論,隨著討論的深入高蜂,再逐漸的把限制加上去聪黎。總之在面試的場合就是想看看你想問題的習慣、軌跡以及表達 能力是否符合要求稿饰。
當然锦秒,不管是什么要求下的算法,經(jīng)常練習算法和數(shù)據(jù)結構題目對一個人在邏輯上的提升都是顯而易見的喉镰,在學校參加ACM并取得很好成績的同學旅择,如果不是表達能力特別差的話,是一定會收獲很多offer的侣姆,因為思維被鍛煉的很好生真。
CSDN:您在面試這塊有很深的實踐積累,大小互聯(lián)網(wǎng)公司有什么不同捺宗?以及國內(nèi)外的互聯(lián)網(wǎng)在算法面試這塊有著怎樣的區(qū)別柱蟀?
左程云:面試題不光有算法和數(shù)據(jù)結構題目,但是其他類型的題目都很好準備蚜厉,記住了长已,理解了,就不會忘昼牛。比如术瓮,系統(tǒng)、數(shù)據(jù)庫贰健、網(wǎng)絡胞四、編程語言等等吧,都具備這樣的特點伶椿。而算法和數(shù)據(jù)結構題目真的需要好好寫代碼才能掌握撬讽,所以我建議大家準備面試的時候,抽出20%的時間去理解和記憶非算法和數(shù)據(jù)結構的題目悬垃,剩下的時間就是去刷題游昼。
一般來講,工資高的公司在面試時算法和數(shù)據(jù)結構題目的比重較大尝蠕,工資一般的公司比重較小烘豌。當然同樣公司的不同崗位,要求也會不同看彼,但總體趨勢就是國內(nèi)好公司愛考算法和數(shù)據(jù)結構廊佩。這是目前國內(nèi)互聯(lián)網(wǎng)公司的情況。國外的互聯(lián)網(wǎng)公司幾乎只考算法和數(shù)據(jù)結構靖榕,早個8年前就是這樣了标锄,一直如此。我相信國內(nèi)會逐漸變得像國外一樣茁计,并不是崇洋媚外料皇,而是算法和數(shù)據(jù)結構題目真的能考出東西。
算法面試的特點就是沒有特點,什么樣的題都可能遇到践剂,因為根本沒有考綱鬼譬,面試官就是普通的程序員,他們在工作中或者在網(wǎng)絡上遇到什么題不錯逊脯,就可能考优质。所以我這本書寫了530頁嘛,因為內(nèi)容太多了军洼,這不是一個標準考試巩螃,這是能力考試。
CSDN:怎么看待IT企業(yè)在招聘要求中匕争,對算法和數(shù)據(jù)結構的要求越來越高這個事實避乏。
左程云:其實在很多年前,美國的那些知名IT企業(yè)在招聘的時候就已經(jīng)不怎么考除了算法和數(shù)據(jù)結構之外的東西了汗捡∈缂剩可能是覺得這樣能選出聰明的人吧畏纲。但我覺得只考算法和數(shù)據(jù)結構的東西也不健康扇住,就像練功一樣,內(nèi)功和外功同樣重要盗胀。
CSDN:對于剛開始準備代碼面試的同學艘蹋,有哪些提醒。
左程云:別覺得辛苦票灰,越練會越上癮的女阀,而且那真的很有營養(yǎng)也很精彩。
CSDN:算法學習是一條并不簡單的路屑迂,對于-1~3歲的從事算法相關職業(yè)的人或那些對算法感興趣者浸策,算法學習你有什么經(jīng)驗可分享?以及學習時應該注意什么惹盼?
【以下是本文最重要的地方S购埂!J直ār遣铡!Q诟颉枉昏!
左程云:先找到線團,然后進入線團里學著怎么玩揍鸟。為了進入線團兄裂,需要先把基礎知識掌握好,然后有一些很經(jīng)典的書可以迅速讓你進入狀態(tài),比如我這本《程序員代碼面試指南》懦窘,還有《劍指offer》(請參見作者訪談——專訪何海濤:“不正經(jīng)”程序員的進階之路)和《程序員面試金典》(《cracking?the?coding?interview》中文版)這些好書前翎。我不建議剛開始刷題的人就直接在網(wǎng)絡上搜集文章開始學習,因為太散了畅涂,而且需要花很多時間去鑒別正確與否港华。當這些內(nèi)容都掌握之后,再開始在網(wǎng)上搜集各種各樣的題午衰,并與網(wǎng)友參加各種各樣的討論立宜,會比較高效。把底子打好之后臊岸,對于專項算法的學習就得心應手了橙数,而且會學的很快。對于很龐大的算法帅戒,我個人的習慣是找例子來引導自己的思路灯帮,一點一點的接近算法的核心。唯一需要注意的是逻住,一定要寫代碼钟哥,光看沒有用的。
對于某一個具體的算法瞎访,首先要搞清楚這個算法解決的問題是什么腻贰,可能是實現(xiàn)一個具體的功能,也可能是在某些方面扒秸,比如時間復雜度或者空間復雜度方面很卓越播演,總之搞清楚這個算法被研究出來的目的是什么。
然后就要弄清楚這個算法的生存環(huán)境了伴奥,也就是看看你此時研究的東西是不是對別的知識有依賴写烤,應該先把底層依賴的知識理解并掌握。這些問題都解決之后拾徙,就進入到算法本身的學習洲炊,理解一個算法是一件辛苦的事情,剛開始看必然會產(chǎn)生很多的困惑锣吼,比如經(jīng)常會懷疑作者講述的內(nèi)容的重要性选浑?這些內(nèi)容和這個算法有什么聯(lián)系呢?經(jīng)常會有這種摸不著頭腦的感覺玄叠,其實作者做的鋪墊都是為了建立起描述算法主要內(nèi)容的基礎古徒,只有接受和理解這些基礎,才能逐漸觸碰到算法的精髓,所以耐心是很重要的。
算法的主要過程看完之后,往往還是會感到困惑惩淳,主要是不知道這個過程好在哪疹吃,這就進入了下一個階段蹦疑,理解作者對這個過程在功能性或者效率卓越這件事上的解釋和證明。這才真正觸碰到算法最精髓的部分萨驶,也就是深度的理解算法的主要過程所帶來的好處歉摧,這才是最鍛煉人理解能力的地方。
上面幾點是算法學習階段的過程了腔呜,接下來就是研究算法的代碼實現(xiàn)叁温,自己設計測試用例親自跑一下代碼,以及從代碼運行時間的角度分析這個算法的優(yōu)勢核畴,這也是加深對算法的理解的過程膝但。
最后是配合相應的題目練習,讓自己通過題目練習的方式谤草,會用跟束、善用學習到的算法,并對這個算法產(chǎn)生一定的敏感程度丑孩,具體是指看到某些題目時冀宴,能夠根據(jù)題目的特點,產(chǎn)生與該算法的對應嚎杨,也就是具備舉一反三的能力花鹅⊙跹】
CSDN:您是如何走上編程之路的枫浙?以及寫代碼如何與算法高效的結合?常用的語言是古拴?
左程云:因為本科和碩士階段都是計算機專業(yè)箩帚,所以走上編程之路的過程是非常自然的,但我真正享受編程的過程是在開始做算法和數(shù)據(jù)結構的題目之后黄痪,牛人們寫出來的東西怎么就是比我快呢紧帕?所以開始研究起來,并越來越癡迷桅打。程序=算法+數(shù)據(jù)結構是嗜,所以不存在結合的問題。常用的語言是Java挺尾。
CSDN:你是否在工作或生活中發(fā)現(xiàn)其他讓您印象深刻的算法鹅搪?以及研究算法,對您的工作和生活有什么收獲遭铺?
左程云:很多算法對我的影響都很大丽柿,從開始時的很基礎的排序算法恢准,到后來看到的BFPRT、KMP甫题、Manacher馁筐、蓄水池采樣、skew坠非、Morris遍歷等等等等先賢們的成果敏沉,震撼我的次數(shù)已經(jīng)數(shù)不清了。對自己的頭腦變得越來越自信炎码,這是最大的收獲