標籤:

使用 Python 會降低程序員的編程能力嗎?


當土著拿到獵槍之後,他們射箭的技能退化嚴重,但因為食物更多了,廚藝有了長足的進展。
當你不再為一些問題擔心之後,你就可以把注意力集中在另外一些問題上了。這就是選擇不同的編程語言的根本差別。


首先樓主不知道知乎就是Python做支撐的么?
以前我是一個Linux/C 程序員,後來我自學了Python,工作中利用Python做了一個支撐4000萬日活躍用戶,每天40億條數據的系統。其中需要高性能的模塊是用C的。
來點乾貨,Python中包含了許多從軟體工程和實際應用都會遇到的問題。
面向對象?沒問題,Python雖然不象Ruby萬物皆對象,但是動態語言一些本身特性如鴨子類型,讓你忘記還有多態,繼承?太簡單了,甚至還可以多重繼承。封裝?每一個文件都可以看作一個類,還有比這個更贊的么,你甚至可以不用關心什麼是命名空間。
如何管理依賴?pip和virtualenv加wheelhouse打離線包,代碼可以直接發布,媽媽再也不用擔心我管理依賴了。
如何發布代碼?fabric,一條命令,所有機器都執行,還要再簡單點么?
非同步系統?tornado是工業級的非同步web伺服器。
Web系統搭建?如果你是做java或者PHP什麼的,基於類CGI的發布太簡單了,paste.deploy可以讓你輕鬆構建uwsgi的web,中間健?寫個認證模塊太簡單了,在web介面層外部就隔離非法數據。
單元測試?webtest模塊讓你輕鬆離線測試web介面,根本不需要把代碼部署到伺服器,通過HTTP返回了,是的,離線的web測試。
Mock測試?stub模塊,讓你在Python的依賴層面注入stub。

以上這些,早已經脫離語言本身的範疇了,可是我都是通過Python 學來的,任何地方都可以借鑒?


會。

十年前,Pascal。我會精確計算每個數組和變數使用的內存,熟練地用非遞歸方法改寫程序,最短的時間內自己實現各種排序,多源最短路徑,求凸包和相鄰點,動態規劃,二分圖匹配和網路流演算法等等等等,同時考慮演算法的最壞複雜度和最高項前邊的那個常數。現在,我一個都不記得了是的現在列舉這些名詞我就是在裝逼。

