design

现代C++的内存模型和高性能的多线程编程

本文有 12812 字,大约需要 32 分钟可以读完, 创建于 2019-11-04

内存模型是现代C++语言标准里面的一个经常不太为人重视的特性;这种忽视大概是由于大部分的程序员关注的还是核心语言特性或者库设施这样的一些比较实用的“硬特性”。 相对而言,内存模型这样的底层的概念和机制看起来更像是给面向程序库编程的底层程序员用的。 然而如果我们想追求极致的应用程序性能,又想追求可移植性、高性能这...

Google的新操作系统Fuchsia的内核设计

本文有 15492 字,大约需要 38 分钟可以读完, 创建于 2019-10-06

传说中的Google的下一代操作系统项目Fuchsia一直处于“犹抱琵琶半遮面”的半公开状态,只是它的代码早就开源出来一段时间了,多有人猜测它是不是下一代的大杀器,将来会通吃目前的Android和Chrome OS生态圈;然而官方的说法却一致是含糊不清。 由于最近的一些政治事件引起的余波,技术圈又有不少人讨论这个...

reduce-cpp-template-overhead

本文有 17976 字,大约需要 44 分钟可以读完, 创建于 2019-10-04

新的C++语言标准的演进越来越强调静态编译(即运行期计算)的优势,因为这一发展方向无疑更贴合现代的C++语言Zero Cost Abstraction的目标; 可惜这样做有个非常明显的副作用就是给编译器带来了巨大的挑战,乃至于稍微复杂一点的项目也动辄需要数个小时才能编译完成。

微服务开发:C++语言是否真的不适用?

本文有 6356 字,大约需要 15 分钟可以读完, 创建于 2019-10-01

微服务架构模式是当今炙手可热的企业软件架构范式,经过最近几年的广泛的讨论和优缺点争辩之后已经随着 云原生架构 的逐渐火热而日益呈现星火燎原之势。 抛开这些争论不谈,假设我们需要实现一个微服务架构的服务,是否该用C++语言或者是否能用C++语言呢?

实现领域驱动设计

本文有 16609 字,大约需要 41 分钟可以读完, 创建于 2019-02-23

领域驱动设计在最近几年里越来越多地走进了主流架构设计的中心舞台上来了,这一切其实似乎是在业界精神领袖Martin Folwer在 他的《企业软件架构模式》一书和各种各样的讨论中的推荐之下之后忽然就火了起来。 甚至有一种说法是:如果学完了设计模式之后感觉没有什么用武之地,那么你需要去好好看一下Eric Evans写...

读Uncle Bob新书-Clean Archtiecture

本文有 14506 字,大约需要 36 分钟可以读完, 创建于 2019-01-26

不经意发现Bob大叔出版了新书,延续之前的命名风格定名为《Clean Architecture》,英文版已经于2017年底正式上市; 刚好公司的账户可以访问Orielly公司的在线书城,于是就断断续续地读了起来。 Bob大叔讲故事的能力即使在久负盛名的技术作家圈里面也是闪耀出众的,可以算作是高手中的高手,行文由浅...

标准化和生产环境就绪的微服务

本文有 13999 字,大约需要 34 分钟可以读完, 创建于 2018-05-20

微服务作为一种分布式的软件架构风格几乎已经席卷软件开发的各个角落;尽管它从被明确提出之后也很快经历了大量的质疑、批判乃至否定; 然而背后实践这一符合康威定律的简单(将问题分而治之)而又复杂(需要解决服务本身引起的的许多复杂的基础设施问题)的架构风格的组织却与日俱增。 其原因也不过是随着云计算技术的逐步深入,分布式...

云原生应用

本文有 7596 字,大约需要 18 分钟可以读完, 创建于 2018-04-26

云原生应用试图从思想层面对我们编写和发布软件的方式来一次深刻的革命;这一设想其实是基于目前的大部分云计算平台上运行的应用都是从传统的非云平台环境上移植过来的。

Spring新版本的响应式编程

本文有 10857 字,大约需要 27 分钟可以读完, 创建于 2018-04-04

流式编程在微服务架构风格越来越流行的背景下日益引起开发者的关注 (前文有一些简单探讨) ,新的Java语言规范加入了流的概念从语言库上添加了对FRP的支持。 Spring最新的5.0版本更新也顺应这一潮流,加入了原生支持FRP的行列。

