应该向 Web 开发初学者推荐 PHP、Python 还是 Ruby ?理由是什么?

或者说应该推荐什么语言 / 框架? 我们学校某协会想办个网络开发讲座,不可避免地要涉及到服务器端语言 / 框架的选择。我觉得 PHP 作为一种语言不如后…
关注者
2147
被浏览
605591

141 个回答

看到这个热烈的讨论, 想谈一谈其他的观点, 希望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的处理更加自然,我认为这样才是学习语言正常的状态,那就是你知道她有这些缺陷,但你还是爱“她” :)),而不是走马观花,见异思迁:))
为什么?