本文對比了C語言和Python語言,分析它們作為編程入門語言各自的利弊,并給出了我推薦的編程學習道路。
我本身已經入門了Python腳本語言,在進階C語言和JAVA語言后,Python重學就輕松很多,幾個小時就拾起了忘記的語法,剩下的幾天則學習《Fluent Python》、《Python Cookbook》和另外幾本進階的書。Python融合了諸多編程語言的特色,內容不少,但也算容易理解,我把這幾本書來回切換著看,現在基本上算初步掌握了。如果按照我之前的構想,下周學習一下標準庫,看幾個開源文檔的源代碼,同時打上千行代碼,也算Python小成,可以學習其他讓人早衰的知識了。
然而,在Python的整個學習過程中,我總覺得不太舒服。Python的語法寫起來太簡單了,在寫慣了C語言的我看來,它花樣太多,而且寫起來不動腦子。
我在入門編程時,在網上看到過不少人的討論,其中主要就是辯論C語言和Python誰更適合入門的問題。作為一個兩條路都走過一遭的新手,我跟大家分享一下我對這兩門編程語言的理解。
首先讓我從一個例子出發,對C語言和python語言做一個比較。我把編程的過程比作炒菜的過程,那么不同語言的程序員是怎么做出一道同樣的菜呢?
作為一個C語言工程師,你需要做以下的流程:你需要先在小本子上規劃好炒這道菜的所有原料,查看哪些食材是家中有的,哪些食材是要去購買的。
在決定好購物清單后,你就要想該去哪里買,是樓下的小賣部呢,還是幾公里外的農貿市場,在思考過交通、食材質量、價格等諸多變量后再得出答案。
隨后,你在市場挑選食材,跟老板討價還價,然后拎著份量不小的一大堆東西回家。
回到家后,你把食材洗好切好,決定好配料的用量,然后左手翻著菜譜,右手惦著鏟子炒菜,滾熱的油滴時不時濺到你的手上,冒出淡淡的青煙。
炒完菜后,自己轉盤,然后把尚有余溫的鍋刷干凈。
吃完后,自己把碗筷洗出來,專門下樓把廚余垃圾倒掉,因為它們容易腐敗。
回到家后,躺在床上,累得如尸體一般,不想動彈。
作為一個C語言工程師,沒有人會幫你。準備這道菜的所有流程全部是你自己完成的,你需要處理好一切事情。
但如果你是一個python工程師,那就太輕松了。Python的標準庫和外部庫就像是“海螺姑娘”,看到你需要食材了,就“啪”地在你面前憑空變出一堆質量很高的食材,還是切好腌好了的。
在很多情況下,你甚至不用動手炒菜,把食材收拾到一個“python魔法鍋”里,蓋上鍋蓋,這個鍋就會自動幫你炒好。
你帶上手套優雅地裝盤,用刀叉使用完畢后,直接把它們丟到洗碗機里去。
廚余垃圾由”海螺姑娘“自己收拾。
吃完一餐,神清氣爽,甚至想再吃一次。
C語言和Python語言最明顯可見的差別,那就是代碼量了。C語言是上古語言,那時編程的絕對主體就是很懂計算機的程序員,特別歡迎復雜但實用的工具,因此C語言一出生就頗為硬核。你不僅需要自己決定好程序的邏輯結構,還要規劃好變量的類型聲明、賦值,想好在哪些代碼應當被編譯,更要對計算機底層的硬件具有充分的認識,才能處理好指針和內存分配這幾些強大的工具。編程語言的發展軌跡基本上就是“懶人化”,越往后的語言一般就越“軟核”,Python的出生日期不僅比C語言晚了20年,比C++這門對象設計語言也晚了10年,語法簡潔程度可想而知。Python本身是類似于Lisp的一門抽象語言,它自動會處理好一些繁瑣的東西,讓程序員去專心思考問題,而不是花那么多時間去打代碼。因此,要想完成同樣一個任務,假設python語言需要寫N行,那么C語言則一般要寫10N行。
說句實話,如果讓我把C語言和Python語言擬人化的話,那么C語言就是手持巨劍、肩披重鎧、背背強盾的大武將,一舉一動都有宗師氣象,而Python則是衣著時尚、手持Ak47步槍的小青年。C語言雖然又帥又威猛,打代碼的手感不要太好,但如果論起功能強大和拓展性來,Python手里的步槍可就比大劍強太多了。
長江后浪推前浪,一浪更比一浪強。
總結一下,Python在拓展功能、語法簡易度上都比C語言強太多,那么許多人可能就想:既然如此,我何必要學C語言找罪受,Python我可以!此言差矣!
讓我們回到之前那個炒菜的例子。Python語言能讓你少干許多事,這個自然很好,但它會讓你養成懶惰的壞習慣,不去學著做菜。假如有一天海螺姑娘走了,魔法鍋砸了,你也就無計可施。相反,雖然C語言工程師每炒完一道菜都要汗流浹背渾身乏力,但ta在學習的過程中不斷積累經驗,不僅會挑選食材了,而且也會掌握配料的處理了。不斷練習,必將成為一代大廚!
明白了把。此時你是一個立志于成為“名廚”的新手,如果太依賴于Python自身強大的功能,很可能就患上依賴癥,最終啥也不懂。而學習C語言雖然痛苦,但能夠幫助你理解更加深入的東西,如果配合閱讀其他書籍,不僅知道怎么編程,更“知其所以然”,知道計算機是怎么執行這段代碼的,這個對人的提高就要大很多了。編程領域有個詞叫“造輪子”,意思就是拒絕使用已有的、成熟的功能,而要自己重新寫一個出來。造的輪子越多,你的編程能力就越強!
此外,C語言是許多語言的祖師,C++、C#不必多說,Python本身就是由C語言所實現的。學過C語言后再學Python,你就會有一種“柳暗花明又一村”的感覺:你可以用C語言來解釋Python語言的整個結構了。不僅如此你對Python的理解會更加深入,而且你能夠自己用C語言拓展Python的功能,甚至自己寫出一個編程語言。這個對Geek的誘惑實在太大了,我自己也很興奮。
雖然用Python寫小項目時的體驗感是無敵的,但由于Python語言架構本身的某些問題,Python程序在大項目中的表現還遠遠趕不上C\C++。目前,C\C++\JAVA\C#等仍然是大項目開發的基本語言,隨著硬件性能的發展,Python與它們之間的性能上的差距會縮小,但仍然有較大差距。
總結一下,Python語言雖然非常簡潔,但容易使人懶惰。假如你是一個對編程有追求的青年,學習C語言并不斷“造輪子”則對個人的成長更加有幫助。
注意,我不認為Python的“懶人化”是完全不好的,全世界的著名黑客都喜歡Python語言,目前絕大多數互聯網公司的工作語言也是Python語言。Python能夠幫人省掉很多不必要的程序優化時間,但是作為一個新手,你不能偷懶,要自己去做這些事情,不練習你就沒辦法提高。
現在是互聯網時代,掌握一門編程語言能夠讓你擁有更多的機會。如果讓我給大家推薦入門語言,我會給大家推薦這樣的道路:新手入門,必學Python。這時候你啥也不懂,一些基本的Loop和Control Flow 都不懂,此時就可以利用好Python語言語法簡單的特點,學好一些基本的概念。等到你完整讀完一本Python入門書了(可以不做習題),那你的新手階段也可以算基本結束了,進入一個分水嶺。
如果你覺得編程很無聊,而且目前沒有什么用得著Python的地方,那么你可以放棄了,不必再做后續的閱讀。
如果你覺得編程也挺無聊,但學習Python可以幫助自己做一些生活中的小事情,那么你可以專門走Python的路線。
首先,重讀那本你已經閱讀過的入門著作,或者更換另外一本不錯的入門書,完成半數以上習題, 隨后開始進階內容的學習。
進階內容就要難很多了,你會發現自己啥也看不懂。給你兩個字:堅持。編程的學習是講究循序漸進的,每一次學習都難免需要其他知識作為鋪墊,正如學習如來神掌首先要從最基礎的羅漢拳學起。你專門走Python這條道路,跳過其他的很多內容,走火入魔,自然就要承受零基礎讀進階內容的后果。此時你可以上網去尋找一些信息,效率挺低,不過也能解決一些問題。
如果你沒有堅持下來,不要責怪自己,逆天而行總是困難的。如果你強咽下一口血把這本進階書讀完,那請你把這本大概800頁的書再讀上至少兩遍,書中的所有程序至少碼兩遍。然后,請你讀下大概1400頁的Python3標準庫。然后,請你上開源平臺上看看一些比較有名的外部庫,學習下它們的代碼。
等到你把這幾步全部做完后,恭喜,你才剛剛入門python而已!Python的語法雖然學起來簡單,但內容太豐富,水不是一般的深。從新手到入門,學習效率高點大概2個月就成。但從入門到精通,恐怕就需要幾年的實踐經驗了。
當然,如果你走這條路真的達到精通python的境界,我當然會很欣賞你,但欣賞中又會帶點小小的不屑:“哼!旁門左道,非我族類!”單學編程語言不學計算機科學,就如7歲小孩持有倚天劍,雖然在平常生活中可以斬金削鐵無所不能,但因為沒有內功,碰到強敵就完蛋。我甚至懷疑,是否真的有完全不學習計算機科學的編程大神存在。編程生涯中那么多坑,你總得學點其他的東西吧。
如果此時你對編程有了一些興趣,覺得編程是很好玩的事情,恭喜,你成為了命途多舛的Geek。
大概就是這種感覺
上面說過,由于需要許多知識做鋪墊,python進階就困難了不少。如果你仍然堅持學習Python,你就能可能遇到你進步路上的第一個瓶頸。
此時我給你的建議就是:學習C語言的吧!C語言真是好玩的語言,一套流程走下來獲益多多。本來C語言新手入門是比較麻煩,但如今你已經在python中走過一遭,許多各語言共通的特性已經知道的差不多,如果配合好書,C語言入門也不算太難了!
C語言不僅該入門,而且值得進階。學完C語言后,就該接觸面向對象的語言了。我個人學過JAVA語言,但推薦你學C++語言,不僅因為它一脈相承于C語言,C++語言的特性要比JAVA多,更重要的是C++圖書的質量要比JAVA的不知道高到哪里去了!
C++入門即可,然后就可以反過頭來學Python。在C和C++語言的鬼門關中走過一遭后,你會驚訝地發現,曾經天書一般的Python進階書竟然是這么容易理解。你可能走上Python工程師的道理,但也沒準會跟我一樣,學過一遍后反而“C語言一生推”呢!
為什么說你”命途多舛“,是因為走程序員這條路,有死無生!要想有更加廣闊的視角,你就必須學習計算機科學,必然要學習算法、編譯、操作系統、計算機系統、網絡等等一些基礎知識,各個水都深得很。這個需求是客觀的,你學著學著語言,看著某本書,忽然就會沒有某些知識就沒法繼續學習下去。等到基礎掌握完,你可以選擇一個領域深挖下去,搞一個呈正態分布的知識體系出來。當然,十年也已經過去了。此生此世,乃至哈諾塔謎題結束,你將永遠學習下去,一刻不能脫出!
寫完這篇文章,果然舒服很多,比起打代碼來,打拼音簡直是種享受。學編程越多,我就越想將學一輩子。
嗚呼!吾生也有涯,而知也無涯!愿我能夠更加聰明,能夠接著玩下去。