`

[转]写好代码的10个秘密

阅读更多

作者:飞哥 (百度)

先给大家看一段据说是史上最强的程序:
e100 33 f6 bf 0 20 b5 10 f3 a5 8c c8 5 0 2 50 68 13 1 cb e 1f be a1 1 bf 0 1
e11b 6 57 b8 11 1 bb 21 13 89 7 4b 4b 48 79 f9 ad 86 e0 8b c8 bd ff ff e8 20
e134 0 3d 0 1 74 1a 7f 3 aa eb f3 2d ff 0 50 e8 f 0 5a f7 d8 8b d8 26 8a 1 aa
e14f 4a 75 f9 eb de cb 57 bb 21 13 8b c1 40 f7 27 f7 f5 8b fb ba 11 1 4f 4f 4a
e168 39 5 7f f9 52 8b c5 f7 25 f7 37 2b c8 95 f7 65 2 f7 37 95 2b e8 fe e fe
e181 10 79 6 c6 6 fe 10 7 46 d0 14 d1 d1 d1 e5 79 ec 5a b8 11 1 ff 7 4b 4b 48
e19b 3b d0 75 f7 5f c3 83 f7 83 a6 5d 59 82 cd b2 8 42 46 9 57 a9 c5 ca aa 1b
.............................................................................


这段程序是1997年世界程序设计大赛的一等奖作品的部分代码(完整的代码下载,把代码复制粘贴到cmd的debug命令中,回车看到效果)。这个程序运行后将是一个3D的且伴随着音乐的动画。震撼吧!
是不是从事软件开发的人员都希望成为这样的武林高手呢?然而真要是用这样的高手来设计、编写我们的产品代码,恐怕某一天,我们什么都不用干了,只能人手一本机器代码,一句一句进行翻译了;那么对于软件产品开发而言,如何写好代码呢?一流的软件产品的代码具备哪些特征呢?


一流代码的特征


1、稳定可靠(Robustness)
代码写出来以后,一定要能够运行得非常好,非常稳定可靠。在现今的IT行业,软件产品都是是24*7,即要保证系统一天24小时,一星期7天中都可以无间断的正常运行。比如我们百度的搜索引擎系统,比如我们的通信系统,等等。到了产品开发后期,大部分的成本都将投入到产品稳定性的提高。

2、可维护且简洁(Maintainable and Simple Code)
在写代码时,首先要考虑的是:写出来的代码不但要自己可以读懂,而且我们的同事、测试工程师都可能要修改这些代码,对其进行增减。如果代码很复杂,不容易读懂,如程序中的递归一大堆、程序不知何时或从何地跳出,则会使程序的可维护性和简洁性降低。所以必要的注释、统一的编程规范等都是非常重要的。

3、高效(Fast)
在软件行业中效率是非常重要的,比如搜索引擎。有些软件的搜索效率就不高,搜索过程特别缓慢,让人难以接受。当然这里面有一个带宽的问题,但是程序效率不高也是一个重要的原因。而实际上程序的效率提高,有时候很简单,并没有什么神秘之处,如使用数组索引时候,可以用指针方式而不使用数组下标;数组的空间定义应该定义为2的N次幂等等。

4、简短(Small)
这方面大家的感受可能不是很深,但是我的感受是很深的。配置过PSTN程控交换机、路由器、VoIP网关设备的人都知道,这些设备的软件都是从PC机通过网口或串口下载到这些设备的Flash上(类似PC机的BIOS)再通过设备上的CPU启动。如果程序写的很罗嗦,随着特性不断增加,程序规模将变大的巨大,Flash空间告急、内存告急、下载升级变的不可忍受,等等,带来的就是成本不断增加,利润不断下降。

5、共享性(Reusable)
如果做大型产品开发,程序的共享性也是非常重要的。我们产品有那么多开发人员,如果每一个人都自己定义字符串、链表等数据结构,那么开发效率就会降低,我们的产品恐怕到今天也不能出台。我所说的“共享”不是指将别人的代码复制到自己的代码中,而是指直接调用别人的代码,拿来即可用。这一方面可以减少代码的冗余性,另一方面可以增强代码的可维护性。如果别人的代码里有Bug,只需修改他的代码,而调用此代码的程序不用进行任何修改就可以达到同步。这同时要求我们在设计的时候,如何考虑系统的内聚和耦合的问题。

6、可测试性(Testable)
我们的产品开发里,除了软件开发人员,还有一部分工程师负责软件测试。软件测试人员会将开发代码拿来,一行一行地运行,看程序运行是否有错。如果软件开发人员的代码不可测试,那测试工程师就没有办法进行工作。因此可测试性在大型软件开发里是很重要的一点。可测试性有时候与可维护性是遥相呼应的,一个具有好的可测试性和可维护性的代码,测试人员可以根据开发提供的维护手册、debug信息手册等就可以判断出程序出错在哪个模块。

7、可移植性(Portable)
可移植性是指程序写出来以后,不仅在windows 2000里可以运行,在NT/9X下可以运行,而且在Linux甚至Macintosh等系统下都可以运行。所有这些特性都是一流代码所具备的特性。但是其中有些特性是会有冲突的。比如高效性,程序写的效率很高,就可能变得很复杂,牺牲的就是简洁。好的代码要在这些特性中取得平衡。

写好代码的10个秘密

1、百家之长归我所有(Follow Basic Coding Style)
其实写代码的方式有很多,每个人都有自己的风格,但是众多的风格中总有一些共性的、基本的写代码的风格,如为程序写注释、代码对齐,等等。是不是编程规范?对就是编程规范。

2、取个好名字(Use Naming Conventions)
取个好的函数名、变量名,最好按照一定的规则起名。还是编程规范。

3、凌波微步,未必摔跤(Evil goto's?Maybe Not...)
这里我用“凌波微步”来形容goto语句。通常,goto语句使程序跳来跳去,不容易读,而且不能优化,但是在某种情况下,goto语句反而可以增强程序的可读性。Just go ahead,not go back。

4、先发制人,后发制于人(Practic Defensive Coding)
Defensive Coding指一些可能会出错的情况,如变量的初始化等,要考虑到出现错误情况下的处理策略。测试时要多运行几个线程。有些程序在一个线城下运行是正常的,但是在多个线程并行运行时就会出现问题;而有些程序在一个CPU下运行几个线程是正常的,但是在多个CPU下运行时就会出现问题,因为单CPU运行线程只是狭义的并行,多CPU一起运行程序,才是真正的并行运算。

5、见招拆招,滴水不漏(Handle The Error Cases:They Will Occur!)
这里的Error Case(错误情况),是指那些不易重视的错误。如果不对Error Case进行处理,程序在多数情况下不会出错,但是一旦出现异常,程序就会崩溃。

6、熟习剑法刀术,所向无敌(Learn Win32 API Seriously)
用“剑法刀术”来形容一些API是因为它们都是经过了很多优秀开发人员的不断开发、测试,其效率很高,而且简洁易懂,希望大家能掌握它,熟悉它,使用它。是不是象我们的ULIB。

7、双手互搏,无坚不摧(Test,but don't stop there)
这里的测试不是指别人来测试你的代码,而是指自己去测试。因为你是写代码的原作者,对代码的了解最深,别人不可能比你更了解,所以你自己在测试时,可以很好地去测试哪些边界条件,以及一些意向不到的情况。

8、活用断言(Use,don't abuse,assertions)
断言(assertion)是个很好的调试工具和方法,希望大家能多用断言,但是并不是所有的情况下都可以用到断言。有些情况使用断言反而不合适。

9、草木皆兵,不可大意(Avoid Assumptions)
是指在写代码时,要小心一些输入的情况,比如输入文件、TCP的sockets、函数的参数等等,不要认为使用我们的API的用户都知道什么是正确的、什么是错的,也就是说一定要考虑到对外接口的出错处理问题。

10、最高境界、无招胜有招(Stop writing so much code)
意思就是说尽量避免写太多的代码,写的越多,出错的机会也越多。最好能重用别人开放的接口函数或直接调用别人的api。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/heiyeshuwu/archive/2010/07/14/5735332.aspx

分享到:
评论

相关推荐

    有关JavaScript的10个怪癖和秘密分享

    在实际开发中,了解和掌握这些怪癖和秘密可以帮助开发者写出更加符合预期的JavaScript代码,避免一些常见的错误和疑惑。对于学习和应用JavaScript的朋友们,理解这些特点对于提高代码质量、解决bug和优化性能具有...

    隐藏在Windows XP中的28个秘密武器.txt

    ### 隐藏在Windows XP中的28个秘密武器 Windows XP作为一款经典的桌面操作系统,在其辉煌的历史中,隐藏着许多不为人知的功能和工具。本文将深入探讨这些秘密武器,帮助用户更好地理解和利用Windows XP的强大功能。...

    Excel终极伴侣1.291

    当然,OBS.DLL还具备一些很有特色的功能,对Excel的功能来说,应该是一个很好的补充。如: 1、中文简繁互换:在简体中文和繁体中文之间进行转换。 2、进制转换:在二进制、八进制、十进制、十六进制之间相互转换。...

    c# 加密和解密相关代码

    果为二进制值11000,该值转换为十进制为24,所以得到的加密结果为24。而解密过程也很简单,只是将加密 结果24与加密数字15 进行“异或”运算,将24 转换为二进制值11000,将15 转换为二进制值1111,进行“异 或”...

    Excel终极伴侣1.287

    当然,OBS.DLL还具备一些很有特色的功能,对Excel的功能来说,应该是一个很好的补充。如: 1、中文简繁互换:在简体中文和繁体中文之间进行转换。 2、进制转换:在二进制、八进制、十进制、十六进制之间相互转换。...

    C程序范例宝典(基础代码详解)

    实例213 任意大写字母转小写 301 实例214 字符串复制到指定空间 302 实例215 查找位置信息 303 7.4 其他函数 304 实例216 复制当前目录 304 实例217 产生惟一文件 305 实例218 不同亮度显示 306 实例...

    深度C的秘密 -- C高手的力作

    通过阅读《深度C的秘密》,读者不仅可以提升对C语言的精通程度,还能学习到如何写出更高效、更健壮的代码。这本书适合有一定C语言基础并希望深入研究的开发者,是C语言学习者的宝贵资源。由于提供的是英文原版高清晰...

    C 语言深度解剖--解开程序员面试笔试的秘密

    《C语言深度解剖--解开程序员面试笔试的秘密》是一本专为软件工程师面试准备的指导书籍,涵盖了C语言的核心概念和技术,旨在帮助程序员在面试笔试中脱颖而出。这本书深入剖析了C语言的关键知识点,通过一系列常见...

    高清彩版 自己动手写搜索引擎

    - **2.1.2 编写代码(15分钟)**:指导读者如何快速编写一个简易搜索引擎的核心代码。 - **2.1.3 发布运行(5分钟)**:讲解如何部署并运行已经编写的搜索引擎程序。 - **2.2 搜索引擎基本技术**: - **2.2.1 ...

    Excel终极伴侣1.286

    当然,OBS.DLL还具备一些很有特色的功能,对Excel的功能来说,应该是一个很好的补充。如: 1、中文简繁互换:在简体中文和繁体中文之间进行转换。 2、进制转换:在二进制、八进制、十进制、十六进制之间相互...

    Excel插件--OBS.DLL

    10、工程代码锁定解锁器。可以撤销Excel的VBA保护密码(对word、Access同样有效) 11、控制和保存功能。这个功能能满足我们不用记一个密码就能非常有效地保护我们的Excel文档,而且可以免除来自微软的威胁。 12、...

    Excel终极伴侣1.288

    当然,OBS.DLL还具备一些很有特色的功能,对Excel的功能来说,应该是一个很好的补充。如: 1、中文简繁互换:在简体中文和繁体中文之间进行转换。 2、进制转换:在二进制、八进制、十进制、十六进制之间相互...

    Excel终极伴侣1.290

    当然,OBS.DLL还具备一些很有特色的功能,对Excel的功能来说,应该是一个很好的补充。如: 1、中文简繁互换:在简体中文和繁体中文之间进行转换。 2、进制转换:在二进制、八进制、十进制、十六进制之间相互转换。...

    google android sdk开发范例大全 第二版 PDF 光盘代码

    google android sdk开发范例大全 第二版 PDF 和 随书光盘代码 ISBN:9787115229649 目录 第1章 了解、深入、动手做   1.1 红透半边天的Android   1.2 本书目的及范例涵盖范围   1.3 如何阅读本书 ...

    javascript secrit garden

    《JavaScript秘密花园》是一本专注于JavaScript语言中容易让人迷惑或者陷阱重重的特性的...通过阅读《JavaScript秘密花园》这样的资源,开发者可以更好地理解和避免JavaScript中的常见陷阱,提高代码质量和可维护性。

    嵌入式实时操作系统uCOSII-邵贝贝

    该厂商声称内核B是用C语言写的,可我还得用汇编语言给程序中每个对象除实话,虽然该厂商很耐心,而我实在是烦透了!产品的开发也耽误了。我真是不想再花时间去调试那个廉价的内核了。后来得知我是该厂商的第一个客户...

    计算机程序设计员理论题1.doc

    16. 代码优化:代码优化可以在(A)中间代码生成之后和目标代码生成之后进行,以提高程序效率。 17. 实时操作系统:实时操作系统分为(A)实时单任务和实时多任务系统,用于满足不同实时性要求。 18. 进程理解:...

    jquery开发入门整理(所需要了解的)

    ### jQuery中10个强大的遍历函数 jQuery提供了多种遍历方法,如`.each()`、`.map()`等,这些方法可以用来遍历DOM元素或数组,并对每个元素执行指定的操作。 ### 12种jQuery性能优化方法解析 - **减少DOM操作**:尽...

    Eclipse 快捷键大全.doc

    10. **大纲显示**:Ctrl+O快速打开并查看代码大纲,便于了解类结构。 11. **继承结构**:Ctrl+T展示当前类的继承层次,有助于理解代码逻辑。 12. **关闭编辑器**:Ctrl+W关闭当前编辑器,保持工作区整洁。 13. **...

    计算机程序的设计员理论题1.doc

    7. **进制转换**:十进制数(193)10转换为二进制数是(11000001)2,这是数字系统转换的基本概念。 8. **移位操作**:移位操作包括逻辑移位、循环移位和算术移位,是计算机底层操作的重要组成部分。 9. **存储器...

Global site tag (gtag.js) - Google Analytics