應該向 Web 開發初學者推薦 PHP、Python 還是 Ruby ?理由是什麼?

或者說應該推薦什麼語言 / 框架?

我們學校某協會想辦個網路開發講座,不可避免地要涉及到伺服器端語言 / 框架的選擇。我覺得 PHP 作為一種語言不如後兩者系統化,而且 Rails 是非常方便的;

但作為從 PHP 學起的開發者,又覺得少了 PHP 這種相對較容易上手、每個文件都是一個模塊的方式,直接上 MVC 可能會有點難於理解。而且國內提供的伺服器支持 PHP 的居多,其他的則偏少。至於 Java web,.NET 等我們不打算考慮。

不知各位對這個問題有什麼意見?


看到這個熱烈的討論, 想談一談其他的觀點, 希望think out of box

我在06年左右開始放棄自己十多年的C++轉python, 當時我和周圍的C++程序員聊, 大家都是"呵呵", 沒有真的用的. 如今我有機會見到當年的老同事, 他們都或多或少是python的用戶, 這讓我很欣慰.

我想要講的, 就是這個世界的另外一面. 我們必須承認, C C++ 和 Java的用戶遠遠多於 php python 和 ruby的用戶, 這些用戶其實完全不在乎社區聚會, 有的完全不了解web開發, 甚至有的連open source都沒有聽說過, 更別談hacker精神了.

同理, 我相信, 用這三種語言開發web的用戶, 肯定是php最多, 如果是ruby或者python, 我還是覺得ruby用戶多一點. 可以不靠譜的說, 用ruby的用戶就是rails用戶, 但是在python世界中, 情況完全不一樣.

我曾經和一個朋友聊天, 我說我是python開發者, 他說他也是. 我問他你用什麼框架開發? 他說他從來都不玩web, 他只知道用python開發自動測試腳本...

不可否認java, php, ruby和python是因為web開發水漲船高, 同樣的情況發生在objc和iOS的關係上. C和硬體開發, Java和企業級, 造就了那些編程語言的統計排名的區別. 但是真正在廣大的現實生活中找一個C++程序員, 你有機會遇到一些學技術只是混口飯吃的人, 當然他們的C++水平大大的高於你的水平, 只是他們完全不存在互聯網世界.

在談談最後這幾種語言, 實際上需要談的也只有ruby和python這兩種

ruby以web流行, 現在開始跳出這個框子, 進入到其他領域, 比如homebrew, watir. 同時我們不得不承認rails已經開始臃腫, 很多人開始轉向ruby的其他微框架.

我的觀點是, ruby語法很優美, 幹活很快. 但是它有沒有幫助工程師解決很多本質的問題? 很多人通過rails學會使用jquery. 沒錯, 通過gem, 但是在這樣的快捷方式安裝下, 他甚至不知道jquery的js文件放在哪裡. 我沒有時間去仔細研究rails給出更多的例子, 但是無論從rails的教程, 還是視頻, 幾分鐘做一個博客... 都可以看出他們用"簡單"作為營銷方式, 讓新用戶跳進這個坑, 後來才發現坑有點深. 這與微軟的開發技術很像, 用visual studio這樣豪華的編輯器, 告訴你滑鼠點點就能編程, 可惜結果完全不是這樣.

這個很值得同行學習, 我在向朋友推薦技術的時候, 也發現了這樣的問題, 告訴他們這個簡單, 是大多數人學習的動力. 當年Java不也是那麼吹的, 結果當mac的架構從powerpc編程intel的時候, 用eclipse的同事就開始罵人了: 不是說一次編譯到處執行嗎? 騙人的, 都是騙人的!

