读书笔记2014第17本:《代码的将来》

要去西南出差了,却从本身的书架上和Kindle中找不出感兴趣的书来,临出发前去老SUN屋里寻摸一圈,选中了《代码的将来》这本书。选中它的缘由有几条:Ruby之父写的书,做者是日本人,日本人写的书通常比较实用、也想了解一下Ruby、翻目录时发现有Go、Dart、CoffeeScript、Lua几个新语言的对比分析、老SUN说网上对此书评价不错。php

飞机上看了一路,一口气读了前2章,90多页,对各类语言中的关键特性分析得至关到位,对语言的发展历史有了归纳性的了解。出差后白天忙工做,晚上把剩下的部分快速读完了,后面三章的内容对我来讲吸引力就不够了,多是技术性太强了,咱们不会研究到这么深,只会去用别人写好的现成的框架。html

第一章 编程的时间和空间

一开始做者从编程的本质入手,编程就是创造出一种人类和计算机都可以理解的语言(编程语言),并经过这样的语言将人类的意图传达给计算机,这样的行为就叫作编程。天然语言的歧义性太强,未来的用户界面确定是全面的语音输入应该没有问题,但用语音把问题所有说出来,交给计算机去实现,如今看来仍是至关有难度,假如未来实现了,那么程序员是否是要下岗了?仍是都转入到更底层的代码的编写中去?node

编程是一项创造性的工做,可以按照本身的意愿来创造世界,正是编程的最大魅力所在。想起高中时录入的几行BASIC代码,可以完成繁琐的计算,就想着本身编写一个小游戏会是什么状况呢?从而爱上了编程这项工做而一发不可收拾。程序员

计算机语言的发展与摩尔定律也有很是大的联系,但计算机的算法改变得并不大,特别是一些古老的基础算法仍在大量使用。摩尔定律如今基本还有效,但CPU主频的提升已基本到了极限,未来多核技术、内存容量增大、硬盘向SSD转变将会成为主流。咱们的程序和算法须要如何适应这些变化呢?正则表达式

这时想起当孩子小的时候,我启蒙性地让她看了看LOGO语言,让她操纵小海龟在屏幕上画出奇妙的图案,她确实感受很是神奇,但对动手创造新的世界并没有太大的乐趣,可能女孩子的天性并不喜欢这些东西吧,难怪女程序员如此之少。我也不想强行给孩子灌输什么编程技术,毕竟软件开发还是一件很是辛苦的工做,仍是别让孩子成天面对代码过日子吧。算法

做者也大胆地对将来进行了预测,IT技术变化日新月益,5年就会发现很大的变化。价格降低、性能提升、容量增大、带宽增长,并且这些项都是按指数关系发展的,这些构成了IT技术预测的基础。在这些增加方面,存储容量的增大好像更快,而数据传输速度增长并无那么快,这些发展的不平衡也会左右咱们的将来。数据库

编程人员的思路果真离不开编程,做者采用极限编程XP的思路来预测一下将来。当把几项指标都调到极大,世界会是什么样子?编程

计算机价格低得跟白菜同样,如今的智能家电已经看出一些趋势了。未来的世界确定布满了芯片,物联网看来真是大势所趋。地板是智能地板、手表是智能手表、灯是智能灯、杯子是智能杯子、智能箱子,这些都在出现,未来的术语确定再也不使用“智能”这么俗的字眼,默认就是带计算机芯片的设备,便地都是计算机了,看来程序员事情更多了,任务更复杂了。数组

计算机性能很是强会发生什么?未来个人笔记本配置会是1024核?多核CPU并行编程确定要有新的发展,若是哪项编程语言有这种特色,应该是须要重点关注的语言。可能做者把Go语言排在比较靠前就是这个缘由吧。浏览器

容量很是大?个人笔记本电脑会配置1EB硬盘?不,硬盘已经没有了,内存与硬盘已经合2为1了,由于内存也已是白菜价了,配置1TB内存?其它东西都存在云端了,不必管什么容量问题了,由于带宽不成问题,从网络上读写10G数据也是几秒的事情?malloc()你就尽情地分配个八维数组吧,别去管什么内存溢出之类的异常,哈哈。如今以SSD为基础的数据库系统和大数据分析技术已经出来了。

