具体描述
我们都有一个共同的梦想——成为更棒的程序员,但是如何做?如何学习和精进自己的技术?如何做业务分析和架构设计?如何做技术管理?本书就广大程序员都很关注的问题提供一些思路和方法。
《程序员的三门课:技术精进、架构修炼、管理探秘》内容分为三大篇:第1篇介绍程序员的技能成长路径,介绍如何通过学习来加速成长,并讲解非常重要的业务分析和设计知识;第2篇详细介绍了架构修炼中的必备架构思维模式、架构设计过程,还通过真实案例剖析了架构设计的核心要素及关注点,以及如何通过架构设计来把控质量和风险;第3篇总结了做技术管理的诀窍,揭秘如何从准备做技术管理到实现自我管理再到实现团队管理。
《程序员的三门课:技术精进、架构修炼、管理探秘》适用于即将或者正在从事IT相关开发工作,却不知如何提升自己,希望通过适当的学习方法精进技术的初级程序员;也适用于具备一定架构设计经验,想进一步系统化提升架构设计能力的中级程序员;以及有一定技术积累,想从事技术管理却不知如何着手的高级程序员。
作者简介
于君泽
某互联网公司技术专家,在分布式系统架构设计、高并发系统设计、领域建模、研发管理、内建质量等方面有较多心得,乐于交流和分享,曾创立技术社群“中生代技术”。
维护技术公众号“技术琐话”。
李伟山
现任某人工智能公司技术总监,江湖人称“山哥”,在分布式系统架构设计、高并发系统设计、系统稳定性保障等方面积累了丰富的实践经验,擅于利用数据分析解决实际问题,对新技术有浓厚的兴趣,乐于分享。
个人技术公众号:技术方舟。
张洪亮
网名Hollis,知名技术博主,个人技术博客(http://www.hollischuang.com)阅读量达数百万。90后程序员,2015年毕业于哈尔滨理工大学,现任某互联网公司技术专家,专注于Java研发、技术架构及程序员的成长等方面。
个人技术公众号:Hollis。
彭首長
熊猫优福联合创始人,聚美优品前技术总监。在团队管理、领域设计、分布式架构、高并发设计、IoT架构等方面有丰富的实践经验,擅长行业分析,对新技术高度敏感,热衷于技术实践且乐于分享。
刘朋
高绩效团队教练,教练型领导,中生代技术社区联合创始人,北京大学理学学士、工学硕士。现就职于中国移动(成都)5G产业研究院,曾任诺基亚通信(成都)有限公司研发经理。在敏捷实践、高绩效团队教练技术、技术团队管理等方面积累了丰富的经验,并总结出一套特别适合程序员突破自身瓶颈、快速成长的领导力模式
目录信息
第1章 程序员技能与成长 2
1.1 如何学习新的编程语言 2
1.1.1 重点学什么 3
1.1.2 学习方法 3
1.2 代码规范与单元测试 6
1.2.1 编码规范 6
1.2.2 单元测试 7
1.2.3 测试驱动设计 9
1.3 使用静态代码分析工具 18
1.3.1 什么是静态代码分析 19
1.3.2 静态代码分析工具 19
1.4 代码审查 24
1.4.1 什么是代码审查 24
1.4.2 代码审查的好处 24
1.4.3 如何做代码审查 25
1.5 清单和模板 29
1.5.1 清单实践 29
1.5.2 产品需求文档模板 31
1.6 程序员的工作法则 33
1.6.1 工具化法则 33
1.6.2 自动化法则 38
1.6.3 关于文档的问题 40
1.6.4 关于YAGNI 40
1.7 程序员的工具箱 41
1.7.1 可帮我们提升工作效率的硬件 42
1.7.2 可帮我们提升工作效率的操作系统 43
1.7.3 可帮我们提升工作效率的软件 43
1.7.4 在线工具 50
第2章 加速成长与学会学习 56
2.1 程序员如何加速成长 56
2.1.1 积极主动 56
2.1.2 空杯心态 57
2.1.3 选择合适的平台 57
2.1.4 别怕犯错 58
2.1.5 注意细节 58
2.1.6 时间管理 58
2.1.7 打破边界 61
2.1.8 写业务代码中的成长机会 61
2.2 学会学习 66
2.2.1 高效学习的方法 67
2.2.2 高效学习的途径 69
2.2.3 舒适区与小步子原则 72
2.2.4 两个著名的学习理论 72
2.2.5 终身成长 74
第3章 业务分析与设计 75
3.1 黄金圈法则 75
3.2 UML建模工具 77
3.2.1 用例图 78
3.2.2 类图 79
3.2.3 对象图 80
3.2.4 状态图 80
3.2.5 活动图 81
3.2.6 序列图 82
3.2.7 协作图 82
3.2.8 构件图 83
3.2.9 部署图 84
3.3 业务分析与设计的方法 85
3.4 系统分析与设计的三个发展阶段 87
3.4.1 面向数据驱动分析与设计 87
3.4.2 面向对象和服务分析与设计 88
3.4.3 面向问题域分析与设计 89
3.5 面向对象分析与设计 90
3.5.1 什么是面向对象 90
3.5.2 面向对象的特征 91
3.5.3 面向对象设计的原则 91
3.6 面向服务分析与设计 93
3.6.1 Web Service模式 93
3.6.2 ESB模式 94
3.6.3 微服务架构 95
3.7 领域驱动设计 97
3.8 领域模型实践 102
3.8.1 什么是领域模型 102
3.8.2 领域模型的作用 102
3.8.3 如何进行领域建模 104
第2篇 架构修炼
第4章 架构思维 110
4.1 分解 110
4.1.1 分解的作用 111
4.1.2 分解的原则 111
4.1.3 分解的时机 112
4.2 集成 112
4.2.1 常见的集成方式 112
4.2.2 集成的难点 115
4.3 动静分离 120
4.4 复用 121
4.4.1 系统复用的分类 122
4.4.2 可复用性和可维护性的关系 123
4.4.3 可维护性地复用的设计原则 123
4.5 分层 126
4.6 模式 127
4.6.1 分层模式 128
4.6.2 客户端-服务器模式 131
4.6.3 主从设备模式 132
4.6.4 管道-过滤器模式 133
4.6.5 代理模式 133
4.6.6 P2P模式 134
4.6.7 事件总线模式 135
4.6.8 MVC模式 136
4.6.9 黑板模式 137
4.6.10 解释器模式 138
4.7 抽象 139
4.8 结构化 139
4.8.1 结构化的原则 140
4.8.2 结构化分析工具 140
4.8.3 结构化思维的7个环节 141
4.9 迭代 141
4.10 勿做过度设计 141
第5章 架构设计 143
5.1 架构设计概要 143
5.1.1 业务架构 143
5.1.2 应用架构 145
5.1.3 技术架构 147
5.1.4 数据架构 149
5.2 架构设计的流程 151
5.3 架构设计的核心要素 153
5.3.1 性能 153
5.3.2 可用性 153
5.3.3 伸缩性 154
5.3.4 扩展性 154
5.3.5 安全性 154
5.4 高性能设计 154
5.4.1 主要的性能测试指标 155
5.4.2 性能测试方法 156
5.4.3 性能优化策略 157
5.5 高可用设计 159
5.5.1 高可用性的度量与考核 159
5.5.2 高可用的架构 160
5.5.3 高可用质量保证 164
5.5.4 系统运行监控 165
5.6 可伸缩设计 166
5.6.1 架构的伸缩性设计 166
5.6.2 应用服务的伸缩性设计 167
5.6.3 分布式缓存的伸缩性设计 169
5.6.4 数据存储的伸缩性设计 169
5.7 可扩展性设计 169
5.7.1 通过消息降低系统的耦合性 170
5.7.2 通过分布式服务提供可复用的业务 170
5.7.3 建立开放平台 170
5.8 架构设计的典型案例——订单系统 171
5.8.1 订单的基本概念 172
5.8.2 订单流程 174
5.8.3 订单系统设计中的挑战和实践 178
5.8.4 数据库优化 182
5.8.5 小结 185
第6章 架构的保障:质量与风险 186
6.1 内建质量体系 186
6.2 从黑天鹅事件到墨菲定律 189
6.2.1 黑天鹅事件 189
6.2.2 蝴蝶效应 191
6.2.3 墨菲定律 191
6.3 软件质量稳定性之殇 192
6.3.1 业务高速发展带来的变化 193
6.3.2 问题域的复杂性 193
6.3.3 系统的复杂性 194
6.3.4 技术债问题 194
6.3.5 人、流程、文档的博弈 195
6.3.6 采用不能掌控的工具和框架 196
6.3.7 质量意识 196
6.4 从康威定律和技术债看研发之痛 197
6.4.1 康威定律 197
6.4.2 通过3个案例来看研发之痛 197
6.4.3 架构方案和业务形态息息相关 204
6.5 求解质量熵 206
6.5.1 运用敏捷思想 207
6.5.2 运用系统化思想 208
6.5.3 技术债偿还计划 209
6.5.4 抓住合适的时机做架构升级 209
6.5.5 内建质量 210
6.5.6 不迷信,不唯新、不唯上,实践是检验真理的标准 210
6.5.7 复杂的问题域:专项突破 210
6.5.8 领导者的意识 211
6.5.9 创新解决方案 211
6.6 踩过的坑和经验总结 212
6.6.1 简单的数字改动导致电商网站搜索功能失灵 212
6.6.2 应用竟然被外部系统拖垮了 212
6.6.3 HashMap与并发 213
6.7 故障复盘流程及模板 215
6.7.1 什么是故障复盘 215
6.7.2 为什么要做故障复盘 215
6.7.3 如何做故障复盘 216
6.7.4 故障复盘模板 219
6.8 监控与告警 221
6.8.1 监控的重要性 221
6.8.2 监控哪些内容 221
6.8.3 告警 224
6.8.4 监控的架构 224
6.9 应急处置 226
第3篇 管理探秘
第7章 为成为技术主管做准备 232
7.1 构建自我阶段性目标 232
7.2 体验自己的目标身份 234
7.3 勇于抓住机会 235
第8章 从自我管理转为管理团队 236
8.1 什么是领导力 236
8.2 如何构建领导力 237
8.2.1 维度1:提供清晰的领导力风格,并以信任感作为基石 238
8.2.2 维度2:了解业务,并带领团队达到高绩效 240
8.2.3 维度3:发展自己和团队成员 240
8.2.4 维度4:塑造未来 241
8.3 让自己成为T型人才 242
8.4 高效时间管理 243
8.4.1 确定在做的事情符合自己的目标 244
8.4.2 随时应用80/20法则 246
8.4.3 创造大块时间 247
8.5 遇到“不服管”的员工怎么办 249
8.5.1 每个人都是不错的 250
8.5.2 建立亲和与信任感 251
8.5.3 从绩效评估到建设性反馈 255
8.6 如何处理冲突 261
8.6.1 了解产生冲突的原因 261
8.6.2 正确看待冲突 262
8.6.3 处理冲突 263
8.7 引导员工主动工作 264
8.8 如何从带10个人到带100个人 266
8.8.1 在管理上面对的挑战 267
8.8.2 从管理1.0到管理2.0 269
8.9 如何对上管理 276
8.9.1 做好对上的预期管理 277
8.9.2 及时汇报 277
· · · · · · (收起)
读后感
用户评价
这本《程序员的三门课》的封面设计,给我一种沉稳而有力量的感觉,封面上那三个关键词“技术精进”、“架构修炼”、“管理探秘”也精准地概括了我一直以来在职业发展中想要深耕的方向。我作为一个有着几年开发经验的程序员,深切体会到,单纯地埋头写代码已经不足以支撑我走的更远,技术、架构、管理这三个方面,就像是三条腿,只有都站稳了,才能在职业生涯的道路上跑得更稳、更远。 我最近在参与一个比较大型的微服务项目,在服务拆分、接口设计以及数据一致性方面遇到了一些困惑。我感觉自己虽然能够完成任务,但是距离构建一个健壮、可扩展、易于维护的系统还有很大的差距。这本书的“架构修炼”部分,我非常期待它能够提供一些关于如何进行合理的微服务划分、如何设计清晰的服务接口、以及如何处理服务间依赖关系的系统性方法。我希望作者能够分享一些在实际项目中遇到的挑战,以及他是如何通过架构设计来解决这些问题的,从而让我能够从中汲取经验,提升自己的架构设计能力。 目前我所在的团队正好处于一个快速发展的阶段,我开始尝试承担一些技术方向的决策和指导工作。我发现,除了具备扎实的技术能力之外,还需要掌握一定的沟通技巧、项目管理方法以及团队协作的策略。这本书的“管理探秘”部分,我非常希望能从中学习到如何有效地领导一个技术团队,如何进行技术评审,如何处理团队成员之间的分歧,以及如何激发团队的创造力。我希望能够获得一些实用的管理工具和思路,帮助我更好地履行自己的职责,并促进团队整体能力的提升。 在我刚入行的时候,我可能更多地关注的是如何快速实现功能,而在最近,我越来越感觉到,理解技术背后的原理,对于解决复杂问题和进行技术创新至关重要。我希望这本书的“技术精进”部分,能够帮助我深入理解一些核心的技术概念,比如操作系统原理、网络通信机制、以及编译原理等等。我希望通过对这些基础技术的深入学习,能够提升我解决问题的能力,并且能够更好地理解和应用一些新的技术,从而实现技术上的“精进”。 我一直认为,一个优秀的程序员,应该具备不断学习和适应新变化的能力。技术更新迭代的速度非常快,如果我们不能持续学习,很快就会被淘汰。这本书的三个部分,分别涵盖了程序员发展的关键领域,我相信它能够帮助我建立一个更加系统和全面的知识体系。我期待它能够不仅教会我“做什么”,更能教会我“为什么这么做”,并且能够帮助我培养一种独立思考和终身学习的能力,从而在未来的职业生涯中不断成长和进步。
这本书的书名非常有辨识度,让人一看就知道它所针对的目标读者群体。封面设计也相当专业,给我一种内容扎实、值得细读的感觉。我一直认为,作为一名软件工程师,要在这个领域长久地发展下去,就不能仅仅局限于某一项技术,而是需要在一个更广阔的视野下,去理解技术、架构和管理这三个互相支撑、互相促进的维度。这本书的出现,正好契合了我最近在职业发展上的一些思考和探索。 我目前正在负责一个大型的互联网金融项目,在这个项目中,我深刻体会到了架构设计的重要性。从最初的单体应用到现在的微服务拆分,每一次架构的调整都带来了新的挑战,也让我更加意识到,一个优秀的架构师需要具备前瞻性的视野和全局观。这本书的“架构修炼”章节,我非常期待它能够提供一些关于如何构建高可用、高并发、高安全性的分布式系统的实用指南。我希望能够学习到一些成熟的架构模式,并且了解它们在实际应用中的权衡与取舍,从而帮助我更好地指导团队进行架构设计和优化。 作为一名在技术领域工作了多年的开发者,我逐渐发现,光有技术能力已经不足以应对日益复杂的项目需求和团队协作。我开始思考如何能够更有效地管理时间和资源,如何更好地协调团队成员,以及如何推动项目的顺利进行。这本书的“管理探秘”部分,我希望能从中学习到一些关于项目管理、团队建设和沟通协调的有效方法。我期待能够获得一些具体的实践经验和案例分析,帮助我提升自己的领导能力和管理水平。 在我职业生涯的早期,我可能更专注于掌握各种编程语言和框架,以求快速地实现功能。然而,随着经验的积累,我越来越意识到,对技术本身的深入理解,才是提升效率和解决复杂问题的关键。这本书的“技术精进”部分,我非常看重它能够帮助我梳理和深化我对一些基础技术原理的认识。我希望能够通过阅读这本书,进一步巩固我的技术根基,并且能够更好地理解一些前沿技术背后的逻辑,从而在技术上不断突破和进步。 我是一个对技术抱有强烈好奇心的人,总是希望能够了解最新的技术动态和发展趋势。我深信,持续的学习和拥抱变化是程序员保持竞争力的不二法门。这本书的三个部分,分别从技术、架构和管理三个角度,为程序员的职业发展提供了一个全方位的指导。我期待它能够帮助我构建一个更加系统和完整的知识体系,并且能够启发我不断探索新的技术领域,从而在快速发展的技术浪潮中,找到自己的定位并持续前进。
这本书的装帧设计非常简洁大气,封面上的字体也很有力量感,让人一看就觉得内容肯定不一般。我最近在思考自己的职业道路,感觉自己已经掌握了一些基础的技术,但似乎进入了一个瓶颈期,想要再往上走,就需要更加系统性的知识和更广阔的视野。我一直觉得,一个优秀的程序员,不应该只懂代码,还需要理解代码背后的设计哲学,以及如何将技术有效地应用于实际的业务场景中。这本书的标题,正好点出了我内心深处的渴望,让我觉得它能够成为我职业生涯中的重要指引。 我记得我是在某个技术大会的茶歇时间,听到一位资深架构师偶然提及这本书,他说这本书对他影响很大,特别是关于如何构建可伸缩、高可用的系统方面。当时我就被吸引住了,因为我正好在负责一个需要处理海量用户请求的系统,并且在稳定性方面遇到了不少挑战。我一直在寻找能够帮助我深入理解分布式系统原理、以及掌握复杂系统设计方法的书籍。这本书的“架构修炼”部分,我非常看重它能够提供一些在大型互联网公司实践过的成熟架构模式,并且能够分析这些模式的优缺点,以及在不同场景下的适用性。 我最近加入了一个新的项目团队,担任了其中一个核心模块的负责人。我发现,除了写好代码之外,还需要和团队成员就技术方案进行讨论,并且要考虑整个项目的长远发展。我一直在思考如何能够更有效地进行技术决策,如何能够清晰地向团队成员解释复杂的概念,以及如何避免在项目后期出现重大的架构调整。这本书的“管理探秘”部分,我希望能从中学习到一些关于技术领导力、项目管理以及团队协作的有效方法。我期待它能提供一些实用的工具和流程,帮助我更好地指导团队,并推动项目朝着正确的方向前进。 我对一些基础的编程语言和开发框架已经比较熟悉,但是总感觉在处理一些更底层的技术问题时,显得力不从心。比如,对操作系统的原理、网络协议的细节、以及数据库的底层优化等方面,我还没有一个非常深刻的理解。我一直相信,扎实的基础是更高级的技术能力的基础,而这本书的“技术精进”部分,我希望它能够帮助我打通这些技术任督二脉,让我能够从更深的层次去理解技术,并且能够更好地排查和解决一些疑难杂症。 最近我一直在关注一些关于云原生技术、AI 驱动的开发以及低代码/无代码等新兴技术趋势。我感到,技术发展的速度越来越快,作为一名程序员,如果不保持持续的学习和更新,很容易被时代淘汰。我希望这本书不仅能提供当前主流技术的深度解析,还能对未来的技术发展方向有一些前瞻性的洞察。我期待它能够帮助我构建一个更加全面的技术知识体系,并且能够培养我一种主动探索和学习新技术的习惯,从而在快速变化的技术环境中保持竞争力。
这本《程序员的三门课》的标题,本身就充满了力量感和方向感,就像是为每一个在技术道路上不断探索的程序员指明了方向。封面设计也颇具匠心,简洁却不失专业,让人一看便能感受到其内容的深度和价值。我一直觉得,一个成熟的程序员,不应该仅仅满足于写出能运行的代码,更应该追求在技术深度、架构思维以及团队协作等多个维度上的全面提升。这本书的出现,正好契合了我目前在职业发展上对这些方面的迫切需求。 我最近正在参与一个规模较大的系统升级项目,在这个过程中,我深刻体会到,单一技术能力的局限性。要想设计出稳定、高效、易于维护的系统,就必须具备宏观的架构设计能力。这本书的“架构修炼”部分,我非常期待它能够提供一些关于如何构建可扩展、高性能的分布式系统的解决方案。我希望能够从中学习到不同的架构模式,了解它们各自的优劣势,以及在实际应用中如何进行取舍和落地,从而帮助我更好地理解和实践复杂的系统设计。 作为一个有一定工作经验的开发者,我越来越发现,个人的技术能力固然重要,但团队的整体协作和项目的有效推进,同样是不可或缺的。我开始思考,如何能够更好地与同事沟通,如何有效地分配任务,以及如何带领团队克服技术上的挑战。这本书的“管理探秘”部分,我希望能从中获得一些关于技术领导力、团队建设和项目管理的宝贵经验。我期待作者能够分享一些他在实际管理中所遇到的困难,以及他是如何解决的,从而为我提供一些可借鉴的思路和方法。 我一直坚信,扎实的基础是进行更高级技术探索的前提。在日常工作中,我可能会遇到各种各样的问题,但很多时候,如果对底层原理理解不够深入,就很难从根源上解决问题。这本书的“技术精进”部分,我非常看重它能够帮助我系统地梳理和深化我对一些核心技术概念的理解。我希望能够通过阅读这本书,打牢我的技术根基,提升我分析和解决复杂技术问题的能力,并且能够为我日后学习和掌握新的技术打下坚实的基础。 我是一个对技术充满热情,并且乐于接受新事物的人。我认为,在日新月异的技术领域,保持好奇心和持续学习的态度至关重要。这本书的三个部分,分别从技术、架构和管理三个角度,为程序员的职业成长提供了一个全面的视角。我期待它能够帮助我构建一个更加完整和系统的知识体系,并且能够启发我不断地去思考和探索,从而在快速发展的技术环境中,保持自己的竞争力,并实现个人职业生涯的持续发展。
这本书的封面设计着实吸引眼球,简约却不失专业感,封面的配色也很有考究,让人一眼就能感受到它所蕴含的技术深度。我一直认为,作为一名程序员,技术、架构和管理是三条平行的、却又相互关联的道路,想要在职业生涯中走得更远,就必须在这三个方面都有所建树。这本书的标题恰好点出了我的这种认知,让人充满期待。 我是在一个技术论坛上偶然看到有人推荐这本书的,当时正好是我在职业发展中感到有些瓶颈的时候。一方面,我感觉自己的技术栈停滞不前,新的技术层出不穷,但自己却难以跟上;另一方面,在团队项目中,我开始承担一些更复杂的任务,但总感觉在代码组织和模块划分上不够清晰,优化空间很大。而管理方面,虽然我还没有正式走上管理岗位,但经常需要协调跨部门的沟通,处理一些技术决策的取舍,这些都让我意识到,单纯的技术能力已经不足以支撑更长远的职业发展了。这本书的出现,仿佛是为我量身定制的指导手册,让我看到了突破困境的希望。 最近我正在深度学习微服务架构,并且在实践中遇到了一些棘手的问题,比如如何设计清晰的服务边界、如何处理服务间的依赖以及如何保证数据的一致性。我一直在寻找一些能够提供系统性解决方案的书籍,而不是零散的技术文章。这本书的“架构修炼”部分,我非常期待它能提供一些前沿的架构设计理念和实用的落地经验。我希望它不仅仅是理论的堆砌,更能结合实际的案例,分析不同架构模式的优缺点,以及在什么场景下应该选择哪种方案,这样才能真正帮助我提升架构设计能力,避免在实际工作中走弯路。 我是一名刚刚晋升为技术组长的开发者,现在需要开始思考如何带领团队更高效地完成项目,并且要关注团队成员的成长。我一直对如何激发团队活力、如何进行有效的技术评审、如何处理技术分歧以及如何培养 junior 开发者等方面感到困惑。这本书的“管理探秘”部分,我非常希望能从中学习到一些成熟的管理方法和工具。我希望作者能够分享一些他在实际管理中遇到的挑战以及他是如何克服的,比如如何平衡项目进度和技术债务,如何进行有效的绩效评估,以及如何构建积极向上的团队文化。 我一直认为,真正的技术牛人不仅要有深厚的技术功底,还要有开阔的视野和全局观,能够从更高的维度思考问题。这本书的“技术精进”部分,我非常期待它能够帮助我超越日常的编码任务,去理解技术背后的原理和演进方向。我希望它能提供一些关于如何系统性学习新技术、如何深入理解底层机制、以及如何培养解决复杂问题的能力的方法。同时,我也希望它能分享一些关于如何保持学习热情、如何避免技术倦怠的经验,因为我知道,持续学习是程序员最重要的品质之一。
提升的部分是不错,但是宣扬了一种加班的精神,12个小时的上班时间, 16小时才算加班,路上通勤的时间, 作者你不需要睡觉的吗?我们是人需要睡觉的,不是你家马爸爸生产的机器。
技术精进和管理探秘部分不错,但架构修炼部分感觉太官方化,有种直接从教材里面复制黏贴的感觉,领域驱动设计过于缺乏可操作性
简直就是垃圾,泛泛而谈,引用各种概念,毫无营养,70+买的,10元转卖不包邮
一些通识的框架、管理方法的理论介绍。还可以吧,快速翻翻~
一些通识的框架、管理方法的理论介绍。还可以吧,快速翻翻~