看起来简单,实际上复杂

华为ENSP完整安装教程 阅读详情

我们在CityDesk里有一个使用性上的小问题。

 

 

问题是这样的:你可以用菜单上“导入网页”的命令,从因特网上导入一个文件。你也可以用鼠标拖放的方法,从磁盘上导入一个文件。但是菜单上没有“导入磁盘文件”这个命令,所以有些用户没有发现CityDesk 有这个功能,或者他们试图用“导入网页”这个命令去导入磁盘上的文件,结果造成无法成功导入。

 

我一开始想这个问题很好解决,大概的方法就是用一个两个页面的文件导入向导。第一页问你:“你要从哪里导入?”。如果你选择“磁盘”,第二页就会提示你选一个文件;你要是选择“因特网”,第二页就会提示你输入一个URL.

 

我差点就开始动手去实现我这个想法了,但是有些事情使得我并没有这样做。我决定先写一个小的规约再说。写出来的规约如下:

 

第一页

你要从哪里导入?

磁盘/因特网

 

第二页(磁盘)

标准的打开文件对话框

 

第二页(因特网)

用小浏览器让你输入一个URL

 

突然间我想到一个问题。Windows的打开文件的对话框,通常是由操作系统提供的。能不能把这个对话框放到我的文件导入向导里面呢?

 

嗯…

 

我查了一下。是可以这样做的,但这不是一件好玩的事,而且要花好几个小时的时间。我能不能不使用导入向导的方式呢?我重写了一下我的规约:

 

两个菜单项:

1)从网上导入网页 -> 显示URL输入对话框

2)从磁盘上导入网页–> 显示打开文件对话框

  

这就好多了。三分钟的设计时间,省了我几个小时的编程序时间。

 

如果你这辈子花了二十分钟以上的时间去编软件代码的话,你就可能发现了一条规则:事情没有看起来那么简单。

 

就像拷贝文件这样简单的事,都充满了危险。如果第一个参数是个目录会如何?如果第二个参数是个文件会如何?如果同名的文件已经存在于目的子目录会如何?如果你没有写的权限又会如何?

 

如果在拷贝文件的过程中失败了怎么办?如果目的地是在一个远程计算机上,但是需要身份验证怎么办?如果文件很大但网络连接又慢,所以你需要显示一个进度条怎么办?如果文件传输速度降到几乎是零了,你什么时候放弃拷贝而给用户一个错误信息呢?

 

一个面试测试员的好办法,就是给他们一个简单的操作过程,然后让他们列出可能出现的错误情况。一个在Microsoft面试时典型的问题就是:你怎样去测试打开文件对话框呢?一个好的测试员,可以轻而易举地列出几十个令人难以想到的情况去测试(比如“一个文件显示在对话框里,然后你去打开它,但是在你按打开的按钮之前,这个文件被另一个用户删除了”)。

 

好,我们得到这样一个公理:事情没有看起来那么简单。

 

软件工程里还有一个指导思想,那就是你要永远想方设法去减低风险性。一个要特别小心去避免的风险,就是项目进度延期的风险。项目延期很不好,因为老板会训你,闹得你挺不高兴的。除此之外,这也存在经济方面的原因,那就是当初你决定给你的软件加某个功能的时候,你觉得这个功能只需要一个星期就能完成。现在你认识到该功能需要二十个星期才能完成,那么你当初的决定当然就是错的。如果你当初就知道需要花掉二十个星期的话,你可能就作出不同的决定了。你作出的错误决定越多,你公司的财产被一次性冲销处理的可能性就越大(甚至你们公司的标志会被收入债权人的仓库)。到时候你的前老板抱怨道:“我们公司关门倒闭了不说,气人的是连上fuckedcompany的资格都没有。”

 

事情没有看起来那么简单,再加上减低风险性的指导思想,只能让你得出如下的结论:

 

先设计再编程序,先思而后行。

 

让你失望了,很抱歉。我知道你读过Kent Beck的书,所以你以为动手之前不做设计是可以的。对不起,那是不可以的。你修改程序不可能像修改设计文件那样“容易”。有些人总是发表这样的谬论:“我们现在用高级工具了,像Java和XML。 我们在几分钟之内,就可以改动程序里的很多东西。为什么不在程序里直接设计呢?”哥们儿,你可以在你自行车上加个发动机,但你不能把它变成汽车。如果你以为把你拷贝文件的程序,由线程式改为抢占式,而且改得比我写这句话还快,那你就大错特错了。

 