网络带宽1Gbit/s?计算机刚问世时,那是一个中央集权的时代,一台大型计算机,周围只有一些终端。当人手能够有一台计算机时,出现了C/S系统。当WWW浏览器在全世界普及时,B/S方式的中央集权开始复辟。如今JavaScript在浏览器上大行其道,实际上又是C/S换个马甲复活了。若是B/S是趋势,那你配置那么强大的我的电脑又有什么用处呢?不,每台电脑自己也是网络云计算中的一个节点,你必须提供计算资源,才能访问别人的服务?

第二章 编程语言的过去、如今和将来

2.1编程语言的世界

这里提到了打孔纸带、巴贝奇的差分机、女程序员Ada、第一台计算机ENIAC,至于到底谁是真正的第一那是历史学家的事了。计算机语言主要介绍了FORTRAN、COBOL、LISP、SNOBOL语言,而后讲到了当前的主流语言。

100年后的编程语言会是什么样子?变化不大?使用编程语言来编程的这个行为已经不存在了?发明了更高抽象度写法的编程语言?反正俺是看不到了。

20年后的编程语言是什么样子?确定会在多CPU协做和多机分布式处理方面更增强大。当前的线程编程模型实在太让程序员痛苦了。

2.2 DSL(特定领域语言)

外部DSL是由专用的语言引擎来实现的DSL,能够高度自由的定制,但学习成本比较高。 YAML、JSON、正则表达式均可以称为外部DSL。XML很是通用,但描述冗长,不适合阅读和程序编写,未来会如何改进?

内部DSL则寄宿在某一编程语言的基础上,这样就不须要再学一门新的语言,宿主语言的语法等均可以拿来使用,节约了大量的程序开发时间。

实际上设计一堆API的过程,就是一种设计DSL的过程。

我也曾经想把工区底图和剖面程序DSL化,核心程序员开发好组件库,其余程序员只须要这样写就好了:

a = Basemap.New

a.AddImage(image, 0, 0, 1, 1)

a.AddSurvey(...)

survey.Hide

SeismicLine.Show zxcVolume inline 200

......

惋惜在C#里实现内部DSL仍是至关辛苦,只能暂时用API了。

做者认为Lisp、Smalltalk和Ruby适合用做内部DSL的语言,这可能与它们的元语言编程特性有关吧。

DSL 设计的构成要素:上下文、语句、单位、词汇、层次结构,这些概念我还暂时领会不了。

2.3 元编程

用程序来编写程序就是元编程Metaprogramming。这时又想到了数字油田中成天都说到的元数据,存储这些元数据当然重要,但脱离应用的元数据确定收集不上来,必无生存之地。若是元数据和元编程都实现了,程序员获取数据的逻辑应该就是像well1.GetWellLog(“AC”)这样?你既不须要写SQL,也不须要写ORM映射关系,也不须要写实体类,写起来是方便了,但好像学习起来难度更大了。

在Java和C#中主要都是经过反射Reflection来获取和变动程序自己的信息,而Ruby的元编程至关强大,能够用几行代码生成100个方法,而在Java和C#中就只能经过编写专门的代码生成器了。

Lisp中的程序是用S表达式来表示的,其程序和数据是彻底等同的, 因此元编程已经深深融入到Lisp中了。

元编程很强大,但也不能用得太多,不然理解源代码就很困难。

2.4 内存管理

垃圾收集GC的三种方式:标记清除、复制收集、引用计数。引用计数方式的原理和实现虽然简单,但缺点也不少,所以最近基本上再也不使用。想一想Qt中的内存管理也是采用引用计数,让程序员去决定什么时候增一、减1真是一种痛苦。

新的垃圾收集算法有:分代回收、增量回收、并行回收。

还有一位IBM的学者将物理学上的大统一理论(Grand Unified Theory,简称GUT)用于垃圾收集,统一为跟踪回收和引用计数。

