<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>《五种应该避免的代码注释》的评论</title>
	<atom:link href="http://coolshell.cn/articles/2746.html/feed" rel="self" type="application/rss+xml" />
	<link>http://coolshell.cn/articles/2746.html</link>
	<description>享受编程和技术所带来的快乐 - http://coolshell.cn</description>
	<lastBuildDate>Wed, 23 May 2012 03:47:41 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
	<item>
		<title>作者：Akiller</title>
		<link>http://coolshell.cn/articles/2746.html/comment-page-1#comment-135697</link>
		<dc:creator>Akiller</dc:creator>
		<pubDate>Tue, 07 Feb 2012 22:10:18 +0000</pubDate>
		<guid isPermaLink="false">http://coolshell.cn/?p=2746#comment-135697</guid>
		<description>接手别人的代码的时候，他们都没有用版本控制之类的工具，所以经常可以看到第一类注释，XXX年月日XXX修改了这段代码</description>
		<content:encoded><![CDATA[<p>接手别人的代码的时候，他们都没有用版本控制之类的工具，所以经常可以看到第一类注释，XXX年月日XXX修改了这段代码</p>
]]></content:encoded>
	</item>
	<item>
		<title>作者：wl112005</title>
		<link>http://coolshell.cn/articles/2746.html/comment-page-1#comment-86351</link>
		<dc:creator>wl112005</dc:creator>
		<pubDate>Mon, 10 Oct 2011 01:20:17 +0000</pubDate>
		<guid isPermaLink="false">http://coolshell.cn/?p=2746#comment-86351</guid>
		<description>有时候对于接手别人的代码，并进行修改时，第一类注释是很有帮助的。很多修改并没有相应文档，特别是修改已运行的代码，更是找到问题就直接改了。这类注释应有修改的理由和修改人或修改日期，会很方便后来人知道修改的原因。 当然这是不好的习惯， 应该适度。</description>
		<content:encoded><![CDATA[<p>有时候对于接手别人的代码，并进行修改时，第一类注释是很有帮助的。很多修改并没有相应文档，特别是修改已运行的代码，更是找到问题就直接改了。这类注释应有修改的理由和修改人或修改日期，会很方便后来人知道修改的原因。 当然这是不好的习惯， 应该适度。</p>
]]></content:encoded>
	</item>
	<item>
		<title>作者：coolshell资源汇总 &#124; 黑客的白板</title>
		<link>http://coolshell.cn/articles/2746.html/comment-page-1#comment-72470</link>
		<dc:creator>coolshell资源汇总 &#124; 黑客的白板</dc:creator>
		<pubDate>Thu, 11 Aug 2011 05:05:22 +0000</pubDate>
		<guid isPermaLink="false">http://coolshell.cn/?p=2746#comment-72470</guid>
		<description>[...] 2010年7月28日  五种应该避免的代码注释 [...]</description>
		<content:encoded><![CDATA[<p>[...] 2010年7月28日  五种应该避免的代码注释 [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>作者：如何写出无法维护的代码 &#124; 技术大类 &#124; monque //一个技二代的博客</title>
		<link>http://coolshell.cn/articles/2746.html/comment-page-1#comment-67960</link>
		<dc:creator>如何写出无法维护的代码 &#124; 技术大类 &#124; monque //一个技二代的博客</dc:creator>
		<pubDate>Mon, 25 Jul 2011 02:24:16 +0000</pubDate>
		<guid isPermaLink="false">http://coolshell.cn/?p=2746#comment-67960</guid>
		<description>[...] 注释明显的东西。比如：/* add 1 to i */。（参看本站的“五种应该避免的注释”） [...]</description>
		<content:encoded><![CDATA[<p>[...] 注释明显的东西。比如：/* add 1 to i */。（参看本站的“五种应该避免的注释”） [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>作者：songtianyi</title>
		<link>http://coolshell.cn/articles/2746.html/comment-page-1#comment-63274</link>
		<dc:creator>songtianyi</dc:creator>
		<pubDate>Tue, 05 Jul 2011 08:31:41 +0000</pubDate>
		<guid isPermaLink="false">http://coolshell.cn/?p=2746#comment-63274</guid>
		<description>&lt;blockquote&gt;string message = &quot;Hello World!&quot;;  // 07/24/2010 Bob
        Console.WriteLine(message); // 07/24/2010 Bob
        message = &quot;I am so proud of this code!&quot;; // 07/24/2010 Bob
        Console.WriteLine(message); // 07/24/2010 Bob &lt;/blockquote&gt;

每行都加。。，领教了 </description>
		<content:encoded><![CDATA[<blockquote><p>string message = “Hello World!”;  // 07/24/2010 Bob<br />
        Console.WriteLine(message); // 07/24/2010 Bob<br />
        message = “I am so proud of this code!”; // 07/24/2010 Bob<br />
        Console.WriteLine(message); // 07/24/2010 Bob </p></blockquote>
<p>每行都加。。，领教了 </p>
]]></content:encoded>
	</item>
	<item>
		<title>作者：如何写出无法维护的代码 - 算神的博客</title>
		<link>http://coolshell.cn/articles/2746.html/comment-page-1#comment-60347</link>
		<dc:creator>如何写出无法维护的代码 - 算神的博客</dc:creator>
		<pubDate>Mon, 20 Jun 2011 08:48:33 +0000</pubDate>
		<guid isPermaLink="false">http://coolshell.cn/?p=2746#comment-60347</guid>
		<description>[...] 如何写出无法维护的代码 六月 20th, 2011      这篇文章的原文在这里（http://mindprod.com/jgloss/unmain.html），我看完后我想说—— 什么叫“创造力”，创造力就是——就算是要干一件烂事，都能干得那么漂亮，那么有创意的能力。什么叫“抓狂”，抓狂就是——以一种沉着老练的不屈不挠的一本正经的精神，一点一点把你推向崩溃的边缘。　　我把文章节选了一些，也并没有完全翻译，简译一下，也加入了一些自己的调侃。对于有下面这些编程习惯的朋友，请大家对号入座。另外，维护程序的朋友们，你们死定了！！If builders built buildings the way programmers write programs, then the first woodpecker that came along would destroy civilization. （如果建筑师盖房子就像程序员写程序一样，那么，第一只到来的啄木鸟就能毁掉我们的文明）　　~&#160;Gerald Weinberg&#160;(born:&#160;1933-10-27&#160;age:&#160;77)&#160;Weinberg’s Second Law　　程序命名容易输入的名字。比如：Fred，asdf单字母的变量名。比如：a,b,c,x，y，z（陈皓注：如果不够用，可以考虑a1,a2,a3,a4,….）有创意地拼写错误。比如：SetPintleOpening， SetPintalClosing。这样可以让人很难搜索代码。抽象。比如：ProcessData, DoIt, GetData…抽象到就跟什么都没说一样。缩写。比如：WTF，RTFSC ……（陈皓注：使用拼音缩写也同样给力，比如： BT，TMD，TJJTDS）随机大写字母。比如：gEtnuMbER..重用命名。在内嵌的语句块中使用相同的变量名有奇效。使用重音字母。比如：int &#160;ínt（注：第二个&#160;ínt不是int）使用下划线。比如：_, __, ___。使用不同的语言。比如混用英语，德语，或是中文拼音。使用字符命名。比如：slash,&#160;asterix， comma…使用无关的单词。比如：god, superman, iloveu….混淆l和1。字母l和数字1有时候是看不出来的。　　伪装欺诈把注释和代码交织在一起。　　for(j=0; j&lt;array_len; j+ =8)&lt;br /&gt;　　{&lt;br /&gt;　　&#160;&#160;&#160;&#160;total += array[j+0 ];&lt;br /&gt;　　&#160;&#160;&#160;&#160;total += array[j+1 ];&lt;br /&gt;　　&#160;&#160;&#160;&#160;total += array[j+2 ]; /* Main body of&lt;br /&gt;　　&#160;&#160;&#160;&#160;total += array[j+3]; * loop is unrolled&lt;br /&gt;　　&#160;&#160;&#160;&#160;total += array[j+4]; * for greater speed.&lt;br /&gt;　　&#160;&#160;&#160;&#160;total += array[j+5]; */&lt;br /&gt;　　&#160;&#160;&#160;&#160;total += array[j+6 ];&lt;br /&gt;　　&#160;&#160;&#160;&#160;total += array[j+7 ];&lt;br /&gt;　　}隐藏宏定义。如：#define a=b a=0-b，当人们看到a=b时，谁也想不到那是一个宏。换行。如下所示，下面的示例使用搜索xy_z变得困难。　　#define local_var xy&lt;br /&gt;　　_z // local_var OK代码和显示不一致。比如，你的界面显示叫postal code，但是代码里确叫zipcode.隐藏全局变量。把使用全局变量以函数参数的方式传递给函数，这样可以让人觉得那个变量不是全局变量。使用同意词。如：　　#define xxx global_var // in file std.h&#160;&lt;br /&gt;　　#define xy_zxxx// in file ..othersubstd.h&#160;&lt;br /&gt;　　#define local_var xy_z// in file ..codestdinst.h使用相似的变量名。如：单词相似，swimmer 和 swimner，字母相似：ilI1 或 oO08。parselnt 和 parseInt， D0Calc 和 DOCalc。还有这一组：xy_Z,xy__z， _xy_z， _xyz， XY_Z,xY_z， Xy_z。重载函数。使用相同的函数名，但是其功能和具体实现完全没有关系。操作符重载。重载操作符可以让你的代码变得诡异，感谢CCTV，感谢C++。这个东西是可以把混乱代码提高到一种艺术的形式。比如：重载一个类的!操作符，但实际功能并不是取反，让其返回一个整数。于是，如果你使用!!操作符，那么，有意思的事就发生了——先是调用类的重载!操作符，然后把其返回的整数给!成了布尔变量，如果是!!!呢？呵呵。#define。看过本站那些混乱代码的文章，你都会知道宏定义和预编译对于写出不可读的代码的重大意义。不过，一个具有想像力的东西是——在头文件中使用预编译来查看这个头文件被include了几次，而被include不同的次数时，其中的函数定义完全不一　　#ifndef DONE &lt;/p&gt;　　&lt;p&gt;#ifdef TWICE &lt;/p&gt;　　&lt;p&gt;// put stuff here to declare 3rd time around&lt;br /&gt;　　void g(char* str);&lt;br /&gt;　　#define DONE &lt;/p&gt;　　&lt;p&gt;#else // TWICE&lt;br /&gt;　　#ifdef ONCE &lt;/p&gt;　　&lt;p&gt;// put stuff here to declare 2nd time around&lt;br /&gt;　　void g(void* str);&lt;br /&gt;　　#define TWICE &lt;/p&gt;　　&lt;p&gt;#else // ONCE &lt;/p&gt;　　&lt;p&gt;// put stuff here to declare 1st time around&lt;br /&gt;　　void g(std::string str);&lt;br /&gt;　　#define ONCE &lt;/p&gt;　　&lt;p&gt;#endif // ONCE&lt;br /&gt;　　#endif // TWICE&lt;br /&gt;　　#endif // DONE　　文档和注释在注释中撒谎。你不用真的去撒谎，只需在改代码的时候不要更新注释就可以了。注释明显的东西。比如：/* add 1 to i */。（参看本站的“五种应该避免的注释”）只注释是什么，而不是为什么。不要注释秘密。如果你开发一个航班系统，请你一定要保证每有一个新的航班被加入，就得要修改25个以上的位置的程序。千万别把这个事写在文档中。注重细节。当你设计一个很复杂的算法的时候，你一定要把所有的详细细设计都写下来，没有100页不能罢休，段落要有5级以上，段落编号要有500个以上，例如：1.2.4.6.3.13 – Display all impacts for activitywhere selected mitigations can apply(short pseudocode omitted). 这样，当你写代码的时候，你就可以让你的代码和文档一致，如：Act1_2_4_6_3_13()千万不要注释度衡单位。比如时间用的是秒还是毫秒，尺寸用的是像素还是英寸，大小是MB还是KB。等等。另外，在你的代码里，你可以混用不同的度衡单位，但也不要注释。Gotchas。陷阱，千万不要注释代码中的陷阱。在注释和文档中发泄不满。（参看本站的“五种应该避免的注释”）　　程序设计Java Casts。Java的类型转型是天赐之物。每一次当你从Collection里取到一个object的时候，你都需要把其转回原来的类型。因些，这些转型操作会出现在N多的地方。如果你改变了类型，那么你不一定能改变所有的地方。而编译器可能能检查到，也可能检查不到。利用Java的冗余。比如：Bubblegum b = new Bubblegom(); 和&#160;swimmer = swimner + 1; 注意变量间的细微差别。从不验证。从不验证输入的数据，从不验证函数的返回值。这样做可以向大家展示你是多么的信任公司的设备和其它程序员。不要封装。调用者需要知道被调用的所有的细节。克隆和拷贝。为了效率，你要学会使用copy+ paste。你几乎都不用理解别人的代码，你就可以高效地编程了。（陈皓注：Copy+ Paste出来的代码bug多得不能再多）巨大的listener。写一个listener，然后让你的所有的button类都使用这个listener，这样你可以在这个listener中整出一大堆if…else…语句，相当的刺激。使用三维数组。如果你觉得三维还不足够，你可以试试四维。混用。同时使用类的get/set方法和直接访问那个public变量。这样做的好处是可以极大的挫败维护人员。包装，包装，包装。把你所有的API都包装上6到8遍，包装深度多达4层以上。然后包装出相似的功能。没有秘密。把所有的成员都声明成public的。这样，你以后就很难限制其被人使用，而且这样可以和别的代码造成更多的耦合度，可以让你的代码存活得更久。排列和阻碍。把drawRectangle(height,width)改成 drawRectangle(width, height)，等release了几个版本后，再把其改回去。这样维护程序的程序员们将不能很快地明白哪一个是对的。把变量改在名字上。例如，把setAlignment(int alignment)改成，setLeftAlignment,&#160;setRightAlignment, setCenterAlignment。Packratting。保留你所有的没有使用的和陈旧的变量，方法和代码。That’s Final。Final你所有的子结点的类，这样，当你做完这个项目后，没有人可以通过继承来扩展你的类。java.lang.String不也是这样吗？避免使用接口。在java中，BS接口，在C++中BS使用虚函数。避免使用layout。这样就使得我们只能使用绝对坐标。如果你的老大强制你使用layout，你可以考虑使用GridBagLayout，然后把grid坐标hard code.环境变量。如果你的代码需要使用环境变量。(getenv()– C++&#160;/ System.getProperty()– Java&#160;)，那么，你应该把你的类的成员的初始化使用环境变量，而不是构造函数。使用Magic number。参看《Linux一个插曲》。使用全局变量。1）把全局变量的初始化放在不同的函数中，就算这个函数和这个变量没有任何关系，这样能够让我们的维护人员就像做侦探工作一样。2）使用全局变量可以让你的函数的参数变得少一些。配置文件。配置文件主要用于一些参数的初始化。在编程中，我们可以让配置文件中的参数名和实际程序中的名字不一样。膨胀你的类。让你的类尽可能地拥有各种臃肿和晦涩的方法。比如，你的类只实现一种可能性，但是你要提供所有可能性的方法。不要定义其它的类，把所有的功能都放在一个类中。使用子类。面向对象是写出无法维护代码的天赐之物。如果你有一个类有十个成为（变量和方法）你可以考虑写10个层次的继承，然后把这十个属性分别放在这十个层次中。如果可能的话，把这十个类分别放在十个不同的文件中。　　混乱你的代码使用XML。XML的强大是无人能及的。使用XML你可以把本来只要10行的代码变成100行。而且，还要逼着别人也有XML。（参看，信XML得永生，信XML得自信）混乱C代码。在《如何加密源代码》中已经说过一些方法了，这里再补充一些。使用不同的进制。比如：10 和010不是一样的。再比如：array = new int[]{&#160; &#160;111,&#160; &#160;120,&#160; &#160;013,&#160; &#160;121,};尽量使用void*。然后把其转成各种类型使用隐式的转型。C++的构造函数可以让你神不知鬼不觉得完成转型。分解条件表达式。如：把 a==100分解成，a&gt;99 &amp;&amp; a&lt;101学会利用分号。如：if ( a );else;{&#160; &#160;int d;&#160; &#160;d = c;}间接转型。如：把double转string，写成new Double(d).toString()而不是 Double.toString(d)大量使用嵌套。一个NB的程序员可以在一行代码上使用超过10层的小括号（），或是在一个函数里使用超过20层的语句嵌套{}，把嵌套的if else 转成 [? :] 也是一件很NB的事。使用C的变种数组。myArray[i]&#160;可以变成*(myArray+ i)也可以变成*(i + myArray)其等价于 i[myArray]。再看一个函数调用的示例，函数声明：int myfunc(int q, int p){ return p%q; }函数调用myfunc(6291, 8)[Array];长代码行。一行的代码越长越好。这样别人阅读时就需要来来回回的不要较早的return。不要使用goto，不要使用break，这样，你就需要至少5层以上的if-else来处理错误。不要使用{}。不要在if else使用{}，尤其是在你重量地使用if-else嵌套时，你甚至可以在其中乱缩进代码，这样一来，就算是最有经验的程序员也会踩上陷阱。使用宏定义。宏定义绝对是混乱C/C++代码的最佳利器。参看 老手是这样教新手编程的。琐碎的封装。比较封装一个bool类，类里面什么都做，就是一个bool.循环。千万不可用for(int i=0; i&lt;n; i++)使用while代替for，交换n和i，把&lt;改成&lt;=，使用 i–调整步伐。　　测试从不测试。千万不要测试任何的出错处理，从来也不检测系统调用的返回值。永远不做性能测试。如果不够快就告诉用户换一个更快的机器。如果你一做测试，那么就可能会要改你的算法，甚至重设计，重新架构。不要写测试案例。不要做什么代码覆盖率测试，自动化测试。测试是懦夫行为。一个勇敢的程序员是根本不需要这一步的。太多的程序太害怕他们的老板，害怕失去工作，害怕用户抱怨，甚至被起诉。这种担心害怕直接影响了生产力。如果你对你的代码有强大的信心，那还要什么测试呢？真正的程序员是不需要测试自己的代码的。　　其它你的老板什么都知道。无论你的老板有多SB，你都要严格地遵照他的旨意办事，这样一样，你会学到更多的知识如何写出无法维护的代码来的。颠覆Help Desk。你要确保你那满是bug的程序永远不要被维护团队知道。当用户打电话和写邮件给你的时候，你就不要理会，就算要理会，让用户重做系统或是告诉用户其帐号有问题，是标准的回答。闭嘴。对于一些像y2k这样的大bug，你要学会守口如瓶，不要告诉任何人，包括你的亲人好友以及公司的同事和管理层，忽悠。你会学会忽悠，就算你的代码写得很烂，你也要为其挂上GoF设计模式的标签，就算你的项目做得再烂，你也要为其挂上敏捷的标签，只有学会像中国Thoughtworks的咨询师那样去忽悠，你才能学会更炫更酷的方法，让整个团队和公司，甚至整个业界都开始躁动，这样才能真正为难维护的代码铺平道路。　　这个文档中还有很多很多，实在是太TMD强大了，大家自己去看看吧。有精力有能力的朋友不妨把其翻译成中文。　　总之，我们的口号是——　　Write Everywhere, Read Nowhere [...]</description>
		<content:encoded><![CDATA[<p>[...] 如何写出无法维护的代码 六月 20th, 2011      这篇文章的原文在这里（http://mindprod.com/jgloss/unmain.html），我看完后我想说—— 什么叫“创造力”，创造力就是——就算是要干一件烂事，都能干得那么漂亮，那么有创意的能力。什么叫“抓狂”，抓狂就是——以一种沉着老练的不屈不挠的一本正经的精神，一点一点把你推向崩溃的边缘。　　我把文章节选了一些，也并没有完全翻译，简译一下，也加入了一些自己的调侃。对于有下面这些编程习惯的朋友，请大家对号入座。另外，维护程序的朋友们，你们死定了！！If builders built buildings the way programmers write programs, then the first woodpecker that came along would destroy civilization. （如果建筑师盖房子就像程序员写程序一样，那么，第一只到来的啄木鸟就能毁掉我们的文明）　　~&nbsp;Gerald Weinberg&nbsp;(born:&nbsp;1933-10-27&nbsp;age:&nbsp;77)&nbsp;Weinberg’s Second Law　　程序命名容易输入的名字。比如：Fred，asdf单字母的变量名。比如：a,b,c,x，y，z（陈皓注：如果不够用，可以考虑a1,a2,a3,a4,….）有创意地拼写错误。比如：SetPintleOpening， SetPintalClosing。这样可以让人很难搜索代码。抽象。比如：ProcessData, DoIt, GetData…抽象到就跟什么都没说一样。缩写。比如：WTF，RTFSC ……（陈皓注：使用拼音缩写也同样给力，比如： BT，TMD，TJJTDS）随机大写字母。比如：gEtnuMbER..重用命名。在内嵌的语句块中使用相同的变量名有奇效。使用重音字母。比如：int &nbsp;ínt（注：第二个&nbsp;ínt不是int）使用下划线。比如：_, __, ___。使用不同的语言。比如混用英语，德语，或是中文拼音。使用字符命名。比如：slash,&nbsp;asterix， comma…使用无关的单词。比如：god, superman, iloveu….混淆l和1。字母l和数字1有时候是看不出来的。　　伪装欺诈把注释和代码交织在一起。　　for(j=0; j&lt;array_len; j+ =8)&lt;br /&gt;　　{&lt;br /&gt;　　&nbsp;&nbsp;&nbsp;&nbsp;total += array[j+0 ];&lt;br /&gt;　　&nbsp;&nbsp;&nbsp;&nbsp;total += array[j+1 ];&lt;br /&gt;　　&nbsp;&nbsp;&nbsp;&nbsp;total += array[j+2 ]; /* Main body of&lt;br /&gt;　　&nbsp;&nbsp;&nbsp;&nbsp;total += array[j+3]; * loop is unrolled&lt;br /&gt;　　&nbsp;&nbsp;&nbsp;&nbsp;total += array[j+4]; * for greater speed.&lt;br /&gt;　　&nbsp;&nbsp;&nbsp;&nbsp;total += array[j+5]; */&lt;br /&gt;　　&nbsp;&nbsp;&nbsp;&nbsp;total += array[j+6 ];&lt;br /&gt;　　&nbsp;&nbsp;&nbsp;&nbsp;total += array[j+7 ];&lt;br /&gt;　　}隐藏宏定义。如：#define a=b a=0-b，当人们看到a=b时，谁也想不到那是一个宏。换行。如下所示，下面的示例使用搜索xy_z变得困难。　　#define local_var xy&lt;br /&gt;　　_z // local_var OK代码和显示不一致。比如，你的界面显示叫postal code，但是代码里确叫zipcode.隐藏全局变量。把使用全局变量以函数参数的方式传递给函数，这样可以让人觉得那个变量不是全局变量。使用同意词。如：　　#define xxx global_var // in file std.h&nbsp;&lt;br /&gt;　　#define xy_zxxx// in file ..othersubstd.h&nbsp;&lt;br /&gt;　　#define local_var xy_z// in file ..codestdinst.h使用相似的变量名。如：单词相似，swimmer 和 swimner，字母相似：ilI1 或 oO08。parselnt 和 parseInt， D0Calc 和 DOCalc。还有这一组：xy_Z,xy__z， _xy_z， _xyz， XY_Z,xY_z， Xy_z。重载函数。使用相同的函数名，但是其功能和具体实现完全没有关系。操作符重载。重载操作符可以让你的代码变得诡异，感谢CCTV，感谢C++。这个东西是可以把混乱代码提高到一种艺术的形式。比如：重载一个类的!操作符，但实际功能并不是取反，让其返回一个整数。于是，如果你使用!!操作符，那么，有意思的事就发生了——先是调用类的重载!操作符，然后把其返回的整数给!成了布尔变量，如果是!!!呢？呵呵。#define。看过本站那些混乱代码的文章，你都会知道宏定义和预编译对于写出不可读的代码的重大意义。不过，一个具有想像力的东西是——在头文件中使用预编译来查看这个头文件被include了几次，而被include不同的次数时，其中的函数定义完全不一　　#ifndef DONE &lt;/p&gt;　　&lt;p&gt;#ifdef TWICE &lt;/p&gt;　　&lt;p&gt;// put stuff here to declare 3rd time around&lt;br /&gt;　　void g(char* str);&lt;br /&gt;　　#define DONE &lt;/p&gt;　　&lt;p&gt;#else // TWICE&lt;br /&gt;　　#ifdef ONCE &lt;/p&gt;　　&lt;p&gt;// put stuff here to declare 2nd time around&lt;br /&gt;　　void g(void* str);&lt;br /&gt;　　#define TWICE &lt;/p&gt;　　&lt;p&gt;#else // ONCE &lt;/p&gt;　　&lt;p&gt;// put stuff here to declare 1st time around&lt;br /&gt;　　void g(std::string str);&lt;br /&gt;　　#define ONCE &lt;/p&gt;　　&lt;p&gt;#endif // ONCE&lt;br /&gt;　　#endif // TWICE&lt;br /&gt;　　#endif // DONE　　文档和注释在注释中撒谎。你不用真的去撒谎，只需在改代码的时候不要更新注释就可以了。注释明显的东西。比如：/* add 1 to i */。（参看本站的“五种应该避免的注释”）只注释是什么，而不是为什么。不要注释秘密。如果你开发一个航班系统，请你一定要保证每有一个新的航班被加入，就得要修改25个以上的位置的程序。千万别把这个事写在文档中。注重细节。当你设计一个很复杂的算法的时候，你一定要把所有的详细细设计都写下来，没有100页不能罢休，段落要有5级以上，段落编号要有500个以上，例如：1.2.4.6.3.13 – Display all impacts for activitywhere selected mitigations can apply(short pseudocode omitted). 这样，当你写代码的时候，你就可以让你的代码和文档一致，如：Act1_2_4_6_3_13()千万不要注释度衡单位。比如时间用的是秒还是毫秒，尺寸用的是像素还是英寸，大小是MB还是KB。等等。另外，在你的代码里，你可以混用不同的度衡单位，但也不要注释。Gotchas。陷阱，千万不要注释代码中的陷阱。在注释和文档中发泄不满。（参看本站的“五种应该避免的注释”）　　程序设计Java Casts。Java的类型转型是天赐之物。每一次当你从Collection里取到一个object的时候，你都需要把其转回原来的类型。因些，这些转型操作会出现在N多的地方。如果你改变了类型，那么你不一定能改变所有的地方。而编译器可能能检查到，也可能检查不到。利用Java的冗余。比如：Bubblegum b = new Bubblegom(); 和&nbsp;swimmer = swimner + 1; 注意变量间的细微差别。从不验证。从不验证输入的数据，从不验证函数的返回值。这样做可以向大家展示你是多么的信任公司的设备和其它程序员。不要封装。调用者需要知道被调用的所有的细节。克隆和拷贝。为了效率，你要学会使用copy+ paste。你几乎都不用理解别人的代码，你就可以高效地编程了。（陈皓注：Copy+ Paste出来的代码bug多得不能再多）巨大的listener。写一个listener，然后让你的所有的button类都使用这个listener，这样你可以在这个listener中整出一大堆if…else…语句，相当的刺激。使用三维数组。如果你觉得三维还不足够，你可以试试四维。混用。同时使用类的get/set方法和直接访问那个public变量。这样做的好处是可以极大的挫败维护人员。包装，包装，包装。把你所有的API都包装上6到8遍，包装深度多达4层以上。然后包装出相似的功能。没有秘密。把所有的成员都声明成public的。这样，你以后就很难限制其被人使用，而且这样可以和别的代码造成更多的耦合度，可以让你的代码存活得更久。排列和阻碍。把drawRectangle(height,width)改成 drawRectangle(width, height)，等release了几个版本后，再把其改回去。这样维护程序的程序员们将不能很快地明白哪一个是对的。把变量改在名字上。例如，把setAlignment(int alignment)改成，setLeftAlignment,&nbsp;setRightAlignment, setCenterAlignment。Packratting。保留你所有的没有使用的和陈旧的变量，方法和代码。That’s Final。Final你所有的子结点的类，这样，当你做完这个项目后，没有人可以通过继承来扩展你的类。java.lang.String不也是这样吗？避免使用接口。在java中，BS接口，在C++中BS使用虚函数。避免使用layout。这样就使得我们只能使用绝对坐标。如果你的老大强制你使用layout，你可以考虑使用GridBagLayout，然后把grid坐标hard code.环境变量。如果你的代码需要使用环境变量。(getenv()– C++&nbsp;/ System.getProperty()– Java&nbsp;)，那么，你应该把你的类的成员的初始化使用环境变量，而不是构造函数。使用Magic number。参看《Linux一个插曲》。使用全局变量。1）把全局变量的初始化放在不同的函数中，就算这个函数和这个变量没有任何关系，这样能够让我们的维护人员就像做侦探工作一样。2）使用全局变量可以让你的函数的参数变得少一些。配置文件。配置文件主要用于一些参数的初始化。在编程中，我们可以让配置文件中的参数名和实际程序中的名字不一样。膨胀你的类。让你的类尽可能地拥有各种臃肿和晦涩的方法。比如，你的类只实现一种可能性，但是你要提供所有可能性的方法。不要定义其它的类，把所有的功能都放在一个类中。使用子类。面向对象是写出无法维护代码的天赐之物。如果你有一个类有十个成为（变量和方法）你可以考虑写10个层次的继承，然后把这十个属性分别放在这十个层次中。如果可能的话，把这十个类分别放在十个不同的文件中。　　混乱你的代码使用XML。XML的强大是无人能及的。使用XML你可以把本来只要10行的代码变成100行。而且，还要逼着别人也有XML。（参看，信XML得永生，信XML得自信）混乱C代码。在《如何加密源代码》中已经说过一些方法了，这里再补充一些。使用不同的进制。比如：10 和010不是一样的。再比如：array = new int[]{&nbsp; &nbsp;111,&nbsp; &nbsp;120,&nbsp; &nbsp;013,&nbsp; &nbsp;121,};尽量使用void*。然后把其转成各种类型使用隐式的转型。C++的构造函数可以让你神不知鬼不觉得完成转型。分解条件表达式。如：把 a==100分解成，a&gt;99 &amp;&amp; a&lt;101学会利用分号。如：if ( a );else;{&nbsp; &nbsp;int d;&nbsp; &nbsp;d = c;}间接转型。如：把double转string，写成new Double(d).toString()而不是 Double.toString(d)大量使用嵌套。一个NB的程序员可以在一行代码上使用超过10层的小括号（），或是在一个函数里使用超过20层的语句嵌套{}，把嵌套的if else 转成 [? :] 也是一件很NB的事。使用C的变种数组。myArray[i]&nbsp;可以变成*(myArray+ i)也可以变成*(i + myArray)其等价于 i[myArray]。再看一个函数调用的示例，函数声明：int myfunc(int q, int p){ return p%q; }函数调用myfunc(6291, 8)[Array];长代码行。一行的代码越长越好。这样别人阅读时就需要来来回回的不要较早的return。不要使用goto，不要使用break，这样，你就需要至少5层以上的if-else来处理错误。不要使用{}。不要在if else使用{}，尤其是在你重量地使用if-else嵌套时，你甚至可以在其中乱缩进代码，这样一来，就算是最有经验的程序员也会踩上陷阱。使用宏定义。宏定义绝对是混乱C/C++代码的最佳利器。参看 老手是这样教新手编程的。琐碎的封装。比较封装一个bool类，类里面什么都做，就是一个bool.循环。千万不可用for(int i=0; i&lt;n; i++)使用while代替for，交换n和i，把&lt;改成&lt;=，使用 i–调整步伐。　　测试从不测试。千万不要测试任何的出错处理，从来也不检测系统调用的返回值。永远不做性能测试。如果不够快就告诉用户换一个更快的机器。如果你一做测试，那么就可能会要改你的算法，甚至重设计，重新架构。不要写测试案例。不要做什么代码覆盖率测试，自动化测试。测试是懦夫行为。一个勇敢的程序员是根本不需要这一步的。太多的程序太害怕他们的老板，害怕失去工作，害怕用户抱怨，甚至被起诉。这种担心害怕直接影响了生产力。如果你对你的代码有强大的信心，那还要什么测试呢？真正的程序员是不需要测试自己的代码的。　　其它你的老板什么都知道。无论你的老板有多SB，你都要严格地遵照他的旨意办事，这样一样，你会学到更多的知识如何写出无法维护的代码来的。颠覆Help Desk。你要确保你那满是bug的程序永远不要被维护团队知道。当用户打电话和写邮件给你的时候，你就不要理会，就算要理会，让用户重做系统或是告诉用户其帐号有问题，是标准的回答。闭嘴。对于一些像y2k这样的大bug，你要学会守口如瓶，不要告诉任何人，包括你的亲人好友以及公司的同事和管理层，忽悠。你会学会忽悠，就算你的代码写得很烂，你也要为其挂上GoF设计模式的标签，就算你的项目做得再烂，你也要为其挂上敏捷的标签，只有学会像中国Thoughtworks的咨询师那样去忽悠，你才能学会更炫更酷的方法，让整个团队和公司，甚至整个业界都开始躁动，这样才能真正为难维护的代码铺平道路。　　这个文档中还有很多很多，实在是太TMD强大了，大家自己去看看吧。有精力有能力的朋友不妨把其翻译成中文。　　总之，我们的口号是——　　Write Everywhere, Read Nowhere [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>作者：No.Mercury</title>
		<link>http://coolshell.cn/articles/2746.html/comment-page-1#comment-59356</link>
		<dc:creator>No.Mercury</dc:creator>
		<pubDate>Thu, 16 Jun 2011 02:03:41 +0000</pubDate>
		<guid isPermaLink="false">http://coolshell.cn/?p=2746#comment-59356</guid>
		<description>一、自恋型注释
我们之前的项目要求只要改动代码就要写上邮件地址和名称，因为从svn中找出这段代码的更改者还不如从代码中直接看的方便～～</description>
		<content:encoded><![CDATA[<p>一、自恋型注释<br />
我们之前的项目要求只要改动代码就要写上邮件地址和名称，因为从svn中找出这段代码的更改者还不如从代码中直接看的方便～～</p>
]]></content:encoded>
	</item>
	<item>
		<title>作者：xuerldx</title>
		<link>http://coolshell.cn/articles/2746.html/comment-page-1#comment-57747</link>
		<dc:creator>xuerldx</dc:creator>
		<pubDate>Thu, 09 Jun 2011 07:26:53 +0000</pubDate>
		<guid isPermaLink="false">http://coolshell.cn/?p=2746#comment-57747</guid>
		<description>代码是写给人看的，适当的注释有助于问题的解决</description>
		<content:encoded><![CDATA[<p>代码是写给人看的，适当的注释有助于问题的解决</p>
]]></content:encoded>
	</item>
	<item>
		<title>作者：喜东</title>
		<link>http://coolshell.cn/articles/2746.html/comment-page-1#comment-57566</link>
		<dc:creator>喜东</dc:creator>
		<pubDate>Wed, 08 Jun 2011 15:21:11 +0000</pubDate>
		<guid isPermaLink="false">http://coolshell.cn/?p=2746#comment-57566</guid>
		<description>哈哈哈，这比神马笑话都有趣啊。</description>
		<content:encoded><![CDATA[<p>哈哈哈，这比神马笑话都有趣啊。</p>
]]></content:encoded>
	</item>
	<item>
		<title>作者：如何写出无法维护的代码 _ 见天那点事_jiantian</title>
		<link>http://coolshell.cn/articles/2746.html/comment-page-1#comment-57294</link>
		<dc:creator>如何写出无法维护的代码 _ 见天那点事_jiantian</dc:creator>
		<pubDate>Tue, 07 Jun 2011 09:56:12 +0000</pubDate>
		<guid isPermaLink="false">http://coolshell.cn/?p=2746#comment-57294</guid>
		<description>[...] 注释明显的东西。比如：/* add 1 to i */。（参看本站的“五种应该避免的注释”） [...]</description>
		<content:encoded><![CDATA[<p>[...] 注释明显的东西。比如：/* add 1 to i */。（参看本站的“五种应该避免的注释”） [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>作者：如何写出无法维护的代码 - 三月鸟社</title>
		<link>http://coolshell.cn/articles/2746.html/comment-page-1#comment-57281</link>
		<dc:creator>如何写出无法维护的代码 - 三月鸟社</dc:creator>
		<pubDate>Tue, 07 Jun 2011 08:54:00 +0000</pubDate>
		<guid isPermaLink="false">http://coolshell.cn/?p=2746#comment-57281</guid>
		<description>[...] 注释明显的东西。比如：/* add 1 to i */。（参看本站的“五种应该避免的注释”） [...]</description>
		<content:encoded><![CDATA[<p>[...] 注释明显的东西。比如：/* add 1 to i */。（参看本站的“五种应该避免的注释”） [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>作者：如何写出无法维护的代码 &#124; 创造</title>
		<link>http://coolshell.cn/articles/2746.html/comment-page-1#comment-56847</link>
		<dc:creator>如何写出无法维护的代码 &#124; 创造</dc:creator>
		<pubDate>Sun, 05 Jun 2011 02:48:15 +0000</pubDate>
		<guid isPermaLink="false">http://coolshell.cn/?p=2746#comment-56847</guid>
		<description>[...] 注释明显的东西。比如：/* add 1 to i */。（参看本站的“五种应该避免的注释”） [...]</description>
		<content:encoded><![CDATA[<p>[...] 注释明显的东西。比如：/* add 1 to i */。（参看本站的“五种应该避免的注释”） [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>作者：海带丝</title>
		<link>http://coolshell.cn/articles/2746.html/comment-page-1#comment-56452</link>
		<dc:creator>海带丝</dc:creator>
		<pubDate>Fri, 03 Jun 2011 06:24:00 +0000</pubDate>
		<guid isPermaLink="false">http://coolshell.cn/?p=2746#comment-56452</guid>
		<description>&lt;a href=&quot;#comment-56438&quot; rel=&quot;nofollow&quot;&gt;@HorseLuke &lt;/a&gt; 
不用看那么多commit，svn有个功能叫blame，可以很方便的查到某一行是谁，在哪个revision中贡献的～
我个人讨厌第一类注释～</description>
		<content:encoded><![CDATA[<p><a href="#comment-56438" rel="nofollow">@HorseLuke </a><br />
不用看那么多commit，svn有个功能叫blame，可以很方便的查到某一行是谁，在哪个revision中贡献的～<br />
我个人讨厌第一类注释～</p>
]]></content:encoded>
	</item>
	<item>
		<title>作者：HorseLuke</title>
		<link>http://coolshell.cn/articles/2746.html/comment-page-1#comment-56438</link>
		<dc:creator>HorseLuke</dc:creator>
		<pubDate>Fri, 03 Jun 2011 05:51:13 +0000</pubDate>
		<guid isPermaLink="false">http://coolshell.cn/?p=2746#comment-56438</guid>
		<description>第一条许多人提及用svn等版本控制来防止“到此一游”的做法。
但实际上真正找bug时，很少有人会细查svn，更多的是直接去群里吼：谁改的？赶紧出来解释解释。
为啥？原因是看那些修改日志可能要牵涉数个改动——而这数个改动可能甚至是跨了100个commit的。
所以对第一点持保留意见</description>
		<content:encoded><![CDATA[<p>第一条许多人提及用svn等版本控制来防止“到此一游”的做法。<br />
但实际上真正找bug时，很少有人会细查svn，更多的是直接去群里吼：谁改的？赶紧出来解释解释。<br />
为啥？原因是看那些修改日志可能要牵涉数个改动——而这数个改动可能甚至是跨了100个commit的。<br />
所以对第一点持保留意见</p>
]]></content:encoded>
	</item>
	<item>
		<title>作者：Thaon Toncien</title>
		<link>http://coolshell.cn/articles/2746.html/comment-page-1#comment-56401</link>
		<dc:creator>Thaon Toncien</dc:creator>
		<pubDate>Fri, 03 Jun 2011 03:33:30 +0000</pubDate>
		<guid isPermaLink="false">http://coolshell.cn/?p=2746#comment-56401</guid>
		<description>想起以前的一段Pascal代碼&#039;&#039;&#039;

begin // 開始
    ...
end; // 結束

&#039;&#039;&#039;</description>
		<content:encoded><![CDATA[<p>想起以前的一段Pascal代碼”&#8217;</p>
<p>begin // 開始<br />
    &#8230;<br />
end; // 結束</p>
<p>”&#8217;</p>
]]></content:encoded>
	</item>
</channel>
</rss>

