世界上最流行的编程语言,用户数超过Python,Java,JavaScript,C的总和!
世界上最流行的编程语言是什么?
Python? Java? JavaScript? C?
都不是,是Excel!
外媒估计,全球有12亿人使用微软的Office套件,其中估计有7.5亿人使用Excel!
可是Excel不就是能写点儿公式,做点儿计算吗, 这也是编程语言?
之前的Excel不是图灵完备的,2021年微软通过引入LAMBDA,让Excel 具备了图灵完备性,Excel 转变成一种全面的编程语言。
当然,普通用户很少用Lambda,主要是组织数据,用公式分析,做可视化,提供决策依据,这才是Excel的舞台。
别看Excel现在呼风唤雨,它也是从尸山血海中一路冲杀出来,差点儿就被人干掉。
今天我们来聊聊Excel发展的故事。
1
神奇纸张
我在外企的时候,有个国外同事,从来不说PPT,而是说Slides, 也从来Excel,而是说SpreadSheet。
刚开始我还不习惯,后来看看Excel的发展历史,才知道他是对的,Excel不过是SpreadSheet的一种。
电子表格(SpreadSheet)不是微软的发明,是哈佛学生丹尼尔·布里克林灵机一动想出来的。
1977年,丹尼尔·布里克林哈佛商学院读MBA,教授让这些MBA学生去填一些分类账目表格,用来预测公司收购的财务状况。这些淡绿色的表格填起来很烦人,表格之间的数据有依赖关系,有一处填错了,后面的都得重新计算。
曾经设计过字处理软件的布里克林立刻想到:为什么写一个电子表格程序,自动地去计算呢?
布里克林的老师则认为他是在浪费时间:你没搞错吧,现在市面上的PC都是玩具,再说了,这些填表的工作将来都是会计,秘书的活儿,你们MBA的主要工作是建模!
老师说的一点都没错,这是1977年,Apple II 才刚刚出现,上面没啥商业软件,确实是发烧友们的大玩具。
但是布里克林不信邪,他从麻省理工找了一个会编程的朋友,两人合作,用汇编写了世界上第一个电子表格软件:VisiCalc,意思是Visible Computing。
这个软件的界面是绿色的,我估计是参考了当时分类账目表格的颜色:
让所有人都没有想到的是,VisiCalc迅速成为了Apple II上的“杀手软件”,人们购买Apple II的唯一理由就是:想使用上面的VisiCalc。
VisiCalc给世界带来的变化,不亚于复式记账簿。
有了电子表格之后,商人们只需要将数字输入,就能看到输出是什么。并且在PC上运行的电子表格打破了大公司的层级结构,将权利下放给更多人,甚至不需要依赖于数据部门,自己就能搞定。
VisiCalc 这个“可以执行计算和重新计算的神奇纸张”开启了一场革命,促使PC从狂热爱好者的玩具成为了严肃的商业工具。
2
异军突起
电子表格的市场一旦开启,激烈的竞争就如约而至 。
1980年,VisCalc仅仅问世一年以后,Sorcim公司发布了SuperCalc,解决了单元格之间循环引用的问题。
1982年,微软正式出手,推出了自家的电子表格程序Multiplan,提供了“更大的工作表”以及其他改进。
但它们都无法撼动先行者VisiCalc的地位,因为“一个人的命运啊,当然要靠自我奋斗,但是也要考虑到历史的进程!”
Mitchell Kapor(卡普尔)本来基于VisiCalc开发插件的程序员,他开发过两个图形插件,可以从VisiCalc的文件中生成图形。
VisiPlot
VisiTrend
当IBM PC这个划时代意义的产品推出时,VisiCalc却没有采取什么行动,卡普尔意识到机会来了。
他将自己的软件版权以170万美元的价格卖出,然后又拉了130万的风投,铤而走险,押注IBM PC,开发了新的电子表格软件Lotus1-2-3。
1-2-3指的是该产品的使用方式,即电子表格,图形包和数据库管理器。
正如VisiCalc是Apple II的Killer application一样, Lotus 1-2-3成为了IBM兼容机和MS-DOS上的杀手级应用,IBM兼容机比Apple电脑便宜很多,市场巨大。
卡普尔顺势掀起了营销的狂潮,研发费用100万美元,发布产品就花费了250美元,Lotus 1-2-3销量扶摇直上,在最初的18个月就卖出了85万套,迅速成为电子表格领域的新霸主。
Lotus公司也超越微软,成为世界上最大的独立软件公司。
Lotus 1-2-3有多流行呢?很多人在买计算机的时候,不是说要买IBM PC兼容机,也不是说要买MS-DOS兼容机,而是要买能运行Lotus 1-2-3的计算机!
3
王者归来
眼瞅着Lotus1-2-3在自家的MS-DOS上称王称霸,赚钱赚到手软,而Multiplan又如同扶不起的阿斗,微软难道就此偃旗息鼓?
这绝不可能!
1984年秋天,微软一行四人秘密入驻西雅图的红狮酒店。
这四个人从左到右分别是:Bill Gates, Doug Klunder, Jabe Blumenthal 和 Charles Simonyi
他们要在这里进行为期三天的头脑风暴,讨论如何干掉Lotus1-2-3。
Bill Gates先是阐述了当前的严峻形势,Lotus公司第二年的销售额将要达到1.5亿美元,已经超越微软了!
大家纷纷表决心,一定要做出更加强大的电子表格软件Excel,把Lotus1-2-3 干翻在地。
四人就Excel的用户界面和关键功能进行了充分的讨论,最后做出了两个重要决定:
1. 智能的重新计算
现在的SpreadSheet都有一个缺陷,一个单元格的数值变化,所有的单元格都得重新计算,这在PC那可怜巴巴的16K内存中,运行速度太慢了。新软件Excel一定要只计算相关受影响的单元格,这样在性能上将会有巨大的优势,用户将会后神奇的体验!
Doug Klunder甚至提出了一个口号:Recalc or die ! 意思是,实现不了智能的重新计算,就去死。
2. 放弃DOS平台,让Excel运行在GUI上。
Lotus 1-2-3已经成为基于文本的DOS平台的霸主,不要和它正面竞争,而是专注于下一代GUI平台。
悲催的是Windows 1.0要在一年以后才能完成开发,市面上支持GUI的操作系统只有苹果的Macintosh。
Bill Gates还是决定先开发Excel的Macintosh版本,这是个在外人看来难以理解的决定:让别人的孩子在自己院子(MS-DOS)里撒野,而把自己的孩子寄居别人的家里(Macintosh)
不得不说,Bill Gates不但懂技术,还非常有商业头脑,他从Macintosh身上,已经意识到GUI才是未来,将来Excel对Lotus将会带来降维打击。
1985年,Excel的Macintosh版本正式推出,这是第一款图形化人机交互电子表格系统,有着漂亮的外观,下拉菜单,并且能够用鼠标操作!比基于文本的Lotus 1-2-3好太多了。
Excel开始蚕食Lotus 1-2-3的领地。
1987年11月,第一款适用于Windows系统的Excel也产生了。
Lotus1-2-3 行动迟缓,迟迟不能用于Windows系统,到了1988年,Excel的销量超过了Lotus !
这是一件标志性的事件,意味着新的软件霸主诞生了!
此后大约每两年,Microsoft就会推出新的版本来扩大自身的优势,把所有竞争对手都远远抛到了身后。
4
尾声
Excel对于微软有着特殊的意义,Microsoft Excel 1.0 的首席开发人员 Doug Klunder 回忆说:“微软将未来押在了 Excel 和 Windows 两个程序上,如果两者都失败了,微软就不可能活到今天。”
据说微软在开发Excel的时候,偷学了Macintosh的GUI技术,转而用到自家的Windows上,这让乔布斯怒不可遏,指着Bill Gates大骂:我那么信任你,你却偷走我们的东西!
Bill Gates没有愤怒以对,也没有反唇相讥,而是平静地讲了一个故事:“史蒂夫,我理解你的愤怒,不过我们可以从另外一个角度来看问题,我们都有个有钱的邻居,叫施乐,我闯进他们家准备偷电视的时候,发现你已经把它……偷走了。”
(施乐的故事,参见这篇文章《为什么美国的创新这么厉害?》)
(完)
相关文章:

