不记得具体从什么时候开始(反正很多年前的事了)的,不少人都陆续批评过谭浩强的《C语言程序设计》,各方面都有扒过。例如,与实践脱节,很多例子在不同编译器上运行是错误的,代码风格糟糕等等方面。这里首先给出本人对《C语言程序设计》的看法:

在国产C语言相关的教材中,《C语言程序设计》应该算是少有的、还算不错的教材

有些人就会想:你是不是收钱了?给《C语言程序设计》打广告吗?错!《C语言程序设计》出版了这么多年,还用着我这个无名之辈去宣传吗?咱又不是比尔盖茨或求伯君!我只是想站在一名图书作者的角度去评价它。当然,我觉得有一点点资格评价它的原因,并不仅仅是因为我写过书,也略懂写书,更是因为《C语言程序设计》曾经是我的大学教材,因为咱不对自己未精读过的书做评价。

与实践脱节?这个批评是错误的吗?严格来讲并不算,但是《C语言程序设计》本身就是一本学校教材,它的定位就是初学者与理论,用与实践相关程度来评价是否有欠妥当?会这样评价的人可以说根本没有用心去看这本书。想要实践方面的书?图书馆里不是有大把吗?现在花点钱可以买到很多书,英文水平不错也能直接看国外原版,从网络下载电子书甚至连都省了。为什么同一个班级毕业的学生,有些人的编程能力差得离谱,而另外少数人却已经达到专业编程员水平?真正的原因不在教材,而在人本身!

有些例程在不同编译器上会出现不同结果?这个批评是错误的吗?严格来讲也并不算,但还是那句话,《C语言程序设计》主要是讲理论的,它只是传达一种学习与思考方法,这才是大学教材应该做的事,而《C语言程序设计》在这方面做得很好。如果在其它编译器上的运行结果不尽相同,你能分析出原因吗?我可以负责地说:认真学过《C语言程序设计》的读者肯定做得到

代码风格也被人批评得体无完肤。举个例子,《C语言程序设计》中很多例程会直接使用多个“常数”(也称为“魔数”),有人批评应该使用#define将它们定义为宏,这样可读性更强。这个说法错了吗?严格来讲也不算!但是如果每写一个仅有几行的代码就使用#define定义为宏,我身为一个作者就坚决不赞同这么做,因为代码少时使用常数没什么问题,不然就会显得冗余(写书灌水),关键要理解代码说明什么

在进行图书撰写时,为了方便读者理解某个知识点,作者会适当编写一些配套代码进行说明,你却关注这段代码是不是用#define或函数,这就不是一个真正用心看书的人该做的正事。相似地,有些人批评《C语言程序设计》中很多例子都是main函数一路写到底,还是那句话:关键要理解代码说明什么。几十行的代码还要弄个函数调用,费不费劲呐?说不定老谭到时采用了函数,又会有一波人说:这么短的代码都用函数,明显是灌水!

我在《显示器件应用分析精粹》中也有一些代码(是C51,不是标准C,但两者相通),但为了使代码更紧凑(不想凑篇幅),比较短的代码也会直接写常数,你觉得这种风格不好?某一段代码如下

图片

我也可以尝试批判一下自己写的代码:delay_us与delay_ms函数竟然写成一行,老龙你是不是吃SHI了?翻阅古今中外的编程书,这样写代码的只有你一家,赶紧自杀谢罪得了!虾米?竟然使用1000这样的“魔数”,你是怎么搞的?不会用#define定义一个宏吗?这么点常识都不知道,还写书!我是绝对不买的!大家也不要买!水平太渣了!本来我是不想说的,但是……虾米?变量i是干什么的?不会取一个有意义的名称吗?左花括号另起并占据一行不行吗?有病呀!虾米?注释用双斜杠,这是什么骚操作?没看到很多嵌入式编程都用/**/……(以下省略吐槽一万字)

