Browsed by
作者: 陈皓

芝兰生于深谷,不以无人而不芳 君子修身养德,不以穷困而改志
TDD并不是看上去的那么美

TDD并不是看上去的那么美

春节前的一篇那些炒作过度的技术和概念中对敏捷和中国ThoughtWorks的微辞引发了很多争议,也惊动了中国ThoughtWorks公司给我发来了邮件想来找我当面聊聊。对于Agile的Fans们,意料之中地也对我进行了很多质疑和批评。我也回复了许多评论。不过,我的那些回复都是关于中国ThoughtWorks咨询师以及其咨询的方法的。我对Agile方法论中的具体内容评价的不是很多,所以,我想不妨讨论一下Agile方法论中的具体的实践(以前本站也讨论过结对编程的利与弊)。

那么,这次就说说TDD吧,这是ThoughtWorks中国和Agile的Fans们最喜欢的东西了。我在原来的那篇文章中,我把TDD从过度炒作的技术剔除了出去,因为我还是觉得TDD有些道理的,不过,回顾我的经验,我也并不是很喜欢TDD。我这篇文章是想告诉大家,TDD并没有看上去的那么美,而且非常难以掌控,并且,这个方法是有悖论之处的

TDD简介

TDD全称Test Driven Development,是一种软件开发的流程,其由敏捷的“极限编程”引入。其开发过程是从功能需求的test case开始,先添加一个test case,然后运行所有的test case看看有没有问题,再实现test case所要测试的功能,然后再运行test case,查看是否有case失败,然后重构代码,再重复以上步骤。其理念主要是确保两件事:

  • 确保所有的需求都能被照顾到。
  • 在代码不断增加和重构的过程中,可以检查所有的功能是否正确。

我不否认TDD的一些有用的地方,如果我们以Test Case 开始,那么,我们就可以立刻知道我们的代码运行的情况是什么样的,这样可以让我们更早地得到我们实现思路的反馈,于是我们更会有信心去重构,去重新设计,从而可以让我们的代码更为正确。

不过,我想提醒的是,TDD和Unit Test是两码子事儿。有很多人可能混淆了自动化的Unit Test(如:XUnit系例)和TDD的软件开发过程。另外,可能还会有人向鼓吹“TDD让你进行自顶向下的设计方式”,对此,请参阅本站的《Richard Feynman, 挑战者号, 软件工程》——NASA的挑战者号告诉你自顶向下设计的危险性。

TDD的困难之处

下面是几个我认为TDD不容易掌控的地方,甚至就有些不可能(如果有某某TDD的Fans或是ThoughtWorks的咨询师和你鼓吹TDD,你可以问问他们下面这些问题)

  • 测试范围的确定。TDD开发流程,一般是先写Test Case。Test Case有很多种,有Functional的,有Unit的,有Integration的……,最难的是Test Case要写成什么样的程度呢。

    阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (34 人打了分,平均分: 4.15 )
Loading...
GDB中应该知道的几个调试方法

GDB中应该知道的几个调试方法

七、八年前写过一篇《用GDB调试程序》,于是,从那以后,很多朋友在MSN上以及给我发邮件询问我关于GDB的问题,一直到今天,还有人在问GDB的相关问题。这么多年来,有一些问题是大家反复在问的,一方面,我觉得我以前的文章可能没有说清楚,另一方面,我觉得大家常问的问题正是最有用的,所以,在这里罗列出来。希望大家补充。

一、多线程调试

