在机器学习兴盛之前,几乎所有的软件都是规则逻辑的表达,开发者需要对任务进行分解, 理清每一个细节的解决方案,然后再整合到一起。虽然技术不断地更迭,也不断出现新的 开发语言和领域模型,但是这一基本的思路是从来没有变化过的。
不过机器学习尤其是最近十年深度学习的兴起,已经逐渐产生了一种新的软件开发范式, 这种新的范式被Tesla的AI主管Andrej Karpathy称为 软件2.0。 如果你学习编程的目的是要进入人工智能领域,希望这部分的内容对你有所帮助。
在传统的编程中,开发者是规则的制定者,这些规则以程序的形式存在,而计算机则仅仅 负责执行,也许由于开发者的某个疏忽可能会导致程序的运行出人意料,但整体上来讲 开发者是程序的强力操控者,所有的执行逻辑是开发者的思维的展示。
但是在软件2.0中,开发者只是实现一个基准的程序,而大量具体化的处理规则是这个 基准程序通过对大量数据的处理而得出的,也就是说,程序执行的规则一部分由开发者设定 (被称为模型的超参数),而另一部分规则却是由程序自己通过与数据的磨合优化出来的。
例如,人脸识别已经从早期的手工设计用于识别的特征进化到由深度神经网络自动从大量 标注数据中提取特征:
在软件2.0中的基准程序需要更高层级的抽象,而不局限在一事一议的具体问题解决 的逻辑表述上。在目前这一层主要是利用人工神经网络来实现的,程序自主学习的规则体现 在神经元的连接权重调整上。因此软件2.0的开发范式,其核心思维就是设计适合 问题领域的模型,然后用数据来优化出模型的参数。
软件2.0还处于极其早期的萌芽阶段,但非常值得初学者关注,它的发展也许会最终 改变软件开发的模式,虽然我确信在相当长的时间内编程作为一种工作而言都不会消失。

6、应该按什么步骤学习编程语言?

编程是需要熟练的掌握一些基本技能的,因为需要用这些基本技能来组合出来针对特定 问题的解决方案。当你还是一张白纸的时候,即使了解了顺序、条件判断或者跳转、循环 之类的思维也解决不了具体问题,因为分解到最后还是找不到可用的武器。
编程语言是你的第一个武器,要用好这个武器,就需要尽可能多的了解一个编程语言 的能力。可以参考下面的问题探索编程语言的能力:
1、这个编程语言怎么定义变量、函数或者类?
变量是让同一段程序能够适应各种执行环境的必备品,在程序中顺利地使用变量意味着 你有了初步的抽象能力。几乎所有的编程语言都支持变量,那么先了解一个编程语言如何 定义变量、如何给变量赋初值是理所应当的。
例如,你要编写的程序可能有很多个注册用户,而你的程序核心逻辑并不需要根据用户的不同 而区别对待,那么将注册用户抽象成一个变量来编写你的程序逻辑就是合理的选择:
函数(或者过程)是组织可复用代码的一种常用手段。如果有一个功能你会在多个地方使用, 那么把这个功能封装到一个函数里是常见的代码复用手段,这样就避免了同样的实现代码 在程序的不同地方重复出现,优化了代码,也更容易维护。
如果说函数是对计算机原生的顺序过程化思维的一种优化组合方法,那么类则是面向 对象的软件设计思维的优化组合方式,不妨简单地把面向对象视为对现实世界中的 实体对象以及相互关系的模拟,例如可以把所有的用户视为一个类,因为在我们的程序 中这些用户有一些共同的特性和方法。
2、这个编程语言怎么表达顺序、条件判断、跳转或循环逻辑?
就像前面说到的,这些组合手段用来把程序的各部分拼装在一起,因此是必须掌握的。
3、这个编程语言提供了哪些基准解决方案?
所谓基准解决方案就是可以解决某个单一问题的方案,例如:怎么输出一句话、显示一个图片 或者访问服务器上的数据库。通常一个编程语言都会提供一些内置的基准解决方案,以 函数或者类的形式提供给开发者,这些函数或者类,就是我们常说的API —— 应用开发接口。
因此在了解了编程语言的基础语法之后,需要学习的就是编程语言提供的API的使用方法。 虽然不需要逐个验证每个API的功能,但是强烈建议你设定一些问题,然后带着这些问题 找出可以解决这些问题的API进行练习 —— 这些API是你解决具体问题的基础。
4、这个编程语言有哪些优秀的第三方开发包?
大多数的编程语言都采用开发包的形式支持第三方提供扩展解决方案,以便开发者可以根据 自己的领域需求进行选择。