写给大一时的自己——推荐自己的三本书籍之第一本:编码-隐匿在计算机世界中的奥秘

本贴最后更新于 2936 天前,其中的信息可能已经时过境迁

写给大一时的自己——推荐自己的三本书籍之第一本:编码-隐匿在计算机世界中的奥秘

前言:

  作为一名刚步入大学的小鲜肉(哈哈哈哈,其实是一名一无所知的编程小白,现在战斗力已成为 5.5 的渣渣),在虚心求教下得到的结论是:C 语言要好好学,它就像编程中的基础,武侠中的内力,忍者中的查克拉。

  得知隔壁老王卓越班极力推荐 :《C 语言程序设计现代方法》,就入手了一本。这本书比起谭教授那本教学而言,最大的优点是:它不仅仅教你语法,初期会教你优异编码风格,中期教你如何程序的模块化,后期教你如何保养腰间盘和颈椎 (重点是前中期,看到模仿谭教授那本的 C 语言书籍的代码编写,简直是 - 不忍直视,然而真正的勇士应该敢于直面惨淡的人生,敢于正视自己 N 年前未加注释的代码)。

  不过今天推荐给大一时的自己并不是它。读完并按步就序的将课后习题和 demo 做了一边后,发现自己仍是一脸懵逼。一直被隔绝在大门外。直至遇到了这几本书,才找到通向编程的道路。如果您和我一样拥有当时的困惑,或者是刚刚入学喜爱编程却毫无头绪,那么 —— 拿起电话订购把,三本加起来只要 199,只要 199,只要 199;重要的事情说三遍。

编码-隐匿在计算机世界中的奥秘

             310WZuKyEUL.SX334_BO1,204,203,200-min.jpg

  之所以把它作为 The First,是在于它几乎不需要大学的知识体系背景,而作者的非凡功力体现在把一个晦涩难懂的知识体系写的如同童话故事般一样通俗易懂,循序渐进,十二分有趣。所以如果可以回到大一,不,如果可以回到初中时代,那么我一定会告诉自己:孩子,我看你骨骼惊奇,天资聪慧,哥哥这里有一本 《编码 - 隐匿在计算机世界中的奥秘》传授给你。
  这本书并未教给我们 How to code ! 而是解释 code(编码)是如何诞生的。

  黑客帝国(The Matrix)中的主角在第一部末中枪后死而复生,终于看到世界的本质 : 终有一天我手中的编译器将成为我灵魂的一部分,这世界在我的眼中将被代码重构,我将看到山川无尽银河生灵都汇成二进制的数字河流,过往英雄都在我脑海眼前一一浮现,而我听到无数码农跪倒在我的程序面前呼喊。 他们叫我代码之神。 —— 摘自 李昭鸿的知乎:怎么写出一本程序员风格的修真小说?

  这正如我们所知:计算机的世界其实是 0 和 1(我和你)的二人世界 (在一起,永远不分离)。而作者的高名之处并未直接挑明:计算机看到的一切内容是二进制流,对于一名小白而言,或许暂时无法领悟二进制与计算机之间的关系。

信息的表现和传递

表现形式

  而书中的开篇是:亲密挚友(Best Friends),引入童年的回忆——夜幕降临后用手电筒作为儿时密友交流的信号,或许我们两人之间约定这样的一个规则:闪一次(开关一次)表示今晚父母会外出,等下便过去找你。当然,另一方也要闪烁手电筒表明自己已经收到信息。这便是儿时我们之间一种信息的交流和表示。 接着作者举了摩尔斯码(Morse Code)和盲文(Braille)的例子进一步表明信息是如何被展现的。
       morsecode.png


       braille.png

传递方式

  人们去八卦,去吹水,去演讲,去写博客都是在将自己的想法(信息)展现出来,然后被人们接收。然而对于远距离之间的人们如何传递信息呢?(飞鸽传书,烽火戏诸侯,还有儿时的手电筒。。。),这时我们面临的一个问题是:信息如何传递。(手电筒似乎不太靠谱)

  在这里稍微回想一下高中的物理知识:电磁效应。(想一想我们高中所学的左手定则与右手定责, 左右互搏之术),利用一个电池,导线,被导线缠绕的铁棒,开关。
             1476450214926

  • 开关闭 → 闭合回路产生电流 → 被线圈缠绕的铁棒产生极性 → 铁棒吸动横杠(被弹簧绑定) → 发出嗒的声音
  • 开关断 → 闭合回路失去电流 → 被线圈缠绕的铁棒失去极性 → 弹簧恢复横杠原位
                       1476450296810

