开发者是保护代码道德的最后防线?

2023-10-23 22:10

本文主要是介绍开发者是保护代码道德的最后防线?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

开发者是保护代码道德的最后防线?

作者 | Ádám Sándor,Anne Currie

译者 | 薛命灯

编辑 | 小智

我们可以将技术道德定义为发现 IT 系统可能出现的问题(如个人或团体的劣势或伤害),并采取切实步骤避免这些问题。对于开发人员来说,合乎道德行事的关键是要保护人们免受软件系统给我们带来的危害。复杂的道德问题,比如避免使用有偏见的机器学习训练数据或让用户免于政治操纵,这些都是普通职业行为的延伸。作为工程师,我们有权力有所保留,但这对于推动变革来说作用不大。

3 月份,Stack Overflow 发布了他们的 2018 年开发者调查报告,并首次提出了有关道德的问题。对于“开发人员是否有义务考虑代码的道德影响”这个问题,有近 80%的人回答“是”。不过,只有 20%的人认为他们最终在为不道德的代码负责,40%的人会在被要求的情况下写不道德的代码(大多数人会说“这取决于”,我姑且把他们的回答解读为“是的,但我感觉不好”),只有 50%的人表示在发现不道德的代码时会举报。调查报告地址:

https://insights.stackoverflow.com/survey/2018/

如果代码对世界的影响不大,那么这也许就不成问题。如果我写了一个对 100 个人不利的算法,虽然很糟糕,但影响也是有限的。但是,如果我在拥有数十亿用户的 Facebook 或 Google 上做同样的事情,结果会很严重。扩大规模虽然有好处,但也可能带来同样多的坏处。

我们大多数人不为超大规模公司工作,但目标通常也是要增长,这样的文化很难发生改变。在开始时,投机取巧的做法可能有一定作用(例如优步决定测试没有牌照的自动驾驶汽车),但之后很难让滑坡的道德归位。

我们可以做很多事情,作为开发人员,我们设计、编写和部署代码。如果我们愿意,就可以成为防止不道德代码上线的最后一道防线。我们都听到过这样一句话:“你建造它,你运行它,你拥有它”。那么我们是否也应该承担起道德责任?在法律上,我们可能已经这样做了。我不希望自己在法庭上、在每日邮报的头条上或其他任何地方说这样的话:“我只是遵命行事”,但怎样才能真正避免这样的情况?

到底什么是道德?

我们不必拿有轨电车问题来做说明,技术道德并不是哲学的一个晦涩分支。道德代表了专业、合理的行为。我们可以将技术道德定义为发现 IT 系统可能出现的问题(如个人或团体的劣势或伤害),并采取切实步骤避免这些问题。

这在实际当中意味着什么?我们亲身遇到的这种道德问题通常都是非常普通的:

  • 资源严重不足的项目。一个交付的项目不具备过关的质量,因为它没有得到足够的资源。
  • 数据安全性不足。保护客户数据的措施还不够好,这可能会因为暴露个人信息而伤害了用户。
  • 过度的数据收集。应用程序保存超出实际需要的用户数据,因此承担了不必要的风险。
  • 备份不足。如果发生故障,用户可能会因为丢失重要数据或服务而受到损失。

这些道德问题都不是什么深不可测的新生事物。它们不像是邦德勇闯恶棍盘踞的巢穴,也不是要揭穿邪恶的政府计划。它们是大多数公司每天都在与之斗争的问题,沉闷却无比重要,开发者甚至因此无法睡上一个安稳觉。我敢肯定,我们之前都遇到过这样的事情,并感觉非常糟糕。

我们不能说出错就是不道德的——软件总会出错。但如果我们不做出合理的努力来避免问题的出现,或者在发生问题时没有指出来,或者在遇到问题是没有去解决问题,那就只是不道德的(或者说是不专业的)。

处理更复杂的道德问题只是普通职业行为的延伸,例如避免使用有偏见的机器学习训练数据或让用户不受政治操纵。从我们都有资格讨论的一般性问题(如备份)到需要博士学位来解决的哲学问题,它们之间并没有天壤之别,它们存在于同一个连续的频谱上。一方面,对于熟悉的问题,我们有定义好的最佳实践(比如备份),另一方面,我们面临新的技术,对于它们的故障模式我们并不熟悉,而且缺乏相应的指南(如机器学习)。

