软件工程 软件工程师的誓言

有人说 程序 = 算法 + 数据结构

有人说 软件 = 程序 + 软件工程,  软件企业 = 软件 + 商业模式。

 

程序本身没有伦理和职业道德, 但是程序员和软件企业要有。 我们听说过很多例子:  

  • 一个在银行工作的程序员曾说, 每次给客户计算利息的时候那些除不尽的小数, 如果程序自动转给我的账户上就好了…
  • 一个程序员奉命实现一个功能, 把用户机器上的另一个公司的程序给卸载掉; 或者要求用户卸载另一个程序, 否则本程序退出。
  • 一个程序员写了一个手机游戏软件, 然后把用户的通讯录信息悄悄上传。
  • 绝大多用户在安装软件或使用网络服务的时候都不看使用协议 (EULA), 直接点 “同意” 或者 “下一步”, 万一程序在这里搞了些猫腻怎么办?
  • 在大学里,网上选课是一件很讲究时效的事情 - 因为好的课程不多, 大家都想上。我在清华上课的时候, 大家也讨论过 “刷课机”,  “换课机” 这样的小程序是否合乎道德和公平。 春运火车票也是同样的抢手, 那么程序员写一些浏览器插件/专用小软件去搞票是好事,坏事,还是不好不坏?  这些行为应该用哪些道德/规定/法律来约束?  

我们每天走过卖麻辣烫的小摊; 我们要打听如何送 “赞助费”才能让小孩上学; 走在路上, 自称房屋中介的人会给你发许多彩色资料; 电视里我们看到新闻发言人振振有词的发言; 关掉电视, 我不禁要说 - 职业道德不是万能的, 但是没有职业道德是万万不能的啊…

 

批评别的行业和别人都很容易,  我们IT 行业本身又怎么样呢?  越来越多的人们把自己的账户名, 密码, 手机号, 身份证号… 交给程序, 希望程序后面的程序员不做坏事; 许多社会功能如查询信息, 彩票, 汽车摇号, 交通管理, 甚至核电站运行都交给了软件工程师创造的软件来管理。 那么在所有法律条文被严格制定和执行之前, 有没有什么伦理来约束这些人的行为?

 

在医学上有著名的希波克拉底誓言, 其中一个版本如下:

“我保证履行由于我的专业我自愿承担的治疗和帮助病人的义务。我的义务是基于病人所处的软弱不利的地位,以及他必然给予我和我的专业能力完全信任。所以,我保证把病人多方面的利益作为我的专业伦理的第一原则。由于承认这种约束,我接受下列义务,只有病人或病人的合法代理人才能解除我这些义务:

①将病人的利益置于我专业实践的中心,并在情况需要时置于我自己的自我利益上。

②拥有和保持我的专业要求的知识和技能的能力。

③承认我的能力的局限,只要我的病人病情需要,我应向我的各种卫生专业的同事求助。

④尊重其他卫生专业同事的价值和信念,并承认他们作为个人的道德责任

⑤用同等的关切和献身精神关怀所有需要我帮助的人,不管他们有没有能力付酬。

。。。

 

那么软件工程师有类似的誓言么?  这个可以有  -  IEEE/ACM 在前几年就发布了 Software Engineering Code of Ethics and Professional Practice。  现在已经是5.2 版, 一个简化版是: 

 

PREAMBLE

The short version of the code summarizes aspirations at a high level of the abstraction; the clauses that are included in the full version give examples and details of how these aspirations change the way we act as software engineering professionals. Without the aspirations, the details can become legalistic and tedious; without the details, the aspirations can become high sounding but empty; together, the aspirations and the details form a cohesive code.

Software engineers shall commit themselves to making the analysis, specification, design, development, testing and maintenance of software a beneficial and respected profession. In accordance with their commitment to the health, safety and welfare of the public, software engineers shall adhere to the following Eight Principles:

1. PUBLIC - Software engineers shall act consistently with the public interest.

2. CLIENT AND EMPLOYER - Software engineers shall act in a manner that is in the best interests of their client and employer consistent with the public interest.

3. PRODUCT - Software engineers shall ensure that their products and related modifications meet the highest professional standards possible.

4. JUDGMENT - Software engineers shall maintain integrity and independence in their professional judgment.

5. MANAGEMENT - Software engineering managers and leaders shall subscribe to and promote an ethical approach to the management of software development and maintenance.