多线程调试可能是问得最多的。其实,重要就是下面几个命令:

  • info thread 查看当前进程的线程。
  • thread <ID> 切换调试的线程为指定ID的线程。
  • break file.c:100 thread all  在file.c文件第100行处为所有经过这里的线程设置断点。
  • set scheduler-locking off|on|step,这个是问得最多的。在使用step或者continue命令调试当前被调试线程的时候,其他线程也是同时执行的,怎么只让被调试程序执行呢?通过这个命令就可以实现这个需求。
    • off 不锁定任何线程,也就是所有线程都执行,这是默认值。
    • on 只有当前被调试程序会执行。
    • step 在单步的时候,除了next过一个函数的情况(熟悉情况的人可能知道,这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行。

二、调试宏

这个问题超多。在GDB下,我们无法print宏定义,因为宏是预编译的。但是我们还是有办法来调试宏,这个需要GCC的配合。

在GCC编译程序的时候,加上-ggdb3参数,这样,你就可以调试宏了。

另外,你可以使用下述的GDB的宏调试命令 来查看相关的宏。

  • info macro – 你可以查看这个宏在哪些文件里被引用了,以及宏定义是什么样的。
  • macro – 你可以查看宏展开的样子。

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (20 人打了分,平均分: 4.20 )
Loading...
Error handling in Egypt

Error handling in Egypt

以前发布过《C语言的错误处理》一文,不过今天想说的是Egypt的“错误处理”。埃及的事闹得挺大的,国外和中文twitter上更是炸了锅。不要以为程序员就只会写程序——看看程序员举出来的标语吧。呵呵。

Error handling in Egypt

当然,作为程序员来说,这段代码显然还需要重构:

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (12 人打了分,平均分: 4.00 )
Loading...
那些炒作过度的技术和概念

那些炒作过度的技术和概念

StackExchange.com上有一个贴子在评论着最近20年来被炒作过度的技术,对于出现的结果,大多数赞同,也有一些不赞同。下面我从前15名挑了10个(Java的WORE我去掉了,TDD我也去掉了,因为我觉得他们应该没有炒作过度,而且都不错),按原贴的顺序罗列如下:(后面的一些评论是我加的,欢迎大家讨论)

Top 10 过度炒作的技术和概念

  • Unified Modeling Language (UML) – UML是一个程序员交流想法的不错的工具,但是他离程序员真正需要的设计工具还差得很远,比如:设计是否符合需求、架构设计、数据流等等。只有为数不多的程序员使用这个工具交流想法,而没有用在具体工作中。
  • Sharepoint – 现在N多的公司都在用微软的这个东西做公司内部的Intranet。不过安装和维护起来,代价相当的大。但是其市场做的很成功,不对技术上来说对技术人员来说,相当的蹩脚。Sharepoint的设计没有认真地分析过业务流程,仅仅是一个文档存储地。看上去我们似乎可以做任何的事,但是如果你要用其来管理你的项目和track你的项目问题,你会发现其是无比的难用。
  • eXtensible Mark-up Language (XML) –  XML嘛,以前说过很多了(XML1 XML2)我们用他来做和程序数据封装,用来做配置文件,用来做网络传输格式。我们的程序处理起XML来,又慢,又不经济,没有工具,几乎无法维护XML文件。XML用来做数据封包真是很不经济,Yaml和JSON那个不比它简单?用XML来做程序配置文件不知道是谁想出来的主意,相当的愚蠢,看看Unix/Linux下的配置文件,简单易读,相当容易维护。真是高科技啊。
  • SOAP, XML-RPC, WSDL 的 Web Services – 这个东西前几年炒的很凶。所有人都相信,这是程序员的未来。可惜的,其中的复杂和不一致,相当的令人恶心。SOAP的那个S居然还是Simple!看来,扯上XML的都不会是什么好的东东。不过,个人认为,CORBA比他更恶。

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (34 人打了分,平均分: 3.91 )
Loading...
为什么中国的网页设计那么烂?

为什么中国的网页设计那么烂?

Nick Johnson,一个有12年经验的Web设计师在它的blog里写下了“Why is Chinese Web Design So Bad”,新浪,人人,百度,阿里巴巴,腾讯榜上有名。其中的观点相当的好,希望所有的中国人都读一下。我不全文翻译了,只是给大家看一些摘要。(保证不会像《环球时报》一样)

——————————

作者2005年的夏天来到中国,他说,他注意到了中国那复杂的文化和西方的有多么的不同。比如,语言,身体特征,政府的执政理念,等等,但是,有一些地方确是差别很少的,比如:幽默的sense,还有对艺术的表现形式的兴趣。很快,因为职业,他发现在中国的网站设计上完全没有引吸到他。于是他开始让身边的中国朋友尽可能多的给他推荐中国的网站,他觉得这个可以对他学习Web Design有帮助。

当他在评论起新浪,人人,百度,阿里巴巴,腾讯的时候,他说,百度和其它的不同,因为百度悍然地公开抄袭Google的Web Design(blatantly copied their design from Google),而人人则是很明显地抄袭facebook(clearly copied their design from Facebook)。而其它的多数的中国网站看上去有很多很多滑稽可笑的文本,一些网站在滥用图片,一些网站图片又不够。他感到很困扰,这样的网站都能被接受?这么多的东西,网民怎么可能看得过来啊?中国人怎么可能容忍这些。(注:他不知道我们中国人能承受的比这更多)

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (45 人打了分,平均分: 4.49 )
Loading...
如何“加密”你的email地址

如何“加密”你的email地址

现在在网上要小心,无论是保护好你的用户名和帐号,还是我们的电子邮件地址。在网上有很多爬虫程序专爬我们的电子邮件地址,一量被爬中了,那么你的邮箱里就是一堆又一堆的垃圾邮件,就好像我的haoel(at)hotmail.com一样,在7、8年前,每天几千封的垃圾邮件。现在hotmail的垃圾邮件过滤得好一些了,不过也有每天40封左右的垃圾邮件。但是我们在自己的网页上又需要发布自己的email地址。所以我们需要搞乱我们的邮件地址,就像那种非常规的搞乱代码一样。不过,我们还需要能认人读的出来。

一般来说,在网上现在很普遍的做法是——

  • 1)用图片,可以用PHP动态生成那个验证码式的。
  • 2)把@变成at,把点变成dot,如 haoel(at)hotmail(dot)com之类的。
  • 3)把a变成@,写成haoel@[email protected]

