程序员的未来
程序员的未来
在一个来自于CGP Grey很精彩的视频中,他提出说,在不久的将来,大多数工作将会由机器替代。许多行业,从卡车司机到医生,在不久的将来将会消失或发生巨大的变化,创造出一种全新的社会体制。但是,这样一来似乎有点说不通——既然未来的计算机程序将会大放光彩,那么势必需要更多的程序员。毕竟,创建自动汽车、自动化的医疗诊断系统、小贩机器人等等,都需要程序员的参与,不是吗?
大错特错。
编程是什么?
编程是将理念(业务、法律、游戏、数学问题等)翻译成机器可以执行,其他人可以读取的代码的学科。归根结底,程序员不过是中间人而已,一个既能明白问题又能理解机器的中间人,因此,可将两者进行转换。仅仅如此而已。
伟大的程序员既透彻了解他们编程的平台,又深刻理解问题域。创新迸发在域和技术甜美的交集中。这就是为什么(除其他事项外)如果让程序员(GitHub、Visual Studio、AWS等)去做大型产品和政府产品(Healthcare.gov,FBI’s Sentinel,等等)时,软件往往会变得糟糕又昂贵。
每个人都在编程
中间人最终会被淘汰。
编程在过去几十年间已经发展到了相当高的程度。高级编程语言和可用的在线信息将进入编程的门槛几乎降至为零。Scratch,一款来自于MIT有着数百万用户和上千万项目的儿童友好型的编程平台,已经可以媲美GitHub。现在,一个普通的程序员相较于20年前他的同行,需要理解的计算机体系结构和算法要少很多。
然而,这场革命近期似乎停滞不前了。我们最重要的工具——编程语言最近并没有发生太大的改变。大多数新的和流行的语言(如GO和Rust),只是逐渐改进了现有的范式,缺乏革命性的功能。目前最流行的编程语言是Java(1995年),C(1973)和C ++(1983年),年纪都已经不小。这个行业却反而开始专注于开发支持工具和方法,来提高生产效率。我们已经太久没有创新了,所以,我强烈推荐大家看看Bret Victor的演讲《The Future of Programming》。
这是什么意思?
S曲线
科技的发展是这样的:SSSSSSSSSSSSSS
如果要描述地更清楚点的话,它是这样的:
例如,IBM的第一个文字处理器程序(FORMAT)使用繁琐的穿孔卡片作为输入。在同一时间,最先进的打字机附带可替换字体、自动字符重复以及打印数学公式的能力。然而,却没有人使用打字机。本来位于打字机下方的文字处理器的曲线很快赶上并超越了打字机,打字机变成了过去时。
我相信,我们正处在一个类似的语言技术曲线上,正在等待一个新的时代的到来。
不需要程序员的编程语言
为了从系统中彻底淘汰程序员(中间人),我们需要让编程平台自身去“理解”问题,而不再需要编写代码。
这个想法并不是我首创的。 1963年,Ivan Sutherland在《Sketchpad》中就描述了这样一个系统,它可以解决给定的若干已定义约束的问题。Prolog(1972年),一种声明性编程语言就是为了解决给定的一系列逻辑规则问题而创建的。它虽然依然是一种需要程序员的编程语言,并且并没有被广泛使用,但是它没有完全消失。比如,它以及其他语言一起成就了IBM著名的超级计算机沃森(Watson)。
对于不需要程序员的编程语言,最伟大的例子是自然语言,如英语。从二进制代码到汇编,从C到Python,编程语言趋向于越来越类似自然语言。并且作为现在一种推崇的方式,越来越多的程序员正在试图让他们的代码尽可能地接近于白话英文,以便于其他程序员和未来自己的理解。那么这个融合的限制是什么?
NLP
现在的自然语言处理(natural language processing,NLP)系统能够理解文本中的单词角色以及它们之间的相互关系。下面是来自斯坦福大学CoreNLP输出的一个例子:
我们可以发现,仅通过分析文本,该程序就能够识别同一个人的联合引用,并识别单词的角色。
下面说一个更有趣的,例如,此简单的业务规则:
注意CoreNLP是如何识别条件(if – buy)和对象(buy – iPhones)的。那么现在将这些翻译成计算机程序还有什么难的吗?
有越来越多的新闻文章是由机器人写的。最近如Apple、Google、Microsoft和亚马逊等公司已经相继开发出基于语音识别和自然语言处理的客户产品。这进一步加快了这一领域的研究。
如果你想亲自体验自然语言处理,那么我强烈建议Python的NLTK。
遗传编程
另一个有趣的研究领域是遗传算法。使用类似于自然选择的进程,遗传算法通过生产最佳的解决方案来解决问题。从设计喷气发动机到玩超级玛丽都是它的应用范围。
但是,遗传算法肯定不能生成程序代码,是吧?再好好想想。
一个名叫Kory Becker的开发人员,编写了一个可以生成Brainfuck代码来解决简单问题的程序。当然,这款软件的实用性非常有限,但这仅仅是个开始。正如他所说,更复杂的问题需要更多的计算能力,来找出最适合的解决方案。
例如,下面的代码,完全是由程序写的,可打印hello。
+-+-+>-<[++++>+++++<+<>++]>[-[---.--[[-.++++[+++..].+]],]<-+<+,.+>[[.,],+<.+-<,--+.]],+]
[[[.+.,,+].-
该字段称为遗传编程,并且也不是什么新生事物:
对遗传和进化的研究需要结合查找的基因和生存价值标准。(Alan Turing,《Intelligent Machinery》,1948年)
结合NLP和GP,我们就可以建立能理解用自然语言写的约束的系统,并实施可解决这些带有约束的问题的程序。
享受这段美好时光吧
我相信不是所有的编程工作都会被机器人取代,至少不会很快。比如说,那些需要高度优化的代码或使用高级算法的编程任务。其他的还有领域过于复杂的情况。不过,我也相信,大量的程序员将会在未来几年被取代。我的预测是,这将急剧减少对程序员的需求,抵消对软件创造的不断增加的需求,并最终结束程序员的高薪时代。
这是否令你很难过?享受这段美好时光吧,至少我们比货车司机和医生要幸运得多,并且有机会参与到这场革命中。
- 关于R安装中文分词包安装不上的问题install.packages("tm")
- dataguard备库的数据文件的迁移实战(r8笔记第24天)
- Hive的left join、left outer join和left semi join三者的区别
- 52. Socket Server 自定义协议的简单实现 | 厚土Go学习笔记
- dataguard备库的数据文件的迁移(r8笔记第22天)
- 46. 实现一个简单的网络爬虫 | 厚土Go学习笔记
- 45. sync.Mutex 互斥和互斥锁 | 厚土Go学习笔记
- golang进度条
- 44. goroutine、channel、time的例子 | 厚土Go学习笔记
- AVL二叉树
- Golang:使用 httprouter 构建 API 服务器
- dataguard中需要注意的一些数据文件操作(r8笔记第21天)
- 42. select 的默认分支 | 厚土Go学习笔记
- 执行计划变化导致CPU负载高的问题分析 (r8笔记第20天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Ubuntu 18.04 Server 设置静态IP 的办法
- PHP依赖注入容器知识点浅析
- centos克隆linux虚拟机的完整步骤分享
- laravel框架中间件简单使用方法示例
- PHP检查文件是否存在,不存在自动创建及读取文件内容操作示例
- Smarty模板语法详解
- PHP保留两位小数的几种方法
- PHP七种数据类型知识点总结
- PHP中__set()实例用法和基础讲解
- laravel框架分组控制器和分组路由实现方法示例
- 使用swoole 定时器变更超时未支付订单状态的解决方案
- Yii2 queue的队列使用详解
- ThinkPHP5+jQuery+MySql实现投票功能
- Smarty模板配置实例简析
- php利用ZipArchive类操作文件的实例