• 2021-09-04

    记一次关于系统性能的有趣讨论

    Views: 14680 | No Comments

    有个同事问我:"你开发的分布式数据库系统, 如何避免 scan 扫描操作返回了 pending 事务状态的数据?"

    我说:"把数据扫描出来, 然后逐个判断过滤掉 pending 状态的数据."

    我感到奇怪, 对于他的问题, 解决方案非常显然啊. 解决方案非常直观, 兵来将挡水来土掩, 我相信他也能想到, 不想要的数据当然要剔除掉, 否则呢? 那么, 他的问题的点在哪?

    没错, 他接着问了:"我 scan 的时候只想返回 key, 但是, 要判断状态, 是不是还得去读取 value 解析出状态信息?"

    我当时是黑人问号脸:"当然要知道状态信息才能根据状态过滤呀, 不然呢?"

    他终于祭出了那个经典的让人哭笑不得的问题:"读取 value, 是不是性能会下降啊?"

    Continue reading »

    Posted by ideawu at 2021-09-04 10:29:04
  • 2021-08-07

    程序设计核心原则: 直观

    Views: 6419 | No Comments

    好的代码应该是直观的, 简单的. 直观就是"所思就所写", 想的是什么样就要把代码写成什么样子, 不要七拐八绕.

    例如, 在做结构设计和流程设计时, 我们分析出某个功能流程应该这样做:

    先做步骤1, 然后做步骤2.

    什么是程序设计? 程序设计就是流程, 是串行化, 是先后顺序. 所以, 文档设计完毕之后, 必须写下这样的代码:

    step1();
    step2();
    

    Continue reading »

    Posted by ideawu at 2021-08-07 09:41:49
  • 2021-07-27

    程序员的必备品质

    Views: 2896 | No Comments

    1. 判断力

    在开发复杂系统时, 有判断力(决断力), 懂得去选择简单正确的架构和方案, 先把系统做出来. 大部分的程序员并没有这种思考决断能力. 如果让他们自己做决策, 他们会陷入思维混乱, 面对多个选项时优柔寡断. 几乎每一次内心将要下决断, 都会被"性能优化"思想给驳回.

    2. 持续改进能力

    虽然大部分程序员没有开发一个完整系统的能力, 但是, 仅仅用最简单的方案把系统做出来, 还不是终点. 只要方案足够简洁, 第一版一般能满足短期需求, 也许不能满足. 但业务的发展要求系统必须持续优化和升级, 这就要求程序员持续投入体力活优化系统. 大多数的优化, 就是不断地增加几个判断, 多封装几个类. 系统的维护和改进, 大部分是体力活, 程序员如果不具备耐力和恒心, 将会很快放弃.

    Posted by ideawu at 2021-07-27 21:31:49
  • 2021-07-23

    复杂软件系统开发的第一原则: KISS

    Views: 4847 | No Comments

    俗话说:

    Keep It Simple, Stupid!

    由于大部分新手程序员在从学生转换成为工程师之前, 都经过所谓的"算法"编程训练, 特别是不少人还主动进行大量的"刷题"行为, 因此, 对"性能"的追求被潜移默化地植入了所有程序员的基因, 这就造成了程序员往往把细节上的所谓性能优化放到第一优先的位置.

    这种片面追求细节性能, 从而缺少大局观的思维, 其实是非常错误的. 比如 C++ 程序员, 几乎把性能优化等同于减少内存拷贝和无锁(lock free), 认为内存拷贝等于性能差, 认为加锁等于阻塞, 因此, C++ 程序员的代码主要在语法和语句层面上做优化, 逻辑非常别扭. 这种观念是非常落后的, 没有大局观, 这种程序员的技术视野极其狭窄.

    根据我多年的软件开发经验, 我想针对那些认为"性能最重要"的程序员, 表明一个事实: 所有的代码层面性能优化, 必然以增加逻辑分支, 增加更多的 Indirection 作为代价.

    什么意思呢? 也就是说, 所谓的性能优化, 必然会在代码里增加 if 分支, 增加新的类, 从而造成代码行数膨胀, 类的数量变多, 类的交叉调用关系变得更加复杂混乱. 这些后果都是非常负面的, 甚至无法抵消减少1%内存拷贝带来的性能提升.

    Continue reading »

    Posted by ideawu at 2021-07-23 21:44:28
  • 2021-04-11

    大型互联网企业需要什么样的数据库系统?

    Views: 4200 | No Comments

    我们先看看, 早期小型公司是如何使用数据库系统的. 找来几台运行 Linux 操作系统的虚拟机, 部署几个 MySQL 进程, 配置一下主从同步.

    当公司业务发展壮大, 一是业务的深度加深, 也即同样的业务数据量增加, 二是业务的广度增加, 也即做了更多的功能和产品. 为了适应业务发展, 不得不部署更多的 MySQL 进程. 管理这些进程本身就是一项繁杂的工作, 这时, 就需要引入所谓的运维系统了. 运维系统首先是信息系统(MIS), 其次是操作平台(管理后台).

    运维系统本身的开发, 就是一个软件工程. 业务发展得越大, 运维系统就会越庞大. 这时, 所谓的公有云平台出场了. 国内比较有名的云平台有阿里云, 腾讯云, 国外有 AWS.

    那么, 是不是所有的企业都会使用公有云服务呢? 公有云服务确实越来越流行, 但至少对于大型互联网企业, 甚至是中型的互联网企业, 依然不会选择公有云. 有功能覆盖上的考虑, 有成本的考虑, 更重要的是商业上独立自主的发展权的考虑.
    Continue reading »

    Posted by ideawu at 2021-04-11 23:25:53
  • 2020-05-10

    Golang chan 避免死锁

    Views: 10612 | No Comments

    Golang 的管道(chan)无论是否有缓冲, 生产者和消费者不可能做到速度完全匹配, 一旦管道满了, 就相当于生产者直接调用消费者. 如果生产者和消费者使用同一个锁, 就是死锁了.

    所以, 一个重要的原则就是, 在写管道之前, 把所有可能的锁 unlock 掉.

    Posted by ideawu at 2020-05-10 22:28:28
|<<<123456789>>>| 1/15 Pages, 86 Results.