编程新手真言.doc_第1页
编程新手真言.doc_第2页
编程新手真言.doc_第3页
编程新手真言.doc_第4页
编程新手真言.doc_第5页
已阅读5页,还剩293页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

新手编程导论新手编程导论 A A A ProgrammingProgrammingProgramming IntroductionIntroductionIntroduction ForForFor BeginnersBeginnersBeginners 设计才是真正的编程 对类型的设计才是设计 面向对象并非一切 无论你以为上述观点是惊天大秘或不过尔尔 你都需要这本书 Todo 整合过长的目录 完善前二十页 目目目 录录录 第一部分第一部分 9 前前 言言 9 By Chenyi 9 By Minlearn 10 导导 读读 14 任何语言都是有门槛的 14 什么是语言级和语言外要学习的 数据结构与代码结构 15 什么是语言级要学习的 17 编程学习方法 18 计算机学生专业课程本质讲解 18 用 C 开发要学到什么程度 20 本书目录安排 21 第二部分第二部分 基础 导论基础 导论 25 第第 1 章章 系统系统 25 1 1 何谓 PC 25 1 2 图灵机与冯氏架构 26 1 3 计算机能干什么 27 1 4 内存地址 28 新手编程导论 090203 Page 2 of 298 1 5 分段和分页以及保护模式 30 1 7 操作系统 31 1 6 并发与协程 33 1 6 CPU 与异常 33 1 7 所谓堆栈 34 1 8 真正的保护模式 36 1 9 异常与流转 38 1 10 最小 最完美的系统 39 1 11 操作系统与语言的关系 41 1 12 虚拟机与语言 41 1 13 虚拟机与语言 42 1 14 调试器与汇编器 43 1 15 平台之 GUI 45 1 16 界面的本质应该是命令行功能支持下的配置描述文件 45 1 17 命令行下编程实践 46 第第 2 章章 语言语言 47 2 1 真正的计算模型 47 2 2 开发模型与语言模型 49 2 3 正规表达式与有限自动机 53 2 4 联系编译原理学语言 56 2 6 如何理解运行时 59 2 7 运行时环境 60 2 7 运行时 60 6 3 语言的类型系统 60 2 8 编译与解释 62 2 9 运行期与编译期 62 2 9 编译与运行期分开的本质与抽象 63 2 10 脚本语言 63 2 11 灵活性与安全性 65 2 12 二进制指令与循环 66 2 13 所谓函数 67 2 14 所谓流程 68 2 15 为什么需要数据类型和数据结构 68 2 16 数据类型和数据结构是二种不一样的东西 69 2 17 为什么需要变量这些东东 69 2 18 面向类型化的设计和面向无类型泛化的设计 OO 不是银弹 70 第第 3 章章 语言之争语言之争 71 3 1 学编程之初 语言之争 71 3 2 语言与应用与人 1 72 3 2 语言与应用与人 2 73 新手编程导论 090203 Page 3 of 298 3 3 C 与 Ruby 74 3 4 你为什么需要 Ruby 75 3 5 C 还是 Ruby 76 3 6 C 与 Java 76 3 7 NET 与 JVM 77 3 8 你为什么需要 Ruby 78 3 9 语言功能上的差别 79 3 10 C 与 C 之争 80 3 11 我为什么选择 C 而不是 C 及其它语言 81 3 12 类 VB DELPHI 类 RAD 语言分析 82 第第 4 章章 语言最小内核语言最小内核 C 83 4 1 C 与 C 是二种不同的语言 83 4 2 C 的数组 指针与字符串 84 4 3 C 的输入与输出流 84 4 4 C 的类型系统与表达式 85 4 5 二进制指令看循环 85 4 6 所谓指针 当指针用于设计居多时 86 4 7 指针成就的 C 语言 86 4 8 指针是语言的一种抽象机制 88 4 9 学 C 千万不能走入的一个误区 其实 JAVA 比 C 难 88 4 10 C 抽象惯用法 90 4 11 C 的抽象范式之 OOP 91 4 12 C 的观点 底层不需要直接抽象 93 4 13 指针 间接操作者 94 4 14 真正的 typedef 95 4 15 真正的指针类型 95 4 16 真正的函数指针 97 4 17 真正的句柄 97 4 18 真正的循环 98 4 19 真正的 static 98 4 20 真正的数组索引 99 4 21 类型和屏看原理 100 4 22 位操作与多维数组指针与元素 101 4 23 变量与 VOID 102 第第 5 章章 抽象抽象 102 5 1 人与软件 103 5 2 软件活动的特点 103 5 2 抽象与接口 104 5 3 过度抽象 105 5 3 OO 为什么不是银弹 过度抽象与抽象偏差 106 新手编程导论 090203 Page 4 of 298 5 4 真正的设计与编码 107 5 5 真正的构件库 109 5 6 大逻辑与小逻辑 112 5 7 什么是范式 112 第第 6 章章 抽象之数据结构抽象之数据结构 113 6 1 所谓数据结构 113 6 2 算法 数据结构的本质 115 6 4 算法不是设计 115 6 5 函数增长与算法复杂性分析 115 6 6 数据结构初步引象 1 116 6 7 数据结构初步引象 2 117 6 8 数据结构初步引象 3 118 6 9 数据结构初步引象 4 119 6 10 ordered 与 sorted 119 6 11 数据结构与抽象 119 6 12 真正的逻辑数据结构只有二种 120 6 12 树与图初步引象 121 6 13 树初步引象 122 6 14 B 减树 123 6 15 图初步引象 124 6 16 树的平衡与旋转 125 6 17 完全与满 129 6 18 多路 234 树与红黑树的导出 129 6 19 快速排序思想 130 6 20 数据结构之数组 131 6 21 数据结构的抽象名字 132 6 22 真正的 ADT 133 6 23 Vector 的观点 135 6 24 真正的数据结构 136 6 25 堆栈与队列 138 6 26 真正的递归 140 6 27 树与单链表 图 145 6 28 树 146 6 29 真正的散列表 148 6 30 算法设计方法 148 第第 7 章章 抽象之高级语法机制抽象之高级语法机制 149 7 1 真正的 OO 解 149 7 2 真正的对象 151 7 3 真正的继承 152 7 4 真正的 OO 152 新手编程导论 090203 Page 5 of 298 7 5 真正的 OOP 154 7 6 真正的构造函数 155 7 7 真正的私有 保护和公有 156 7 8 真正的重载与复写 156 7 9 C 的元编程 156 7 10 模板的意义在于编译前端的设计 157 7 11 C 的元编程和泛型编程 159 7 12 元编程和函数式编程 159 7 13 C 的模板编译技术本质 161 7 14 OO 的缺点 161 7 15 模板的继承 162 7 16 模板的偏特化 162 7 17 真正的策略 162 7 18 为设计产生代码 164 7 19 真正的 metaprogramming 165 7 20 元编程技术 166 第第 8 章章 抽象之设计和领域逻辑抽象之设计和领域逻辑 167 8 1 大设计 167 8 1 什么是设计 167 8 2 编程能力 代码控制能力 复用与接口 轮子发明与使用 170 8 3 OO 模板 设计模式与设计 171 8 4 设计能力和程序员能力模型 172 8 4 自上而下设计和自下而上设计 173 8 5 大中型软件和复用与逻辑达成 177 8 6 通用设计与专门设计 178 8 7 具象与抽象 178 8 7 架构与应用 179 8 8 应用与设计 179 8 9 与软件有关的哲学 联系 180 8 10 与软工有关的哲学 唯物主义 180 8 11 真正的设计模式 182 8 12 设计模式与数据结构 182 8 12 设计模式之基础 183 8 12 真正的开闭原则 183 8 13 真正的通米特原则 184 8 14 真正的好莱钨原则 185 8 15 真正的策略模式 185 8 16 真正的观察者模式 185 8 17 真正的装饰模式 186 8 18 真正的单例模式 186 新手编程导论 090203 Page 6 of 298 8 19 真正的迭代器模式 186 8 20 真正的工厂模式 187 8 21 真正的门面模式 187 8 22 真正的命令模式 188 8 23 真正的模板方法模式 188 8 24 真正的适配器模式 188 8 25 业务与逻辑分开 189 8 26 架构不是功能的要求 但却是工程的要求 189 8 27 你需不需要一个库 190 8 28 可复用与可移殖的区别 190 8 28 再谈可复用 193 8 29 真正的可复用 193 8 30 你能理解 XP 编程吗 194 8 31 构件与接口 软工 195 8 32 设计方法论 196 8 33 真正的 interface 198 8 34 真正的对接口进行编程 200 8 35 实践方法之极限编程 200 8 36 设计模式复用与框架复用 201 第三部分第三部分 进阶 进阶 C C C C 代码阅读与控制代码阅读与控制 201 第第 9 章章 语法与初级标准库语法与初级标准库 202 9 1 C 的基于过程设计 203 9 2 C 的基于对象设计 模板与设计 203 9 3 面向对象设计 204 9 4 泛型开发与初级 StdC 库 204 第第 10 章章 数据逻辑与数据逻辑与 STL 库库 204 10 1 仿函数 204 10 2 iterater 204 10 3 adapter 205 第第 11 章章 高级代码逻辑与高级代码逻辑与 LOKI 库库 205 11 1 typelist 205 11 2 traits 206 11 2 policy 206 第四部分第四部分 一个例子 游戏引擎和实现一个例子 游戏引擎和实现 206 第第 12 章章 设计 需求分析 设计 需求分析 207 12 1 第一天 接到一个案子 207 12 2 第二天 需求分析 208 第第 13 章章 设计 领域分析与抽象 设计 领域分析与抽象 210 新手编程导论 090203 Page 7 of 298 13 1 原语设计 210 13 2 了解 Yake 216 13 3 GVWL1 0 开发 222 13 4 范型设计与实作 223 第第 14 章章 编码编码 224 14 1 原语设计 224 14 2 实现 梦想与财富 224 第第 15 章章 重构重构 225 15 1 增加 Jxta 225 第五部分第五部分 225 选读选读 225 字符与字符串 226 为什么我说 Java 是脚本语言 226 宽松语法 无语法语言 227 Linux 与 3D 228 伪码语言 229 最强大的语言原来是预处理 230 语言宿主 231 shell 编程和交互式语句编程 232 Debug 编译期断言 232 图形原理之位图 图象和字体 233 为 Windows 说些好话 233 Minlearn Ruby 5 网络原理与 P2P 234 Minlearn Ruby 4 字符串与 WEB 234 加密与解密 235 Minlearn 3 载体逻辑 236 Minlearn 2 平台与并发 237 Minlearn 1 平台之持久 237 平台之多媒体编程 237 Minlearn Ruby 238 思想 维度 细节 240 理想 241 XML 242 面向更好复用的封装机制 243 SOA 244 浮点标准与实现 244 Desktop web internet 云计算不过 WEB 的集中化这种说法的偷换概念 246 编程设计与经济 246 晕计算 247 新手编程导论 090203 Page 8 of 298 在形式主义与直觉主义之间 数学与后现代思想的根源 248 Scheme 程序语言介绍之一 248 与软工有关的哲学 辩证 251 富网页技术 251 形式维度 252 开源与开放 253 Core learning and min learing 编程 253 与软工有关的哲学 联系 254 本地化和语言编码 254 学习与维度 255 跟软件有关的哲学 唯物主义 255 关于逻辑的逻辑 256 合理性 257 语言 道理和感情 258 可恶 OO 259 互联网与企业开发 259 会学习的人首先要学历史 260 离散数学与代数系统 262 线代与矩阵 262 计算机与编程 263 真正的二进制 265 真正的文件 266 真正的数据 267 真正的 Unicode 267 真正的 Windows 消息 269 真正的 XML 270 真正的 GUI 271 设备环境 271 真正的 MFC 273 真正的虚拟机 275 真正的 NET 276 真正的脚本 278 真正的并发性 279 真正的反工程 280 真正的 DSL 282 真正的多范型设计 284 真正的调试 285 真正的浮点数 286 真正的布尔 288 真正的整型数 289 新手编程导论 090203 Page 9 of 298 真正的引用 290 真正的 RTTI 290 真正的句柄 292 真正的循环 293 真正的 STL 293 真正的容器 295 真正的智能指针 295 真正的数组索引 296 数据库 297 真正的可持久化 298 真正的类库 299 真正的 COM 300 真正的 DCOM 301 真正的 Sun 策略 302 真正的 J2EE 303 真正的 EJB 304 附录 一些领域逻辑 通用附录 一些领域逻辑 通用 OO 设计策略 框架设计设计策略 框架设计 305 附录 参考文献附录 参考文献 305 附录 一些建议附录 一些建议 305 第一部分第一部分 前前 言言 By Chenyi 眼前这本书充分体现了作者的所思 所想 所感 他用自己独特的眼光审视着计算机技 术的世界 也用自己独特的思维逻辑对技术进行解读 并用自己特有的 呵呵 偶尔带有 四个逗号 一个逗号 这样的语言风格 进行着自己的诠释 创新是一种美 独立思考也 是 学习是一件因人而异的事情 因为每个人的生活经历 教育背景 年龄 认知模型等等 都是不尽相同的 也就是每个人所处的 维度 不同 而作者有一种 建立更高层抽象的能 新手编程导论 090203 Page 10 of 298 力 用一种特有的方法尝试着给大家建立一个学习计算机的 相对高层的构架 这样 可 以在一定程度上突破个人的 维度 使大家从与周围事物建立联系开始 一步一步的走向 计算机的世界 不识庐山真面目 只缘身在此山中 确实的 在学习技术的过程中 横看成 岭侧成峰 远近高低各不同 但是作者却尽力想让这高低或是远近都不同的山峰 能在我们 面前呈现出一种规律 共性来 这是难能可贵的 因为这个架构的过程对思维的要求是比较 高的 哲语有云 动身的时候到了 有的人去生 有的人去死 只有上帝知道 于是这个问题 被回归到 To Be Or Not To Be 的问题 是生 是死 只有上帝知道 但是 人类对真理的探索和对知识的追求 却从来没有因为 生死 的维度而停止过 是的 一颗崇尚真理 探寻真理的海洋之心 将从来不会因为泰坦尼克号的沉沉而消沉 它 将永远绽放在人们的心中 激励着我们向更广阔 更深髓的世界 一路前行 风雨无阻 在这个意义上 鼓励作者的写作和思路 也是对我们自身追寻真理的一种鼓励 一种回 路 是为一点小感想 与作者分享 By Minlearn 对思想的认识和界定是重要的 因为我们需要一个知识体系才能不致于困惑 而 身处编程界 纷繁复杂的术语和概念足以让一个初学者却步 我抓住了哪些转瞬就在我脑中消失的思想 因为它们远比一切成书的东西都让我感到 它的珍贵 而更玄的是 他们竟然真的能够被文字描述出来 这整本书就是小说式的教学 它力求呈现出一个精致化了的术语集 以使初学者能真正理解至关重要的那些概念 正如 Chenyi 所说 每个人都是某个维度上的人 有他自己的年龄和认知 具体到某个 历史时刻 我们的人生阅历已然被格定 而这决定了你接受新事物的能力和眼界 人生在世 已经不可能脱离某种信念 也异或某种阻力和障碍 而活 当我们开始学习编程 我们永远 都是用外行的眼光去看待某样东西 而当你占在巨人的肩膀上成为一个专家之后 你就需要 用全局的眼光去看待曾经陌生的知识 此时你不再是个学习者 而会批评产生你自己的认知 但那毕竟是要过的第二道槛 而初学者就是那些连第一道槛都难以过去的群体 这其中最大的拦路虎就是对术语的理解 很多书并不切合初学者的实际 从他们的角度 呈现一条清楚可见的理解路线 而只是一些大部头衍生下的反复抄袭品 给你一个术语或道理 这个道理有什么用 没用 是的 因为要给你一个情景 你才能 理解它 仅仅让你去学一个知识 而知识和众多其它知识之间相似而微有不同 如果不给出 它被产生时的历史和它所处的架构 这本书不但给你思想 而且给你对应的细节 那么我们 就会迅速迷惑 更遑论运用它 因为我们不是泛化主义者 形而上学者 但是的确存在超前主 新手编程导论 090203 Page 11 of 298 义学说 只是为了创立一种学说 后来才慢慢与实践相结合 我们需要一种与自身相联系点 去理解它 我们只是生活的人 我们不是高高在上的学院派高手 一个高手必定是与常人有不同的思想级深层的东西和他自己特有的体会 因为他也走过 初学者才走过来的路 可是往往人们都忘了归纳那些至关重要的经验 那会是什么经验呢 那些是不会出现在任何描述具体技术细节的书里的思想级的东西 那么这本书尝试的正是记 录那些秘诀 如果真的想当高手 请你不要错过这本书里任何一个字眼 如果你是高手 这本书一定与你内心深处的某些想法偶合 本书过后 再辅于其它教科书 比如你手头上的一本 C 教材 本书后面列举了一些与本 书能很好答配的推荐参考书 你应该会具备基本的编程能力和编程理解能力 本书前半部分 是对思想和认知的导论 后半部分注定实践和技能能力的形成 知识是事物之间的联系 那么实践就是强化或深入这些联系的方法 我常想 到底是什 么重要 是认知还是技能 人们普遍认为实践应在任何情况下都高于认识 事实是 可能有 技能但是没有认知 但却不可能有认知但没有技能 就拿学习英语来说吧 看英语报纸也是 一种实践 因为它也能够加强你实际使用英语的能力 我不是在模糊这二者之间的区别 我只是企图站在这二者之上求得一种更泛化的认识 实践不过更侧重动手能力而已民 而 认知跟它并不矛盾 知识的获得与能否运用知识本身无必然因果 拥有足够的知识 再加上泛 型的思维 你就会快速得以实践 一切都是一种格物致知的过程 只有格物至知 先格物 认识到了一定程序后就会产生对事物本质的认识 也可先认识事物本质再在指导下去发展技 能 但是认知可以直接传递给你 至此只是一个你所能想象得到的浅层和大概 而且除非实践 这个大概形象你也不知道它到底是正确的还是错误的 更深层的你想象不到的抽象以及关于 这些认识的正确性要求实践 相比之下一本书不可能传递很多实践的东西 本书前一部分正 是力求让初学者完成从认知到实践的有效过渡 所以说实践和认知都是重要的 没有谁比谁更重要的说法 然而对于初学者来说浅层认知 的重要性要高于实践 一开始就有一个好的思想和基础显然可以为未来的实践扫清障碍 这是 因为学习是一个层次上升阶段 在拥有一定知识后 理解基于这些知识之上的更高层知识会 很快 即掌握了基础再加上一定勤奋的博物广识 知识量是几何级上升的 因此一种很好的学 习方法是 学习应该先吞 在一定知识量的前提下尽可量地博物广识 即使看不懂也要浏览 完 以获得浅层的认知继续下一步学习 这是学习中自然而痛苦的过程 不是提倡光谈和光看 理论 而是把理论整理成一个架构也是一项重要的工作 不是不能直接把这个认知传递给你 而是需要再找一个与你的结合点来让你认识它 因此它是一本同时讲解到认知与实践的书 不是提倡导光谈理论 而是如果事先有理论的指导 那么学习中就会少走很多弯路 学习中 最怕不能理解细节 更怕以为细节就是一切 所谓一叶屏目不见泰山 更有人把学习语言作 为编程的终极目标 而如果事先有人给你指导 你就会少走很多弯路 在学习方法上面 有一个问题是关于细节和思想的 新手编程导论 090203 Page 12 of 298 我们鼓励在实践基础上去学习 也提倡速成 但大多数人显然不会拥有正规的实践教育 我认为学习不应该提倡逐步深入 人的生命有限 染启超在渡日的般上一夜之间学会日语 这 就是说他掌握了思想 细节的东西永远是后来的 只要思想是重要的 了解足够多的细节 才能泛思 在学习编程中 除了一些对至关重要概念集的理解之外 从来都不是大思想决 定一切 而只是小细节 这就要求你作很多的实践 掌握了思想和基础后 每天写小程序 编程能力就会日渐提高 而当你写过和分析过很多 程序之后 你就会具备一眼看出的本事 过程的最后你发现自己蛹变蝶飞了 学习应首先理解框架 这是泛读 然后是细节 这就是对某些内容的精读 就好像在一个 大型应用中 编译跟解释并不会走二个极端一样 低层用编译码 而高层用脚本 学习往 往是混合了这二个过程的过程 矛盾和老子的不可绝对在这里起作用 所以说思想和基础永远是重要的 人月神话的作者固然精通很多细节 但是他写出来的却 是一本思想书 知识和思想自然是越多越好 泛读可以无限进行 花再多人年都无碍 人年是 人月神话里面的概念 但是有一些知识不必深入 精读却需限于自己的开发领域 但一定 要知其然 本书主体中的二部分就是认知和实践 思想和细节的结合 所以你要做的就是在认识的 基础上作大量实践 这就是我在前言的后半部分推荐给你的看书方法 如果说一些知识仅仅知其然就够了的话 仅仅是不致于迷惑和建立知识结构 那么有一 些知识却是要精通的 因为不但要知其然而且要实际拿来应用 要成为某领域能实际胜任某份工作的程序员 就要做到精通四个 Idioms 注意这是精 通 1 你要用到的语言和 IDE 的 Idioms 一门语言 一种开发库 编程首先就是会用一门 语言和它的库 2 数据上的 Idioms 数据结构 数据的内存模式 数据库 数据的外存模式 编程第一个 就是数据 想起 DOS 下的编程了吗 一是数据 二是代码 3 设计上的 Idioms 面向对象 设计模式 编程第二个就是代码或代码框架 4 以上三条都是前提 那么这第四条就是最终的你要实际涉入的业务领域的 Idioms 编程最终是为了为这个领域服务 以上四条是主干 最好按 1 4 的顺序精读 而其它的都是支节 比如工具的使用啊 XML 啊 UML 啊 XP 方法啊 ANT 部署发布知识啊等等 对于计算机专业来说 为什么也才那么几门课程 高数线代离散 编译原理 C 与算法 Java 因为这些学科是最重要的 真正掌握了这些基础 你会发现再多后面的技术用语及其 背景都是支节 这就相当于前面提出的四个 Idioms 新手编程导论 090203 Page 13 of 298 对语言细节的学习和深刻理解永远都是学习编程的重头戏 但决不是一切 比如拿编程 语言来说 只要越过语言的表达这一层 我们才能用语言表达和理解事物 语言跟你要说的话 就像用 C 语言去表达一个算法 方案领域跟应用领域的对应 就像穿鞋去上海 穿上鞋只 是开始 真正你要去的目标 上海还远着呢 就像口才 一个好口才的人说话时绝对不会想到 措词 因为语言已经成为一种意象 只要把一样东西思想化 才能超越这个东西而去想到别的 东西而长足发展 比如面向对象 这本书将帮你解释为什么面向对象是一种科学的机制 解 释的过后你甚至会觉得这是一种本来就该存在的很亲切的机制 只要超越了面向对象我们编 程时 再加上一定设计模式 才能真正不会一动手编程就考虑什么是面向对象之类 而这 些 好像都是一个高手所能做的事了 编程时碰到的信息量永远是巨大的 有生之年我们不可能掌握这些信息的来龙去脉 对 于程序员来说 提供一个关于它的编程参考文档可以说是掌握了此信息 因为这个文档就是 这个信息的大概 实际上我们编程大部分情况下都只是用第三方的代码库来编程 这个信息 用于编程所需的全部东西 对于编程来说只要掌握这些东西就行 换句话说 一些知识如果 不能理解就得先放 这本书并不适合于赶考使用 在这个信息的社会 至于信息 是撞事学事 一个程序员并不全知全能 它只提取和了解事物对于编程方面的信息 对于事物的逻辑认识 只能在对它的编程中不断掌握它 抽象是惯穿这本书的重要的思想 维度也是 我们是从学 习编程的眼光来组织这本书的 也是站在初学者的角度来解释诸多概念及其关系的 问题随之而来 既然存在这个界限 又如何突破 否则这就是一个空谈 多走弯路 学习是认识事物间联系的过程 而记忆或实践是加强这个联系的过程 能 够认识到事物之间的联系 即便是自想的联系也可加深对事实的记忆 一个程序员有他自己的 知识体系是重要的 这就是知识 一切东西 我们应该查本究源 深入其原子世界 任何一个术语都不会简单 有它自己产 生的环境与其它知识的联系 但也正是因为这样 这也决定了它的有域性 任何知识只要放 在它自己的领域内去理解才能更容易被理解 翻译过很多文章你就知道要措词 措词跟概念 有关 二个稍微相差不大的措词都会让读者摸不头脑或让他们恍然大悟 我们高中做到了英语的相似名词不同分析 本书也打算在一定程序上这样做 虽然计算 机技术领域一个概念可以自成一书这种现实不允许我们这样做 咬文嚼字在这里起作用 在某些情况下 它是一种好习惯 然而千万不要走入另外一种极端 知识用词和技术用语没有一个标准 比如方法和函数 指的是同一个东西 什么是线性 一次就是线性 什么是离散 离散了的量 这都是仁者见伍 智者见 但人 们对此的理解都不会差到那里去 并且也不会影响后来的学习 这里有一个描述或形式的概念 相信大家都还记得初中学过的集合 是描述性概念 但集合其实还有一个形式概念 给定了形 新手编程导论 090203 Page 14 of 298 式就可以框死 而且 要知道 即使是 虚拟机的原理与设计 这本书的作者也会对别人书里的进程概 念感到不解 我注意到程员序考试中多了一项标准化 的确 知识的传达也需进入标准化时代了 最后 如果说任何行为都是功利的 那么我写这本书的目的只为博你一笑 书中错误再所难免 望不吝赐教 别怀疑 这正是一本同时可作为入门和进阶级的书 更偏重入门 然而真正的高 手和真正的初学者都将从中有所得 你还在为学不懂大量术语而烦恼吗 如果你真有这种体会 那么你可能先要看这本 书再看你正在看的 C 的书 因为你仅仅缺少一根主线 而它是能让你少走很多弯 路的拐棍 对架构的学习才是真正的学习 知识也有它的架构 然而在这本书内有架构也有细节 高手固然知道细节 然而高手也有精神空洞 因为你还需要懂得一些细节之外的架 构级的东西 NotWar3 的从零到尾的实现 让你知道其实你一个人就可以做出类 War3 的游戏 本书作者也自称是一个菜鸟 但是这个程序的确是他自己写的 导导 读读 任何语言都是有门槛的任何语言都是有门槛的 C 用最初级的封装了汇编的逻辑写应用 这也就是 C 代码看起来难的原因 如果你看过 位操作 比如 oopc 实现的 RTTI 看过用 C 表达的数据结构 就会发现 有时看出来样子普 通的一堆语句 你根本不知道它想表达什么上下文逻辑 因为 C 代码本身跟现实问题走了二个 极端 你看懂了代码却看不明白代码后面的东西 这是因为有设计在作梗 而 C 跟设计和现 实问题走了二个极端 除非你真一开始就明白它想写什么 有文档的情况下 但 Java 这样 的语言 能够整体上看起来是一个一个的类 显得意义明了 但实际上语言越接近应用问题 反而代码看起来更复杂 因为现实生活是很难的你根本做不到绝对靠近除非你为每一个问 新手编程导论 090203 Page 15 of 298 题写一个 dsl C 表达的向系统问题接近和 Java 表达的向现实靠近各有各的难处 作为一门工 业语言 要求它看起来便于程序员理解和复用 Java 这方面是做得不错的而 C 肯定只是专家 语言 一堆有机类有时反而难于让人看出它想表达什么 而且另外一方面 类里同也是函数 也是 Java 的语句逻辑而不是封装上的类逻辑 这些语句逻辑 同样用 Java 中的库来形成 Java 的库是重新经过设过的 相比 C 语言 比如它规范了流的概念 Java 的 OO 和规范的 库是人们说 Java 比其它语言易的二个方面 但是虽然熟悉编程的人可以拿来用 但是对于没有编程经验的人来说 它照样跟 C 一样难 因此 JAVA 的所谓易 是相对用过 C 的这样的熟悉编程者来说的 至少使用 JAVA 我们照样 得学好跟 C 一样的数据结构知识 看不懂一套源程序 主要是 1 你不知道普通的语句是体现什么样的数据结构 2 你不知道普通的语句是体现什么样的算法 3 抽象惯用法 4 如何向现实问题靠近抽象并设计的 5 现实问题的复杂性 跟语言逻辑的简单性 非 dsl 之间的矛盾 语言从来被设计成通用的 因此要学好一门语言解决问题 不但要学精语言的语法和库 而且学习的重点还就在于 数据结构和算法 现实问题 抽象和设计 什么是语言级和语言外要学习的什么是语言级和语言外要学习的 数据结构与代码结构数据结构与代码结构 设计最终要被体会到源程序 如果把设计作为整个软工过程 那么源程序是这个工程最好的 结果最终证明 参见 源程序就是设计 一文 你可以 google 得到它 我认为这样的说法是对的 因为它综合了我在下面要谈到的 1 2 二个过程 但因为它没有 显式提到下面我列出的二个过程 所以我认为该文在一定程序上是一篇含糊其词的文章 1 是脱离了语言的那些映射 即人们通常说到的设计一词的意义 请参照我的 什么是设计 一文 这里的设计实际上是指大设计 指领域抽象 语言选择 这些东西 包括数据结构 2 是结合了语言的实现映射 即人们通常说到的实现 不过人们通常把 1 作为架构师的工作 新手编程导论 090203 Page 16 of 298 而把 2 作为程序员的工作而已 如果架构师的工作深入到类的类部 深入到详细设计 那么 他实际上担当了一部分程序员的工作 但在人类的工作中 2 是受 1 控制的 这里面其实有一个代码抽象模式和数据抽象模式的区别 类实际上是一种数据抽象 而不是一种数据结构 因为它将代码抽象为一个一个的 数据 模式 即将 C 这样的通用语言增加 DSL 词汇 让它成为 DSL 可以表达 class cat class pig 猪猫 诸如这样的领域词汇 所以类是一种数据 把词汇抽象为语言的一级 first class 数 据 即 UDT ADT 这里面 D 的意义 抽象模式 也就是代码模式 而数据结构学是一种实 现模式 而不是代码模式 数据结构学与代码结构学的区别 是解决问题的问题和解决语言映射问题的区别 两者在不 同抽象层次 这就是为什么数据结构可以用任何语言可以用基本流程实现也可以 C 的类来 实现 因为数据结构学跟它如何用一种代码结构来抽象是没有直接关联的 前者是如何解决 问题的抽象 是一种脱离了语言的映射 即我在 1 中谈到的设计 后者是代码问题 如何 面向用了类的可复用目的来进行对具体语言的映射 即我在 2 中谈到的实现 在编程的实现领域 从来最终都是过程编程即 Core C 的那些内核逻辑 类体里面也是 所 以 用了类 只是将面向过程抽象到了一个更好被复用的问题 并没有将如何实现这层抽象 到程序员不需要理会 所以对于不懂 C 的人来说 即使它能很好理解 OO 也做不了什么程 序 类只是将实现套了一壳 从而将面向对象层次的复用维持在这壳外 壳的里面却不行 照样是过程编程 OO 的强大只是指它类外的那些代码抽象模式 OO 提供的最本质的意义 和作用有二 1 将 C 这样的通用语言 在类层次 变成为 DSL 2 正是因为 1 的作用 在先 所以普通个人也可以开发复杂的软件系统 也是 C 程序员的能力更多在前者 数据结构 而数据类型属于后者 设计模式 面向对象都 是后者 是 C 程序员或架构师的事 对于 2 即实现 跟具体语言有关 下面举 C 和 C 为例 遗憾的是 C 只是对 C 的增强而非替代 如果他离开了 C 就只能有类的代码模式的复用 能力 却无法保留 C 的强大而直接的实现能力 如果写数据结构这样的东西都要强制用到类 那么除非有必要为复用作目的 否则没有用 C 的必要 所以一个 C 程序员 假设他用 了 OO 来实现数据结构 既是一个实现者 也是一个设计者 因为它既抽象了如何能被解决 的问题 又抽象了如何能被复用的代码 程序员对于算法 数据结构 数学实现问题这些细节的实现问题把握最重要 而不仅仅是语 言能力设计 代码抽象能力 如果有架构师的工作在先 C 的程序员仅仅需要提供函数过程模 新手编程导论 090203 Page 17 of 298 块 极度求接口化和求极度模块化 设计是需求驱动的 接口是要提供的功能驱动的 都是 不必要的那是架构师的工作 什么是语言级要学习的什么是语言级要学习的 什么是编程要学的 首先给出一张图 图中描述了编程知识结构 就学习一门语言比如 C 来说 综观 C 语言的语句形式 就只有编译原理后期翻译的那些语句形式了 仅仅从语句形 式上来看是这样的 计算机能做的事 就是 CPU 的取指令 译指令 执行指令 从内存中取数 CPU 用逻 辑器和运算器运算 中断处理例程 IO 设备的功能 这些是计算机能做的全部事情 由 CPU 统一控制 因为这是所有硬件资源能做的事情 计算机后来所有的软件逻辑包括 OS 的所有的功能都由它决定 由 OS 生成调用这些如上硬件资源的策略 template 是 C 的一种高级语言机制 它建立在 C 的类型机制上提供范型 但是它的语法 及其古怪 跟 C 那些其它的普通语言机制十分不相同 由于语言是由语法定义的 因此 我们称 类型 表达式 控制语句形式 赋值语句 这样的东西为语言的要素 打开任何一 门关于程序语言教学的文章 我们都可以发现这一点 字符串 IO 异常 标准库 数组 新手编程导论 090203 Page 18 of 298 与 Windows 的接口 这样的东西是语言的高级话题 和高级功能 不是语法级规定的 比如 可能是库提供的 编程学习方法编程学习方法 只要学习 C 语言 计算机系统知识 语言实现原理 网络原理这些系统知识 才能从一个比较大的 侧面去看待现实问题对于计算机的实现问题 也即编程问题 只有这样 只有懂 C 懂编译原理 懂计算机系统 懂网络 才能从一种大局的高度去看待并计划你的系统你的应用 要学习编程 我觉得 C 语言是起码要学的 即使是以后学 LUA RUBY 这样的高阶语言 最 好的途径还是先学 C 学习编程必定最后要涉及到系统逻辑 那么是首先学习上述的计算机专业课程的知识 还是先 学语言呢 我觉得是先学语言 因为理论的知识在没有实践的前担下很难掌握 而一开始就学 习语言 我这里只指 C 语言 是最好的办法 因为在学习的过程中 你需要一门语言来实践 验 证各个小问题的语言实现 来掌握更多的知识 计算机学生专业课程本质讲解计算机学生专业课程本质讲解 RUBY 跟 C 语言还是结合得蛮紧的 RUBY 在数据结构方面还是有 C 语言影子的 人们说 RUBY 偏向于人 但是几乎所有的语言都脱离不了数据结构 都脱离不了底层 RUBY 的 OO 只是指类的那一方面 RUBY 的 IO 数据结构 跟其它语言是一样的 复杂 跟底 层相关 数据结构和底层有什么关系呢 内存地址是线性的啊 这就是数组 我们的虚拟机是栈 式机啊 所以要堆栈 我们的运行时把类对象分配到堆中 所以要堆 这就是编程语言处 理计算机 解释器本身的离散形式而导致的复杂性 所有的语言包括 RUBY 都没有很好地用 OO 封装数据结构 STL 是个例外 但是无论理解 OO 的 STL 还是 RUBY 的数据结构 都是 差不多要理解到底层 即数据结构的原理 每种数结的具体情况 学习 RUBY 并不能让你 省这个懒 问题就出在这 要学好 RUBY C 的数据结构方面还是要下点功夫的 任何一门 语言 语言库包括 STL 都没有自称它把数据结构简化到不需要明白任何具体数据结构的形式 就可以拿它来进行编程的程度 其实计算机专业学生的那些课 数结 C 操统 都是无 比珍贵的东西 学校设立这些课而不是 C 不是 RUBY 是因为那些才是可以解释后来 一切的底层 而并非一种舍本未未的作法 语言就是处理三个东西之间的关系 平台 语言 要解决的问题 解决什么问题用什么语言最好 其中 汇编基础 解释了硬件平台 即 CPU 中内置了控制内存的模块 因此要涉及到寄存器 内存 地址等 操作系统课程 如果说汇编基础解释了解硬件平台 那么这就是解决的软件平台的问题 而离散数学 就是一切离散形式 计算机和程序语言环境 和语言本身都是本质上一些离散形式 比如图灵机就是程序模型 是个离散东东 在编译原理中体现就更明显了 比如函数语言实际上 新手编程导论 090203 Page 19 of 298 就是一种高次方程的离散 编译原理的本质是什么呢 如果说硬件和操作系统都是解释了平台 那么编译原理就解释了程序本身的本质 那么 C 语言课程呢 这解释了硬件编程的一些方面 C 大量汇编的形式广泛用于硬件编程 驱动开发 而且 C 语言这门课程最最重要的意义还在 于 它解释了一切后来的高级语言比如 RUBY 比如 JAVA 要学习到的跟底层相关的离散形式 这是尤为珍贵的 比如进程 比如并发 比如异常 比如数据结构 而数据结构中的 数据 二字永远 是一个程序的中心因素 从普通数值 字符串 数值到结构体到 OO 数据 体现了人们封装程序开 发数据对象的复杂性的要求 而且这种发展是为了产生一种广泛深度的开发方法的 这导致了 软工 JAVA 就是这样一种好的语言 应该如何从 C 的观点来看待你的编程语言比如 RUBY 跟操作系统之间的关系呢 一方面 C 本 身就是一门硬件编程语言和系统开发语言 OS 一般就用 C 来开发 很少用第三代语言比如 C JAVA RUBY 而且 C 语言就是一切语言的基础 JAVA RUBY 都是用它写的 这导致 了一些现实 下面一一说来 C 语言跟 OS 编写有关 是 OS 的直接宿主语言 其它的比如 RUBY 比如 C 比如 JAVA 是 C 的上层语言 学了 C 语言 RUBY JAVA OO 都很简单 而且 C 语言是系统编程语言 是底硬件编程语言 embed c 是使用最多的语 方 opengl 能用 JAVA 开发吗 不能 那会慢得要死 而且根本也不行 驱动程序能用 JAVA 吗 那简单是笑话 只有 WEB 开发 这些不需要很实时的 I O 这些架在逻辑上的 逻辑 TCP HTTP WWW SOAP 一层一层而来 不需要很强的反应 才可以用 JAVA 而且 JAVA 编程统一 OO 复用强 是软工理想语言 一句话 C 扩展 RUBY 简 单 而 RUBY 调用 C 却需要 BIND 一句话 编程三个平台 硬件 裸机 用 好 配有 的桌面 用 好 用 的 C 也可 用 JAVA 好 用 好 C 语言一般用来作底层编程 比如那些靠近硬件层的 选用普通的 C 语言 语言标准 可以 在 WINDOWS 平台上开发控制底层的编程 而且还存在嵌入式 语言用来开发各种硬件编程 驱动 主板支持驱序 比如一些智能手机的操作系统开发等 其实 语言开发也 就是一种范式 一种编程习惯 它是过程式命令编程范式的代表 世界上用得最大的编程语 言不是 JAVA 不是 不是 而是 因为 用来作系统编程时 它可以提供 较快的运行速度 接近底层的更好控制 实现 语言的编译器是一种将 语言代码直接编译 成本地码的工具 不存在任何逻辑中间层次或解释程序 比如虚拟机 因此运行速度很快 而且 语言提供的指针等 直接与硬件内存地址啊 这些东西挂钩 而且系统本身大都用 语言开发 比如 这就在你要开发的应用程序和宿主环境中提供了统一性 你可以更好控制和调用系统 不必作语言之间的 而且 语言不必涉及到 因为 主要是面对人的 而 语言更多地是机器因素 它要求人用机器的思维方式 来编程 这句话本身也就说明 语言是靠近机器的 因此它适合用来作系统编程 而 等 语言用来作面向程序员的高级脚本编程 所谓脚本语言 就是相对系统编程 语言来说的 系统编程语言提供了强大的底层编程能力 而 等脚本语言提供了调用 这些系统功能的高级应用层的开发 无论如何 一个程序员是要天天学习新知识的 如果不能快速接受 也即你的基础知识跟不上来 那 么基本上你会很累 大学只是学习这个基础知识的阶段 你最好把编译原理 离散数学 汇编程序 设计 操作系统 语言 这些基础弄得滚瓜烂熟 并积累一些具体的开发经验 等出了 社会之后 你会发现社会上的编程知识跟你在大学学习的东西差了去了 这个时候你的这些 基础知识就发挥了很重要的作用 你需要这些基础来理解软件开发中的大学问 新思想 比 新手编程导论 090203 Page 20 of 298 如设计模式 STL 总之钻进去了 也就是一种乐趣 好自为止 用用 C 开发要学到什么程度开发要学到什么程度 鉴于这样的话题太有争执性 本文只给出一个参考意见 都是无穷无尽复杂的细节让初学者停滞了他们学习一门语言的脚步 在你开始满怀喜欢地 按书上的例子用 C 开始写 HELLO WORLD 时却被 IDE 少引用了一个文件之类的问题折腾 得一头恼怒浪费不少时间 而书上没有任何一点关于这些的描述 或者网上也只能找到零碎不 成文的信息 即使一门语言内部被宣传得天花乱坠比如拥有 OO 有多少语言机制多么利于复用 这种论调泛滥的的今天 在真正动手使用一门语言的时候 作为新手的他们还是会能遇到轻易 就把他们击败的细节问题 这些细节问题往往不是大思路大方向 比如什么是 OO 这个逻辑用什么来设计好 反而是那些 日常时常见到的工具上或语言上的陷阱 象其名家一般研究基础的东西 因为任何东西都是基 础的东西通过泛化得来的 而很多人就是基础都搞不明白 虽然存在大量关于某主题的高级论 题 但是基础的东西永远是要求精和熟的 往往这些细节问题可以被理解 但就是难于掌握 这 就是那些被称为语言陷阱的东西 然而这是一个大问题 对于软工来说它是 应该被尽量在 语言被设计时就避免而不是人脑避免 比如 IDE 环境 比如语言细节 比如目标领域的问题 当一 门语言复杂到你真正需要掌握这些才能编程的时候 编程就演变为不仅仅是简单的复用了 虽 然我们以为 OO 语言就是简单的复用语言但它们明显做得不够 没有一门语言 即使 RUBY 也 没有把语言细节弄得足够简单 使得你可以不管任何语法产生式的机制去直接构建你的应用 在不损耗逻辑的情况下 而且 RUBY 的一些语法机制也不是不简单 需要你有深厚的系统知识 去理解他们 比如协程 元编程等技

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论