例如,让我们来看看一个真实案例——在星巴克等美国公司中非常流行的 Kronos 调度软件。 2014 年,纽约时报披露,通过 Kronos 算法来提升门店效率对员工的生活产生了非常负面的影响。我确信 Kronos 的开发者不是故意要这么做,他们只是没有预见到会发生这些问题,也没有现成的指南可用。

这里的道德问题并不是开发者的错。人们没有意识到,因为没有历史可循,所以就有可能会发生错误,需要在没有国家报纸这类实体干预的情况下发现并纠正这些错误。就观察工具来说,纽约时报通常不是最好的选择。问题不在于开发人员缺乏同理心,而是他们并不知道软件在已知和未知问题频谱中处于什么样的位置,并据此采取行动。他们没有进行足够的测试和监控,所以这属于专业性问题,而他们原本不需要心理学硕士学位就能完成这些事情。

我们最终将为机器学习、个性化算法等技术总结出最佳实践。只是现在我们还没有这么做,暂时还处在混乱的状态。这与 20 年前刚出现安全性或可访问性时的情况并没有本质的区别,但在数量上却十分不同,因为如果现在搞错一些东西,就会有很多人受到影响。这意味着我们需要更快地采取行动,并定义和分享好的行为。自我监管的能力必须赶上创新的速度。

作为开发者,关键在于保护人们免受软件已知问题的伤害。无论这种伤害是来自可怕的 AI 还是未经测试的备份操作,我们都需要最佳实践来指导我们。目前,关于软件工程师的道德或专业行为准则应该按照自上而下(政府立法或专业团体)还是自下而上(自主发起)的方式来定义存在很多争论。在我看来,最重要的是我们能够快速创建、分享和遵循指导方针,并快速解决问题,因此我们需要由软件工程师自己推动一种开创性的方法。自上而下的方式效率太低了。

当然,说起来容易做起来难。过去,我们都接受不道德的东西。如果我们总是无法获得足够的灾难恢复预算,那么我们将如何确保有足够保资源来监控具有种族偏见的算法?更何况我们有可能不知道如何做到这些!或者说服我们的雇主为我们提供源源不断的资金?这似乎是不可能的事情!这些事情已经注定了!

任何事情都比“注定的”要好,我倾向于从最简单的事情开始。很多公司都可以保证做到最基本的道德,如应用安全补丁,因此要强制推行责任行为不是不可能的。那么在现实中,开发人员可以做哪些道德的行为?

释放你的力量

如果一个软件工程师看到某些不道德的东西或者某些可能不道德且缺乏监管的东西,他可以做些什么?当你这样问一个典型的工程师时,可能会得到三个答案:

  • 发出警报,然后继续工作(警报可能无效,因为管理层已经知道它们的行为存在问题)。
  • 离开项目(或业务)!
  • 成为一名举报人(最难的选择,你可能会获得一些感激,但可能需要在俄罗斯度过余生)。

所以,开发者认为其中的一种选择不太可能(成为举报者),而另外两项代价也很高,他们也不太可能接受。这些就是 Stack Overflow 问卷调查的结果吗?难怪他们都是失败主义者。

当然,上述这些并非唯一的选项。开发人员比我们意识到的要强大得多。具体来说,我们有消费权力和专业力量。我为什么这么说?

消费者权力

所有工程师都有权力保留他们的预算(消费者权力)。如果你对此持怀疑态度,请想想那些技术大会上的女性演讲者。十年前,几乎没有女性在大型科技会议上发言。而现在,该行业中女性的比例占到大约 15-20%。这并不是因为会议组织者是一群嬉皮士,也不是因为她们可以轻而易举地赢得话语权。会议委员会之所以接受女性演讲者,是因为如果他们不这么做,就会遭到与会者的投诉。这是一个简单的例子,开发者购买了大会门票,那么就有权获得他们想要的东西。

消费者权力是推动变革最简单的方式。只要工程师购买或使用高科技产品和服务,他们就可以行使这项权力。例如,开发人员询问云供应商的可再生能源政策,以此来改善它们,或者从一个你认为不道德的供应商转换到另一个你认为相对较好的供应商——只要你告诉他们为什么要这么做!

专业力量

开发者拥有的第二种力量就是他们的专业知识。技术人员供不应求,公司热衷于雇用他们,并且想方设法留住他们。如果工程师期望雇主具备明确的道德技术流程,他们就会如愿以偿。

什么是道德技术流程?

