Week Log Entry No.1

尝试开始每周日记录和反思自己这一周的生活和思维。这里将会记录我自己的成长,碎碎念还有一些我认为值得记住的东西。

Mindset

这一周的情绪和状态进入了低谷期。应该是最近生活太不规律的缘故,导致每天早上起来经常萎靡不振。每天早上起来收拾好自己的状态做到电脑前,总会产生一股莫名烦躁的情绪,这种情绪来源于我对目前所做的事情的感觉,无意义感和迷茫感。这周最开始的一两天是情绪低迷的巅峰,以至于这样的消耗极大影响了我的精神状态,疲惫感在不到十一点就席卷全身。

其实刻意的去分析一下这个现象产生的原因,我认为有以下几点:

  • 生活不规律导致精神状态难以掌控,更容易受其他因素的影响
  • 网上冲浪看到了很多负面信息
  • 和别人对比产生焦虑、急躁的感觉
  • 我的卧室没空调😭...每天热到我窒息,坐着汗滴往下掉

精神状态的好坏决定了我克服外界阻力的能力的强弱。我觉得应该赶紧做一些调整,每天加入冥想训练15min并且养成十一点睡觉的习惯。保证自己的精力在最好的状态。

这周也看了很多关于未来职业的负面信息,这些东西是现实没错,但我觉得过于提前全盘接受这些负面能量很大的信息会导致自己没有办法辨别未来的方向,产生焦虑感和迷茫感。做事就会觉得没有意义。所以,保持一颗燃起来的内心还是很重要的,也应当尽量避免过度带入这些负面信息的情景,做好自己当下应该做的事情。

关于学习环境,这确实没得说...家里的空调安在客厅,开到22度都没办法对我的卧室温度有什么显著的改善。每天写代码或者玩游戏,我就感觉在卧薪尝胆,汗珠子一颗一颗往下掉,我还暗暗咬牙坚持...就差来个刻苦奋斗的音乐了🥲。

这周的后面几天也逐渐通过阅读和及时反思自己的状态慢慢调整了,虽然熬夜的习惯还是没彻底改过来...

Fitness

这周一次力量训练也没有做。回来没有买健身卡,想着在家应该能练。我还是低估了高楼层的温度了。空调开了基本没有任何效果,还是我太懒了😭,这种汗流浃背我根本扛不住。想要做一个卧推只能躺床上,如果这样的话床会湿一大片...

只有周六晚上在外面走了5.5km,只有这一天运动圆环是闭合的。健身这块严重不达标。

Entertainment

这周和还留在身边的两个朋友聚了一聚,一起看了新上映的《封神》还有《孤注一掷》。《封神》说实话特效方面还是希望加强一下,对于剧情来说不做评价,本身就是图个乐子,对封神榜这类故事也不是很了解。《孤注一掷》最近比较热门,讲了被骗去缅北然后诈骗的事情。男主用的是ubuntu系统和python写脚本😂,因为没有当上CTO愤怒离职,离职前还搞了一波emoji恶搞。整体来讲故事挺平淡的,没有实实在在能引起情绪上的共鸣。后面的抓捕环节显得很仓促。也许是我看了很多电视剧的原因,感觉现在的电影节奏都好快。

看完电影去撸了烧烤,啤酒加烧烤还是相当快乐的。

第二天又一起去吃了肯德基,蹿稀套餐实锤,让我直接疯狂星期六了。

Music in this week: Everyone Who Falls in Love - By Cian Ducrot

Learn

Paper:

  • The Log-Structured Merge-Tree
  • BigTable: A Distributed Storage System for Structured Data

这周阅读的paper是谷歌当年的大作之一BigTable,是一个分布式的闭源存储系统。Paper简单介绍了数据模型,API,组建还有系统实现。在组建部分,GFS用来存储日志和数据文件(GFS是很久以前阅读的论文了,记得是6.824第二课要求阅读的,完全忘记讲了什么,下周回顾一下);SSTable存储BigTable的数据,这是对LSM-Tree的工业级应用;还用了一个叫做Chubby的分布式锁服务,在单机情况下我理解为数据库的Lock Manager,用于中心化的管理锁和分配锁(算法内部还需要一致性协议来实现)。

周内开始了对LevelDB的理解和学习。看了很多讲解的很棒的博客,可以让我对LevelDB的架构有一个很初级的认知,先mark在这里:

LevelDB称为level的原因是:它存储的模型是分层的,逐级增大的。内存里有一个跳表实现的memtable用于加入key-value数据,当memtable溢出时会触发后台的minor compaction或major compaction,逐级的将数据固化到磁盘。由于LevelDB是基于LSM-Tree的思路实现,因此适合写多读少的场景。

Books:

  • DDIA: part of Chapter 3
  • Database Management Systems: Chapter 17 Transaction
  • Critical Thinking: Self-Understanding

DDIA第三章关于检索做了介绍。其中我认为不错的点是,采用哈希作为索引结构,查找时间复杂度为,可以说查询速度相当快。但为什么不在磁盘上维护哈希索引而是使用LSM-Tree呢?原因是哈希索引如果维护在磁盘,需要涉及大量的随机磁盘I/O,这是很影响读写性能的。因此哈希表必须维护在内存中,然而当面临大量数据和崩溃恢复问题上,哈希表的构建和插入速度将会收到影响。LSM-Tree采用了追加的方式,这样可以充分利用顺序写速度远快于随机写的特性,增大磁盘I/O。

有关B+Tree和LSM-Tree,B+Tree的读取十分迅速,但LSM-Tree由于维护了多层SSTable,一级读取不到则需要从磁盘读下一级,读性能无法与B+Tree媲美。但B+Tree的写效率没有LSM-Tree的高,是因为它要维护树平衡、处理节点的分裂合并。

最近打算做15-445的p4,需要实现事务并发。因此阅读了数据库管理系统第17章,主要了解了事务的ACID特性还有可串行化的概念。对于接下来的实现,最重要的莫过于隔离级别了。隔离级别分为四种:串行、可重复读、读已提交、读未提交。隔离级别越高,串行化越高,执行得到的结果越严格,但并发性能会严重降低。隔离级别越低,并发性能越高,但得到的数据会不同程度的不一致。工业界一般默认使用读已提交的隔离级别,满足绝大部分场景的需求。还有一种隔离是快照隔离,这里涉及到多版本并发控制(MVCC),做的事情就是执行一个事务时复制一个当前数据的快照,事务在这个快照上处理,不受其他事务的影响。

Coding:

这周没有在一些项目上花时间,而重心放在了Leetcode上。开始刷leetcode的第一周。做了一些常见的动态规划类题目,2sum(哈希优化),3sum(排序+双指针)。不得不说动态规划做的真是头皮发麻🤯,做这么点下来总结的经验是:首先先考虑如何定义dp数组还有dp[i]的i的意义;然后考虑最小的问题的解;开始遍历dp数组,不断的扩大dp解的规模得到最后的答案。值得品味的一句话:大多数算法解决问题时做的都是遍历,问题在于我们如何利用已知信息聪明的遍历

愿望:以后每天能完成一道leetcode。