不过这些还是能被爬到,用图片的方法不利于用户拷贝粘贴。下面介绍几种方法:

第一种:使用CSS样式

反转字序

span.codedirection { unicode-bidi:bidi-override; direction: rtl; }
<p><span>moc.liamtoh@leoah</span></p>

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (7 人打了分,平均分: 2.71 )
Loading...
SOAP的S是Simple

SOAP的S是Simple

曾经有一个争论,一边是站在SOAP这边的人,另一边则是其它人。 站在SOAP这边人,当他们在争论SOAP和Web Service框架的复杂度时,SOAP这边的人说,在引入那些WS-*东东之前,SOAP的确是简单的,这就是为什么SOAP的第一个字母S就是Simple。

在2000年的时候,有一个苦恼的程序员,

程序员: 不好意思,我的老板这周末去打高尔夫了,现在我不得不要搞一个SOAP的应用,但是我根本不知道什么是SOAP。SOAP专家,你能帮我吗?

SOAP专家: 当然可以。首先,我要告诉你,SOAP 就是 Simple Object Access Protocol.

程序员: 哦,那么说来,他是简单的罗?

SOAP专家: 简单的就像星期天一样,我的朋友。

程序员: OK,快跟我说说。

SOAP专家: 好,就像他的名字一样,SOAP用为远程对象访问。

程序员: 像CORBA一样?

SOAP专家: 正是如此,就是像 CORBA,只是更简单。不需要复杂的传输协议,还要设置防火墙,SOAP用的是HTTP。而且我们用的是XML作为传输数据格式而不是二进制。

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (10 人打了分,平均分: 3.60 )
Loading...
C语言函数实现的另类方法

C语言函数实现的另类方法

在前面看过那个BT的Javascript程序后,我们来看一个C语言的,相信大家还记得输出从1到1000的数最后的那个示例,本站还有很多这样的示例,如:变态的hello word如何教新手编程还有恐怖的C++,在下面这个示例面前,神马都是浮云。

下面这个示例向你展示了如何写一个swap()函数(把两个值交换),这段代码在我的Linux下的 gcc v4.1.1下可以正确编译通过,连一个Warning都没有,而且可以正确工作。我能说什么?!C语言并不疯狂,疯狂的是程序员。

