C++ Primer 前言

开始

万事开头难,开始意味着做出改变,而接下来的任何动作都是延续之前的行为,因为人的强大适应能力而一旦适应了想要再改变就会引起大脑的强烈反应。这有利于人适应环境,也会导致人的思维固化,所以偶尔的外来刺激会导致大脑获得新的认知。这是创造的必要条件。

接下来的几个月时间,我将会把主要精力放在为 《C++ Primer 5th》 这本书的笔记上。C++ 在我多年以来断断续续学了好几遍,之前用《C++ 编程思想》也学过,但那本书过于陈旧了,用《C++ Primer 4th》也学过一段时间,由于书本过于沉溺细节,导致最终没法坚持下来。第五版我去年已经看过一遍了,对于里边的内容也有一个大概的印象,我的一个感受就是第五版的内容安排变好了,而且很多过于细节化的东西被隐藏了。这是非常好的,对于初学者来说更重要的是看到语言的全貌而不是抠细节,我们得知道语言的边界从而为要解决的问题提供良好定义的方案。

我之前得到一些启发,说学习 C 不应该一开始就将 printf 的各种参数细节,这太过于机械记忆。只要用到的时候去查阅对应的文档即可。学太多这种东西,反而妨碍了了解语言的能力和限制,以及怎样设计具有良好结构的程序。所以,在所有这些笔记中如果是过于细节化的东西,我会省略掉,当需要时阅读原文即可。我希望笔记达到的功能是提醒所有想用好 C++ 语言的程序员这门语言的核心是什么。细枝末节将会被忽略。

阅读全文 “C++ Primer 前言”

自底向上设计

如今我们陷入了一个巨大的误区,认为学习编程就是学习各种时髦的工具,这些工具有着大量的特性以及难以记忆的细节,导致我们忘记了计算的本质。语言的特性在几年内不断变化,IDE 或命令行工具的参数在不断调整,今天学习的细节到了明年就得换成新的语法。各种号称解决了重大的问题的编程语言层出不穷,到目前为止编程语言有上百种之多,真的学习的完吗?

真正应该学习的是背后的原理,王垠的解谜计算机科学写的很不错。我们不必拘泥于各种语言的细节,我们应该把握核心,理解什么是计算。

“从最广义来讲,计算就是“机械化的信息处理”。所谓机械化,你可以用手指算,可以用算盘,可以用计算器,或者计算机。这些机器里面可以有代码,也可以没有代码,全是电子线路,甚至可以是生物活动或者化学反应。不同的机器也可以有不同的计算功能,不同的速度和性能”

计算的载体不限于现在我们所看到的计算机,任何按照有限的规则进行有限的变换得到结果的东西都称为计算机。理解了这些转而去推断编程语言需要哪些要素就显得顺其自然,甚至可以分辨很多编程语言中有的特性是有害的。我们就可以对语言的特性进行选择,只有那些经过审慎选择的特性才是值得使用的。

既然要避免学习编程语言和各种工具的说明书,我们应该学什么呢?我的答案是学习在未来 20 年都会不消亡的东西,而要预测未来 20 年就看过去 20 年哪些东西还一直存在。 C/C++ 构成了整个编程世界的基石,Linux/GNU 构成了整个开源世界的基石,TCP/IP 则构成了网络的基石,所有这一切存在于过去的 20 年,并且毫无被动摇的迹象,这是我们应该追求的东西。

阅读全文 “自底向上设计”