第1章 计算机的世界你不懂 1
1.1 我是一个线程 1
初生牛犊 1
渐入佳境 4
虎口脱险 5
江湖再见 8
1.2 TCP/IP之大明内阁 9
1.3 TCP/IP之大明邮差 12
1.4 CPU阿甘 17
启动 17
运行 18
新装备:缓存 19
自我提升:流水线 20
1.5 我是一个进程 21第1章 计算机的世界你不懂 1<br />1.1 我是一个线程 1<br />初生牛犊 1<br />渐入佳境 4<br />虎口脱险 5<br />江湖再见 8<br />1.2 TCP/IP之大明内阁 9<br />1.3 TCP/IP之大明邮差 12<br />1.4 CPU阿甘 17<br />启动 17<br />运行 18<br />新装备:缓存 19<br />自我提升:流水线 20<br />1.5 我是一个进程 21<br />批处理系统 22<br />多道程序 22<br />地址重定位 24<br />分时系统 26<br />分块装入内存 27<br />虚拟内存:分页 28<br />分段 分页 30<br />程序的装载 31<br />线程 35<br />1.6 我是一块硬盘 36<br />内部结构 37<br />文件 38<br />文件的存放 39<br />管理空闲块 44<br />文件系统 45<br />1.7 我是一个键盘 46<br />二等公民 46<br />总线和端口 47<br />轮询(程序式I/O) 48<br />中断 49<br />DMA 50<br />1.8 数据库的奇妙之旅 51<br />无纸化办公 51<br />数据的冗余和不一致 52<br />李氏查询 52<br />并发访问 54<br />原子性问题 56<br />** 58<br />1.9 搞清楚Socket 59<br />1.10 从1加到100:一道简单的数学题挑战一下你的大脑 64<br />CPU和内存 64<br />从1加到100 65<br />热身 65<br />正式出发 65<br />1.11 一个翻译家族的发家史 68<br />机器语言 68<br />汇编语言 69<br />**语言 70<br />1.12 编程世界的那把锁 74<br />共享变量惹的祸 74<br />争抢吧,线程 75<br />改进 76<br />信号量 77<br />1.13 绕不开的加法器 81<br />1.14 递归那点事儿 85<br /><br />第2章 Java帝国 91<br />2.1 Java:一个帝国的诞生 91<br />C语言帝国的统治 91<br />反抗 92<br />一鸣惊人 93<br />开拓疆土 93<br />帝国的诞生 94<br />2.2 我是一个Java Class 96<br />陌生警察 96<br />刺探信息 97<br />初识虚拟机 98<br />快乐假期 102<br />真相大白 103<br />2.3 持久化:Java帝国反击战 104<br />断电的威胁 104<br />数据库联合酋长国 105<br />表面风光的EJB 106<br />轻量级O/R Mapping框架 106<br />帝国的反击 107<br />2.4 JDBC的诞生 108<br />谈判 108<br />统一接口 110<br />面向接口编程 111<br />简单工厂 112<br />数据驱动 114<br />工厂方法 115<br />2.5 Java帝国之宫廷内斗 119<br />JDBC大臣 119<br />密谋 120<br />两阶段提交 121<br />JTA 123<br />塞翁失马,焉知非福 124<br />基本可用 125<br />走漏风声 127<br />宫廷激辩 128<br />2.6 JSP:一个装配工的没落 131<br />黑暗岁月 131<br />服务器端动态页面 132<br />标签库 134<br />模板引擎 134<br />草根搅局 135<br />2.7 Java 帝国之消息队列 137<br />张家村的历史 137<br />拆分 138<br />新问题 139<br />消息队列 139<br />互不兼容的MQ 140<br />消息队列接口设计 141<br />配置和代码的分离 143<br />再次抽象 144<br />2.8 Java帝国之动态代理 147<br />深夜奏对 147<br />明察暗访 149<br />Java 动态代理 150<br />2.9 Java注解是怎么成功上位的 153<br />XML大臣 153<br />安翰林献计 154<br />早朝争斗 157<br />2.10 Java帝国之泛型 159<br />新王登基 159<br />C 使者 159<br />泛型实现 162<br />泛型方法 163<br />泛型和继承 164<br />2.11 一个**的日志系统是怎么设计出来的 166<br />前言 166<br />张家村 167<br />小张的设计 167<br />正交性 170<br />Log4j 171<br />尾声 171<br />2.12 序列化:一个老家伙的咸鱼翻身 172<br />寒冬的蛰伏 172<br />XML和JSON的挑战 173<br />新协议的崛起 175<br />2.13 加锁还是不加锁,这是一个问题 176<br />互斥锁 176<br />要不要加锁 177<br />CAS的扩展 179<br />2.14 Spring 的本质 182<br />问题来源 183<br />设计模式:模板方法 184<br />设计模式:装饰者 186<br />AOP 187<br />实现AOP 188<br />对象的创建 189<br />IoC与DI 191<br /><br />第3章 浪潮之巅的Web 192<br />3.1 Web的起源 192<br />3.2 两个程序的爱情故事 195<br />好感 195<br />分离 196<br />网络 197<br />Web 198<br />3.3 一个故事讲完HTTPS 199<br />总有一种被偷窥的感觉 199<br />RSA:非对称加密 200<br />非对称加密 对称加密 202<br />中间人劫持 202<br />你到底是谁 203<br />HTTPS 206<br />3.4 机房夜话 207<br />**夜 207<br />第二夜 209<br />第三夜 211<br />3.5 从密码到token,一个有关授权的故事 215<br />我把密码献给你 215<br />token 216<br />授权码 token 218<br />后记 220<br />3.6 后端风云 220<br />数据库老头儿 220<br />危机 221<br />党委扩大会议 221<br />分家 223<br />Redis 224<br />余数算法 227<br />一致性Hash算法 229<br />Hash槽 (Hash Slot) 233<br />故障转移 235<br />高可用的Nginx 237<br />高可用的Tomcat 238<br />数据库的读写分离 240<br />3.7 我是一个函数 243<br />3.8 从SOA到微服务 246<br />3.9 什么是框架 249<br />3.10 HTTP Server:一个差生的逆袭 252<br />HTTP Server 1.0 252<br />HTTP Server 2.0:多进程 253<br />HTTP Server 3.0:select模型 254<br />HTTP Server 4.0:epoll模型 255<br /><br />第4章 代码管理那些事儿 258<br />4.1 版本管理简史 258<br />“人肉” 版本管理 258<br />锁定文件:避免互相覆盖 259<br />允许冲突:退一步海阔天空 260<br />分支:多版本并行 261<br />分布式管理:给程序员放权 262<br />程序员也爱社交 264<br />4.2 Build的演进之路 265<br />手工Build的烦恼 265<br />自动化Build 267<br />Java 与 XML 268<br />消除重复 270<br />4.3 烂代码传奇 275<br />4.4 敏捷下的单元测试 277<br />敏捷运动 277<br />困惑 278<br />讨论 279<br />一年以后 280<br />4.5 再见!Bug 281<br /><br />第5章 我的编程语言简史 284<br />5.1 JavaScript :一个草根的逆袭 284<br />出世 284<br />成长 286<br />**桶金 288<br />发明JSON 289<br />人生** 291<br />5.2 Node.js:我只需要一个店小二 292<br />5.3 C老头儿和Java小子的硬盘夜话 295<br />5.4 编程语言的“爱恨情仇” 300<br />让人怀疑的C 语言 300<br />被忘却的 VB & Visual FoxPro 301<br />蹂躏我的C 302<br />赖以谋生的Java 303<br />优雅的Ruby 304<br />5.5 命令式编程 VS 声明式编程 306<br />一则小故事 306<br />命令式编程 306<br />声明式编程 307<br /><br />第6章 老司机的精进 309<br />6.1 凡事必先骑上虎背,和性格内向的程序员聊几句 309<br />6.2 码农需要知道的“潜规则” 311<br />上帝的规矩:局部性原理 311<br />坐飞机的怎么和坐驴车的打交道:缓存 311<br />抛弃细节:抽象 312<br />我只想和邻居打交道:分层 312<br />我怕等不及:异步调用 313<br />大事化小,小事化了:分而治之 314<br />6.3 15年编程生涯,一名架构师的总结 314<br />好奇心 315<br />养成计算机的思维方式 315<br />扎实基础,融会贯通 317<br />要透彻地理解一门技术的本质 317<br />能写漂亮的代码 318<br />抽象的能力 319<br />技术领导力 319<br />6.4 对自己狠一点,开始写作吧 320<br />6.5 学习编程的四兄弟 322<br />摇摆不定的老大 322<br />“小仓鼠”老二 322<br />不看书的老三 323<br />半途而废的老四 323显示全部信息前 言从来没想到自己也能出一本书。
作为一名工作了十五年的老程序员,我深知编程行业的不容易,不仅需要应对高强度的工作,还需要学习大量的技术知识,而且不像医生、律师这些知识相对稳定的行业越老越吃香,软件行业的技术每隔一段时间就会更新换代,让你清零,逼着你从头再来。所谓“活到老,学到老”,用到程序员身上再合适不过了。
在不断学习的过程中,我“痛恨”那些采用bottom-up方式来讲解技术的资料和文章,一上来就是技术细节、安装步骤、配置方法,让初学者晕头转向、不知所云,看完了以后也不知道为什么有这个东西、解决了什么问题、它有什么来龙去脉。换句话说,这些资料和文章习惯于讲解How,而不是Why。但是在我看来,Why有时候比How更重要。
有时候在公司听技术讲座,看到上面的人眉飞色舞,下面的人却一脸茫然,我总在想:为什么不举一些生动有趣的例子呢?如果是我在讲,那我怎么才能通俗易懂地把这个知识点讲解出来呢?我该怎么去类比呢?我该从哪个角度切入呢?
这种潜移默化的思考多了以后,我发现自己也慢慢地养成了用通俗易懂的方式讲解技术的习惯。
我工作了这么多年,踩了这么多坑,能不能把这些经验写下来,让后来者少走一些弯路呢?从来没想到自己也能出一本书。 <br />作为一名工作了十五年的老程序员,我深知编程行业的不容易,不仅需要应对高强度的工作,还需要学习大量的技术知识,而且不像医生、律师这些知识相对稳定的行业越老越吃香,软件行业的技术每隔一段时间就会更新换代,让你清零,逼着你从头再来。所谓“活到老,学到老”,用到程序员身上再合适不过了。<br />在不断学习的过程中,我“痛恨”那些采用bottom-up方式来讲解技术的资料和文章,一上来就是技术细节、安装步骤、配置方法,让初学者晕头转向、不知所云,看完了以后也不知道为什么有这个东西、解决了什么问题、它有什么来龙去脉。换句话说,这些资料和文章习惯于讲解How,而不是Why。但是在我看来,Why有时候比How更重要。<br />有时候在公司听技术讲座,看到上面的人眉飞色舞,下面的人却一脸茫然,我总在想:为什么不举一些生动有趣的例子呢?如果是我在讲,那我怎么才能通俗易懂地把这个知识点讲解出来呢?我该怎么去类比呢?我该从哪个角度切入呢?<br />这种潜移默化的思考多了以后,我发现自己也慢慢地养成了用通俗易懂的方式讲解技术的习惯。<br />我工作了这么多年,踩了这么多坑,能不能把这些经验写下来,让后来者少走一些弯路呢?<br />2015年年底,我开设了一个微信公众号“码农翻身”,试图总结我的经验,通俗易懂地讲解技术。刚开始不温不火,直到有**,我无意中写了一篇文章“我是一个线程”,被广泛转载传播,就发现大家还是喜欢看故事的,在故事中轻松自在地掌握技术,于是就沿着这条路走了下去:用故事讲解技术的本质。<br />这条路一走就是两年多,慢慢地竟积累了几百篇文章,这本书正是从这几百篇文章中提取出来的精华,当然也经过了细心的整理、补充和完善。<br />每当我搞清楚一个知识点的时候,就会发出这样的感慨:技术本来是很简单的,只是上面笼罩着层层迷雾,让初学者难以看清。如果这本书能够帮助你搞清楚一些技术的本质,那我就会深感欣慰。<br /><br />本书特色<br />本书讲了很多故事,如“我是一个线程”“CPU阿甘”“Java:一个帝国的诞生”“Java帝国之宫廷内斗”“JavaScript:一个草根的逆袭”“两个程序的爱情故事”……我努力把技术融入其中,希望读者在读故事的过程中轻松地掌握相关技术。<br />读书本来就应该是一件轻松愉快的事情,不是吗?<br />此外,书中的每篇文章都是独立的,不用你正襟危坐,从头到尾去读,完全可以挑选自己感兴趣的章节。例如,对于半路出家的初学者来说,想了解计算机基础,可以去看看第1章;想了解Web技术,可以去第3章逛一下。<br />所谓“开卷有益”,希望你随手翻翻就能够掌握一点技术知识。<br /><br />读者对象<br />这不是一本编程的入门书,对编程一窍不通的“纯小白”可能看不明白,可能会失望。<br />根据微信公众号读者的反馈,稍有编程基础的读者读起来会非常畅快,读后会有一种“原来如此”的感觉。比如,学过Java SE的读者去读“Java帝国”一章,就会明白很多Java技术的来龙去脉,觉得很过瘾。<br />这也不是一本参考书,它的目的不是希望读者看完以后照搬,而是帮助读者理解一些技术的本质。<br /><br />勘误和支持<br />由于作者的水平有限,书中难免会出现一些错误或者不准确的地方,恳请广大读者批评指正。<br />我在微信公众号“码农翻身”中特意添加了一个新的菜单入口,专门用于展示书中的Bug。<br />如果读者在阅读过程中产生了疑问或者发现了Bug,欢迎到微信公众号后台留言,我会一一回复。 <br /><br />致谢<br />感谢微信公众号“码农翻身”的读者,你们的鼓励是我前进的*大动力。很多人直接加了我的微信号或者QQ号,只是为了表示感谢,让我非常感动。<br />很多读者鼓励我出书,也在不断询问我到底什么时候出书。这让我诚惶诚恐,生怕辜负了读者的这份厚爱。这本书终于出版了,希望大家能够喜欢。<br />感谢成都道然科技有限责任公司的姚新军老师,他给出了很多非常专业的意见和建议,是非常可靠的合作伙伴。感谢刘丹、励晓晓、张雅文等设计师在插图和封面设计方面的创意表达。<br />感谢对本书进行审稿的西安邮电大学陈莉君教授。感谢“软件那些事儿”电台主播刘延栋提出的宝贵意见。感谢百忙之中阅读书稿并且写书评的专家,他们是:IBM 软件商务系统全球负责人常红平、 阿里巴巴代码**负责人孤尽、IBM中国开发**开发经理白海飞、京东Y事业部供应链及技术总监胡浩、Agilean 咨询顾问金易等。<br /><br />特别致谢<br />特别感谢我的父母!我从小在农村长大,图书资源极为匮乏,他们在我很小的时候就让我看书,**我进入阅读之门。我至今仍清楚地记得父亲下班后从城里买的一本期刊,也是我的**本书:《故事大王》。从那以后,我就爱上了阅读。如果说我现在有一点点文采,那和父母鼓励我从小多读书是分不开的。<br />特别感谢我的爱人,在写作本书的过程中,陪伴、照顾孩子及家务琐事都被她承包了,让我可以心无二用、专心致志地写作。她也是本书的**位读者和审稿人,纠正了文章中大量“我习以为常的”文字错误。<br />她读完以后做出了非常精辟的总结:软件开发不就是抽象嘛!让我大为吃惊。<br />特别感谢我六岁的女儿,每当我晚上写作劳累,没有什么思路的时候,她都会及时地跑过来,不容分说地坐到我的腿上,盯着电脑上的书稿,问道:<br />“爸爸,你在干吗?”<br />“我在写书啊。”<br />“你的书会有很多人看吗?”<br />“是的。”<br />“那你会出名吗?”<br />“……”<br />谨以此书献给我的家人、读者,以及热爱编程的朋友!<br />刘欣(@码农翻身)显示全部信息媒体评论业内人士心声: 很高兴看到刘欣的*本书,这本书主要讲的是基础知识。这是他在阅读了大量书籍再加上自己长期实战后的提炼总结。很惊喜地发现刘欣的文笔相当好,晦涩的知识被融入一个个故事中深入浅出地讲出来,读下来居然一点也不累。 希望刘欣的书能够帮助更多的程序员,尤其是新入职场的程序员,夯实基础知识,喜欢上基础知识,逐渐成长为公司里的明星员工。 ——常红平,IBM软件商务系统全球负责人 本书引经据典、幽默风趣,举重若轻地把深奥的道理讲出来、讲明白、讲透彻,言之有物,深入浅出,是还在学海中苦苦挣扎的程序员的福音。 ——孤尽,阿里巴巴代码**负责人 常读的书大概有两种:一种讲故事,另一种传知识。前者愉悦身心,后者保养头脑。这本书是融合。作者把计算机元素和行为用拟人手法编成一个个精彩纷呈的故事,绘声绘色且深入浅出地演绎晦涩枯燥的编程知识。不必说编程初学者可以津津有味地学习,连老手也能饶有兴致地查漏补缺。力荐! ——白海飞,IBM中国开发**开发经理 **的技术人员应该具有广阔的技术视野,同时拥有贯通的技术深度;不仅知道技术是什么,而且还懂得为什么是这样的;总是不断地抽象分离技术的本质与不变,持续地总结建立技术的体系和结构,唯此才能应对这个时代的技术焦虑——日新月异的技术更迭。读这本书就是学习这样一位**的架构师是如何思考、如何抽象、如何成长的,从操作系统、Java语言到Web技术,每个主题都深入浅出。力荐! ——胡浩,*Y事业部供应链及技术总监 我还没有问过刘欣,码农“翻身”后面是省略了“做主人”吗?刘欣凭着对计算机和软件无比的挚爱,用三年的微信公众号文章积淀出这本书,他是我*佩服的、*接地气的计算机专家和导师。书中用故事的形式写计算机原理和编程,更是用*人称、拟人化手法写了线程、进程……没有*的真爱和深刻的理解,何以生动地描绘出操作系统老大和CPU阿甘之间的故事?我建议中学和大学引入这本书作为教辅材料,让学生在玩中学,喜欢上这些故事,喜欢上码农这个职业。 ——金毅,Agilean咨询顾问 故事读者感言: 很认真的看完每一章,就像看故事似的,特别有趣,而且故事还有丰富的知识,并包含一些形象化的理解,让我受益非浅。非常喜欢,就想问一句,啥时候出门啊? ——等风来 故事讲得生动,太有意思了!作为一名专业的IT招聘,实在是受益匪浅~ ——AmberzNn 写得很贴近生活,通俗易懂,以讲故事的方式讲述我在课堂上觉得枯燥无味的计算机知识,如果你去当老师,肯定很多学生愿意听! ——方剑秋 文章写得太好了,对于我们这种小白来说,一开始就能接触到这么好的文章简直是太幸运了。 ——会飞的鱼
免费在线读