关于前端和后端,我一直有些话想说,老赵的“前端普遍不自信因此看好Node.js”最终激起了我说这些话的念头。不知不觉发了14条微博,现在整理一下吧。
老赵的这条微博:http://weibo.com/1560442584/xCIyt1VXA
=====================================================
话说,我有“前端普遍不自信因此看好Node.js”的感觉,可能也是因为我接触最多的一些nb的前端 @寒冬winter @johnhax @Bobby_casperCBY @真阿当 都是不咋鸟Node.js的。当然我没说他们反对Node.js,就是那种“哦,不过这跟我没什么关系”的态度。
=====================================================
关于前端和后端的看法,我也一直有话想说。其实与其说是“前端普遍不自信”,不如说是“不甘心”。
前端和后端编程是有非常大的区别的:后端由url驱动,一个url过来了,这个url要做什么事,读哪个数据库,读哪张表,改哪个字段,然后返回个什么回应给客户端,完全不用关心GUI,它更类似传统的命令行编程,来个什么请求,在内存或数据库里处理一下,返回个结果。后端编程一直不怎么需要“创意”,编程的模式特别固定,特别是有了框架的帮助之后,更是对“创意”的需求淡化了很多,url路由,ORM操作数据库,模板引擎渲染页面,最大的创意可能只是数据库设计阶段,做些OO的设计,一旦进入编程阶段基本不需要太多“创意”了。
前端不同,前端是GUI编程,和用户界面打交道,要制作出视觉效果、要响应用户各种操作,而前端的GUI表现力特别强大,强大到需要一个单独的领域特定语言css的地步,其表现力之强和实现成本之低是传统桌面GUI编程远远不及的。但css其实提供的表现力又仅仅是一个非常low level层面的接口,css无法直接提供类似VS或flex里的“控件”,原生浏览器支持的控件只有button、select,textarea之类的非常基本的东西,几乎一穷二白,要写tabView,要写treeView之类的完全要靠前端工程师自己去利用DOM、css、js组合起来实现,就像flex直接把窗户和门提供给你了,你直接组合出一个房子而前端其实只有砖头、水泥和铁片,一点一点地建房子。如何利用js这个胶水,将css、DOM、用户行为、浏览器行为粘合起来,考验的全是“创意”!我再强调一下,“创意”!!!
前端的语言真不难,css一个月的学习成本绝对能玩出花,js上手也简单得跟什么似的,比起java、c++、c#简单到不是一个级别的但掌握了基本的知识,掌握到了精通的程度你也成不了一个好的前端工程师,前端工程师难的不是语法,不是工作经验,难的是“创意”,同样的一个视觉表现,用不同的DOM,不同的css组合可能做出完全不同的实现,哪种实现可维护性好,扩展性好都需要权衡。如果没有“创意”,寸步难行,没有人去给你一个简单改改就万金油的框架。前端的GUI表现力考的全是“创意”,这是为什么后端工程师很难玩好前端的原因,不是学了语法就行了,前端的灵魂是“创意”!
我记得前些日子,@玉伯也叫射雕 在微博里发过几条贴子,说“前端玩好服务端,比服务端玩好前端要容易得多”,这话我印象很深刻,在我看来,这话里有很多的不甘心,很大的酸劲。同样作为前端工程师,我很能理解。我相信有相同“不甘”的前端应该有很多。不甘主要还不在和服务端工程师比谁更需要“创意”,而在于话语权。前端离用户最近,也离产品经理和运营最近,前端经常被要求做修改,因为修改的成本不会很大,不会产生全局性的影响,所以老板们最敢要他们做修改的也是前端工程师。而后端不同,因为和数据库相连,因为“框架”的概念比前端要甚,所以老板们一般也不敢让后端做修改,动辙就是全局性的影响;另一方面,一般后端修改要改动的代码也会比前端少很多。所以你常看到因为修改代价小,前端被反复折腾的身影,加强了“码农”“民工”的印象。传统的web page又偏偏是数据驱动的,一个网站不过是“如何展现数据”的过程而已,读写数据库,分页,登录退出。。。才是重点,而前端不过是“装饰”,有你漂亮,没你照样行,后端为主,前端为辅,后端工程师可以带队做架构师,你见过前端做整个项目架构师的吗?了不起在前端部分做个主管。你看看出了bug,测试,老板首先找谁?测试反馈的bug是不是都要到前端那边走一遍之后才能判断是前端的问题还是服务端问题,再分出去?所以老赵说前端普通不自信,倒不如说前端很不甘心,在web page时代本身前端就是个吃力、有难度却又由于“数据展现驱动”不得不沦为配角的悲剧角色。个人猜想,@玉伯也叫射雕 离开ued,也有很大部分的原因是因为这种不甘心吧。
回到nodejs上,nodejs的出现,因为其语法层面和前端的js是近亲,让前端有了“我再进一步,就把前后端一把抓了”的希望,有大量前端工程师感兴趣也是必然的。之所以我不鸟nodejs,原因不是“我不care服务器端”,仅仅是“我觉得nodejs只有语法层面和js一样,如果要学习server端编程,只会语法是远远不够的,而语法层面的学习成本其实一点也不高,我省不了多少力气。nodejs和其它python,ruby相比,只是语法层面和前端像,该学什么还得学什么,服务端框架、模板引擎、ORM一样都不能少,而它却又很年轻,与其跟一个很潮的90后小朋友追流行,不如跟个成熟的中年大叔混更安全。貌似流行,实则满地地雷或者昙花一现的东西多了去了,flex、silverlight、ror、wxpython哪个不是这样?nodejs再等等吧,他能活下来,登上语言排行榜前20再考虑吧”。
=====================================================================
后记: 关于前后端编程体验的不同,我后面还写了一篇博客来进一步描述,希望尽量将两者的不同清晰的表达出来,以供比较。《前后端编程体验的比较》http://hi.baidu.com/cly84920/blog/item/8a37ff2e0946ca4e4ec226e0.html