我不想說太多關於其他語言的壞話, 或許我已經說了, 好吧原諒我講點您可能不喜歡的事實. python也有很多坑, 安裝個mysql-python就有可能遇到很多問題. python社區從前幾年的熱火朝天, 到現在似乎帖子不多, 是因為已經沒有很多問題需要熱烈討論了. 從python2.3 2.4的時候, 大家發現了這麼一個簡單的(近似)全功能語言, 已經嘗試著去了解它, 了解它的標準庫, 以及第三方庫. 那些知識都在郵件列表裡面, 只要搜索就可以獲得. 當然我還是看到某些qq群裡面有人在問類似的問題, 他們甚至希望可以把自己的工作完全交給群里的其他用戶解決, 其他的我就不說了.

我認為python的好處有兩點, 第一是對於那些不具有geek精神的人, 它是一個簡單的解決方案. 這些人從來不混社區, 從來不鑽研, 只需要解決問題的時候找到一段代碼塊, 讀也不讀, 貼上去測試, 完事... 這個世界上有很多這樣的人, 菲律賓這樣的程序員特別多.

第二, 就是對於非常geek的人, 比如想instergam, Dropbox這樣的團隊, 不僅僅是geek, 而且要求做事情有美感, 追求pythonic的人, python這種能忽悠菜鳥的玩意, 居然也可以被一流團隊在工業級別的生產環境使用, 這太沒天理了.

觀點表達完畢

python的社區還是有很多事情要做的, 比如他們把很多web框架都抄了一遍, 各種思想的都有, 比如最早的zope, z-object系統的思想還是很有看頭的, django可以說對應rails, 還有TG和Pylons, 還有tornado這樣神奇的東西ruby社區還沒有吧, 只能對應nodejs了. 但是你們發現了沒有, python的這些framework基本上沒有screen cast, 我暈你們到底在不在營銷你們的framework? tornado的文檔居然那麼簡單, 居然給你link讓你直接去讀代碼?!

還有一些其他領域的東西, 比如和R語言對抗的pandas, 做統計的. 還有cocos2d, 最早是用python實現的原型, 後來port到iOS火了半邊天, 不過他們的文檔也是比較爛, 有沒有screen cast也不好說, 應該很容易被包裝過的產品打敗吧.

但是, 我認為python最重要的, 還是在與背後的pythonic思想, zen of python. 我相信如果一個成熟的工程師, 能搞定大部分事情是第一步, 理解事物背後的規律並且能用優美的方式解決才是常態, 之後就會按照pythonic的方法, 優雅的搞定所有的工作. pythonic是hacker精神的延續.

同時有經驗的工程師也不會陷入某種狂熱或者崇拜之中, 你說一個東西好, 那麼我也要看一看才能相信你所說的. 那些在java, php裡面投入很多的工程師, 也或多或少的達到了pythonic的境界.

最後我也很能理解tornado文檔的那種感覺, MVC都不懂的初學者你就別來了, 去學個django或者rails入門吧, 我沒多少文檔給你, 不懂去讀代碼吧.