五年前,C。我會自認為炫酷的使用函數指針,強制類型轉換,goto語句,宏來實現各種技巧(他喵的全是Linux kernel害的)。我掙扎在多線程,多進程和各種鎖。我試著照ICC出來的彙編改程序。但你讓我不看書寫個紅黑樹出來我是做不到了。現在,你突然讓我寫個C程序我得想一下語法。(所以這裡我還是在裝逼。

現在,Python。寫之前習慣性搜一下有沒有現成的庫。不會自己去實現圖的數據結構了,因為有NetworkX。不會自己去處理網路通信了,用Redis搞個發布訂閱機制或者乾脆實現個ReST服務都沒幾行代碼。多線程?Gevent搞非同步多簡單速度還比你快。

我變笨了。


但是。


十年前我只能刷刷USACO和浙大同濟的Online Judge。AC是最高目標。
五年前我只能寫寫自己用的小軟體系統驅動什麼的,或者通宵寫個大作業。
現在我在研究用Evolutionary Optimisation在雲平台上調度Scientific Workflow。

會什麼幹什麼,你覺得哪個重要?

======
感謝 @徐釀泉的意見。

我的意思並不是說因為用這些語言所以在干這些事兒,而是確確實實感覺到這些年自己的編程能力(或者說基本功,因為畢竟很多高級的技巧我也會的越來越多)在下降,而且我認為這和我用的語言越來越高級是有一定關係的。當然語言和做的事之間完全沒什麼必然關係。但是以前的水平高又怎麼樣呢?做出來的不過是沒有人關心的玩具罷了。即使能力值降低了,不過既然現在在做也可以做更有意義的事了,誰還關心跑分呢。

日,我發現語文能力也下降了。。。
======
呃。。我又換Clojure了。。。
呃。。我又換Haskell了。。。


用任何語言都會降低你的編程能力,只要你以為這門語言就是編程的全部了。


決定你編程能力的只有你的思維模式,而不是一門工具語言。

七年前我開始玩Python,因為身邊的一位大神每天都在玩Python。然後我就想,我該怎麼快速掌握這門語言?

  1. 快速的瀏覽官方文檔,編譯,玩一下quick guide
  2. 再鎖定了一兩本書。很簡單,Google一把「Python最好的入門好書推薦」。找到了「Learning Python", "Dive into Python"等等
  3. 不管是否讀懂,花一個月時間讀兩遍,找到感覺
  4. 搜集任何的可以加入和Python相關的discussion group, 論壇,訂閱郵件,收集任何和Python有管的博客、技術站,利用茶餘飯後的時間找到任何不懂的技術討論深入研究
  5. 找到機會在一個新的項目里大展拳腳,摸索的從頭寫一遍
  6. 最後一步,讀完了Tornado的源碼,做了一堆筆記
  7. 遇到任何一個用到的Python框架,lib,看到任何新奇的用法,只要不懂,就翻完背後的源碼,總結那些優美的實現方案
  8. 零碎的時間關注Python的動態,優秀的案例,好的模塊,好的生態解決方案
  9. 不放過任何一個「驚訝點」。好奇是了解這個世界的大門。當看到任何框架里很magic的地方的時候,挖出背後magic的root.

找到適合自己同時所有能找到的方法去快速了解並熟悉一門語言,然後,不斷的把一門語言以及這麼語言生態的優點應用到其他領域:

  • 接觸Java,安裝JDK第一個跳出腦海的,就是我知道Python有pyenv,所以,Java有沒有解決pyenv同樣問題的方案,然後找到了jevn
  • 研究Play framework, injection,我腦海里跳出的是Python decorator,同時因為我清楚decorator背後實現的細節,按照同樣的思路研究了injection背後的細節
  • 寫Go代碼,我清楚Python里的 模塊初始化 邏輯,以及,Celery這種著名的框架如何應用模塊初始化去完成很magic的變數初始化,我找到了Go比較接近的實現方案
  • 我非常清楚Python裡面,大家應用「魔法函數,__get__, __set__, __metaclass__等等」所創造出來的設計模式,在了解新的語言的過程中,不斷的找到相關的知識點,並對比語法之外實現的不同和優缺點
  • 所讀的Tornado源代碼,讓我清楚的看到如何寫一個漂亮的epoll網路庫

找到語言的場景,然後不斷利用已有的知識和場景,快速的適配新的場景,這是創造新知識的關鍵,也是學習的關鍵。

如此往複,當你接觸的場景越多,你會發現,TMD計算機和各種語言和框架,都只是在玩玩特定場景下的0和1!

最後,千萬別糾結任何編程語言,找到一個自己看的順眼的,把它搞透,變成自己的武器,然後,大學裡的那些基礎(操作系統,數據結構,網路知識),才是最重要的,這些,決定了你工作7,8年以後計算機知識的高度。

========================================================================

http://weixin.qq.com/r/tDhudnrENSdKrT4V922m (二維碼自動識別)

最近在寫公眾號,有興趣的可以關注我的公眾號:FangTalk


雖說不能絕對化,但是不同語言的社區訓練出的程序員的能力側重點還是不一樣的:

1. C 程序員對於內存管理,計算機體系的理解能力;
2. C++ 程序員對元編程的理解能力;
3. Java程序員對於OO和設計模式的理解,對規模項目掌控的能力, 對虛擬機實現理解的能力;
4. Ruby程序員創造Web應用的能力;
5. Python 程序員在小中型Startup中應對各種問題的能力;
6. Javascript 程序員研究顛覆同行對Web交互認知的技術的能力;


開門見山的說:不會。

首先,什麼是編程能力?

演算法嗎?數據結構嗎?操作系統嗎?是對語法的熟練程度嗎?是源碼的閱讀量、代碼的編寫行數嗎?搭個網站算是編程能力嗎?

都不是。

編程能力是在遇到實際問題後,將問題分解、剖析、解決的能力;說穿了,就是知乎上已經說過無數遍的:解決問題的能力。

把編程能力做個拆分,大概是:

演算法能力:對已知問題進行數據結構和演算法的設計能力
語言能力:用特定編程語言實現已知演算法的能力

從中又可以衍生出代碼風格、抽象能力、語言理解、工具使用、工程能力。

但這些能力,無論如何匯總拆分,都是在解決問題。

Python影響到你解決問題了嗎?我們先看一下Python的語言特性。

Python的特點是什麼?

Python的有點有什麼?

簡單————Python是一種代表簡單主義思想的語言。Python的這種偽代碼本質是它最大的優點之一
易學————就如同你即將看到的一樣,Python極其容易上手
高級語言————當你用Python語言編寫程序的時候,你無需考慮諸如如何管理你的程序使用的內存一類的底層細節。  
跨平台————你可以在多個平台上進行使用。
面向對象————Python既支持面向過程的編程也支持面向對象的編程
可擴展性————可以將部分程序用C或C++編寫,然後在Python程序中使用它們
可嵌入性————你可以把Python嵌入你的C/C++程序  
豐富的庫————Python標準庫確實很龐大 

Python的缺點呢?

強制縮進————Python程序員必備遊標卡尺
運行速度————相比某些語言算是黑點之一

Python的特點影響到你能力了嗎?

看完了Python的特點,我想沒有人會覺得這些影響編程能力吧?

是的,Python運行慢,但是Python寫得快,兩相權衡之下,我認為並不成為無法解決的問題,更不知與影響編程能力吧?

那題主的意思到底是什麼呢?

我略帶惡意的揣測一下:

Python語法簡單、現成的輪子多,也不用接觸一些很底層很燒腦的東西,這就讓你的能力下降了。

但是問題就在於,就算我壓根不懂C語言,我不明白什麼叫指針,我不會自己造輪子,但是我能用Python把問題解決呀?

你用著所謂「能夠提高編程能力」的語言,花了一天時間寫出來的代碼,我Google到一個現成的庫,不到半小時搞定了。

你告訴我這影響到我的編程能力了嗎?

任何語言的使用都是有場景、有目的的:

我用Python,目的就是最快的搞定某件事

我用C,就是為了更底層、更優化

我用Java,就是看上了它的庫

我用PHP,就是....就是....就是為了用最好的語言啊!

跟編程能力毛關係都沒有啊!


作為一個做科學計算的碼農,這裡必須答!不會

首先我們來定義一下什麼叫編程能力。私以為應該同時包含兩個部分:寫代碼的能
,以及演算法、數據結構設計能力

從小學四年級開始學QBasic,到中學學Pascal和C,本科時一發不可收拾,干挺C++、Java的同時搞定Obj-C,讀研前又很快的掌握了Python,最近又學了Swift,用過這麼多語言的唯一感想只不過是一個高級語言除了區分是對象化的還是過程化,其餘什麼的區別不大,它就是個語言而已。用QB同樣可以寫個平衡樹,C沒有STL的話要用到的功能自己寫一遍就好,也不會太複雜。

Python是個解釋語言,同時還是個語法自由度相當大的語言,這就意味著寫程序時絕大多數錯誤是只有當你的程序跑到出錯語句的時候才會提示出來的,這一點與其他編譯語言差別非常大,以至於當你用Python寫個不太小的玩意時,必須有非常清晰的概念、對語言和對程序流程的掌握。Python里任意變數都是對象指針的設計,使得編程的人必須了解解釋器運行機制。從這一點看,Python對於建立編程概念,了解程序運行機制是有很大幫助的。比起無腦Debug-Watch,縝密的思維以及看著代碼就能準確分析運行情況的能力,更有助於寫出優秀的代碼,也是對代碼能力的鍛煉。

至於演算法能力的鍛煉,與語言本身毫無關聯,Python相比C++一輩最大的好處就是在編程之時不需要為諸如變數申請之類的問題操心,可以更加流暢地實現心中所想。我喜歡用Python做演算法和思想的驗證,就是因為省事,學習、理解演算法,甚至設計新的演算法,重要的還是個量的問題。思考夠了,就要迅速實現,然後嘗試更多方案。因此,Python這樣一個編程省時的語言是提高演算法能力的好工具。

總體來說,無論寫代碼能力還是演算法設計能力,都是靠多寫多想來鍛煉的。Python會不會降低編程能力,也就看會不會減少你寫和想的機會。

老一派的程序員可能會覺得Python這種玩意有大量模塊,很多代碼不用自己寫,減少了寫複雜內容的機會。事實上是一個程序好不好並不是由手寫快排或者捏個平衡樹之類的玩意確定的。面對有STL的C++,你還會蛋疼到為了排個數組而寫快排么?中學時我能把Splay tree背得滾瓜爛熟,10分鐘能用Pascal敲400來行寫一個Splay tree,但是那又如何?單調重複的代碼背下來寫一萬遍並不會提高編程能力,甚至算不上多寫。相反,現在別人都造好了輪子等你來用,一方面能更快實現目的,同樣的時間裡你能寫更多的不同的程序,另一方面能針對自己的需求對輪子進行改造,有信心的話把個輪子改造成直升機螺旋槳都不成問題。Python給予了更大的創造的空間,與多寫多想並不矛盾。

非要說Python的問題,那就是執行效率了。不過好歹效率還沒差出兩三個數量級,做做原型啊思想驗證啊什麼的,效率也不是最重要的問題。原型驗證了,有繼續開發的價值,影響效率的部分用別的語言寫一遍編譯一下就好了嘛!Python就像畫速寫和素描,或許比不上油畫,後續最終不能掛上畫框開展覽,但一定是鍛煉基礎的有力工具。

要明白一點,編程並不是搬磚的活計,不把自己當藝術家,好歹也要當自己是個工匠,而不是個苦力小工。


謝邀~ 使用Python並不會降低程序員的編程能力,但是會降低「程序員」的從業門檻

這些新設計出來的高級編程語言啦、更易使用的工具與庫函數啦、各種開源的項目啦,甚至是易於攜帶的計算機,都是在砸我們程序員自己的飯碗呀!在此,我呼籲廣大程序們攜起手來,共同抵制高級編程語言、抵製圖形化界面、抵制滑鼠、抵制家用電腦!!!!

為了進一步提高程序員的編程能力,提高程序員的入行門檻,我的提案如下:

1) 成立「程序員協會」(The Global Programmer Association) 簡稱GPA。任何IT從業人員必須通過由GPA組織的「程序員資格考試」,拿到程序員執照。

