了解这份职业 001
1.1 写在前面 002
1.2 入行前 002
1.2.1 对于ACM国际大学生程序设计竞赛的理解 002
1.2.2 参加校招 003
1.3 入行后 004
1.3.1 深度思考 004
1.3.2 工作时间 004
1.3.3 公司的选择 005
1.3.4 为什么软件基础设施技术人员话语权不高 005
1.3.5 为什么去做高难度的技术 005
1.3.6 技术人员的上升通道 006
1.3.7 跟进最新技术的重要性 006
1.4 自勉 007
学习准备 008
2.1 软件安装 009
2.1.1 JDK安装 009
2.1.2 Eclipse安装与卸载 013
2.1.3 Eclipse快捷键介绍 017
2.1.4 虚拟机安装 020
2.2 数据结构 027
2.2.1 算法简介 027
2.2.2 数据类型简介 029
2.2.3 面向对象程序设计 029
2.2.4 算法效能分析 030
2.2.5 线性表 032
2.2.6 链表 033
2.2.7 堆栈 067
2.2.8 算术表达式的求值法 075
2.2.9 队列 078
2.3 难题解释 091
2.3.1 两个数字相加 091
2.3.2 寻找两个数组的中间数 093
2.3.3 查找字符串中最长非重复的子字符串 097
2.3.4 合并两个链表 098
2.3.5 汉诺塔问题 099
2.3.6 迷宫问题 105
2.3.7 八皇后问题 110
Java基础知识 114
3.1 switch关键字 115
3.1.1 Java 6中的使用方式 115
3.1.2 Java 7中的使用方式 116
3.1.3 新特性的优缺点 118
3.2 设计模式之单例模式 119
3.2.1 引言 119
3.2.2 详细介绍 119
3.3 设计模式之代理模式 125
3.3.1 引言 125
3.3.2 延迟加载 126
3.4 设计模式之适配器模式 132
3.4.1 引言 132
3.4.2 详细介绍 132
3.4.3 适配器模式在开源项目中的应用 137
3.4.4 适配器模式的使用 145
3.5 字符串操作优化 146
3.5.1 字符串对象 146
3.5.2 SubString使用技巧 147
3.5.3 切分字符串 148
3.5.4 合并字符串 150
3.6 数据定义和运算逻辑优化 154
3.6.1 使用局部变量 154
3.6.2 位运算代替乘除法 154
3.6.3 替换switch 155
3.6.4 一维数组代替二维数组 156
3.6.5 提取表达式 158
3.6.6 优化循环 159
3.6.7 布尔运算代替位运算 160
3.6.8 使用arraycopy() 162
3.7 Java I/O相关知识 163
3.7.1 Java I/O 163
3.7.2 Java NIO 164
3.7.3 Java AIO 174
3.8 数据复用 178
3.8.1 缓冲区 178
3.8.2 缓存 184
3.8.3 对象复用池 185
3.8.4 计算方式转换 187
3.9 集合类优化 189
3.9.1 集合类之间关系 189
3.9.2 集合接口 190
3.9.3 集合类介绍 192
3.9.4 集合类实践 194
3.10 Java 8迭代器模型 202
3.10.1 迭代器模式 202
3.10.2 Lambda表达式 204
3.10.3 Java 8全新集合遍历方式 204
3.11 Java 9入门 209
3.11.1 模块化编程 209
3.11.2 模块化系统目标 211
3.11.3 模块化的JDK 212
3.11.4 模块资源介绍 212
3.11.5 HelloWorld案例 213
3.12 常见面试题 214
Java深度知识 222
4.1 JVM内存区域 223
4.1.1 程序计数器 224
4.1.2 虚拟机栈 224
4.1.3 本地方法栈 228
4.1.4 Java堆 229
4.1.5 方法区 234
4.2 JVM为什么需要GC 235
4.2.1 JVM发展历史简介 235
4.2.2 GC发展历史简介 236
4.2.3 G1 GC基本思想 237
4.2.4 G1 GC垃圾回收机制 237
4.2.5 G1的区间设计灵感 238
4.3 如何使用SA工具 239
4.4 死锁及处理方式 246
4.4.1 死锁描述 246
4.4.2 死锁情况诊断 251
4.4.3 死锁解决方案 254
4.5 JavaCPP技术 256
4.5.1 JavaCPP示例 257
4.5.2 JavaCPP-presets简介 259
4.5.3 JavaCPP-presets示例 261
4.5.4 JavaCPP性能测试 270
4.6 Java 8解决的若干问题 271
4.6.1 HashMap 271
4.6.2 行为参数化 273
4.6.3 读取文件 276
4.6.4 Stream 277
4.7 JDK 8与G1 GC实践 291
4.7.1 基础解释 291
4.7.2 G1 GC参数讲解 292
4.8 Java的优化方向 303
4.8.1 Java EE 303
4.8.2 函数式语言 305
4.8.3 VM启动时间优化 307
4.8.4 JIT编译器 308
4.9 代码规范深度解读 308
4.9.1 下画线或美元符号 309
4.9.2 拼音与英文混合 309
4.9.3 类命名 309
4.9.4 方法名、参数名和变量名 310
4.9.5 常量命名 312
4.9.6 抽象类的命名 312
4.9.7 避免常量魔法值的使用 312
4.9.8 变量值范围 313
4.9.9 大括号的使用规定 313
4.9.10 单行字符数限制 314
4.9.11 静态变量及方法调用 315
4.9.12 可变参数编程 316
4.9.13 单元测试应该自动执行 318
4.9.14 单元测试应该是独立的 318
4.9.15 BCDE原则 318
4.9.16 数据类型精度考量 319
4.9.17 使用Char 321
Spring相关知识 323
5.1 Spring Boot 324
5.1.1 初始Spring Boot 324
5.1.2 Spring Boot示例 337
5.1.3 Spring Boot创建Restful API示例 341
5.1.4 Spring Boot使用JavaMailSender发送邮件 344
5.1.5 Spring Boot 1.5.x新特性 347
5.2 Spring Cloud 349
5.2.1 Spring Cloud简介 349
5.2.2 Spring Cloud Eureka 350
5.2.3 Spring Cloud Consul 353
5.2.4 分布式配置中心 354
5.3 Spring中的设计模式 358
5.3.1 解释器设计模式 358
5.3.2 构造器设计模式 358
5.3.3 工厂方法设计模式 362
5.3.4 抽象工厂设计模式 364
5.3.5 代理设计模式 366
5.3.6 策略设计模式 368
5.3.7 模板设计模式 370
数据库知识 374
6.1 关系型数据库和NoSQL数据库 375
6.1.1 关系型数据库 375
6.1.2 NoSQL数据库 378
6.2 PostgreSQL相关知识 380
6.2.1 基本操作 380
6.2.2 系统视图表 381
6.2.3 索引 384
6.2.4 查询计划 388
6.3 Cassandra相关知识 393
6.3.1 基本介绍 393
6.3.2 数据模型 393
6.3.3 关键特性 394
6.3.4 访问服务端 397
6.3.5 无中心化实现因素 403
6.3.6 性能测试工具 408
高端技术汇总 411
7.1 分布式系统 412
7.1.1 店长负责制 412
7.1.2 订单处理方式 414
7.1.3 员工角色拆分 415
7.1.4 多个任务接收 416
7.1.5 订单处理过程上屏 416
7.1.6 异常数据干扰 417
7.1.7 座位设计模式 418
7.2 选举算法的机制 419
7.2.1 最简单的选举算法 419
7.2.2 拜占庭问题 420
7.2.3 Paxos算法 422
7.2.4 ZAB协议 424
可能是因为之前报社记者的工作经历,本书作者周工(周明耀)在我周围的同事当中,是那种特别善于总结并将其用文章表达出来的人。也正是这种优势,让他能将工作学习中的经验惠及更大的
人群。
这本书是写给从事软件行业的时间在-2(准备选择软件行业的求职者)到+2(软件行业的职场新人)年之间的人的,全书的前半部分内容结合了作者自己在长期的校招,以及后续的新人导师的工作中积累的心得感受,从职业认知和基础知识储备两个方面总结了软件行业对那些准备选择这个行业的求职者的基本要求,并就行业工作特点做了适度展开,这也有利于求职者充分认识软件行业的基本工作状态,结合自身的特点做出更合适的职业选择。
国内软件行业近些年来发展得如火如荼,千百万个年轻人从大学甚至中学时起就憧憬着有一天可以像扎克伯格那样从工程师到CEO,成为人生赢家。那么现实是怎么样的呢?我工作了20多年,负责过各种各样的软件团队,深感哪里都有江湖,在软件的江湖里,有许多的事情要初入职场的你去经历和体悟,但其实你并不孤单。在“预见未来的自己”一章里,你也许会读到一样的困顿和纠结,这时你才发现,大家都是在自己成长的道路上艰难跋涉而已。更为难得的是,书中除了有作为研发经理的作者的经验,还引入了同为我的同事的资深系统架构师季怡的成长感悟,从软件管理通道和软件技术通道两个角度更加全面地为职场新人提供建议和指导。
这本书的题目叫《程序员炼成记:从小白到工程师》,作者的上一本书叫《技术领导力:程序员如何才能带团队》,据悉后续还有更加宏大的计划。让我们一起期待吧!
—海康威视研究院大数据技术部总监 闫春
7岁那年,当我读完《上下五千年》上、中、下三册全书时,我对自己说:“我想当个作家。”2016年4月我出版了《大话Java性能优化》,4个月后第2次印刷;2017年5月,我出版了《深入理解JVM&G1 GC》,半年后第2次印刷;2018年,我的第三本书《技术领导力:程序员如何才能带团队》面世,这本书在京东创下了连续几个月100%好评的纪录;如今,我的第四本书《程序员炼成记:从小白到工程师》也即将面世。我对自己的每一本书都怀着忐忑、惊喜的心情,就像第一次面对我的女儿。
我一直在考虑如何写这么一本书,它能够反映出我自己是如何学习软件技术、如何去积累的,因为有情怀,所以我在做这样的事。以技术管理知识为例,2018年年初,我总结自己和朋友的经验并结合软件工程理论出版了《技术领导力:程序员如何才能带团队》一书,现在我想写一本书分享给工作两年以下的人,使他们知道如何去学习,而不是仅仅教他们如何拿到Offer。当然,也希望这本书能够覆盖应用软件开发岗位的校招面试范围,帮助学生拿到Offer。这也是本书的由来。
本书分为以下8个章节。
第1章 了解这份职业:主要介绍自己对于这份职业的理解,以及这份职业的责任、内容、发展、困难等。
第2章 学习准备:主要介绍软件安装、数据结构和难题解释。
第3章 Java基础知识:主要介绍由各种Java基础知识引申出来的内容。
第4章 Java深度知识:主要介绍JVM、死锁、CPP技术、Java 8技术、G1 GC的实践、Java的优化方向及代码规范深度解读等Java深度知识。
第5章 Spring相关知识:主要介绍热门的Spring Boot、Spring Cloud和Spring中的设计模式。
第6章 数据库知识:主要介绍关系型数据库PostgresSQL和NoSQL数据库Cassandra。
第7章 高端技术汇总:主要介绍分布式技术、消息中间件、大数据框架、搜索引擎、事务、Linux隔离技术及Go语言入门等。
第8章 预见未来的自己:主要介绍未来可能会遇到的挫折、不愿意面对的领导,以及在工作的不同时期会遇到的不同状况,针对这些情况的分析和总结。
本书提供源代码下载,扫描下方二维码可进行下载。
本书的目的并不仅仅是帮助读者拿到Offer,还包括帮助读者找到学习方法、了解未来的发展方向。最后送大家一句话:不要担心眼前安逸的生活即将结束,而是应该担心真正的生活从未开始。
感谢我的家人,我的妻子美丽、细心、博学,并且还很温柔,我很爱她;我的女儿性格很像我,希望她能够踏踏实实做人,保持创新精神,平平安安、健健康康地生活下去;感谢我的岳父母、我的父母,他们帮我照顾孩子,我才有时间编写此书;感谢浙江省特级教师、杭州高级中学(杭一中)化学老师郑克良,郑老师的一句“永远不要放弃”,推动着我多年不断前进;感谢数学老师张老师在公开场合对我的褒奖,张老师的赞赏对性格内向、内心细腻的我起着重要的作用。感谢我生命中出现的恩师、良友,有你们的存在,让我得以绽放。
本书的稿费将会捐献给杭州慈善总会的小额命名款项—“郑克良先生的学生”,用于感谢郑克良老师在我人生中播种下的“永远不要放弃”的种子。
我相信这本书不是终点,它是“麦克叔叔”一系列技术书籍中的一员,欢迎加入我的朋友圈,可以通过微信号michael_tec或者微信公众号“麦克叔叔每晚10点说”和我联系。
Write a great book that millions could read is my passion!
本书教你如何去学习,而不是仅仅教你如何拿Offer!
愿本书成为你入行的起点,而不是终点!
周明耀,浙江大学工学硕士,技术爱好者,13年职业生涯覆盖新加坡、美国、中国,提交发明专利超过15项。此外,担任InfoQ、IBM开发者论坛专栏作家,著有《大话Java性能优化》、《深入理解JVM&G1 GC》、《技术领导力-如何带领一支软件研发团队》。
本书主要介绍了作为一名软件工程师应该具备的编码能力、理解能力,通过虚拟的麦克叔叔、小侄子、小侄女,三人生动的对话,逐渐对涉及一名软件工程师所需要具备的技术、管理、业务能力进行全方面学习。主要内容包括:第一章:重点介绍软件开发流程、软件工程师职责。第二章:重点介绍Java编码技术,特别对Java8编码技术演示。第三章:重点介绍Linux操作系统相关知识。第四章:重点介绍Shell、Python编程及案例。第五章:重点介绍分布式技术相关的开源框架原理及使用方式。第六章:重点介绍其他相关技术,辅以编码示例。第七章:重点介绍项目管理流程,对相应职责进行解释,并编写团队相处、技术管理等知识。第八章:对未来技术发展、行业动向等进行全方面的深入解释