├── README.md ├── story └── why-i-studied-full-time-for-8-months-for-a-google-interview.MD └── tips ├── ABC-保持编码.MD ├── 为编程面试选择一种语言.MD └── 白板编程.MD /README.md: -------------------------------------------------------------------------------- 1 | # 开发人员面试大学 2 | 3 | 一个国外大神,每天8~12个小时,自学了几个月后,加入了Google。随后他公开了他的学习主题清单。在做完这份清单上的每个目标后,他成为了Google的软件开发工程师! 这份清单包含了几乎所有的成为优秀工程师的知识。 4 | 5 | 另外这里面还有他的经历“[我为了 Google 面试而自学了8个月](https://github.com/jiangmin42/Coding-Interview-University/blob/main/story/why-i-studied-full-time-for-8-months-for-a-google-interview.MD)”、“我是怎么加入亚马逊的”。 6 | 7 | 在这份清单内的主题会让你拥有足够的知识去面对几乎每家软件公司的技术面试,包括科技巨头:Amazon、Facebook、Google,以及 Microsoft。 8 | 9 | 当然如果你在国内,腾讯、华为、阿里巴巴、字节跳动也不在话下了。 10 | 11 | **本文是他完整清单的翻译版(目前正在翻译中),可以看出这位大神的清单非常庞大,涉及说明、文档、资料、视频,我将尽我所能全部为其翻译成中文提供给大家,如果感兴趣想要一起翻译,请关注公众号:【深浅说道】找我** 12 | 13 | # 前言 14 | 15 | 清单只是一部分,完全学会并掌握它才是全部。 16 | 17 | 毕竟大神也需要每天8~12个小时的刻苦学习。 18 | 19 | 这是我为了从 web 开发者(自学、非计算机科学学位)蜕变至 Google 软件工程师所制定的计划,其内容历时数月。 20 | 21 | 这份清单适用于 **新手软件工程师**,或者想从软件/网站开发转向软件工程(需要计算机科学知识)的人员。如果你有多年的经验,并且声称拥有多年的软件工程经验,并且期待一次更艰难的面试。 22 | 23 | 如果你具有多年的软件/网页开发经验,请注意,大型软件公司(例如 Google,Amazon,Facebook 和 Microsoft)将软件工程视为不同于软件/网页开发,并且它们需要计算机科学知识。 24 | 25 | 如果你想成为可靠性工程师或运维工程师,请从可选列表(网络,安全)中学习更多。 26 | 27 | # 目录 28 | - [前沿](#qianyan) 29 | 30 | - [为何要用到它?](#whyuseit) 31 | 32 | - [如何使用它](#howuseit) 33 | 34 | - [不要觉得自己不够聪明](#DonotEenyYourself) 35 | 36 | - [相关视频资源](#RelatedVideos) 37 | 38 | - [面试过程 & 通用的面试准备](#InterviewPreparation) 39 | 40 | - [为你的面试选择一种语言](#ChooseAProgrammingLanguageForTheInterview) 41 | 42 | - [书单](#书单) 43 | 44 | - [在你开始之前](#在你开始之前) 45 | 46 | - [没有包含的内容](#在你开始之前) 47 | 48 | - [必备知识](#必备知识) 49 | 50 | - [日常计划](日常计划) 51 | 52 | - [算法复杂度 / Big-O / 渐进分析法](#算法复杂度) 53 | 54 | - 数据结构 55 | 56 | - 数组(Arrays) 57 | 58 | - 链表(Linked Lists) 59 | 60 | - 堆栈(Stack) 61 | 62 | - 队列(Queue) 63 | 64 | - 哈希表(Hash table) 65 | 66 | - 更多的知识 67 | 68 | - 二分查找(Binary search) 69 | 70 | - 按位运算(Bitwise operations) 71 | 72 | - 树(Trees) 73 | 74 | - 树 —— 笔记 & 背景 75 | 76 | - 二叉查找树(Binary search trees):BSTs 77 | 78 | - 堆(Heap) / 优先级队列(Priority Queue) / 二叉堆(Binary Heap) 79 | 80 | - 平衡查找树(Balanced search trees)(基本概念,非细节) 81 | 82 | - 遍历:前序、中序、后序、BFS、DFS 83 | 84 | - 排序 85 | 86 | - 选择排序(selection) 87 | 88 | - 插入排序(insertion) 89 | 90 | - 堆排序(heapsort) 91 | 92 | - 快速排序(quicksort) 93 | 94 | - 归并排序(merge sort) 95 | 96 | - 图(Graphs) 97 | 98 | - 有向图(directed) 99 | 100 | - 无向图(undirected) 101 | 102 | - 邻接矩阵(adjacency matrix) 103 | 104 | - 邻接表(adjacency list) 105 | 106 | - 遍历:广度优先(BFS), 深度优先(DFS) 107 | 108 | - 更多知识 109 | 110 | - 递归 111 | 112 | - 动态规划 113 | 114 | - 面向对象编程 115 | 116 | - 设计模式 117 | 118 | - 组合 & 概率 119 | 120 | - NP, NP-完全和近似算法 121 | 122 | - 缓存 123 | 124 | - 进程和线程 125 | 126 | - 测试 127 | 128 | - 调度 129 | 130 | - 字符串搜索和操作 131 | 132 | - 字典树(Tries) 133 | 134 | - 浮点数 135 | 136 | - Unicode 137 | 138 | - 字节顺序 139 | 140 | - 网络 141 | 142 | - 系统设计、可伸缩性、数据处理(如果你有4+年经验) 143 | 144 | - 终面 145 | 146 | - 编程问题练习 147 | 148 | - 编程练习和挑战 149 | 150 | - 当你临近面试时 151 | 152 | - 你的简历 153 | 154 | - 当面试来临的时候 155 | 156 | - 问面试官的问题 157 | 158 | - 当你获得了梦想的职位 159 | 160 | - ---------------- 下面的内容是可选的 ---------------- 161 | 162 | - 163 | 164 | - 额外书籍 165 | 166 | - 附加学习 167 | 168 | - 编译器 169 | 170 | - Emacs and vi(m) 171 | 172 | - Unix 命令行工具 173 | 174 | - 信息论 175 | 176 | - 奇偶校验位 & 汉明码 (视频) 177 | 178 | - 系统熵值 179 | 180 | - 密码学 181 | 182 | - 压缩 183 | 184 | - 计算机安全 185 | 186 | - 垃圾回收 187 | 188 | - 并行编程 189 | 190 | - 消息传递,序列化和队列化的系统 191 | 192 | - A* 搜索算法 193 | 194 | - 快速傅里叶变换 195 | 196 | - 布隆过滤器 197 | 198 | - HyperLogLog 199 | 200 | - 局部敏感哈希 201 | 202 | - van Emde Boas 树 203 | 204 | - 增强数据结构 205 | 206 | - 平衡查找树 207 | 208 | - AVL 树 209 | 210 | - 伸缩树(Splay tree) 211 | 212 | - 红黑树 213 | 214 | - 2-3 查找树 215 | 216 | - 2-3-4 树(也称 2-4 树) 217 | 218 | - N-ary (K-ary, M-ary)树 219 | 220 | - B 树 221 | 222 | - k-D 树 223 | 224 | - 跳表 225 | 226 | - 网络流 227 | 228 | - 不相交集 & 联合查找 229 | 230 | - 快速处理的数学 231 | 232 | - 树堆 (Treap) 233 | 234 | - 线性规划 235 | 236 | - 几何:凸包(Geometry, Convex hull) 237 | 238 | - 离散数学 239 | 240 | - 机器学习 241 | 242 | - 一些主题的额外内容 243 | 244 | - 视频系列 245 | 246 | - 计算机科学课程 247 | 248 | - 论文 249 | 250 | 251 | # 为何要用到它? 252 | 253 | 当我开始这个项目时,我不知道堆和栈的区别,不了解时间复杂度(Big-O)、树,或如何去遍历一个图。如果非要我去编写一个排序算法的话,我只能说我所写的肯定是很糟糕。一直以来,我所用的任何数据结构都是内建于编程语言当中。至于它们在背后是如何运作,对此我一概不清楚。此外,以前的我并不需要对内存进行管理,最多就只是在一个正在执行的进程抛出了“内存不足”的错误后,才会去找解决方法。在我的编程生涯中,虽然我有用过多维数组,也用过关联数组成千上万次,但我从来没有自己实现过数据结构。 254 | 255 | 这是一个漫长的计划,以至于花费了我数月的时间。若你早已熟悉大部分的知识,那么也许能节省大量的时间。 256 | 257 | # 如何使用它 258 | 259 | 下面所有的东西都只是一个概述。因此,你需要由上而下逐一地去处理它。 260 | 261 | 在学习过程中,我使用 GitHub 特殊语法的 markdown 去检查计划的进展,包括使用包含任务进度的任务列表。 262 | 263 | **创建一个新的分支,以便你可以像这样去勾选计划的进展:直接往方括号中填写一个字符 x 即可:[x]。** 264 | 265 | Fork一个分支,并跟随以下的指令 266 | 通过单击 Fork 按钮来 fork GitHub 仓库:jiangmin42/Coding-Interview-University 267 | 268 | 克隆项目到本地 269 | git checkout -b progress 270 | 271 | git remote add jwasham https://github.com/jiangmin42/Coding-Interview-University 272 | 273 | git fetch --all 274 | 275 | 在你完成了一些修改后,在框框中打 x 276 | git add . 277 | 278 | git commit -m "Marked x" 279 | 280 | git rebase jwasham/master 281 | 282 | git push --set-upstream origin progress 283 | 284 | git push --force 285 | 286 | [更多关于 Github-flavored markdown 的详情](https://guides.github.com/features/mastering-markdown/#GitHub-flavored-markdown) 287 | 288 | # 不要觉得自己不够聪明 289 | 290 | - 大多数成功的软件工程师都非常聪明,但他们都有一种觉得自己不够聪明的不安全感。 291 | 292 | - 天才程序员的神话 (视频,待翻译) 293 | 294 | - 不要单打独斗:面对技术中的隐形怪物(视频,待翻译) 295 | 296 | # 相关视频资源 297 | 298 | 译者语:这一部分全是国外的付费课程,我尽量找一些国内的类似的课程来替代。 299 | 300 | # 面试过程 & 通用的面试准备 301 | 302 | - [ ] [ABC:不要停止编程(Always Be Coding)](https://github.com/jiangmin42/Coding-Interview-University/blob/main/tips/ABC-%E4%BF%9D%E6%8C%81%E7%BC%96%E7%A0%81.MD) 303 | - [ ] [白板编程(Whiteboarding)](https://github.com/jiangmin42/Coding-Interview-University/blob/main/tips/%E7%99%BD%E6%9D%BF%E7%BC%96%E7%A8%8B.MD) 304 | - [ ] 揭秘技术招聘 (译者语:youtube视频,等我搬到国内) 305 | - [ ] 如何在科技四强企业中获得一份工作: 306 | - [ ] “如何在科技四强企业中获得一份工作 —— Amazon、Facebook、Google 和 Microsoft”(视频) (译者语:youtube视频,等我搬到国内) 307 | - [ ] 解密开发类面试第一集: 308 | - [ ] Gayle L McDowell —— 解密开发类面试(视频)(译者语:youtube视频,等我搬到国内) 309 | - [ ] 解密开发类面试 —— 作者 Gayle Laakmann McDowell(视频)(译者语:youtube视频,等我搬到国内) 310 | - [ ] 解密 Facebook 编码面试: 311 | - [ ]方法(译者语:youtube视频,等我搬到国内) 312 | - [ ]问题演练(译者语:youtube视频,等我搬到国内) 313 | - [ ] 准备课程: 314 | - [ ] 软件工程师面试发布(收费课程):(译者语:收费课程,等我找个类似免费的) 315 | - [ ]从前 Google 面试官身上学习如何准备自己,让自己能够应付软件工程师的面试。 316 | - [ ] Python 数据结构,算法和面试(收费课程):(译者语:收费课程,等我找个类似免费的) 317 | - [ ]Python 面试准备课程,内容涉及数据结构,算法,模拟面试等。 318 | - [ ] Python 的数据结构和算法简介(Udacity 免费课程):(译者语:收费课程,等我找个类似免费的) 319 | - [ ]免费的 Python 数据结构和算法课程。 320 | - [ ] 数据结构和算法纳米学位!(Udacity 收费纳米学位): 321 | - [ ]获得超过100种数据结构和算法练习以及指导的动手练习,专门导师帮助你在面试和职场中做好准备。 322 | - [ ] 探究行为面试(Educative 免费课程):(译者语:收费课程,等我找个类似免费的) 323 | - [ ]很多时候,不是你的技术能力会阻碍你获得理想的工作,而是你在行为面试中的表现。 324 | 325 | # 为你的面试选择一种语言 326 | 327 | 你可以在编程这一环节,使用一种自己用起来较为舒适的语言去完成编程,但对于大公司,你只有三种固定的选择: 328 | - C++ 329 | - Java 330 | - Python 331 | 332 | 你也可以使用下面两种编程语言,但可能会有某些限制,你需要实现查明: 333 | - JavaScript 334 | - Ruby 335 | 336 | 我之前写过一篇关于在面试时选择编程语言的文章:[为编程面试选择一种语言。](https://github.com/jiangmin42/Coding-Interview-University/blob/main/tips/%E4%B8%BA%E7%BC%96%E7%A8%8B%E9%9D%A2%E8%AF%95%E9%80%89%E6%8B%A9%E4%B8%80%E7%A7%8D%E8%AF%AD%E8%A8%80.MD) 337 | 338 | 你需要对你所选择的语言感到非常舒适且足够了解。 339 | 340 | 由于我正在学习C、C++ 和 Python,因此在下面你会看到部分关于它们的学习资料。相关书籍请看文章的底部。 341 | 342 | # 书单 343 | 344 | 为了节省你的时间,以下是比我使用过的更缩减的书单。(译者语:关于书单,我另行提供) 345 | 346 | # 在你开始之前 347 | 348 | 该列表已经持续更新了很长的一段时间,所以,我们的确很容易会对其失去控制。 349 | 350 | 这里列出了一些我所犯过的错误,希望你不要重滔覆辙。 351 | 352 | ## 1. 你不可能把所有的东西都记住 353 | 354 | 就算我观看了数小时的视频,并记录了大量的笔记,几个月后的我,仍然会忘却其中大部分的东西。所以,我花了3天翻阅我的笔记,并制作成抽认卡(flashcard)帮助我复习: 355 | 356 | 请阅读以下的文章以免重蹈覆辙: 357 | 358 | 记住计算机科学知识。 359 | 360 | ## 2. 使用抽认卡 361 | 362 | 为了解决善忘的问题,我制作了一个抽认卡的网页,用于添加两种抽认卡:一般的及带有代码的。每种卡都会有不同的格式设计。 363 | 364 | 而且,我还以移动设备为先去设计这些网页,以使得在任何地方,我都能通过我的手机及平板去回顾知识。 365 | 366 | 有一点需要记住的是,我做事有点过头,以至于卡片都覆盖到所有的东西上,从汇编语言和 Python 的细枝末节,到机器学习和统计都被覆盖到卡片上。而这种做法,对于要求来说是多余的。 367 | 368 | **在抽认卡上做笔记**: 若你第一次发现你知道问题的答案时,先不要急着把其标注成“已知”。反复复习这张抽认卡,直到每次都能答对后才是真正学会了这个问题。反复地问答可帮助你深刻记住该知识点。 369 | 370 | 这里有个替代我抽认卡的网站 [Anki](http://ankisrs.net/),很多人向我推荐过它。这个网站用同一个字卡重复出现的方式让你牢牢地记住知识。这个网站非常容易使用,支持多平台,并且有云端同步功能。在 iOS 平台上收费25美金,其他平台免费。 371 | 372 | ## 3. 复习,复习,再复习 373 | 374 | 我留有一组 ASCII 码表、OSI 堆栈、Big-O 记号及更多的抽认卡,以便在空余的时候可以学习。 375 | 376 | 编程累了就休息半个小时,并去复习你的抽认卡。 377 | 378 | ## 4. 专注 379 | 在学习的过程中,往往会有许多令人分心的事占据着我们宝贵的时间。因此,专注和集中注意力是非常困难的。放点纯音乐能帮上一些忙。 380 | 381 | # 没有包含的内容 382 | 383 | 有一些熟悉且普遍的技术在此未被谈及到: 384 | 385 | - SQL 386 | - Javascript 387 | - HTML、CSS 和其他前端技术 388 | 389 | # 必备知识 416 | 417 | - 学习C语言 418 | - C 语言无处不在。在学习的过程中,你会在书籍,讲座,视频等任何地方看到它的身影 419 | - C程序设计语言,第二版 420 | - 这是一本简短的书,但是它将使你更好地使用 C 语言,并且如果你稍加练习,就会很快熟练。理解 C 可帮助你了解程序和内存的工作方式 421 | - 问题答案 422 | 423 | - 计算机是如何处理一段程序: 424 | - CPU 是如何执行代码(视频) (译者语:youtube视频,等我搬到国内) 425 | - 计算机如何计算(视频) (译者语:youtube视频,等我搬到国内) 426 | - 寄存器和内存(视频) (译者语:youtube视频,等我搬到国内) 427 | - 中央处理单元(视频) (译者语:youtube视频,等我搬到国内) 428 | - 指令和程序(视频) (译者语:youtube视频,等我搬到国内) 429 | 430 | # 算法复杂度 / Big-O / 渐进分析法 431 | -------------------------------------------------------------------------------- /story/why-i-studied-full-time-for-8-months-for-a-google-interview.MD: -------------------------------------------------------------------------------- 1 | # 我为什么全职学习了8个月来应对Google的面试 2 | 3 | 这是真的。我已经花了数千个小时阅读书籍,编写代码以及观看计算机科学讲座,所有这些都为Google软件工程师的面试做准备。 4 | 5 | 如果您想为Google面试做准备,这是我的学习计划: 6 | 7 | 中文翻译版:[开发人员面试大学](https://github.com/jiangmin42/Coding-Interview-University) 8 | 9 | ## 我怎么在这里 10 | 11 | 其实我从中学学习过编程,但是上大学的时候,我攻读了经济学学位。我的理由是,到我毕业时,程序员会供过于求。但是,我错了。 12 | 13 | 后来,我加入军队,军队安排我担任军事情报职务,接下来的两年我一直在学习朝鲜语,之后我在韩国服务了两年。(_译者语:因为作者是美国人,因此参军是参加美国的军队,然后到韩国美军基地任职。_) 14 | 15 | 在我离开军队之前,我试图重新学习编程,我在中学时就学习了BASIC,并一直在高中阶段也用过它。但是我用C++重新开始了编程研究,而跨度太大了。我完全看不懂。 16 | 17 | 我确实很喜欢制作网站,但是我使用了带有类似Word的界面的软件来发布网站,我不知道如何从头开始制作网站。(_译者语:类似word的界面的软件指的是所见即所得软件_) 18 | 19 | 退伍后,我决定在韩国呆了一年,教英语。我晚上和周末都使用Perl,HTML,CSS(当时是新功能),JavaScript和SQL学习Web编程。(译_者语:美国人先天条件太好了,什么都不会随便找个国家教英语也行。_) 20 | 21 | 经过一年的深入学习,我在西雅图地区找到了工作,此后就一直在这里。 22 | 23 | 我已经成为网站开发人员已有15年了。我已经建立了3家公司,其中2家仍在运营并产生收入。我曾在大型和小型公司工作过,曾帮助初创公司启动和发展,并招募和管理了团队。我曾经担任过产品经理,首席执行官,设计师和营销人员。 24 | 25 | 我的事业很成功,并且在此过程中学到了很多东西。但是我还没有完成。 26 | 27 | 我已经成为网站开发人员已有15年了。建立了3家公司,其中2家仍在运营并产生收入。我曾在大型和小型公司工作过,曾帮助初创公司启动和发展,并招募和管理了团队。我曾经担任过产品经理,首席执行官,设计师和营销人员。 28 | 29 | 我的事业很成功,并且在此过程中学到了很多东西。但是我还没有完成。 30 | 31 | ## 寻求职业变化 32 | 33 | 还记得我前面说过我没有获得计算机科学学位吗?这对我有一定的负面影响。 34 | 35 | 几年前,我以为我可以在任何地方被录用。我以为我很热门:难以捉摸的全栈Web开发人员。但是在2013年的求职过程中,我意识到自己的技能不足。我在业余时间花了很多时间通过创办企业来挣钱,以至于我的技术水平退化了,我没有跟上技术发展。 36 | 37 | 多年以来,我学到了足够的知识,我拥有广泛的技能,但是在任何方面都不是专家。 38 | 39 | 不要误会我的意思,我仍然可以被某些企业录用,但不是我想从事的那部分技术或领域。我可以被那些技术过时的领域录用。那里也有高工资,但是我没有看到令人兴奋的前景。 40 | 41 | 去年,在一次招聘会上,这一认知达到了顶峰。我对一家本地公司工作感兴趣,这家公司是由风险投资公司运营的创业实验室孵化的。但是,我缺乏计算机科学学位,以及与此学位相关的技能和知识,这意味着我没有机会。 42 | 43 | 我当时全职从事​​我的业务,​​今天仍然如此。 44 | 45 | 在2016年初,我认为是时候从Web开发人员转向软件工程师了。为了在几个月内获得计算机科学学位,我需要努力学习和练习,但是一旦完成,我就可以开始新的职业。(_译者语:这里指的是获取计算机科学学位同等的技术水平_) 46 | 47 | 您可能不会将Web开发和软件工程视为不同的职位。两者都涉及编程和工程,但是软件工程为它增加了数据结构和算法,编译原理,内存注意事项的知识,并了解编码和体系结构决策对它们所运行的环境的影响。 48 | 49 | 雇用软件工程职位的大公司希望应聘者具备这些知识。 50 | 51 | 我联系了一个在Google工作的熟人,问他有关他在公司工作的问题。我一直在阅读Google的工作原理,对Google已经相当熟悉。 52 | 53 | 通过另一个联系人,我收到了一份Google指导笔记的副本,该笔记将提供给面试候选人。这成为我学习计划的基础。 54 | 55 | Google是一个很棒的工作场所,但是在我还不是特别了解Google的情况下,Google成了我的目标。 56 | 57 | ## 为什么选择Google? 58 | 59 | Google为招聘设置了很高的标准。他们只想雇用最好的人。因此,如果我把眼光放高(在Google招聘),即使我没有被选中,我在其他地方仍然很容易被录用。 60 | 61 | 我对Google的了解越多,我希望在这里工作的越多。 62 | 63 | 简而言之,Google是一家聘请聪明,有创造力的人并善待他们的公司。Google会奖励功绩,鼓励大胆的想法,并赋予员工为用户做出良好决策的自由。 64 | 65 | 对招聘过程进行了优化,以吸引聪明,热情的人。多年来,Google一直在完善招聘和面试流程。脑筋急转弯的问题早已消失。如今,基于编码能力,技术知识和Googleyness选择候选人。这意味着有很多需要学习的地方。 66 | 67 | 管理风格也完全不同,经理们没有细致的管理。他们信任工程师做出正确的决定。信任员工会改变Google。此外,管理人员不能单方面雇用,解雇或晋升某个员工。可以视为办公室政治的许多重要管理决策均由委员会处理,以消除这种危险。 68 | 69 | Google的HR学会了随着时间的推移有效的方法,他们使用数据和员工反馈来改善评估系统,招聘流程,晋升,薪酬,福利等。Google的人力资源高级副总裁Laszlo Bock甚至写了一本书叫《Work Rules(工作规则)》,如果感兴趣,你可以阅读(译者语:没有中文版) 70 | 71 | 我参观了位于华盛顿州柯克兰(Kirkland)的Google办公室,它比我想象的还要好,虽然我的标准已经一再提高了。 72 | 73 | ## 开发人员面试大学 74 | 75 | 还记得关于我要学习什么的教练笔记吗?即使我对清单一无所知,清单列表似乎还是可以管理的。 76 | 77 | 我将笔记上的主题变成了一份清单,并开始使用麻省理工学院和伯克利大学的视频讲座来进行学习。这样,这份清单开始不断的增长。 78 | 79 | 我在Github上发布了该列表,因为我的Github帐户非常空白。由于我为自己的企业和工作编写的所有代码都是私人的,因此我在Github上的帐户使我看起来好像根本没有编写任何代码。我需要建立一个组合。我最初将项目称为“ Project 9894”。Google于1998年9月4日推出。因此得名。后来我将其重命名为“ 谷歌面试大学”。(译者语:后来更名为“ 开发人员面试大学 ”) 80 | 81 | 随着时间的流逝,我清单中添加了一些在此过程中发现的可选主题。 82 | 83 | 令我惊讶的是,我迄今为止还不知道CPU如何处理程序,内存如何工作或任何程序。我知道“足够”就可以成功。 84 | 85 | 我的Github小型项目开始获得一些好评,我发表了一篇博客文章庆祝20个好评。 86 | 87 | 一天早晨,我醒来发现它已经长到120星。某人在夜间发布了有关此内容的推文,并最终将其发布到Github每日趋势报告中。几天来,我在Github上排名第一。 88 | 89 | 许多善良的人们伸出援手并鼓励我。事实证明,有成千上万的人不仅要在Google工作,还想以软件工程师的身份工作,而这个清单正是他们需要的工作清单。 90 | 91 | 现在已超过21,000星。 92 | 93 | 我简直不敢相信。 94 | 95 | #如果我找不到工作怎么办? 96 | 97 | 这不会是世界末日。 98 | 99 | 我已经花了时间和精力投入了成为Google软件工程师的工作目标,但是即使我失败了,我仍然拥有在任何一家公司担任软件工程师所需的技能和知识。 100 | 101 | 无论最终到哪里,我都将作为入门级软件工程师加入。我没有15年的软件工程经验,因为我根本就没有。说到这些东西,我相当于一个新的计算机专业毕业生。 102 | 103 | 但我也有新毕业生的热情。对我来说这是一个新世界。我才刚刚开始。我不怕犯错。我知道我会搞明白的,我也想学习一切,并成为任何团队的优秀成员。 104 | 105 | ## 不要像我那样学习 106 | 107 | (**译者语:注意,这里面说的是作者失败的地方,作者在自省,千万不要去学习,作者是提醒我们,这些而应该当作负面的典型来避免。**) 108 | 109 | 我花了8个月的时间来学习,事后看来我可以简化这个过程。像任何一个有远大目标的初创企业一样,您会犯错误并做一些浪费时间的事情。**如果重新来一次,我希望能够避免。** 110 | 111 | 我花了三周的时间阅读一本1000页的C++书。好了,我现在对C++知道很多。但事实上,我使用的是Python,而不是C++。我以为我需要C++,C或Java,但是我错了。我不应该假设我应该学什么,而应该基于实际情况。 112 | 113 | 所以我的清单里面,只列出了3、4本必要的书籍。而且如果你可以根据你需要的编程语言进行筛选。 114 | 115 | 还有一个代码目录,其中包含数十种我要检查的算法,其中大多数我在面试中都不会用到。您可能不需要学会。 116 | 117 | 我观看了大量的YouTube视频,但每个视频的观看的时间却很少,这导致我的精力被分散。 118 | 119 | **我应该早点停止阅读书籍和观看视频,并早点解决编码问题。**我本可以花更多的时间来讲所学的主题应用到实际项目中。 120 | 121 | **重复运用是记忆的关键。**一旦您了解了一些内容,请稍后再检查一次,甚至以后再检查一次。在每次重复中,您都会加强学习。在不同的方向上耗费大量的时间不会是你成为专家。在同一领域通过不断回顾和审查,您将成为专家。如果这样做,您将到达无法忘记细节的地步。 122 | 123 | 我甚至把一些知识点,做了1729个卡片,休息的时候,我随便抽这些卡片来复习相关知识。这太多了,我不建议你这样做。 124 | 125 | 因为我的起点比较低,这使得我有一种恐惧感,担心自己不会,这种恐惧感驱使着我学习了太多实际根本用不上的知识。 126 | 127 | 我可能在实际工作中永远也不会用到某些算法,但是我却为了学习它而耗费了大量的时间。 128 | 129 | ## 结论 130 | 131 | 早些时候,我希望我能跳过清单中不需要的地方,而只是为了应对面试,这样我就可以加入团队后学习语言和工具。 132 | 133 | 但是,在此过程中,我意识到了知识的重要性,即使其中的大部分知识可能并非每天都适用,但我很高兴自己付出了很多努力。我对计算的历史,本领域的知名人物,数据结构和算法(以及它们如何相互补充)以及计算机系统如何在低层工作产生了新的认识。 134 | 135 | 从我开始学习,到我提交申请,经历了一年都的漫长旅程。从一月开始,到四月我完全投入到学习当中。 136 | 137 | 我甚至沉迷于其中,但我不能永远学习并推迟申请。在某个时候,我必须迈出一步。 138 | 139 | 我看到美好的生活开始想我招手。 140 | 141 | 感谢您抽出宝贵的时间阅读我的故事。 142 | 143 | ## 结局 144 | 145 | 非常非常非常的遗憾,我没有被Google录用。 146 | 147 | 但是…… 不要紧,因为,2个月后…… 148 | 149 | 我被Amazon聘请为Amazon Web Services的软件开发工程师! 150 | 151 | 哈哈哈~~~呃~~~ -------------------------------------------------------------------------------- /tips/ABC-保持编码.MD: -------------------------------------------------------------------------------- 1 | 首先,请对诚实一些。做个测试。 2 | 您是优秀的工程候选人吗?您如何衡量自己?您采访了几家公司?您的现场采访报价比率是多少?尝试以下公式(我完全是在真空中组成的,最终没有任何意义): 3 | 4 | > x = 面试过的公司数量 5 | > 6 | > y = 收到offer的公司数量 7 | > 8 | > 值 = 100 * ln(x) * y / x 9 | 10 | 如果您的值小于90,则应阅读此内容。如果大于120,则可能不需要,但仍应阅读。 11 | 12 | ## 我是谁? 13 | 我没有大学学位。在离开芝加哥前往南加州之后,我从19岁开始专业编程。我拥有的一切都适合我的车;我的口袋里有400美元,还有一个初级程序员的工作机会,每年可赚40,000美元。那是十二年前。但这是另一个故事。 14 | 15 | 从那以后,我就职于Double Helix,Namco Bandai,Google,Obvious和Square。*我还收到了Naughty Dog,Activision,Riot Games,暴雪,Pinterest,高盛(Goldman Sachs)等公司的报价。对于它的价值,我从上述公式中得出的分数是132。 16 | 17 | 我至少采访了500名工程候选人。大约有10%得到了反馈。我认为只有不到3%的人是“明星级别”候选人,而且我记得所有人。 18 | 19 | 我会告诉你,绝对没有确保就业的可靠方法。变量太多了,尤其是在像Google这样的公司中,您会遇到5-7位随机软件工程师,他们要提出一组适当的问题,通常涉及白板编码。一些工程师是可怕的面试官,他们提出不公平的问题并做出迅速的判断。但这没关系,这对我们所有人都是最好的。通常,您可以在小组中进行一次面试。 20 | 21 | 我能做的最好的就是告诉你如何做好充分的准备。因此,事不宜迟,这里是我可以给您的提示。 22 | 23 | ## 技术提示 24 | 25 | 1、**ABC(始终编码)**。您编写的代码越多,获得的效果就越好-就是这么简单。通过编码,您正在练习。但是最佳实践是集中练习。牢记目标,探索新领域并挑战自己。随着时间的流逝,您应该开发一个未完成和已完成项目的组合。GitHub是展示此组合的好地方,但是拥有折衷的工作是巨大的。 26 | 27 | 2、**握至少一种多范式语言**。掌握一种语言可以使您有很大的洞察力。为此,您必须编写大量代码,阅读更多内容,并学习陷阱和最佳实践。理想情况下,该语言具有活跃的社区,运行大量生产代码并且相当流行。比较常用的是C#,C++,Java,PHP,Python和Ruby。 28 | C++访谈员喜欢问一个著名的主要问题,即“在1到10的范围内,最高为10,您将如何评价你对C++的了解?” 我讨厌这个问题。上帝会帮助任何回答9-10的人,因为Bjarne Stroustrap(C ++创始人)曾经说过他会给自己打8分。这种语言简直太复杂,太丰富了,而且随着时间的推移发展得太多了。我离题了。 29 | 30 | 3、**解你的复杂性**。 阅读这份备忘单。然后确保您了解它们的工作原理。然后实施常用的计算算法,例如各种计算算法和数据结构等。再次,ABC。这篇文章也是很好,详尽的入门。 31 | 32 | 4、**重新发明轮子**。您应该以选择的语言实现最常见的数据结构。不要依赖公共库。实现以下内容并为其编写测试:向量(动态数组),链表,堆栈,队列,循环队列,哈希图,集合,优先级队列,二进制搜索树等。您应该能够快速实现它们。 33 | 34 | 5、**解决概念问题**。避免总是用搜索引擎查询一个小问题。一切都归结为基本的编程概念。花至少40个小时来编码解决方案,以解决不同类型的问题。最佳资源之一是TopCoder。阅读此。然后尝试解决问题。选择那些可以测试您实现递归,模式匹配,贪婪,动态编程和图形问题的能力的函数。只是经历一堆存档的问题。 35 | 这可能是我被Google录用的第一原因。我实际上花了两个星期来强化编码。在那之后,我可以闭着眼睛,一只手臂系在我的背后,编写各种算法。在阳光下,我几乎可以解决任何类型的图形问题。都是解决问题的重复。正如埃里克·施密特(Eric Sc​​hmidt)所说,“重复不会破坏祈祷。” 36 | 37 | 6、**用简单的方式编码**。至少,使它看起来容易。随着时间的推移,我了解到编程是成为工程师最直接,最简单的部分。我经常使用“简单的编程问题”这个词,因为我认为成为工程师的最困难的部分是在大多数编码发生之前和之后。例如,设计要编写的代码,并确保已编写的代码可以交付并投入生产。让您的面试官了解您知道编程只是达到目的的一种手段。 38 | 注意,在他人面前编码可能会令人生畏。找到一种既可以练习白板又可以进行配对编程的方法。Google基本上就是在白板上进行编码,而Square则实际上是在使用您选择的语言和IDE的真实机器上进行所有配对编程。 39 | 40 | ## 一般提示 41 | 42 | 我不能在这里声称自己是专家。实际上,有些人会说我对人甚至都不是很好。但是我可能应该讲一些非技术性的技巧,其中许多技巧可能非常明显。 43 | 44 | 1、**知道你为什么在那里**。如果您在一家公司进行面试,但您不完全了解他们为什么存在,他们是谁或做什么?那别做 关心他们雇用的工程师的工程师会闻到一英里远的气味。您也许可以在较大的公司中解决这个问题,但对于较小的公司却不行。 45 | 46 | 2、**充满激情**。如果您不在乎,那么没人会。对某事充满热情。可能正在编程,但是呢?您喜欢在业余时间构建编译器吗?您会建造并驾驶遥控直升机吗?没关系,因为如果您对此充满热情,那么可以使其变得有趣。 47 | 48 | 3、**不要做假设**。如果不确定,请提问。如果有人问您一个问题,而您不确定100%是什么问题,请提出。很多次我都看到候选人走了一条路,从不问问题,最终浪费时间解决错误的问题。 49 | 50 | 4、**微笑**。兴奋,快乐和积极。但是不要过度。正如我之前提到的,人们会做出迅速的判断。确保您的第一印象是一个良好的印象。微笑具有传染性,我常常心情不好或被其他优先事项淹没时面试,但应聘者摆放适当的微笑使我迅速从中脱颖而出。 51 | 52 | 就像我之前说过的,招聘并没有灵丹妙药。但是,作为一名工程师,您最好的选择是ABC:Always Be Coding。(保持编码) -------------------------------------------------------------------------------- /tips/为编程面试选择一种语言.MD: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangmin42/Coding-Interview-University/c0c5343763d69bef705ca901bfaf20099f6d6734/tips/为编程面试选择一种语言.MD -------------------------------------------------------------------------------- /tips/白板编程.MD: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangmin42/Coding-Interview-University/c0c5343763d69bef705ca901bfaf20099f6d6734/tips/白板编程.MD --------------------------------------------------------------------------------