而这个原型就是在抗日神剧中反复出现的 —— 电报机。而我们可以根据关开的次数、时间间隔等作为信息的约定来传递信息。

信息与数字

信息已被人们用具体事物(摩尔斯码、盲文)展现出来,并发明了电报机进行远距离传递。

在这里引入两个自己之前从未想过的问题:

  1. 数字 0、1、2、3、4、 5、 6、 7、 8、 9 到底代表了什么?
  2. 小时熟背的加法口诀表又是什么呢?

数字的起源

  
  在随着动物的不断进化,高级动物逐渐拥有了记忆,想象,认知的能力,它们可以感到周围的事物充满着差异性:一头狼和一群狼的数量,一只蚂蚁和一头大象的尺寸,月亮和树木的形状,但这些差异本身有存在着相似, 一头狼和一群狼,它们本身都是唯一的。而为了去描述归纳这些共性,数字的概念便诞生了。

  而对于数字真正的诞生,历史学家大多认为是人们为了记录事物的个数,一个人拥有三个苹果,或许他会这样表示:/ / /。那拥有一百个苹果的人。。。于是人们发生了一套数字系统:

  • 罗马数字 : 用 V 代表五个斜杠(V 像一只手,而手是有五个斜杠的), X 代表十个斜杠 (X 则是由两个 V 组成)。
  • 阿拉伯数字: 0、1、 2 ...... (罗马数字的乘法运算的复杂性限制了自身,而阿拉伯数字中最毫不起眼默默无名的数字 0 却大大简化了乘除法运算。)

  
  所以,单独的数字 3 本身是没有任何意义的。可以用它来代表三个苹果,而三个苹果也可以用数字 11 来表示,这只是人们的一种约定,一种规则。而加法口诀表便是对这套规则的具体表现。

            1476450582854


**这里引出的第二个问题是:为什么我们要使用十进制去进行计算。**

  那是因为我们人类是十根手指。倘若在那山的那边海的那边住着一群蓝精灵(The Smurf),它们数数字的时候就会变成这样子。

  所以,是十进制还是八进制,和我们自身的发展有很大联系。数字的计算和规则页无所谓是使用十进制还是使用八进制,它们都可以去描述同样的东西。而计算机用二进制来作为自身数字系统也是因为自身电路拥有高电平、低电平两个属性。(当然也有存在三种状态的情况,不过这里不做说明和解释)

逻辑与门

  我们已经将二进制和信息二者连接在一起,可以用 0 1 码来表达存储信息和内容,像之前相机中的胶片。

                                 1476450896746  [日常生活中常见的通用产品代码]




  可惜,距离 Code(编程)却少了一步,也是最为至关重要的一步 。

  关于真理结果的探寻,不得不提到那位在高中课本中因为提出重量大的物品下落速度更快而被我们多次鄙视的大神 —— 亚里士多德,提出用逻辑分析的方法来推出真理,其逻辑学基础是三段论:

所有男人都必有一死
苏格拉底是男人
苏格拉底必有一死

  如果将数的概念抽离出来 :A+B=C ,操作数不再是传统意义中的数字,而是一种拥有共同特性的群体,也就是我们所说的集合(Set),那么

