Erlang之父的学习历史及学习建议

当我开始学习编程的时候(1967年),我可以在 FORTRAN 和(传说中的)Algol 之间选择,不过没有任何人了解 Algol,所以我选择了 FORTRAN。

在我最早学习编程的时候,我的编程周期基本上是这样的:

第一周 在纸上的表格里编写代码,然后送到计算机中心将其转换为打孔卡;

第二周 复查打孔卡,如果没问题就放到设备上执行;

第三周 得到结果

编程的一周,事实上是花费了我的三周时间;当编译器遇到第一个语法错误的时,它会终止运行——这会将你带回第一周。所以,如果在你的程序中有十个错误,它会需要花费 30 周的时间让它运行起来。

这种氛围是非常好的——教会大家不要犯错,并且首先思考。

大约在 1970 我在大学的时候,这个周期已经减少到了 4 个小时,并且你可以自己给卡片打孔——仍然是 FORTRAN。

在 1974 我可以访问一台计算机了——霍尼韦尔 DDP 516,有着 32KB 之大的内存。因此 474 FORTRAN 编译器可以在少于一周的时间里编译上百行代码。事情总在发展,我去了 CERN 并且使用可以在一皮秒编译十万行 FORTRAN 代码的 CRAY1。还是 FORTRAN。

在 1974(大约)我玩了 DEC10 ——现在我可以编写 FORTRAN、Basic、汇编,并且有了按时间轮换的分时。如果我当时在美国的话,我可能就是比尔盖茨了,可惜那是在爱丁堡。

在 1976 我得到了一份在 NORD10 上用 FORTRAN/汇编编程的工作,而按时间轮换变得非常快。

大约在 1980,我仍然在用 FORTRAN 编程。我不记得那个设备的名字了,所有的文件保存在一个目录中,没有全屏编辑器,没有版本控制系统。我为其大约编写了 15 万行的 FORTRAN 代码。

1985,我加入了爱立信,神奇的 VAX11/750,需要学习新的语言。再见啦,FORTRAN。我学习了(在不同的熟练程度下)Lisp、Prolog、awk、bash、smalltalk、TCL,并且成为了 Prolog 专家(哈哈哈哈~那个小美人……)。 同时我也对那些随手就能玩的语言进行了尝试(ML、forth 等等)。

然后(1986)我进入了我的 Erlang 时代(我其实没办法学 Erlang,因为它不存在,所以我发明了它)。它其实是 Prolog + Smalltalk 再配合点错误处理、并发和分布式的产物。

然后我学习了 C(学得很差)。但是 Mike Williams 说我的 C 是垃圾,并且看起来像 FORTRAN,因此他回收了我的 C……(为啥要用 malloc 和 free,还有指针什么的……)

我看到 C++ 的出世并且看了本书,或者说至少尝试去读了本书。在我的钢琴后面的墙上有个坑,就是那本书砸出来的。对 C 进行改进应当让事情变得简单,而不是更复杂,我这样想到。

时间飞逝。 我尝试了 Java(没什么深刻的印象,比 C++ 好点,但是如此罗嗦。在编写 FORTRAN 的时候,你不得不为一个很小的事情编写上百行代码,我甚至为此打肿了手。Java 也差不多,如此罗嗦)。(后来)我还尝试了 Python(还行)、Ruby(还行)、Lua(不错)、Javascript(我喜欢)。

实际上学习所有这些语言花费了我相当长的时间,并且它们不是同时进行的。我和 FORTRAN 有 15 年的美好时光,对于用好它来说足够长了。Prolong 10年, Erlang 20 年,等等。

我也花了很长时间来消化新的主意。那些关于编程的主意或者其他人的好主意,出现得很慢,差不多二十年一个。在过去的二十年里,编程并没有多大的改进。那个时候它就是一坨,现在还是一坨。

IDE 和版本控制系统让事情变得更糟,现在你有了所有版本的一坨,以及那一坨本身,而 IDE 意味着你看不到那一坨了。