我已经说过,我们应该对道德技术流程有所期待,但到目前为止还没有这样的流程!我们需要与软件工程师一起来制定这样的流程,原因有三:

  • 我们可以知道和避免其他人已经遇到的问题。
  • 通过一个清晰的流程,可以更容易地确认一个功能及其监控级别是否符合道德标准。
  • 一旦达成一致的流程,我们就可以对它们进行自动化。

让我们从定义一些简单的检查清单开始,并尝试实施它们,看看它们是否有效。检查清单虽然技术含量低,但在航空业,它们在提高安全性方面却非常有效。学习现有的最佳实践是一个很好的策略。

因为必须扩展到我们正在构建的所有新事物上,所以我们需要在前期和回顾过程中思考如何在新领域中应用最佳实践,并分享我们的想法。考虑使用测试驱动开发,并尽早考虑故障模式,这样做通常都很有效。我们不喜欢在不经测试的情况下使用开源代码,不过我们目前允许在没有作者或其他用户给出道德指南的情况下使用开源代码。也许我们不应该这样?

英文原文

https://www.infoq.com/articles/developers-tech-ethics

这篇关于开发者是保护代码道德的最后防线?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/270750

相关文章

Java集合之Iterator迭代器实现代码解析

《Java集合之Iterator迭代器实现代码解析》迭代器Iterator是Java集合框架中的一个核心接口,位于java.util包下,它定义了一种标准的元素访问机制,为各种集合类型提供了一种统一的... 目录一、什么是Iterator二、Iterator的核心方法三、基本使用示例四、Iterator的工

Java 线程池+分布式实现代码

《Java线程池+分布式实现代码》在Java开发中,池通过预先创建并管理一定数量的资源,避免频繁创建和销毁资源带来的性能开销,从而提高系统效率,:本文主要介绍Java线程池+分布式实现代码,需要... 目录1. 线程池1.1 自定义线程池实现1.1.1 线程池核心1.1.2 代码示例1.2 总结流程2. J

JS纯前端实现浏览器语音播报、朗读功能的完整代码

《JS纯前端实现浏览器语音播报、朗读功能的完整代码》在现代互联网的发展中,语音技术正逐渐成为改变用户体验的重要一环,下面:本文主要介绍JS纯前端实现浏览器语音播报、朗读功能的相关资料,文中通过代码... 目录一、朗读单条文本:① 语音自选参数,按钮控制语音:② 效果图:二、朗读多条文本:① 语音有默认值:②

Vue实现路由守卫的示例代码

《Vue实现路由守卫的示例代码》Vue路由守卫是控制页面导航的钩子函数,主要用于鉴权、数据预加载等场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、概念二、类型三、实战一、概念路由守卫(Navigation Guards)本质上就是 在路

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

JAVA实现Token自动续期机制的示例代码

《JAVA实现Token自动续期机制的示例代码》本文主要介绍了JAVA实现Token自动续期机制的示例代码,通过动态调整会话生命周期平衡安全性与用户体验,解决固定有效期Token带来的风险与不便,感兴... 目录1. 固定有效期Token的内在局限性2. 自动续期机制:兼顾安全与体验的解决方案3. 总结PS

C#中通过Response.Headers设置自定义参数的代码示例

《C#中通过Response.Headers设置自定义参数的代码示例》:本文主要介绍C#中通过Response.Headers设置自定义响应头的方法,涵盖基础添加、安全校验、生产实践及调试技巧,强... 目录一、基础设置方法1. 直接添加自定义头2. 批量设置模式二、高级配置技巧1. 安全校验机制2. 类型

Python屏幕抓取和录制的详细代码示例

《Python屏幕抓取和录制的详细代码示例》随着现代计算机性能的提高和网络速度的加快,越来越多的用户需要对他们的屏幕进行录制,:本文主要介绍Python屏幕抓取和录制的相关资料,需要的朋友可以参考... 目录一、常用 python 屏幕抓取库二、pyautogui 截屏示例三、mss 高性能截图四、Pill

使用MapStruct实现Java对象映射的示例代码

《使用MapStruct实现Java对象映射的示例代码》本文主要介绍了使用MapStruct实现Java对象映射的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、什么是 MapStruct?二、实战演练:三步集成 MapStruct第一步:添加 Mave

Java抽象类Abstract Class示例代码详解

《Java抽象类AbstractClass示例代码详解》Java中的抽象类(AbstractClass)是面向对象编程中的重要概念,它通过abstract关键字声明,用于定义一组相关类的公共行为和属... 目录一、抽象类的定义1. 语法格式2. 核心特征二、抽象类的核心用途1. 定义公共接口2. 提供默认实