bug

Windows有一个bug,持续了十多年,从Windows Visita开始(2007年),一直存在,直到Windows11(2021年)才修复(其实也不叫修复,后面我再具体说),而Windows10还能重现这个bug,即便把系统更新到最新(2022年10月5日)。

这个bug用语言来描述就是:使用Windows Explorer(资源管理器)的树形结构初次展开目录时,滚动条会发生不正确的滚动,使得展开的节点贴近了窗口底部的位置,而不是处于我们期待的顶部位置。

有些难懂?我录了一个视频来说明这个bug:视频压缩包(博客园不能上次视频,所以做了个zip),本人基本没学过视频制作,弄得比较粗糙,请见谅。

Windows Vista

Windows Vista出来的时候,我就尝鲜安装了一个,基本上是马上就发现了这个问题,因为Windows XP及之前的所有的Windows操作系统都没这个问题。

为什么我能马上看出来?还不是因为我对资源管理器的使用习惯,我非常喜欢用目录树展开找到我想要的东西,这种习惯来源于我最早接触的Windows操作系统——Windows 95,要说现代Windows的操作模式是从哪来的,那一定是Windows 95,直到现在,Windows 95仍然是我心目中最具“跨越式”发展的操作系统,就是说它步子足够大,颠覆了过往的操作系统,让人耳目一新,开始菜单,底部任务栏,任务管理器,真正的多任务,这些如今我们无比熟悉的东西皆源于Windows 95,比尔盖茨也凭着这个操作系统的发布而登顶了世界首富。这是一些题外话。

我发现这个bug之后,就一直想办法要修复它,到处寻找解决方案,发现了这个问题的人当然不只是我,在MSDN上就有一个回复达到上千的bug反馈,是描述这个问题的,这个帖子的链接如今已经不可访问了,我记得非常清楚,大部分人表示这是个不可理喻的bug,不知道为啥会存在,非常低级,应该很快就能修复。而可气的是微软官方的答复居然说:这是个feature,并把这个问题close了,但大家的跟进仍然很激烈:

  • “因为这个问题我已经失去了对微软的尊重了。”
  • “我对微软早就没有尊重了,我已经打算更换Mac了。“
  • “每次遇到这个问题,我真想把电脑扔下楼,然后去买台Mac。”
  • “微软要是能把以前开发XP的老掉牙的从病床上拉起来并帮他们带好尿袋,我相信这问题会在3分钟内修复。”

帖子中好些微软的MVP在了解情况后非常明确地指出这是个bug! 它不可能是一个feature,因为它行为不一致,而feature即便是再差再糟糕的feature也必须满足行为的一致性,否则只能论作bug,它确实就是个不折不扣的bug。

这个问题对我困扰甚多,所以Vista我基本没怎么用,因为一个bug而放弃一个操作系统,听起来挺荒谬,但事实就是这样,对我而言,这基本上就是个硬伤,我不愿意改变我的习惯,而这个bug真是令我抓狂。

Windows 7

Windows Vista是微软的一个失败的操作系统,最主要的原因是其兼容性的问题,这些问题到了Windows7之后得到了很大程度上的改善,所以很多人都用过Windows7,而没有使用Windows Vista,他们都知道Windows Vista不好,但不好在哪里,他们都说不出来。而对我来说比兼容性更重要的是,这个该死的bug到底有没有修复?Windows7安装上去了之后,我满怀期待地打开了资源管理器按我习惯的操作点击了几下……我靠! 一点都没变! 我先是气愤,后转为失落。

不管怎么说,Windows7都会成为以后几年的主流操作系统了,我得习惯——唉! 我后来确实找到了一个程序,一定程度上能解决这个问题,这个软件的名字叫“Classic Shell”,它的网站目前还能访问:http://www.classicshell.net/,里面包含了一个小小的功能:fix folder scrolling,它的其它功能我如今全忘了,因为当时我只看中了它这个功能。看吧,放弃一件东西往往只因为其中的某个特点,反之,选择一件东西也是这样。Classic Shell这个软件并不能解决所有的问题,它仅仅作用于资源管理器程序中,而Windows的这个bug不只是在资源管理器中有,它在“打开文件”,“选择目录”等系统公共对话框中也存在,但能解决一部分是一部分吧。而作为Windows程序员的我还曾一度想自己修复这个问题,但研究下来无果。

Windows 8