2) 只有CS School 的畢業生才有資格參加「程序員資格考試」!對,你沒看錯,「系」什麼的太小了,我們要成立「學院」 (School)!作為「IT職業的守門人」,GPA對CS School 的質量有嚴格的要求,只有GPA認證的CS School 才有資格授予CSD學位(Doctor of Computer Science)。對的,你沒看錯,我們也要設立一個單獨的學位!

3) CS School 只招收有本科及以上文憑的學生,學製為三年,每年學費至少3萬美金!

4) 「程序員資格考試」 每年舉辦一次,由GPA委任的「程序員考核委員會」 (The Board of Computer Science Examiners) 主持,一次通過率控制在50%以下。考試由三部分組成:1. 徒手製造CPU 2. 機器碼Debug 3.紙帶打孔編程 (如下圖)

5) (經評論提醒,引入此條款)每位CSD,必須在一線IT公司實習至少三年,才可以申請由GPA組織的「程序員資格考試」,成為一名光榮的、正式的

5) (經評論提醒,引入此條款)每位CSD,必須在一線IT公司實習至少三年,才可以申請由GPA組織的「程序員資格考試」,成為一名光榮的、正式的程序員!!!!

就醬!希望廣大程序員們投我一票!!!!
。。。
。。。
。。。
。。。
現在再回頭看看,是不是覺得Python也沒有那麼討厭了?


