×
程序员炼成记:从小白到工程师

程序员炼成记:从小白到工程师

1星价 ¥71.3 (7.2折)
2星价¥71.3 定价¥99.0
暂无评论
图文详情
  • ISBN:9787301298930
  • 装帧:一般胶版纸
  • 册数:暂无
  • 重量:暂无
  • 开本:其他
  • 页数:560
  • 出版时间:2017-02-01
  • 条形码:9787301298930 ; 978-7-301-29893-0

本书特色

1.零基础入行指南,适合从事软件行业的时间在-2到+2年之间的人。 2.总结了好程序员需要的优秀思想和精益方法,并给想要从事这个行业的人提出了很多切实可行的建议以及优秀程序员的培养过程。 3. 涵盖了主流新技术,包括分布式技术、消息中间件、大数据框架、搜索引擎、Spring Boot、Spring Cloud、JVM、死锁、Linux隔离技术等。

内容简介

"    《程序员炼成记:从小工到工程师》主要介绍了作为一名软件工程师应具备的能力。内容主要包括Java的基础知识和JVM、死锁、CPP技术、Java8技术、G1?GC的实践、Java的优化方向、代码规范深度解读等深度知识,Spring?Boot、Spring?Cloud、Spring里的设计模式,关系型数据库的代表PostgresSQL和NoSQL数据库的代表Cassandra,分布式技术、消息中间件、大数据框架、搜索引擎、事务、Linux隔离技术、Go语言入门等高端技术。很后一章,包含了作者多年的经验总结,列举了可能会遇到的问题,并提出了解决思路。     本书适合所有软件工程师,尤其适合工作两年以下的人,力求覆盖应用软件开发岗位的校招面试范围。"

目录

了解这份职业 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
展开全部

节选

