- 博客(11)
- 资源 (4)
- 收藏
- 关注
原创 DDD 到底是银弹还是垃圾
每过一段时间,就会有人跳出来批判 DDD,这东西到底是垃圾还是银弹?在某某公司干活的时候,有一批人声称要用 DDD 改造老旧系统,彻底解决核心流程规模化之后,项目难以维护的问题。之前某篇文章里的这张图,就是在用 DDD 做项目重构之前的烂摊子:大家都很聪明,聪明到最后没人知道这新需求到底该往哪里写了。架构师们聚在一起学习 DDD 精神,产出学习报告,大半年过去,终于出了一些成果,有些子项目完成了用 DDD 进行的重构,年底可以拿来在酒会上邀功了,这下我们跟上了业界业务开发的主流方法论,可喜可贺,可喜可
2021-12-02 15:57:50 346
原创 Go 1.17 的调用规约
Go 1.17 修改了用了很久的基于栈的调用规约,在了解 Go 的调用规约之前,我们得知道什么是调用规约。x86 calling convention,简单概括一下,其实就是语言对于函数之间传参的一种约定。调用方要知道我要把参数按照什么形式,什么顺序传给被调用函数,被调用函数也遵守该规范去相应的位置找到传入的参数内容。老版本的 Go 的参数传递图我们已经在很多很多地方见过了,这里贴一个我之前画的:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8Pum18rH-16304
2021-08-31 20:53:15 317
原创 Go 语言的信号式抢占原理
从 Go 1.14 开始,通过使用信号,Go 语言实现了调度和 GC 过程中的真“抢占“。抢占流程由抢占的发起方向被抢占线程发送 SIGURG 信号。当被抢占线程收到信号后,进入 SIGURG 的处理流程,将 asyncPreempt 的调用强制插入到用户当前执行的代码位置。本节会对该过程进行详尽分析。抢占发起的时机抢占会在下列时机发生:STW 期间在 P 上执行 safe point 函数期间sysmon 后台监控期间gc pacer 分配新的 dedicated worker 期间
2021-07-26 17:08:47 439 1
原创 Go 语言中的一些不太常见的优化
这次去 Gopher China 和不少老朋友见了个面,还有不少在微信上认识已久,一直没见过面的网友。同时也和各个公司的一线开发们聊了聊,互相交流了彼此使用 Go 时的一些心得和痛点。综合近期了解的一些相关分享,我把到目前为止见到的,不那么常见的,各方对 Go 的优化和 hack 集中在这篇文章里。因为考虑到一些公司情况比较特殊,所以本文中列出的点就不标记是哪个公司做的了。未来他们觉得时机成熟应该也会自己出来做一些分享。网络方面当前 Go 的网络抽象在效率上有些低,每一个连接至少要有一个 gorout
2021-07-10 14:01:14 262
原创 消息队列能解耦?骗你的
有一个观点已经被说烂了:使用 MQ 可以帮助业务系统解耦。想法很简单,在业务状态流转时,如果没有 MQ,那么其它系统想要知道状态变了,那就需要核心流程系统去主动做通知。比如电商系统里订单从创建到处理中状态切换了,客服系统需要知道,风控系统需要知道,用户系统也需要知道。这里的通知通过 RPC 来进行,下游系统需要的数据可以在这次 RPC 里携带上,也可以在请求的时候让下游系统自己去查。下游系统增加的时候,核心业务的代码也需要修改,比如新做了一个积分系统,现在订单状态流转积分系统也想知道。核心系统
2021-05-30 17:23:56 257 3
原创 在业务系统中寻找技术含量
从进入互联网公司开始工作起,每个人都在问自己,CRUD 到底有什么技术含量?别觉得 CRUD 只是业务工程师的问题,无论你在写什么程序,基本上都是在和数据打交道,除了读就是写。只不过读写的时候还会附带一些领域相关的行为。比如:编译器:读文本,做 parse网络程序:读连接,decode,encode,写连接数据库:从磁盘上读,从内存里读,向磁盘里写,向内存里写工程上,谁也没有权力鄙视谁,你觉得领域的技术含量高,只不过是领域内的工作做的人少罢了。不管门槛多么高的工程领域,只要工程师红利们蜂拥而至,总
2021-05-09 21:41:03 74
原创 程序员必备画图工具
偶尔讲讲工具,放松一下。现在写技术文章不但要写技术细节,图还得画的好看。对于表达思路和架构来说,图确实挺直观的,这篇文章介绍一下常见的绘图工具。大家可以看自己的喜好自行选择。在早期写 golang-notes 的时候,想要向那些写 RFC 文档和早期的 unix 大神们致敬,所以比较喜欢 ascii 图,这种图的好处是你可以直接将图表内嵌在文档内部,不需要有附件。有利于单文件传播。用来画 ascii 的图工具有不少。textiktextik 是一个在线项目:https://textik.com,可
2021-05-09 16:55:52 2542
原创 Google 是怎么解决长尾延迟问题的
The Tail at Scale,是 Google 2013 年发表的一篇论文,大规模在线服务的长尾延迟问题。要知道怎么解决长尾问题,先要理解长尾延迟是个什么问题,在开发在线服务的时候,我们都知道要关注服务的 p99/p999 延迟,要让大部分用户都能够在预期的时间范围内获得响应。下面是一个不同响应时间的请求数分布图:大部分系统也都遵循这种分布规律,现在互联网的系统规模比较大,一个服务依赖几十上百个服务的情况都是有可能的。单一模块的长尾延迟会在有大量依赖的情况下,在服务粒度被放大,《The Tai
2021-05-09 16:42:09 739
原创 plan9 assembly 完全解析
众所周知,Go 使用了 Unix 老古董(误 们发明的 plan9 汇编。就算你对 x86 汇编有所了解,在 plan9 里还是有些许区别。说不定你在看代码的时候,偶然发现代码里的 SP 看起来是 SP,但它实际上不是 SP 的时候就抓狂了哈哈哈。本文将对 plan9 汇编进行全面的介绍,同时解答你在接触 plan9 汇编时可能遇到的大部分问题。本文所使用的平台是 linux amd64,因为不同的平台指令集和寄存器都不一样,所以没有办法共同探讨。这也是由汇编本身的性质决定的。基本指令栈调整int
2021-05-09 16:33:36 846 1
原创 工程师应该如何学习
只要一日自诩工程师,就没有办法放弃学习。本文不算是技术文,只是介绍一些个人的学习方法和经验。如果很多点你已经做到并且做好,一笑了之便可。阅读书籍对于工程师来说,从书籍得来的知识是必不可少的。现在很多年轻的程序员会从网络博客来学习技术,但博客内容大多缺乏体系(主要说总结性质的博客内容),不系统。很多博主为了掩饰自己的未知,遇到不知道的关键点就一笔带过,进而导致缺失。即使原作者非常努力,内容上没有缺失,你能从中获取的也只是别人总结好的知识,没有自己的主动思考,这中间便缺少过程式的沉淀,一味地满足于背诵别人总
2021-05-09 16:28:44 314
原创 线性时间复杂的洗牌算法
昨天在wiki上看到的线性时间复杂度的算法,把他用代码实现出来了函数里的shuffle_func2具体参见这里http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle以下代码帖到你的编译器里,可以看到两种算法明显的效率之差了。[code="C++"]#include #include #include #incl...
2010-10-03 20:06:06 114 1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人