單純比較語言實現的優劣可能不足以是選擇某種語言的全部原因,還需要考慮一些非技術或者非全技術的原因,例如

  1. 假如現在學習A語言,那麼對學習者來說,是否能在未來幾個月或者更長的時間內找到應用場景,在具體的項目場景中學習和使用一種語言對於學習來說是很有幫助的,因為使用是學習中最重要的部分;假如只是學習卻沒有實際應用的場景,那麼暫時不深入學習都可以,了解一些概念就可以了,等到需要的時候再學語言本身也不遲;這樣更多的時間可以去看計算機科學領域比較基礎,知識相對穩定的部分,比如系統結構與設計,設計模式,網路協議,資料庫理論和實踐,程序設計的理念和實踐方面的書
  2. 考慮學習語言A後對求職本身的幫助,學習的最終目的不是學習本身,而是要應用,不僅僅是自娛自樂地應用(當然不是說這不可以),而是在實際的職業環境下去應用,並且以此獲得回報;
  3. 語言的生態環境,是否存在高質量社區,現存的文檔對你自己來說是否足夠友好,身邊是否有很多使用某種語言的朋友或者同事,對於學習來說,這些都是整個過程中的拐杖,特別說稍微深入高級的概念的時候;
  4. 考慮語言存在的歷史和上下文,所有的語言都有問題,比如上面的知友提到的PHP代碼可能產生的可維護性問題,ruby代碼的AR可能產生的學習成本和性能上的問題,但這些問題是否在你自己的應用環境下存在,如果存在是否可控,假如可控那麼對你來說就不是問題;忽視上下文來討論語言實現本身是不公正的;每種語言的設計者可能有截然不同的技術價值觀,你會發現PHP的非OO部分和UNIX的設計哲學很契合,因為它產生與那一種哲學被普遍認知和接受的年代;ruby的語言設計我自己的理解是因為它產生與「敏捷實踐」被普遍認知和接受的年代;選擇語言的時候重要的不是去對他下什麼判斷,而是去接受他,了解他,就像選擇朋友一樣;
  5. 你自己的偏好,你身邊可以有一群人告訴你你應該學習ruby而不學習php,或者學習php而不學習ruby,但最終的判斷在學習者自己,判斷的做出可能需要適當的作全面了解比較過後才能產生,或者也不一定,有些朋友就是看到python或者php或者ruby的某一個非常漂亮有趣的部分而愛上她的,比如php的magic methods, built in hooks等等,ruby優雅的iteration語法等等,我身邊有朋友無論如何我跟他怎麼說ruby怎麼好,他都能用務實中肯的意見反駁我為什麼這個這個對他沒有實際意義,為什麼這個這個其實php的處理更加自然,我認為這樣才是學習語言正常的狀態,那就是你知道她有這些缺陷,但你還是愛「她」 :)),而不是走馬觀花,見異思遷:))


推薦哪種語言都差不多。但是要注意不要一開始就推薦框架、設計模式這些。原因第一,概念越多,學習曲線就越陡峭,很容易產生挫敗心理。第二,從解決問題到優雅的解決,要比先思考代碼結構再思考如何解決容易。第三,編程是為了解決問題,框架是為了解決編程。第四,當他沒有過用難看的方法解決問題的經驗的時候,很難理解設計模式為什麼會存在,會造成為了設計模式而用設計模式,而不是為了解決自己的代碼問題。


  • 假如你想幫他儘快找個活兒, 賺到錢, 推薦PHP。

  • 假如你想讓他成為一個高效工程師, 推薦 Python。

  • 假如你想讓他愛上他的工作, 推薦 Ruby。


1,挑一個你看著順眼的開始,沒有什麼道理,重要的是開始。

2,1~2個月內開始從事該語言的相關實戰開發,在這個過程中,會發現真正你需要了解的東西。每個人的體會是不同的,一定要自己得出結論。

3,不同語言有不同的使用場景。有實際的經驗後,根據自己的愛好取捨,工作需要去不斷補充。

4,真正深入一門語言其實並不簡單。以PHP為例,會用框架,會寫框架,會寫擴展,是一個不斷深入的過程,在這個過程中,需要C的知識,UNIX環境開發知識,TCP網路開發知識。在實際工作中,用到的JS,Apache,MySQL,Nginx,shell等等,每一項都足夠深入的去了解。如果上面提到的這些都能掌握,並且熟練後,你不只是一個PHP高手,可以隨時遷移到其他語言,觸類旁通。而單單這些,如果足夠勤奮,聰明的話,至少也需要三年的時間。

5,學好C語言,unix高級編程,網路編程,屬於縱向擴展;在工作中,深入了解遇到的各種問題,學好多種語言,工具,了解其機理,屬於橫向擴展。唯二者都深入,不懈的去探索,最終才能打通任督二脈,一覽眾山小,拈花飛葉皆可成兵。

總之,一句話,Just do it follow your passion dig heep 。


看了大家的評論,我總結了一個現象。

直接推薦python的人,基本都沒深入學習過ruby。

學過python和ruby的人,基本都喜歡ruby。

具體使用什麼語言,不是唯一的。根據場景是要分的。一個人至少是需要學習3種語言的。