又过了若干年,Windows 8发行了,这貌似是一个很大的改版,我又满怀期待地安装上去了,结果真是无语,这个bug一点不差地继承了下来。Windows 8的活动磁贴让人很有新鲜感,但随即新鲜感过后觉得其实也没啥营养,活动磁贴适合于平板,但桌面版的Windows强行弄这东西真的合适么?不过最奇葩的还是Windows 8的关机按钮,即便是我这样的老鸟,也费了老大劲才找到。Windows 8是个失败的操作系统,可能是因为步子有点大,和Windows 95的步子大不同,它不合理的地方太多。

Windows 8.1

微软很快意识到了Windows8的问题,所以不久后推出了Windows 8.1,Windows 8.1的UI上更加符合用户传统的操作习惯,但也真的只是小改进罢了。bug呢?——当然完美保留了下来。

而从Windows内部版本上来看,Windows Vista,Windows 7, Windows8,Windows 8.1是相差不大的东西,想知道Windows版本可以在命令行界面中敲“ver”查看,你会了解到:

* 6.0 - Windows Vista
* 6.1 - Windows 7
* 6.2 - Windows 8
* 6.3 - Windows 8.1

不过,从Windows 10开始就不是这样的版本显示了。

Windows 10

Windows10大概从2016年开始渐渐普及,一样的,我安装后的第一件事情就是看看这个bug修正了没有,嗯……还好我没太大的期待,果然还在! 这也说明了一个问题,这个资源管理器的代码应该是直接从之前版本的操作系统中拿过来用的,应该没改过什么。Windows10是一个比较成功的操作系统,发行后,微软多次对它进行了大幅度的迭代,如今的Windows 10跟初代的Windows 10已经差别很大,但对我而言,不修正这个bug都算不上成功。

Windows 11

这个bug最终的解决是在Windows 11上,它,终于消失了,但Windows 11和Windows 10在UI上的差别很大,对我而言这绝对是步子迈得太大扯到蛋的变化,Windows 95的革命性UI变化给人是惊艳的感受,因为进步实在太大,而Windows 11的这些“改进”都只停留在表面上,把开始菜单弄成居中,强行合并任务栏图标,这些除了强制用户改变自己习惯之外,我看没带来什么好处啊,操作更便利了?功能更强大了?更加符合人类直觉了?恐怕都没有吧,就是为了标新立异而已,我不反对一些新的尝试,但至少要给用户一个选项,如果新的方式不好用,能够退回旧的方式啊。但不管怎么说,在Windows 11的资源管理器中,它确实消失了,也许不是修复了,而是微软重构了资源管理器的代码,因为Windows 11的资源管理器跟Windows 10的有着很明显的差别,所以真相很可能就是:微软其实根本没去修正这个bug,只是把资源管理器重新写了一遍,正好没了这个bug罢了。

Windows11的操作方式和Windows10也有着很大的差别,最令人吐槽的便是它的右键菜单,相信是个程序员看了都想开骂——为何要我多点一下。所幸的是要调整回经典右键菜单并不难,而要想让传统的任务栏回归就有点难了,我尝试过许多个方法后,发现比较可靠的,且副作用比较小的,就是用一个叫“StartAllBack”这个软件,它的作用不仅仅是让经典任务栏回归,还能调整开始菜单,以及让资源管理器使用传统风格。

总结

写这篇文章,是为了一些纪念,也是为了总结一些道理:

1. 一个东西,不管其它方面有多好,一个缺点就可以让人很讨厌它
2. 没有充分的理由就不要试图去改变用户的习惯
3. 从根本上去改进产品,而不是停留在表面上
4. 一个产品没有令人厌烦的bug往往比有什么酷炫功能重要
5. 大公司……确实挺傲慢

