程序员炼成记(从小白到)
正版现货 可开具图书发票 下单后当天即可发货
¥
75.67
7.6折
¥
99
全新
库存2件
作者周明耀
出版社北京大学
ISBN9787301298930
出版时间2018-10
装帧其他
开本其他
定价99元
货号30301909
上书时间2024-10-26
商品详情
- 品相描述:全新
- 商品描述
-
目录
\"了解这份职业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?替换switch155
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 NIO164
3.7.3?Java AIO174
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?模块化的JDK212
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为什么需要GC235
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?HashMap271
4.6.2?行为参数化273
4.6.3?读取文件276
4.6.4?Stream277
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 EE303
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?使用Char321
Spring相关知识323
5.1 Spring Boot324
5.1.1?初始Spring Boot324
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 Cloud349
5.2.1?Spring Cloud简介349
5.2.2?Spring Cloud Eureka350
5.2.3?Spring Cloud Consul353
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\"
内容摘要
\" 《程序员炼成记:从小工到工程师》主要介绍了作为一名软件工程师应具备的能力。内容主要包括Java的基础知识和JVM、死锁、CPP技术、Java8技术、G1?GC的实践、Java的优化方向、代码规范深度解读等深度知识,Spring?Boot、Spring?Cloud、Spring里的设计模式,关系型数据库的代表PostgresSQL和NoSQL数据库的代表Cassandra,分布式技术、消息中间件、大数据框架、搜索引擎、事务、Linux隔离技术、Go语言入门等高端技术。最后一章,包含了作者多年的经验总结,列举了可能会遇到的问题,并提出了解决思路。
本书适合所有软件工程师,尤其适合工作两年以下的人,力求覆盖应用软件开发岗位的校招面试范围。\"
精彩内容
第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小时,毕竟一个人的睡眠时间是需要保证的,也需要有一些陪伴家人和个人娱乐的时间。
— 没有更多了 —
以下为对购买帮助不大的评价