引入:一天当我们走进宠物店,告诉店员:我想买一只三条腿可以用来当服务器的绝育的黄色猫,无所谓公母。
我们可以这样表示 : B 代表公猫,G 代表母猫,T 代表三条腿,F 代表四条腿, S 代表可以充当服务器, H 代表可以用来捉耗子。 ( + :表示并集; × 表示交集)
可以得到这样的表达式 : (B + G) × T × S ; 这时候店员拿出 Tom 出来带入到我们的表达式中

                tomcat.png     Yes,就是它了。

  

  我们已经在数学公式和逻辑描述之间建立了一座桥,真正用数学公式来描述逻辑的人对于一名 Coder 绝对耳熟能详:就是在编程世界中处处可见的 boolean 类型的纪念者 —— 乔治布尔 (George Boole)。然而 Boole 在 1847 年就提出来如何用数学方法描述大脑如何工作,七年后,又发表了更辉宏的著作《思维规律》,而电路在 19 世纪已被发明,可惜 Boole 的观点在那个时代并未引起人们重视。

  用电路来描述逻辑时间已经到了 20 世纪 30 年代,而发现布尔表达式伟大之处的人也是信息界的始祖:克洛德-香农。(那名 20 多岁就拿到 MIT 博士学位的天才),年仅 22 岁的香农(比我居然只大一岁,人比人,气屎人)便发表了《继电器和开关电路的符号分析》——可以用布尔表达式去设计开关电路,甚至可以用来简化公式再得到简化的电路。

           ClaudeShannon_MFO3807.jpg

  

与门

1476451639651

当只有两个开关同时闭合时(1 与 1) 灯泡才亮(得到 1)。如果我们用继电器组装一个与门电路:

1476451828844

或门

1476451714570

只要有一个开关闭合,灯泡就会亮。如果我们用继电器组成一个或门电路

1476451873281

以及用继电器组装一个非门电路

1476451912062

 这是我们可以用这三种最基础的门电路为我们购买猫设计一套电路系统,当符合条件时,闭合一个开关,反之断开开关,如果最后灯泡亮起,则表明就是我们要的那只猫。
 

最后

我们已经可以用电路设计一套单一的选猫的系统,但是这套系统有如下几个缺点:

  1. 开关的闭合与断开是人来控制的 —— 非自动化。
  2. 系统无法实现多样化,如果是选购大餐,那么又要重新设计一套电路系统吗?
  3. 数据无法长时间存在。

最后一个问题:又该如何设计一套系统,能够自动执行,而且可以在该系统之上支持任意编程,而且数据可以被保存呢?

  接下来的内容便不在这里过多介绍了,作者讲了如何用一个个门电路组成二进制加法器、触发器、存储器(一个简易的 CPU 模型已诞生)。那么又该如何让其自动操作呢?它和我们现在所说的芯片、微处理器而言又有什么联系呢?我们所说的操作系统又是什么?为什么那这一堆物理原件居然可以显示如此纷飞的色彩图像,可以体验高清无码的大片,可以享受 3D 游戏的特效,甚至即将到来划时代产品 VR 虚拟眼镜。 想知道答案吗,那就 —— 快快拿起电话订购把。

  

结尾:

通览全书,发现国内没有任何一本教材比起更易懂。想想刚入学时上的某导论,一大堆新奇名词,一名专业教授滔滔不绝在讲台上讲半天,可效果微乎其微,在这里并没有讽刺的意思(如果我是讲师,发现自己的学生在睡觉,心里肯定会有波动——让我们荡起双桨,小船儿在水面上波浪 ~)。这本书虽然无法作为导论搬到课上,但绝对是作为了解编程和入门级别读物的不二之选。
PS: 欢迎随时交流,接受任何批评和提议,蟹蟹大家的建议和指正 ^ ^
  

  • 程序员

    程序员是从事程序开发、程序维护的专业人员。

    574 引用 • 3533 回帖
  • 书籍

    宋真宗赵恒曾经说过:“书中自有黄金屋,书中自有颜如玉。”

    78 引用 • 391 回帖
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    171 引用 • 512 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • tianxin
    作者

    大一的时候是只有 C 语言, 主要科目还是在高数 和 大物这些。 html ps 是属于选修课里的。^ ^

  • 其他回帖
  • lidonghao

    其他两本书呢?

    1 回复
  • tianxin
    作者

    另外两本书是:深入理解操作系统 和 程序员的自我修养。这两本书相对来说涉及的知识面比较多一点,还在总结中。

  • o

    你们大一就学这些底层语言和知识?...

    我们大一只有 html 和 ps。。。

    1 回复
  • 查看全部回帖