有选择的保留遗留“惯例”

在工作中,我们常常会听到这样的声音:“原来的系统就是这么做的!”。

没错儿,在工作中我们潜移默化地受到了遗留系统的一些设计和实现的“惯例”的影响,另外天生携带的懒惰基因使我们很少去思考和判断这些惯例的正确性和保留的必要性。但事实上,我们确应该经常重新审视这些遗留的“惯例”,有选择的保留,并敢于放弃。

每种“惯例”的引入和使用都是有其特定原因的:或是可以简化代码编写,或是便于代码跟踪,或是利于代码调试,或是迫于对外部工具的妥协,也有的是为了偷懒儿^_^,甚至有些惯例的引入本身就是不妥当的甚至是错误的,只是当时无人喊出反对的声音,也就被保留了下来。

新项目启动已两月有余,除了前期参与一些编码外,现在的我更多是代码检查和评审者的角色。在这个角色上,我看到了一些本不该保留下来的遗留“惯例”,这里挑了几个拿出来说说。

#1 – 在源代码文件中记录代码变更信息
在遗留系统的一个典型的“惯例”就是在源文件中(包括.h和.c文件)记录代码变更信息,比如下面的例子:

/*
 * foo_test.c
 *
 * NUM  | description    | by     | date      |
 * 001  | 添加XX业务逻辑 | xx     | 20100805  |
 * 002  | 修改YY业务逻辑 | yy     | 20100809  |
 * 003  | 删除ZZ业务逻辑 | zz     | 20100809  |
 * … …
 */

在foo_test.c的开始处,开发人员记录了所有关于这个文件的所有变更信息索引,此外在该源文件中充斥着诸如:001+、002*和003-这样的注释信息,以跟踪源码的变动。

这个遗留“惯例”的出处已无法追溯了,也许是当初没有对版本控制工具的功能特性有着很充分的认识,也许还可能是当初干脆就没有引入版本控制工具,不过无论如何,在subversion、git等版本控制工具大行其道的今天,这样的“惯例”已不再合适,它会使我们的代码不再clean。

现在我们一般推荐采用版本控制工具的commit log与ChangeLog相结合的方式来管理和跟踪代码变更,更精确的说是使用commit log详细跟踪代码变更,而使用ChangeLog来跟踪功能变更和某些重要的bugfix。 在提倡频繁提交与集成的今天,ChangeLog会显得尤为重要,它与commit log相辅相成。如果没有ChangeLog粗线条地记录项目功能变更,指望大家从数量繁多的commit log中提炼出功能变更是不现实的、不具备可操作性的、也是不可接受的。

#2 – 过度使用续行符
在新项目代码里,我发现了一些使用续行符的代码,诸如:
void foo(int a, int b, \
         char *p, \
         struct foo_t *f);

printf("%s\n", "Foo Test, \
               ,Test Foo");

printf("%d, %s, %d\n", \
        a,\
        "Foo Test",\
        b);

我之前只是在遗留系统中见识过类似的代码,显然这是受到了遗留代码“惯例”的影响了。

续行符,顾名思义,当一行代码过长,影响代码整体美观或超出编译器每行最大字符数限制时采用的方法,用于指示编译器续行符前后的两行实际上应作为一行处理。以前的编译器不足够智能,甚至每行支持的最大字符数也很少,有些时候确要使用续行符来辅助编码。但是如今编译器愈来愈强大,续行符的使用场合已经不多了。将上面代码改造为如下代码编译器也完成可以处理:
void foo(int a, int b,
         char *p,
         struct foo_t *f);

printf("%s\n", "Foo Test,"
               ",Test Foo");

printf("%d, %s, %d\n",
        a,
        "Foo Test",
        b);

其中第一个printf中分属两行的字符串会被编译器自动连接成一行字符串对待,这还可以解决使用续行符导致的"Foo Test"和",Test Foo"之间出现多余空格的情况。续行符可以用到的场合似乎只剩下多行宏定义中了。

#3 subversion源码库中保存二进制文件
我们的产品一直运行在Sun小型机上,CPU是Ultra Sparc,OS为Solaris,长期如此也导致了我们很少考虑可移植性问题,甚至在遗留系统中,我们直接将第三方库的sparc solaris版本的.a文件放入了Subversion的源码库中管理,这样我们Checkout出来后便可以直接链接生成可执行文件。

