没有完美的软件:编程永远不容易

摘要:很多人想用十全十美来修饰一样东西,比如软件,对于客户来说,当然希望他们的软件能做到完美。虽然很多专家说利用一些规范可以让软件达到更好!但是在现实开发中,真的会有那么完美的软件吗?

最近读了一篇文章 Software Runs the World: How Scared Should We Be That So Much of It Is So Bad? ,这篇文章没什么可说,但是评论却很有趣,特别是很多计算机科学的博士表示,使用一些规范的方法,可以让软件变的更好,还有规范、认证、授权。

对于这些想法,我只能说“祝你好运”。我干码农干了30年,我可以很肯定的说“没有银弹”,没有神奇的方法或者论文可以保证让软件变得完美,没有bug。

事实上,我们甚至很难定义一个程序,就更别提如何开发一个完美的程序了。软件在太多领域存在,有太多的编程语言,业务需求,还有运行环境,并且要和各种不确定的系统交互。你觉得你的iPhone游戏,股票交易系统,烤面包机还有火星登陆器有什么共同之处吗?你觉得给汇编,C,Java,PHP,Fortran,LIST和Erlang颁发证书可行吗?还有各种混合语言 web应用,以及分布式系统。

你需要正式的描述太多的东西,光列出所有的编程语言似乎就不可能,更不用说如何用这些语言写出完美的程序了。

我喜欢人们拿程序和社会工程对比。建造一座桥的基础在过去的两千年中没有改变过:你需要考虑重力,风力,下雨以及炎热还有很多基本的材料。这些东西罗马的工程师就知道了。但是编程不一样,我们为每个程序创造一个独立的世界,或者说我们把各种世界元素整合在一个世界中,然后在这个世界中建造几百座不同的桥,它们要同时良好的工作,还要考虑到我们创造的世界会不可预知的改变。

还有,我们造一座桥需要经过几年的规划和建造,然后使用几十年,上百年而不用进行任何修改。而软件在一直的变化当中,不管是在开发的时候还是开发完以后。美国在过去的两百年间建造了60万座桥。但是过去五年中我们就创造了一百万个iPhone的应用。应用程序可以从几行到几千万行代码,并且在现代生活的每一个角落存在。

让编程如此困难的原因是它无处不在,可以影响一个人或者10亿人,可以运行几十年或者只需要运行一次。它跟造桥完全不一样。最近的火星登陆器是用几百万行C代码写的,并且只运行一次。而高速股票交易系统一秒钟就要被执行无数次。

认为世界上存在一套标准的方法可以让你保证开发的程序是完美的这种想法很可笑。即使这种完美的奇迹存在,它的开销也会让它无法实际实施。好吧,你可以证明一段代码没问题,但是它运行在哪里呢?你能控制操作系统吗?还是其他公司提供的WebService接口?你不能控制用户的交互,你也不能控制CPU,那么你如何保证这段完美的代码可以完美的运行?

我宁愿相信你发明了时间机器也不愿意相信你的标准流程可以在这个混乱的世界行得通。

另外一个“善意的谎言”是我们可以通过标准的测试和认证来证明一个程序员可以编写完美的代码。程序员不是管道工,管道工和水,管道,气体还有阀门打交道。这些东西几乎不会改变。它们遵循物理规律,是经过认可的科学,它们不会莫名其妙的变成另外一个东西。

我认识一个程序员通过了各种Java认证,但是还是没有能力编写实际的应用程序。想象一下,要为一个人进行所有语言的认证,所有程序的认证,从面包机到宇宙飞船。要么你创造一些非常基础而无用的认证,或者非常细节的认证而没有人在乎。考虑到所有这些,还有不断变化的需求,当你需要开发一些新东西的时候你怎么办?把所有人炒了,然后雇佣新的人?

我在工作中和一位UX设计师一起培训一组Java Web程序员开发iOS程序。即使一个有经验的开发者突然做一些不一样的开发也是很困难的。但是假如我们一定坚持要正规的流程和经过认证的iOS程序员才能在市场上竞争,那么我们可能已经关门了。

我们三个人花了两个月时间开发了一个新的iPhone应用。我们只有不断快速的迭代开发才能在不断变化的需求和竞争中胜出。期望一个正规的流程在发布前验证所有的代码是噩梦。在产品发布几年后公司可能都不存在了,谁有在乎这个程序是否被认证过呢?

现实是残酷的。30多年的编程经验,可以让我非常自信的说我写的代码还不错。在1987-1994年间,我领导开发并且要最终敲定发布的二进制码。我们通过软盘的形式发布了三个Mac应用,11个主要版本,没有一次大的事故(要知道每次发布的硬件成本就是100万美元)。我们发布的代码很完美吗?我们是经过认证的Mac OS开发者/设计师吗?不是!但这些应用解决用户的问题了吗?是的。

我说的这些能证明任何东西吗?不能。但是好的代码确实存在,并且常常出自没有证书,没有学历,没有被证明过的程序员之手。

也许有一天机器人可以代替人来开发软件,并且保证不出错。人类就可以幸福的生活在完美的软件创造的世界中了。

但是我更相信时间机器会先出现。并且软件是由人类编写的。

英文出自: Software Runs the World: How Scared Should We Be That So Much of It Is So Bad?

译文来自:oschina


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/450848.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Eclipse断点调试出现Source not found

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 我的情况是和网上说的都不一样,我真的也没有想到这么坑, 我居然无意写了一个死循环,dao/mapper调sql…

Memory Compression这到底是个什么东西?

Memory Compression这到底是个什么东西? Memory Compression这个进程,经过我的查询说是内存压缩功能,作用是压缩内存让内存占用更低,但是为什么这个进程疯狂占用我的内存,我用的Win10 8G,通过资源监视器查看…