2.5 异常处理

如今的高级语言都有异常处理机制,让程序员能够更方便地处理异常。传统的用特殊返回值的方法,容易让原来正常的程序被错误处理代码所埋没。

Java 的检查型异常强制让编译器检查异常,有时确实不方便。异常之因此被称为异常,原本就由于它很难事先预料到。明知如此,还非要在代码中强制性事先对异常作好声明,以免产生编译错误,这实在是太痛苦了。

Ruby中的ensure、rescue和retry参考了Eiffel语言的保留字。

2.6 闭包

学Haskell语言时,我之前认为闭包Closure就是指高阶函数,能够把函数当参数传递给函数。

C语言中函数指针的最大弱点是没法实现对外部局部变量的访问。可以对外部变量进行访问(引用、更新),是闭包的构成要件之一。

第三章 编程语言的新潮流

在这一章中做者主要介绍四种编程语言Go、Dart、CoffeeScript和Lua。看到这里我打开了TIOBE关于软件编程语言的排行榜(截止到2014年11月),Go语言排名在20名以外(排名46),Dart排名22,CoffeeScript没看见,可能合并在JavaScript中了,Lua排名41。

Java稳居第2,JavaScript跃居第7,Ruby有点降低,处于第18名,而发展最快的R和Swift没有出如今做者的书中。

image

3.1 语言的设计

image

静态类型的语言编译期间就能发现更多的BUG,更容易阅读和理解。而动态类型语言的优势在于其简洁性和灵活性。

鸭子类型Duck Typing:若是像鸭子同样走路,像鸭子同样呱呱叫,则它必定是一只鸭子。

3.2 Go(排名46)

能够称之为现代版的C语言。声称为New(新的)、Experimental(实验性的)、Concurrent(并发的)、Garbage-collected(带垃圾回收的)、Systems(系统级)的语言。做者最看好它,可能主要是由于它内置支持并发编程,再就是它系出名门吧。

3.3 Dart(排名22)

Dart想取代JavaScript,但后者已经拥有了大量用户,看来Dart的前途并不光明。

3.4 CoffeeScript

JavaScript被投入了大量资金进行不断发展,其速度已经愈来愈快。既然JavaScript地位愈来愈重要,能不能既不抛弃JavaScript,又克服其缺点呢?CoffeeScript就是这种思路,它的编译器实现上就是JS写成的,CoffeeScript程序会彻底编译为JS代码去执行,其发展值得期待。 

3.5 Lua(排名41)

Lua重点在嵌入式领域,以轻量、高速和响应快为特点。

第四章 云计算时代的编程

从这一章开始,读起来兴趣不大了,简单了解几个概念吧。

4.1 可扩展性

从简单的二分法查找,讲到散列表和布隆过滤器,又讲到了分布环境中的DHT(分布式散列表)、Roma(键值存储数据库)和MapReduce。

4.2 C10K 问题 

C10K是Client 10000 Problem的缩写,指“在同时链接到服务器的客户端数量超过10000个的环境中,即便硬件性能足够,依然没法正常提供服务”。epoll、libev和EventMachine,这些就不明白了。

4.3 HashFold

不感兴趣。

4.4 进程间通讯

看Ruby 实现的网络服务器代码是至关的简洁,之后有机会能够一试。

4.5 Rack 与Unicorn

不感兴趣。

 

第五章 支撑大数据的数据存储技术

这章已经超出了个人理解范围,列几个术语吧,CAP、NoSQL、MongoDB、OD Mapper、VoltDB、memcached、Redis。 

第六章 多核时代的编程

这章中提到了UNIX中的管道功能,真是至关的优美和强大,相比之下,Windows中的管道倒是经过临时文件模拟实现的,至关的垃圾。

其它关于非阻塞I/O、node.js 、EventMachine的内容暂时在个人兴趣以外。

关于进程间通讯,做者提到了ZeroMQ,是一种为分布式应用程序开发提供进程间通讯功能的库。有机会能够一试。

 

1

3

4

5

6

7