[计算机]高质量c_c编程指南内容摘要:

龙行天下 院找工作,接受微软公司一位资深软件工程师的面试。 他让我写函数 strcpy 的代码。 太容易了吧。 错。 这么一个小不点的函数,他从三个方面考查: ( 1)编程风格; ( 2)出错处理; ( 3)算法复杂度分析(用于提高性能)。 在大学里从来没有人如此严格地考查过我的程序。 我化了半个小时,修改了数次,他还不尽满意,让我回家好好琢磨。 我精神抖擞地进“考场”,大汗淋漓地出“考场”。 这“高手”当得也太窝囊了。 我又好好地反省了一次。 我把反省后的心得体会写成文章放在网上传阅,引起了不少软件开发人员的共鸣。 我因此有幸和国产大型 IT 企业如华为、上海贝尔、中兴等公司的同志们广泛交流。 大家认为提高质量与生产率是软件工程要解决的核心问题。 高质量程序设计是非常重要的环节,毕竟软件是靠编程来实现的。 我们心目中的老手们和高手们能否编写出高质量的程序来。 不见得都能。 就我的经历与阅历来看,国内大学的计算机教育压根就没有灌输高质量程序设计的观念,教师们和学生们也很少自觉关心软件的质量。 勤奋好学的程序员长期在低质量的程序堆中滚爬,吃尽苦头之后才有一些心得体会,长进极慢,我就是一例。 现在国内 IT 企业拥有学士、硕士、博士文凭的软件开发人员比比皆是,但他们在接受大学教育时就“先天不足”,岂能一到企业就突然实现质的飞跃。 试问有多少软件开发人员对正确性、健壮性、可靠性、效率、易用性、可读性(可理解性)、可扩展性 、可复用性、兼容性、可移植性等质量属性了如指掌。 并且能在实践中运用自如。 “高质量”可不是干活小心点就能实现的。 我们有充分的理由疑虑: ( 1)编程老手可能会长期用隐含错误的方式编程(习惯成自然),发现毛病后都不愿相信那是真的。 ( 2)编程高手可以在某一领域写出极有水平的代码,但未必能从全局把握软件质量的方方面面。 事实证明如此。 我到上海贝尔工作一年来,陆续面试或测试过近百名“新”“老”程序员的编程技能,质量合格率大约是 10%。 很少有人能够写出完全符合质量要求的 if 语句,很多程序员对指针、内存管理一知 半解, ……。 领导们不敢相信这是真的。 我做过现场试验:有一次部门新进 14 名硕士生,在开欢迎会之前对他们进行“ C++/C编程技能”摸底考试。 我问大家试题难不难。 所有的人都回答不难。 结果没有一个人及格,有半数人得零分。 竞争对手公司的朋友们也做过试验,同样一败涂地。 真的不是我“心狠手辣”或者要求过高,而是很多软件开发人员对自己的要求不够高。 要知道华为、上海贝尔、中兴等公司的员工素质在国内 IT 企业中是比较前列的,倘若他们的编程质量都如此差的话,我们怎么敢期望中小公司拿出高质量的软件呢。 连程序都编不好,还谈什么 振兴民族软件产业,岂不胡扯。 我打算定义编程老手和编程高手,请您别见笑。 定义 1:能长期稳定地编写出高质量程序的程序员称为编程老手。 定义 2:能长期稳定地编写出高难度、高质量程序的程序员称为编程高手。 根据上述定义,马上得到第一推论:我既不是高手也算不上是老手。 ★ 管理 篇 ★ ( 转载 ) 龙行天下 在写此书前,我阅读了不少程序设计方面的英文著作,越看越羞惭。 因为发现自己连编程基本技能都未能全面掌握,顶多算是二流水平,还好意思谈什么老手和高手。 希望和我一样在国内土生土长的程序员朋友们能够做到: ( 1)知错就改; ( 2)经常温故而知新; ( 3)坚持学习,天天向上。 ★ 管理 篇 ★ ( 转载 ) 龙行天下 二、本书导读 首先请做附录 B 的 C++/C 试题(不要看答案),考查自己的编程质量究竟如何。 然后参照答案严格打分。 ( 1)如果你只得了几十分,请不要声张,也不要太难过。 编程质量差往往是由于不良习惯造成的,与人的智力、能力没有多大关系,还是有药可救的。 成绩越差,可以进步的空间就越大,中国不就是在落后中赶超发达资本主义国家吗。 只要你能下决心改掉不良的编程习惯,第二次考试就能及格了。 ( 2)如果你考及格了,表明你的技术基础不错,希望你能虚心学习、不断进步。 如果你还没有找到合适的工作单位, 不妨到上海贝尔试一试。 ( 3)如果你考出 85 分以上的好成绩,你有义务和资格为你所在的团队作“ C++/C编程”培训。 希望你能和我们多多交流、相互促进。 半年前我曾经发现一颗好苗子,就把他挖到我们小组来。 ( 4)如果你在没有任何提示的情况下考了满分,希望你能收我做你的徒弟。 编程考试结束后,请阅读本书的正文。 本书第一章至第六章主要论述 C++/C编程风格。 难度不高,但是细节比较多。 别小看了,提高质量就是要从这些点点滴滴做起。 世上不存在最好的编程风格,一切因需求而定。 团队开发讲究风格一致,如果制定了大家认可的 编程风格,那么所有组员都要遵守。 如果读者觉得本书的编程风格比较合你的工作,那么就采用它,不要只看不做。 人在小时候说话发音不准,写字潦草,如果不改正,总有后悔的时候。 编程也是同样道理。 第七章至第十一章是专题论述,技术难度比较高,看书时要积极思考。 特别是第七章“内存管理”,读了并不表示懂了,懂了并不表示就能正确使用。 有一位同事看了第七章后觉得“野指针”写得不错,与我切磋了一把。 可是过了两周,他告诉我,他忙了两天追查出一个 Bug,想不到又是“野指针”出问题,只好重读第七章。 光看本书对提高编程质量是有限的,建 议大家阅读本书的参考文献,那些都是经典名著。 如果你的编程质量已经过关了,不要就此满足。 如果你想成为优秀的软件开发人员,建议你阅读并按照 CMMI规范做事,让自己的综合水平上升一个台阶。 上海贝尔的员工可以向网络应用事业部软件工程研究小组索取 CMMI 有关资料,最好能参加培训。 ★ 管理 篇 ★ ( 转载 ) 龙行天下 三、版权声明 本书的大部分内容取材于作者一年前的书籍手稿(尚未出版),现整理汇编成为上海贝尔网络应用事业部的一个规范化文件,同时作为培训教材。 由于 C++/C编程是众所周知的技术,没有秘密可言。 编程的好经验应该大家共享,我们自 己也是这么学来的。 作者愿意公开本书的电子文档。 版权声明如下: ( 1)读者可以任意拷贝、修改本书的内容,但不可以篡改作者及所属单位。 ( 2)未经作者许可,不得出版或大量印发本书。 ( 3)如果竞争对手公司的员工得到本书,请勿公开使用,以免发生纠纷。 预计到 2020 年 7 月,我们将建立切合中国国情的 CMMI 3 级解决方案。 届时,包括本书在内的约 1000页规范将严格受控。 欢迎读者对本书提出批评建议。 林锐, 2020 年 7 月 ★ 管理 篇 ★ ( 转载 ) 龙行天下 第 1 章 文件结构 每个 C++/C程序通常分为两个文件。 一个文件用于保存程序的 声明( declaration),称为头文件。 另一个文件用于保存程序的实现( implementation),称为定义( definition)文件。 C++/C 程序的头文件以“ .h”为后缀, C程序的定义文件以“ .c”为后缀, C++程序的定义文件通常以“ .cpp”为后缀(也有一些系统以“ .cc”或“ .cxx”为后缀)。 版权和版本的声明 版权和版本的声明位于头文件和定义文件的开头(参见示例 11),主要内容有: ( 1)版权信息。 ( 2)文件名称,标识符,摘要。 ( 3)当前版本号,作者 /修改者,完成日期。 ( 4)版本历史信息。 /* * Copyright (c) 2020,上海贝尔有限公司网络应用事业部 * All rights reserved. * * 文件名称: * 文件标识: 见配置管理计划书 * 摘 要: 简要描述本文件的内容 * * 当前版本: * 作 者: 输入作者(或修改者)名字 * 完成日期: 2020年 7月 20日 * * 取代版本 : * 原作者 : 输入原作者(或修改者)名字 * 完成日期: 2020年 5月 10日 */ 示例 11 版权和版本 的声明 头文件的结构 头文件由三部分内容组成: ( 1)头文件开头处的版权和版本声明(参见示例 11)。 ( 2)预处理块。 ( 3)函数和类结构声明等。 假设头文件名称为 ,头文件的结构参 见示例 12。  【规则 121】 为了防止头文件被重复引用,应当用 ifndef/define/endif 结构产生预处理块。  【规则 122】 用 include 格式来引用标准库的头文件(编译器将从标准库目录开始搜 ★ 管理 篇 ★ ( 转载 ) 龙行天下 索)。  【规则 123】 用 include “” 格式来引用非标准库的头文件(编译器将从用户的工作目录开始搜索)。  【建议 121】 头文件中只存放“声明”而不存放“定义” 在 C++ 语法中,类的成员函数可以在声明的同时被定义,并且自动成为内联函数。 这虽然会带来书写上的方便,但却造成了风格不一致,弊大于利。 建议将成员函数的定义与声明分开,不论该函数体有多么小。  【建议 122】 不提倡使用全局变量,尽量不要在头文件中出现象 extern int value 这类声明。 // 版权和版本声明见示例 11,此处省略。 ifndef GRAPHICS_H // 防止 被重复引用 define GRAPHICS_H include // 引用标准库的头文件 „ include “” // 引用非标准库的头文件 „ void Function1(„)。 // 全局函数声明 „ class Box // 类结构声明 { „ }。 endif 示例 12 C++/C 头文件的结构 定义文件的结构 定义文件有三部分内容: ( 1) 定义文件开头处的版权和版本声明(参见示例 11)。 ( 2) 对一些头文件的引用。 ( 3) 程序的实现体(包括数据和代码)。 假设定义文件的名称为 , 定义 文件的结构参 见示例 13。 ★ 管理 篇 ★ ( 转载 ) 龙行天下 // 版权和版本声明见示例 11,此处省略。 include “” // 引用头文件。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。