我主要使用的編程語言有c/c++/python/java,除了python都參與寫過萬行以上的項目(python沒有是因為解決問題根本用不著1w行:)。個人還是很喜歡python編程的感覺,可以將注意力集中在邏輯實現而不是細節實現上。


編程能力是什麼?解決現實世界問題的能力。在這個層面上,選擇什麼樣的語言和框架都不重要,你的編程能力是找到並實現solution的能力。

我們做軟體的人,大部分實際上就是在做工程(Engineering),做工程說白了就是不斷累積相關的行業經驗,這跟用的語言關係真不大。在一家使用Python做web app的公司里,你可能永遠也學不到遊戲開發的知識,但你能說他的編程能力弱么?換句話說,你覺得google出來的Python工程師的編程能力弱么?

做底層開發的沒有什麼好驕傲的,你了解的也就是你那個行業的知識。作為一個Embedded appliance/system從業者,我跟你說High Availability, CPU exception handling,Hot patching絕對能把你侃暈。但這能說明我C的編程水平比你的Python編程水平高么?


我見過在C++上搭建靜態代碼生成機制讓語言寫得象python的,也見過用python寫出來的代碼比C++還象C的。其實選擇語言,正確運用語言的特性才是最重要的。
我是遊戲程序員,引擎是C++寫的,工具是C#寫的,寫過vba的書,玩過lisp和python。我覺得編程語言的根本機制只有兩種就是C代表的有限狀態機和lisp代表的形勢變換。所有語言都在這兩者之間進行折衷。


