目录
第1章 招聘程序员:内幕 1
1.1 招聘的原因 2
1.1.1 公司计划扩张 2
1.1.2 特定的项目 4
1.1.3 有员工离职 5
1.2 同经理谈话 5
1.2.1 技术对话——不要有所保留 6
1.2.2 使用比喻 6
1.3 准备简历 6
1.3.1 囊括相关关键词,注意上下文 7
1.3.2 文笔要好 7
1.3.3 对工作经验作出解释 7
1.3.4 不要听信“简历不能超过两
页”的建议 8
1.3.5 着重强调招聘广告中的技能 8
1.3.6 工作经历间不要留有情况不
明的空白期 8
1.3.7 “读书、听音乐、看电影” 8
1.3.8 条理清晰 9
1.3.9 应届生简历 9
1.3.10 工作经验过多的简历 9
1.3.11 回归职场的简历 10
1.3.12 简历的常见错误 10
1.4 使用招聘网站 11
1.5 招聘中介 12
1.6 自己搜索职位 14
1.6.1 内向者的关系网 14
1.6.2 寻找雇主 15
1.6.3 接近雇主 16
1.6.4 坚持不懈 17
1.6.5 把握时机 17
1.7 其他途径 17
1.7.1 Twitter 17
1.7.2 Facebook 18
1.7.3 LinkedIn 19
1.7.4 博客 19
1.7.5 Stack Overflow 20
1.7.6 Skills Matter项目:“寻找你
的师傅” 21
第2章 自信地应对电话面试 22
2.1 有的放矢 23
2.1.1 准备你的“小抄” 24
2.1.2 联系相关经历 25
2.1.3 处理难题 25
2.1.4 学会提问 26
2.1.5 电话面试准备清单 27
2.1.6 使用电话面试准备清单 27
第3章 现场面试 29
3.1 准备面试 29
3.1.1 了解充分 29
3.1.2 做足功课 30
3.1.3 着装得体 31
3.1.4 搞定不同类型问题 32
3.2 最重要的事 34
3.2.1 建立默契 35
3.2.2 其他努力 35
3.3 同样重要的事 36
3.3.1 表达要清晰 36
3.3.2 掌控面试时间 36
3.3.3 用事实说话 37
3.4 有效交流 37
3.4.1 用热情战胜紧张 37
3.4.2 使用手势 37
3.4.3 放慢语速 38
3.4.4 开始和结尾要清晰 38
3.4.5 重复主要观点 38
3.4.6 熟能生巧 38
第4章 合同谈判 39
4.1 了解招聘市场 39
4.2 算算账 40
4.2.1 考虑整体待遇 40
4.2.2 必须有、应该有、最好有 41
4.3 招聘中介的作用 42
4.4 开个好头 42
4.4.1 避免过分让步 42
4.4.2 理想和现实 43
4.5 衡量合同条款 43
4.5.1 知识产权 43
4.5.2 不竞争条款 44
4.5.3 不招揽条款 44
4.6 如何应对不利状况 44
4.6.1 “这是一份标准合同” 44
4.6.2 沉默回应 45
4.6.3 谈判结果恶化 45
4.7 谈判技巧总结 45
第5章 编程基础 46
5.1 二进制、八进制、十六进制 47
5.1.1 十六进制转换为二进制 48
5.1.2 Unicode 49
5.2 数据结构 51
5.2.1 数组 51
5.2.2 散列表 51
5.2.3 队列和栈 52
5.2.4 树 52
5.2.5 图 53
5.2.6 图的遍历 54
5.3 排序 54
5.4 递归 56
5.5 面向对象编程 57
5.5.1 类和对象 57
5.5.2 继承和复合 58
5.5.3 多态 59
5.5.4 用封装实现的数据隐藏 60
5.6 像函数式程序员一样思考 60
5.7 SQL 61
5.7.1 什么是ACID 61
5.7.2 基于集合的思考方式 61
5.8 全栈Web开发 61
5.9 解密正则表达式 62
5.9.1 用锚定和单词边界来查询内容 64
5.9.2 匹配字符集 65
5.9.3 用限定符约束的匹配 67
5.9.4 组和捕获 68
5.9.5 不要想当然 69
5.9.6 延伸阅读 70
5.10 辨认难题 71
5.11 问题 71
5.12 答案 73
第6章 代码质量 85
6.1 保持清晰 86
6.2 富于表达能力 87
6.3 效率和性能评估 87
6.3.1 大O表示法 88
6.3.2 性能评估 92
6.3.3 注意应用情境 92
6.3.4 目标明确 92
6.3.5 多次评估,取平均值 92
6.3.6 分治策略 93
6.3.7 先简后繁 93
6.3.8 使用分析器 93
6.4 理解“模块化”的含义 93
6.5 理解SOLID原则 94
6.5.1 单一职责原则 95
6.5.2 开放封闭原则 96
6.5.3 里氏替换原则 97
6.5.4 接口分离原则 97
6.5.5 依赖倒置原则 98
6.6 避免代码重复 99
6.7 问题 101
6.8 答案 106
第7章 常见问题 123
7.1 并发编程 124
7.1.1 竞态条件 125
7.1.2 锁 126
7.1.3 死锁 130
7.1.4 活锁 131
7.2 关系数据库 131
7.2.1 数据库设计 132
7.2.2 规范化 132
7.2.3 反规范化 133
7.2.4 填充规范化数据库 134
7.3 指针 134
7.3.1 接收值类型参数的函数 136
7.3.2 数组的处理 136
7.3.3 值传递和引用传递 137
7.4 设计问题 139
7.4.1 YAGNI不是走捷径的借口 140
7.4.2 设计要考虑性能 140
7.4.3 不要只关注理论 140
7.5 不良编码习惯 141
7.5.1 错误的异常处理 141
7.5.2 不够谨慎 142
7.5.3 过于迷信 143
7.5.4 和团队对着干 143
7.5.5 太多的复制粘贴 144
7.5.6 预加载 144
7.6 问题 145
7.7 答案 146
第8章 编程语言的特性 151
8.1 二进制小数和浮点数 151
8.2 JavaScript 152
8.3 C# 152
8.4 Java 153
8.5 Perl 153
8.6 Ruby 154
8.7 Transact-SQL 154
8.8 问题 154
8.8.1 二进制小数和浮点数 154
8.8.2 JavaScript 155
8.8.3 C# 157
8.8.4 Java 158
8.8.5 Perl 160
8.8.6 Ruby 162
8.8.7 Transact-SQL 163
8.9 答案 164
第9章 软件测试:不只是测试人员的
工作 194
9.1 单元测试 194
9.2 测试驱动开发 195
9.2.1 行为驱动开发 195
9.2.2 红、绿、重构 195
9.3 写出优秀的单元测试 196
9.3.1 运行速度快 196
9.3.2 尽量简单 196
9.3.3 目的明确 196
9.3.4 具有指导性 196
9.3.5 具有独立性 196
9.4 测试运行缓慢的模块 197
9.5 单元测试框架 197
9.6 模拟对象 199
9.7 问题 201
9.8 答案 203
第10章 选择合适工具 210
10.1 Visual Studio 210
10.2 命令行工具 210
10.3 PowerShell 211
10.4 Sysinternals工具 212
10.5 管理源代码 212
10.5.1 Team Foundation Server 212
10.5.2 Subversion 212
10.5.3 Git 212
10.6 问题 213
10.6.1 Visual Studio 213
10.6.2 命令行工具 215
10.6.3 PowerShell 216
10.6.4 Sysinternals工具 217
10.6.5 管理源代码 217
10.7 答案 218
第11章 冷僻问题 240
11.1 快速估算 240
11.2 脑筋急转弯 241
11.3 概率问题 241
11.4 并发处理 241
11.5 位操作技巧 241
11.6 使用递归算法 242
11.7 理解逻辑门 242
11.8 编写代码 243
11.9 问题 244
11.9.1 快速估算 244
11.9.2 脑筋急转弯 244
11.9.3 概率问题 245
11.9.4 并发处理 246
11.9.5 位操作技巧 247
11.9.6 使用递归算法 247
11.9.7 理解逻辑门 249
11.9.8 编写代码 250
11.10 答案 251
第12章 编程智慧 278
12.1 问题 278
12.2 答案 282
附录 准备小抄 309