不管怎么说,我不认为Extreme Programming是在鼓吹零设计的理念。他们只是说:“不要作任何无必要的设计”,这没有什么错嘛。但人们听到的并不是这样。大多数程序员是在找不用设计的借口,所以他们像飞蛾扑火般投向“不用设计” 这个馊主意。这是一种奇怪的,让你事倍功半的懒惰方式。我懒得先在纸上把这个功能给设计好了,所以我就先写程序,然后发现不对,我就去改,结果反倒花更多的时间。或者,更经常发生的是,我先写些程序,发现它不对,但是没时间改了,结果我的产品质量低劣,而且我还是要找出些借口,说明它为什么“一定要那样“。那只不过是马虎潦草,缺乏职业精神。

 

Linus Torvalds攻击设计的时候,他是在讲那些规模庞大的系统。大规模的系统必须慢慢进化,要不然它们就变成Multics了。他不是在说你那个拷贝文件的程序。你再想想,Linus Torvalds脑子里有一个很清楚的路线图,知道他要到哪去,所以他觉得设计没什么用,也不足为奇。但不要上当,基本上说那对你不适用。Linus Torvalds比我们聪明多了,所以他能干的事,不等于我们一般人也能干。渐增式设计及实现是好事。频繁地发布版本是可以的(但针对在大众市场上的软件来说,频繁发布版本会使用户不高兴,绝不是个好主意——可以多搞些内部的里程碑取而代之)。设计上不要拘泥于形式,那只是浪费时间。我从来没有见过某个项目得益于不动脑筋的流程图、UML、CRC,或者其他什么时髦的,花里呼哨的设计方法。至于那些Linus Torvalds说的系统,那些有一千万行代码程序的庞然大物,它们应该慢慢进化,因为人类还不知道怎样设计那种规模的软件。

 

但是当你坐下来写你的拷贝文件的程序,或者计划给你的软件下个版本增添功能的时候,你一定要先作设计。不要让报急的号角使你草草动手。



本文最先用英文出版,题为 Nothing is as Simple as it Seems  
电磁场仿真软件:Sonnet_(3).Sonnet用户界面与操作 Sonnet支持用户通过二次开发自定义工具,例如:编写Python脚本,实现自定义功能。将脚本保存为工具插件。在Sonnet中加载并使用自定义工具。# 示例:自定义工具 import sonnet def custom_tool(design , object , parameter , value) : """自定义工具示例,设置对象的指定参数。 阅读详情

相关推荐

Unity 第一人称视角控制移动、旋转

第一人称视角操作此功能主要是借鉴YouTube,写的蛮好我就搬运过来让大家也试试。

qq_36515472的博客 4202

what is dns-server

今天来学习从客户端层到反向代理层之间的过程,其实就是DNS解析。 what is dns Domain Name System(DNS) 是Internet通讯录。人们通过google.com或meituan.com等域名在线访问信息。

gou553323的博客 242

计算机保研/考研面试题——计算机组成原理篇

本文总结了985和华五学校习计算机保研/考研常问面试时的计算机组成原理题,欢迎点赞、收藏、评论、关注

安晴晚风的博客 7547

看起来简单, 实际上复杂

作者: Joel Spolsky译: Bo Yang 翻译 编辑: Billy Chen 编校 2002年3月4日 我们在CityDesk里有一个使用性上的小问题。     问题是这样的:你可以用菜单上“导入网页”的命令,从因特网上导入一个文件。你也可以用鼠标拖放的方法,从磁盘上导入一个文件。但是菜单上没有“导入磁盘文件”这个命令,所以有些用户没有发现CityDesk 有这个功能,或者他们试图用“

jstml的专栏 1023

点云配准实战:用DGCNN+Transformer+SVD搞定3D模型对齐(附PyTorch代码)

本文详细介绍了基于深度学习的点云配准实战方法,重点解析了Deep Closest Point (DCP)模型。该模型融合了DGCNN、Transformer和可微分SVD三大核心模块,能够端到端地预测点云间的刚性变换,有效克服传统ICP算法对初始位置敏感、易陷入局部最优的缺点。文章提供了完整的PyTorch代码实现、ModelNet40数据集处理、训练策略及显存优化技巧,旨在帮助开发者在机器人、自动驾驶等领域实现精准的3D模型对齐。

