我开发了一个基于 Beancount 的账本托管服务 HostedBeans,欢迎大家来了解纯文本复式记账并试用我的服务。
标签 #计算机科学

计算机方面经典书籍推荐

只推荐我看过的书,一共 13 本。

越基础,越通用的书顺序越靠前。

疯狂的程序员

小说,非常不错的小说。讲了主角在学校,公司,创业的故事,很真实,也很励志。

(Code) 编码——隐匿在计算机软硬件背后的语言

这是一本科普书,向非计算机行业的人解释计算机是如何工作的。

自底向上地描述了一台计算机的构造过程,从最基本的电路开始,逐步构造起一台真正可以使用的计算机。

黑客与画家

散文集,很多人推荐这本书,输出了有关设计,创业,财富,编程的价值观。

(CSAPP) 深入理解计算机系统

这本书讲述了在汇编的角度,C 语言是如何工作的,如何与操作系统交互的。

读完这本书,对计算机的大致结构,程序的执行过程会有更深入的了解。

计算机网络——自顶向下方法

虽然不如『TCP/IP 详解』那么权威,但是更通俗易懂一些,自顶向下来描述计算机网络的结构。

JavaScript 语言精粹

因为这本书只介绍 JavaScript 的精华部分,因此厚度是『JavaScript 权威指南』的六分之一。

编程珠玑

算法,告诉你如何写出性能更好,逻辑更清晰的代码,如何对算法进行优化,如何认识算法的复杂度。

重构

重构,将复杂的代码重构为更易读,更具可维护性的代码。

这本书还会为每个重构方法起一个名字,起到了一个『标准化』的作用。

(SICP) 计算机程序的构造和解释

通过 Scheme Lisp 语言来介绍编程语言所要实现的,抽象的本质。

C 和指针

深入讨论了 C 语言的指针和内存管理。

C++ 语言的设计和演化

从历史的角度介绍 C++ 中每一个特征的由来,和它的必要性。

(CPPPP6E) C++ Primer Plus

算是 C++ 的一本工具书,对 C++ 的几乎所有特征都有介绍,第六版中还有对 C++11 的介绍。

程序员的自我修养——链接装载与库

介绍在具体的操作系统实现中,程序如何被编译,装载,链接,以及标准库的实现。

世界上最好的编程语言

谈到这个话题,一定会有两种人跳出来。

一种人说,PHP 是世界上最好的编程语言;另一种人说,编程语言都大同小异,掌握了思想,什么都简单了。

首先我认为所有切实存在,功能重叠的事物,都是可以比较优劣的,有时不说出真相,只是真相太残酷。『优秀』并非是主观的,而是客观存在的,世界上存在着被广泛认同的『优秀』。否则,作家,设计师,设计编程语言的科学家,应该以什么为目标来工作呢?

那么什么又是编程的思想呢?是循环,回调,面向对象这些么?但似乎并非每个编程语言都有这些元素。我在知乎『优秀的程序员应该掌握多少门编程语言』中列举了几种我了解的,各自具有代表性的编程语言:

  • C, 使用原始的内存管理的系统编程
  • Java, 工业级的面向对象的,静态类型的虚拟机语言
  • Python, 脚本语言,动态类型的虚拟机语言
  • Javascript, 基于事件回调的函数式编程
  • HTML/CSS, 声明式的语言
  • Golang, 并发编程

可以看到,它们风格迥异,使用的领域似乎完全没有重叠。

非要找共性的话,大概是它们都具有『抽象』的能力,描述『算法』的能力,这也是有些人口中的『思想』,但我不认同。

抽象是为了找到解决问题的方法,而编程语言是为了将解决问题的过程(算法)表达出来。

知道如何解决问题,不代表就能够用编程语言表达出来;掌握编程语言,也不代表知道如何解决问题。

我们学习一门编程语言本身的时间并不多,更多的时间在学习它的函数库,以及特定编程环境下的限制。

例如学习 C 语言,我们需要知道计算机如何管理内存,如何实现函数调用,还要学习如何通过标准库进行输入输出,而 C 语言本身的语法,完全可以用一个小时描述清楚。

所以,我们抛开这一切,去寻找世界上最好的编程语言呢。但结果是不存在,因为现在流行的编程语言设计者目光都太短浅。

没错,优秀的不一定是用的人最多的,不一定应用得最广泛,所以编程语言的设计者需要折中,拿出不那么优秀的设计作为最终方案。

比如 PHP 之所以流行,是因为支持 PHP 的虚拟主机最便宜。

比如 C 之所以流行,只是因为有太多项目一开始是用 C 写的。

比如 Python 之所以流行,只是因为库足够多。

比如 Javascript 之所以流行,因为在浏览器里这是唯一选择。

他们都不是因为语言本身被设计得有多么优秀而流行的。

我认为世界上最好的编程语言需要有这样的特征:

  • 核心足够小
  • 可以扩展语法
  • 围绕一种数据结构展开
  • 优秀的抽象能力
  • 可以被编译成本地代码

世界上最好的编程语言应当是全能的,否则如何和其他编程语言做比较呢?要做到这一点,就要保证这个语言的核心部分是最小的,不偏向于任何一个领域,也减少学习成本。

这方面的正面例子有 Lisp, Lisp 中的一切都是列表,核心部分仅包括不到十个基本运算符。从这个角度来看,你根本不知道 Lisp 是被设计用于什么领域的——这是世界上最好的编程语言所必须的要素。

但是 Lisp 没有火起来,因为有个笑话说的是一个 Lisp 程序末尾要有整整一页的括号。

