读书笔记2014第17本

要去西南出差了,却从友好的书架上和Kindle中找不出感兴趣的书来,临出发前去老SUN屋里寻摸一圈,选中了《代码的前程》这本书。选中它的原故有几条:Ruby之父写的书,作者是日本人,东瀛人写的书一般相比较实用、也想领会一下Ruby、翻目录时发现有Go、Dart、CoffeeScript、Lua多少个新语言的对照分析、老SUN说网上对此书评论不错。

飞机上看了一同,一口气读了前2章,90多页,对各个语言中的关键特性分析得一定到位,对语言的开拓进取历史有了概括性的询问。出差后白天忙工作,清晨把剩下的部分高速读完了,后边三章的内容对自我来说吸重力就不够了,可能是技术性太强了,我们不会研究到如此深,只会去用外人写好的现成的框架。

率先章 编程的日子和空中

一开首作者从编程的精神动手,编程就是创制出一种人类和电脑都可以领会的言语(编程语言),并通过这样的语言将人类的意向传达给电脑,这样的表现就叫做编程。自然语言的歧义性太强,将来的用户界面肯定是圆满的语音输入应该没有问题,但用语音把题目总体说出来,交给总结机去落实,现在看来如故分外有难度,假若前些天促成了,那么程序员是不是要下岗了?依然都转入到更底层的代码的编写中去?

编程是一项创立性的做事,能够遵照自己的心愿来创立世界,正是编程的最大魅力所在。想起高中时录入的几行BASIC代码,可以完成繁琐的计量,就想着自己编写一个小游戏会是咋样状态吧?从而爱上了编程这项工作而一发不可收拾。

电脑语言的发展与摩尔定律也有特别大的维系,但总计机的算法改变得并不大,特别是一对古老的基本功算法仍在大气利用。摩尔(Moore)定律现在基本还有效,但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、减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年八月),Go语言名次在20名之外(排名46),Dart排行22,CoffeeScript没瞧见,可能合并在JavaScript中了,Lua排行41。

Java稳居第2,JavaScript跃居第7,Ruby有点下降,处于第18名,而更上一层楼最快的R和斯威夫特(Swift)没有出现在笔者的书中。

发展历史 1

3.1 语言的计划性

发展历史 2

静态类型的言语编译期间就能窥见更多的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和伊夫(Eve)ntMachine,这多少个就不明了了。

4.3 HashFold

不感兴趣。

4.4 进程间通信

看Ruby 实现的网络服务器代码是一定的简单,将来有空子可以一试。

4.5 Rack 与Unicorn

不感兴趣。

 

第五章 支撑大数目标数额存储技术

这章早已抢先了本人的明白范围,列多少个术语吧,CAP、NoSQL、MongoDB、OD
Mapper、VoltDB、memcached、Redis。 

第六章 多核时代的编程

这章中提到了UNIX中的管道效能,真是异常的漂亮和强大,相比较之下,Windows中的管道却是通过临时文件模拟实现的,非凡的污物。

此外有关非阻塞I/O、node.js 、伊芙(Eve)ntMachine的情节暂时在本人的兴味之外。

有关进程间通信,作者提到了ZeroMQ,是一种为分布式应用程序支付提供经过间通信功用的库。有机会可以一试。

 

发展历史 3

发展历史 4

发展历史 5

发展历史 6

发展历史 7

发展历史 8

发表评论

电子邮件地址不会被公开。 必填项已用*标注