片面地批评谁不会呀?这是一种最低级的操作,即使是Linux之父写的代码,要批判总是可以找到攻击点。语言只是工具,真正卓越的编程员不会如此片面地批评《C语言程序设计》,因为TA懂得每本书都会有其定位与局限性,懂得从书本中找到自己真正需要的东西(去“糟粕”留“精华”),懂得从书中提炼出学习方法,懂得使用思辨的方式看待所发现的问题这对于所有行业中有着卓越成就的人都是适用的),而不是简单地从边边角角去批判,这也是一种不理性不成熟的行为。

如果一个人执意要从边边角角找出图书的错误,总是可以成功的,无论是霍金的《时间简史》还是拉扎维的《射频微电子学》,为什么这么说呢?咱们可以放开思路讨论:假设一只仅有二维空间概念的动物,它是其所在空间的一名物理学家,并且也提出了很多真理或定律。但是在我们看来,这些所谓的真理或定律并不一定是正确的,因为所在的维度不一样。同样我们这个维度提出的理论,在更高位面也并不一定是正确的,你同意吗?我想表达的是:每一本书都有其定位与局限性!在某个设定框架内可以做到基本正确,但跳出这个设定却不然,这是无法避免的。如果你决定用心阅读某本书,首先就得接受其定位与局限性,否则你会觉得到处都是错误。

同样,《电容应用分析精粹》中的某些内容,从某些角度来看也许并不严谨,但它只是通过一种使读者更容易理解的方式其定位的读者阐述本不太容易理解的知识点,从这个角度来讲,《电容应用分析精粹》做得很好!具体来讲,在阐述同一个知识点时,《电容应用分析精粹》中会采用某种形象的方式,但在《三极管应用分析精粹》可能就会采用另一种方式,如果要写一本针对在校大学生的教材,同一个知识点的阐述方式又会有所不同。

图书撰写需要站在不同角度去实际操作,当你的读者定位不同时,描述方式或严谨程度是不同的,但重点在于把想要表达的意思清晰地展示出来。记得初中化学老师曾对我们说过一句话:等你们学习高中化学的时候,就会知道现在学到的很多内容是错误的!那我们可以去批判初中化学吗?肯定不妥嘛!因为教育有它自身的客观规律,初中阶段有其自身广度与深度的局限性,要不咱们初中、高中、大学全部一套教材不就完事了?换句话说,会花费宝贵的时间一味地片面找图书问题的人(这种行为就是我们所说的“找茬”,字面意思),本身就存在一些问题,因为TA缺乏最起码的写作意识,也不具备最基本的思辨能力

人这一辈子几十年看似很长,但在整个宇宙中也只不过是一粒尘埃而已,我们应该用有限的生命去做一些有意义的事情,如果非要用一句话来具体概括,我的选择是:态度决定一切