6. PROFESSION - Software engineers shall advance the integrity and reputation of the profession consistent with the public interest.

7. COLLEAGUES - Software engineers shall be fair to and supportive of their colleagues.

8. SELF - Software engineers shall participate in lifelong learning regarding the practice of their profession and shall promote an ethical approach to the practice of the profession.

 

以上内容的版权说明:

This Code may be published without permission as long as it is not changed in any way and it carries the copyright notice. Copyright (c) 1999 by the Association for Computing Machinery, Inc. and the Institute for Electrical and Electronics Engineers, Inc.

 

这也是清华大学 <现代软件工程> 课程的一个团队作业,   希望各个小组能分工翻译,  发布在小组博客上, 要求文字精炼典雅, 以便流传百世。 Smile

-----

下面是同学们详细翻译的汇编:

目前,计算机已经成为推动经济、工业、政治、医疗、教育、娱乐和整个社会发展的核心技术。而在这当中,软件工程师通过亲身参与或者教授软件系统的分析、说明、设计、开发、授权、维护和测试等实践工作,为社会做出了巨大贡献。正是由于他们在软件系统开发中起到的重要作用,软件工程师有很大的机会去造福或者危害社会,并有能力去促使或影响他人造福或者危害社会。为了尽可能确保这些影响是有利于社会的,软件工程师必须承诺自己所从事的职业能造福社会, 并且能够得到大众认可尊重。这一承诺要求软件工程师必须遵守下列《职业道德规范和实践标准》。

这一《规范》包括了有关职业软件工程师的行为和决断的八项准则,涉及软件工程方面的实际工作者、教育工作者、经理、主管、决策制定者以及相关的受训人员和学生。这些准则指出了个人、小组和团体参与软件工程的道德责任关系,以及这些关系中的主要责任。每一条原则都是对这些关系中的责任做出的说明。这些责任覆盖了软件工程师的人性,他们对那些受软件工程师工作影响的人们的特别关照,以及软件工程实践的独特因素。《规范》规定任何已经成为或者想成为软件工程师的人必须遵守这些原则。

本规范的每个部分都不应该被断章取义, 孤立使用去判断人们有意或无意犯下的错误。因此这些原则和条款并不是非常完善详尽的。在实际使用过程中,不应当将条款中的可接受部分和不可接受部分分开来讲。同时,《规范》也不是一个简单的道德算法,可以产生所有的道德上的决定。在某些情况下,一些标准可能会相互抵触或者与其他地方的标准相互抵触。在这种情况下,就要求软件工程师能够运用自己的道德判断能力,在特定的情况下做出最符合《规范》的行为。

解决道德冲突最好的方法是对基本原则进行全面的思考,而不是去盲目的依靠一些具体条目。这些原则应当会促使软件工程师们去更广泛的思考哪些人是他们工作的受众,去思考他和他的同事是否给予其他人足够的尊重,去思考对他们工作有足够了解的公众会如何看待他们的决定,去思考他们的决定如何影响最小,以及去思考他们的行为是否符合一名优秀的专业软件工程师的标准。在所有这些思考中,对公众健康、安全与福利的关注是最主要的。也就是说,“公众利益”是《规范》的核心。

由于软件工程这一行业的多变性与苛刻性,它需要一份相关的规范去应对自身不断出现的新情况。《规范》记录了这个行业的道德立场与标准。因此即使是对于这样普遍性的要求,《规范》依然为软件工程师以及他们的经理提供了支持。《规范》无论是对团队中的个人还是团队本身来说都提供了一个道德基础。《规范》也规定了那些对软件工程师或其团队来说道德上不正当的要求。

这份《规范》不仅仅能用来对那些遭到质疑的行为的性质进行判断,它还具有非常重要的教育功能。由于这份《规范》表达了这个行业对于职业道德的一致认识,因此它是教育公众和那些有抱负的专业人员有关软件工程师道德责任的一种工具。

 

原则1:公众

软件工程师的行为应与公众利益一致。特别地,软件工程师应恰当地做到:

1.01 对自己分内工作负有全部责任

1.02 综合考虑软件工程师,雇主,客户,用户与公众的利益

1.03 软件是安全的,符合规范的,通过适当的测试,不降低生活的质量,不侵犯隐私,不对环境造成伤害;只有当以上条件都能够有充分确认,才认可这个软件。软件的终极效用应该是公益的。