MySQL 5.6 for Windows 解压缩版配置安装

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 MySQL是一个小巧玲珑但功能强大的数据库,目前十分流行。但是官网给出的安装包有两种格式,一个是msi格式&#xf…

safari的一些问题

1、图片过大时,在webview中是不会加载显示的。2、如果是通过一个地址返回的base64数据给image,记住要在后台进行base64_decode解析数据,这样才是真实的图片数据,后台保存数据的时候不要保存"data:image/png;base64,"这一…

代码审查“思维导图”

摘要:随着人们对软件质量要求的不断提高,软件开发的每一个环节都应该得到十足的重视,俗话说:“细节决定成败”,就此,本文提供了一个代码审查“思维导图”,希望对所有码农们有所帮助。 代码审查&…

thinkCMF----导航高亮显示

导航高亮显示&#xff0c;有多种方法&#xff0c;这里给出一个简单的表示下&#xff1a; <a href"__ROOT__"><span class"text db">网站首页</span><span class"eng db">HOME</span> </a> …

The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 tomcat启动报务后访问页面报错&#xff1a; org.apache.jasper.JasperException: The absolute uri: http://java.sun.com/jsp/jstl/co…

优秀程序员和一般程序员差别在哪?

摘要&#xff1a;在这个世界上有两种程序员&#xff1a;Day Programmers&#xff08;白班程序员&#xff09;和Night Programmers&#xff08;夜猫子程序员&#xff09;&#xff0c;你知道优秀程序员和一般程序员有哪些差别吗&#xff1f;你又是哪一类型的呢&#xff1f;俗话说…

7. Oracle数据加载和卸载

在日常工作中&#xff1b;经常会遇到这样的需求&#xff1a; Oracle 数据表跟文本或者文件格式进行交互&#xff1b;即将指定文件内容导入对应的 Oracle 数据表中&#xff1b;或者从 Oracle 数据表导出。其他数据库中的表跟Oracle数据库进行交互。若是少量数据&#xff1b;可选…

Navicat工具导出mySQL数据库某个视图结构的.sql脚本

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 用Navicat工具怎么都导不出来mySQL数据库的某个视图.sql脚本&#xff0c;即使导出来也只是包含视图记录&#xff0c;不包含视图结构。经…

瞧瞧苹果OS X如何干掉Linux

摘要&#xff1a;如果你去过Facebook或者其它一些创业类科技公司&#xff0c;你会发现随处可见的Mac&#xff0c;无论是CEO还是开发者&#xff0c;都可能在使用Mac。而以往很受IT人士青睐的Linux好像在消失&#xff0c;这是真的吗&#xff1f;苹果OS X是如何干掉Linux的&#x…

超全十大经典排序算法及其分析

文章目录0.算法概述0.1 算法分类0.2 算法复杂度0.3 相关概念1. 冒泡排序&#xff08;Bubble Sort&#xff09;1.1 算法描述&#xff1a;1.2 图解演示1.3 代码实现1.4 优化过程1.5 性能分析2. 选择排序&#xff08;Selection Sort&#xff09;2.1 算法描述&#xff1a;2.2 图解演…

eclipse安装JAVA反编译插件

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 前言&#xff1a;在实际的开发中几乎都会使用到一些框架来辅助项目的开发工作&#xff0c;对于一些框架的代码我们总怀有一些好奇之心&a…

noip2014生活大爆炸版石头剪刀布

题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一 样&#xff0c;则不分胜负。在《生活大爆炸》第二季第8集中出现了一种石头剪刀布的升级版游戏。 升级版游戏在传统的石头剪刀布游戏的基础上,增加了两个新手势: 斯波克:《星际迷航》主角之…

初识react(二) 实现一个简版的html+redux.js的demo

回顾 初识react(一) 揭开jsx语法和虚拟DOM面纱初识react(二) 实现一个简版的htmlredux.js的demo初识react(三)在 react中使用redux来实现简版计数器初识react(四) react中异步解决方案之 redux-saga初识react(五) 数据流终极解决方案 dva(零配置)前言 首先纠正个误区&#xff0…

12个有趣的C语言面试题

摘要&#xff1a;12个C语言面试题&#xff0c;涉及指针、进程、运算、结构体、函数、内存&#xff0c;看看你能做出几个&#xff01; 1.gets()函数 问&#xff1a;请找出下面代码里的问题&#xff1a; #include<stdio.h> int main(void) { char buff[10]; memset…

超全Typora快速入门

文章目录一.Typora快速入门1.代码块2.标题3.字体4.引用5.水平分割线6.图片插入7.超链接8.列表9.表格10.任务列表11.数学表达式12.生成目录13.表情符号14.定义脚注15.文件导出16.主题修改17.修改主题背景图片18.设置背景透明度19.Typora 插入图片调整大小20.字体和颜色21.页内跳…

聊聊毕业设计系列 --- 系统实现

效果展示 github moment-server github地址 moment github地址 moment-manage github地址 articles 聊聊毕业设计系列 --- 项目介绍 聊聊毕业设计系列 --- 系统实现 前言 在上一篇文章中&#xff0c;主要是对项目做了介绍&#xff0c;并且对系统分析和系统设计做了大概的介绍。…

求职小记(持续更新)

自16年春正式工作以来也有两年半了&#xff0c;也许是对现在leader的不满。也许是想要折腾一下&#xff0c;也许还有也许&#xff0c;决定换一份工作&#xff0c;结束两年零四个月的第一家it工作。从8月份的离职到十月底的offer经历了很多&#xff0c;外面天慢慢的凉了&#xf…

js 实现用window.print()打印页面中的部分内容,局部打印

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 如下方法&#xff1a; function printProof(){var printData document.getElementById("forPrint").innerHTML; // 只打印 f…