从谭浩强的《C语言程序设计》到《电容应用分析精粹》的更多相关文章

  1. 再论谭浩强《C语言程序设计》

    一些同学学不好C语言,把罪责归于“因为教材是谭浩强写的”实在是很滑稽. 谭浩强老先生 1934 年生,现在已经 80 岁了.他 1958 年从清华大学自动控制系毕业,那年 24 岁.要知道 C 语言那 ...

  2. 挂羊头卖狗肉蓄意欺骗读者——谭浩强《C程序设计(第四版)》中所谓的“按照C99”(二)

    挂羊头卖狗肉蓄意欺骗读者——谭浩强<C程序设计(第四版)>中所谓的“按照C99”(二) 在<谭C>p4:“本书的叙述以C99标准为依据”,下面从C89到C99的主要变化方面来看 ...

  3. C语言学习笔记---谭浩强

    前段时间有机会去面试了一次,真是备受“打击”(其实是启发),总的来说就是让我意识到了学习工具和学习技术的区别.所以最近在看一些数据结构和算法,操作系统,python中的并行编程与异步编程等东西.然而数 ...

  4. c++面向对象程序设计 谭浩强 第一章答案

    c++面向对象程序设计 谭浩强 答案 第一章 目录: c++面向对象程序设计 谭浩强 答案 第一章 c++面向对象程序设计 谭浩强 答案 第二章 c++面向对象程序设计 谭浩强 答案 第三章 c++面 ...

  5. C程序设计(谭浩强)第五版课后题答案 第一章

    大家好,这篇文章分享了C程序设计(谭浩强)第五版课后题答案,所有程序已经测试能够正常运行,如果小伙伴发现有错误的的地方,欢迎留言告诉我,我会及时改正!感谢大家的观看!!! 1.什么是程序?什么是程序设 ...

  6. c++面向对象程序设计 课后题 答案 谭浩强 第四章

    c++面向对象程序设计课后题答案 谭浩强 第四章 1: #include <iostream> using namespace std; class Complex {public: Co ...

  7. c++面向对象程序设计 谭浩强 第三章答案

    2: #include <iostream> using namespace std; class Date {public: Date(int,int,int); Date(int,in ...

  8. c++面向对象程序设计 谭浩强 第二章答案

    类体内定义成员函数 #include <iostream> using namespace std; class Time { public: void set_time(); void ...

  9. C指针笔试题,蛋疼的多重指针运算,谭浩强的阴影

    对指针的概念清晰的话,做这种题只要耐心就行,然而看这种题就烦(被同学吐槽为谭浩强的阴影……草泥马这种C风格题有意义吗?出题人脑子被门夹了?而且C++11都不支持字面值字符串直接转换成char*了.好吧 ...

随机推荐

  1. Spring Security + OAuth2 + JWT 基本使用

    Spring Security + OAuth2 + JWT 基本使用 前面学习了 Spring Security 入门,现在搭配 oauth2 + JWT 进行测试. 1.什么是 OAuth2 OA ...

  2. Django(19)QuerySet API

    前言 我们通常做查询操作的时候,都是通过模型名字.objects的方式进行操作.其实模型名字.objects是一个django.db.models.manager.Manager对象,而Manager ...

  3. 低代码平台--基于surging开发微服务编排流程引擎构思

    前言 微服务对于各位并不陌生,在互联网浪潮下不是在学习微服务的路上,就是在使用改造的路上,每个人对于微服务都有自己理解,有用k8s 就说自己是微服务,有用一些第三方框架spring cloud, du ...

  4. 3D饼/环Echarts图的实现

    首先确保在项目中引入了echarts和echarts-gl"echarts": "^4.9.0","echarts-gl": "^ ...

  5. ASP.NET Core文件压缩最佳实践

    前言 在微软官方文档中,未明确指出文件压缩功能的使用误区. 本文将对 ASP.NET Core 文件响应压缩的常见使用误区做出说明. 误区1:未使用 Brotil 压缩 几乎不需要任何额外的代价,Br ...

  6. [刷题] 235 Lowest Common Ancestor of a Binary Search Tree

    要求 给定一棵二分搜索树和两个节点,寻找这两个节点的最近公共祖先 示例 2和8的最近公共祖先是6 2和4的最近公共祖先是2 思路 p q<node node<p q p<=node& ...

  7. [前端] JSON

    背景 JavaScript对象表示法(JavaScript Object Notation):是一种存储数据的方式 JSON对象 创建 var gareen = {"name":& ...

  8. 查看报错原因 sshd -t

    b for ssh.service failed because the control process exited with error code. See "systemctl sta ...

  9. DOCKER学习_012:Dockerfile配置指令详解

    1 Dockerfile结构 基础镜像信息 镜像操作指令 容器启动时执行指令 2 FROM 指定基础镜像,用于继承其他镜像使用的 FROM ubuntu:14.06 FROM centos FROM ...

  10. C语言编程 菜鸟练习100题(01-10)

    [练习1]输出 "Hello, World!" 0. 题目: 输出 "Hello, World!" 1. 分析: 使用 printf() 输出 "He ...