本文最后更新于2019年12月28日;如遇问题,请留言及时通知站长。

前一段时间看《自学是门手艺》https://github.com/selfteaching/the-craft-of-selfteaching/,没看完。
最近发现又有个 xue.cn 网站,可以很方便的在线执行代码、打卡督促自己学习。目前使用 GitHub 账号登录,还送 30U 的学习时长(2019-12-20)。

截屏2019-12-2221.46.03.png

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的打卡。
xue.cn