第1 章 了解这份职业 正式了解技术前,先讲一下我和我的朋友们的经历,以及我对程序员这份 工作的理解。看完后,你再决定是否要成为一名程序员,或者是否坚持下去。 这也是本章需要解决的问题,它主要包括以下内容。 >>  程序员这份工作涉及哪些方面的知识、前景如何 >>  关于思考、工作时间、公司选择等的个人看法 >>  关于软件人员地位、高难度技术的个人看法 >>  关于技术人员的上升通道、跟进*新技术的重要性的个人看法 1.1 写在前面 某一天我和两位发小聚餐,了解到我们3 个人都选择了程序员作为自己的职业,刚开始时都是做*基础的工作,往后的十几年开始出现了发展偏差。十四五年过去了,我们都在职业的重要选择点上面临选择,虽然选择不同,幸运的是我们都走在了适合自己的道路上。 我一直认为,如果勉强自己做一件不喜欢的事情,那么很难有动力在今后的工作中继续前进。 选择成为一名程序员,大概是在十六七岁时,那时候父母给我买了**台电脑(一台586 电脑),在我的内心种下了一颗种子。IT 行业是个知识更新非常快的行业,而我又是一个喜欢尝试新事物的人,心理承受能力也较强,所以程序员是一个不错的选择。此外,IT 行业的机会很多,也适合我。以现在的年纪回顾过去,我认为,自己没有选错。 这里我只是挑选了在选择程序员这份工作时所需面对问题中的一部分大家关注的话题来讲我的理解,并不是对程序员的职业规划进行分享。本章分为入行前和入行后两个部分分别进行介绍。 1.2 入行前 所谓入行前,其实是对于还是学生的你,或者还在迷茫是否需要坚持这份工作,是否应该选择程序员作为工作职业及如何获得这份工作的你。作为一名在这个行业从事多年的人,我觉得真的要想清楚程序员这份工作是否适合你,因为这份职业牵扯的个人精力实在太多,导致自己不可能有太多的个人爱好,也确实没有太多陪伴家人的时间,加班几乎是这个行业的标签。大家都知道,很多程序员会自嘲地称自己为“码农”。目前来看,程序员是*容易逆袭的职业,从收入角度也是*容易逆袭的工作。 入行前,以学生为例,除了正常的上课、实习之外,还可以通过一些竞赛类的准备工作提升自己的技术能力;此外,学生一般也需要通过校招进入技术含量较高的科技公司。针对这两点,我分别谈谈自己的看法。 1.2.1 对于ACM 国际大学生程序设计竞赛的理解 以个人的经验,参加ACM 国际大学生程序设计竞赛(ACM-ICPC)的学生遇到的问题有点类似于高中各学科竞赛,需要为了提高竞争力而学习比较深层次的知识,需要做大量的题来积累经验,但致命的是除了**高中竞赛选手和**大学的ACM-ICPC 爱好者(ACMer)外,其他人学习的知识都不太系统,尤其是数学上的。 大多数人对数学的学习仅仅局限于数据结构、离散数学,可能因为ACM-ICPC 要有数论题而学习了一些数论和组合数学的基础,具体就不会去深入学习。结果,ACMer 的数学功底并没有因为ACM-ICPC的做题训练而提高,对算法的理解甚至可能仅局限于套用算法模板,这对于未来想从事算法研究的人来说,无论是在公司为了某个任务做优化,还是在研究机构发表论文,都会存在致命的基础短板。 ACM-ICPC 除了算法以外,带来的间接好处是可以提高编程能力,但很明显提升编程能力的主要途径就是编程,至于写什么样的代码、什么语言的代码,区别不是很大。但不可否认,准备ACM-ICPC 确实是一个可以锻炼写代码能力的机会。 公平地说,ACM-ICPC 依然是我接触的大学里所有比赛中*公平、*锻炼能力的,它的准备时间长、比赛时间短、评价体系又比较客观。如果想参加比赛,ACM-ICPC 应该是计算机专业的首选,但并不是说ACM-ICPC 有很大价值,因为ACM-ICPC 本身就是一种游戏,它可以让人痴迷,可以形成一种容不得别人说ACM-ICPC 不好的圈子。不管怎么说,可以肯定的是,ACM-ICPC的经历让学生更容易被公司录用,因为“平均水平”高一些,参加ACM-ICPC 的人可能更有能力,尤其是编码这种无法体现在简历上的实际能力。 1.2.2 参加校招 连续几年参与了公司组织的校园招聘工作,每次去都会见到大量的学生,我喜欢和他们交流,观察他们的一言一行。为了进一步了解他们的性格特点和综合能力,我每次都会自己准备面试题目,这些题目包括编程基本概念、算法编程、操作系统、数据库编程、开源代码阅读、垃圾回收机制、系统架构描述、实习期经历回顾、人生过程中遇到过的挫折、对于工作氛围的想法、未来的职业发展方向设定等。 这些问题其实大多数都是开放式问题,一些没有固定的答案,另一些甚至是完全开放式的,需要学生提出问题。我的这组题目中,可能只有编程基本概念这一条有固定的标准答案;算法编程、数据库编程都有多种回答方案,只不过每一种回答的运行效率不同,这些都属于半开放式的技术问答;操作系统、开源代码阅读、垃圾回收机制、系统架构描述,这些问题则属于是自己出题的题目,为什么这么说?因为我会根据你所了解的知识一点点地深究下去,一点点往下问,所以这是完全开放式的技术问答;实习期经历回顾、人生过程中遇到过的挫折、对于工作氛围的想法、未来的职业发展方向设定这4 个问题属于非技术领域的完全开放问答,我之所以提出这些问题,是希望能够更加接近学生的真实生活、内心想法,了解学生的过往经历、内心想法,以及生活环境和周边朋友,这样可以决定是否录用,以及如何更好地发挥他们的能力。 我讲一下自己的应聘面试经历。很多年前,我去参加一家德国企业的面试,总经理是位中国人,50 来岁的老博士,他让我谈谈对公司情况的了解。我已经做足了功课,把他们网站上的英文背出来了,我一边背,他一边睁大了眼睛,扶了扶眼镜,还纠正了我对于创始人德文名字的发音错误,然后和我说:“你有什么要求,现在就可以提”。 除了实际的技术基础能力外,我觉得一名学生还需要具备大的格局,不要局限于眼前利益,不要只考虑自己。推荐大家担任大公司的“校园大使”,这个工作一定要尽自己*大可能做好,积极配合HR,其实在这个过程中你也在被观察。我有次就遇到了3 位截然不同的校园大使,**位校园大使非常认真,两天时间忙上忙下,布置会场、参与宣讲会、电话联系学生、引导学生面试流程等,还找了几位好朋友过来帮忙,忙到自己没有时间参加面试,虽然他存在不太善于沟通的弱点,但是我在结束面试后,单独给他留出了面试时间,并且和HR 一起邀请他加入;第二位校园大使面试当天就坐下来面试了,技术一般,他自己介绍是校园大使,我正在犹豫时HR 和我聊起了他,说:“这个人责任心太差,请他帮忙招呼学生,他都懒得说话,只管自己玩手机,请他打电话联系没有来的学生问明情况,他一脸不屑,好像很看不起我们公司。”“既然他看不上我们,我们也不用给他机会了。”他就这么错过了一家很棒的公司;第三位校园大使面试当天,她给自己安排了一天的面试,在我们这里出现了一下就消失了,等她所有公司都面试完后才来,我们选择直接忽略了她。 1.3 入行后 1.3.1 深度思考 我觉得技术能力是可以培养的,而且可以快速培养,只要这个人具备深度思考的能力。为什么这么认为?因为知识体系的建立一定是基于思考之上的,也就是说,是具有逻辑感的,是思考后的总结,而不是单纯的内容填充。 我多年来养成一种习惯,或者说不得不养成这样的习惯,就是在夜深人静时,静静地思考一天的经历。白天,大部分时间是在异常忙乱中度过的,没有时间思考。夜幕降临,一切归于宁静,望着窗外闪烁的路灯,可以静静地思考自己和世界,思考在自己从事的工作中发生的各种各样或大或小的事情,从中找出有意义的东西,做一点小小的思想享受。这种思考,对人是有益的。一个人做多了自己的职业活动,如果不调整,就会变得单一,思想也慢慢定向,没有开放式的思维方式。所以要在紧张的大脑和肢体活动之余,发现思维的新空间。 作为一名软件工程师,我的大部分时间都用在了这个领域。我发现,生活中的几乎所有细节也可以在这个领域中找到对应点或面。此外,程序员也需要从产品、运营方面思考技术,这样才能不断拓宽自己的思考方式。我之所以愿意把这些思想“沉淀”积累起来,不是因为它们有特别的价值,而是因为它们是在宁静的外界和宁静的内心状态下形成的。“宁静致远”对拥有技术愿景的程序员来说,是一个值得追求的境界。 1.3.2 工作时间 时间是很值钱的,这种事情很多时候必须等到毕业开始工作了才能理解。一个原因是对绝大多数学生来说,工作之后的空闲时间会变少,那么原来业余生活中快感度比较低的事情就不做了,这是因为时间可以换来收入,而收入可以用来在空闲时间换取更多的快感,那么你的选择空间也就更多了。上学时,空闲的时间太多,以至于连写东西吐槽都能排上日程。 我在一篇描述自我管理方式的文章中不小心说出了自己每天的工作时间(这里说的工作时间,其实也是学习时间。对于程序员来说,所有工作时间都是可以用来学习的)是10~12 小时,引起了读者的评论,我可以肯定地回答,确实是这样的。作为一名程序员,我认为每周的工作时间应该保持在60~65 小时,因为这个行业的技术更新速度实在太快了,我认识的所有厉害的“大牛”都是这么熬过来的,没有人可以用很短的时间学会别人花费很长时间学会的技术。当然,每周的工作时间*好能够控制在75~80 小时,毕竟一个人的睡眠时间是需要保证的,也需要有一些陪伴家人和个人娱乐的时间。

作者简介

  周明耀,2004年毕业于浙江大学,工学硕士。13年软件研发经验,近10年技术团队管理经验,4年分布式计算、大数据技术经验。出版书籍包括《大话Java性能优化》《深入理解JVM&G1 GC》《技术领导力:程序员如何才能带团队》。

预估到手价 ×

预估到手价是按参与促销活动、以最优惠的购买方案计算出的价格(不含优惠券部分),仅供参考,未必等同于实际到手价。

确定
快速
导航