函数式反应式编程

本文有 14372 字,大约需要 35 分钟可以读完, 创建于 2018-03-10

流式编程或者响应式编程则是一个不断进入我们视线的设计概念;它采用声明式编程范式,并将数据流和数据更新的处理作为程序运算的核心。 由于函数式编程本身即强调声明式编程,这使得用函数式编程的语言或者工具来实现响应式编程更自然清晰, 一般人们将二者的结合称为函数式反应式编程或者FRP。 FRP最早可以追溯到微软和耶鲁的两...

HTTP/2和gRPC - 微服务时代的应用基础协议

本文有 14050 字,大约需要 35 分钟可以读完, 创建于 2018-02-10

大部分的规模较大的商业应用软件后端系统如今都采用了分布式软件架构,并沿着SOA -> 微服务 的路径在往前演进;并按照领域驱动设计的绑定上下文的设计思路来切分服务; 服务之间的接口则不约而同地选择了HTTP协议作为基本的交互协议,背后的原因很大一部分应该来自于HTTP协议简洁、清晰的设计(尽管功能非常复杂)...

从API网关到服务网格

本文有 6201 字,大约需要 15 分钟可以读完, 创建于 2018-01-20

API网关是微服务结构中的一个重要的边界组件,用于隔离外部用户和内部的服务部署,完成诸如安全、鉴权等集中化的功能。 边车代理则是服务网格架构中的一个重要概念,两者从逻辑上都是作为基础设施和业务的核心功能逻辑相分离的,有一定的相似性而又有很大的不同。

Kafka的设计为什么高效

本文有 7578 字,大约需要 18 分钟可以读完, 创建于 2017-11-18

Kafka这一孵化于LinkedIn的开源项目正得到越来越多组织的关注和使用;其优雅的设计和对实时性处理的探索有很多值得学习的地方。 本文试就个人学习过程中的一些思考和理解来分析为什么Kafka可以兼顾可靠性、一致性和尽可能强的实时处理能力。

数据访问与管理技术的演进

本文有 10153 字,大约需要 25 分钟可以读完, 创建于 2017-09-24

数据访问和管理是软件设计需要解决的一项非常关键而又基础的问题;从早期的大型Unix应用开始,到基于C/S架构的商业应用, 乃至在互联网大潮中取得压倒性优势的基于B/S架构的企业应用,对于如何管理、访问、保存、检索、备份、维护数据这一基本问题, 无数先辈们创造了丰富多样的技术选项,然而随着行业潮流的变换,不同的技术...

架构服务化的一点思考

本文有 5256 字,大约需要 13 分钟可以读完, 创建于 2017-08-29

微服务是个非常热门的话题,最近几年随着互联网的深入演进和云计算的逐渐普及,几乎所有的公司、技术社区、组织都是言必谈微服务; 似乎没有微服务都不好意思说自己能保持技术能力的与时俱进了。这厢微服务还没有完全在实践中铺开,那边潮头Amazon又挑起了无服务器架构的大旗,引来无数人的关注。 本文试图对这些概念和架构思想做...

TCP服务端socket会丢连接的诡异问题及思考

本文有 4564 字,大约需要 11 分钟可以读完, 创建于 2017-07-14

最近在跟踪项目的性能测试的过程中,发现了一个奇怪的问题:Netty服务器端新建的Channel的数目比Tcpdump抓包得到的经历过三次握手成功的连接数要少: 总有几个连接从抓包来看成功,然后Netty并没有为其分配Channel。直观上来看,似乎是Netty的处理问题值得怀疑,似乎是用于接受新连接的线程池堵塞了。

Excessive null checks in Java Defensive Programming?

本文有 7218 字,大约需要 18 分钟可以读完, 创建于 2017-06-27

最近在参与某开发小组的团体代码审查会的时候,发现组内的一线开发工程师对于何时应该做空指针检查并没有很清晰的认识;然而这在Java社区里早已经是个老生常谈的争论 。

Kotlin语言之变量约束设计

本文有 5309 字,大约需要 13 分钟可以读完, 创建于 2017-06-05