世界上最流行的编程语言,用户数超过Python,Java,JavaScript,C的总和!
世界上最流行的编程语言是什么? Python? Java? JavaScript? C?都不是,是Excel!外媒估计,全球有12亿人使用微软的Office套件,其中估计有7.5亿人使用Excel!可是Excel不就是能写点儿公式&#x…...

杂谈:created中两次数据修改,会触发几次页面更新?
面试题:created生命周期中两次修改数据,会触发几次页面更新? 一、同步的 先举个简单的同步的例子: new Vue({el: "#app",template: <div><div>{{count}}</div></div>,data() {return {count…...

原生JS实现拖拽排序
拖拽(这两个字看了几遍已经不认识了) 说到拖拽,应用场景不可谓不多。无论是打开电脑还是手机,第一眼望去的界面都是可拖拽的,靠拖拽实现APP或者应用的重新布局,或者拖拽文件进行操作文件。 先看效果图&am…...
Coredump-N: corrupted double-linked list
文章目录 问题安装debuginfo之后分析参数确定确定代码逻辑解决问题 今天碰到一例: #0 0xf7f43129 in __kernel_vsyscall () #1 0xf6942b16 in raise () from /lib/libc.so.6 #2 0xf6928e64 in abort () from /lib/libc.so.6 #3 0xf6986e8c in __libc_message () from /lib/li…...

5个好用的视频素材网站
推荐五个高质量视频素材网站,免费、可商用,赶紧收藏起来! 1、菜鸟图库 视频素材下载_mp4视频大全 - 菜鸟图库 网站素材非常丰富,有平面、UI、电商、办公、视频、音频等相关素材,视频素材质量很高,全部都是…...

使用码匠连接一切|二
目录 Elasticsearch Oracle ClickHouse DynamoDB CouchDB 关于码匠 作为一款面向开发者的低代码平台,码匠提供了丰富的数据连接能力,能帮助用户快速、轻松地连接和集成多种数据源,包括关系型数据库、非关系型数据库、API 等。平台提供了…...
3.1.1 表的相关设计
文章目录1.表中实体与实体对应的关系2.实际案例分析3.表的实际创建4.总结1.表中实体与实体对应的关系 一对多 如一个班级对应多名学生,一个客户拥有多个订单等这种类型表的建表要遵循主外键关系原则,即在从表创建一个字段,此字段作为外键指向…...

Vue3 企业级项目实战:认识 Spring Boot
Vue3 企业级项目实战 - 程序员十三 - 掘金小册Vue3 Element Plus Spring Boot 企业级项目开发,升职加薪,快人一步。。「Vue3 企业级项目实战」由程序员十三撰写,2744人购买https://s.juejin.cn/ds/S2RkR9F/ 越来越流行的 Spring Boot Spr…...

Swagger2实现配置Header请求头
效果 实现 大家使用swagger肯定知道在代码中会写一个 SwaggerConfig 配置类,如果没有这个类swagger指定也用不起来,所以在swagger中配置请求头也是在这个 SwaggerConfig 中操作。 1、要实现配置请求头在配置swagger的Docket的bean实例中添加一个 globa…...

4-1 SpringCloud快速开发入门:RestTemplate类详细解读
RestTemplate类详细解读 RestTemplate 的 GET 请求 Get 请求可以有两种方式: 第一种:getForEntity 该方法返回一个 ResponseEntity对象,ResponseEntity是 Spring 对 HTTP 请求响应的封装,包括了几个重要的元素,比如响…...

【IDEA】【工具】幸福感UP!开发常用的工具 插件/网站/软件
IDEA 插件 CodeGlance Pro —— 代码地图 CodeGlance是一款非常好用的代码地图插件,可以在代码编辑区的右侧生成一个竖向可拖动的代码缩略区,可以快速定位代码的同时,并且提供放大镜功能。 使用:可以通过Settings—>Other Settings—&g…...
【蓝桥杯集训·每日一题】AcWing 1562. 微博转发
文章目录一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解三、知识风暴宽搜BFS一、题目 1、原题链接 1562. 微博转发 2、题目描述 微博被称为中文版的 Twitter。 微博上的用户既可能有很多关注者,也可能关注很多其他用户。 因此&am…...

[busybox] busybox生成一个最精简rootfs(下)
书接上回:[busybox] busybox生成一个最精简rootfs(上) 本篇介绍几个rootfs中用到的“不是那么重要的”几个文件。 9 /etc/shadow 和 /etc/passwd 曾经,/etc/passwd 文件用于存储独立 Linux 系统中的所有登录信息。 后来,由于以下原因&…...

Java奠基】运算符的讲解与使用
目录 运算符与表达式的使用 算术运算符 隐式转换与强制转换 自增自减运算符 赋值运算符 关系运算符 逻辑运算符 三元运算符 运算符与表达式的使用 运算符是指:对字面量或者变量进行操作的符号。 表达式是指:用运算符把字面量或者变量连接起来&…...

开发一个会员管理系统
背景 由于现在公司内客户量剧增, 简单的靠电话及笔记本记录,来维护客户有些困难,但又不想去花钱购买那些专业版的会员管理系统,只能自己动手撸一个相对简易的会员系统来使用了。 开发语言及使用技术 后端:java、mys…...

华为OD机试题【找出通过车辆最多颜色】用 C++ 进行编码 (2023.Q1)
最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧文章目录 最近更新的博客使用说明找出通…...
如何根据子网掩码计算出网络前缀(prefix)
我们知道子网掩码是对IP地址的网络地址的标注。把IP地址中网络地址位设置为1,主机地址位设置为0,得到的就是子网掩码。除了用子网掩码表示IP地址的网络地址和主机地址外,还可以用network prefix(网络前缀),比如192.168.0.1/16,这里的16就是prefix,也就是网络地址位的位…...

【FATE联邦学习】Fateboard的使用
fateboard文档 https://fate.fedai.org/fateboard/ github Fateboard文档 https://github.com/FederatedAI/FATE-Board/blob/master/README-CN.md 背景 Fateboard是FATE框架的任务看板。 在配置FATE时,Fateboard一般是被安装好了的,安装过程查看这里 A…...
解决vue3没有this造成的无法使用vue2
在Vue2项目中可以使用this.$router.push等方法进行路由的跳转,但是在Vue3的setup函数里,并没有this这个概念,因此如何使用路由方法 1.// 在新的vue-router里面尤大加入了一些方法,比如这里代替this的useRouter,具体使用…...

百度前端二面vue面试题指南
Vue 组件间通信有哪几种方式? Vue 组件间通信是面试常考的知识点之一,这题有点类似于开放题,你回答出越多方法当然越加分,表明你对 Vue 掌握的越熟练。Vue 组件间通信只要指以下 3 类通信:父子组件通信、隔代组件通…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...

工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
【Java】Ajax 技术详解
文章目录 1. Filter 过滤器1.1 Filter 概述1.2 Filter 快速入门开发步骤:1.3 Filter 执行流程1.4 Filter 拦截路径配置1.5 过滤器链2. Listener 监听器2.1 Listener 概述2.2 ServletContextListener3. Ajax 技术3.1 Ajax 概述3.2 Ajax 快速入门服务端实现:客户端实现:4. Axi…...
C/Python/Go示例 | Socket Programing与RPC
Socket Programming介绍 Computer networking这个领域围绕着两台电脑或者同一台电脑内的不同进程之间的数据传输和信息交流,会涉及到许多有意思的话题,诸如怎么确保对方能收到信息,怎么应对数据丢失、被污染或者顺序混乱,怎么提高…...

篇章一 论坛系统——前置知识
目录 1.软件开发 1.1 软件的生命周期 1.2 面向对象 1.3 CS、BS架构 1.CS架构编辑 2.BS架构 1.4 软件需求 1.需求分类 2.需求获取 1.5 需求分析 1. 工作内容 1.6 面向对象分析 1.OOA的任务 2.统一建模语言UML 3. 用例模型 3.1 用例图的元素 3.2 建立用例模型 …...
DriveGPT4: Interpretable End-to-end Autonomous Driving via Large Language Model
一、研究背景与创新点 (一)现有方法的局限性 当前智驾系统面临两大核心挑战:一是长尾问题,即系统在遇到新场景时可能失效,例如突发交通状况或非常规道路环境;二是可解释性问题,传统方法无法解释智驾系统的决策过程,用户难以理解车辆行为的依据。传统语言模型(如 BERT…...