一種是工作語言,比如c++,java,php,這三種語言,是互聯網的萬能葯,只要會了,工作是永遠都不愁的,大型公司一般都會使用,用來開發一些大型項目。

一種是自己使用的語言,比如python,ruby,當然,我也推薦ruby。我也用過python2年,後來因為工作需要,忍痛放棄了python,最後,竟然深深喜歡上ruby了。然後就不再回頭了,對於個人使用來說,是要非常注重開發效能的,一門語言,至少能用10年,如果自己選擇的語言,可以在開發效能上超越其他語言十分之一,那麼在十年內這種收益是非常大的。

還有一門是新語言使用,不必深入,但是一定要了解,這有助於比較不同語言的不足,才不至於成為井底之蛙。比如nodejs scale等。

我看了之前有位仁兄的評論,談到語言和框架的組合,是非常好的。無論什麼樣子的語言,如果沒有框架,那麼基本就是廢柴。

綜合來說,如果你只想學習一門語言,那麼學習java是最好的,個人使用和工作都是比較適合的。


選擇一門語言要看這個語言社區的氣質,以及你想用他做什麼東西。

最近一直在感慨:Mac上可以運行那麼多種語言,有很多人用git。但卻只有Ruby的用戶開發出了homebrew這樣牛逼的包管理系統,善用了github的諸多特性,真正的把每一個用戶都變成了潛在的repo貢獻者。我相信這絕對不是巧合。如果同樣的條件擺在面前,你做出了一個全新的東西而別人沒有,說明了你的創造力比別人要高

作為Python用戶,覺得Ruby語法的優劣不太重要。但是從外部看Ruby社區近些年持續的向外輸出一些從技術到開發上的理念,不斷的有大大小小的很酷的項目從Ruby社區中誕生的出來。使得我覺得Ruby社區是一個很有創新氣質的社區。因此如果你學編程是想做出一個很酷的東西,那麼我強烈建議你直接學習Ruby。


幾個具有生產力的語言、框架組合:

Java: Play!, Spring Roo

Scala: Lift, Play!, Scalatra, Akka

Ruby: Rails, Sinatra

Python: tornado, web.py, django, turbogears

PHP 確實不值得推薦,雖然快速成型,但容易失控,尤其項目稍大的時候。


PHP, PYTHON, RUBY 各有所長,還要看個人偏好吧。附圖希望有價值。


既然是網路開發講座,就選你們熟悉的。講座一定要講自己熟悉的,要不然就是誤人呀!

php, python, ruby三個入門確實不難,但是要深入都不是省油的。

php的好處就是成熟的代碼很多,拿來直接用,或者簡單的做下2次開發就很方便的完成任務了;支持的虛擬主機也是n多

ruby做原型很快,不過語言太靈活,以至於有些混亂,看別人的代碼會很鬱悶;ruby現在發展已經減緩了

我個人比較喜歡python的地方就是它夠簡潔,linux下是內帶的;


編程語言非常重要,不要認為他們都圖靈等價,用起來都一樣。實際上,好的語言,帶給你的東西是超乎想像的。

下面是一些看法,供參考。

1,程序員的時間遠比機器的時間寶貴:選擇開發效率最高的語言吧,不要在乎運行性能,如果你開發不出東西,那麼跑得多快也沒用。

2,優雅的抽象勝於簡單的堆砌: 這意味著你的代碼是最簡潔而又充滿設計感的,面向對象,容易的閉包,一切都是表達式等等,而最好的抽象是語言本身能夠分層,既能夠書寫語言的語言,比如DSL能力強弱是個指標。

3,才華橫溢的社區勝過有難度的招聘:這種語言一定要擁有一個活躍且才華橫溢的社區,只要使用她的人,就有一種自豪感和精英意識,在社區里的每個人都自認為比別人強。即使,你不那麼容易招聘到程序員,但我們不都知道,一個有才華的程序員勝過100個平庸之輩嘛?選用這種語言,能保證團隊里一起編碼的每一個人,都是高手。