可变状态的泛滥往往被认为是软件维护灾难的元凶之一,尤其是当过程封装遇上多线程,普通的面向对象编程技巧完全不堪大用,因为继承/封装/多态等手法针对的都是程序组织上的处理措施,具体到底层实现上,传统的C/C++/JAVA依然依赖过程式实现跟操作系统打交道。

Software Design in Agile Development Context

本文有 3402 字,大约需要 8 分钟可以读完, 创建于 2016-12-24

在目前大部分的软件开发组织中,敏捷开发已经成为毋庸置疑的标配。随着数位技术大神和布道师的宣扬和数量庞大的敏捷教练的身体力行式推广,商业环境和客户需求变更速度的日益加快,采用端到端交付周期更短的敏捷开发过程基本已经成为项目成功的必要条件。

Java8中的函数式编程

本文有 15553 字,大约需要 38 分钟可以读完, 创建于 2016-10-14

Java8是日益臃肿、略显老态的老牌程序语言对日益流行的新的函数式编程范式的反击; 它采用了巧妙的技术让自己面向对象的古老躯体也套上了函数式编程的舞鞋再度翩翩起舞,焕发新的光彩。

基于风险驱动的恰如其分的软件架构

本文有 4543 字,大约需要 11 分钟可以读完, 创建于 2016-05-14

随着岁月的推移,软件系统的规模、功能、复杂度都在呈现数量级增长,随之而来的变化带给软件开发者的压力与日俱增,更不要说各种敏捷方法和快速开发方法的流行极大地吊起了客户对交付时间和质量的期望。开源软件的日趋完善和其对应社区的指数级增长带来了数量庞大的框架、库等基本构造块,开发者可以借助各种成熟的基础设施和成熟完善的开...

A software design and test guideline for C++ project

本文有 9396 字,大约需要 23 分钟可以读完, 创建于 2016-04-07

To make large scale C++ software project in good shape is not an easy job, especially when you have a pretty big development team that may form multiple sub-...

用C++11/14实现一个现代的异步服务调度库

本文有 7156 字,大约需要 17 分钟可以读完, 创建于 2015-12-19

很多C++项目中都存在一个能够异步调度任务的基础库;大部分这样的库都是用老的C++语言(98/03)写成的,要么模板元语法满天飞外加各种黑魔法导致维护困难, 要么是采用传统的宏方式导致维护困难,布满各种隐患。既然C++11/C++14提供了更好用的武器,我也耐不住手痒自己实现一个。

CppCon2015 and Cpp Core Guidelines

本文有 3004 字,大约需要 7 分钟可以读完, 创建于 2015-10-04

C++社区的第二届编程语言社区活动CppCon2015落下了帷幕;作为C++语言的发明人和灵魂人物, Stroustroup和Herb Sutter一起宣布他们正工作与一个基于现代C++核心语言的编程规范(Core Guidelines)并发布 在GitHub上,并立即引起了轰动。

STM in Haskell

本文有 2514 字,大约需要 6 分钟可以读完, 创建于 2012-08-12

传统的并发变成模型通过Mutex/Conditional Variable/Semaphore的设施来控制对共享资源的访问控制,但是这一经典模型使得编写正确高效的并发程序变得异常困难: 遗漏合适的锁保护导致的race condition 锁使用不当导致的死锁deadlock 异常未...

Parallel programming in Haskell

本文有 6687 字,大约需要 16 分钟可以读完, 创建于 2012-08-02

Parallel和Concurrency的目标是一致的,然后Parallel更强调在多个物理并发处理单元(至少从OS之上的角度看如此)存在的情况下,如何最大限度地利用现有的CPU资源提高程序的性能。传统的过程式编程思维范式中,所有的操作都是顺行串行的,多核并发处理往往意味着需要对代码做大幅度的修改;而Haskel...

Concurrency with Haskell

本文有 6614 字,大约需要 16 分钟可以读完, 创建于 2012-07-23

随着基于CPU频率的摩尔定律的失效,现代的计算机体系都采用多核的方式提高处理能力,传统的编程思维和模式在多核时代则遭遇越来越多的问题;而函数式编程则在很大程度上提供了完全不同但是更为优雅的思路。作为纯函数式编程语言,Haskell的并发编程则和传统的过程式语言有着明显的不同。