0%

首先这篇文章是建立在有一些编程基础之上来展开的,做为一种效率学习编程语言的自我总结输出。把编程语言当做一个工具,而这些不同种类的工具有很多的共通之处,抓住其中的关键之处可以大大提升学习效率,也是一篇自我总结的学习方法论,里面有的方法可能不适合我,但也会讲讲。如果要学习一门编程语言,先要问一下为什么要学?学会了能做什么?要达到什么样的目标?只有把这些问题想清楚了再去做,不然稀里糊涂不知所以,很可能半途而废。想明白了就要坚持去做,不要再东望望西看看,想、做、坚持三位一体是学到的基本三要素。

学习途径分析

网上的学习资料纷繁复杂,各种培训课程满网都有,那么大致分为以下几种吧:

总结来说学习路径是这样的。

  • 入门:适合通过看视频和培训来实现,然后通过搜索引擎和博客文章论坛协助解决遇到的各种问题。
  • 提高:通过看书和大佬的博客文章交流论坛等来加深理解。
  • 实践:实践也是提高的一种方式,可以通过学习别人项目来仿写实践。

适合学习或交流的地方,Stack Overflow、博客园、简书、GitHub、官方论坛等等。关于搜索引擎,入门用百度就可以了,提高和实践建议用谷歌。

指定计划

这个也挺关键的,我就没有做好,也不太好定。

查问题的办法

学习过程中很关键的一点就是遇到问题如何解决问题,解决问题的速度和方法很大程度上决定我们后期学习的进度和自信心,那么我总结了几条比较关键的要素说明。

学会如何看异常信息

不论写 demo 还是实际项目开发中,肯定会遇到一堆异常情况,然后控制台打印一堆杂乱信息,首先要做的是理清楚其中的信息结构,其实就是日志啦,大致分为以下几种:

  • DEBUG:一般在开发调试期间开启,可以比较清楚的了解程序在运行过程中的各种状态和传参等。
  • INFO:正常运行日志信息,当程序访问量很大的情况下很多,会收集到日志系统。
  • WARN:对于程序可能出现的潜在问题的地方记录信息,或者不再支持的方法或库等。
  • ERROR:对于程序运行中的非预期异常访问、状态、请求需要记录错误信息和错误状态。
  • TRACE:这个在不同语言表的可能不同,主要是概括为带有调用堆栈信息的异常日志。

那么在测试过程中为了快速定位问题,还是要打印 TRACE 级别的异常日志,那么异常信息如何看呢?

Python 的异常信息示例

1
2
3
4
5
6
7
8
9
10
11
12
13
xyz-macdeMacBook-Pro:dev-demo xyz$ python mixin_demo.py 
Init people.
People can eat!
People can drink!
People can
Traceback (most recent call last):
File "mixin_demo.py", line 44, in <module>
people = People()
File "mixin_demo.py", line 39, in __init__
print "People can ", self.sleep()
File "mixin_demo.py", line 30, in sleep
raise NotImplementedError(u"can't sleep.")
NotImplementedError: can't sleep.

在执行 Python 脚本的时候执行异常报错,Traceback 是我们要看的异常堆栈信息,自顶向下从 "mixin_demo.py 的 44 行开始执行,执行到 mixin_demo.py 第 30 行报错,异常类型 NotImplementedError,异常内容为 can't sleep.。也就说我们看到报错信息后,然后可以看到对应报错的位置以及调用链,方便快速定位到问题。

Java 的异常结构展示顺序有点不同,它的信息最底部是调用入口,然后向上一直到报错点,还有报错信息也在上面。这里只是一个简单的示例,通常 Java 的异常堆栈信息很长,调用链很深,这就需要有一定的经验来判断问题实际产生的原因。

1
2
3
4
5
6
7
8
9
10
objc[20307]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/bin/java (0x1077344c0) and /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/lib/libinstrument.dylib (0x10874d4e0). One of the two will be used. Which one is undefined.
Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'teacher2' available
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:775)
at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1221)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:294)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
at org.springframework.beans.factory.support.CglibSubclassingInstantiationStrategy$LookupOverrideMethodInterceptor.intercept(CglibSubclassingInstantiationStrategy.java:290)
at com.noogel.xyz.lookup.GetBeanTest$$EnhancerBySpringCGLIB$$e79f57a6.getBean(<generated>)
at com.noogel.xyz.lookup.GetBeanTest.showMe(GetBeanTest.java:5)
at LookupTestMain.main(LookupTestMain.java:9)

使用IDE断点调试

IDE 可以帮我们做很多事,大大提高了我们的开发效率,那么如何用好这样一个工具也是很关键的,这里说一下利用 IDE 进行 debug 调试。

通过上图我们可以看出 IDE 的调试功能很丰富,如果用好对于提高学习编程效率很有帮助。

查问题打日志

在 Python 中有一个查问题很好的利器 iPython,可以很方便的直接传参执行函数,对于线上问题,这样虽然很方便但是不可取。像 Java8 这样版本下的语言又没有很好用的一个工具,那么可以通过打日志的方式来操作,需要对可能的问题点分析然后增加日志辅助判断,打日志是一个很合适的查线上问题的方式。

向有经验的人请教

老师傅一出手就知有没有,如果遇到问题没有思路或者自己憋住了,需要及时向有经验的人请教,才是一个正确的选择。

了解框架的运行机制

俗话说『打铁还需自身硬』,遇到了问题总不能一直向别人请教吧,还是要自己去搞定的,上面的介绍的方法搞不定怎么办,那就要平时花心思在使用的框架上学习了,因为你不可能直接裸写代码的,一些轮子直接搬过来用固然高效,但是不懂构造轮子还是用不好的,容易出问题,所以要平时多去积累了。

以上讲的都是一些可以提高学习效率的方法。先写这些,后续想到新的再继续更新。

实践一个项目

一般视频和图书的最后一部分都会有初级的实践项目,可以用来综合练习一下所学到的知识。可以看完再自己提需求自己实现一遍。

再有就是 GitHub 上有很多,不过要好好找找合适,可以拿来练手,最好是找一些多 star 的项目,对于技术提升很有帮助,发现问题还可以提 issue 交流,然后提 PR 解决。

另外一个就是某某公司意外泄漏或者开源的项目源码,这些都是经历生产环境反复验证的代码,具有很高的参考性。

举个例子就是在 Java 中 spring MVC 是一个很著名的项目,那么学习它,有的人就手敲 spring 项目,边学习边实现其中关键的代码。GitHub 地址:https://github.com/code4craft/tiny-spring

了解语言的技术栈

学习一门编程语言肯定是用来解决实际问题或找一份工作的,那么你要知道并不仅仅是学习这门编程语言,而是整个技术栈。了解一个语言的技术栈可以去招聘网站上看,一般都会写至少需要精通一门编程语言,熟练使用 MySQL 解决并优化问题,熟练使用并了解各种 MQ 原理等等。那么这些都是需要去了解的,起初学习可以为了用而用的去实践一个更完整的需求。

比如说我需要了解公司的微服务架构,那么我需要看它都用了哪些技术栈,然后自己再手敲一些项目,并且 docker 化,自动注册服务发现来管理多个 RPC 服务等等。。。

总之,一个是多看多实践多思考,然后就是多交流,闭门造车是不行的。

了解语言的运行机制

语言的内存模型?
语言的并发模型?
语言的垃圾回收机制?

基本概念

一个事务在进行数据变更时对另一个事务产生的可见性影响描述,表达为 脏读、幻读、不可重复读三个概念。下面具体解释下对应概念。

  • 脏读:当前事务能够读取其它事务未提交的数据。
  • 幻读:当前事务中在前后两次相同查询中读取的数据不一致,原因在第一次查询后第二次查询前提交了数据产生的。(侧重于插入了新的数据)
  • 不可重复读:当前事务中查询相同的范围数据,同一数据的内容发生了变化。(侧重于数据的更新)
    基于这三个现象描述,主要因为 MySQL 设置的隔离级别不同导致的。

ACID特性

  • 原子性(Atomicity),一个事务中的所有操作要么全部成功,要么全部失败,不能只成功一部分。
  • 一致性(Consistency),从一个一致性状态到另一个一致性状态的转换。(一致性和隔离性保证了数据的一致性)
  • 隔离性(Isolation),一个事务在提交之前对其它事务是不可见的。
  • 持久性(Durability),一个事务一旦被提交就会永久的保存到数据库中。

InnoDB中的事务隔离级别

  • 未提交读(Read Uncommitted),允许脏读,也就是可能读取到其他会话中未提交事务修改的数据。
  • 已提交读(Read Committed),只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别。
  • 可重复读(Repeated Read),在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻读。
  • 串行化(Serializable),完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞。
隔离级别 脏读(Dirty Read) 不可重复读(NonRepeatable Read) 幻读(Phantom Read)
未提交读(Read uncommitted) 可能 可能 可能
已提交读(Read committed) 不可能 可能 可能
可重复读(Repeatable read) 不可能 不可能 可能
可串行化(Serializable ) 不可能 不可能 不可能
1
SELECT @@tx_isolation;

查询 InnoDB 的默认隔离级别是 RR,按照四种隔离级别的关系来看是会出现幻读情况,但实际上 InnoDB 引擎下的两次查询是一致的,那么它是帮我们解决幻读了吗?

1
2
3
4
5
6
7
8
9
10
11
//设置read uncommitted级别:
set session transaction isolation level read uncommitted;

//设置read committed级别:
set session transaction isolation level read committed;

//设置repeatable read级别:
set session transaction isolation level repeatable read;

//设置serializable级别:
set session transaction isolation level serializable;

MySQL是如何解决幻读的?

  1. 在可重复读隔离级别下,普通的查询是快照读,是不会看到别的事务插入的数据的。因此,幻读在 “ 当前读 ” 下才会出现。
  2. update 语句的修改结果,被之后的 select 语句用 “ 当前读 ” 看到,不能称为幻读。幻读仅专指 “ 新插入的行 ” 。

产生幻读的原因是,行锁只能锁住行,但是新插入记录这个动作,要更新的是记录之间的 “ 间隙 ” 。因此,为了解决幻读问题, InnoDB 只好引入新的锁,也就是间隙锁 (Gap Lock) 。间隙锁和行锁合称 next-key lock ,每个 next-key lock 是前开后闭区间。next-key lock 可能会导致同样的语句锁住更大的范围,这其实是影响了并发度的,在 RR 隔离级别下,两个是事务同时锁住一个不存在的值,之后进行插入操作会引发死锁,因为间隙锁之间并不会冲突。如果设置成 RC 隔离级别的话间隙锁就不存在了,同时需要解决对应的数据和日志不一致问题,需要把 binlog 格式设置为 row 。

参考:

https://www.cnblogs.com/likui360/p/9632641.html
https://en.wikipedia.org/wiki/Isolation_(database_systems)#Phantom_reads

夏天来了,大半夜热的睡不着,最近看过一本书《极简主义》,罗列一下其中的观点,以及作用到生活中的尝试。

首先来引述原文介绍下什么是极简主义:

极简主义是一个工具,我们用它来获得人生的满足感。极简主义中没有规则。确切的说,极简主义只是去除生活中那些无关紧要的事物,从而使我们能够专注于最重要的东西——而它们事实上根本就不是实物。

这并不是它的定义,而是说明了从极简主义带给我们什么,让我们从杂乱的生活中抽离出来,让我们舍弃对于我们不那么重要却又不想割舍的人际关系或事物,专注于重要的事情中去。读这本书的起因是前一段时间对于工作和生活感到很沉重,工作一天带着疲惫身体回家后,面对堆满杂物的宿舍,心情更加烦躁,每天纷繁不断的微信消息偷走了大量的时间。每天都很忙,却又觉得并没做什么事情,睡觉的时间也越来越少。

当我意识到现在的问题,恰好在豆瓣看到这样一本书,下载下来读了一遍,对于书中的部分观点还是比较认可的,便有意识的改变自己的生活方式。这里作出改变只是在生活上,对于工作还是那样,甚至我认为工作是反极简主义的,就像书中的作者是辞去工作开始的极简主义实践。其中有很多讨论我并没有太在意,也是不适合我当下去作出改变,下面只是按照一条实践过的线去聊。

首先,是什么让我们感到不够快乐,让我们感到压力呢?作者确定了一个叫做『锚』的概念,代指我们想要的得到的大房子、高薪、物质财产、公司奖励等,这些欲望占据着我们,给我们带来压力。试想一下如果我们已经拥有或者舍弃掉这些,也许会轻松很多,可以有更多的时间精力专注于我们喜欢的事情上,让人生过得更有意义?好像我现在也无法做到舍弃。如果这个⚓️给你带来太多负担,那你是要舍弃了,而这里我所能做的不是上面那些,下面慢慢说。

首先我们要使人生有意义的五大价值明确:

  1. 健康
  2. 人际关系
  3. 热情
  4. 成长
  5. 奉献

这本书后面的章节也是在围绕着五个主题来开展说明的。这本书有个特点就是并不想书名那样极简,而是在不断赘述一些观点,以加强这些观点在读者心中的印象吧。

作出改变,如果你只是一味在想而没有实际付出行动的话并没有任何作用。首先是必须要作出改变,改变永远不会太迟,你需要的只是在知道该怎么做了之后付诸行动。这点很重要,所以作者也是提前说明。这里推荐去看拖延症相关的知识。

下决心总是困难的。而拖延却很简单——至少拖延一时很简单。但拖延得不到任何回报。