4,也是最重要的,樂趣勝過一切: 靈活,好玩,永遠有新發現的魔術般的語言,只有你想不到的,沒有你做不到的,對一個真正的hacker來說,這是選擇語言唯一的理由,這也是perl為什麼能夠長期存活的原因,因為她是hacker為hacker創作的。

如果能看完這些觀點,相信你能猜出我的選擇了:)是的,ruby是主流語言中我認為最出色的,最高的開發效率,最優雅簡潔的抽象能力,最有才的社區(github為中心),和最大的樂趣。

-----------新的補充---------

最近仔細拜讀了<松本行弘的程序世界>這本書,了解了很多關於各類語言背後的歷史和內幕,無論你是否ruby程序員,我都強烈推薦閱讀一下這一本。

說點跟本問題相關的部分,我認為做為一個程序員,是應該去選取不同思路的語言去學習的,而且當然要選擇最有代表性的語言,在編程的世界裡,主流的思路其實就兩種,一是結構化編程,一是函數化編程,面向對象只是結構化編程進化的一個階段而已,其他各種各樣的思路大多數是這兩個的分支。

學習面向對象,我認為ruby是不二之選,她是smalltalk真正的繼承者。

學習函數化編程,我沒有什麼發言權,我自己想學習的是haskell,這個是目前為止最徹底的函數化編程語言。


在你不知道學什麼編程語言的時候就是學Python,(就像大學剛開始部分專業一樣)

後來你如果遇到什麼特殊的要求又要學一門新的語言繼續學點就ok。

因為在Python中可以快速的接觸到 設計模式、網路協議、資料庫交互等等雜七雜八 和語言無關的東西。

理解一個東西最好的辦法自己就是擼一遍。


『我再也不批評PHP了,我只會推薦別人看這篇blog』

http://me.veekun.com/blog/2012/04/09/php-a-fractal-of-bad-design/


雖然對於Web,咱是一個門外漢。不過我個人還是蠻看好 HTML5+CSS3+nginx+nodejs+MongoDB。

nodejs使用v8引擎,執行效率聽說還可以,nginx高並發,MongoDB可分散式,訪問也用javascript,存放的文檔也類似json。從前到後都可以用javascript編寫。


作為零基礎入門者,我推薦python!

至於前面有朋友說的版本選擇問題,基礎一點2.5夠用了,如果要兼容MATLAB的一些應用,需要2.6以上版本。所以就用2.6足夠了啊。


其實python和ruby都不難,都可以粗淺接觸下,喜歡哪種就可以直接快速上手。

我個人開始選擇是python,因為它的用途很廣,而且庫比較全。

其實你沒必要在這個問題上糾結,花幾天時間學習下就明白了。以後工作了不是你決定語言,而是團隊決定語言。


python最簡單吧,不過一開始初學,還是玩php吧,我表示我現在學Ruby on Rails 感覺壓力山大——RoR用著確實爽,但是學起來異常艱難,要看一堆文檔,而且Rails 3跟2.2又有很大差異,中文即使有資料,也基本都是2.2的。


學習python半年,開發了一個web網站,用的django,個人感覺django框架很不錯的,他的mvc模式很適合高效率的敏捷開發,admin絕對是一朵奇葩,python語法簡潔高效。


可以一門門來~有一定基礎的PHP,PYTHON都可以,有時間學習ROR,NODEJS,ERLANG,JAVA之類的~不用抱死一門語言,思想才是最重要的。


嘖嘖知乎的服務端就是python開發的,每天都在"伺服器提了一個問題,我們正在緊張的撰寫答案"…


推薦閱讀:

使用Rust的開發效率怎麼樣?
哪些書籍能提高程序員的演算法能力?
創造編程語言應該學習什麼語言?設計編程語言最好是用C/C++嗎?
函數式編程的函數是如何實現的?
為什麼沒有中文的編程?

TAG:Web開發 | 編程語言 |