记Windows的一个存在了十多年的bug的更多相关文章

  1. 使用MFC开发有十多年了,结合自身的体会,随便说几句(不能样样都依赖别人,C体系的人,绝对不怕人踢馆)

    挺长时间了吧,这个帖子还没沉下去,使用MFC开发有十多年了,结合自身的体会,随便说几句:1.MFC是一个C++的基础类库,封装了绝大多数的API函数,主要是用来创建带UI的应用程序,服务端程序或着不带 ...

  2. 困扰多日的C#调用Haskell问题竟然是Windows的一个坑

    最近一直被C#调用Haskell时的“尝试读取或写入受保护的内存”问题所困扰(详见C#调用haskell遭遇Attempted to read or write protected memory,C# ...

  3. 把 Nginx 创建为 Windows 的一个服务

    译序:Nginx 不是为 Windows 而写.Nginx 是用在软件的工作环境中的.但软件开发环境一般都是 Windows,有时调试的需要也要装 Nginx,但 Nginx 并没给 Windows ...

  4. Vue折腾记 - (3)写一个不大靠谱的typeahead组件

    Vue折腾记 - (3)写一个不大靠谱的typeahead组件 2017年07月20日 15:17:05 阅读数:691 前言 typeahead在网站中的应用很多..今天跟着我来写一个不大靠谱的ty ...

  5. Java中,一个存在了十几年的bug...

    本人免费整理了Java高级资料,涵盖了Java.Redis.MongoDB.MySQL.Zookeeper.Spring Cloud.Dubbo高并发分布式等教程,一共30G,需要自己领取.传送门:h ...

  6. 记一次亲身踩过的hibernate的bug

    记一次亲身踩过的hibernate的bug 在写实体类时,经常会对域增加校验,例如@NotNull表示哪个字段不能为空,昨天晚上调试代码,就遇到了问题, @Entity public class Ap ...

  7. 怎样才能提交一个让开发人员拍手叫好的bug单

    怎样才能提交一个让开发人员拍手叫好的bug单 软件测试人员写得最多的文档就是测试用例和BUG,现在测试用例和BUG都没有标准的模板,每个公司使用的缺陷管理工具都有可能不一样,如果你换了一家公司就有可能 ...

  8. 面试题(造火箭必备技能):请举例一个最有成就感的性能bug

    当前,绝大部分招聘都有性能要求或者把其作为加分项(会性能优先),哪怕你不是面试的性能,面试的时候可能会问性能,所以大家才会有"面试造火箭,进去拧螺丝"的共鸣.至于企业为什么重视性能 ...

  9. 定时器:为 Windows 实现一个连续更新,高精度的时间供应器

    原著:Johan Nilsson 翻译:lxhui 原文出处:MSDN Magazine March 2004(Timers...) 原代码下载: HighResolutionTimer.exe (4 ...

随机推荐

  1. linux常见命令(七)

    df/du/ln/lsblk/mount磁盘和目录的容量df 列出文件系统整体的磁盘使用量查看磁盘占用量并用易读的格式显示出来df -hdu 列出目录的磁盘占用量查看当前目录下每个目录/文件的占用量, ...

  2. HDFS核心原理

    HDFS 读写解析 HDFS 读数据流程 客户端通过 FileSystem 向 NameNode 发起请求下载文件,NameNode 通过查询元数据找到文件所在的 DataNode 地址 挑选一台 D ...

  3. 开发了一个安卓小软件“CSV联系人导入导出工具”,欢迎测试

    开发了一个安卓小软件"CSV联系人导入导出工具",欢迎测试.本软件可以帮你快速备份和恢复联系人,不用担心号码遗失,软件操作简单,使用方便. 下载地址: 百度网盘:https://p ...

  4. 「POJ 3666」Making the Grade 题解(两种做法)

    0前言 感谢yxy童鞋的dp及暴力做法! 1 算法标签 优先队列.dp动态规划+滚动数组优化 2 题目难度 提高/提高+ CF rating:2300 3 题面 「POJ 3666」Making th ...

  5. 重构、插件化、性能提升 20 倍,Apache DolphinScheduler 2.0 alpha 发布亮点太多!

    点击上方 蓝字关注我们 社区的小伙伴们,好消息!经过 100 多位社区贡献者近 10 个月的共同努力,我们很高兴地宣布 Apache DolphinScheduler 2.0 alpha 发布.这是 ...

  6. Java 注解及其底层原理

    目录 什么是注解? 注解的分类 Java自带的标准注解 元注解 @Retention @Documented @Target @Inherited @Repeatable 自定义注解 自定义注解的读取 ...

  7. 前端 | HTML5基础知识

    1 HTML定义 HTML(英文Hyper Text Markup Language的缩写)中文译为"超文本标签语言",主要是通过HTML标签对网页中的文本.图片.声音等内容进行描 ...

  8. Mybatis核心配置文件中的标签介绍

    0. 标签顺序 Mybatis核心配置文件中有很多标签,它们谁谁写在前写在后其实是有顺序要求的: 从前到后: properties?,settings?,typeAliases?,typeHandle ...

  9. 对DDD使用的一些建议

    群里经常看到类似于"看了DDD之后就不会写代码了"的情况,趁最近学车的间隙,写写我的看法. 关于这个事儿,我是觉得:当没有DDD的时候,如果你知道怎么做,那就那么做好了,不要考虑D ...

  10. identity4 系列————纯js客户端案例篇[四]

    前言 前面已经解释了两个案例了,通信原理其实已经很清楚了,那么纯js客户端是怎么处理的呢? 正文 直接贴例子哈. https://github.com/IdentityServer/IdentityS ...