最近在看 C++之父 BS 的 《C++程序设计原理与实践》, 记录下。
目标读者
本书适合于哪些从未有过编程经验但愿意努力学习程序设计的初学者,它能帮助你理解使用C++语言进行程序设计的基本原理并获得实践技巧。
作为大学课程大概需要15小时/周 * 14周 = 210 小时。
本书不是初学程序设计的简单入门教材。
我的基本假设是,你希望编写供他人使用的程序,并愿意认真负责地、较高质量地完成这个工作(专业水准)
如果你只是希望直接使用别人编写的程序,而不想了解其内部原理,也不想亲自向代码中加入重要的内容,那么本书不适合你.
考虑到本书的结构和注重实践的特点,它也可以作为程序设计方面的第二本书。
程序设计(尤其)是一种实践技能,需要通过实践来掌握。如果你不编写代码(完成每章的若干习题),那么阅读本书就纯粹是一种无意义的理论学习。
本书结构
- part1:基本知识
- part2:输入输出
- part3:数据结构和算法
- part4:拓宽视野
- part5:附录
最好的进一步学习的方法是开发一个真正能被别人使用的程序
本书的主题是用C++语言进行程序设计,而不是“C++和一点程序设计理论。
关于学习进度,不是说要完全准备好了再行动;小孩儿学习走路和学会跑步,不是严格的先后顺序:在学会平稳第慢慢走路之前就开始自己学者跑了
不要投入大量精力试图学习一些语言或技术细节的所有相关内容,因为这是低效率的,略过一些细节,用到的时候再回头来看,效率最高:
不求甚解的记住大量规则和语言特性,是错误之源,也是浪费时间;应当从思想和原理的角度出发:
数十万行规模的成功商业程序中所采用的技术,我们用几个50行规模的程序就能展示出来。最快的理解现实世界程序的途径是好好研究一些基础的小程序:
作者列出了一些低效率、错误的教学方法:
- C优先
- 自底向上
- 如果介绍某些内容,就必须介绍它的全部
- 自顶向下
- 抽象优先
- 软件工程理论优先
- 面向对象先行
- 相信魔法
作者主要采用的是:具体优先和深度优先方法,并对重点概念和技术加以强调。
编程不是全部;先理解问题,才能更合适的编程:
纯粹的编程是毫无意义的,除非它用来表达思想或解决问题:
开发程序,包括4个阶段:分析,设计,编程,测试。 编程+测试 统称为实现。 4个阶段不是严格按顺序出现的,在后面的阶段出现的问题,反馈给到前面的阶段,发现前面阶段的问题,也是正常的
不要急于编码,在接触键盘之前要和其他人讨论设计:
思考题和我的答案
思考题
- 什么是软件?
软件是运行在计算机上的程序的集合。 是一个统称。 - 软件为什么重要?
计算机可以帮助我们完成某些事,在没有计算机的情况下需要花费更多时间。 - 软件重要在哪里?
每台计算机都需要运行软件。 - 如果有写软件失败,那么导致错误的原因是什么?列举一些例子。
可能是实现有问题(编程或测试出现),也可能是问题分析、方案设计出了问题。 - 软件在哪里扮演重要角色?列举一些例子。
比如医院影像科诊疗。 - 哪些工作与软件开发相关?列举一些例子
软件工程师,测试工程师,产品经理,客户经理。 - 计算机科学和编程之间的区别是什么?
计算机科学是理论,编程是实践。 - 在船舶的设计、建造和使用中,软件使用在哪些地方?
设计阶段:展示船舶的原型、零部件的设计、渲染效果;
建造阶段:根据预先设定的模型,批量生产零件、检验零件
使用阶段:仪表盘、控制系统。 - 什么是服务器机群?
服务器集群吗? - 你在线提出哪种类型的查询?列举一些例子
购物网站,做文本查询,或图片查询。 - 软件在科学方面有哪些应用?列举一些例子
基因测序的计算。 - 软件在医疗方面有哪些应用?列举一些例子
医院影像科的数据采集、诊疗。 以及 CT 等。 - 软件在娱乐方面有哪些应用?列举一些例子
网易云音乐; 游戏客户端和服务器端。 - 我们期待中的好软件的一般特点有哪些?
功能复合预期;代码实现简洁,如果需求变了,容易修改、扩展; 维护成本低。 - 一个软件开发者看起来像什么?
把明确的问题的大致明确的解决方案,敲代码实现的人员。
16.软件开发有哪些阶段?
分析、设计、编程、测试。 - 软件开发为什么困难?列举一些原因
需求分析不清晰,导致设计出的技术方案不能覆盖需求,和使用人预期有差距。
编程需要一定的经验,编码过快可能导致可维护性差。 - 软件的哪些用途为人类生活带来便利?
执行重复操作,如计算、查询等,节省人类时间。 - 软件的哪些用途为人类生活带来更多困难?
可能用于军事,为人类安全带来隐患。
总结
前言,以及第一章,内容超出我的预期。大师确实是大师,见多识广,明确告诉我们“编程不是全部“,还需要搭配前置的问题分析、设计方案,以及后置的测试;也明确告诉我们,死记硬背语法细节是低效的、浪费时间的,正确思路是循序渐进、参与和写出有实际价值的软件。这些内容显然是给有一定编程经验、需要进一步从道(而非术)层面提升自己的人准备的。