天天看點

鍵盤之道:分享三個月中的思維改變程式設計語言界面 or 文本高大全 or 單純可依賴面向對象 or 函數式接口限制 or 測試限制靈活簡單不偏激

人都是會改變的,也許前一段時間還酷愛萌妹,過一段時間就喜歡禦姐了。而且,會對自己之前的選擇感到不可理喻,“我以前怎麼會是那個樣子!”

對于程式設計方面的事情,很能符合上面的感受。從純c的單片機流,到windows+c#,中間穿插着java,到現在的linux,python和lisp。我的思維發生了相當大的改變。大神們可以輕輕的嘬了一口咖啡,淡淡的告訴你,“其實用什麼語言根本不重要”。大神說的當然是對的,人家說的是見多識廣,随手能寫編譯器的大神們的。對于我們這些弱菜來說,程式設計語言能夠相當程度上影響你的思考方式和程式設計方法,附帶着的還有開發工具,類庫和平台。

之前,我python學了五遍,每次都會很激動地下一個python,裝好,看着教程寫幾個循環,感覺自己好聰明,又學會了!不過因為平時用的不多,還沒關電腦呢就忘記了。

三個月前又看了一篇說python碉堡的文章,我再一次決定去學習這隻萌娘,隻是這次換了方式,先不看教程,而是把之前用c#實作的一個算法用python改寫。遇到了問題再去請教各類教程。一千行的代碼改下來,我才聞到了python萌娘的體香。是以,實踐出真知啊。

鍵盤之道:分享三個月中的思維改變程式設計語言界面 or 文本高大全 or 單純可依賴面向對象 or 函數式接口限制 or 測試限制靈活簡單不偏激

程式設計是很講究手感的,尤其是思考複雜具體問題的時候,哪有時間判斷到底是該obj.length還是len(obj) ?  而人的肌肉記憶容量是有限制的,敲代碼敲到行雲流水需要大量的實踐。是以有人可能會見過多種語言,但工作語言可能也就那兩三款,不然身體吃不消啊。

當我用了三個月python之後,重新打開vs敲我之前無比熟悉的c#,才發現怎麼這語言這麼多槽點,變量還需要聲明類型,居然沒有slice,定義個函數還要一大堆形參類型,解析個json還要用as做類型轉換,苦不堪言。我抱着腦袋,盯着螢幕,這難道就是曾經我朝思暮想的c#萌妹麼?

  c#萌娘:在著名的微軟公司接受精英教育、11歲時便跳級進入大學學習、倍受人們關注的少女。也被稱為“it界的最強幼女”。
鍵盤之道:分享三個月中的思維改變程式設計語言界面 or 文本高大全 or 單純可依賴面向對象 or 函數式接口限制 or 測試限制靈活簡單不偏激