weixin_29061041的博客 155

SpringBoot项目启动后ShardingSphere5.0首次SQL查询慢?这个预热技巧帮你搞定

本文针对SpringBoot项目集成ShardingSphere 5.0后首次SQL查询慢的问题,深入剖析了其根源在于SQL解析引擎的懒加载与缓存初始化。文章提供了三种有效的预热技巧,包括精准的SQL解析引擎预热、简单查询触发全链路预热以及可配置的生产级方案,帮助开发者将初始化成本提前至应用启动阶段,从而消除性能毛刺,提升用户体验与系统稳定性。

chair的专栏 1063

看似简单,实际上还是有点复杂的面试题

算是面试总结吧,对于我这种小白来说,当时是没有思路的,但是今天面试的时候就这个题让我头疼。 大概题目: 有两个表,表1为详细表,分别有三个字段,detailid,datailtype,remark。表2为产品表,有两个字段分别是productid,productname。 要求: 把表1中的detailtype字段所有信息变成对应的表2中的productname字段(语言不限)。 表1 ...

Aokiboy 387

YOLO模型从10MB瘦到2MB!剪枝+INT8量化双方案(精度损失<1%,附部署代码)

摘要:本文介绍了一种针对边缘设备的YOLO模型轻量化方案,通过"结构化剪枝+INT8量化"组合技术,将YOLOv8n模型从6.4MB压缩至2MB,体积减少68.75%,推理速度提升80%,同时保持精度损失小于1%。文章详细讲解了剪枝工具选择、通道剪枝实现、量化校准等关键步骤,并提供了完整的代码示例。特别强调了剪枝保留率、校准集使用、微调必要性等实践要点,帮助开发者在树莓派等资源受限设备上实现高效目标检测。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 756

<<More Joel on Software>> 看起来简单, 实际上复杂

作者: 周思博 (Joel Spolsky) 译: Bo Yang 翻译 编辑: Billy Chen 编校 2002年3月4日 我们在CityDesk里有一个使用性上的小问题。     问题是这样的:你可以用菜单上“导入网页”的命令,从因特网上导入一个文件。你也可以用鼠标拖放的方法,从磁盘上导入一个文件。但是菜单上 没有“导入磁盘文件”这个命令,所以有些用户没有发...

谷子 282

【单点登录】SSO单点登录sa-token接入流程详解

Sa-Token 是一个轻量级 Java 权限认证框架,主要解决:登录认证、权限认证、单点登录、OAuth2.0、分布式Session会话、微服务网关鉴权 等一系列权限相关问题。Sa-Token 目前主要五大功能模块:登录认证、权限认证、单点登录、OAuth2.0、微服务鉴权。

Hello, New World! 1794

从数据读取到业务事件:理解 ABAP CDS 视图的目的与选型(含 RAP、扩展与分析场景)

CDS视图在SAP S/4HANA中不仅是数据查询工具,更是语义模型和运行时能力的载体。它通过分层架构(基础视图、组合视图、消费视图等)实现数据复用与场景适配,支持UI、分析、事务处理等多样化消费。视图类型包括提供数据访问的接口视图(I_前缀)、消费视图(C_前缀)和事务视图,以及不提供数据访问的扩展视图。这种分层设计确保了数据模型的稳定性与扩展性,同时支持自定义字段和上下文感知分析。正确理解CDS视图的用途和分层规则,能帮助开发者构建更健壮、可维护的SAP应用。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 302

Apache Software Foundation Thinking in Java:分发信息这个简单思想的复杂性实际上是有很多不同层次的

首先,开源软件的分发通常涉及到版权和许可证的问题。这些许可证规定了分发软件的条款和条件,以确保软件的开源性和自由性。其次,开源软件的维护和管理也是一个重要的问题。Apache Software Foundation提供了一个平台,使得开发者可以协作、讨论和解决问题,以确保软件的稳定性和安全性。Apache Software Foundation作为开源软件基金会,通过制定规则、搭建平台和提供服务等方式,确保了开源软件的健康发展。此外,开源软件的推广和采用也是分发信息的重要方面。