这样的“惯例”延续到了新项目中,不过我们的新项目近期修改了目标,可移植性列上了日程,目标平台不再只是单一的Sparc Solaris了。如果我们继续坚守这个“惯例”,那么将会给我们带来不小的第三方库版本管理上的麻烦,甚至连Makefile都要跟随着不断做调整。所以是时候将特定目标平台的二进制.a文件从源码库中移除了,具体方法这里不赘述了。

变化是永恒的,经常反思一下你日常工作中那些所谓的“惯例”,它们真的值得继续保留下去吗?

《Programming in Haskell》中文版翻译项目

"A language that doesn't affect the way you think about programming, is not worth knowing".

                                                         — Alan Perlis(ACM 第一任主席,图灵奖得主,1922-1990)

程序员修炼之道》这本书建议程序员每年应至少学习一门新的语言,以拓宽思维,避免墨守成规。今年我选择了函数式编程语言Haskell。选择Haskell的理由正如Alan Perlis所说的那样,Haskell是一门可以影响程序员编程思维的语言,我也期望通过学习Haskell来拓宽我的思维。

开始接触Haskell后,我才发现它在国内是如此的小众(其实在国际上也很小众),国内居然没有正式出版过Haskell相关的中文书籍,唯一可参考的像样的中文资料就是网上流传的一本免费的由乔海燕翻译的《Yet Another Haskell Tutorial》,国内出版的影印版书籍似乎也只有《真实世界的Haskell》(英文名:Real World Haskell)这一本。

我开始学习Haskell时用的就是那本曾获得过Jolt Award大奖的《Real World Haskell
》影印版,书很厚,是本Haskell大全。但后来发现似乎不太适合初学者。随后又在网上搜索资料,找到了Graham Hutton编写的《Programming in Haskell》这本教程。与《Real World Haskell》比起来,《Programming in Haskell》这本书就显得“单薄”了许多,加起来总共不到200页。不过这本书却非常适合函数式编程和Haskell的初学者,因为这本书是基于英国诺丁汉大学课程讲义编制而成,经过了多年实际教学检验,并且在这本书的官方主页上还可以下载到与书配套的讲义幻灯片和习题答案。

同样是也是在这本书的主页上,我发现了这本书在2009年就已经出版了日文版和韩文版,这个让我很是受触动,为什么在好书引进方面我们也落后于日韩呢!突然脑中迸发出一个念头:要不我来试试翻译一下这本书,也算是为Haskell在中国的发展做出一些自己的贡献。

于是在Google Code上建立了这个《Programming in Haskell》中文版翻译项目

最初尝试使用tiddlywiki来做中文内容的载体,后来发现使用tiddlywiki非译书之正道。为此,我还特意花了一些时间学习了一下TeX,并做了一个非专业的中文TeX模板,用于自己翻译之用。

到目前为止,自己边学Haskell,边尝试翻译《Programming in Haskell》,并已经完成了序言以及前三章的初译。由于自己之前没有任何函数式编程语言的知识和英文翻译的经验,所以翻译起来甚感吃力。另外Graham Hutton的偏学术派的写作风格也让翻译的难度陡增不少。对于已经翻译的三个章节,自己并不甚是满意,总觉得在术语翻译,原意把握以及行文方面欠缺较多。不过经过这段时间的翻译,对Haskell以及函数式编程的理解却加深了不少,所以后续计划对已翻译的三个章节进行回顾,形成中英文对照表,纠正术语翻译错误、作者原意把握不准确的地方以及行文不通顺的地方。

真诚的欢迎大家提出建议和意见,帮助我来审校翻译中存在的问题,共同完成这个项目。

另外这里需声明一点:自己仅是一个Haskell爱好者和初学者,非Haskell牛人。请大家读译稿后谨慎拍砖!

附:《Programming in Haskell》中文版翻译项目地址:http://code.google.com/p/programming-in-haskell-cn
       微软C9 函数式编程基础(使用《Programming in Haskell》这本教程)视频地址:在这里

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言精进之路1 Go语言精进之路2 Go语言编程指南
商务合作请联系bigwhite.cn AT aliyun.com

欢迎使用邮件订阅我的博客

输入邮箱订阅本站,只要有新文章发布,就会第一时间发送邮件通知你哦!

这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats