温智全的博客

Elvin wen's Blog

写在前面

范峥老师从 Golang 的依赖管理的历史和演进过程讲起,详细的阐述了 go mod 的工作原理并讲述了一些常用工具和方法,紧接着,通过几个 case 让我们直观的了解到实际工作中可能遇到的问题及其解决方案。

Golang 工程和依赖管理基本机制

Golang 管理机制的演进

第一代:GOPATH

阅读全文 »

我们都知道记忆其实是大脑中神经回路的形成,分为短期记忆和长期记忆,通过重复我们可以把短期记忆变为长期记忆,艾宾浩斯遗忘曲线大家肯定也不陌生,费曼学习法是耳熟能详,今天看了一篇文章,提到了一些其他方式,感觉比较新奇,和大家分享一下:LTP 增强法,狮子记忆法

  1. LTP 增强法主要有三点:
  • 调动好奇心,让自己兴奋和期待,激发θ波,当θ波出现之后记忆效率会提升 十倍,我们平时应该也有这种感觉,背不感兴趣的课文很困难,但是背同样长度的歌词却轻松得多;
  • 用情绪波动辅助记忆,当我们快乐的时候记忆力会更好,莫扎特的音乐可以提升学习效率也是因为可以让人快乐,此外在记忆时带入情绪也可以让我们记得更牢,比如秦始皇公元前 221 年统一六国,死记硬背是比较困难的,但是如果我们想象一些秦始皇统一六国时坐在龙椅上是多么自豪,一下子就记下来了
  • 减少压力,压力会抑制 LTP(长时程增强作用),降低记忆效率,当我们压力大的时候可以坐直,深呼吸来降低压力
  1. 狮子记忆法:
  • 饥饿激素可以促进海马体产生 LTP,提升记忆力,而饭后血液会流向胃部,大脑供血效率降低,所以吃饭前饥饿时更适合学习,所以最好饭前学习而不是饭后学习
  • 走动或者坐在行驶的车上可以促进产生θ波提升记忆力,对于这点我表示存疑,因为没有实际的例子可以说服我相信这个说法。
  • 降低温度可以提升身体的危机感,促进血液循环,从而提升记忆力,这点相信我们都经历过,当温度比较高时我们会觉得很舒适而导致不想思考或者思考变慢

除此之外,睡觉其实也是帮助我们整理记忆内容的好方法,把学习内容划分为一个一个小步骤,分阶段循序渐进的学更能加深我们的印象,当我们掌握了某种能力,再去学习类似的能力时更加容易进行能力迁移,所以学习最好的方式是先提升自己擅长的能力,扩大优势,然后在学习新知识的时候进行能力迁移。

说在前面

陆老师今天的课程从 GC 的发展历程讲起,渐次讲解了垃圾回收的流派以及基础的垃圾回收方法,从而引出 Golang 的 GC,向我们讲述了 Golang 垃圾回收的特点与触发时机,最终为我们简述了一些编程过程中可能使用到的工具和指标,帮助我们更快的找到和分析问题。

GC 基本理论

GC 的发展从 1959 年的 Lisp 语言就开始了,他所做的事情其实就是把需要程序员手动申请和释放内存这件事情自动化了,解放了程序员的生产力,能够用更多的精力放在业务代码上而不是去关心内存,经历了几十年的发展,GC 也变得越来越完善,功能也变得越来越强大了。

阅读全文 »

说在前面

饶老师从一个故事讲起,引出了调度器的概念和 Golang 的调度器模型,并深入的讲解了 Golang 的循环调度的实现和抢占式调度的实现,不禁令人感叹,Golang 的循环调度为我们的岁月静好负重前行。

循环调度的建立

所谓对 goroutine 的调度,实际上就是指 Golang 程序代码按照内置的一些算法,在运行时动态的选择合适的 goroutine 放到 CPU 上去执行的过程, 其本质是通过保存和恢复 CPU 寄存器的值达到切换 goroutine 的目的。

阅读全文 »

说在前面

云浩老师这门课程中,从引入 Golang 本身数据结构对多核性能使用不足的场景讲起,然后由并发安全问题讲起,阐述了解决并发问题的通用方案,并基于此,提出了有序链表的并行化方案,由猜想到验证一步一步引导我们实现一个在多核场景下 scalable 的数据结构,由浅入深,令人印象深刻。

并发安全问题

并发安全问题,表现为对一个变量发生更改的同时有另一个线程对同一个变量进行了读写,导致产生了不可预知的行为,也叫 data race

阅读全文 »

说在前面

冯敏老师从一个不加锁并发修改导致出现问题的例子讲起,用最佳实践匹配我们工作中的实际场景,提出一些避免踩坑的建议,从而引出锁的进化和原理。

最佳实践

减少持有时间

缩小临界区,注意 defer 的使用

通过缩小临界区的方式,可以避免在加锁和解锁之间,由于有较为耗时的代码,导致锁持有时间过长,从而造成性能问题,例子如下:

1
2
3
4
5
6
7
8
9
10
var Users = map[string]string {
"user": "password",
}
var mu sync.Mutex
func CheckUser(name, password string) bool {
mu.Lock()
defer mu.Unlock()
realPwd, exist: = Users[name]
return exist & realPwd == password
}

乍看之下这段代码是没有什么问题的,但是如果代码像下面这样

1
2
3
4
5
6
7
8
Func SomeFunc() {
// do sth
mu.Lock()
defer mu.Unlock()
...
...// long code
...
}

如果 defer 之后的代码特别耗时,那这个 mu 锁的时间就会非常长了,会拖慢整个程序的速度。

阅读全文 »

所谓基本功,即为我们日常工作中的专业技能,比如程序员的编码能力、系统设计能力,产品经理的文档能力、产品设计能力,销售的推销能力等,为什么说要苦练呢?因为练习基本功是一个长期持续,可能伴随着重复和枯燥的过程,热血上头坚持几天不是什么难事,难就难在长期坚持,不断缓慢的提升自己,正所谓“合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下”,就像我之前提到过的,坚持做重要不紧急的事情,可以让最终的效果达到 120% 甚至更高。苦练,不仅仅是一个形容,更是一个要求,我们都知道人最喜欢的事情就是得到快速的即时反馈,但是我们在练习基本功的时候往往无法得到即时反馈,所以才会很难坚持,才会很苦,为了跨过这个苦,我们需要设立长期目标和短期目标,长期目标是让我们有一个被指引的方向不至于走岔路,而短期目标是让我们尽可能快的获得反馈,提升成功的可能性。

延迟满足感则是苦练基本功必须具备的素质,同时也是苦练基本功可以锻炼出的一种能力,两者相辅相成,相互促进。举一个学生时期的例子,我们做题的时候,如果一道题很简单,轻轻松松就做出来了,我们是不会有什么满足感和成就感的,但是如果是一道难题,我们费尽九牛二虎之力终于做出来了,那种满足感和成就感相信大家都曾经感受过,这就是延迟满足感。同样的,在我们工作过程中,如果总是做一些自己能力之内的事情,轻易的就完成了,那我们不但没有什么满足感,还会没有任何进步。如果我们能够去做一些要花比较大的力气才能做成的事情,甚至一些自己无法独立完成,必须和他人合作才能完成的事情,这样的成长和满足感足以让我们久久回味。就像我们的 OKR 一样,其实就是为了让我们可以再往上够一够,让我们的满足感更强烈一些,让我们的成长更快一些。

说在前面

本文提供了一些 Golang 工程项目的最佳实践,分别从可读性、健壮性和效率三个方面进行描述。

Readable

可读性对于机器来说其实没有什么区别,但是对于作为开发者的每一个来说,可读性就显得极其重要了。对于个人开发者来说,一个人不可能记住他写的每一行代码,很多时候我们自己写的代码,经过两三个月之后,我们基本上就会忘记当初写的逻辑,高可读的代码可以让我们更加轻易地进行阅读回忆;而对于协同开发来说,代码的可读性直接决定了多人合作开发的效率,高可读的代码可以让我们协作开发的效率得到巨大的提升,那么常用的代码中有哪些方式可以提升代码的可读性呢?

阅读全文 »

说在前面

我是加入字节之后才开始学习使用 Golang 的,在学习和应用这门语言的过程中,踩过很多坑,但是踩坑的同时也学习到了很多有用的知识和技巧。通过不断沉淀这些知识和技巧,我们能够更叫高效和保证质量的完成业务代码,避免造成不必要的损失。

建议大家都先去看一下 50 Shades of Go,里面涉及了 Golang 开发初期最容易踩得 50 个坑。

阅读全文 »

今天周年庆的仪式上,一鸣提到了他觉得方法论可以说是没有什么作用,抽象相当于在思维上加杠杆,是一种思考上的偷懒,并列举了一个“赋能、闭环”的例子来论证这个事。我部分赞同他的观点,但我还是觉得方法论是有其意义和使用场景的,在我看来,方法论其实是一种对日常工作工程中的经验模型的一种总结,可以帮助我们快速找到一个正确的方式来应对某些事件,比如做预案的时候,需要考虑到哪些方面的内容才能做到不缺不漏,需要联系哪些方向的同学进行共同处理,这些一点一点沉淀下来的经验我认为是一种有用的方法论,是有其实际意义的,如果没有这种方法论进行参考,下次做预案的时候又要重新去想类似的内容,还可能会有缺漏。当然如果只按照方法论沉淀下来的既定内容做事,就会出现一鸣说的“思考上的偷懒”这个问题,所以我们不仅仅要按照方法论做事情,还应该去思考这个方法论是不是适用于当前的环境,是否有更加优化的方式来进行实施,能否把当前的方法论再进行优化,这样方法论不仅能够避免犯一些人为的错误,同样也能够锻炼我们的思维,做到思考上不偷懒。

此外,我觉得方法论对于不同的人来说其实意义也是不一样的,对于已经有很多成熟经验的人来说,方法论可能会在一定程度上限制他的思想;但是对于小白或者首次经历做事的人来说,方法论可以指导他快速上手,有章法的做事,避免在并没有形成良好的工作习惯的时候犯下超过限制的错误。在框架内做事是能够防止犯大错的,总的来说方法论就像是一个框,在这个框里做事不容易犯错,但是无法做跳出这个框的事,当我们在这个框中已经形成了良好的习惯之后,我们却要敢于打破这个框,打破他的限制,让我们的思考和思想能够不断的发散,甚至于把这个框变得更大,限制更小,更加灵活。