[Blog][Domain] programb.blog.youkuaiyun.com 427

MATLAB离线附加功能包下载与安装教程

本文介绍如何下载与安装MATLAB离线附加功能包,便于大家更加高效的使用MATLAB。

加斯顿工程师的博客 1万+

【理想流】软件开发究竟是简单的还是复杂的

软件开发是个奇妙的行业。你可以说它复杂,但与此同时,随便有个人,只要接受点培训就可以做软件开发。你也可以说它简单,但据统计世界上一半以上的软件项目会以失败收场。强调软件复杂的最有代表性的观点来自《人月神话》:Brooks认为复杂性是软件的根本特质,而非偶然特质。强调软件简单性的观点则时见于国内某些MIS开发公司以及外包公司:他们大多时候会把需求分析(业务分析)的权重抬的很高,而把设计编码的位置压的

理想流 4984

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

JS简单数据类型和复杂数据类型

目录 1. 简单数据类型与复杂数据类型 2. 数据类型的内存分配 3. 简单数据类型传参 4. 复杂数据类型传参 1. 简单数据类型与复杂数据类型 简答数据类型叫基本数据类型或者值类型 复杂数据类型叫引用类型 值类型:在存储时变量中存储的是值本身,string,number,Boolean,undefined,null 引用类型:在存储时变量中存储的是地址(引用),通过new关键字创建对象,如object、array、date等 注意:null返回的是一个空的对象 2. 数据类.

weixin_49555741的博客 1162

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

[暑假]简单数据类型和复杂数据类型

快速了解一下基本数据类型和复杂数据类型

IDApprentice的博客 269

简单就好(转)

多年前,面对复杂,我会感概自身能力的不足。多年后,我可能会更多地反思复杂。爱因斯坦主张凡事力求简单,但不要过于简单,大卫马梅也认为Keep It Simple, Stupid就好。但遗憾的是,“复杂”仍然横行霸道。不是复杂代表潮流,而是因为越简单越复杂。换句话说,简单更多地是一种能力的表现。当然,在市场化的环境下,简单只是利益最大化的手段之一,不排除复杂也是某些商品利益最大化的途径。但我相信这只...

weixin_34270606的博客 78

后端没你想的那么复杂,真正难的是业务

你可能绷着脸在研究 MySQL 的查询优化,结果项目上线半年,数据库里也才几万条数据,压根用不上什么“索引调优”;说白了,就是前端发请求,你拿到参数,动动脑子处理一下,再把结果扔回去。很多人一听“后端开发”,脑海里立刻浮现出一堆复杂词汇:高并发、缓存穿透、消息队列、限流熔断……你改一行代码,可能没什么。框架就是帮你简化流程、避免重复劳动的工具,帮你做校验、异常处理、日志记录。你可以把不用框架比作现金买菜:得出门、找摊、砍价、防假币,回来还要记账?怕的是你对业务一知半解,只会“写功能”,不会“解问题”?

m0_60456028的博客 880

HDU 1035 简单搜索,

/* 这题看起来好吓人,但是慢慢看下去,会发现就是简单那的 模拟题,也可以说是简单的搜索,不过搜索的方向是题目告诉的 方向,只要判断两个点就够了,一是直接出去的时候, 二是:当在某个时候一直在里面循环!! */ #include #include #include #include using namespace std; char s[12][12];

傻笨 605

复杂是个筐,什么都往里装

对作者一个词评论就够了:恬不知耻。 明明是各学科的一些具体进展不断的被她/他们归入“复杂”的范畴,倒好似成了很多研究多么受益于复杂性概念。书中存在严重的不断加深读者(复杂作为单独学科很有用)印象的倾向,但真正能够读出的味道却是,想让别人、甚至她自己相信都勉为其难。 公开在网络上进行人身攻击似乎不那么地道,考虑到作者不认识中国字就不客气了。这样的人如果能被称为科学家那是科学一词的耻辱。 不过如...

weixin_34112208的博客 104

复杂数值类型对函数传参问题

复杂数据类型在函数中引用地址问题,堆与栈

muyumuyu98的博客 204
上一篇: 据说是世界上最经典的25句话
下一篇: J2ee学习流程
taker2001
博客等级 码龄22年 4粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值