#include <stdio.h>
void(*swap)() = (void(*)()) "\x8b\x44\x24\x04\x8b\x5c\x24\x08\x8b\x00\x8b\x1b\x31\xc3\x31\xd8\x31\xc3\x8b\x4c\x24\x04\x89\x01\x8b\x4c\x24\x08\x89\x19\xc3";

int main(){ // works on GCC 3+4
        int a = 37, b = 13;
        swap(&a, &b);

        printf("%d %d\n",a,b);
}

其实,这种用字符串来实现函数的方法,在原理上是很好理解的。

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (7 人打了分,平均分: 3.29 )
Loading...
一段Javascript的代码

一段Javascript的代码

我们先看一段Javascript的代码,如下所示:(你能看出来这是干什么的?)

[javascript]($=[$=[]][(__=!$+$)[_=-~-~-~$]+({}+$)[_/_]+
($$=($_=!”+$)[_/_]+$_[+$])])()[__[_/_]+__
[_+~$]+$_[_]+$$](_/_)[/javascript]

这段代码来自BlackHat DC 2011((黑帽安全大会,全世界最大两个黑客大会之一,另一个是Defcon)中的一个叫Ryan Barnett黑客做的XSS Street-Fight!的演讲(XSS是Web上比较经典的跨站式攻击,操作起来也有些复杂),一共69页,基本上都是一些比较枯燥的Javascript,不过这段代码挺有意思的,如果上面这段代码换个样子:

[javascript]($=[$=[]][(__=!$+$)[_=-~-~-~$]+({}+$)[_/_]+
($$=($_=!”+$)[_/_]+$_[+$])])()[__[_/_]+__
[_+~$]+$_[_]+$$](document.cookie)[/javascript]

你看到了document.cookie,于是你可能会想到这是偷用户帐号免登录cookie的。是的,就是这样。答案是,这代码等价于alert(document.cookie),而最上面的那个代码等价于alert(1)——当然,还不仅仅只是alert。看到这里,你可能会想起变态的C语言Hello World程序,以及如何加密/混乱C源代码,是的,这回的这个是Javascript版的,混乱Javascript的会比混乱C的更难懂,因为Javascript的变量类型是可以乱用的。

好,下面让我们来对这个代码做个解析。

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (13 人打了分,平均分: 3.15 )
Loading...
食客还是大厨

食客还是大厨

(请勿将本文用于商业用途,转载时注明作者和出处)

昨天我在文章《Android将允许纯C/C++开发应用》中发表了一些“很不中听”的观点,在我早晨上班刚打开电脑的时候,Gtalk上同学就发来了一条信息“android 为啥不用C/C++的原因是,android是开放式系统,为了能够跨平台。如果整回C/C++,那么windows mobile就是前车之鉴。”,于是和同学展了争论,同学的意思是Java是正确的,在硬件上的表现也将是很出色的,而且准入门槛低,最重要的是跨平台,跨平台是恶梦,而硬件上性能的问题在未来不是问题。iPhone是单一平台,所以不需要考虑跨平台。

而在我的博文后面上也有许多的讨论,在CSDN上也有一些,大家可以去看看。很多朋友都谈了谈为什么Java要比C++要好的理由,很多很多,大家可以去看看,我觉得挺好的。不过后来,我更新了一下我的文章,留下了几个让大家思考的问题,我希望大家都看看。

在这里,我想和大家说说技术之上的东西。

——————————————正文分割线——————————————

在绝大多数的评论中,我看到了大家都是站在技术开发者的角度在讨论。我想这和Google的Android犯的是同一个毛病,那就是其注重了“程序员”,而不是“用户”。就像是,Unix是为程序员开发,Java 也是为程序员的跨平台难问题开发,而Windows是为用户开发,iPhone也是为用户开发。也许,我们认为,改进了程序员的开发体验后,能迸发出程序员强大的生产力,进而增加满足用户需求的能力。不过,我想说的是,这件事的初衷是好的,但事实上程序员是永远不懂用户的

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (18 人打了分,平均分: 3.67 )
Loading...