安利一本程序设计书

Category: 笔记

前言

大一结束,这本书已经成为了我学习道路上不可或缺的一环了,满怀感恩,决定推荐给大家

动机

我不是一个只会无脑推销的人

但是

这波啊,这波是第一次写博客来推销书籍 —— Introduction to Java programming

本来不想带货的,直到我把这本书大致看完了,也辅以了量不少的练习。。。不行了,真的是太香了

希望能对初学编程的或者是即将学习 Java,或者想打扎实程序设计水平的同学有所帮助。

简介

这本书的作者是梁勇(Y. Daniel Liang),没记错的话,是个美籍华人。

书本的英文名叫做 Introduction to Java programming,中文名叫做《Java 语言程序设计》

简介我抄一下狗东的

本书是 Java 语言的经典教材,中文版分为基础篇和进阶篇,主要介绍程序设计基础、面向对象程序设计、GUI 程序设计、数据结构和算法、高级 Java 程序设计等内容。本书通过示例讲解问题求解技巧,提供大量的程序清单,每章配有丰富的复习题和编程练习题,帮助读者掌握编程技术,并学会应用所学技术解决实际开发中遇到的问题。基础篇主要介绍基本程序设计、语法结构、面向对象程序设计、继承和多态、异常处理和文本 I/O、抽象类和接口等内容。本书可作为高等院校计算机相关专业程序设计课程的教材,也可作为 Java 语言及编程爱好者的参考资料。

个人感受

总之就是很神

截至 2021 年 8 月,该书已经出到了 12 版。但我阅读的是 11 版。

虽然相对 11 版来说,新版内容有所更新(比如 Java8 升级到了 Java11),但是不影响书的整体风格

作者是将我们当成一个百分百的新手来教的

首先你是刚入门计算机类专业是吧?

那么作者开头就开了一章,专门概述了一下计算机、程序和 Java,顺便还指导了一下 Java 的运行环境的安装,让你对计算机和编程语言有一个粗略的感受。

接着给你讲了 Elementary Programming,即是编程中的基本部分。作者从一个简单的程序开始,给你讲述了标识符、变量、常量、基本类型、命令行输入输出之类的知识,最后以一个算钱的软件实例来结束这个 chapter

再接着就是选择与循环这些关键知识了,同理,作者不会一口气给你讲述所有相关的知识,而是一直辅以经典有趣的实例,并且混入了 String 之类的知识。

接着告诉你 Java 的方法是什么?Java 的一维的数组和高维数组是什么有什么区别?能做点什么

此时你已经有了一定量的程序设计的基础知识了。于是承接方法和数组和字符串和程序设计基础

作者就开始了面向对象的讲述。从 OOP 是什么,Java 里头的 OO 相关的关键字和语法,作者都一一道来。

好了,按照国际惯例——一提及 OO 就是封装继承多态。你以为这个讲完了就会马上讲继承和多态的

但是作者专门插了一章,告诉你怎么使用 OO 进行思考的,接着开始手把手教你调 Java 的 API 进行实操。让你亲身感受一波再开始讲继承多态抽象类接口等概念

OO 如此抽象的概念,是不是要实操一下才能更好地掌握它呢?

没错,再插入了一章讲控制流,错误处理和文本 IO。由于你有 OO 的知识背景了,所以你很好地了解了 Java 的文本 IO 操作是怎么样的

接着作者开始教你使用极其先进的 JavaFX 来做桌面 GUI 应用,国内还在用 swing awt 的书籍出来挨打,让你深入了解 OO 能做些啥。前面的文本 IO 也派上了用场。

讲完 GUI 程序开发之后,作者回顾了一下文本 IO,接着讲二进制 IO,环环相扣

好了,准备踏入数据结构和基础算法部分的学习了。

先给你看看啥是递归吧?递归和迭代有什么区别呢?

接着就是泛型的学习了,学习的过程中我们只知道类型名字可以用参数来表示。那到底有什么实际用途呢?

好,继续讲 List,Queue,Stack,Set,Map。你惊讶发现原来泛型可以用来构造一个通用的数据结构类啊。

作者把这些数据结构的基本特性和 Java 自带的 API 的基本使用方法告诉你了。此时你对这些数据结构的特性有了基础的印象,也懂了怎么使用它们了。

正当你好奇这些类的实现细节的时候,作者突然停止深入。

转而开始探索如何设计一个高效算法,告诉了我们大 O 是啥,怎么算复杂度。教我们怎么把一个已知的算法用程序语言来表述。接着讲了分治和回溯(基于递归,环环相扣了属于是)

然后 n 大排序,基本操作。告诉我们算法是怎么用到最常见的排序操作里头的。

然后画风一转,转入你之前感过兴趣的数据结构的实现细节。手把手教你实现简单的列表链表数据结构。

你会 OO 和链表还有基本算法了,作者就会接着告诉你啥是 BST 二叉树,细节实现要注意什么,怎么实现 AVL 树等数据结构。

