September 27th, 2009 by 张磊
入职3个月,参与的第一个大项目已经上线。于是开始思考对现有Web开发框架的改良,或者考虑另起炉灶搞一套。思考的过程中形成一些想法,现记录下来。 没有用过Rails的话,大概会想到把一切业务都抽成配置;使用过Rails后,更推崇约定大于配置。 约定大于配置,不仅体现在分发的过程,也体现在类、方法的命名,更重要的是贯穿在框架中的思想。不管是维护一大堆配置文件,还是维护一个庞大的配置文件,都不是个好主意。实际上,大多数配置都可以被约定的。 分发:对业务简单的页面,进行一次分发足够了;对业务复杂的页面,可能需要进行第二次基于业务的分发。应当假设框架不了解具体业务,但要保留二次分发的灵活性。 框架应该做多少事,是个需要拿捏的问题,过度设计非常容易。一个框架的目标不是把代码用配置来代替,也不是把代码用约定来代替。 引入AOP的机制很有必要。过滤器能帮忙做许多事,使真正业务部分的逻辑更清晰。 高来高去一通,其实最大的问题还没说。开发过程中发现,每次请求后台服务和向模板传递变量时,总会遇到数组中字段名称不一致的问题。可能后台给了一个trans_id,但模板需要user_trans_id,于是程序很多时候都在做“改名”。要解决这个,还得靠约定。 自己思考并设计一个框架的过程中,更加觉得Rails妙不可言,推荐没有使用过Rails的Web开发者关注下。
October 28th, 2008 by 张磊
到今天,在公司完整参与的第一个项目算是交付测试,我也松了一口气。这次是做庆祝支付宝4周年的活动。年庆活动就像是兴奋剂,虽然用户未必有真的实惠,但运营的人能有真的KPI。 回到今天的话题,怎样才算是个Web开发者呢?大学第一年曾有个老师问我,将来想做点什么。那时我基本啥都不懂,只是说,我想搞Web开发。一语成谶,后来的好几年,我没写过几个windows上跑的软件,却大大小小做了不少网站。我觉得做Web开发比做狭义上的软件开发要复杂,因为你不仅得掌握至少一门后端语言,还得了解CSS、javascript以及XHTML标准。 在这次的四周年项目中,其实后端大部分东西都是现成的,无非是几个接口调用一下,抽个奖兑个红包之类的。但前端的活动页面需要UI的同事配合来做,然后把切好的页面拿给我们加上程序。别的时候这样的流程还走得通,但这次情况不一样,很多地方都需要用AJAX,提示消息全部要用弹出层。一开始几个java工程师认为一天能搞定的活儿,N个人干了两周,包括加班,才勉强提交测试。 有很多细节,比如UI的同学们发来的弹出页面Demo,需要点击才能弹出提示层。同事们在使用的时候,只能在程序里模拟一个button.click的事件。UI的同学们用的CSS Prime Sprites也造成了不小的困惑,为啥没改背景图图片都会变涅?更别提Firefox和IE6/7之间的兼容性问题,我很怀疑兼容性问题不会在测试中得到重视。 我有些用js、css的经验,所以得以解决了不少问题。看到支付宝UED团队招聘的Flash,我才知道公司还有一个叫Web Developer的职位。把前端和后端分开来做,在我看来,实在不是一件好事。但有几个人能把前端和后端都做好呢?Livid这样的天才不是随便哪家公司都能求来的,这样的职位设置,只能认为是不得已而为之。和周围同事聊起javascript,普遍的结论是作为java工程师不需要去学习javascript,但我觉得所谓Web开发者,并不只是会做前端或会做后端就合格了。融会贯通是需要的,我曾和同事写过一封讨论的邮件,主要想表达的内容是这些: 从Web后端的语言说起,比如PHP,java,ruby,python这些,总体的思路是一样的。在一次HTTP请求中,后端的程序做的事情无非就是 ,接受请求,按照既定的规则进行处理,给出响应。至于是返回一段文本,还是返回一个网页,或者是别的格式,这些都不重要。因为最终是由浏览器来解释。 之后一层,就到了前端。首先是HTML,其实有点像我以前画素描:画在二维的平面上,但目标是呈现一个三维的场景。HTML是一个一维的字符序列,但它规划出了一个网页的结构,像是一副骨架。这就是二维的了。HTML是基于Tag的。 接下来就是CSS,CSS的写法其实就是一个个hash,用key-value-pair来表示某(些)元素该长什么样子。比如一个鼻子,颜色是黄的,7cm高,4cm宽。这些都归css管。 最后是javascript。在我刚接触它的时候,它被描述为“基于对象的语言”,因为那时人们用js大部分是拿来操作网页元素,所以说它是基于对象。但javascript其实有继承、封装、多态的特性,是一门十足的面向对象的语言。它可以把(X)HTML和CSS完美地结合起来,在AJAX中也被用来访问后端。js很容易上手,有很多好用的库,但,它也是最容易遇到兼容性问题的。 其实一切都是逻辑。这次的四周年活动下月就将推出,关注前端开发的同学们可以仔细翻阅一下源代码,我承认我们做得东西很幼稚,包括Ajax请求都是手写的。但我会努力改变这种情况,下一步希望可以在周会的时候,做一些这方面的分享。 觉得又要写后端程序又要做前台页面很痛苦的同学,建议看一下Rails这个框架,首页上的“Web development that doesn’t hurt”,直到如今我才有点明白这意思。以前用PHP,也一直没觉得hurt呀 。欢迎大家留言给我,谈谈觉得怎样才算是个Web开发者呢? 周末去参加这个活动,感兴趣的朋友可以一起来。
December 6th, 2007 by 张磊
让人心痛的回忆,我浪费了将近1个小时,才明白自己程序里错在哪了。想起当年用Emeditor写程序的时候,折腾了一下午,发现少写个小括号。很久没有这么废了。 开发Camel的过程中,我把错误报告的级别设为了”E_ALL”。看到好多大牛都是这么做的,这样所有notice级别的错误都能暴露出来,更能一目了然。用了E_ALL,果然每个页面加载时都会跳几个“Notice”的错误出来,看多了也不当回事了。 然后今天尝试登录Camel后台,登录这一块是很久以前做的了。之前已经做过许多次登录,所以Camel登录这一块就没有做UnitTest。一看发现没法登录,我就慌了。仔细地检查了一下各个模块之间的逻辑关系,没找到毛病,只好一点一点地修改、调试,可一直都不对。Cookie没法成功发送,自然也去不了后台。到后来甚至让我对我自己装的PHP产生了怀疑,可我的PHP是直接更新自apt源的。我好好规划的模块化程度这么高的Camel,在被我七手八脚调试的过程中,弄得七零八落了。 万念俱灰的时候,突然注意到在我不当回事的“Notice”中,有一个“Warning”。内容是: Cannot modify header information – headers already sent by (output started at /var/www/camel/v/admin/Utlities.php:9) 一拍脑袋,我怎么没早发现呢?之所以服务器不能发送Cookie,是因为服务器为了输出那些“Notice”们,就打开了输出流,于是就没法发送header信息。而Cookie是包含在header中的。学着那些牛人们整了个E_ALL,结果把自己给害了。如果你做事和我一样没心没肺,还是别用E_ALL了,极端一点的话用一句error_report(0),关掉所有的错误报告,世界更干净。
December 3rd, 2007 by 张磊
现在是学习时间。 先摘一段huony的文章: …… 在学习这些课程的时候你可以学通,我发现计算机这个学科真是好,我们学一些技术,但是我们本身就是在学管理。 各门语言课程让你学会如何说话行文,编译原理让你学会如何针对“平台”切换说话方式,离散数学让你学会优化很多的流程,操作系统是一门很好的例子,我觉得是一门系统管理课程。计算机的操作系统是一个非常经典的“系统”,哪个系统不是处理器、进程和进程调度、信息传递机制、I、O组成的?学校是一个系统、自然界也是一个系统、社团是个系统,公司也是个系统。你在用计算机的知识去理解这些系统并学会多进程的合理调度、提升效率,你会发现这就是管理。 …… 上面的文字来自于Ases5周年那天我拿到的Ases文集。读了之后顿觉英雄所见略同,当然我对专业方面的认识和理解跟huony比起来还有很大差距。想想令狐冲学独孤九剑、张无忌学太极剑,学的都是剑意。当然,huony写文章不太多,感觉对标点的使用并不恰当。为了保持原味,我连标点都没改。 还有一段,是《Ajax模式与最佳实践》这本书上的: 置换模式明确规定,对外暴露的URL被看作是组件,它需要使用一个资源,这个URL不会与一个特定的表现(类似jsp)绑定在一起。 这本书不太适合初学者看。说实话,我自己花了一天时间把这本书谈的模式浏览了一次,具体的内容没怎么深入下去,但感觉冲击很大。在讲AJAX的同时,全书也在贯彻着REST,把URL视为可操作的资源。联想起了今年上半年参加阿里巴巴的侠客行大会时,听JavaEye范凯的讲座,用ROR开发REST程序。关于REST的更多东西,得自己找点资料了。 最近感觉视野极大地开阔,在电脑上累了就看书。前些日子借的《Programming Ruby》也看完了,和C/C++/Java这些语言们比起来,Ruby更让人感叹设计者的智慧(当然,发展到后面就是社区的智慧了)。是咱的邻居日本人哦。今天又花了几个小时看完了《AJAX框架解析与实例》,真正用的时候再去查吧。现在开始看厚厚的《代码大全》了,挺没感觉的。 也开始关注Nutch,Java总要好好了解。因为用到很多Java的特性,估计Nutch中爬虫这一块不会有很多其它平台的移植;但在搜索上,也许可以有其他平台上面的实现呢。 还在关注的是牙线(据说用牙线让人更健康),不过我的眼睛实在有崩溃的感觉。