編程大佬不會寫tokenizer是不是一件很值得驕傲的事情?
眾所周知,parser,tokenizer這種東西不過是屠龍技。
只有熟練掌握1024種CRUD的姿勢以及255種web框架,並將各種web開發工具的官方文檔的demo翻譯成中文湊成書並在知乎上使勁吆喝,才能成為掌握豆瓣核心科技Python圈大佬。註:我沒寫過tokenizer - 知乎專欄
嘛,說起來 tokenizer 也並不是那麼必須的東西。。我自己寫 parser 時,不管是用現成的組合子庫(parsec family 那一套)還是手寫 Packrat 或者 Earley,從來都沒有單獨的 lexing 階段,不也沒啥問題么。。(逃
程序員對自己的要求要高一些,真正的屠龍技並不是學習並弄懂前人的東西,只是個開始。真正的屠龍技是創新能力,不管是科研創新還是工程上的創新,前人解決不了的問題,被你解決了;前人做不到的事情被你做到了;別人1秒鐘才行,你0.1秒即可,這才能體現出你的價值。
tokenizer 和 parser ,好好看書做習題大體能做個七七八八的東西,它是你編程成長路上會路過的一個節點,一個只需要理解別人多年前提出的各種方法就能達到的階段性目標,並不需要你提出新思路並不斷的打磨驗證,也不存在較高的不確定性。
沒必要把它捧的太高,當成所謂屠龍技,還是老話,任何行業學會並弄懂前人的東西是開始;我面試過好多學生,不少本科期間學的好點的,都能寫點基本的 LL/LR,就是表現一般的,入職培訓第二周,完成 json 解析器,大概也能明白所謂遞歸下降 ,把 json 解析換成 scheme 解析器也是分分鐘的事情,只考慮當前符號即可,都不需要往後匹配更多符號;有點天分的孩子,中學階段就能完成基礎的 tokenizer / parser 。
所以這只是個人學習的一個節點,一次大作業,你學完解方程高興下就行了,後面還有微積分等著你學呢,學完微積分學完數論要從事數學研究的話,你才剛起步。所以目標訂高點,你如果覺得解方程都是屠龍技的話,你回頭看看那些中學時代就掌握相關技術的孩子們,人生豈不是一文不值?
哪天你碰到個數學專業的人,你好意思在他面前說自己會解方程很驕傲么?哪天有人跟你說:「什麼?這是屠龍技?我高中就做出來了,大學做了個更先進的」,你會不會很失落?
當你要做一個東西發現開源的東西都不能滿足你的要求,不當書店裡沒相關領域的書籍,圈熱門論文里也沒有你要找的東西,你發現你來到了四下無人的野外,地上沒有前人走過的痕迹。而你依然能靠自己走出一條路來,讓後來的人可以沿著你的足跡更加方便到達目的,這才是技術工作者追求的境界。不管是發明,創造,改良,著書立說,你的工作成果對他人有了幫助,你才能成為一個純粹的人,一個高尚的人,一個有利於人民的人。
其實我也沒學過怎麼寫tokenizer,但是我覺得我應該寫過一些簡單的,OI時候的入門題表達式求值,同濟ACM OJ有道題輸入化學方程式輸出配平的方程式,微軟實習的時候面試題是一個表達式由變數和and or以及括弧組成,要求自動按運算順序加上括弧,在紙上現場寫C++,做不出來估計就不要了……近一點的,VLCP里的JSON-RPC協議實現,簡單數了一下括弧用來拆分連續的JSON串。
這事也過去挺久的了,挺沒意思的,都散了吧張華學會了 web 開發;李萍學會了爬蟲;我學會了 tokenizer:我們都有光明的前途。
其實,為什麼一定要說這個問題呢。很多人會認為我不會有什麼要緊,我一個增刪改查工程師,每天做的都是髒亂差,為什麼要會屠龍之技。
那麼回到這個問題本身,首先,tokenizer並不是什麼高深的東西,更談不上屠龍之技。寫一個parser都非難事,tokenizer何難之有。
其次,為什麼大家喜歡戰鬥這個問題呢。我認為,會寫tokenizer是編譯前端入門最開始一步,好比你要學達摩拳,那你要少林長拳練起。當然也有變態直接上parser combinator,那基本你小無相功都會了,區區長拳也虎虎生風。
最後,很多人說是屠龍之技,事實真是如此么。實話而言,做任何領域,稍微深入一些,編譯前端都是繞不過的門檻,比如你做遊戲引擎,那跨平台shader你自己定製語言就是要做編譯前端,又好比做sql引擎 也無法繞過,做個mvvm的vue也要操作語法樹。再次再次,你不做這麼高深的東西,但是你想寫個衛生宏,自己做個dsl的需求總還是有的吧。
網易入職的時候,新人要求一周學會python,然後作業是寫json parser,很多在我看來很弱的程序員都可以一周做完,所以拋去性能,這個東西難度有限。
一個剛入行的跨界程序員,不懂編譯前端,無體系概念,那可能是背景決定的。一個入行很多年的人,不懂也不想懂,其實和天資和想法和業務層級都有關係,而產生屠龍之技的印象,多半是這個浮躁的行業,缺乏真正的程序員。
還有就是希望大家不要用這個來撕逼,也不要黑豆瓣,豆瓣有很多優秀的程序員,hqn曾經是我的偶像,以前一位豆瓣的網友是dpark作者,我在豆瓣上(因為0bug事件)認識了最初帶領我前進的程序員,我現在都還很喜歡這個圈子。
技術需要不斷地練習和進步,與諸君共勉。
你們是不是根本沒看人家的文章啊,標題這裡的tokenizer是個虛詞,指的根本不是tokenizer,是用了個典(典自敵人的攻擊)(逃。至於他到底寫沒寫過,其實這不重要。
2017年06月08日12時 update: 莫忘初心, 我已道歉, 就差董先生的了, 大家散了吧.
------
我是當事人之一. 這個問題的影響力已經大大超出了我的預期(我以為會刪掉的), 並且有人噴提問者, 明天也不知道最終會有多少人看到.
所以, 我有必要說一下事情究竟是怎麼樣的. 董先生也只是貼了鏈接, 不知道有多少人全看過了呢?
我原先說不回應的, 現在食言了.
事情有兩件
------ 第一件事
一年前還是兩年前吧. 有個討論Python代碼怎麼寫得好的問題. 我覺得對於socket操作, 這種極有可能需要try-catch的操作, 不應該扔在filter之類的函數里.
一來你要抓exception的時候還是得寫成普通函數, 二來你一下子從stack track還看不到.
到此為止還是好好討論技術問題吧. 然後董先生就開始"呵呵"了, 開始說要1K關注以上才能"撕". 我就來勁了, 就說那比寫tokenizer好了.
我從來沒有說tokenizer怎樣怎樣很驕傲, 各位請翻我的time line. 我都是在很認真的寫文章, 分享所見所得.
一定要定性就是在董先生"呵呵"之後的所有一切都是意氣之爭, 已經沒有對錯了. 我和董先生無非是在找各種論據駁倒對方而已.
------ 第二件事
有一個回答是關於垠神的, 也和tokenizer和parser有關. 這裡我做了一件錯事, 我提到了老久之前的那場"論戰".
到這裡, 我覺得我是有點挖墳. 但就事論事來說, 我不覺得第一件事有做錯. 因為是董先生先說要關注數才能討論的.
然後董先生就幹了一件我覺得特別不厚道的事情, 把我和另一個人的ID掛專欄里了, 標題為"我不會寫tokenizer".
意氣之爭沒有對錯. 掛專欄里, 然後要我回應比贊數? 又比我要求跟你比tokenizer高明到哪裡去呢?
------
就是說, 從頭到尾, 這件事就是我和董先生的意氣之爭, 爭的焦點根本不是tokenizer是不是判斷編程大佬的標準, 倒不如說是, 沒到1K關注者能不能討論.
Tokenizer究竟重要不重要, 大家自有定論. 1K關注者以下的人有沒有資格討論, 我覺得是有的.
好了, 這就是我正式的回應. 我在現實生活中有很多不如意的事情, 在知乎上分享我的想法, 有了贊, 有了關注度是會給我滿足感. 但關注度不是判斷事情對錯的標準, 聲音大的就對嗎?
我對挖墳挖苦董先生一事表示對不起. 但也希望董先生能對於1K關注者的人以下不能討論的事情做出解答.
我一直以為知乎上只有兩種程序員。一種是前端程序員,天天寫框架;一種是 Python 程序員,天天寫爬蟲。沒想到還有一種,天天寫 tokenizer。
從我個人經驗說,比自己寫 binary search 還要簡單一些。
寫沒寫過 tokenizer 不重要,一個人從沒進成姚班(或者放寬點,貴系)的那一刻起,就已經輸了,只能永遠做失敗人士。
入門級程序員: 整天撕逼誰最牛逼。牛逼程序員: 忙著賺錢。
一,如果非要說人家驕傲的話,那也不是因為不會寫tokenizer,而是因為人家熟練python,能夠用python產生效益。幾個答案看下來,最多也就能說是「我python寫得好所以我牛逼」,從來沒發現有「我不會寫tokenizer所以我牛逼」的意思。二,在我念本科的時候,我會因為寫了一個編譯器或者用微程序實現了一個指令集這種事感到自己很牛逼。但從念研究生開始我已經意識到衡量一個工業界程序員最根本的標準應該是他能不能解決生產中的問題,他寫的代碼能產生多大效益。三,不講效率的話,編譯器不是個太難的東西,要講效率的話,全知乎沒幾個人能寫得出來。
講不明白automata很丟人。
寫出bug 叢生的tokenizer很正常,你看要給多少時間。
如果parser都是屠龍技,我一年內已經屠了倆龍了?人多不懂的東西都會畏懼,明白了都那麼回事。tokenizer是什麼意思?
對編譯原理一竅不通,但是以前在Adobe Flex里用ActionScript手擼過Genbank格式的parser。我這算啥?勞動人民對自然規律的樸素運用?
懂得幽默與陰陽怪氣之間的區別是很重要的。