世界上最好的 IDE 是你的大脑,它比这些咔啦咔啦的东西好无数倍。

教育为此做了什么?

假设你刚刚起步。你可以在二十余种语言中进行选择(它们每个都有一个或多个好理由),这花费了我 40 年来学习,你必须在 2-3 年里明白这些,看起来不太可能。

初学者应当学习什么语言,学校应当教什么语言? 现在我们遇到了一个选择的悖论,由于有太多选项而无法选择。

以前说“为了问题而选择语言”,当你已经了解了二十余种语言(在不同的熟练程度下)这么说很容易。但是,如果你只了解两种语言 Java 和 C,那么这就没什么帮助。

许多实际问题的解决方案在 CLP 语言中只需要几行代码,而在 C 中需要几千行。

我建议学习的是什么?我建议大家按下面的顺序学习编程:

1. C

2. Prolog

3. Erlang(我偏心)

4. Smalltalk

5. Javascript

6. Hakell / ML /OCaml

7. LISP/Scheme/Clojure

(每个语言)花几年的时间应该是够了。

注意这里没有捷径,如果你想要捷径,可以去买本《十分钟学会 PHP》,然后用接下来的二十年在 Google 上搜索“我该如何计算字符串长度”。

将所有东西组织在一起仍然是极度糟糕到令人发狂的地步。组织到一起最好的办法还是 UNIX 的管道:

find ... | grep | uniq | sort | ...

这其中最基础的原理是组件应当通过某个统一的媒介语言中,良好定义的协议来进行分离。

通过消息传递来组织是个途径。这是 OO 编程的基础,但是大多数编程语言做得很差。

如果世界上所有的应用都通过 socket + LISP S 表达式作为接口(通信),并且将协议描述用格式化的标准编写,那么重用的时候就会(更)容易。

当前,对于语言有种不良的关注和推进,而忽视用什么协议来如何组织。应该讲授协议,而不是语言。并且应当讲授算法。

祝福大家

/Joe

Erlang之父的学习历史及学习建议

时间: 2024-10-19 22:37:17

Erlang之父的学习历史及学习建议的相关文章

深度学习——历史及意义

参考文献:深度学习 历史: 2006年,Hinton给出了突破的一步. 2013年,李彦宏高调宣布成立深度学习研究院. 目前,很多领域的state-of-the-art被深度学习占领. 意义: 通常,传统的方法需要手动提取特征: 虽然,现在有许多牛逼的特征,如sift.hog特征,但是,手动提取特征很不方面,也不够“mechine learning”.另外,对于一个给定的问题,你要选择什么特征?你是挨个试试还是多练然后总结出一套经验?很显然,这种“mechine learning”让人怀疑.于是

每日linux命令学习-历史指令查询(history、fc、alias)

linux历史机制对命令行中输入的命令进行编号并依此保存,以维护命令历史.登录会话期间输入的命令保存在shell内存中,若终止命令则添加至历史文件. 1. 箭头符号方向键 使用键盘上的箭头方向键可以从历史文件中获取历史指令,访问历史指令后也可以进行更改. 2. history指令 history是系统的内置指令,可以显示.bash_history文件保存的指令列表,并向指令赋予编号. 3. fc指令 fc指令可以用于输出历史命令列表,也可以通过调用vi编辑器对历史指令内容进行编辑输出. 语法:

向“生物力学之父”冯元桢先生学习什么?【转载】

[转载] 原帖:http://blog.sciencenet.cn/blog-485553-753738.html 在企业从事技术工作的我本该与“生物力学之父”冯元桢先生没什么交集,但因本人从事机械行业的流体传动与控制技术领域,幻想能否用流体力学与机械结构作类比,解析高血压现象,于是找来一本<人体解剖学>的书籍来看(仅看了血液循环一章),发现血液循环系统和流体传动系统原理是一样的,心脏.瓣膜.血管.血液完全可用泵.阀.管道.矿物油作类比.流体传动系统要服从流体力学,机构学,热力学规律,血液循环