接着插入 Hash 让你换个方向学习一下,顺带也把 Set 和 Map 数据结构手把手带你实现了。数组 X 链表实现,多甜的一对 CP

理论上你对前面的知识熟悉了。那么继续深入,讨论图,有向图和无向图,深搜和广搜两种遍历方法,配合 Nine tails Problem 来收尾。

最后就是聚合流 Stream 了,告诉你如何用函数式编程思维来对数据结构进行处理。

然后你满意地合上了这本书

其实后面还有在线的高级篇:网络编程、多线程、数据库增删改查操作、2-4 树 B+树红黑树、JUnit 测试、Servlets、国际化应有尽有

插播,附在线资源:点此

这本书可谓是环环相扣,处处有经过作者深思熟虑的铺垫

顺着这本书一路学下去,你会发现你把 Java 学了,把面向对象给学了,把 GUI 程序设计给学了,也把数据结构和基础算法给学了。数据库也会操作了,测试也会了,多线程和网络编程也入门了

此时的你,已经可以灵活使用 Java 进行一定的软件开发。

不仅如此,你还能意识到成体系的知识有多么重要;意识到一门课程与另一门课程是有紧密联系的,是环环相扣的;意识到理论和实操结合的重要性。

妙哉!

不得不说,这本书还做了相当可观的知识屏蔽

也就是说,你不懂的知识,除非一定是要讲了才能继续学习下去,否则作者在就不会提前解释给你听,而是先让你留个直观印象,知识会留在后面合适的章节里头再讲。

比如说前面我们只会简单地进行字符串的新建和简单表示,但是 API 之类的内容暂时用不到,便巧妙地放在了后面的 Object-oriented Thinking 那一章来进行讲解。而讲多态的时候,Dynamic Binding 这种东西,不直接讲就是不行的,作者就会直接先把知识喂给你吃了,接着再辅以大量的例子来让你巩固知识。

这很巧妙!回想起当年看这本书,每次见到一些新名词就会去到处查的我,我现在只想说:跟着作者走下去不就好了吗?

而知识屏蔽的反例就是

“这是 xxx,这里用到了 xxx,会在后面第 xxx 页第 x 章提及”——某高数书

老手没问题,但是初学者看到这种话,立马就翻过去看了,一般人会看得一知半解然后开始懵逼更加混乱了

这本书的习题非常大非常接地气,题目内容大多是偏向实际的,几乎每个题目都要上机写程序。并且有的题目难度还不低。菜鸟这样练习一圈下来,不会飞都会走了。

有一说一,某些书还有巨量的概念向的选择填空问答题呢(

这本书像讲故事一样讲解知识,只要有点复杂的内容,在大多数情况下,作者都用故事来讲解它

也许这就是这本书这么厚的原因

如何购买

国内各大书店和网购平台都有得买,推荐买英文版

我在简介那里顺便提到了英文原版,那是不是要安利大家英文版呢?

先说结论:只要是四级过了的水平,都推荐购买

对于此书而言

正因为作者是美籍华人,所以写的英文非常通俗详尽偏中式英语的感觉,读起来就像在读高中英语一样,比原著小说不知简单了多少

而对于不限于本书的其他技术书籍的翻译版

即使译者在该领域非常牛逼,也很难做到百分百把原文准确翻译,会存在部分的信息损失与表达失真

读原版的时候,信息流向:作者 => 读者

读译版的时候,信息流向:作者 => 译者 => 读者

隔了层媒介,并且如果译者不能很好地对原文进行翻译的话

本就抽象的文字

经过译者操作一波,到了读者这里

抽象层次又增加了.jpg

不仅更抽象难懂,还会出现一些低级错误

举个栗子,《Linux 系统编程》这本书里头有这么一句话

如果你不习惯于 UNIX 文本编辑器——Emacs 和 vim(后者成为最广泛使用的编辑器,而且评价很高),那么至少应该熟悉一个。

原文如下

If you are not comfortable with a Unix text editor — Emacs and vim being the most common and highly regarded—start playing with one.

正确的是:两者都是广泛使用且评价高的编辑器

Emacs 用户震怒

再吐槽一下其他的一些词语,举几个栗子 —— 鲁棒性、缺省、套接字、句柄(

所以,如果英语底子还行的话,可以考虑英文影印版,现在机工也在售,大概比中文版贵了几十来块吧。

如何阅读

难道你们都不看书的前言导读的吗?(仅限优秀教材)作者已经把他想说的话说在前了。。。

我推荐吧,全新入门的萌新,可以直接从头读到尾,没有什么劝退感的这本书。

部分会了的话,直接挑那不会的那部分相关的章节看。只不过一体感没有那么强罢了。

你要是真问我,我会说这本书前言给的路线图很可以。

最后

再次感谢这本书,感谢梁勇老师,您的书让我受益匪浅!