不會,軟體工程師至少要包括程序設計和程序開發這兩項能力。程序的設計與開發實現更重要。

1. Python有大量的開源庫值得我們去學習,你會學習很多很靈巧的設計方法和設計模式;
2. 編程能力主要體現在將複雜問題簡單化,簡單問題模式化的能力。
3. 關注Python,因為她非常乾淨優雅,並鼓勵清晰易讀的代碼,易學易用。
4. 與C結合緊密,但需要你對軟體的模塊劃分更加合理、科學,將C的效率和Python的優雅有機地結合起來。
5. 最後,每種語言都有優勢,C,Java,Python/Ruby,一個好的軟體工程師應該兼收並蓄,不應厚此薄彼,這樣才能你的能力才能提高!


除了冒號和分號,暫時沒發現有什麼影響,反而降低了對難看代碼的容忍程度


我覺得恰恰相反。python最大的好處是本身很接近自然語言,你基本上不用考慮語法細節,無論是寫代碼還是讀別人的代碼,大部分注意力可以放在代碼邏輯上。一葉障目,不見泰山。如果糾結於語法層面的細枝末節,就很難看清全局。

我讀python代碼,感覺像讀英文,豁然開朗。讀其他語言的代碼,在腦子裡還有一個從代碼到邏輯翻譯的中間過程,感覺效率低些。不知道是不是只有我這樣。


編程不是為了寫代碼而編程, 而是為了解決問題而編程.
基本上語言有幾個典型, 不完整, 隨便一說
1. 機器語言, 彙編
2. 圍繞機器設計, 給人用的語言, C
3. 圍繞給人用設計的語言, Python, Ruby 等

你用 Python 之類的語言, 實際上是把更多時間花在了 "編寫程序" 上, 而不是糾結跟 "機器對話" 上.

Python 自詡的 "效率", 是說他雖然運行的慢, 但是寫得快, "編寫+運行完成" 的時間少於 C 語言這種寫得慢運行得快的程序的時間, 也是一種效率的提升. 這裡不能體現能力嗎? 我不認為.


我只想說,彙編的出現,極大降低了人類直接處理二進位的能力,比如打孔紙帶。十惡不赦!!!
打孔紙帶的出現,極大降低了人類通過走線和撥開關操作計算機的能力!!!
簡直是背叛。


用一把利劍會降低你的武功嗎?
用玄鐵重劍會降低你的武功嗎?
用木劍會降低你的武功嗎?

同樣的道理,用python會降低你的編程能力嗎?
用c++會降低你的編程能力嗎?
用java會降低你的編程能力嗎?

編程能力和你用什麼語言,沒有直接關係。
親眼見過用excel開發的遊戲和網站原型。
你若足夠牛逼,光寫偽代碼也可以了。


不編程才會降低自己的編程能力


我覺得不會,編程能力不是由編程語言決定的,現在機器的性能越來越強,沒有必要去算計那麼一點點計算性能,我是從c/c++轉到python來的,python給我的感覺就是我可以更專註於我的目標和自己的感受而不用花大把的精力去考慮機器的感受。一句話,我是電腦的主人而不是僕人,我的目標是更快的解決問題或實現創意,在這個前提下再去考慮機器的性能。


推薦閱讀:

對 Quant 而言 Python 的需求高嗎,除 C++ 外還有哪些流行的編程語言?

TAG:Python | 編程 |