一文让你看懂人工智能、机器学习、深度学习和强化学习的关系

如果说信息技术是第三次工业革命的核心,那么人工智能所代表的智能则是下一次工业革命的核心力量. 2016年,谷歌阿尔法围棋以4:1战胜围棋世界冠军.职业九段棋手李世石,不仅让深度学习为人们所知,而且掀起了人工智能的"大众热".此后,人工智能越来越热,从机器人开发.语音识别.图像识别.自然语言处理到专家系统等不断推陈出新. 同时,人工智能技术越来越多地融入到我们的生活中,出现了智能音箱.智能助理.智能机器人等. 根据应用领域的不同,人工智能研究的技术也不尽相同,目前以机器学习.计算机视觉等

怎样找到一份深度学习的工作(附学习材料,资源与建议)

原文地址:How to get a job in deep learning 原文翻译与校对:@戴丹 && @胡杨 && 寒小阳 时间:2016年10月. 出处:http://blog.csdn.net/han_xiaoyang/article/details/52777661 声明:版权所有,转载请联系作者并注明出 如果你是一个软件工程师(或者你现在正在学习这一方面),你肯定有机会听说过深度学习(有时候深度学习缩写为"DL").它现在是一个热门.且快速

Python学习教程(Python学习路线+Python学习视频):Python数据结构

Python学习教程(Python学习路线+Python学习视频):Python数据结构   数据结构引言:   数据结构是组织数据的方式,以便能够更好的存储和获取数据.数据结构定义数据之间的关系和对这些数据的操作方式.数据结构屏蔽了数据存储和操作的细节,让程序员能更好的处理业务逻辑,同时拥有快速的数据存储和获取方式. 在这篇文章中,你将了解到多种数据结构以及这些数据结构在Python中实现的方式.    抽象数据类型和数据结构 数据结构是抽象数据类型(ADT)的实现,通常,是通过编程语言提供的

好程序员大数据学习路线Hadoop学习干货分享

好程序员大数据学习路线Hadoop学习干货分享,Apache Hadoop 为可靠的,可扩展的分布式计算开发开源软件.Apache Hadoop软件库是一个框架,它允许使用简单的编程模型跨计算机群集分布式处理大型数据集(海量的数据).包括这些模块: Hadoop Common:支持其他Hadoop模块的常用工具. Hadoop分布式文件系统(HDFS?):一种分布式文件系统,可提供对应用程序数据的高吞吐量访问. Hadoop YARN:作业调度和集群资源管理的框架. Hadoop MapRedu

前端学习:JS学习总结(图解)

前端学习:JS学习总结(图解) JS比HTML和CSS的知识点要多的多,下面分几段来介绍其内容... 为了能让大家更好的检索,前面的图解是整个JS的概括,后面的才是知识点... 旁边就是目录,建议用目录来观看本博客...... JS的知识体系  JS的简介 JS基本语法 JS内置对象 JS的函数 JS的事件 JS的BOM JS的DOM JS的简介 JS是什么? JS能做什么? JS的历史及组成 JS的引入方式 JS基本语法 变量 原始数据类型 引入数据类型 运算符 逻辑语句 JS内置对象 JS对

(八)从零开始学人工智能--统计学习:统计学习基础知识

目录 统计学习基础知识 1. 统计学习种类 1.1 监督学习 1.2 非监督学习 2. 统计学习中的基本概念 2.1 统计学习三要素:模型,策略,算法 2.2 欠拟合和过拟合 2.3 如何避免过拟合 2.4 过拟合产生的原因 2.5 最大似然估计和贝叶斯估计 3. 线性回归 3.1 经典线性回归 3.2 岭回归(ridge regression) 3.3 lasso回归和ElasticNet 4. 线性分类 4.1 感知机 4.2 逻辑回归(logistic regression) 4.3 So