打包派对,打包你大量的闲置物品,保留生活中常用的,然后扔掉、转卖或捐赠。对于闲置物品不仅占用了你的空间,还浪费你的精力,平时你也想不起来用它,然后又要找半天,在生活如此便利的今天,你可以舍弃很多无用的东西了。还有注意不要囤货,日用品很容易买到,你就把楼下的便利店当做你的免费仓库好了。东西要少而精。推荐看一下《怦然心动的人生整理魔法》、《断舍离》还有日剧《我的家里空无一物》。看完书的当周我便清理出了几大袋子暗藏在屋里角落的无用物品,实际上在之前看书的时候就有意识的清理丢弃无用的东西,只是后来没做好,看来要周期性清理一番。

健康,这个老生常谈,却总被人忽视,没有健康,你连生活中最简单快乐都无法享受。这里我一直做不好的就是没能去改变熬夜的习惯。健康的从广义上来讲有以下几种:情绪健康、心理健康、精神健康、财务健康、身体健康等。这里只针对身体健康来讲,分为两个方面,饮食和锻炼。饮食上并没有去尝试改变,因为自己本身很瘦。而锻炼作出了一些,在这之前总是说要去健身房健身,却总是懒的去,读完这本书后努力去作出改变,从跑步开始,因为我觉得跑步是最容易开始的锻炼,现代科技带给人们很多的便利性,借着小米手环的帮助开始了每周三次的夜跑,精神状态也慢慢好转。另外说一句是跑步要是一件技术活,推荐看一下《运动改造大脑》、《跑步圣经》这两本书。平时多看看书还是有好处的,当你尝试作出改变的时候也是能知道如果改变。

讽刺的是,锻炼实际上给了你更多时间,而不是把时间夺走了。它不光能延长寿命,对我个人而言,它还让我跟我最好的朋友建立了更紧密的联系。当我一个人锻炼时,它又给了我独处的时间,留给自己的时间,而我们都知道这是很重要的。锻炼是一种意想不到的帮你重获时间的方式。

人际关系,你的人际关系有你的亲人、朋友、同事、配偶、恋人、室友等。人际关系处理这块是弱项,需要认真🤔一下。

建立关系的三种办法:

  1. 寻找超棒的新人际关系;
  2. 改造你现有的人际关系;
  3. 改变你自己。

必须要牢记的是:你的人际关系在你往后的人生中并不是固定不变的。随着年龄的增长,会有不同的人走入或走出你的生活,而他们与你的关系的重要程度也会改变。许多十年前与你关系紧密的人现在已经不再亲密了,对吧?同样,你未来的人际关系也会继续变化、成长。因此,在这个过程中积极行动就很重要。你主动选择自己的人际关系,而关于前两档人际关系的调整,往往要作出很艰难的抉择。
你唯一能改变的人是你自己。当你以身作则时,与你走得最近的人,往往也会跟着效仿。

断掉网络,这点对我的改变应该说是关键性的。每天下班回家都会有家人和朋友发来各种微信消息,填充了我整个晚上的时间,使我并没有一段固定且连续的个人时间了,也就导致我对于当下缺少反思,活在网络的世界中。还有各种 APP 新闻推送,一刷就停不下来的短视频等,我们的时间被大量的占据,这也是痛苦和拖延的关键,也是一个很重要的⚓️。然后我做了一些改变。

  1. 开始清理📱中那些功能重复的 APP,比如获取热点新闻微信足够了,我对时效性又没有那么高。
  2. 各种短视频 APP,这些起初我觉得有学到东西才装的,但是却背离了初衷,成了娱乐工具,然后果断卸掉。
  3. 还有各种能用微信小程序替代的常用 APP 基本都卸掉了。
  4. 有些保留了,QQ 被我用 Tim 替代,有些不得不看的群内容我也是订好提醒,每周看一周的内容。无关紧要的推送都被我禁掉了。
  5. 还有最重要的一点是每天非特殊情况下执行断舍离计划,晚上 10 点到 11 点断网一小时,感觉这个世界突然安静了起来,可以专心想和做一些事了。

这里多说一句,网络依赖确实像一种上瘾的症状,而且现在绝大多数人都是这样子,这个还是要从自身开始尝试摆脱这种依赖,呼吁身边的人同样去改变,我们的生活应该会有很大的改变。

认知,认知是我们最宝贵的自由。前几年我们一直在讲认知升级,确实,这就是一种让我们获得自由的方法。这里推荐去看《见识》这本书,不再多说。

回到最初,极简主义是一个工具,这个工具使我们摆脱那些闲杂冗余,从而更容易过上有意义的生活,这个工具使充斥着无尽装饰、看起来错综复杂的世界变得更简单、更容易、更真实。


第二天早起接的🐰主子,来自主子的凝视 qwq…