“简单就是美”
“平凡即是伟大”
上面两句话不知道是哪位名人说的,又或者是广大劳动人民总结的,反正我很小的时候就常常听到这两句话,这两句话也成了我的人生格言,而且事实上我也是一个生活过得比较简单的平凡人物,当然这不能说我跟“伟大”有什么关系,我觉得绝大部分人都是像我一样的平凡人物,但正是这些绝大多数平凡的人,创造了我们现在这个美好的世界,说他们是伟大的一点也不过分。在我身边,也有一群平凡的程序员,用他们日复一日,加班加点,简单而平凡的工作,编写了许多有价值的商业软件,付出了青春和汗水,除了相应的薪水,还有什么更大的回报吗?不排除程序员中有一些出类拔萃的人,他们取得了工作上的成功,在能力上获得了很大的成长,当了公司高管又或者是自己创业,事业上取得了一定成就。但是这些出类拔萃的程序员是很少的,在本书第一章,笔者根据《2018年中国程序员生存现状报告》进行了分析,年薪超过30万的程序员不超过10%,年薪10万左右的占比最高,并且年薪10万到15万之间5到10年工作经验的程序员占比最高。如果按照社会上普遍的以收入来衡量一个人是否成功的标准,大部分程序员的职业人生都是不成功的,他们并没有随着工作年限的增长而获得相应成长,这是一个无奈的现实。然而换一个角度来看待,大部分程序员虽然每天都做着简单而重复的“增删改查”工作,但他们用平凡的工作为自己服务的公司创造了利润,为社会创造了价值。
身处平凡阶层的您,又何尝不想能够成功,能够成长,并且获得成就呢?
然而,您可能没有名校背景,没有大厂(比如BAT系的公司)履历,没有做过像样子的大项目,没有拿得出手的成果,像现在流行的大数据、人工智能、机器学习、区块链这些炙手可热的新技术更是不懂,又怎么能够轻易的实现上面这个愿望呢?这应该是大部分普通的程序员所面临的现实问题,而我,也算是这其中的一员,但不妨碍我能够实现自己上面这个愿望。在回顾自己的程序员生涯时不会觉得虚度光阴,在某一方面也能有拿得出手的东西,获得了一定程度的成功和成就,得到了显著的成长,而我的“秘籍”就是,如果你觉得一个东西有点复杂,你就先用简单的方式把它做好,做深入,慢慢你就会发现,原来这个简单的东西也可以构建一个复杂的系统,等你回过头来再去看之前你觉得复杂的东西,你会惊奇的发现:原来这样做跟我的设想一样啊!(PS:其实这并不是什么“秘籍”,这正是LISP黑客所擅长的工作方式:先从最小的地方用最简单的方式将它运行起来,采用自底向上的方式一步一步的构建自己的语言,这种定制的语言抽象程度越高就越接近问题的本质,从而最终构建出一个复杂的系统。笔者对LISP这种工作方式很推崇,笔者的SOD框架中的OQL语言的设计深受这种思想的启发。)
其实这是经过长期而不断的努力,才能突然领悟到别人设计的精妙,思想的深邃,你会发现这些设计思想都是自然而然的,一气呵成的,有时甚至会拍下自己的脑袋:原来是这样啊,为啥我之前没有想到呢?也许,这就叫做“顿悟”吧!
对于别人看一眼就能懂的问题,而我总是要从简单的东西开始慢慢来领悟而不得“悟”,直到某一天才能突然明白,这期间走了不少弯路,付出了比别人更多的努力才能取得成功,我常常自嘲自己这是“笨鸟先飞”。我想“笨鸟”应该像“聪敏”的鸟儿一样总是少数,那么身处绝大多数普通“鸟儿”中的“您”,一定能够很快看懂我这本书提供的这些简单的方案,把自己每天做的“增删改查”工作,做的更好更深入,然后去构建自己强大的复杂的应用,“飞”得比我更高,更远。我说的这个方案便是本书要介绍的数据开发框架:SOD框架,它追求的目标是简单与效率的平衡,体现在代码的精简,开发、维护的简单与追求极致的运行效率。这种平衡,就像太极图中的阴阳平衡一样,体现在框架的设计上就是不仅要有方便快速的ORM功能,还要有处理复杂数据查询的功能,包括数据映射工具、窗体数据绑定功能等,不能仅仅强调某一方面的功能,这样使得它具有支持企业级复杂数据开发的能力。这也是为什么SOD框架的LOGO以太极图为基础设计的原因。
但是,在笔者10几年一线的开发工作中,发现有不少项目并没有根据实际情采用灵活的解决方案,要么全程ORM,要么SQL一路写到底,都是开头爽然后很快就遇到硬骨头,企业实际的开发项目远不是某个框架的教程示例代码那么简单,有时候为了解决一个问题要花费很多时间来寻找解决方案,比如本来全程ORM的,突然一个复杂查询ORM处理不了不得已在几个地方又手写了SQL查询,相信有框架洁癖强迫症的朋友都能体会这种感觉。笔者认为,一种方案解决不了所有问题,软件研发必须要务实,要明白简单和复杂的关系,要重视开发效率与维护效率、运行效率的关系,一个软件项目就像人一样有它固有的生命周期,就应该尊重它内在的规律,放在人身上是“阴阳平衡”,软件项目也是这样。框架是笔者10几年开发经验的总结,笔者想将这些经验分享给广大读者,让大家少走一些弯路,少淌一些坑,这便是笔者决定写这本书的原因。
本书有幸邀请到了.NET Linux 大神--宇内流云和博客园著名的.NET队长-- 张善友先生以及Java资深专家申毅先生的鼎立推荐,在图书即将出版之际,对他们的支持表示诚挚的感谢!
本书写作了一年半,又碰上疫情原因出版社复工问题,到现在快2年时间了才进入了出版倒计时,因此也要感谢家人的支持和出版社编辑的理解。当然,必须感谢SOD框架的用户朋友对此书的支持和期盼!
新书出版在即,有需要预定的朋友请回帖留下QQ和邮箱(默认用QQ邮箱),八折签名售书!
---------------------------
附录:图书目录
---------------------------
目录
第一章 软件开发中的“二.八定律” 1
1.1 大部分项目都是没有技术含量的 1
1.2 大部分时间都在做重复的增删改查 3
1.3 工作996,生病ICU 4
1.4 迷茫的开发人员 8
第二章 数据的基础概念和应用 8
2.1 数据漫话史—抽象、表示与存储 9
2.1.1 “数”的起源 9
2.1.2 原始的数字 14
2.1.3 河图与十进制 15
2.1.4 八卦与二进制 17
2.1.5 易经与量子理论 33
2.1.6 数据、信息和知识 38
2.1.7 数据的载体—存储介质 44
2.2 程序=数据结构+算法 55
2.3 数据与面向对象编程 57
2.4 数据与函数式编程 58
2.5 数据的成本 59
2.5.1 CPU寄存器和内存数据 59
2.5.2 进程内缓存和分布式缓存 61
2.5.3 持久化数据源 63
2.6 数据与消息 63
2.6.1 命令、事件与消息 64
2.6.2 实时消息与消息队列 65
2.7 XML与数据文件 68
2.8 关系数据库与NoSQL 71
2.9 大数据 72
第三章 数据库应用开发 74
3.1 数据库分类 74
3.1.1 嵌入式数据库 74
3.1.2 服务器数据库 76
3.2 数据库驱动程序 77
3.2.1 ODBC 77
3.2.2 OleDB 79
3.2.3 ADO.NET 80
3.2.4 SOD 85
3.3 数据访问组件的最佳实践 90
3.3.1 数据访问模式 91
3.3.2 配置数据连接 94
3.3.3 管理数据连接对象 97
3.3.4 优化数据命令对象 100
3.3.5 查询中使用长连接 104
3.3.6 使用跨组件的事务 106
3.3.7 跟踪SQL执行情况 114
3.4 数据库应用开发基础 122
3.4.1 常见的SQL工具 122
3.4.2 SQL标准 126
3.4.3 SQL方言 127
3.4.4 存储过程 128
3.4.5 参数化查询 129
3.5 数据查询与映射(SQL-MAP) 134
3.5.1 SQL满天飞的窘境 135
3.5.2 SQL-MAP的架构规范 135
3.5.3 集中管理SQL查询 139
3.5.4 定义SQL与程序的映射 142
3.5.5 处理复杂查询 150
3.5.6 自动生成代码 152
第四章 对象关系映射(ORM) 156
4.1 对象与关系的阻抗 156
4.1.1 话语环境的思想冲突 156
4.1.2 结构的不匹配 160
4.1.3 继承关系的难题 161
4.1.4 复杂的类关系 164
4.1.5 正视“阻抗误配” 165
4.2 数据的容器—实体类 166
4.2.1 实体类的元数据映射 166
4.2.2 数据类型的映射 169
4.2.3 DBNull与null 172
4.2.4 强类型映射与弱类型映射 173
4.2.5 日期类型的处理 174
4.2.6 枚举类型的属性 175
4.2.7 实体类与DTO的映射 177
4.3 实体类的创建 179
4.3.1 默认方式创建 180
4.3.2 动态创建实体类 180
4.3.3 映射任意查询结果 181
4.3.4 映射存储过程 186
4.3.5 实体类生成工具 188
4.3.6 Code First 192
4.4 数据的更改状态 194
4.4.1 更改通知接口 194
4.4.2 查询更改状态 196
4.4.3 重置更改状态 197
4.5 实体类属性的访问 198
4.5.1 设置数据 198
4.5.2 获取数据 200
4.5.3 数据访问事件 202
4.5.4 索引器 204
4.6 实体对象查询 207
4.6.1 实体对象查询与数据访问组件 207
4.6.2 查询单个实体对象 208
4.6.3 查询实体对象列表(List) 210
4.6.4 查询父子实体 213
4.6.5 更新和删除实体对象 216
4.6.6 高效插入实体对象列表的最佳实践 218
4.6.7 微型ORM 221
4.7 ORM查询语言—OQL 224
4.7.1 实体对象查询的缺陷 224
4.7.2 Java框架中的ORM查询语言 225
4.7.3 Linq:EF框架的ORM查询语言 226
4.7.4 OQL:SOD框架的ORM查询语言 228
4.7.5 简单查询入门 229
4.7.6 链式表达式与多级表达式 236
4.7.7 操作符重载 240
4.7.8 指定查询的实体类属性 244
4.7.9 查询条件表达式 246
4.7.10 构建复杂的查询条件 251
4.7.11 灵活的排序方式 256
4.7.12 简单的分页方法 259
4.7.13 聚合运算 266
4.7.14 多实体类联合查询 268
4.7.15 高级子查询 275
4.7.16 分组过滤 278
4.7.17 使用数据库函数 280
4.7.18 使用数据库锁 283
4.7.19 批量更新和插入 287
4.7.20 动态条件查询 290
4.7.21 使用接口查询 293
4.8 大数据量查询 296
4.9 实体类的序列化 298
4.9.1 应用场景建议 298
4.9.2 XML序列化 300
4.9.3 JSON序列化 302
4.9.4 二进制序列化 304
第五章 数据窗体开发 306
5.1 智能表单 307
5.1.1 数据控件 307
5.1.2 查询控件 310
5.1.3 验证控件 312
5.1.4 命令控件 314
5.1.5 数据绑定 316
5.1.6 表单数据填充 317
5.1.7 表单数据收集 318
5.1.8 表单数据的保存 319
5.2 Web Forms数据窗体开发 320
5.2.1 Web数据控件 321
5.2.2 Web窗体数据绑定 328
5.2.3 Web窗体表单处理 331
5.2.4 Web窗体列表和分页控件 340
5.3 Windows Forms数据窗体开发 341
5.3.1 Windows Forms数据控件 341
5.3.2 WinForms窗体数据绑定 344
5.3.3 WinForms窗体表单处理 346
5.4 Windows Forms/WPF MVVM框架 352
5.4.1 MVVM原理简介 353
5.4.2 MVVM窗体接口 359
5.4.3 MVVM命令处理接口 360
5.4.4 MVVM窗体示例 368
第六章 分布式系统架构与数据开发 384
6.1 三层和多层应用架构 384
6.1.1 分层的网络架构 384
6.1.2 软件三层架构 386
6.1.3 SOD分层解决方案 387
6.1.4 多层应用架构 388
6.2 DDD架构 389
6.2.1 软件复杂多变的难题 389
6.2.2 领域模型设计 391
6.2.3 领域驱动架构 393
6.3 DCI架构 395
6.3.1 DCI架构的本质 396
6.3.2 DCI架构的实现 396
6.3.3 业务分析三维度理论 398
6.4 洋葱架构 402
6.5 分布式混合架构实战 405
6.5.1 系统分层模型 405
6.5.2 应用软件架构 409
6.5.3 模块式架构 413
6.5.4 混合式三层架构 422
6.5.5 消息服务框架 424
6.6 并发更新 429
6.6.1 电商平台的“减库存”难题 429
6.6.2 Entity Framework的乐观并发 433
6.6.3 并发更新小结 435
6.7 多数据源查询 435
6.7.1 分布式环境中的多数据源 435
6.7.2 集成开发工具的多数据源查询 437
6.8 读写分离 443
6.8.1 应用场景 444
6.8.2 快照复制 445
6.8.3 事务复制 446
6.8.4 读写分离应用架构 447
6.9 分库和分表 450
6.9.1 垂直(纵向)切分 450
6.9.2 水平(横向)切分 453
6.9.3 分库分表衍生的问题 454
6.9.4 使用分区表 459
6.9.5 使用链接服务器 462
6.9.6 SOD框架分库分表 465
6.10 分布式事务 478
6.10.1 分布式事务简介 478
6.10.2 分布式事务实现层面 479
6.10.3 二阶段提交协议(2PC) 481
6.10.4 三阶段提交协议(3PC) 484
6.10.5 基于微服务的3PC分布式事务 487
6.10.6 实例—电商下单的分布式事务 500
第七章 企业级解决方案应用示例 518
7.1 内存数据库 519
7.1.1 架构设计 519
7.1.2 数据的持久化 522
7.1.3 构造“数据仓库” 523
7.1.4 移花接木 524
7.1.5 打造“数据集市” 526
7.1.6 实例使用“内存数据库” 527
7.2 异构数据库同步 529
7.2.1 异构数据库平台 529
7.2.2 数据同步流程和方案 531
7.2.3 SOD框架数据同步方案 533
7.2.4 实例介绍--数据导出 536
7.2.5 实例介绍--数据导入 543
7.2.6 实例介绍—演示程序 549
7.3 应用层事务数据复制 559
7.3.1 数据复制简介 560
7.3.2 应用层事务日志 562
7.3.3 应用层数据复制 573
7.3.4 实现方案设计 576
第八章 附录:SOD框架和开源社区 593
8.1 SOD框架发展历史 594
8.2 .NET Core跨平台支持 595
8.3 向其它平台移植的可能性 599
8.4 SOD框架开源社区 601
8.4.1 GitHub和码云 601
8.4.2 Nuget程序包 602
8.4.3 社区资源 605
8.4.4 社区反馈 606
8.5 后记 607