1.04 把任何对用户、公众及与软件和相关文档有联系的外界人员可能造成的危害,告知相关人员或者专家。

1.05 努力合作来解决由软件及其安装、维护、支持和文档 所带来的公众关注的重要问题。

1.06 在所有关系到软件或者相关文件、方法和工具的的声明,尤其是在那些公开声明中,要做到公正并避免欺诈。

1.07 要考虑到由物理缺陷、资源分配、经济劣势和其他一些会降低软件收益的因素所带来的结果。

1.08 鼓励自愿将专业技能用于公益事业,促进公共学科教育的发展。

原则2:客户与雇主

软件工程师应以他们的客户和雇主最大利益化的方式做事,与公众利益一致。特别地,软件工程师应该视情况而定按如下原则工作:

2.01. 在他们的能力范围之内提供服务,诚实和坦率地对待他们经验和教育上的任何局限。

2.02. 不故意使用那些获得或保留的非法或者不道德的软件。

2.03. 只在正确地授权后使用客户或雇主的资产,并且在客户或雇主的知识和允许中进行。

2.04. 确保每一个文档的建立基础都是经过检验的,如果需要的话,由授权人士认证。

2.05 在工作中,对任何机密信息要注意保密,这种保密要与公众利益和法律一致。

2.06 当员工觉得项目将要失败,要及时识别、记录、收集证据并向他们的客户或雇主报告,以证明项目失败的原因。这些原因可能是成本太高,侵犯知识产权,抑或是其它问题。

2.07 当员工意识到在软件或相关文档中涉及某些重大的社会关注问题时,要及时发现、记录并向雇主或客户汇报。

2.08 对主要的雇主负责,不接受影响本职工作的任务。

2.09 尽可能保护雇主或客户的利益,除非出于更高的道德考虑,在这种情况下,向雇主或合适的权力机构反映道德问题。

 

 

原则3: 产品

软件工程师应当确保他们的产品以及相关的修改达到尽可能高的专业标准。具体来说,软件工程师应当:

3.01. 力求高质量,可接受的成本和合理的计划;弄清出你做出的所有影响较大的权衡,并且确保它们被雇主和客户所接受,并且把你的计划提供给用户和公众来考虑。

3.02. 确保在工作或提出任何项目的时候,设立恰当,可以达成的目标。

3.03. 识别,定义和解决各种与项目相关的道德,经济,文化,法律和环境。

3.04. 确保自身因受过合适教育和训练,以及拥有足够经验,而有资格去做他们工作或提出的项目。

3.05. 确保使用一个合适的方法去做他们工作或者提出的项目。

3.06. 只要条件许可,就应当采取专业标准去做手头的任务,除非有道德或者技术上的正当理由来支持你不这么做。

3.07. 力求完全理解你工作的specification。

3.08. 确保软件的specification完善,满足用户需求,也经过恰当的批准。

3.09. 对于任何你工作或者提出的项目,要对费用,调度,人员,质量和产出进行现实的和量化的评估,而且要给出对你的评估的不确定性的估计。

3.10. 确保对于你在做的项目的程序和文档,要有足够的测试,调试和复审。

3.11. 确保对于你在做的项目,要有足够的文档,包括所有你发现的问题和解决的方法。

3.12. 开发尊重用户隐私的软件和文档。

3.13. 留心只用合乎道德和法律的手段获取的准确数据,而且只按照被授权的方式去使用它们。

3.14. 维护数据的完整性,对于过期和有问题的数据要敏感。

3.15. 对于任何形式的软件维护,要有和开发新软件一样的专业精神。

 

 

原则4: 判断

软件工程师应当完整独立地进行自己的专业判断。具体来说,软件工程师应当:

4.01. 调节所有的技术判断以支撑和维护价值观。

4.02. 只签署并认可这样的文档:要么是自己管理之下的,要么是自己职权范围且已在业内达成共识的。

4.03. 评估任何软件和文档时保持专业的客观性。

4.04. 不参与贿赂、重复收费等不正当的经济行为。

4.05. 把无可避免的利益冲突通知给所有相关群体。

4.06. 拒绝以任何形式(作为成员或提建议者)参加一个任何形式的(私有的,政府的,专业的)和软件相关的组织,如果这个组织或者他的雇员,客户有未公开的潜在利益冲突。

 

原则5   管 理

