第一章 阅读程序
1-0
很少有程序员阅读他人写的程序【现在可能不是这样了,但是阅读程序所占用的时间确实比较少】,能够读懂程序为何如此编写(有的是因为硬件,有的是语言特性,有的是历史遗留,有的是软件规范,有的是业务要求)就是我们的目标。
可以从github上下载一些开源的项目来读,关于如何阅读程序,有一本《程序员超强大脑》可以看看。很遗憾的是我好像从来没有读过超过100行以上的别人写的代码。
1-1
虽然是进行软件开发,但是软件是运行在硬件基础上的。硬件的改变也会影响到软件的写法。例如内存有限的情况下就不能支持较大的数据结构,因此,程序员应该了解一些必要的硬件知识。
补充思考:
1.硬件行业是如何改变软件行业的,请举几个例子?
2.十年后可预见的硬件情况会导致软件行业产生什么变化呢?
3.程序员最应该了解的硬件知识包括哪些?
1-2
P42(第42页)说道:
PL/I语言中的SUM内建函数是一个数学函数,它会把输入都转为浮点数,但是如果输入的数组是“包含小数位的定点十进制数”,就会产生计算误差,这迫使人们重新将SUM定义为算术类型。
什么是算术函数,什么是数学函数?
1-3
操作系统对主程序MAIN的处理和其他的子程序不尽相同,这句话应该怎么理解?
1-4
P42:DO循环的逆向计数是什么?
1-5
每一门编程语言都给我们很多的限制,比如下标必须从0开始,如果没有去除掉这些限制,我们甚至意识不到这些限制的存在。其实反过来说也一样,我们不是学习一种语言,我们只是适应那种语言以及它带来的限制。
1-6
程序员的局限性:不知道语言的所有特性;不知道某些算法的存在;不能同时兼顾一个大问题的各个部分。
1-7
我们通常会做出一些修改和改进,但是随后又忘掉自己做了什么,从而我们不能从改进中学到什么可以迁移的东西了,因此如果不记录、不背诵、不整理,那就意味着我们什么也没学到。
1-8
古早的程序员需要手动设计每一个细节,但是自从模式和框架兴起之后,程序员既不需要考虑代码架构,也不需要单独造轮子了,这大大的提升了工作效率同时也降低了程序员(广义的)的进入门槛。随之而来的现象就是:我们不会编程,我们只会CV。可是为了能提升专业技能,我们应该至少通读一个框架的底层源码,并自己手动设计一个框架(不管这个框架式如何地简陋)。
我以python为主,并且主要想搞统计,那么sklearn或者pytorch就是可选的了。
第二章 优秀程序的要素
2-1
我们需要改进我们所写的程序,而不仅仅是满足“能跑就不要动”,正是有着这样不断改进的心愿,我们才能取得进步。但是当我们着手写一个程序的时候,能让它先跑起来而不那么追求完美也是很好的思路。当我们需要面向他人和企业写代码的时候,就需要为他人参与我们的工作、改进我们的工作留下空间,代码应该清晰、明确,尽量利用较为稳定的结构和工具,而不是采取一些效率高但是易变的工具(一个特定的工具如rabbitMq的存活期又有多久呢?)
利用较为基础的东西自己造轮子所创造出的作品更容易维护、也会活得更久。
效率越高的东西改进的空间就越小、存活的时间就越短。
从商业的角度或许我们会选择一些短命的方法,但是从个人职业发展或者说为了追求程序员的精神来看,我们要选择那些笨的、耗时的、少有人走的路径,做一个程序粘合员、程序糊裱匠迟早会职业倦怠的。
空手道大师,不管他已经取得了多大的成就,依然需要每天重复一些基础的动作,这个行为让我们心态稳定,犹如定海神针。新的东西总是建立在那些旧的、基础的东西之上的,我们不了解这些东西的话就会迷失在眼花缭乱的新工具/新观点/新方法之上,这在社会科学领域内也是一样的。不仅是在社科领域,即使是在技术领域,知识也没有日新月异——不要担心几十年前的经典书籍太老了!
2-2
赞赏每一段程序,描述它的特性,无需评价。