尤雨溪等非cs轉前端的大神是怎麼學到編譯這個地步的?
我是非cs專業轉前端的小渣,我修了些本科基礎如面向對象,數據結構和資料庫..可在我們學校(gatech)編譯是比較高級的cs課了,無法想像一個本科藝術史的人怎麼會學到編譯,進而做出了vue..我真的好睏惑,什麼時候能成為像他那樣的人?我難道得重修cs才能在前端世界如魚得水,快樂的游來游去嗎?謝謝!@尤雨溪
首先,實不相瞞我對編譯原理的了解很粗淺,Vue 裡面編譯相關的部分也都是很基礎的東西,跟編譯領域前沿的研究完全沾不上邊,跟比如R大 @RednaxelaFX 研究的東西就更加不能比了。cs 裡面隨便一個領域單獨拿出來,水都可以深得超過外行的想像,但在工程的場景下,更重要的是投入恰到好處的技能點去實現你現階段的目標。
其次,不要妄自菲薄。我覺得很多非科班出身的程序員經常會潛意識裡給自己劃定範圍,啊這個是科班出身的人才懂的東西,我沒希望了。你之前學了啥跟你以後能學啥沒有什麼本質聯繫吧。我本科學的是藝術史,只意味著我本科的時間大部分花在了藝術史上而已,不代表我以後不能再花時間在 CS 的東西上。其實很多所謂科班出身的人對於編譯原理的理解跟你的差別也就是三個多月一門課而已... 如果真的覺得編譯原理是自己的瓶頸了,那就下決心去學唄,可能並沒你想像的那麼可怕。
當然了,大學裡面那種可以什麼都不管就悶頭學東西的狀態,在你畢業以後就很難有這種機會了,所以在學校的時候好好珍惜吧!說到這點我還挺羨慕學生的,要加強學習時的集中力,考試的壓力比什麼都有用,工作以後自我鞭策很難有這麼強的效果....你該問的問題應該是
如何學習使用編譯原理的知識解決前端問題
否則你該找個直接深入應用編譯原理的工作,比如類似 @RednaxelaFX 的工作內容。沒有實踐場景,你學不到真正的技術。並且我姑且可以下結論,『前端圈子裡沒人可以回答你的這個問題』。
而前端可以涉及的部分,比如Parsing,據我所知,大部分情況下只是CS下的本科課程,並沒有你想像的那麼高深,那難點在哪?就是如何『找到應用點並嘗試實踐』,說實話國內的填鴨教育是影響了部分學生的實踐能力。
我說下為何前端也會需要一點編譯原理,是因為兩點
1. 完全的靠語言封裝函數或模塊達不到自建DSL達到的簡潔性,比如 思考 如果 a + b - c 需要 寫成 sub (add ( a, b ) , c)。 可讀性和可操作性會大為降低。 再比如基於html或css構建的超集DSL(模板、css預處理器等)更會帶來直觀的可讀性。
2. 正則在文本處理領域是受限的,我們不得不使用Parsing來解決模式匹配問題我和題主一樣是非CS學生,本科光電,本二學過一門C,60分。研究生光學工程,基本天天實驗室玩三五族化合物,擺弄那些設備,基礎應該更弱於題主。但你現在可以參考下我github下的內容,應該有不少項目是和Parsing相關的(或和內部DSL相關)。所以我的經驗是有實際意義的
我在另一個回答里提到過一些關於前端領域的DSL應用的點 如何寫一個類似 LESS 的編譯工具?,並且推薦過一本叫《編程語言實現模式》的書籍,有幸看到 @RednaxelaFX 在後面某個問題里也提到了這本書,感到莫名的優越感。這本書是我看到的極少的脫離了學院派意味的實用書籍,雖然內容都是點到為止,但是面面俱到,非常推薦給入門的開發者。
從寫高亮器開始。。。好懷念學生時代和那場d2。。。
在前端如魚得水游來游去的絕對是極少數。前端大量的工作室刷頁面填邏輯學框架,才不是編譯原理。
編譯原理粗糙的說包括語法解析,代碼優化,目標語言生成,仔細看的話,語法解析最簡單的,後邊兩個在前端很少接觸到。前端框架里也很少。造語言編譯到 js 接觸到的也只是在語法解析部分多一點。
當然課是要好好上的,不然每個月來一個前端框架還能游來游去么。至於是在學校上還是在公司上就不一定了。我一個後台學前端的時候看到 Vue.js 裡面提到編譯,總會不自禁的以為經過了 詞法分析 語法分析 語義分析 代碼生成 編譯 鏈接的過程,後來發現好像其實是把用Vue.js語法寫出來的東西通過JS解析成了能夠被瀏覽器渲染的dom模型,以及把綁定的相關數據通過JS提供的getter和setter進行了處理。和我平時所了解的編譯不是一回事- -。應該主要是在生成語法樹這塊兒做了很多工作。尤大表示也有2.0也有代碼生成的工作。這只是編譯原理裡面的一部分,應該也是編譯器的前端部分吧,其實沒你想得那麼誇張。Vue.js 牛逼在數據驅動的思想和對JS的深度使用。
但是我覺得能一個人憑藉自己的學習能力和執行力能擼出 Vue.js 這種東西,他轉去做編譯原理也不會是什麼困難的事情。主要還是看學習能力和你付出了多少時間。
前端最後終歸還是跑在客戶端上,只要是在操作系統上運行的東西,到深處都難免需要CS的知識。
其實編譯原理如果不是做框架的話,反而屬於比較不太重要的內容。
編譯原理的水很深,即使CS專業的學生,本科階段的學習也只是入門而已。學習編譯一般會涉及到詞法分析、語法分析、語義分析、runtime、類型推導、代碼生成等。
詞法分析和語法分析可能是做前端的過程中遇到最多的,但其實它們只佔了編譯原理中很小的一部分而已。雖然只是其中的一小部分,但因程序語言的語法大都會比較複雜,在詞法分析(lexer)、語法分析(parser)階段就已經讓我們倒下,很難進入到後面的階段。進一步掌握語義分析後,基本可以實現簡單的解釋器/編譯器的編寫,到這裡可以說已經入門,在前端領域也可以做很多事情了。
以css預處理器為例,個人用得比較多的是less,就以less為舉例,在使用less預處理器時,都會需要一個less編譯器,其作用就是將less格式的文件轉換為css格式的文件,大體流程如下所示:
less file -&> less AST -&> css AST -&> css file
這裡僅僅需要詞法和語法分析就可以完成一個簡單的less編譯器,而這並不會需要你有很好的計算機理論基礎也可以做到,因為這裡只是涉及到數據類型的轉換而已,所以也不要妄自菲薄,因自己不是CS專業的學生而自卑,同時也要對整個體系知識有個大概的了解,根據自己的需求,學習和補充相關的知識,畢竟大學不能教給我們所有的知識,但培養了我們學習的方法。
想對詞法和語法分析進一步了解的可以看下 Create Your Own Programming Language 這本書,沒有晦澀難懂的理論知識,簡單有趣,個人覺得是很不錯的入門書籍。現在有時間了,修改一下答案吧!首先我不知道學到非cs轉前端然後學到編譯的難度係數有多高,我只能大概說一下我的經歷,你自己感受一下.首先介紹一下背景:91年出生,16歲初中沒畢業去當兵,18歲退伍的時候09年,之後浪蕩江湖4年之久,一直到15年3月份才從家裡出來到魔都沒找到工作,跑到了帝都.
15年10月份去了某web前端培訓班,開始了為期4個月的培訓.4個月當中人始終處於懵逼狀態,在沒有任何編程基礎並且初中沒畢業的情況下,迷迷糊糊的順利畢業並且開始找工作了.
第一份工作歷時半個月順利找到,因為簡歷的包裝以及略強的吹逼能力,找到了一份稅後7k的工作,但是3個月之後我辭職了.原因很簡單:3個月之內我沒做任何關於編程的事情,因為根本沒活.第二份工作的到來比我預期來的更快一點,在辭職後的一周內我找到了我現在的工作,6月份入職之後到今天12月13號.我從一個菜到不能再菜的菜鳥程序員,順利成長為能幫別人解決一點小問題的初級程序員. 時間點回到6月份,從入職到11約中旬的5個多月時間,每天晚上11點左右回家,回家以後寫代碼,學習到凌晨2:30-3:00,周六不休息在公司加班,周日在家洗衣服,打掃衛生,寫代碼.從一開始構造函數不會用,面向對象不知道是什麼東西,到現在自己寫組件,給別人解決小問題,這段經歷讓我深刻的知道,沒有什麼知識是你學不會的,沒有什麼技術是你搞不定的.只要你肯花時間,以上._______________下面是原答案______________只要你肯花時間,宇宙飛船怎麼造的你都能學會。一個簡單的解析器是科班第一學期程序設計的內容。
但是如果你之前錯過了也沒關係,它貫徹於隨後的多門課程中。其實cs專業的人,也不見得學編譯原理的很深,恰恰相反,絕大多數人學的很一般,超過一半人學完就忘(這裡包括一些刷績點的學霸)。所以不要妄自菲薄了。
我覺得最重要的其實應該是興趣,眼界,加努力。
據我說知,小右這三方面都超乎常人,體現在他從在國外讀書然後去google,再獨立開發vue。
從畢業算起,這其實已經過了四五年了。還記得小右微博上說,他老婆最怕他晚上說靈感爆發,,,,,
每個人都無法複製別人的成功,但是可以走出自己的道路。
在看清前方路的前提下,堅定的干自己喜歡的事。
這是我編程學了三年多,結果還不錯的總結。有幾個跟編譯相關的或可以使用編譯相關知識的東西可以練手:
數學表達式解析器,支持三角函數啥的
條件表達式解析器,比如jsep那種
語法高亮
json path解析器
dom選擇器
模板引擎
一種場景的dsl(比如css預處理,微信小程序的那個類似xml的東西)
html parser說粗略一點,這種框架裡面用到的「編譯」更多的其實比較像軟體工程設計模式中行為型模式裡面的解釋器模式,編譯器涉及的範圍要比他廣。當然不能否認尤雨溪等大神能夠寫出這些框架確實很厲害。
至少我個人覺得計算機本科課程的那些東西本來用處不多,而且大多數人又是混子,所以你不必對科班有什麼期待或者說他們就比你強之類的。
但是我個人覺得,理工科的底子是很有幫助的,因為我在學習JS的時候明顯感覺到內在的數學思想,我用區間去理解loop的起始條件,就非常簡單明了了。不過遺憾的是,我個人大學裡面沒有學過高數,所以對於事物的理解只能用我高中的數學知識去理解。又聽說通往高級編程者必備微積分、離散、統計的數學知識,所以可能業餘時間還要自學一些這些東西。
其次,我注意到編程大牛普遍愛好讀書,我想如果你能讀上幾本書,你就比那些混日子的碼農高出不少的層次,讓你走得更遠。
時間和精力確實很重要,年紀越大,非計算機類的工作越久,入行難度就越大,所以我現在比較後悔大學裡面應該苦學編程知識而不是虛度年華。
總的來說,第一個,是金子終會發光,第二個,文理分科害人不淺。我是江蘇人,文理分科戕害更大了,文科根本毫無優勢,最後只能吃力不討好。另外,我國高等教育中文科也普遍不如理工科。
以上就是我的一些感想。個人買書順序第一步《鋒利的jquery》(真的沒必要買 網上百度jq手冊就可以了 所有的api都在 包括版本) 第二本就是《javascript權威指南》(書籍十分厚重,內容也十分多,作為閱讀可能有點吃力 ,但是至少要了解目錄中那塊內容在哪裡 ,當作一本字典很好) 還有一本暫時沒買網上看多資料《javascript高級程序設計》(這本書就該是必定要翻的書籍了,多看看能學到很多)後面就是要要兩本小黃書了 《你不知道的javascript》上中卷 (你會了解很多你不知道的javascript機制內容)還有要與時俱進技術更新那麼快就要著手es6 7 8 那麼你該看《es6標準入門》(這本書個人覺得寫得不夠詳細明了,對於剛入門的人是真的晦澀難懂(譬如我比較垃圾))總之看完這些書之後
還要親自從項目實踐 項目才能穩固和更新你的知識 書本上遇到的問題通過項目你會得到更好的解決。有個大牛是你同事的更加好,臉皮厚一點。休息的時候多問問(好好套路他) 個人的微薄經驗
其實都是很easy的東西 看你從什麼角度去看.
作為一個受夠了學院網路作業平台,作業部署了作業題,不是那種動態表單提交的人,然後就寫了個部署作業的語言,幾個關鍵字,questions selection text blockbegin blockend ,然後我們學院就用上了這個系統,後面還開發了python的教學作業分析系統,分析錯誤率等等,所以不是怎麼學會的,而是怎麼發現生活中的缺陷,然後改變缺陷的,我是只看了兩個月左右編譯原理,因為我做的語言不是圖靈完全的,沒啥複雜的。
花兩個小時學個遞歸下降語法解析夠你前端用了。。
多投入時間多去啃書學習就好了啊~ 與之而來的肯定是你要放棄一些東西,在有限的精力里~
我是cs出來的,但是大學沒正經上過課的實在很慚愧。比你領先的難道是我考過幾門60幾的專業課?別傻啦,大家同一起跑線。
這證明了一個道理大多數coder 是使用現有產品 無論是否是開源 為業務應用服務的。本來也不需要你去理解這裡面的東西,就像你拿著剪子理髮,出好剪子了 買過來用就是了 。這些大神 且不說編譯怎麼怎麼樣 他們是不滿足於當前這些產品的 並且有毅力 也有目標的去解決。而不是為了想牛逼 想造個東西 去實現什麼。當你有目標 奔著目標努力的過程 你就不會有什麼是不是科班 學沒學過編譯的問題……目標需要的 你就去找 不夠好 就去改善 不會改善 就去學 這是自然推進的過程。別說本科藝術史了……就算是學礦的 也照樣吃透前端、服務端包括運維。他需要的話 他自行車修的也會很溜……真的 跟學啥的沒關係 尤其國內部分大學……更沒關係…… -_-#
尤大說的很好,我已沒有顧慮了,解決了我這幾天思考人生的煩惱,謝謝尤大
中國大學教育足夠水,實際上任何一個人,只要智商夠用,看完一本書,都懂了
"Large vessels may venture more, but little boats should keep near shore."玩&<文明6&>看到的一句話----------編程大部分都是知識點,設計模式也沒有很難懂。除了花大把時間看書看源碼,難道還有別的捷徑嗎?要表達對大神的敬仰之情,何不直接私信呢(逃...
關鍵是你有足夠的想像力。
推薦閱讀:
※公司每周都要開分享會,我是web前端工程師,不知道分享什麼好。大神你在哪裡?
※參加Econf飢人谷線下前端分享會是一種怎樣的體驗?
※應屆生前端找工作?
※為什麼說「一入前端深似海」,入行需謹慎?
※前端新人用庫是否丟人?