所以世界上最好的编程语言需要能够灵活地扩展语法,这个概念通常被称为元编程,例如 Ruby 就号称支持元编程,虽然我没有体验过。

除了扩展语法之外,最好还要能够改变程序在编译时的行为,这会加强元编程的能力,也会对提升性能有一定帮助。

比如 PHP 和 Python 都支持用 C 编写扩展,如果这种语言支持用自己本身来写扩展,并且能够干预编译器的行为,那么这种改造会让它适合几乎所有领域的编程。虽然干预编译器的行为是很危险的行为,只有少数人会编写这种扩展,但是这总要比设计一门新的领域特定的语言要容易。

可以扩展语法,这是保证世界上最好的编程语言能够快速适应各种特定领域编程的重要条件。

世界上最好的编程语言应该内置一种数据结构,能够方便地在程序内,甚至包括程序外进行数据交换,让整个语言围绕着这种核心的数据结构展开,具有一种『一致性』的美感。

这方面正面的例子是 Lisp 和 Javascript, 但 Javascript 做得还不够好,类型系统中有很多陷阱。

世界上最好的编程语言还应该有优秀的抽象能力,比如 C 的抽象能力就不够,组织大型项目会非常麻烦。Lisp 的抽象手段又太单一,Java 和 C++ 的特征又过于复杂。

『可以被编译成本地代码』这才是最具有挑战性的一个特征,前面我提了很多变态的需求,它们都需要在可以被编译成本地代码的条件下实现。可以被编译成本地代码,表示这种语言不需要虚拟机,可以自行提供各种功能,性能上也有更多的优化空间。

在发表这篇日志之前,又看了一遍王垠写的『如何掌握程序语言』,顿时觉得自己的日志似乎没必要发了,但是既然写了,还是发出来好了。

闲聊 CS

一直我都觉得(国内)大学的计算机专业太扯淡了。

细算下来,也就“计算机科学与技术”和“软件工程”算得上是计算机专业,其他的要么算物理(通讯方面的), 要么算数学(算法方面的), 至于“网络工程”和“信息安全”之类的,似乎不太常见,我就不讨论了。

软件工程,按学科的定义来讲,是以提高可维护性为目的,研究团队协作,控制和验收进度的,偏管理方面,但是按我的了解,在国内很多大学,软件工程和计算机科学与技术没多大分别。

计算机科学与技术,科学,那是一般人能学的么,你学了又有什么用,这是世界是那些顶尖的科学家才研究得起的东西。

再说技术,技术还需要学么,难道不是随便找本书来翻一翻就会了的么。

好吧,前面我开个玩笑。

偶尔睡不着觉我会用爪机在网易公开课看看视频,应该说国内和和国外的视频给我感觉差距是非常大的。

首先一点就是国内的一些名校似乎并不关心网络公开课,没有什么比较“硬”的科目,课程也仅仅是录像,感觉就是没有精心准备过。

课堂基本就是在按着书来念概念,没有多少吸引力。

而来自国外一些名校的视频则正经地多,课程似乎是专为网络公开课调整过,有配套的课程网站来下载资料,对于 CS 课程还有一堆内部编写的小工具等等。

国外的课程很少去讲概念性的东西,整堂课基本就是列一列要点,开几个玩笑,更多的内容大概会放在课堂之下来做,至少 CS 的课程是这样的,当然,这对网络公开课确实是不大友好,毕竟没法参与到课后作业中。

再看国内一些个人性质的视频课程,当然我指计算机方面。

通病在于讲者希望通过一套课程将所有的知识讲出来,听者也希望通过一套课程来学到所有的东西。

虽然我(作为讲者)也曾犯过这样的错误,但我还是觉得,这样出身的程序员,不会有什么前途。

有人说软件开发是青春饭,年级大了就干不动了,原因就在于现在这个行业发展得太快,新东西太多,停止了学习新事物,马上就会淘汰。

不能自己来学习,自己零碎地收集知识,而是希望靠别人一套系统的课程,很快就会被淘汰的。

当然这对入门者来说也是好事,因为从某种程度上来说,这使得一个入门者和大牛们是站在了同一个起跑线上。

目前来讲我最擅长的两门技术,C++ 和 PHP, 都不是系统学习的,两者都是一开始被国产书坑了很久,然后零碎地逛论坛,Google, 查文档,一点点积累起来的。

我买 CPPPP6E 那是很久之后的事情了,我只是把它当作工具书来查阅 …

我觉得大学的课程应该教授纯粹的计算机科学,而不是技术。

所谓计算机科学就是为计算机技术提供理论基础的那一部分知识,比如我略有涉猎的包括密码学,网络,操作系统,数据结构等等。

应用层的技术日新月异,但底层的这些知识是不会变的,我觉得这才是大学真正应该教授的知识,也只有大学才有时间去读这些纯理论上的东西。

就好比万有引力定律,你知道或不知道都不影响苹果往地上掉,但你眼里的苹果,和幼儿园小朋友眼里的苹果,绝对是不一样的。

计算机科学的一些知识也是如此,你不知道也不影响你掌握技术,但是如果你知道一些的话,对技术的看法就要高一个层次,更容易找到它们的内在联系。

精子生于 1995 年,英文 ID jysperm.

订阅推送

通过 Telegram Channel 订阅我的博客日志、产品和项目的动态:

王子亭的博客 @ Telegram


通过邮件订阅订阅我的博客日志、产品和项目的动态(历史邮件):

该博客使用基于  Hexo  的  simpleblock  主题。博客内容使用  CC BY-NC-ND  授权发布。最后生成于 2024-04-08.