一、2019年09月29日 开始阅读《自学是门手艺》 第一天
前言
1、这本书教会你自学能力,并且一定程度上是“一本编程书”。
自学能力,一定会缓解甚至消除一个人的焦虑情绪。
完成这本书的内容后,你起码会习得一个新技能:编程。
这句话让我对于接下来的学习更加的有兴趣,而且我之前也听说了笑来老师讲过,其实编程是很简单的,学了就知道。
最消耗生活质量的东西,就是焦虑。
这点真的是深有感触,在生活中,焦虑就是会很消耗你的时间、精力等等的一切,就算是说最坏的情绪之一都不为过。
手艺的特点就是无须天分;手艺的特点就是熟练程度决定一切。从这个角度看,自学这门手艺和擀饺子皮没什么区别——刚开始谁都笨手笨脚,但熟练了之后,就那么回事。
手艺的特点就是熟练程度决定一切,刚开始大家都一样,熟练了之后就那么回事,就像我们在医院做的一个操作锁骨下静脉穿刺,其实就是里面细节的问题,等你熟悉了之后一切都没什么了。
讲大道理的更可能是平庸者、失败者,而不是成功者。
这点是我自己特别需要避免的,平时不要好为人师,不要觉得你自己懂什么道理,这都是幻象,当你还想很主动的去说的时候,证明你自己其实有关这些大道理你并不是真正的懂,你只是为了炫耀。
很多父母和老师就被小朋友们“看穿”了——他们整天说的都是他们自己做不到的事情。于是,小朋友们以为自己“看穿”了整个世界。而事实上,由于小朋友们没学过或者没学好概率这个重要的知识,他们不仅不知道那只是99%的情况,更不知道“因素的重要性与它所占的比例常常全无正相关”,也就当然不知道那自己尚未见到的1%才可能是最重要的。
这事我自己一定要避免掉的,我以后要求自己的小孩子做的事情,必须是自己先做到的,我必须明白己所不欲勿施于人的道理,我们是平等的,必须是相互尊重的去学习并成长。
2、第一章 为什么一定要掌握自学能力
原因很简单:没有自学能力的人没有未来。
而我们是活在未来的人,我们必须掌握自学能力。
我经历了从不识字就是文盲,到不懂英语就是“文盲”、不懂计算机就是“文盲”,再到现在不懂数据分析的人基本与“文盲”无异的过程……
我们现在算是在慢慢进入不懂英语以及不懂计算机就是“文盲”的阶段。我们必须要经历过这个阶段,才能往前更进一步。
其实,刚开始我稍微翻了一下这本书,看了那么多编程的语言,觉得是不是不适合我们现在,但就像笑来老师之前跟我们说过的,这个其实很简单,并且我在朋友圈也有一个在学编程这方面的,她也是说了确实很简单,所以更加坚定我要继续学这本书的决心。
笑来老师在文中举例了他的老婆,可以算是“自学专家”。让我们知道了五年前的你做了什么样的选择,五年后的你就会按照你的这个选择去走。我们不要觉得去学一个东西时间太长,事实上,不管你学还是不学,五年还是会一转眼就过去的,而如果现在不学,以后一定会为今天没去学而后悔。
无论学什么,都要耗费时间和精力,与此同时,更难的是保持耐心。
我们必须要花时间精力去学我们想学的东西, 不能只是看看并且想想,必须践行起来,做到才是最重要的。
二、2019年09月30日 开始阅读《自学是门手艺》 第二天
第二章 为什么将编程作为自学的入口
1、一本关于自学能力的书,若真能起作用,就必须让读者读之前和读之后不一样。例如,读之前可能没有自学能力,或者自学能力较差,读之后就拥有了一定的自学能力。
我的思考:关于自学能力的书,如果能读着读之前和读之后不一样,那么我就觉得达到了起作用的效果了。
我不知道我现在的自学能力如何,但是我觉得自从我习惯了记录之后,我的自学能力是比起之前有明显提升的,因为很多事情会记录下来之后分析,然后再去践行,那种效果是不一样的,而从这本书我所想获得的,也就是能够进一步的提高我的自学能力。
2、在我看来,在写书和讲课之前,最重要的工作,也是做得最多的事情,其实就是“找到好例子”。
我选中了一个例子,就是“自学编程”——“尽量只通过阅读学会编程”。
我的思考:虽然我还没有写书,但是我也有写作,平时总是自我意淫的写着,其实这才知道需要给自己找素材、找好的例子,尽量找多一点的例子,然后在其中挑出效果最好的例子。慢慢发现,在看笑来老师的书的时候,也看看从中学会他是怎么写书的,进而了解他是怎么写文章的。
3、事实证明,学习编程就是无论什么人都能学会的。
它老少皆宜——“只要你愿意”,十二岁的孩子可以学,十八岁的大学生可以学,在职人员可以学……
它不分性别,男性可以学,女性同样可以学,性别差异在这里完全不存在。
它不分国界,更没有区域差异。互联网的恩惠在于,你在北京、纽约也好,老头沟、门头沟也罢,在这个领域里没有任何具体的差异。
编程事当今世上极为罕见的一个“教育机会公平之地”。
我的思考:自己还特意查了一下老头沟以及门头沟,我还以为是一个什么样的梗,但是查了也就是两个地方,作者想表达的是不管是大小地方,在编程这个领域来说是没有任何具体的差异。
这点我在看这本书之前也是有听说过了,其实自己一直对编程这个语言挺感兴趣,因为我知道编程语言是全世界的语言,并且它的基础是以英语为基础,全世界通用,这也是让我更加感兴趣的原因,而且不管是谁,只要想学,几乎没有任何差异。这纯碎就是你自学能力的强弱的问题。
4、编程这个东西最适合“仅靠阅读自学”。而且不管是谁,都只能去阅读官方文档。
作为一个个体,我们每天都会“生产”各种各样的数据。这些数据时时刻刻都在被别人获取、使用、分析……如果我们全然没有数据分析能力,甚至不知道这件事很重要,是不是很可怕?看看身边,有多少人想过这件事?似乎有不少天天“刷”着由机器算法生成的信息流且乐此不疲的人,不知他们是否在意……
我的思考:数据分析能力,通过笑来老师知道这个能力很重要,现在我们可以通过学点编程来反向加强我们这个能力。而且我们为什么要通过自学,因为大家基本都一样,只能去阅读官方文档,这就是很有挑战的事情了。
5、编程入门的门槛高,有一个比较特殊的原因:它的知识点结构不是线性的。
所谓的线性结构就是我们中小学学的,第一章学会了,就有了学习第二章的基础;在第二章中讲解的概念,不会出现在第一章中……
而编程很多的概念是要在若干章之后才开始讲解。
对当前知识点的理解,依赖于对以后才能开始学习的某个甚至多个知识点的深入理解。
这种现象还有一个专门的英文概念“Forward References”
这个词可以翻译为:过早引用、向前引用。
6、学习编程会让我们不得不习得英语,起码要习得英语阅读能力,它能让我们在不知不觉中”脱盲“。而且用英语是天天用,不停的用。
我的思考:这点我在之前就提到过,编程的很多基础,至少说文字基本都是由英语构成的,所以在这学编程的过程当中,你自然会学习英语,不然你无法学会编程。
7、自学编程对任何人来说绝对是:
现实的,practical
可行动的,actionable
可达成的,achievable
笑来老师说这件事比减肥容易多了,因为这个不是在跟自己的基因做斗争。
自学是门手艺,只不过它不像卖油翁的手艺那样很容易被别人看到,也没有太多的机会把它拿出来炫耀——因为别人看不到吗!然而,日积月累,就不一样了。那好处,管别人知不知道呢,我们自己清楚得很!
我的思考:目前自己刚好是在想减肥以及减肥的阶段,所以我觉得如果我减肥都可以,那么自学编程更是可以。而且,必须记得,不要拿出来跟任何人炫耀,自己知道自己的好处就行。
三、2019年10月01日 开始阅读《自学是门手艺》 第三天
第三章 只靠阅读习得新技能
1、习得自学能力的终极目标就是:有能力只靠阅读就能习得新技能。
笑来老师说:他在生活、工作、学习上遇到的所有疑问,书本里应该都有答案——起码可以参考。
过了25岁,就放弃了读小说。虚构类作品,我只看电影;非虚构类作品,我尽量只读原版书。
我的思考:有能力只靠阅读就能习得新技能,这一点我们必须学会,这对于我们对来就是一项必须的技能,所以我们必须习得自学能力。关于笑来老师说的阅读的书我也很赞同,小说我之前都还是有读一些,但是我觉得虚构类的那种作品是不需要看的,没有成长性,而且真的是很收割你的注意力。关于外国的作品,接下来我们也是尽量只读原版书。
2、人只要识字,就忍不住要阅读。
只不过,人们阅读的内容差别很大。我们很容易就能通过一下两点把有自学能力的人和没有自学能力的人区分开:
有自学能力的人,选择阅读“有繁殖能力”的内容;
没有自学能力的人,阅读只是为了消磨时光……
我把那些能给我们带来新视野的、能改变我们思考模式的,甚至能让我们拥有一项新技能的内容,称为“有繁殖能力的内容”。
人都一样,在拥有能力之后,就忍不住要去使用它,甚至会不自觉地使用它。
我的思考:我们现在首先需要让自己拥有的是自学的能力,下一步就是选择阅读“有繁殖能力”的内容,进而我们慢慢就会进化成长,相信这有个过程。
3、只要有一次“只靠阅读习得一项新技能”的经验,你就变成另外一个人了——你会不由自主地运用你新习得的能力。从这个角度看,自学是会上瘾的!能上瘾,却无害,且好处无穷,这样的好事,恐怕难得一遇吧。
仅靠阅读学会新技能是可能的。
在绝大多数情况下,没人能教你,也不一定有人愿意教你……到最后,当你想学会或者必须学会什么东西的时候,你只能靠阅读!因为其实你谁都靠不上。
我的思考:首先我必须学会只靠阅读学会一项技能,至少要入门,目前的阅读这本书学会编程就是我要做的。
其次就是,我很赞同笑来老师说的在大多数情况下,没人能教你且也不一定有人愿意。
事实上,我们做大多数的事情,首先需要依靠的自己,甚至在我们现在的这个情况下,几乎可以说是全部的事情。但是靠自己有时候又显得很靠谱,因为你只要靠阅读靠自己,然后就可以做成你想做的事情。
四、2019年10月02日 开始阅读《自学是门手艺》 第四天
第四章 开始阅读前的一些准备
1、Python编程的基础知识总计7节,主要内容概括如下。
以布尔值为入口了解程序本质。
了解值的分类和运算方法。
简要了解流出控制的原理。
简要了解函数的基本构成。
相对完整地了解字符串的操作。
了解各种容器的基础操作。
简要了解文件的读写操作。
阅读策略:不要试图一下子全部搞懂,这不仅艰难,在最初的时候也完全没必要。
请在第一遍粗略读完第1部分(PART ONE)中的第5章之后,再去阅读第1部分第6章关于如何从容应对“过早引用”的内容。
这一部分内容,注定需要反复阅读若干遍。
我的思考:首先知道的是要保持耐心,前面的7节,其实我看了是懵逼的,但是我又挺激动的,因为感觉到马上就要正式学习了。
2、十来岁的孩子都可以学会的东西,你怕什么?
别怕,无论说给自己,还是讲给别人,都是一样的,它可能是人生中最重要的鼓励词。
我的思考:我觉得跟几岁没关系,只要你想去学,肯定都能学会,还是态度问题。并且我们不仅要得到身边人的鼓励,更重要的是要自己鼓励自己。
3、关于这一部分内容中的代码
你可以暂时忽略它们的含义和工作原理,只需要知道:因为有它们在,每次执行那个单元格中的代码,会得到不同的结果。
还说了有关参阅《JupyterLab的安装与配置》一文。
https://github.com/selfteaching/the-craft-of-selfteaching/blob/master/markdown/T-appendix.jupyter-installation-and-setup.md
尤其要仔细看看其中“关于JupyterLab themes ”一节,否则,阅读体验会有很大的差别。
我的思考:今天还说到了十一点才开始看书,这点必须改正,如果真的是进入了正式的编程的学习的话,半个小时是绝对不够的。目前我是迫不及待的进入学习了。
五、2019年10月03日 开始阅读《自学是门手艺》 第五天
第五章第1节 入口
1、布尔运算
计算机能做布尔运算。
对一段写好的代码,计算机在执行的过程中,除了可以“按照顺序执行任务”,还可以“根据不同的情况执行不同的任务”。例如,“如果条件尚未满足,则重复执行某一任务”。
布尔值用True和False来表示。
Python解释器是对大小写敏感的,对它来说,True和true不是一回事。
2、自然语言中的“等于”,在Python编程语言中使用双等号==表示,不是单等号!
!=这是不等于的意义,in这是属于的意义。
有了布尔运算能力,才有根据情况决定流程的所谓流程控制能力。
用自然语言描述以上程序,大概是这样的(自然语言写在#之后):
For i in range(10): #将0~9中的所有数字都代入i这个变量,执行一次以下任务
If i %2 !=0: #如果i除以2的余数不等于0,执行下面的语句
Print(i) #向屏幕输出i这个变量中保存的值
3、关于质数的概念,相当于又重新学习了一遍,大于等于2,且只有在以它自身或者1为除数时余数为0。比如9就不是,它不仅可以被1和9整除,还可以被3整除。
所有的算法都是可以改(程序员们经常用的词是“优化”)的。
所有的工具都一样,效用取决于使用它的人。所以,学会使用工具固然重要,更为重要的是与此同时必须不断提高自己的能力。
操作符有+、—、*、/、//、%、**,他们分别代表加、减、乘、除、商、余、幂。
4、总结
下面列出这一节中的重要概念。了解它们及它们之间的关系,是下一步学习的基础。
数据:整数、布尔值;操作符;变量、赋值;表达式。
函数、子程序、参数、返回值、调用。
流程控制、分支、循环。
算法、优化。
程序:语句、注释、语句块。
输入、处理、输出。
解释器。
这些概念,基本上都是独立于编程语言的。无论将来学习哪种编程语言,不管是C++,还是JavaScript,抑或是Golang,都要理解这些概念。
学会一门编程语言再学其他的,就会容易很多。而且,学会了一门编程语言,你早晚会顺手学其他的——为了更高效地使用微软办公套件,你可能会花上一两天时间研究VBA;为了给自己做个网页,你会顺手学会JavaScript;为了修改某个用Ruby写的编辑器插件,大致读读官方文档,你就可以一展身手了;为了搞数据可视化,你会发现不学会R语言总有点不方便……
掌握这些基本概念,是将来持续学习的基础。
我的思考:
这一节我花了一个多小时看,画了很多的所谓的自己的认为的重点,我感觉我们真正的在学习编程者们语言了,我们现在就是在打基础,虽然有些东西还不是那么理解,但是前面已经说过了“Forward References”,会有过早引用的,所以我不担心,而且我觉得大部分我还是理解的,只是有小部分没那么理解,我相信随着学习的深入,最后都能理解。
六、2019年10月04日 开始阅读《自学是门手艺》 第六天
第五章第2节 值及其相应的运算
总结
从结构上看,一切计算机程序,都由且只由两个最基本的成分构成:
运算
流程控制。
这一节主要介绍了基础数据类型的运算细节。除了基础数据类型,我们还需要使用由它们组合起来的更多复杂的数据类型。但无论数据的类型是什么,被操作符操作的总是该数据的值。所以,针对绝大多书编程书籍按照惯例会讲解的“数据类型”,为了探究其本质,我们更关注“值的类型”。虽然只是关注焦点上一点点的转换,但实践证明,这一点点的不同,将为初学者更清楚地把握知识点提供巨大的帮助。
针对每一种值的类型,无论是简单还是复杂,都有相应的操作方式:
操作符
值运算
逻辑运算
函数
内建函数
其他模块中的函数
其本身所属类中定义的函数
接下来要学习的无非是各种数据类型的运算而已。
另外,其实所有的操作符在Python内部也是通过调用函数来完成工作的。
我的思考:
这篇文章自己大概花了半个小时来阅读,思考的程度不深,因为自己一直觉得这里面会有“过早引用”,更重要的是因为着急着看,很多东西就是一笔带过,也确实需要花时间了解。总的看下来,我觉得目前的阅读是我们的一个方面,还是尽量的放慢速度,这样子可以理解得更多,就像上一节,我觉得自己就理解得比较多,那时候感觉时间没那么急,所以还是要有耐心一些,并且后面结合实践才是重点。
七、2019年10月05日 开始阅读《自学是门手艺》 第七天
第五章第3节 流程控制
1、任何进步的取得,无论大小,其实都相当不容易,都非常耗时耗力——在哪儿都一样。
elif是else if的缩写,二者作用相同。
2、Continue、break和pass
在循环中,还可以用continue语句和break语句来控制流程走向——通常是在某条件判断发生的情况下,正如你早就见过的那样。
如果出现continue语句,其后的语句将被忽略,开始下一次循环。如果出现break语句,将从此结束当前循环,开始执行循环之后的语句。
For语句块后还可以附加一个else语句块——这是Python的一个比较有个性的地方。附加在for语句块结尾的else语句块,在没有break发生的情况下将会运行。
换个角度理解,可能回更清楚。pass这个语句主要是给写程序的人用的。在写程序的时候,我们可以用pass去占位,然后先写别的部分,再回过头来补充本来应该写在pass所在位置的那一段代码。
在写嵌套的判断语句或循环语句的时候,最常用的就是pass。因为写嵌套挺费脑子的,一不小心就弄乱了,所以,经常需要先用pass占位,然后逐一突破。
3、虽然现在我们还不能随心所欲地写程序,但是,我们具备了起码的“阅读能力”。经过前面的介绍,你也许可以读懂一些代码了,它们在你眼里再也不是“天书”了……
总结
有控制流,才算得上程序。
只处理一种情况,用if…。
处理True和False两种情况,用if…else…。
处理多种情况,用if…elif…elif…else…。
迭代有序数据类型,用for…in…。如果需要处理没有break发生的情况,用for…else…。
其他循环,用while…。
与循环相关的语句还有continue、break、pass。
从控制流的角度看,函数其实就是子程序。
我的思考:目前的这本书的学习我只能通过把书上的一些内容敲打下来,后面就是慢慢实践的过程,这一节我也算是慢慢的看完了。就像笑来老师说的,至少我们现在有了起码的“阅读能力”。我们可以读懂一些代码了,我现在慢慢才意识到我们在看的是一些代码了,以前还以为代码是非常复杂的东西,其实就是一种语言,一种我们可以学会的语言。学习真的是太重要了,可以让我们看到很多其他的世界。
八、2019年10月06日 开始阅读《自学是门手艺》 第八天
第五章第4节 函数
1、注意
这一节的核心目的,不是让你学会写函数,而是通过一些例子,让你大抵学会“如何阅读官方文档中关于函数的使用说明”。请注意这个词——大抵。千万不要害怕自己在最初理解不全面。
函数实际上是可以被调用的完整程序,它具备输入、处理、输出的功能。又因为函数经常在主程序里被调用,所以它更像一个子程序。
了解一个函数,无非是要了解它的两个方面:
它的输入是怎么构成的——都有哪些参数,如何指定。
它的输出是什么——返回值究竟是什么。
从这个角度看,牛对人类来说就是个函数,它吃的是草,挤出来的是奶……开个玩笑。
2、print()是初学者最常遇到的函数——姑且不说是不是最常用到的。
很多人只看各种教材、教程,却从来不看官方文档,到最后非常吃亏——不过是多花一点点功夫而已。看过官方文档之后你就会知道,原来print()函数是可以往文件里写数据的,只要指定file这个参数为一个已经打开的文件对象就可以了(真的有很多人完全不知道)。
“看说明书”就是这样的,即使全都看了,也不一定能全部看懂。不过,看了总比不看强,因为总有能看懂的部分……
在Python中,函数的参数有如下两种。
位置参数(Positionale Argument):在官方文档里常被缩写为arg。
关键字参数(Keyword Argument):在官方文档里常被缩写为kwarg。
在函数定义中,带有=的是设定了默认值的参数,这种参数就是Keyword Argument。其他参数则属于Positional Argument。
在调用有Keyword Argument的函数时:如若不提供这些参数,那么参数在执行时,启用的是它在定义时为那些Keyword Argument设定的默认值;如若提供这些参数的值,那么参数在执行时,启用的是接收到的相应值。
3、有关商和余数。比如20除以6等于3余2,这3就是商,而2就是余数。
总结
本节需要(大致)了解的重点内容如下——其实很简单。
你可以把函数当作一个产品,而你自己是这个产品的用户。
既然你是这个产品的用户,就要养成好习惯——一定要亲自阅读产品说明书。
在调用函数的时候,注意可选位置参数的使用方法和关键字参数的默认值。
在函数定义部分,注意[ ]和=两个符号就行了。
所有的函数都有返回值,即便它内部没有指定返回值,也有一个默认返回值None。
另外,一定要耐心阅读该函数的使用注意事项——产品说明书的主要作用就体现在这里。
知道这些就已经很好了!
这就好像你拿着一幅地图,你不可能一下子掌握其中所有的细节,但花几分钟搞清楚图例(Legend)总是可以的——知道什么样的线是标识公交车的、什么样的线是标识地铁的、什么样的线是标识桥梁的,知道“上北下南左西右东”,就可以开始慢慢研究地图了。
为了学会使用Python,你以后最常访问的页面一定是:
Https://docs.python.org/3/library/index.html
在一开始,你反复阅读和查询的页面肯定是这两个:
Https://docs.python.org/3/library/functions.html
Https://docs.python.org/3/library/stdtypes.html
对了,在读完这一节之后,你已经基本“精通”print()函数的用法了。
我的思考:
这一节的核心目的,不是让你学会写函数,而是通过一些例子,让你大抵学会“如何阅读官方文档中关于函数的使用说明”。请注意这个词——大抵。千万不要害怕自己在最初理解不全面。
其实我很喜欢笑来老师的这些鼓励,虽然说的可能也是实际情况,但是我更想认为是鼓励,因为就像笑来老师说过的,鼓励是很稀缺的资源,我们都很需要,虽然我知道我们现在开始学习这个必须有这么一个阶段,但是有人鼓励的感觉就是不一样。
在看这一节的过程中,前面大部分都是理解的,后面的一些慢慢的就感觉比较难了,但是不管怎么样,有关的所有的官方文档我还是只字不差的阅读完了,虽然我现在有很多还看不懂的,但是我就是一边看,有些需要的就查一下,就这样子持续下去,我相信我们以后阅读英文是自然而然的事情。