1、程序员的秉性具备诚实的品性具备诚实的品性勤奋的程序员在调试无穷多的勤奋的程序员在调试无穷多的Bug Bug 时,已经深深地体会了时,已经深深地体会了“诚实诚实”的意义的意义信奉简单实用主义信奉简单实用主义程序员的基本工作是将复杂的问题转化为计算机能处理的程序员的基本工作是将复杂的问题转化为计算机能处理的一些简单的程序一些简单的程序喜欢技术挑战喜欢技术挑战程序员喜欢接触新技术,愿意攻克技术难题程序员喜欢接触新技术,愿意攻克技术难题高水平的程序员喜欢与高水平的程序员一起工作高水平的程序员喜欢与高水平的程序员一起工作这种喜好可能导致程序员干活偏离项目真正的需求这种喜好可能导致程序员干活偏离项目真正的
2、需求程序员应具备的能力基础知识基础知识英语的功底英语的功底数学基础(算法分析与设计)数学基础(算法分析与设计)计算机科学基础知识计算机科学基础知识基本技能基本技能认识事务的能力(抽象、模型、结构、层次)认识事务的能力(抽象、模型、结构、层次)做事的逻辑性和条理性做事的逻辑性和条理性沟通技能、演讲技巧和团队协作能力沟通技能、演讲技巧和团队协作能力学习新知识和新技术的能力学习新知识和新技术的能力职业化训练和实践经验职业化训练和实践经验如何做好程序员职业道德职业道德 上班时间不干与工作无关的事情上班时间不干与工作无关的事情 你如何看待上班玩游戏?你如何看待上班玩游戏?下班后待在公司里干与工作无关的事
3、情行不行?下班后待在公司里干与工作无关的事情行不行?不损害集体利益不损害集体利益 常见的损害行为:泄密、盗取成果常见的损害行为:泄密、盗取成果 怎样减少无意的泄密?怎样减少无意的泄密?不干危害社会的事情不干危害社会的事情 你如何看待黑客行为?你如何看待黑客行为?问题:在大学生涯中,如何培养这些素质?问题:在大学生涯中,如何培养这些素质?如何做好程序员工作态度工作态度 认真负责认真负责 在办公室老实上班,工作时间比别人长,是在办公室老实上班,工作时间比别人长,是“认认真负责真负责”吗?吗?怎样是真正意义的怎样是真正意义的“认真负责认真负责”?服务意识服务意识 程序员要为后续阶段和产品质量的工作提
4、供服务程序员要为后续阶段和产品质量的工作提供服务 你对用户提出的要求应采取什么态度?你对用户提出的要求应采取什么态度?团队协作团队协作 如何在团队中发挥自己的作用?如何在团队中发挥自己的作用?问题:在课程实验中,你对上述要求有体会吗?问题:在课程实验中,你对上述要求有体会吗?如何做好程序员高效率地工作 合理安排一天的时间 你怎样安排一天的时间?如何保证精力充沛的?开会 如何看待会议?怎样使得会议效率高?处理电子邮件 电子邮件是很好的通信工具,但使用不当可能损害工作效率 你认为以什么方式处理电子邮件比较好?随时记录 你是否有随时记录问题和灵感的习惯?如何做好程序员学无止境学无止境 不断学习新技术
5、不断学习新技术 “主动主动”学习是很关键的学习是很关键的 学习的内容完全依赖个人的喜好吗?学习的内容完全依赖个人的喜好吗?提高综合才能提高综合才能 缺乏表达能力和管理能力是软件开发人员的通病缺乏表达能力和管理能力是软件开发人员的通病 应该真正学会软件工程的思想应该真正学会软件工程的思想 向错误和失败学习向错误和失败学习 抓住一切机会,勇于实践抓住一切机会,勇于实践 随时有面对无知和承认错误的勇气,善于总结随时有面对无知和承认错误的勇气,善于总结和提高和提高软件编码规范软件编码规范软件编码规范 与特定语言相关的描写如何编写代码的规则与特定语言相关的描写如何编写代码的规则集合集合现实现实 软件全生
6、命周期的软件全生命周期的70%成本是维护成本是维护 软件在其生命周期中很少由原编写人员进行软件在其生命周期中很少由原编写人员进行维护维护目的目的 提高编码质量,避免不必要的程序错误提高编码质量,避免不必要的程序错误 增强程序代码的可读性、可重用性和可移植增强程序代码的可读性、可重用性和可移植性性软件编码规范基本要求基本要求 程序结构清析且简单易懂,单个函数的行数一般不要程序结构清析且简单易懂,单个函数的行数一般不要超过超过100100行(特殊情况例外)。行(特殊情况例外)。算法设计应该简单且直接了当,代码要精简,避免出算法设计应该简单且直接了当,代码要精简,避免出现垃圾程序。现垃圾程序。尽量使
7、用标准库函数(类方法)和公共函数(类方尽量使用标准库函数(类方法)和公共函数(类方法)。法)。最好使用括号以避免二义性。最好使用括号以避免二义性。问题:以下示例有什么问题?如何修改?问题:以下示例有什么问题?如何修改?if(cond1&cond2|cond3&cond4|cond5&if(cond1&cond2|cond3&cond4|cond5&cond6)cond6)doSomethings();doSomethings();软件编码规范可读性要求:可读性第一,效率第二。可读性要求:可读性第一,效率第二。举例:举例:JAVA 程序的标准格式(课本程序的标准格式(课本P198 示例示例9.1
8、)文件结构文件结构 说明版权和版本信息的文件头注释说明版权和版本信息的文件头注释 package 和和import 语言语言 类和接口说明语句类和接口说明语句Section 结构结构 Class/interface的注释的注释 Class/interface 语句语句 Class/interface 实现注释(必要时)实现注释(必要时)Class(static)变量)变量 Instance 变量(变量(public,protected,package,private)Constructors Methods(以功能进行分组)(以功能进行分组)软件编码规范举例:举例:JAVA 程序注释(课本程序
9、注释(课本P205 示例示例9.6)三种风格:文档风格、三种风格:文档风格、C 语言风格、单行注释语言风格、单行注释 注意事项注意事项 程序中的注释不能过多程序中的注释不能过多 不必要注释含义已经十分清楚的代码不必要注释含义已经十分清楚的代码 修改代码时应该同时修改注释,以保证注释修改代码时应该同时修改注释,以保证注释和代码的一致性和代码的一致性 注释应当准确易懂,防止出现二义性注释应当准确易懂,防止出现二义性 注释的位置应该与被描述的代码相邻,应该注释的位置应该与被描述的代码相邻,应该写在程序代码的上方并且和代码左对齐写在程序代码的上方并且和代码左对齐 变量定义和分支语句(条件分支、循环语句
10、变量定义和分支语句(条件分支、循环语句等)必须写注释,因为这些语句往往是程序实等)必须写注释,因为这些语句往往是程序实现某一特定功能的关键。现某一特定功能的关键。软件编码规范代码的版式:代码的版式:n适当的空行适当的空行n代码行及行内空格代码行及行内空格n分行、对齐与缩进分行、对齐与缩进n命名规则命名规则n声明声明n注释注释软件编码规范软件编码规范的要求:1.可读性要求:可读性第一,效率第二。可读性要求:可读性第一,效率第二。2.结构化要求结构化要求3.正确性与容错性要求正确性与容错性要求4.可重用与可移植性要求可重用与可移植性要求错误严重性问题:问题:编译没有错误是否说明程序没有错误?编译没
11、有错误是否说明程序没有错误?如何发现程序中的逻辑错误或语义错误?如何发现程序中的逻辑错误或语义错误?严重性是代码检查的基本特性,通过其分类可以严重性是代码检查的基本特性,通过其分类可以划定错误的优先顺序,以便理性地调度工作。划定错误的优先顺序,以便理性地调度工作。错误的严重性错误的严重性 严重的:需求没有满足严重的:需求没有满足 很小的:不影响运行和维护很小的:不影响运行和维护 中等的:除了以上两种情况中等的:除了以上两种情况错误类型 逻辑问题逻辑问题 遗漏的事件或步骤;重复的逻辑;忽视的前提条件遗漏的事件或步骤;重复的逻辑;忽视的前提条件;不必要的函数;误解;忽视的条件测试;检查错误;不必要
12、的函数;误解;忽视的条件测试;检查错误的变量;不正确的循环等的变量;不正确的循环等 计算问题计算问题 不充分的或不正确的等式表达式;精确性的损失;不充分的或不正确的等式表达式;精确性的损失;符号约定错误符号约定错误 接口时间问题接口时间问题 不正确的中断处理;不正确的不正确的中断处理;不正确的I IO O 时间分配;不匹时间分配;不匹配的子程序配的子程序 数据处理问题数据处理问题 不正确的数据初始化;不正确的数据访问或数据存不正确的数据初始化;不正确的数据访问或数据存储;不正确的数据标量值或单位;不正确的数据维数储;不正确的数据标量值或单位;不正确的数据维数 不正确的数据范围不正确的数据范围错
13、误类型数据问题数据问题 不正确或缺少敏感数据;不正确或缺少操作数不正确或缺少敏感数据;不正确或缺少操作数据;不正确或缺少表中的嵌入数据;不正确或据;不正确或缺少表中的嵌入数据;不正确或缺少外部数据;不正确或缺少输出数据;不正缺少外部数据;不正确或缺少输出数据;不正确或缺少输入数据确或缺少输入数据文档问题文档问题 模糊说明等模糊说明等文档的质量文档的质量 可适用的标准不匹配等可适用的标准不匹配等之前修改引起的错误之前修改引起的错误互操作性问题互操作性问题 与其他软件或构件不兼容与其他软件或构件不兼容代码检查清单代码检查:类代码检查:类类的命名是否与需求和设计相符类的命名是否与需求和设计相符?能否
14、是抽象的能否是抽象的?类的头部是否说明了该类的目的类的头部是否说明了该类的目的?类的头部是否引用了相关的需求和设计类的头部是否引用了相关的需求和设计元素元素?是否说明了该类所从属的包是否说明了该类所从属的包?是否尽量地私有(是否尽量地私有(private)?)?应该是应该是final(Java语言)吗语言)吗?是否已经应用了文档标准是否已经应用了文档标准?代码检查清单代码检查:属性代码检查:构造函数代码检查:方法头代码检查:方法体实例分析例例1 1:程序注释:程序注释程序注释的原则程序注释的原则注释应当浅显、明白注释应当浅显、明白注释不是程序员指南注释不是程序员指南注释不是标准库函数参考手册注
15、释不是标准库函数参考手册注释的主要任务是答疑解惑而不是增加程序的行数注释的主要任务是答疑解惑而不是增加程序的行数好的注释是对设计思想的精确表述和清晰展现好的注释是对设计思想的精确表述和清晰展现问题:问题:例例1 1 的程序注释存在什么问题?的程序注释存在什么问题?按照上述原则,如何修改例按照上述原则,如何修改例1 1 的程序注释?的程序注释?例例2 2:变量命名规则:变量命名规则例2 所示的程序风格如何?你能够容易理解吗?例3:内存问题例例3 所示的程序运行时会崩溃,其中有四处足所示的程序运行时会崩溃,其中有四处足以让程序崩溃的错误,找出错误并改加以正。以让程序崩溃的错误,找出错误并改加以正。
16、总结总结 非法内存访问的基本特征是代码访问了不该非法内存访问的基本特征是代码访问了不该访问的内存地址访问的内存地址 某些某些“自由的自由的”语言更容易引发内存错误(语言更容易引发内存错误(如如C/C+C/C+)要避免产品中出现内存错误,好的编码规范要避免产品中出现内存错误,好的编码规范、所选的语言和工具、有效的测试等工作都是、所选的语言和工具、有效的测试等工作都是有意义的有意义的例3:内存问题内存的分配方式内存的分配方式从静态存储区域分配内存在编译时已分配好,在程序从静态存储区域分配内存在编译时已分配好,在程序的整个运行期间都存在。例如:全局变量、静态变量的整个运行期间都存在。例如:全局变量、
17、静态变量等。等。在堆栈上创建在函数执行期间,函数内的局部变量(在堆栈上创建在函数执行期间,函数内的局部变量(包括形参)的存储单元都创建在堆栈上,函数结束时包括形参)的存储单元都创建在堆栈上,函数结束时这些存储单元自动释放(堆栈清退)。这些存储单元自动释放(堆栈清退)。从堆(从堆(heap heap)上分配,也称动态内存分配程序运行期)上分配,也称动态内存分配程序运行期间用间用mallocmalloc或或new new 申请任意数量的内存,程序员自己申请任意数量的内存,程序员自己掌握释放内存的恰当时机(使用掌握释放内存的恰当时机(使用free free 或或deletedelete)。)。例3:
18、内存问题建议建议使用使用mallocmalloc或或newnew申请内存之后,应该立即检查指申请内存之后,应该立即检查指针值是否为针值是否为NULLNULL(或进行异常处理),以防使用(或进行异常处理),以防使用值为值为NULL NULL 的指针。的指针。不要忘记初始化指针、数组和动态内存,防止将不要忘记初始化指针、数组和动态内存,防止将未初始化的内存作为右值使用。未初始化的内存作为右值使用。避免数组或指针下标越界,特别要当心避免数组或指针下标越界,特别要当心“多多1”1”或或“少少1”1”操作。操作。动态内存的申请与释放必须配对,防止内存泄漏动态内存的申请与释放必须配对,防止内存泄漏。使用使
19、用free free 或或delete delete 释放了内存之后,立即将指释放了内存之后,立即将指针置为针置为NULLNULL,防止产生,防止产生“野指针野指针”。例4:例外处理总结总结异常处理机制相当有用,但同时也容易异常处理机制相当有用,但同时也容易被误用而导致代码结构混乱被误用而导致代码结构混乱在使用异常处理的过程中,小心其中可在使用异常处理的过程中,小心其中可能存在的内存问题能存在的内存问题有必要认真把握异常处理中的跳转和嵌有必要认真把握异常处理中的跳转和嵌套机制套机制 例5:性能问题例例5 所示程序的写法对程序的执行速度有所示程序的写法对程序的执行速度有所影响,请找出相关地方并进
20、行改进。所影响,请找出相关地方并进行改进。总结总结改进算法可以显著提高速度改进算法可以显著提高速度将代码和数据保存在更快的介质上同样将代码和数据保存在更快的介质上同样可以显著提高速度可以显著提高速度编译优化选项并不总能提高速度编译优化选项并不总能提高速度 习题 习题n第一个第一个for循环的代码简练且结构清晰,但循环的代码简练且结构清晰,但效率较低;效率较低;n第二个第二个for循环的执行效率较高,但结构不循环的执行效率较高,但结构不够紧凑。够紧凑。习题 习题n程序程序1:系统运行崩溃。:系统运行崩溃。n原因:原因:GetMemory(str,100)并没)并没有将申请到的内存传回到调用程序,有将申请到的内存传回到调用程序,str一一直是直是NULL,从而导致非法内存访问,使,从而导致非法内存访问,使程序崩溃。程序崩溃。习题 习题 习题 习题