My-Blog
My-Blog copied to clipboard
我的博客
这篇文章的写作背景来自知乎的这个问答 [zhh-2015在分布式系统和数据库领域研究水平和工程能力怎样?](https://www.zhihu.com/question/37426217/answer/556211870) 快奔四的老码农了,正好在休养期间,写篇长文如实回顾一下,年轻人看了也许会有点帮助吧。 工作、考研、成长、晋升、技术研究、创业、职业病都涉及了。 **从2006年讲起,分三个阶段:** 1. 2006年-2010年 _独立研究阶段_ 2. 2010年5月-2012年7月 _在淘宝工作的阶段_ 3. 2012年8月至今 _独立研究与创业阶段_ ## 1. 2006年-2010年 独立研究阶段 2006年以前做过4年的电信移动行业的应用项目,因为厌倦了做业务系统,想寻找方向,并且还攒了点积蓄,所以在2006年年初选择了辞职,走上了考研之路,复习了8个月后又发现读研不是自己想要的,刚好又迷上了编译器和程序语言理论,随后放弃考研,宅在家不工作,走上了兴趣驱动的自学之路,一直持续到2010年5月初。 这4年沉寂的时间阅读了大量技术书籍,下面这篇博文中提到的书名大多数都是在这段时间涉猎的: [想通过自学成为一个有良好计算机专业素养的Java程序员要读哪些书?](https://github.com/codefollower/My-Blog/issues/1) 书本上的知识自然是满足不了我对技术的饥渴的,因为最开始是痴迷编译器,加上2006年当时的SUN公司把Java语言编译器(Javac)和HotSpot VM都开源了,所以在补完了基本的理论基础后就很兴奋地去研究Javac的源代码了。 2007/2008年**Ruby On Rails**大火,Java社区感受到了前所未有的恐慌,当年的JavaEye论坛上一大片Java将死的言论,作为Java铁杆粉丝我自然是不服的,为了探索Java全栈web框架的新方向,进而转去研究Tomcat、iBatis甚至包括MySQL/PostgreSQL的JDBC Driver这类开源项目的代码。 经过几年书本和代码的狂轰乱炸,很自然的产生了把编译器用于应用服务器的想法,第一次品尝了我也能做技术创新的甜头,造了第一个纯技术的属于自己的全栈web框架,直到2009年的11月份,在JavaEye论坛首次发布了第一个原型版本并讲了一下心路历程,获得了不小的轰动,见下文: [Without SSH/JSP/Servlet,不走寻常路,Java可以更酷](https://www.iteye.com/topic/517796)...
1. **前提条件**: 需要有高中毕业的水准 (或者同等学历的也行,比如中专,我本人就是读中专然后再读自考大专的)。 2. **学习方式**: 完全可以自学,最好自己有电脑。 3. **偏重方向**: 偏重软件,而不是计算机硬件。 4. **英语要求**: 掌握3000个左右的常用单词,能读就差不多了, 如果不想看英文可以找中文翻译版的,我个人偏向看中文,对于非常好的书我通常中英文都买来看。 以下列出的书是按照循序渐进的方式介绍的, 都是我自学过程中学过的并且觉得不错的书, 计算机基础类的书籍与Java相关书籍的比例是5:2,所以非常强调基础, 核心书籍将近35本,预计需要花两年半时间左右, 别觉得书很少,能平均一个月完成一本算挺不错了,说明你在计算机方面有一些天赋。:) 另外,扩展阅读也有35本,这些可以选读。 (注:这是我12年来的自学生涯中特意挑选出来的书,如果当初就有人告诉我该这么自学我肯定会少走无数的弯路) ## 目录 1. 计算机基础类的书籍 2. Java相关书籍 3. 扩展你的眼界 ##...
2021年的关键词: **缺钱** ## 缺钱 这是从2002年正式工作以来最缺钱混得最惨的一年了,仅次于2001年。 去年帮朋友的忙参与了一个外包项目,加班做了两三个月,只赚了点辛苦费,还影响了数据库产品的研发进度,所以今年决定什么外包项目都不接,什么忙都不帮了,专心搞产品研发,工作收入为零。 原以为股票的钱在上半年能转点回来,结果一直到12月1号才转回来一笔钱,虽然晚了点,也是雪中送炭了,否则年都过不下去了。 前11个月一直很缺钱,所以从支付宝里借了3万块钱,用了10年的笔记本电脑老化了,用借来的钱花了4000多换了一台新的,还有一万给了家人。因为缺钱,测试用的电脑也买不起,所以严重影响了今年的研发计划,网站也没有钱上线运营。 ## 工作 2021年在 github 上面提交了716次代码或文档,其中 Lealone 提交了418次,发了5个 RC 版。 大的功能主要有4块: 1. 重新实现前端的 RPC 框架 [Lealone-JS](https://github.com/lealone/Lealone-JS),调用后端服务更方便了,还尝试定制了一下 vue 框架,在前端调用服务更加动态化、智能化,这些功能都是实验性的; 2. 数据库复制协议迭代到了一个新的阶段,改用轻量级锁和客户端冲突检测技术来实现,绝大多数操作都能在一个 RTT 内完成,延迟进一步降低;...
这是第四年在 GitHub 写年度总结了,每年固定在12月31号这一天专门准备几个小时用于写总结。 ## 前言 2020年很不平常,因为疫情影响了很多人,也是我20年来,春节期间待在乡下最长的一段时间了,足足待了两个月。一大家人住进了新起的房子里,本来是我家请客的,因为疫情也取消了,买了四桌的菜,6个大人加3个小孩吃了半个月,难得有机会跟家人相处这么久,也胖了10斤。 二月和三月,网上一片悲观的情绪,我倒是挺乐观的,因为看到乡下的生活水平在不断改善,不能因为短期的困难就否定一切。心态积极向上一点,别那么悲观,也许就会有好运呢,2020年对于我个人而言倒是挺顺利的。 ## 工作 因为前两个月在乡下闲着,今年工作从四月份才算正式开始。先是主动放弃了一个准备了半个多月的应用项目,虽然项目金额是做过的应用项目中最高的,但是这其中的关系太复杂,利益分配谈不拢,加上项目时间太短,不得不放弃了。 4-6月份还是专注于 Lealone 这个产品的完善。7月初合伙人在南宁接到一个项目,想让我过去一起做做,因为去年把积蓄花得只剩两万块的生活费了,为了赚点零花钱就答应做项目的技术顾问,做之前说好了每天花两三小时。不过,最后发现还是大意了,签合同前没有看到项目的代码,拿到代码后才发现是个巨坑,系统跑起来慢,没有多少有用的文档,连个完整的建表脚本都没有,得边读代码边点系统界面去了解业务流程,加班加点做了两个月才做完一块业务。为了不拖累自己的产品进度,不得不退出这个项目了,直到最近才听说这个项目快结束了。 9月中旬又开始回归到 Lealone 的开发工作上,主要聚焦在数据库和微服务一体化方向,对于改进应用开发效率有很大帮助。目前已经把一个老项目的 web 层和服务层用 Lealone 改造完了,最近一周还基于 Vue 和 Lealone 做了一个样板应用 [PetStore](https://github.com/lealone/Lealone-Examples/tree/main/petstore) ,后续还有一连串的应用项目准备用 Lealone 开发或改造。总之,Lealone 的商业应用从今年12月份正式开始了。 值得一提的是,今年下半年还开启了另一个产品方向:做一个在线开源代码学习网站。目前第一批开源项目有这6个:tomcat/spring、netty/vert.x、mybatis/h2,这些开源项目的代码在过去十年或多或少都看过,这一次阅读整理更有针对性了。网站目前还没上线,明年会花很多时间专注在这个网站的研发和运营上,这个网站的后端技术栈也一定会用...
已经连续三年在 GitHub 写年度总结了,就连标题的风格都一样。 2019年对于我很重要,也很顺利,甚至还超出预期。 ## 前言 10年前的2009年是我至今技术生涯**第一个超重量级的转折点**,2006年辞掉工作,靠着前面4年工作得来的积蓄宅在出租房里,全身心研究自己喜欢的技术,花了4年时间才有了一点小成果,直到[这篇文章](https://www.iteye.com/topic/517796)发出来后才被注意到,也因此被推荐去了阿里巴巴工作。 10年后的2019年,也是类似的经历,经过多年的技术研究与实践,7年前心心念念的数据库也做出来了,而且还全部开源。等到2029年回头再看时,**也许2019年会是我技术生涯的第二个转折点**。 ## 工作 本来今年的工作计划重点是完善 [Lealone](https://github.com/lealone/Lealone) 数据库,但是在年初的时候突发灵感想去做一个大一统的 SQL 引擎,用来统一解决 OLTP、OLAP、批处理、流程处这四个场景下的计算问题,所以2019年的前面8个月都转去做 [Bats](https://github.com/lealone/Bats) 这个新的 SQL 引擎项目了。 为了做 Bats 这个项目前期做了很多技术研究,最初以 Apache 的 Hive、Spark、Flink、Tez、[Drill](https://drill.apache.org/)、[Calcite](http://calcite.apache.org/)、[Apex ](http://apex.apache.org/) 作为研究对象,最后考虑到 Drill 和...
Lealone不是一个市场驱动的投机产品,我更愿意把她看成是我将数据库和分布式系统两个领域融合后,进行基础理论研究和探索的试验品。目前已经到第5代了,前两代总体上是失败了,我可以再次回顾一下。 ### 第1代 第1代仅仅是在HBase之上做分布式SQL引擎,当时我把H2数据库的单机SQL引擎改成分布式之后把HBase当成底层的分布式存储来用,同时用OMID解决分布式系统中与事务相关的所有问题,因为要依赖HDFS和ZK,整个架构涉及的组件太多,底层数据块隔得太远,对于索引的优化很难进行,挂了一个RS,可用性损失很大。 当然,因为HDFS已经帮你管理好数据块的副本问题了,这是好事也是坏事,好事是在HBase之上实现SQL和事务时都不用考虑多副本的问题,坏的一面就是我只能通过一个RS去读写某条记录,我想要更多的读写入口,做不到啊,所以HBase这种方案限制了很多想像力。 对于第一代失败的HBase尝试还是有收获的,比如让我学会了怎么把一条SQL重写后变成一条分布式SQL,让它能并行分发到HBase的不同RS上同时执行,当然,最重要的还是从OMID + HBase这种解决事务问题的方案中得到了新的灵感,让我找到了一个解决分布式事务问题的更好方案(这个就不展开了)。 ### 第2代 第2代的焦点是放在模仿Cassandra身上的, Cassandra那样的架构消除了HBase所有的问题,组件少,每个节点都可以直接读写并且使用的是本地文件系统,所以索引想怎么玩都行。我当时并没有在Cassandra的代码上改造,只是拿了gms/net相关的代码,然后在分布式SQL引擎和H2的MVStore单机存储引擎之间用DHT做sharding。 第2代的最大问题其实也是Cassandra的最大问题,用DHT做sharding只适合做一些简单的单key查询,要按sharding key进行范围查询只能给集群所有节点都发查询请求了,哪怕只是个小范围的查询如果不拆开成多条sql也只能这么干。 对于一个分布式数据库来说,改动DHT这样的sharding算法是伤筋动骨的,Cassandra现在你让它去掉DHT改用HBase那种全局有序range的方案那是要命的,虽然它也有类似range的方案,但那是不能改的,没什么用。还好第2代的失败尝试过程中,又让我找到了新灵感,弄出了一种解决副本强一致性问题的新协议。 ### 第3代 第3代摆脱Cassandra的思维定式后,就彻底解放了,脑洞大开,新的sharding算法不再像Cassandra那样放在SQL引擎和单机存储之间,而是下推到存储引擎内部,我引入了一种叫Leaf-Page-Sharding的算法,同时拥有DHT和range的优点。 第3代Lealone除了包含我原创的分布式事务模型、副本强一致性协议和Leaf-Page-Sharding算法外,当然还有其他很大胆的尝试,包括混合多种运行模式、全链路异步化、基于SQL优先级抢占、在对等架构中实现单表自增字段的全局有序单调递增(非常适合时序数据库的场景)。 ### 第4代 第4代Lealone,换用一个高大上的名字就是“自治数据库”,不过我并不想扯上机器学习,而是从数据库现有的算法和数据结构着手,怎么让它们变得更灵活更动态,比如我最近在试验的消除单机、replica set、 sharding三种模式的差异就是往自治这个方向走。 第4代Lealone,除了优化数据库内部的实现外,我还做了大量能改变应用开发模式的疯狂尝试,从前端到后端应用服务器、web框架、ORM框架,甚至小到连接池这种东西,我都把它们考虑在内,哪些适合放到数据库解决的就干掉,不适合的也给他们提供便利。 ### 第5代 第5代Lealone,新增了列锁、page粒度的混合行列存储、异步化无锁B-Tree、统一异步任务调度器这几个超重量级的特性。详情见: #22
大佬好,看到你之前有些过Web框架,想要学习一下
又到了每年的最后一天,以前很少写年度总结,去年写了篇流水账 [再见 2017,你好 2018](https://github.com/codefollower/My-Blog/issues/17), 再次读起来却也有点意思,以后每年年末尽可能都写一写,标题的风格都想好了: **再见 xxxx,你好 yyyy**。 去年许下的愿望是: 不再接任何项目、身体健康、把数据库产品做完,惭愧的是只有第一个愿望达成了。 ## 情感 今年前3个月谈了一次短暂的痛苦的恋爱,现在想来也算不上什么恋爱,毕竟是痛苦更多。 分分合合好几次,两个人若不合适,如果分了一次,就可能有第二次第三次,所以早分早好,不必迁就。 勉强在一起,不但影响心情还影响工作,最后可能还变成路人。 **这段短命的感情让我总结出了两条经验:** 1: 如果跟某位异性朋友认识了很多年,虽然彼此都单身,如果过去那么多年也没走在一起,那就别抱幻想; 2: 如果对方过去有一段很深刻的感情,如果你跟TA之间的情感远没有前段那么浓烈,能放弃就放弃。 ## 生活 3月份分手后,4月份在调节心情,5月份进入工作狂模式,6月18号早上起来又出现右脚背放射痛了,又像去年一样。下半年就跟个废人差不多了,无法正常工作,一直到12月1号都没什么好转,从12月2号开始决定彻底放弃工作,电脑都很少开了,每天要么躺在床上,要么背靠床头,看看书看看电视剧和电影。 不碰电脑了,这一个月反而好转了不少,去年也是痛了大半年后离开电脑骑了一个多月的自行车才好,今年发现骑自行车没用了,所以才试试别的办法,那就干脆卧床休息吧。吃药也没啥用,更不想去动手术,因为并没有严重到走不了路,就是无法长时间坐在电脑前,连续坐一小时都不行。 总之,2017/2018年生活质量都挺差的,也算是中年程序员的职业病了,都是自己作的。以后为了身体健康,再也不敢高强度的工作了,还是要劳逸结合。 ## 工作 整个2018年的有效工作时间可能累计都不到3个月,不过还是做了不少事。 5月份时阅读了[Ebean](https://ebean.io/)这个ORM框架的一些文档和代码,获得了一些灵感,也为我的Lealone数据库造了一个小巧的专用的[ORM/DSL框架](https://github.com/lealone/Lealone-Platform),还学了不少前端技术,把这个ORM/DSL框架移植到了前端,目前都还没有做完整,只是把常用的功能做了。 下半年有一个多月身体刚有一些好转,然后又拼命工作,把[Lealone-Plugins](https://github.com/lealone/Lealone-Plugins)项目更新了不少内容,包括支持第三方的网络应用框架、存储引擎,也开始支持MySQL协议和基本的SQL语法了。Lealone-Plugins项目下面的子模块也都没有达到生产级别,只是把基本的框架和最基础的功能做了,后续如果有人有兴趣可以接着完善。...
技术想法分享
此贴用于记录、分享日常工作中随时出现或已经实现的技术想法。 ### 目录: 1. [事务引擎 - 读时撤销算法](https://github.com/codefollower/My-Blog/issues/22#issuecomment-428974813) 2. [事务引擎 - 列锁](https://github.com/codefollower/My-Blog/issues/22#issuecomment-429372886) 3. [存储引擎 - 以 Page 为粒度的混合行列存储](https://github.com/codefollower/My-Blog/issues/22#issuecomment-428990178) 4. [存储引擎 - 异步并行化的无锁 BTree](https://github.com/codefollower/My-Blog/issues/22#issuecomment-430287766) 5. [Java语言 - 接口默认方法-多重继承](https://github.com/codefollower/My-Blog/issues/22#issuecomment-429174889) 6. [数据库 - 统一的异步任务调度器](https://github.com/codefollower/My-Blog/issues/22#issuecomment-431881552)
REPEATABLE_READ 这个事务隔离级别的含义是顾名思义的,简单说就是在同一个事务中对同一条记录的两次读取应该都能读到相同的记录,哪怕在这两次读取记录的过程中另一个事务更新了这条记录也不会受影响。 以 MySQL 5.7 举例说明,MySQL 5.7 的默认事务隔离级别就是 REPEATABLE_READ ``` sql mysql> select @@tx_isolation; +-----------------+ | @@tx_isolation | +-----------------+ | REPEATABLE-READ | +-----------------+ 1 row in set (0.00 sec) ```...