软件项目的经理和领导人员应赞成和促进对软件开发和维护合乎道德规范的管理,特别是在适当的情况下软件工程师应当:

5.01  对其从事的项目保证良好的管理,包括提高质量和减少风险等有效手段;

5.02  保证软件工程师在遵循标准之前便知晓它们;

5.03  保证软件工程师知道雇主是如何保护对雇主或其他人保密的口令、文件和信息的有关策略和方法;

5.04  布置工作任务应先考虑其教育和经验有相应的水平,再加上有进一步教育和成长的要求;

5.05  保证对他们从事或建议的项目,做出现实和定量的估算,包括成本、进度、人员、质量和输出,并对估算的不确定性做出评估;

5.06  在雇佣软件工程师时,需实事求是地介绍雇佣条件;

5.07  提供公正和合理的报酬;

5.08  不能不公正地阻止一个人取得可以胜任的岗位;

5.09  保证对那些在软件、过程、研究、写作、或其它知识产权的所有权方面做出贡献的软件工程师,有一个公平的协议;

5.10  应对违反雇主利益或道德观念的指控,提供正规的听证过程;

5.11  不要求软件工程师去做任何与道德规范相违背的事;

5.12  不能处罚对项目表露出道德关切的人;

 

原则6   职业

在与公众利益一致的原则下,软件工程师应当保证其职业的完整和声誉,尤其地,在适当的情况下,软件工程师应当:

6.01  协助发展一个适合执行道德规范的组织环境;

6.02  推进软件工程知识的普及;

6.03  通过适当参与各种专业组织、会议和书籍的出版,来扩占软件工程知识;

6.04  作为一名职业人员,支持其他软件工程师努力遵循本守则;

6.05  不以牺牲职业、客户或雇主利益为代价,谋求自身利益;

6.06  服从所有监管作业的法规,在这种要求与公众利益有不一致时例外;

6.07  要准确叙述自己所做的软件的特性,不仅要避免错误的断言,也要防止那些纯理论的、空洞的、欺骗的、误导的或者有疑问的断言;

6.08  对所从事的软件和相关的文档,负起检测、修正和报告错误的责任;

6.09  保证让客户、雇主和主管人员知道软件工程师对本道德规范的遵守,及其带来的后果;

6.10  避免加入与本道德规范有冲突的业务和组织;

6.11 要认识违反本规范是与成为一名专业工程师不相称的;

6.12  在出现明显违反本规范时,应向有关当事人表达自己的担忧,除非在没有可能、会影响生产或有危险时才可例外;

6.13  当与明显违反道德规范的人无法磋商,或者会影响工作或有危险时,应向有关部门报告;

 

原则7: 同事

软件工程师应当正直地去帮助他们的同事,尤其是:

7.01. 鼓励同事坚持这个准则。

7.02. 在开发过程中帮助同事。

7.03. 对引用别人的工作注明来源,抵制未经允许的引用。

7.04. 代码审查时做到客观、坦诚,并适当地记录。

7.05. 认真对待同事的建议,担心,抱怨。

7.06. 在帮助你的同事时,你应该对有可能产生的安全问题有充足的了解,并有能力控制,例如是遵守规定,保护密码及机密文件等。

7.07. 不能不正当地干涉同事的工作。但是,从老板角度出发,如果前一条与公司或公共利益冲突,软件工程师可以对同事的工作提出置疑。

7.08. 当遇到自己不能胜任的问题时,请教那个领域的专家。

 

原则8: 自身

软件工程师应当在不违反道德准则的情况下,终生学习以提高自身的专业水平:

8.01. 加强各个方面的能力——分析,标准化、设计、开发、维护、测试、写文档、管理项目进程等。

8.02. 提高能力,在合理的时间内,利用合理的花费,去实现安全、可靠、高质量的软件。

8.03. 提高能力,写出精确、可读、有价值的文档。

8.04. 提高对相关文档、软件、开发环境的理解。

8.05. 加强对相关标准、法律的了解。

8.06. 深入理解这份准则,以及如何将其应用到工作中。

8.07. 不因为偏见而对任何人不公。

8.08. 不参与任何与违反些准则有关的活动。

8.09. 坚信一个专业的软件工程师不会违反此准则。

 

posted @ 2011-03-28 11:27  SoftwareTeacher  阅读(9677)  评论(15编辑  收藏  举报