Rails和Django都是非常优秀的网站开发框架,纠结应该学习Rails还是Django的人,大概有下面几种:
- 想找后端开发工作的
- 自己玩票搞副业的
对于已经工作的职业程序员们来说,绝对不会纠结Rails和Django该选哪一个,因为公司的技术栈是啥你就得学啥,没得商量。
对于想找后端开发工作的,我不是资深业内人士,无法给出合理建议。
对于玩票的那些人,比如想了解一下网站开发技术、MVC框架的设计师,我推荐Django。没错就是这么直接。
在我自己陷入了应该学Rails还是Django的迷思中后,我把Ruby On Rails官方文档和Django官方文档都翻了一遍,还翻到了一篇很棒的2014年的技术对比。这里我把思考的过程记录下来,以免后面自己忘了又重新比较一遍……
其实Rails和Django之间的选择,就是两者之间开发哲学的选择。
Rails创始人David Heinemeier Hansson设定的信条是:
- 程序员的幸福最大化
- 约定优于配置
- 主厨精选
- 多元化的设计模式
- 推崇优美的代码
- 提供实用工具
- 重视整合系统
- 进步比稳定更重要
- 包容并重
而Python中的彩蛋import this则是:
$ python
>>>import this
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
对比两者的第二条(真巧):
约定优于配置
Convention over Configuration
VS
显式优于隐式
Explicit is better than implicit
约定优于配置的哲学,可以让熟悉开框架的人快速实现程序功能,而不需要把时间花费在从零开始的配置文件设置上。那种感觉,就像是闭着眼睛往前走,不怕前方没有路,因为你知道,即使看不见,Rails也已经在前方给你铺好了路。而这个特性,对于不熟悉开发框架的人来说,就有点“魔幻”了。
显式优于隐式的哲学,可以让不熟悉框架的人也能明确知道代码在做什么,如果不懂,照着代码读一遍就懂了。而这一点对于已经很熟悉框架的人来说就显得很麻烦,“我知道所有的事情,我还要把我已经知道的东西再重新写一遍”。
现在,搞清楚我们学习Rails或者Django的目标:玩票。显式优于隐式的哲学对新人和非专业人士来说非常友好,毕竟这次玩票之后下次再玩票可能就是几个月之后了,我可不想到时候看着自己写的代码一脸茫然,不得不再重新拿起官方文档学一遍。
我推荐Django还有另外一个原因:框架背后的语言。Rails基于Ruby,Django基于Python。
Ruby是很优秀的脚本语言,我尝试写过一些之后也觉得:真爽。可选的函数括号、符号特性等等。对比一下Ruby和Python的自动化测试脚本:
# Ruby
require "selenium-webdriver"
driver = Selenium::WebDriver.for :chrome
driver.manage.timeouts.implicit_wait = 10
driver.navigateTo "www.baidu.com"
c = driver.find_element(:id, "content")
c.send_keys "hello world"
btn = driver.find_element(:id, "submit")
btn.click
# Python
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Firefox()
driver.implicitly_wait(10)
driver.get("www.baidu.com")
c = driver.find_element(By.id, "content")
c = driver.find_element_by_id("content") #上一句的另一种写法
c.send_keys("hello world")
btn = driver.find_element_by_id("submit")
btn.click()
可以看到号称自然语言的Python,其“自然”程度输给了Ruby。而且Ruby还有5.times puts “hello world”等等各种魔幻的语法。
只可惜虽然Ruby的语法比Python爽那么多,但架不住Python在各个领域遍地开花。Python可以干嘛呢?PyGame写游戏,PyQt写桌面GUI程序,Pandas搞数据分析,Scrapy写大型网络爬虫,Matplotlib搞数据可视化,TensorFlow搞深度学习。Django写多了,拿Python做点其他的事情完全不是问题。Ruby虽然也可以做点其他的事情,跟Python比起来就相形见绌了。
Python还有一个Jupyter Notebook,交互式的代码编写方式,对于还处在学习阶段的人来说简单是神器。
还有一点,Django/Python的开发环境搭建因为有virtualenv这个工具非常简单,而Rails/Ruby的就麻烦多了,尤其是在Windows系统上。以致于出现了一个网站教入门新手如何搭建开发环境:http://installrails.com
所以,总结一下,玩票推荐Django的原因:
- 显式优于隐式的哲学,不怕三天打渔两天晒网自己忘记代码怎么写的了
- Python除了网站,还能做其他很多事情,适合玩票
- Jupyter Notebook极大降低了入门成本
- 开发环境搭建容易