(c#萌娘那高冷的眼神特别像我去高大上的微軟面試時,把我虐成狗的可愛的面試官,汪!)

(也許有人會說,c#有酷炫的linq 而python隻有弱爆了的清單推導,你聽過python的asq這個庫麼?)

靜态類型就像女老闆,而動态類型就像國小妹。總覺得軟萌的國小妹,沒有代碼提示,智能感覺,編譯期類型檢查,容易讓人犯錯誤。國小妹動作慢吞吞,一點都不雷厲風行,問題是,作為一個男人,你真的需要那麼快嗎?實際上,目前針對動态語言的開發工具,已經很大程度上解決這類問題了。最重要的是程式員這個一家之主,能夠認真細心,不犯錯誤,否則,就算能給一個執行超強嚴格檢查的語言,你還是會fq出去上幹壞事。

我之前用c#寫了估計兩萬行代碼,後來仔細一琢磨,如果用python,或者用動态類型的思維方式,那麼代碼能壓縮到5千行,而且看着清爽多了。敲很多次鍵盤又不是一件光榮的事情,為啥我用pip而不用easy_install呢? 因為pip更短。

人生苦短,我用python!

我之前是ui流,技術棧幾乎是以ui技術為主線的,從mfc, winform到wpf,再到unity3d。做出來的東西,雖然自我感覺良好,但經常被吐槽使用者體驗不好。我一般會這麼反駁:“靠,我又不是專業做界面的,能用就好了嘛”。

學了python之後,我發現我終于能友善地在linux上程式設計了!九塊九買了一台阿裡雲的最低配,ssh上去,每天ls,mkdir, cp,mv,git搞得飛起,才發現linux真的很好用!多簡單啊!  在這兩個月,我每天都會發出無數次“碉堡了”的贊歎。哇,ipython怎麼這麼牛!用pandas這種文法騷到爆的資料分析工具,一句話就能畫出一張統計分析圖! 用flask這麼容易就能做一個web服務!

再接着,我學習了linux風格的開源開發棧,慢慢的習慣了短小精幹的變量命名,對做界面的興趣慢慢減弱,而更感興趣于純粹的配置檔案和“文本流”(vi 一個配置檔案,斜杠正則搜尋關鍵字,比在界面上找選項不知快了多少!)  實作任務隊列,寫個crontab就可以了,想裝一個軟體或者類庫,pip一下就好了,生活惬意的不要不要的,熟練了vim的ddp, yaw, :wq後,我把vs,npp, pycharm,甚至word,都裝上了vim插件。

不談内功,隻論鍵法。那麼,文本流要比界面流快速強大地多,文本是可重用可自定義可測試的,界面除了直覺之外,沒有其他特别的好處。語言的表現能力極其強大,你試着用界面配置一個正規表達式試試看?

鍵盤之道:分享三個月中的思維改變程式設計語言界面 or 文本高大全 or 單純可依賴面向對象 or 函數式接口限制 or 測試限制靈活簡單不偏激

最關鍵的是,敲着指令行的感覺,真的很cool!

我從vc6.0,經過vs2005和中間的各個版本,到現在的vs2015。最明顯的感受,并不是功能變強,而是安裝包越來越大,安裝後将近10gb空間沒有了,我也搞不清到底是什麼占了這麼多空間,難道vs安裝包内置了島國高清電影? .net類庫也越來越大,微軟恨不得把所有東西都給塞進去,可是絕大多數東西,我們都不需要啊!有多少人需要工作流設計器?

相比之下,linux的安裝包則小了很多,一個類庫小則幾十kb,大的也就幾兆,沒有必要一股腦把一堆用不着的東西都裝上去,需要的時候裝一下不就可以了?這也是linux的哲學,一次隻做一件事,并且把它做到最好。lxml,urllib, grep, awk, vi, top….

程式設計我們講求高内聚,低耦合,我覺得類庫和工具也是一樣。盡量讓類庫之間減少依賴,讓所有的類庫都引用公共基類庫是一種笨蛋行為,你看似構造了一個漂亮的樹型依賴圖,結果大家誰也離不開誰,臭不可當的一大坨。自己倒是爽了,可是讓别人怎麼重用你的類庫?給别人代碼的時候,還得拖家帶口一大堆?純粹給人找麻煩。

造輪子乃是程式員最喜歡的事情,以前我很有造輪子的習慣現在慢慢的改正過來了。對于沒有什麼技術含量的事情,何必去造輪子?有這些時間,還不如去學習基礎理論或者研究牛逼的源代碼。而對于有難度的事情,比如自己實作一個正規表達式引擎,倒是很值得實踐的。

好想重裝系統,再也不裝vs。

先聲明一點,兩者都很好,兩者融合也能工作的很好,無非是更偏向哪一端的風格問題。面向對象很嚴謹,是靜态語言的天下。函數式語言絕大多數都是動态語言。

面向對象雖定義了完整的限制和結構,但客觀上也限制了類庫的靈活性,讓類庫隻能在本身的資料結構上工作。另外,建立對象的成本是很高的,對性能要求很高的場合,生成一個對象要花費不少計算機資源,重載函數更是性能殺手。這也就是為什麼,高性能的函數庫一點都不oo。

函數式更加純粹,它把問題都看成過程(函數),更符合數學的抽象性。少了”對象定義“的束縛,函數式語言可以玩的非常溜。

類庫解耦的好處很多,當然有人會問,沒有公共的資料結構,不同的子產品之間怎麼通信?寫一個互動的中間件不就可以了麼?或者,使用公共的資料結構,字元串,json或者xml。在學習了lisp,尤其是讀了《計算機程式的構造與解釋》之後,更是颠覆了自己的三觀,為什麼lisp如此強大,一個重要的原因是它的資料結構和代碼都是一種東西:s-表達式。大神說:寫100個針對同一個資料結構的算法,遠遠好于10個針對10種資料結構的算法。

鍵盤之道:分享三個月中的思維改變程式設計語言界面 or 文本高大全 or 單純可依賴面向對象 or 函數式接口限制 or 測試限制靈活簡單不偏激

沒事去搞搞sicp的習題吧,挺好玩的。

肯定有人會問,動态語言,類庫間高度解耦,而且還是函數式風格,那麼,怎麼去定義限制?

在c#或者java中,我們通過基類和接口來限制對象和程式員的行為。這很好,但你依然不能避免被隊友坑掉,還是不能保證他在重載函數中做了什麼腦殘的事情。接口限制最蛋疼的事情,莫過于發現還需要添加一個新的成員,就不得不在所有實作該接口的類中添加成員,這種事情我們屢見不鮮了吧?最後,還得寫一大堆單元測試,來保證行為一緻。

反而,測試限制給了另外一種不錯的限制形式,不關心内部是如何動态實作的,隻關心對外的測試能否通過,這樣就一舉解決了動态語言不夠”硬“的問題,不使用硬接口的好處很多,此處就不再贅述了。

懶得寫單元測試?呵呵。

現如今,我們希望一切都簡單簡單更簡單,能用三行實作的代碼,就不用五行實作。空出來時間,多學點知識,多出去度假吃好吃的。不給自己和别人挖坑。

看了《程式設計語言實作模式》後,以後再也不去争論什麼語言是最好的語言了。什麼語言都有最适合它的地方。資料分析有r,數學計算有matlab,企業級開發有c#和java,web開發有php。雖然現在主要用python, 但并不妨礙我c#比很多人玩的溜。哪天受不了python性能不好,就用c重寫一遍嘛;如果新需求,通用語言用起來不夠爽,那我們就造一種語言來描述嘛。

覺得語言和平台間的互動很複雜嗎?那是因為你的系統設計的不夠好,而且目前解決互動的技術一抓一大把。追求一把錘子解決所有問題的思維是不好的。現在雲計算和高性能計算大行其道,即使同一個子產品都會被分拆到不同的伺服器上實作并行計算。分割要比集中好很多。靈活地選擇技術方案,穩定幹淨的代碼,面向服務,測試限制而非接口限制,簡單可依賴。原來程式設計世界非常的精彩。

不yy了,說句實話,三個月下來,變化還是有的,趕緊幹活吧。

繼續閱讀