学化学的应该都知道chemdraw,这是一款专门绘制化学结构的软件,什么苯环、双键各种word难以搞定的分子式,你可以轻松的用chemdraw完成,可以称得上化学工作者居家旅行必备的良药。其实早在1987年的时候,贝尔实验室的大牛Brian Kernighan(就是K&R教你写C语言中的K)和人一起设计了Chem语言,到现在还能用,似乎在书籍排版上比chemdraw的效果更好。说了这么多,咱不是给Chem做广告,而是为了引出它的另一位创作人Jon Bebtley,也是本文即将谈到的《编程珠玑II》——非常受程序员欢迎的系列书籍的作者。

《编程珠玑II》是一部短文集,涵盖了程序员操纵程序的技术、程序员取舍的技巧、输入和输出设计以及算法示例。

开头提到的Chem语言是Pic语言的预处理器,通过作者在书中第9章讨论的Pic语言一例,我们能够明白按照语言的特性对程序进行检查,可以帮我们更好地理解所使用的语言工具,并能教会我们为以后的程序设计更优雅的界面。

编程语言设计原则

  • 设计目标:设计语言之前,要认真研究你试图解决的问题。
  • 简单性:让你的语言尽可能地简单。规模小的语言便于实现者设计、创建、写文档和维护、也便于使用者学习和使用。
  • 基本的抽象:常见的程序设计语言是基于冯・诺伊曼计算机的视角进行创建的,其指令只对小块的数据进行操作。基本对象就是程序的抽象数据类型,而操作就是关键的字程序。
  • 语言的结构:表达式的自然性和实现的方便性需要做出权衡,缩进和注释都是必需的。
  • 正交性:问题中不相关的特性在语言中也不相关;
  • 设计语言的准绳:
    • 一般性:一种操作用于多种目的;
    • 简约性:去掉不需要的操作;
    • 完全性:所设计的语言能描述所有感兴趣的对象吗? 
    • 相似性:让语言尽可能有启发性;
    • 可扩展性:确定语言可以进一步发展;
    • 开放性:允许用户“溜走”以使用其它工具;
  • 设计过程:在实现语言之前,通过描述语言中大量的对象来测试你的设计,当语言完成并付诸实用后,还要反复进行新的设计已根据客户的需要加入新特性。
  • 对编译器生成的深刻见解:尽可能地从后端的处理过程中将前端的语言分析分离出来,这样处理器的创建更容易,也更容易兼容到系统或新的语言用途中。

文档设计和编程有诸多相似之处,书中第10章通过几副不断完善的表格、插图,穿插着介绍了文档设计的原则。

文档设计

文档生成和编程有很多共同之处,两者都要“创造对他人有用的东西”和“必须出色的完成论文”,两者最大的共同点是都能让人尽享“创造的乐趣”。

文档设计需要创意。如果所有人着装相同,所有车的车型和颜色也一样,那么这个世界是多么地乏味。一个所有风格看上去差不多相同的文档库也是一样。综合考虑文档的许多属性,才能得到最佳的计效果。

但是要当心创意过度,好的排版并不能弥补文章本质上的缺陷,如拼写错误、语法不当、结构性差以及内容空洞等。好的文档风格就像好的编程风格和好的写作风格一样,是无形的。内容是文档的首要目的,文档风格只是达到这一目的的辅助手段。

合适的方式表达思想,参考勾股定理:”直角三角形的斜边地平方等于两直角边的平方和“,可以用下图和等式a²+b²=c²来表达这一信息

也可以用欧几里得表示法

根据计算机摩尔定律,我们可以存储越来越多的数据,并对其进行越来越多的处理,可是在系统执行了大量计算后,我们又该如何从海量数据中得出大趋势呢?

图形化输出

你如何概述拿破仑1812年在俄罗斯战役中的挫败?很多程序猿会试着打印出几十厘米数据(每天的人员数量、军饷、驻军地点),法国工程师Charles Joseph Minard在1861年用一种不同的方式来描述这个问题:只用一张简单的图来总结该战役。有人评价这可能是有史以来最好的统计学绘图。

本图给出了与地图上的城市、河流等背景相关联的六个变量:驻军地点(经纬度)、军队规模(和带宽成比例)、行军方向、气温以及日期,从中可以看到一支军队的毁灭与一个帝国走向灭亡的起点。

最后来几个书中提到的算法:

随机取样

许多随机取样要求随机样本中没有重复元素,以下伪代码为算法S,这个算法把结构保存在集合S中,如果S的实现正确,并且RandInt产生随机整数,那么这个算法生成随机样本,每个M元子集的概率都是

initialize set S to empty

Size := 

while Size < M do

     T := randInt(,N)

     if T is not in s then

         insert T in S

         Size := Size + 

算法S有很多优点:正确、相当高效、非常简洁,似乎好的不能再改进了。不幸的是Bob Floyd发现,当M=N=100时明显存在一个缺陷。当Size=99时,集合S缺一个整数。算法闭着眼睛乱猜整数,直到偶然碰上正确的那个为止,这平均需要猜100个随机数。这个分析假设随机数发生器是真正随机的。对于某些非随机排列,这个算法甚至不会停止。Floyd开始寻找一个算法,对于S中每个随机数只恰好调用一次RandInt。

initialize set S to empty
for J := N - M + to N do
T := randInt(,J)
if T is not in S then
insert T in S
else
insert J in s

牛顿迭代法计算K维空间两点距离

