没想到竟然上了日报。好方……
———————————————
大学时我对编程语言有过一些困惑:应该学哪个编程语言?到底怎么样才算是掌握了编程语言?5年前我幸运地看到了垠神在新浪博客的一篇文章 - 如何掌握程序语言,里面推荐阅读SICP的前三章。我读过之后,受益良多。
曾几何时,SICP是每个MIT CS学生大一就要上的基础课的教材,毕竟是世界名校,比我们的课程不知高到哪里去了。然鹅,时过境迁,MIT的教授们已经停止这门基于SICP的课程了,因为一方面他们已经教了太久(十几年了),感觉很烦了,另一方面他们认为软件工程的学生现在把大部分时间花在阅读软件库的说明书上,然后搞清楚怎么调用,SICP跟这套工作流程已经不怎么相关了。
好了,虽说这门课已经不更新了,SICP的作者承认他们并不知道应该如何安排更合理的课程,所以我们还是要看看这本书。
另外,基于这本书,伯克利的一位教授搞了个教学网站 - http://composingprograms.com/about.html,用Python来教SICP,有兴趣可以去看看。这个网站的内容也是基于伯克利的CS 61A,这门课的名字就叫SICP。实际上MIT也已经用Python替换了Scheme,所以我个人更推荐上面这个网站,比起Scheme,Python更加适合初学者。不过SICP的内容不会过时,Scheme只是一个表现形式,扫一遍前三章也绝对不亏。非初学者也会有时看时新的感觉。
SICP帮助读者了解CS的核心概念,属于从高空俯瞰世界,刚入门的读者不应该错过。
说完了高空,接下来我想推荐另一本中间高度的书,这本书帮助我从了解如何组织代码的模块,以及实践中业界遇到的问题,以及如何用合适的架构来解决这些问题。
Clean Architecture: A Craftsman's Guide to Software Structure and Design
这本书是Uncle Bob最近几年的博文合集,读完以后有种灵台清明的感觉,做code review的时候思路清晰了很多。
看过差的架构才明白好的有多么珍贵。架构都是一点点烂掉的,所以防微杜渐很重要,而要防微杜渐,就必须要从一开始就知道正确的架构方向。这本书不长,英文版也只需要不到10个小时就能读完,大学里或是工作中的读者应该会喜欢这本书。这本书2017年9月才出版,时效性远远超过经典的Martin Fowler的Patterns of Enterprise Application Architecture,你如果准备读后者,建议你先读这本小书。
说完了中间高度,还有一本更加细节的书,我实在不能不推荐,因为我看到高票答案里都没提到,也许是因为这本书2017年三月才出版,还没有中文的。
Martin Kleppmann的DDIA:Designing Data-Intensive Applications。
这本书的作者阅读量非常广泛,以数据密集型软件的设计为楔子讲了分布式系统的很多东西,从设计思路到一些具体细节,收放自如。从Netflix的技术博客,到开源软件的技术来源,再到OSDI上各个业界大厂发的论文,让我大饱眼福。一共12章节,目前看到了第9章。
如果说上一本是讲了高可扩展性、高可维护性的架构,是骨架;那么这本书是讲了分布式、高并发、高性能、高可用的软件,是血肉。细胞的级别讲不出来,绝知此事要躬行。
微软CTO Kevin Scott对这本书的评价是『每一位软件工程师的必读书。』
目前这本书在Goodreads上有404个评价,评分高达4.68,要知道SICP才4.45.
简单强调一下:国内的朋友不要排斥阅读英文资料,作者都是理工科,写作词汇量基本也就是四级英语,跟咱们高中英语差不多。
看了这两个回答,赶紧学习吧:
Memoria:17 年美国 CS new grad 就业到底有多差?
既然是大呼过瘾,那推荐下《Effective Python》和《Python Cookbook》这两本书。
豆瓣评分,两本书最新版都是9.4分。
一般的语法书会从数据类型、逻辑结构等基础着手,把编程语言的整体结构铺展开来,无论Python 、Java、C++都是如此。
这两本书严格意义上不算是语法书,他们的特点或许可以总结为一个词-技巧。如果编程是一门技能,技巧便是千锤百炼的手艺活儿。
《Effective Python》主要是讲如何提升编程效率,通过大量的案例给出符合Python习惯且高效的代码,让读者能够掌握Pythonic的编程方式。
《Python Cookbook》主题同样是优秀的Python编程技巧,但它给出的案例更加丰富,而且十分贴合日常项目场景,代码可直接参考使用。
除了这两本,我还专门分析过Python不同阶段学习的书
下面针对这两书分别讲下它们好在哪。
《Effective Python》作者是Google首席软件工程师,拥有大量Python实践经验,本书也是他编程几十年来的沉淀。
今年该书中文第二版面世,相比第一版增添了很多Python 3的内容,而且案例库也得到极大的丰富(旧版59个,新版90个)。
顾名思义,《Effective Python》关键词在于Effective,也就是高效简洁的实现Python编程。
如果你去搜会发现Effective系列是编程界的宝藏书,《Effective Java》、《Effective C++》等都斐名中外,其中《Effective C++》已经成为编程界圣经般的存在。
所以说编程技巧和思想永远是程序员们心中的倚天屠龙。
本书采用模块化编写,分10个专题讲解了Python编写规范,告诉读者哪些更有效,哪些应该避免、哪些该做权衡。
第一章 培养Pythonic思维
第二章 列表与字典
第三章 函数
第四章 推导与生成
第五章 类与接口
第六章 元类与属性
第七章 并发与并行
第八章 稳定与性能
第九章 测试与调试
第十章 协作开发
作者在每一章都列举了很多条写Python代码应注意的规范,以第二章列表与字典为例,包含了8个场景。
第1条 学会对序列做切片 // 37
第2条 不要在切片里同时指定起止下标与步进 // 40
第3条 通过带星号的unpacking操作来捕获多个元素,不要用切片 // 42
第4条 用sort方法的key参数来表示复杂的排序逻辑 // 45
第5条 不要过分依赖给字典添加条目时所用的顺序 // 51
第6条 用get处理键不在字典中的情况,不要使用in与KeyError // 56
第7条 用defaultdict处理内部状态中缺失的元素,而不要用setdefault // 61
第8条 学会利用__missing__构造依赖键的默认值
在使用sort方法这一条里,作者就灵活使用了key参数、lambda函数等对复杂的排序进行了优化处理,它在还小节的最后总结了几个要点,很是清晰。
在最后一章里,作者讲到了协作与开发,非常适合有想法开发Python库的读者看。
文中讲了如何用虚拟环境隔离项目和处理依赖关系,怎么编写文档,怎么构建稳固的API,怎么用静态分析来消除bug,边边角角都给你考虑到了。
所以说这本书还是很值得新手老手看看的,学会pythonic方法是Python进阶必经之路。
附该书详细目录:
这同样是本牛逼哄哄的书,相比《Effective Python》在案例讲解上更加细致丰富。
作者是一位独立开发者,并且为Python社区贡献了多个开源库,他不光写Python还是C++领域的大佬。
Cookbook系列也是明星产品,有JavaScript Cookbook、Perl Cookbook、Ruby Cookbook等众多好书。
《Python Cookbook》覆盖了Python应用中的很多常见问题,并提出了通用的解决方案。书中包含了大量实用的编程技巧和示例代码,并在Python 3.3环境下进行了测试,可以很方便地应用到实际项目中去。
全书共十章,其主题涵盖了数据结构和算法,字符串和文本,数字、日期和时间,迭代器和生成器,文件和I/O,数据编码与处理,函数,类与对象,元编程,模块和包,网络和Web编程,并发,实用脚本和系统管理,测试、调试以及异常,C语言扩展等。
附详细目录,供大家参考。
第1章 数据结构和算法 1
1.1 将序列分解为单独的变量 1
1.2 从任意长度的可迭代对象中分解元素 3
1.3 保存最后N个元素 5
1.4 找到最大或最小的N个元素 7
1.5 实现优先级队列 9
1.6 在字典中将键映射到多个值上 11
1.7 让字典保持有序 13
1.8 与字典有关的计算问题 14
1.9 在两个字典中寻找相同点 15
1.10 从序列中移除重复项且保持元素间顺序不变 17
1.11 对切片命名 18
1.12 找出序列中出现次数最多的元素 20
1.13 通过公共键对字典列表排序 22
1.14 对不原生支持比较操作的对象排序 23
1.15 根据字段将记录分组 25
1.16 筛选序列中的元素 26
1.17 从字典中提取子集 29
1.18 将名称映射到序列的元素中 30
1.19 同时对数据做转换和换算 33
1.20 将多个映射合并为单个映射 34
第2章 字符串和文本 37
2.1 针对任意多的分隔符拆分字符串 37
2.2 在字符串的开头或结尾处做文本匹配 38
2.3 利用Shell通配符做字符串匹配 40
2.4 文本模式的匹配和查找 42
2.5 查找和替换文本 45
2.6 以不区分大小写的方式对文本做查找和替换 47
2.7 定义实现最短匹配的正则表达式 48
2.8 编写多行模式的正则表达式 49
2.9 将Unicode文本统一表示为规范形式 50
2.10 用正则表达式处理Unicode字符 52
2.11 从字符串中去掉不需要的字符 53
2.12 文本过滤和清理 54
2.13 对齐文本字符串 57
2.14 字符串连接及合并 59
2.15 给字符串中的变量名做插值处理 62
2.16 以固定的列数重新格式化文本 64
2.17 在文本中处理HTML和XML实体 66
2.18 文本分词 67
2.19 编写一个简单的递归下降解析器 70
2.20 在字节串上执行文本操作 80
第3章 数字、日期和时间 83
3.1 对数值进行取整 83
3.2 执行精确的小数计算 85
3.3 对数值做格式化输出 87
3.4 同二进制、八进制和十六进制数打交道 89
3.5 从字节串中打包和解包大整数 90
3.6 复数运算 92
3.7 处理穷大和NaN 94
3.8 分数的计算 96
3.9 处理大型数组的计算 97
3.10 矩阵和线性代数的计算 101
3.11 随机选择 103
3.12 时间换算 105
3.13 计算上周5的日期 107
3.14 找出当月的日期范围 108
3.15 将字符串转换为日期 110
3.16 处理涉及到时区的日期问题 112
第4章 迭代器和生成器 114
4.1 手动访问迭代器中的元素 114
4.2 委托迭代 115
4.3 用生成器创建新的迭代模式 116
4.4 实现迭代协议 118
4.5 反向迭代 121
4.6 定义带有额外状态的生成器函数 122
4.7 对迭代器做切片操作 123
4.8 跳过可迭代对象中的前一部分元素 124
4.9 迭代所有可能的组合或排列 127
4.10 以索引-值对的形式迭代序列 129
4.11 同时迭代多个序列 131
4.12 在不同的容器中进行迭代 133
4.13 创建处理数据的管道 134
4.14 扁平化处理嵌套型的序列 137
4.15 合并多个有序序列,再对整个有序序列进行迭代 139
4.16 用迭代器取代while循环 140
第5章 文件和I/O 142
5.1 读写文本数据 142
5.2 将输出重定向到文件中 145
5.3 以不同的分隔符或行结尾符完成打印 145
5.4 读写二进制数据 146
5.5 对已不存在的文件执行写入操作 149
5.6 在字符串上执行I/O操作 150
5.7 读写压缩的数据文件 151
5.8 对固定大小的记录进行迭代 152
5.9 将二进制数据读取到可变缓冲区中 153
5.10 对二进制文件做内存映射 155
5.11 处理路径名 157
5.12 检测文件是否存在 158
5.13 获取目录内容的列表 159
5.14 绕过文件名编码 161
5.15 打印法解码的文件名 162
5.16 为已经打开的文件添加或修改编码方式 164
5.17 将字节数据写入文本文件 166
5.18 将已有的文件描述符包装为文件对象 167
5.19 创建临时文件和目录 169
5.20 同串口进行通信 171
5.21 序列化Python对象 172
第6章 数据编码与处理 177
6.1 读写CSV数据 177
6.2 读写JSON数据 181
6.3 解析简单的XML文档 186
6.4 以增量方式解析大型XML文件 188
6.5 将字典转换为XML 192
6.6 解析、修改和重写XML 194
6.7 用命名空间来解析XML文档 196
6.8 同关系型数据库进行交互 198
6.9 编码和解码十六进制数字 201
6.10 Base64编码和解码 202
6.11 读写二进制结构的数组 203
6.12 读取嵌套型和大小可变的二进制结构 207
6.13 数据汇总和统计 218
第7章 函数 221
7.1 编写可接受任意数量参数的函数 221
7.2 编写只接受关键字参数的函数 223
7.3 将元数据信息附加到函数参数上 224
7.4 从函数中返回多个值 225
7.5 定义带有默认参数的函数 226
7.6 定义匿名或内联函数 229
7.7 在匿名函数中绑定变量的值 230
7.8 让带有N个参数的可调用对象以较少的参数形式调用 232
7.9 用函数替代只有单个方法的类 235
7.10 在回调函数中携带额外的状态 236
7.11 内联回调函数 240
7.12 访问定义在闭包内的变量 242
第8章 类与对象 246
8.1 修改实例的字符串表示 246
8.2 自定义字符串的输出格式 248
8.3 让对象支持上下文管理协议 249
8.4 当创建大量实例时如何节省内存 251
8.5 将名称封装到类中 252
8.6 创建可管理的属性 254
8.7 调用父类中的方法 259
8.8 在子类中扩展属性 263
8.9 创建一种新形式的类属性或实例属性 267
8.10 让属性具有惰性求值的能力 271
8.11 简化数据结构的初始化过程 274
8.12 定义一个接口或抽象基类 278
8.13 实现一种数据模型或类型系统 281
8.14 实现自定义的容器 287
8.15 委托属性的访问 291
8.16 在类中定义多个构造函数 296
8.17 不通过调用init来创建实例 298
8.18 用Mixin技术来扩展类定义 299
8.19 实现带有状态的对象或状态机 305
8.20 调用对象上的方法,方法名以字符串形式给出 311
8.21 实现访问者模式 312
8.22 实现非递归的访问者模式 317
8.23 在环状数据结构中管理内存 324
8.24 让类支持比较操作 327
8.25 创建缓存实例 330
第9章 元编程 335
9.1 给函数添加一个包装 335
9.2 编写装饰器时如何保存函数的元数据 337
9.3 对装饰器进行解包装 339
9.4 定义一个可接受参数的装饰器 341
9.5 定义一个属性可由用户修改的装饰器 342
9.6 定义一个能接收可选参数的装饰器 346
9.7 利用装饰器对函数参数强制执行类型检查 348
9.8 在类中定义装饰器 352
9.9 把装饰器定义成类 354
9.10 把装饰器作用到类和静态方法上 357
9.11 编写装饰器为被包装的函数添加参数 359
9.12 利用装饰器给类定义打补丁 362
9.13 利用元类来控制实例的创建 364
9.14 获取类属性的定义顺序 367
9.15 定义一个能接受可选参数的元类 370
9.16 在*args和**kwargs上强制规定一种参数签名 372
9.17 在类中强制规定编码约定 375
9.18 通过编程的方式来定义类 378
9.19 在定义的时候初始化类成员 382
9.20 通过函数注解来实现方法重载 384
9.21 避免出现重复的属性方法 391
9.22 以简单的方式定义上下文管理器 393
9.23 执行带有局部副作用的代码 395
9.24 解析并分析Python源代码 398
9.25 将Python源码分解为字节码 402
第10章 模块和包 406
10.1 把模块按层次结构组织成包 406
10.2 对所有符号的导入进行精确控制 407
10.3 用相对名称来导入包中的子模块 408
10.4 将模块分解成多个文件 410
10.5 让各个目录下的代码在统一的命名空间下导入 413
10.6 重新加载模块 415
10.7 让目录或zip文件成为可运行的脚本 416
10.8 读取包中的数据文件 417
10.9 添加目录到sys.path中 418
10.10 使用字符串中给定的名称来导入模块
不是经济学专业,对两德合并无力回答,但是有关两德统一的公法事实的错误有必要指出。
现在讨论两德统一的问题。事实上,从来没有过两德统一,只有东德灭亡。1990年6月,东德政府决定引入西德马克来拯救陷入崩溃边缘东德经济。在之后的几个月内,由于经济无法改善,愤怒的人民走上街头,有良知的东德领导人们不愿意向人民开枪,政府迫于高压,自行解散。此时,1990年9月20日,全世界再也没有东德政府这个名词了。政府解散后,旧有各州纷纷独立,并最终仿照60年代萨尔州的例子,加入联邦德国,西德议会一一批准,才有了今天统一的德国。世界历史提到10月3日两德统一的日子,其实是照顾东德人民的感情。这在当时是联邦德国和几个州之间的事,东德政府已经在半个月之前不复存在了。
这一段不符合史实。东德政府并不是自行解散,而是根据两德条约的法定步骤,这是柏林墙倒塌后一步一步地来的。
1989年11月28日,西德总理提出分阶段建立德国邦联(还不是联邦)的计划。
1990年2月13日,华约与北约成员国外长会议做出决议,规定东德大选后成立的新东德政府就可以开始统一谈判。
1990年3月18日,东德举行大选,西德基民盟支持的东德“德国联盟”获得胜利,成立了新的东德政府。此时的东德实际上已经不是彼时的东德了,“有良知的东德领导人们”的几句话无从说起。
1990年5月18日,两德政府签订了第一个国家条约,确定了货币、经济和社会的联盟。货币联盟于7月1日起生效。
1990年8月3日,两德政府签订在两个德国境内举行全德议会选举的准备与实施协议。这个协议又于8月28日得到修改。
1990年8月23日东德国会通过了东德各州以州的身份加入联邦德国的决议。根据这个决议,为了符合基本法的规定才按照德国传统上的划分恢复各州;早前的1952年,为了便于统治,东德的历史上的5个州被划分为13个专区。这也是形式上的,东德五州真正建立起民选政府是统一之后的事情了,各州纷纷独立的说法无从说起。直到统一后的1990年10月13号,东德五州才进行了第一次州选举。
1990年8月31号由两德签署第二个国家条约确认两德统一,这个条约确定了两德统一的具体形式是东德解体、以各州的名义分别加入联邦德国。(Vertrag zwischen der Bundesrepublik Deutschland und der Deutschen Demokratischen Republik über die Herstellung der Einheit Deutschlands;Treaty between the Federal Republic of Germany and the German Democratic Republic on the Establishment of German Unity)
然后两德同四个占领国进行谈判,并于1990年9月12日签订有关修改德国国际法地位的“二加四协议”。
总结:东德政府解散并不是崩溃式的,而是根据相关宪法性法律和国际条约进行的法律步骤。
参考资料:康拉德·黑塞,商务印书馆,《联邦德国宪法纲要》第68-74页。(Grundzüge des Verfassungsrechts der Bundesrepublik Deutschland, 20. Auflage, Heidelberg 1995 (Neudruck 1999),pp95-98)
德国自神圣罗马帝国崩溃后的统一问题,政治学和国际关系上被称为German Question。可以去Google Scholar查找。
手边有两本英书可以推荐。
Peter Alter的《The German Question and Europe:A History》和Dirk Verheyen的《The German Question:A Cultural, Historical and Geopolitical Exploration》。
中文书可以参考玛丽·弗尔布鲁克的《德国史:1918-2008》。
这几本书的最后几章都是讨论两德统一后的政治、经济与社会状况,写作的年代也比较新,都是2000年之后写成或者最新修订的。
军事,我因生在中国而骄傲!
https://www.zhihu.com/video/1004301275952988160军事,我因生在中国而骄傲!
https://www.zhihu.com/video/1004301275952988160