《自学是门手艺》学习摘录
前一段时间看《自学是门手艺》https://github.com/selfteaching/the-craft-of-selfteaching/,没看完。
最近发现又有个 xue.cn 网站,可以很方便的在线执行代码、打卡督促自己学习。目前使用 GitHub 账号登录,还送 30U 的学习时长(2019-12-20)。
PoW “工作证明”(Proof of Work)
没有自学能力的人没有未来。
习得自学能力的终极目标就是:有能力只靠阅读就能习得新技能。
“不是什么东西都可以从书本里学到的……” 这话听起来那么有道理,只不过是因为自己读书不够多、不够对而已。
费正清的剑桥中国史(The Cambridge History of China)
连阔如先生写的《江湖丛谈》
有自学能力的人,选择阅读 “有繁殖能力” 的内容;
没有自学能力的人,阅读只是为了消磨时光……
我把那些能给你带来新视野,能让你改变思考模式,甚至能让你拥有一项新技能的内容称之为 “有繁殖能力的内容”。
不要试图一下子就全部搞懂。这不仅很难,在最初的时候也完全没必要。
这点很重要!先学个大概的框架,然后一步步完善内容,先理清要点,再细化知识点。
别怕,无论说给自己,还是讲给别人,都是一样的,它可能是人生中最重要的鼓励词。
根据质数的定义,它大于等于 2,且只有在被它自身或者 1 做为除数时余数为 0。判断一个数字是否是质数的算法是这样的:
设 n 为整数,n >= 2;
若 n == 2,n 是质数;
若 n > 2,就把 n 作为被除数,从 2 开始一直到 n - 1 都作为除数,逐一计算看看余数是否等于 0?
从 2 作为除数开始试,试到√n之后的一个整数就可以了……
for x in range(2, n): if n % x == 0: print(n, 'equals', x, '*', n//x) break else: # loop fell through without finding a factor
注意:for...else 的用法。
所有的工具都一样,效用取决于使用它的人。
有思想,能解决问题,是另外一门手艺 —— 需要终生精进的手艺。
int('3.14') 会报错 “ValueError: invalid literal for int() with base 10: '3.14'”,int( )只能转化纯数字的字符串,int('3.0') 也会报一样的错。
在计算机上,浮点数字的精度总有极限。1.1 + 2.2 != 3.3
标示一个字符串,有 4 种方式,用单引号、用双引号,用三个单引号或者三个双引号。
使用 xue.cn 在线的 JupyterLab 发现一个 Bug,就是在
首行
使用 print('\nabc') 类似的代码时,运行后的显示结果会把 '\n' 的换行省略掉,结果和 print('abc') 一样,但是,使用 Anaconda 自带的 JupyterLab 就不会出现这个问题。用三个单引号或三个双引号标示字符串的时候要
注意
:
'''
Simple is better than complex.
Complex is better than complicated.
'''
与
'''Simple is better than complex.
Complex is better than complicated.'''
不一样,第一个的前后是没有换行标志“\n”的。
字符串还可以与整数倍操作符 * 操作,'Ha' * 3 的意思是说,把字符串 'Ha' 复制三遍.
字符串常量(String Literal)是不可变有序容器,对于列表这种可变容器,我们可以对它进行操作,结果是它本身
被改变了。
创建空集合的时候,必须用 set( ),而不能用 {}。
同时得到有序容器中的元素及其索引,那么可以调用 enumerate(sequence, [start=0]) 函数.
sequence -- 一个序列、迭代器或其他支持迭代对象。
start -- 下标起始位置。
zip( ) 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,这样做的好处是节约了不少的内存。如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 zip(*zipped) ,可以将元组解压为列表。
第一遍囫囵吞枣,用个正面一点的描述,就是 “为探索未知领域先画个潦草的地图”。
“只字不差地阅读” 是所有自学能力强的人都会且都经常使用的技能。
“就算读不懂也要读完” 的更高境界,是 “就算不明白也要先记住”。
第一遍囫囵吞枣之后,马上就要开始 “总结、归纳、整理、组织 关键知识点”
的工作。
小时候经常听到母亲念叨,“怕麻烦!那还活着干嘛啊?活着多麻烦啊!”
不管怎么样,先用起来,反正,研究透原理,不可能马上做到,需要时间漫漫。
不听老人言,吃亏在眼前。
学霸(好学生)的特点之一就是 “老师让干啥就干啥”,没废话。
Python 中有一个概念叫 PEP,Python Enhancement Proposals,必须找时间阅读,反复阅读,牢记于心:https://www.python.org/dev/peps/pep-0008/ 到最后,你会体会到,这不只是编程的事,这种东西背后的思考与体量,对整个人生都有巨大帮助。
第一查询对象只能是官方文档。
Order of Arguments:1.Positional 2.Arbitrary Positional 3.Keyword 4.Arbitrary Keyword
lambda 的语法结构如下:lambda_expr ::= "lambda" [parameter_list] ":" expression
先写上 lambda 这个关键字,其后分为两个部分,: 之前是参数,之后是表达式;这个表达式的值,就是这个函数的返回值。注意:lambda 语句中,: 之后有且只能有一个表达式。
这种 “通过先想办法验证结果而后从结果倒推” 的开发方式,是一种很有效的方法论,叫做 “Test Driven Development”,以测试为驱动的开发。
刻意思考哪儿需要刻意练习
这东西能用在哪儿呢?
找活干,是应用所学的最有效方式,有活干,所以就有问题需要解决,所以就有机会反复攻关,在这个过程中,以用带练……可以退而求其次,看看 “别人想出什么用处没有?”
把一切都当作手艺看的好处之一就是心态平和,因为你知道那不靠天分和智商,它靠的是另外几件事:不混时间,刻意思考,以及刻意练习 —— 其实吧,老祖宗早就有总结:天下无难事,只怕有心人……
对很多人来说,阅读的难点在于起初的时候它总是显得异常枯燥。
有自学能力的人,不怕枯燥 —— 因为那本来就理应是枯燥的。这就好像人生本无意义,有意义的人生都是自己活出来的
一样,有意义的知识都是自己用出来的 —— 对不用它的人,用不上它的人来说,只能也只剩下无法容忍的枯燥。
面向对象编程(OOP),是使用对象(Objects)作为核心的编程方式。进而就可以把对象(Objects)的数据和运算过程封装(Encapsulate)在内部,而外部仅能根据事先设计好的界面(Interface)与之沟通。
在 Class 的代码中,如果定义了 __init__() 函数,那么系统就会将它当作“ Instance 在被创建后初始化的函数”。这个函数名称是强制指定的,初始化函数必须使用这个名称;注意 init 两端各有两个下划线 _。
变量名前面加上一个以上下划线(Underscore)_ 的话,那么该变量是 “私有变量”(Private Variables),不能被外部引用。
装饰器一定要学会
—— 因为很多人就是不会。
规则表达式(Regular Expressions,通常缩写为 Regex)是最强大且不可或缺的文本处理工具 —— 它的用处就是在文本中扫描/搜索(Scan/Search)与某一规则(Pattern)匹配(Match,即,与规则一致)的所有实例,并且还可以按照规则捕获(Capture)其中的部分或者全部,对它们进行替换(Replace)。
目前(2019)网上最方便的 Regex 测试器,是 https://regex101.com/。
Backus-Naur Form(BNF,巴科斯-诺尔范式)和 Extended Backus-Naur Form(EBNF)
当然,会自学的人运气一定不会差。
在自学这件事上,失败者的死法看起来千变万化,但其实都是一样的…… 只不过是因为怕麻烦或者基础知识不够而不去读最重要的文档。
自学的一个重要技巧就是:把那些很难的任务无限拆分
—— 直至每个子任务都很小,小到都可操作为止。
“上下文无关文法”(Context-free Grammar)
写程序的主要工作量,往往并非来自于在编辑器里敲代码那个阶段。更多的工作量,其实在于如何才能在脑子里把整个流程拆解清楚,考虑到各个方面……
事先想不清楚的,就不要去做。
绝大多数人的自学能力,基本上都是被 “自己的感觉” 耽误掉的。
“刚需幻觉” 的根源在于:你不会的东西,对你来说感觉上就不是刚需。
当面对一项新技能的时候,“觉得并非刚需” 肯定是幻觉。因为一个技能到底是不是刚需,在掌握它之前是不知道的……
在决定学任何东西的时候,最好不要去咨询身边的人 —— 除非你确定对方是高手,最好是自学高手。
要学,想学,那就自顾自去学吧,用不着征求别人的意见!
一切的技能都是刚需。
为了真正做到刻意练习,更重要的是需要不断地进行刻意思考 —— 刻意思考自己究竟应该在哪些地方必须刻意练习?
总有一天你会明白的,一切的 “学会” 和 “学好” 之间的差异,无非是全面程度的差异。
多读几本书。狠一点,就是多读很多本书。
教是最好的学习方法。
“学然后知不足,教然后知困。知不足,然后能自反也;知困,然后能自强也。故曰:教学相长也。”
尽快开始整理归纳总结,一定要自己动手去做……
当我们看到另外一个人正在做什么的时候,镜像神经元会尽力给我们足够的刺激,让我们 “体验” 那个人的感受。
人与人之间有很大的差异,最大的差异来自于性格养成,大多数人会沦为表现型人格,只有少数人才会在不断调整中保持、呵护、进一步培养 “进取型” 人格。
想尽一切办法让孩子见识到拥有那个技能的,令他产生羡慕情绪的人 —— 只要孩子羡慕那个人,他就自然而然地有 “我也想这样” 的想法,到最后,谁都拦不住。这就是镜像神经元的力量。
这就是榜样的力量!
如果一个人能做出像样的东西来,那么他身边的聪明人密度无论如何都会比其他人的高出很多。
无论学什么,都要想尽一切办法尽快做出自己的作品。做一个产品出来的过程中,会磨练另外一项自学者不可或缺的能力和素质:完整
地球上有效社交密度最高的地方,是 Github
。Github 能成为地球上最大的有效社交网络,没毛病,因为用作品社交肯定是最高效的。
只有这样,你才是个值得被交往的人。
没有什么是不能自学的。
能 Google 出答案的问题,就不需要去麻烦别人,这也是一个自学者的基本素养。
提问的智慧:https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/master/README-zh_CN.md
好奇心是好东西,而且是必须认真呵护的东西 —— 几乎最重要、最强劲的自学动力,都混合着好奇心出现并持续。注意力漂移不是能杜绝的现象,但必须在关键时刻有所应对……把 “全面完整” 放到最高优先级。
早些年,我跟很多人一样痴迷于电脑这个东西,也跟很多人那样,用 Windows 惯出来了坏毛病 —— 动不动就重装系统…… 重装系统很浪费时间的,但那时也不知道为什么总是忍不住去干那事,哪怕有些小毛病,马上就受不了,弄的好像重装一个干净的操作系统会让自己的世界焕然一新一样。
再后来就明白了,这绝对就是自己的毛病 —— 做事不分轻重。
@#¥%……&,很多年前,我也这样,现在症状略有减轻,还没痊愈。
做中学(Learning by doing)是效率最高的学习方式,也是最用有趣的方式。
自学的时候,注意两点:1、掌握学习路线;2、用对学习方法。
爱奇艺里面的 千峰Python经典课程1.5~2倍速观看加跳过,快速看完全部内容,这使我有了一个对编程,甚至软件有了一个全方位的认识。
第一遍刷完 xue.cn 的《自学是门手艺》,里面90%的练习代码我都敲过,运行过;习题也全部做完了。二刷 xue.cn 上的《了解计算-Python零基础》,需要动脑的练习全部做完。三刷 pythonbasics.org 里的exercises,现在练习到 Virtualenv虚拟环境搭建了。同时,学习李俊老师的音频支线课程:JupyterLab ;Github;Markdown 等。
熟悉并掌握 Github 语法及操作,在 Github 上 fork 感兴趣的项目,创建自己的主页 blueeyezhy.github.io;PowerShell 语法,操作,环境变量的设定;使用 VS Code 书写 md 文件和代码; Sublime 的使用和特点。也简单了解了 MySQL 的结构和语法。
所有的门槛和障碍,都是你成长的垫脚石。
在你还没有确定自己值得讲、别人值得听的内容的情况下,就去学习如何制作幻灯片,在我看来完全是浪费时间。
输送价值观
在求知的领域里,分享得越多,进步越快,且社交有效性提高得更多。
谁能持续研究谁就可能更先成为专家。
总结:
你一定要想办法启动自学,否则你没有未来;
你把自学当作一门手艺,长期反复磨练它;
你懂得学、练、用、造各个阶段之间的不同,以及针对每个阶段的对应策略;
面对 “过早引用” 过多的世界,你有你的应对方式;
你会 “囫囵吞枣”,你会 “重复重复再重复”,你深刻理解 “读书百遍其义自见”;
以后你最擅长的技能之一就是拆解拆解再拆解;
你用你的拆解手艺把所有遇到的难点都拆解成能搞定的小任务;
自学任何一门手艺之前你都不会去问 “有什么用”,而是清楚地知道,无论是什么只要学会了就只能也必然天天去用;
你没有刚需幻觉,你也没有时间幻觉,你更没有困难幻觉,反正你就是相对更清醒;
不管你新学什么手艺,你都知道只要假以时日你就肯定能做好,因为所有的手艺精湛,靠的只不过是充足的预算;
你知道如何不浪费生命,因为只要不是在刻意练习、不是在刻意思考,那就是在 “混时间”;
你总是在琢磨你能做个什么新作品;
你刻意地使用你的作品作为有效社交工具,也用作品去过滤无效社交;
你乐于分享,乐于阅读也更乐于写作 —— 因为这世界怎么帮助你的,你就想着要怎样回报;
你把全面和完整当作最高衡量标准,也用这个标准去克制、应对自己的注意力漂移;
你会不断自学新的手艺,因为你越来越理解单一技能的脆弱,越来越理解多项技能的综合威力;
你越来越依赖互联网,它是你最喜欢的 “书”,而 Google 是你最好的朋友 —— 他总是能帮你找到更好的老师;
偶尔,你会学会没人教、没人带、甚至没书可参考的手艺,别人都说你 “悟性” 高,可你自己清楚地知道那其实是怎么回事;
你越来越明白,其实没什么 “秘密”,越简单、越朴素的道理越值得重视;
你发现你用来思考的时间越来越多 —— 准确地讲,是 “琢磨”…… 只不过是因为你真会琢磨了 —— 你很清楚你应该花时间琢磨的是什么。
下一步干什么?
最先应当做的是,去检查一下自己的 “突击” 的结果,去 Pythonbasics.org 做做练习https://pythonbasics.org/Exercises/
除了我在这里介绍的之外,请移步 The Hitchhiker's Guide to Python,它更为全面:https://docs.python-guide.org/
【Python 必读书籍】
无论学什么,一本书肯定不够,以下是学习 Python 的基本必读书籍:
The Python Tutorial
The Hitchhiker's Guide to Python!
Think Python: How to think like a computer scientist
Automate the Boring Stuff with Python
Effective Python
Python Cookbook
Fluent Python
Problem Solving with Algorithms and Data Structures using Python
Mastering Object-oriented Python - Transform Your Approach to Python Programming
更多 Python 书籍:https://pythonbooks.revolunet.com
千万别觉得多,只要真的全面掌握,后面再学别的,速度上都会因此快出很多很多……
Awesome Python 的链接:https://github.com/vinta/awesome-python
【2019年12月28日后记】
花了 9 天时间把《自学是门手艺》读完,弄懂了一些 Python 的概念,更多的是调整了学习的心态,或者说更新了世界观。
反观我的成长学习经历,较强的自学能力对我的帮助也是很大的,书中提到的很多方法和我的不谋而合。
对于编程也是出于兴趣爱好,上大学的时候指法的练习是在那种用 5 寸盘启动机器,运行一个叫“TT”的指法软件练成的,虽然不当打字员,但是受益颇深。
第一个程序是本科毕业论文,使用 Turbo C 完成一段热力计算。指导老师是上海交大毕业的谢博士,看到他给我们的范例程序,惊叹于他的函数的英文版帮助文档和代码格式的规范,由衷的佩服。
读研的时候(2000年),和同学一起用 Lotus 开发办公自动化系统,赚到了人生第一笔开发费:¥2000元。那时候也是边学边做,常常通宵编代码,有时候困到打字的时候一暂停就会睡着。
后来工作中,陆陆续续做了一些项目,基本上都是通过项目驱动学习。开发过ASPX网站、桌面数据库、地理信息系统、信息管理系统、Solidworks建模、Photoshop美工、HTML与CSS前端,基本上需要什么就学什么,而且很多小项目基本上是从前期方案论证,写技术文档,编制预算,到后面的编程、美工、测试都一个人完成。
学习,兴趣是最好的老师,成就感是最大的驱动力,哪怕这个成就只是给自己看。
下图是我在xue.cn的打卡。