T := abs(A[] - B[])

Max := T: Sum := T*T

for J :=  to K do

       T  :=  to K do

       if T > Max then Max : = T

       Sum := Sum + T*T

if Sum = 0.0 then return 0.0

Eps = 1.0e-7

Z := Max

loop

      NewZ := 0.5 * (Z + Sum/Z)

      if abs(NewZ - Z) <= Eps*NewZ then break

      Z := NewZ

return NewZ

读书笔记--编程珠玑II的更多相关文章

  1. 《编程珠玑,字字珠玑》读书笔记完结篇——AVL树

    写在最前面的 手贱翻开了<珠玑>的最后几章,所以这一篇更多是关于13.14.15章的内容.这篇文章的主要内容是“AVL树”,即平衡树,比红黑树低一个等次.捣乱真惹不起红黑树,情况很复杂:而 ...

  2. 《Mastering Opencv ...读书笔记系列》车牌识别(II)

    http://blog.csdn.net/jinshengtao/article/details/17954427   <Mastering Opencv ...读书笔记系列>车牌识别(I ...

  3. 《C#高级编程》读书笔记

    <C#高级编程>读书笔记 C#类型的取值范围 名称 CTS类型 说明 范围 sbyte System.SByte 8位有符号的整数 -128~127(−27−27~27−127−1) sh ...

  4. Node.js高级编程读书笔记Outline

    Motivation 世俗一把,看看前端的JavaScript究竟能做什么. 顺便检验一下自己的学习能力. Audience 想看偏后台的Java程序员关于前端JavaScript的认识的职业前端工程 ...

  5. 《Linux/Unix系统编程手册》读书笔记 目录

    <Linux/Unix系统编程手册>读书笔记1  (创建于4月3日,最后更新4月7日) <Linux/Unix系统编程手册>读书笔记2  (创建于4月9日,最后更新4月10日) ...

  6. 《Linux/Unix系统编程手册》读书笔记9(文件属性)

    <Linux/Unix系统编程手册>读书笔记 目录 在Linux里,万物皆文件.所以文件系统在Linux系统占有重要的地位.本文主要介绍的是文件的属性,只是稍微提及一下文件系统,日后如果有 ...

  7. 《Linux/Unix系统编程手册》读书笔记8 (文件I/O缓冲)

    <Linux/Unix系统编程手册>读书笔记 目录 第13章 这章主要将了关于文件I/O的缓冲. 系统I/O调用(即内核)和C语言标准库I/O函数(即stdio函数)在对磁盘进行操作的时候 ...

  8. 《Linux/Unix系统编程手册》读书笔记7 (/proc文件的简介和运用)

    <Linux/Unix系统编程手册>读书笔记 目录 第11章 这章主要讲了关于Linux和UNIX的系统资源的限制. 关于限制都存在一个最小值,这些最小值为<limits.h> ...

  9. 《Linux/Unix系统编程手册》读书笔记6

    <Linux/Unix系统编程手册>读书笔记 目录 第9章 这章主要讲了一堆关于进程的ID.实际用户(组)ID.有效用户(组)ID.保存设置用户(组)ID.文件系统用户(组)ID.和辅助组 ...

随机推荐

  1. of

    “查询序列的一个元素” 1. an element of the query sequence (T) 2. an query sequence element (T) "查询序列或者候选序 ...

  2. 剑指offer系列50--不用加减乘除做加法

    [题目]写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号 * [思路]1 不计进位,直接位运算(异或方式可实现此运算,即1+0 0+1为1,0+0 1+1位0) * 2 与 ...

  3. Maven修改镜像仓库地址

    修改maven根目录下的conf文件夹中的setting.xml文件,如果你修改了默认仓库的存储位置,即.m2文件夹下没有本地仓库,但是有个setting.xml文件,那就修改这个文件就可以. 具体内 ...

  4. 拿nodejs快速搭建简单Oauth认证和restful API server攻略

    拿nodejs快速搭建简单Oauth认证和restful API server攻略:http://blog.csdn.net/zhaoweitco/article/details/21708955 最 ...

  5. Android界面布局基本知识简述

    Android手机操作系统在模拟器中进行相关的编写,可以帮助我们实现各种功能需求.尤其是在界面的操作方面显得更为突出.在这里我们就可以对Android界面布局的相关操作来对这方面的知识进行一个深入的了 ...

  6. ACL权限设置使用

    acl操作 # 查看操作的分区支不支持acldumpe2fs -h /dev/sda2 | grep aclDefault mount options: user xattr acl 代表支持acl如 ...

  7. Builder模式(建造者模式)

    在设计模式中对Builder模式的定义是用于构建复杂对象的一种模式,所构建的对象往往需要多步初始化或赋值才能完成.那么,在实际的开发过程中,我们哪些地方适合用到Builder模式呢?其中使用Build ...

  8. 使用BlockingQueue的生产者消费者模式

    BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题.通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利.使用场景. 首先它是一个队列,而一个队 ...

  9. hdu 5288 OO’s Sequence 枚举+二分

    Problem Description OO has got a array A of size n ,defined a function f(l,r) represent the number o ...

  10. OpenGL 开始学习指南

    近期需要做一个涌潮的预报与仿真模拟,为了使模型更具有真实感,且逼真,使用起来更灵活.感觉还是得从基础的OpenGL学习.鉴于Direct3D技术存在的众多不确定性,且评论不太好的原因,决定用OpenG ...